feat: improve first interaction workflow#274
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThe PR implements comprehensive vault encryption infrastructure with an onboarding flow, replacing the previous vault management system with a new storage-backed Changes
Sequence DiagramsequenceDiagram
participant User
participant UI as VaultCreator UI
participant VEC as VaultEncryptionController
participant KDF as CryptographyUtils (KDF)
participant Enc as EncryptionController
participant CFG as VaultEncryptionConfig
User->>UI: Enter password & KDF params
User->>UI: Confirm vault creation
UI->>VEC: init({password, keyDerivation, algorithm})
VEC->>KDF: Create disposable KDF
KDF-->>VEC: deriveBits function (with memory/ops config)
VEC->>KDF: Derive password bits
KDF-->>VEC: passwordKey
VEC->>Enc: Create disposable encryption
Enc-->>VEC: EncryptionController instance
VEC->>Enc: Generate random masterKey
Enc-->>VEC: masterKey bytes
VEC->>Enc: Encrypt masterKey
Enc-->>VEC: encryptedMasterKey
VEC->>CFG: Write config (algorithm, encryptedMasterKey, salts, KDF params)
CFG-->>VEC: Config persisted
VEC-->>UI: Init complete
VEC->>KDF: Dispose KDF
VEC->>Enc: Dispose Encryption
UI-->>User: Vault created successfully
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 11
🧹 Nitpick comments (2)
packages/transly/.env.example (1)
2-5: Align.env.examplewith dotenv-linter ordering and EOF newline.This file currently triggers ordering and trailing-newline warnings from static analysis.
Proposed fix
-TEST_E2E_LLM=enabled -TEST_E2E_LLM_MODELS=openai/gpt-4o-mini,amazon/nova-micro-v1 -OPENAI_API_URL=https://openrouter.ai/api/v1 OPENAI_API_KEY= +OPENAI_API_URL=https://openrouter.ai/api/v1 +TEST_E2E_LLM=enabled +TEST_E2E_LLM_MODELS=openai/gpt-4o-mini,amazon/nova-micro-v1 +🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/transly/.env.example` around lines 2 - 5, Reorder the environment variables in .env.example into dotenv-linter's canonical ordering and ensure the file ends with a single EOF newline: sort the keys alphabetically (e.g., OPENAI_API_KEY, OPENAI_API_URL, TEST_E2E_LLM, TEST_E2E_LLM_MODELS or follow your project's configured ordering) remove any trailing spaces, and add a final newline character so the file ends with one blank line; reference the variable names TEST_E2E_LLM, TEST_E2E_LLM_MODELS, OPENAI_API_URL, and OPENAI_API_KEY to locate and update the entries.packages/transly/README.md (1)
79-84: Add language identifiers to fenced code blocks to satisfy markdownlint (MD040).Several fenced blocks are unlabeled. Mark them as
text(or a specific language) to keep docs lint-clean.Proposed fix
-``` +```text src/locales/ en/ common.json features.json-
+text
src/locales/
en/
common.json ← source (unchanged)
de/
@@-``` +```text .transly-cache/ common.de.json common.fr.json common.ja.json-
+text
Usage: transly [options]
@@-``` +```text .transly-cache/ features.de.json features.fr.json common.de.json</details> Also applies to: 113-123, 127-132, 191-200, 247-252 <details> <summary>🤖 Prompt for AI Agents</summary>Verify each finding against the current code and only fix it if needed.
In
@packages/transly/README.mdaround lines 79 - 84, The README.md contains
unlabeled fenced code blocks (directory listings and usage examples) that
trigger markdownlint MD040; update each fenced block (e.g., the blocks showing
"src/locales/ ...", ".transly-cache/ ...", "Usage: transly [options]" and
similar listings) to add a language identifier such astext orbash so the
blocks are explicitly labeled; search for the unlabeled blocks around the
examples and replace the opening backticks with ```text (or a more specific
language) to satisfy MD040 without changing the block contents.</details> </blockquote></details> </blockquote></details> <details> <summary>🤖 Prompt for all review comments with AI agents</summary>Verify each finding against the current code and only fix it if needed.
Inline comments:
In@packages/transly/README.md:
- Around line 166-173: Update the README field documentation to match the actual
config schema: replace the outdated "prompt: string" entry with the two config
keys used in code, "systemPrompt" and "contextPrompt", and describe their
purposes and expected formats (e.g. systemPrompt = system-level instruction sent
before each batch, contextPrompt = optional contextual/template text appended or
prepended to the user payload), including the same example structure used
elsewhere ({ targetLang, items: [...] }) and the expected JSON response shape;
reference the identifiers systemPrompt and contextPrompt so readers can map docs
to the implemented types.In
@packages/transly/src/cache.ts:
- Around line 41-46: The current readCache logic swallows all fs.access errors
and treats them as "cache missing"; change the catch in the block that calls
fs.access(filePath) inside readCache so it only returns {} when the error code
is 'ENOENT' (file not found) and rethrows any other errors (e.g., EACCES or
other I/O errors); locate the try/catch around fs.access in readCache (and use
the caught error's .code property) to implement this selective handling.In
@packages/transly/src/chunker.ts:
- Around line 21-26: The validation for maxBatchSize only checks <= 0 but allows
NaN and non-integer values; update the guard to reject NaN and non-integers
(e.g., use Number.isInteger(maxBatchSize) && maxBatchSize > 0) and throw when
that fails so chunking (the loop that slices items into chunks) receives a valid
positive integer; also add a minimal unit test that calls the chunking function
with decimals and NaN to assert it throws for non-integer maxBatchSize.In
@packages/transly/src/config.ts:
- Around line 27-28: The config schema currently allows arbitrary values for the
optional translateChunk and fetch fields; update the schema (configSchema) to
validate these as functions when present (e.g., use z.function() or an
equivalent zod validator for callables) so that invalid types are rejected at
parse time; ensure the validators are applied to the translateChunk and fetch
entries so code in llm.ts and runner.ts that calls translateChunk(...) and
fetch(...) will only receive validated functions.- Line 29: The configSchema's debug field uses z.coerce.boolean() which treats
non-empty strings like "false" as true; replace that with explicit parsing that
accepts booleans and string values ("true"/"false", "1"/"0") and converts them
deterministically to true/false (e.g., use a union of z.boolean() and z.string()
with a transform that lowercases and matches explicit strings), update the debug
schema entry (refer to configSchema and the debug property) accordingly, and add
a unit test that parses a config object with debug: 'false' and asserts
parsed.debug === false to prevent regression.In
@packages/transly/src/flatten.ts:
- Around line 18-25: The flattenJson function currently leaves primitive leaf
values (numbers, booleans, null, undefined) uncoerced which allows non-string
values into downstream runTranslation and hashing; update flattenJson (and its
leaf-handling logic around the current value-coercion code paths) to coerce all
primitive leaves to strings before storing them in result (or explicitly
throw/fail-fast on non-stringable values) and add a minimal unit test that
reproduces flattening a JsonObject with leaves like 3, false, and null to assert
they become "3", "false", and "null" (or that the function throws as chosen) so
the translator always receives string values.In
@packages/transly/src/llm.ts:
- Around line 154-155: The zod schema usage for parsing translations is using
the removed single-argument form z.record(z.string()), which will fail under Zod
4; update the validation in llm.ts where translations is created (the const
translations = ... line) to use the two-argument form z.record(z.string(),
z.string()) so the schema explicitly validates both keys and values as strings,
then re-run tests like the provided 'rejects non-string translated values' case
to confirm it throws for non-string values.In
@packages/transly/src/runner.ts:
- Around line 64-73: The current catch around fs.access/fs.readFile/JSON.parse
swallows all errors and treats a corrupted target file as missing; update the
logic in the block referencing targetPath, existingFlat, flattenJson so that
only a missing-file error (error.code === 'ENOENT' from fs.access/fs.readFile)
is treated as "start fresh", while any read/parse errors are rethrown; e.g.,
first check existence with fs.access or fs.stat and handle the ENOENT case, then
perform fs.readFile + JSON.parse in a try that rethrows parsing/read errors so
corrupted JSON is not silently replaced.In
@packages/transly/src/scanner.ts:
- Around line 51-55: The code naively casts JSON.parse(raw) to Record<string,
unknown> which can be an array, null, or primitive; update the try block that
reads and parses the file so after const raw = await fs.readFile(filePath,
'utf-8'); and const parsed = JSON.parse(raw), you validate that parsed is a
non-null object and not an array (e.g., typeof parsed === 'object' && parsed !==
null && !Array.isArray(parsed') ) before assigning to content or throwing a
clear error; ensure the logic around the NamespaceFile.content consumer uses
this validated object, and add a minimal unit test (PoC) that feeds an
array/null/primitive JSON file to the scanner to assert it rejects/throws a
descriptive error rather than miscasting.In
@packages/transly/tests/e2e/translation.e2e.test.ts:
- Line 16: The E2E gate boolean is inverted: the variable isE2EEnabled (used by
describe.skipIf) is computed as process.env.TEST_E2E_LLM !== 'enabled' &&
process.env.OPENAI_API_KEY which ends up truthy when keys are missing, so tests
run by default; change to a positive flag (e.g., shouldRunE2E) that checks for
both TEST_E2E_LLM === 'enabled' or presence of OPENAI_API_KEY as appropriate,
then pass !shouldRunE2E into skipIf (update all uses: isE2EEnabled,
describe.skipIf and the later guard before process.env.OPENAI_API_KEY!) so the
suite is skipped when shouldRunE2E is false and only runs when the environment
explicitly enables it.In
@packages/transly/tests/translateChunk.test.ts:
- Line 3: The test suite fails because beforeEach is used but not imported;
update the top import in translateChunk.test.ts to also import beforeEach from
'vitest' (the same import line that currently brings in describe, expect, it,
vi) so the call to beforeEach in the suite (around the block using
translateChunk/its mocks) is defined.
Nitpick comments:
In@packages/transly/.env.example:
- Around line 2-5: Reorder the environment variables in .env.example into
dotenv-linter's canonical ordering and ensure the file ends with a single EOF
newline: sort the keys alphabetically (e.g., OPENAI_API_KEY, OPENAI_API_URL,
TEST_E2E_LLM, TEST_E2E_LLM_MODELS or follow your project's configured ordering)
remove any trailing spaces, and add a final newline character so the file ends
with one blank line; reference the variable names TEST_E2E_LLM,
TEST_E2E_LLM_MODELS, OPENAI_API_URL, and OPENAI_API_KEY to locate and update the
entries.In
@packages/transly/README.md:
- Around line 79-84: The README.md contains unlabeled fenced code blocks
(directory listings and usage examples) that trigger markdownlint MD040; update
each fenced block (e.g., the blocks showing "src/locales/ ...", ".transly-cache/
...", "Usage: transly [options]" and similar listings) to add a language
identifier such astext orbash so the blocks are explicitly labeled;
search for the unlabeled blocks around the examples and replace the opening
backticks with ```text (or a more specific language) to satisfy MD040 without
changing the block contents.</details> <details> <summary>🪄 Autofix (Beta)</summary> Fix all unresolved CodeRabbit comments on this PR: - [ ] <!-- {"checkboxId": "4b0d0e0a-96d7-4f10-b296-3a18ea78f0b9"} --> Push a commit to this branch (recommended) - [ ] <!-- {"checkboxId": "ff5b1114-7d8c-49e6-8ac1-43f82af23a33"} --> Create a new PR with the fixes </details> --- <details> <summary>ℹ️ Review info</summary> <details> <summary>⚙️ Run configuration</summary> **Configuration used**: defaults **Review profile**: CHILL **Plan**: Pro **Run ID**: `d7b5da89-f1a7-465f-b859-4ca8588ab6d9` </details> <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between 682d7c7beea42ac5cc3a675d5da6e887864eef8a and fdae90fdf970112ce8f640ea9d736d0797f475eb. </details> <details> <summary>⛔ Files ignored due to path filters (1)</summary> * `package-lock.json` is excluded by `!**/package-lock.json` </details> <details> <summary>📒 Files selected for processing (34)</summary> * `eslint.config.ts` * `packages/app/package.json` * `packages/transly/.env.example` * `packages/transly/README.md` * `packages/transly/package.json` * `packages/transly/src/cache.ts` * `packages/transly/src/chunker.ts` * `packages/transly/src/cli.ts` * `packages/transly/src/config.ts` * `packages/transly/src/flatJson.test.ts` * `packages/transly/src/flatten.ts` * `packages/transly/src/index.ts` * `packages/transly/src/llm.ts` * `packages/transly/src/runner.ts` * `packages/transly/src/scanner.ts` * `packages/transly/src/types.ts` * `packages/transly/tests/cache.test.ts` * `packages/transly/tests/chunker.test.ts` * `packages/transly/tests/config.test.ts` * `packages/transly/tests/e2e/translation.e2e.test.ts` * `packages/transly/tests/filesystem.test.ts` * `packages/transly/tests/flatten.test.ts` * `packages/transly/tests/integrational/llm-integration.test.ts` * `packages/transly/tests/partial-failure.test.ts` * `packages/transly/tests/pipeline.test.ts` * `packages/transly/tests/stubs/makeConfig.ts` * `packages/transly/tests/stubs/makeFetchStub.ts` * `packages/transly/tests/stubs/makeMemFs.ts` * `packages/transly/tests/stubs/makeTranslate.ts` * `packages/transly/tests/translateChunk.test.ts` * `packages/transly/tsconfig.json` * `packages/transly/tsdown.config.ts` * `packages/transly/vitest.config.ts` * `words.txt` </details> <details> <summary>✅ Files skipped from review due to trivial changes (7)</summary> * packages/app/package.json * words.txt * packages/transly/tests/stubs/makeConfig.ts * packages/transly/tsconfig.json * packages/transly/vitest.config.ts * packages/transly/tests/config.test.ts * packages/transly/package.json </details> <details> <summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary> * eslint.config.ts </details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (2)
packages/app/src/locales/de/vault.json (1)
99-99: Prefer standard German crypto term for KDF label.“Schlüsselerzeugungsfunktion” on Line 99 is understandable, but “Schlüsselableitungsfunktion” is the more common technical term for KDF in German security docs.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/app/src/locales/de/vault.json` at line 99, Replace the German label for the KDF entry to use the standard technical term: change the value of the "label" for the KDF/key-derivation entry from "Schlüsselerzeugungsfunktion" to "Schlüsselableitungsfunktion" so the localization uses the common German crypto term (locate the JSON object containing the KDF label string and update its "label" value accordingly).packages/app/src/locales/ar/vault.json (1)
96-107: Polish Arabic phrasing in advanced encryption descriptions for clarity.The new keys are good, but a few expressions read non-native/awkward (
الأسس للتشفير,المعادة الاستخدام). Consider a light wording pass to improve readability.Suggested copy refinement
- "description": "قم بتكوين الأسس للتشفير التي تحمي مساحة التخزين الخاصة بك — تسلسل تشفير، معلمات KDF، والمزيد. لمراجعة كاملة للإعدادات الافتراضية وآثارها، اطلع على <link>كيفية حماية مساحة التخزين الخاصة بك</link>." + "description": "قم بتكوين إعدادات التشفير التي تحمي مساحة التخزين الخاصة بك — خوارزمية التشفير، ومعلمات KDF، والمزيد. لمراجعة كاملة للإعدادات الافتراضية وآثارها، اطلع على <link>كيفية حماية مساحة التخزين الخاصة بك</link>." - "description": "تساعد في حماية كلمات المرور الضعيفة أو المعادة الاستخدام عن طريق جعل كل تخمين أبطأ وأكثر تكلفة. قم بزيادة هذه الإعدادات للحصول على حماية أقوى، أو احتفظ بالإعدادات الافتراضية للحصول على تجربة متوازنة.", + "description": "تساعد في حماية كلمات المرور الضعيفة أو المُعاد استخدامها عبر جعل كل محاولة تخمين أبطأ وأكثر تكلفة. زد هذه الإعدادات للحصول على حماية أقوى، أو اترك الإعدادات الافتراضية للحصول على تجربة متوازنة."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/app/src/locales/ar/vault.json` around lines 96 - 107, Polish several Arabic copy strings in the vault locale: update the top-level "description" (under the encryption settings block) to replace the awkward phrase "الأسس للتشفير" with more natural phrasing like "إعدادات التشفير" and smooth the sentence flow; in the "kdf" block adjust "المعادة الاستخدام" to "المعاد استخدامها" and rephrase any clunky constructions in "kdf.description", "kdf.memory.description", and "kdf.ops.description" to read more natively and concisely while preserving meaning about memory use, iterations, and tradeoffs.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/app/src/locales/ar/vault.json`:
- Line 70: The Arabic string for the "description" key in the locales file is
grammatically awkward ("عبر هذه كلمة المرور"); update the value of the
"description" entry in packages/app/src/locales/ar/vault.json (the "description"
JSON key shown in the diff) to a natural phrasing such as "سيتم تشفير جميع
البيانات في مساحة التخزين عبر كلمة المرور هذه" or "سيتم تشفير جميع البيانات في
مساحة التخزين باستخدام كلمة المرور هذه" so the UI copy reads correctly.
In `@packages/app/src/locales/de/vault.json`:
- Line 70: The German locale uses mixed terminology ("Tresor" vs "Vault") in the
localized strings; update the string value for the "description" key (and the
other occurrence where "Tresor" appears) to use the same product term as the
rest of the file (replace "Tresor" with "Vault" in those JSON values) so the de
vault locale consistently uses "Vault".
---
Nitpick comments:
In `@packages/app/src/locales/ar/vault.json`:
- Around line 96-107: Polish several Arabic copy strings in the vault locale:
update the top-level "description" (under the encryption settings block) to
replace the awkward phrase "الأسس للتشفير" with more natural phrasing like
"إعدادات التشفير" and smooth the sentence flow; in the "kdf" block adjust
"المعادة الاستخدام" to "المعاد استخدامها" and rephrase any clunky constructions
in "kdf.description", "kdf.memory.description", and "kdf.ops.description" to
read more natively and concisely while preserving meaning about memory use,
iterations, and tradeoffs.
In `@packages/app/src/locales/de/vault.json`:
- Line 99: Replace the German label for the KDF entry to use the standard
technical term: change the value of the "label" for the KDF/key-derivation entry
from "Schlüsselerzeugungsfunktion" to "Schlüsselableitungsfunktion" so the
localization uses the common German crypto term (locate the JSON object
containing the KDF label string and update its "label" value accordingly).
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 1fb7bf78-263b-4e76-acf4-2f3d1e99a7c7
⛔ Files ignored due to path filters (211)
package-lock.jsonis excluded by!**/package-lock.jsonpackages/app/src/locales/.cache/000f382715ba00318ee3f904feaac28b8e9edf3dis excluded by!**/.cache/**packages/app/src/locales/.cache/02a505193f2c71f9814d5b51692d91157d6ba1dbis excluded by!**/.cache/**packages/app/src/locales/.cache/037a9ecf5f53561d1e3c414273f1b2d9351e2e9bis excluded by!**/.cache/**packages/app/src/locales/.cache/03f4df87ab4dbefc991e7301560c59bb1b75c77cis excluded by!**/.cache/**packages/app/src/locales/.cache/056ffd8fa923abe5c28b496467b5f39055422586is excluded by!**/.cache/**packages/app/src/locales/.cache/0903dd3d06f77c3e8b47d90fc3f77f102f649ba3is excluded by!**/.cache/**packages/app/src/locales/.cache/095de6f0dca259af83e06601e7a58965c61d10ddis excluded by!**/.cache/**packages/app/src/locales/.cache/0ac5b763735c151fd317f98290e0e11fcf28bdbdis excluded by!**/.cache/**packages/app/src/locales/.cache/0b043b45a5a1157e2042c509092724023bda3430is excluded by!**/.cache/**packages/app/src/locales/.cache/0b5ed5e31f23e5dfd7624a4d87c3dadf5f2c07d5is excluded by!**/.cache/**packages/app/src/locales/.cache/0c11616b6bdeee8cc49fac43c35800e73bc391afis excluded by!**/.cache/**packages/app/src/locales/.cache/0d3a91e0f3892d34f64caa163924abad8a9f64ebis excluded by!**/.cache/**packages/app/src/locales/.cache/0e007ebad58e4ce9110e0a26831cb2fbb7fad24cis excluded by!**/.cache/**packages/app/src/locales/.cache/0eeb7d05f9501fb5488429dcf88e5b8dab284d94is excluded by!**/.cache/**packages/app/src/locales/.cache/10ec2cc1fe6b92a5acb60bf865b678c821385f7fis excluded by!**/.cache/**packages/app/src/locales/.cache/113ee65da4526a32bdb03fc4f053fcb7973c0391is excluded by!**/.cache/**packages/app/src/locales/.cache/12a64e526d24710825429ff1b676fc9a5a0c0178is excluded by!**/.cache/**packages/app/src/locales/.cache/12eb83a9e335774893e37182eefd64e1ecbb769dis excluded by!**/.cache/**packages/app/src/locales/.cache/131e2feba558b8b5fe71e973b6c23e015d97cac1is excluded by!**/.cache/**packages/app/src/locales/.cache/158d839695955879b535ac99baa7cbb9a8fbbe1eis excluded by!**/.cache/**packages/app/src/locales/.cache/15f3a672244c80b3b633bbf330c8208251a2ced6is excluded by!**/.cache/**packages/app/src/locales/.cache/17539a45715d3a6d9d4941c5cb939edc9e5bae15is excluded by!**/.cache/**packages/app/src/locales/.cache/1794476b385b5a17af58eb93ff8c90df9b04b876is excluded by!**/.cache/**packages/app/src/locales/.cache/19cfe5e64c2dfe1d40a656e2ed8409acaf29413dis excluded by!**/.cache/**packages/app/src/locales/.cache/1bd71a0c284022f34150e96f1b93194c67ade961is excluded by!**/.cache/**packages/app/src/locales/.cache/1d3aeec3f98a244695b1d017de7578ec21cf19f0is excluded by!**/.cache/**packages/app/src/locales/.cache/1fbfe0cb9ef15cb48c586ad3830c08444e143168is excluded by!**/.cache/**packages/app/src/locales/.cache/20876391f79b03d650b187b81eb1f21e40a9676cis excluded by!**/.cache/**packages/app/src/locales/.cache/223142b2d32675aba3a5c916159cb484df1e4378is excluded by!**/.cache/**packages/app/src/locales/.cache/23174cabe7acc22d491c9977edf8b1e6f5fd15f9is excluded by!**/.cache/**packages/app/src/locales/.cache/2543cf30458b176ee543a50e4074ddffd8414fbbis excluded by!**/.cache/**packages/app/src/locales/.cache/26953924daef4dcf46ae3dbe8f756704a58b6a0dis excluded by!**/.cache/**packages/app/src/locales/.cache/290980252c988f8aaf0cc9cb9c8323ee915166a3is excluded by!**/.cache/**packages/app/src/locales/.cache/293679e78ba7c9621f7a216b6d7347dbf9aa0322is excluded by!**/.cache/**packages/app/src/locales/.cache/2974ff823984f325ea98bd23408d532d803b2bd0is excluded by!**/.cache/**packages/app/src/locales/.cache/2acb2637250fea136f4d4669e13a55bcb6e5857fis excluded by!**/.cache/**packages/app/src/locales/.cache/2b863b51a4a8c804e62d0fec2332453c7f5fd389is excluded by!**/.cache/**packages/app/src/locales/.cache/2b93f7dde7f8e9f56d33f178c581cb61def1c008is excluded by!**/.cache/**packages/app/src/locales/.cache/2c7463f1e30938551ce79609836e4524e96505d6is excluded by!**/.cache/**packages/app/src/locales/.cache/2c9d2d0076af8306f89b930670cafd0e796cd13cis excluded by!**/.cache/**packages/app/src/locales/.cache/2d63c75ab5dda34b792f2e6b2099907f823808fcis excluded by!**/.cache/**packages/app/src/locales/.cache/2e9b3d0c993e3c7792ee0793227ecf83f4221a26is excluded by!**/.cache/**packages/app/src/locales/.cache/303c15769837a9b6fcb3a91b99000e6b01ee6910is excluded by!**/.cache/**packages/app/src/locales/.cache/30a88a2167ba40b7dbd2efd09d7e18c59eb5f462is excluded by!**/.cache/**packages/app/src/locales/.cache/30ee3470cee74b0caa58a320eb2e1c0e63b46276is excluded by!**/.cache/**packages/app/src/locales/.cache/31a1b3d97b53ab10e52d5ea3cc592db62e6ee032is excluded by!**/.cache/**packages/app/src/locales/.cache/335f73bd898d7537c38259de93551e5904de6f3cis excluded by!**/.cache/**packages/app/src/locales/.cache/34f29f969f39fa5de790d15d202fd007b998c3deis excluded by!**/.cache/**packages/app/src/locales/.cache/35ad616d804e276e119179e76d85a41b36cf869bis excluded by!**/.cache/**packages/app/src/locales/.cache/36c083ff5aa97b712e5bbb6c754f6773b904a330is excluded by!**/.cache/**packages/app/src/locales/.cache/3731fa647c6ae1fc9c4055d57171c27432e7880ais excluded by!**/.cache/**packages/app/src/locales/.cache/3952a4eb50a53ba41632dc84ac8f32cea64d9cf0is excluded by!**/.cache/**packages/app/src/locales/.cache/3b60a13e6cc1d4f11f99be56429cbc9eb70101aais excluded by!**/.cache/**packages/app/src/locales/.cache/3c8700501962db15a9a50012beabb01ee91f20a6is excluded by!**/.cache/**packages/app/src/locales/.cache/3d8d909bb88868ae5a0fa6e84405d6e3bc83a3c9is excluded by!**/.cache/**packages/app/src/locales/.cache/3e65e1dc2c53188fce9e2fd6fc4d306ebb8baac7is excluded by!**/.cache/**packages/app/src/locales/.cache/3ff67607c395923cbeb1b6d423945ca349023e86is excluded by!**/.cache/**packages/app/src/locales/.cache/411c96a6351b3d1c3886ab80b6b440136676fabais excluded by!**/.cache/**packages/app/src/locales/.cache/41b5a6d20de9a029cecb8323b4b59987656e95f8is excluded by!**/.cache/**packages/app/src/locales/.cache/41f0c196e12fb36996ae2e560ebc8da17559f7cais excluded by!**/.cache/**packages/app/src/locales/.cache/43ade612e3a21c0b826b41e88742bb10cac9426eis excluded by!**/.cache/**packages/app/src/locales/.cache/462ba11e1c9850af1e0e2eaa114320f93c493718is excluded by!**/.cache/**packages/app/src/locales/.cache/467aff8ed174044b8a4fe0e9a6bb4b5e43e60553is excluded by!**/.cache/**packages/app/src/locales/.cache/46bb7c725c98593f6cc0b37ad59d1e8411a83f1cis excluded by!**/.cache/**packages/app/src/locales/.cache/48a8ec18769090d7ef3b36a59f7c4d73cd7be09cis excluded by!**/.cache/**packages/app/src/locales/.cache/48bdba186c3c91a757ab00713a89485e3fecc1b4is excluded by!**/.cache/**packages/app/src/locales/.cache/499bbf3be2efdaacbb26a71898ec622b71c0ab6cis excluded by!**/.cache/**packages/app/src/locales/.cache/4a3cea3fc97fb8a7a5715f694aee2ab43e04f94dis excluded by!**/.cache/**packages/app/src/locales/.cache/4d97abdf2d7bef412db0468fcac916afbdbc2df0is excluded by!**/.cache/**packages/app/src/locales/.cache/4df5cdd1d1e5cf6ce62c9ecfbbfdd2fefda61590is excluded by!**/.cache/**packages/app/src/locales/.cache/502cbec0a01c781377c051906d3420a01f4b7aedis excluded by!**/.cache/**packages/app/src/locales/.cache/5473594c14e9eb79b0fcf185e97b4deb2e4cfb9fis excluded by!**/.cache/**packages/app/src/locales/.cache/55f9d36d1667558949f16403e8a9eb1907fa05d5is excluded by!**/.cache/**packages/app/src/locales/.cache/564fdb4cbd8a74b60f4d5228be0a46ac5e62b16dis excluded by!**/.cache/**packages/app/src/locales/.cache/5705bfd880ab4a522914cd6db0e56339a3ee5c51is excluded by!**/.cache/**packages/app/src/locales/.cache/5972127782aedf244dcea7d12e30fdad66c3e2d7is excluded by!**/.cache/**packages/app/src/locales/.cache/5a4acf5e17277dccef11b54a533e4ea420d2ec9cis excluded by!**/.cache/**packages/app/src/locales/.cache/5d0a6c399e834db0086886ff0f42ee733469c883is excluded by!**/.cache/**packages/app/src/locales/.cache/5eb83c6c602f819739b263db095aa2e6560a8eceis excluded by!**/.cache/**packages/app/src/locales/.cache/604d64463557ea00204a2a1fee2e18cd68c055c6is excluded by!**/.cache/**packages/app/src/locales/.cache/62792abdc27f88ad7e27a9e1b2be9ed57db1d87eis excluded by!**/.cache/**packages/app/src/locales/.cache/63980de9319a148c4dfffca7ca17bf54588da633is excluded by!**/.cache/**packages/app/src/locales/.cache/64fccd6c670186ebf67405ed2580c1d92c4898bcis excluded by!**/.cache/**packages/app/src/locales/.cache/66056705e3a6db74383a23532fb270ab313fd2ecis excluded by!**/.cache/**packages/app/src/locales/.cache/6628168ebab11c6a6702db5d9850a08df7a921abis excluded by!**/.cache/**packages/app/src/locales/.cache/66768920fccb9a1f6831197aa28039d70fd8a984is excluded by!**/.cache/**packages/app/src/locales/.cache/6791810b05676b18779e1909fd29c19a77fd3cd6is excluded by!**/.cache/**packages/app/src/locales/.cache/6a3da933a182bd2e7c0a718f7cef01b0aa34f7e2is excluded by!**/.cache/**packages/app/src/locales/.cache/6b4ac9a8ec1f052b2c84bc17fc3347fae5df0f25is excluded by!**/.cache/**packages/app/src/locales/.cache/6bfbf5b7dff94c109c47ffa4ac37f295b1d7ba1eis excluded by!**/.cache/**packages/app/src/locales/.cache/6dfa382ab09d3270af19dd6822467e89bf11b89fis excluded by!**/.cache/**packages/app/src/locales/.cache/6e5a8cf14c78d74ca603a88ea84712e8be9d5143is excluded by!**/.cache/**packages/app/src/locales/.cache/6f8ac32c0bf849ac9fdbf1c32df3384bebcd7777is excluded by!**/.cache/**packages/app/src/locales/.cache/7245627312738513cf6c1eb4ec6c9d5ff42a2065is excluded by!**/.cache/**packages/app/src/locales/.cache/74a5fec3acd065f4de8a24ee4a3212fed0d008e8is excluded by!**/.cache/**packages/app/src/locales/.cache/75be221e38d3624b7e5bbfa896fa4234361626f5is excluded by!**/.cache/**packages/app/src/locales/.cache/77c0b3c9cdcfbf3d3447b9d458d0e31e139b8466is excluded by!**/.cache/**packages/app/src/locales/.cache/798113fd04ad22bd817addce4ef4577855d3332fis excluded by!**/.cache/**packages/app/src/locales/.cache/7a4d4579910615b449ab9361b6924e049291b8ecis excluded by!**/.cache/**packages/app/src/locales/.cache/7c07c40f70c900b892311d45922f6bf34ab3e22dis excluded by!**/.cache/**packages/app/src/locales/.cache/7cf10a6a883420ad077efabb82d50441d984a4d8is excluded by!**/.cache/**packages/app/src/locales/.cache/7e632c30226e82690813a769e3506ed6e31286ddis excluded by!**/.cache/**packages/app/src/locales/.cache/7ed649bad6c0c3c8e172135ff7779f0829473f2cis excluded by!**/.cache/**packages/app/src/locales/.cache/7eebb7af355121ff74356ac8e06ba5e3b9d91073is excluded by!**/.cache/**packages/app/src/locales/.cache/7f203784fc2ffbd7755662b82b5ed8d5233ef1d6is excluded by!**/.cache/**packages/app/src/locales/.cache/7f2dd9b5b605c8286e41299968e2af20fb2ad10dis excluded by!**/.cache/**packages/app/src/locales/.cache/7fcee17ed32367a9817ac7edd24eee955dc372f0is excluded by!**/.cache/**packages/app/src/locales/.cache/8020290fe0057eb53be199544b89d2b7b6e2928cis excluded by!**/.cache/**packages/app/src/locales/.cache/80300f445915388f65b306d03f3886ac9a791d09is excluded by!**/.cache/**packages/app/src/locales/.cache/805ea4ed27af0abf8cb93a2c5acf2214ccbde6eais excluded by!**/.cache/**packages/app/src/locales/.cache/812ecc391ac9ab62e7c44c585ba7c41463721ad7is excluded by!**/.cache/**packages/app/src/locales/.cache/837fd9f2b0592092824abf38a75cafbdb6d31518is excluded by!**/.cache/**packages/app/src/locales/.cache/845080e14c7c41b46abba5490d3ea6b5f5ead77bis excluded by!**/.cache/**packages/app/src/locales/.cache/84e1acc0e6f531f53af7cf4a0ae5a0d32b702f8ais excluded by!**/.cache/**packages/app/src/locales/.cache/86e7de4d0bf20c08c8c481e101d85884f8e835bfis excluded by!**/.cache/**packages/app/src/locales/.cache/87108a673e6116968b3a4354eefbc1006c68024cis excluded by!**/.cache/**packages/app/src/locales/.cache/889c8c609f71dd9f3b0ea04e59d3398db5655702is excluded by!**/.cache/**packages/app/src/locales/.cache/88ea1811fcac2f824fa78045cec09a167731f87bis excluded by!**/.cache/**packages/app/src/locales/.cache/89bfce65016e74403bdb912acb46e1724e29ef3cis excluded by!**/.cache/**packages/app/src/locales/.cache/8c45c03a950112bd27acc62c1a6acabaa29adeccis excluded by!**/.cache/**packages/app/src/locales/.cache/8fc61384fa3bc4d1cb2c4365915c6319daee476fis excluded by!**/.cache/**packages/app/src/locales/.cache/9084089d415128235b50b61479866ffb838ee8b0is excluded by!**/.cache/**packages/app/src/locales/.cache/90d8336db9a88e1092f21d8731323a7f6a49ac02is excluded by!**/.cache/**packages/app/src/locales/.cache/9658b635b7a22e1c984878a19f11aafb758352aais excluded by!**/.cache/**packages/app/src/locales/.cache/96c043b12b50079fda16713c8da2689116594ee2is excluded by!**/.cache/**packages/app/src/locales/.cache/9736c79747bbe06615489c1865132aa927515884is excluded by!**/.cache/**packages/app/src/locales/.cache/97f5b885a26c97495c1cd1f08d9440e8b7a16b45is excluded by!**/.cache/**packages/app/src/locales/.cache/98367ecd1b1a48f50b1cacd78d2a128956c52672is excluded by!**/.cache/**packages/app/src/locales/.cache/98d148d19fdbf5cb55c383202d912c10dedcfd0dis excluded by!**/.cache/**packages/app/src/locales/.cache/990b92ec3771aa8bed7da9ed828f52f8d804d1e8is excluded by!**/.cache/**packages/app/src/locales/.cache/9b495579e20c0916d23aa94a4a8fdb6430f4296fis excluded by!**/.cache/**packages/app/src/locales/.cache/9c6190ea91db45c710be41fc02d6eba801e48fe4is excluded by!**/.cache/**packages/app/src/locales/.cache/9d049f8e7163c77e0b0f3cd55331a4c15cb53cecis excluded by!**/.cache/**packages/app/src/locales/.cache/9e82f0795aa6becc386e9f5d00acdd006397ffefis excluded by!**/.cache/**packages/app/src/locales/.cache/9f5f5234a63509d52e9b10124402b5de522bea7cis excluded by!**/.cache/**packages/app/src/locales/.cache/a28319364659b63d74f8a9ffe2334cccad0616b0is excluded by!**/.cache/**packages/app/src/locales/.cache/a4361d08ce241278a1bb1ba63226b8e6eb2435c8is excluded by!**/.cache/**packages/app/src/locales/.cache/a6dd7a67b97bd01ae1d2f05bf1e79afdee3c1140is excluded by!**/.cache/**packages/app/src/locales/.cache/a86f908cfc860d32ab0e25ffcc670db7bc49ad7fis excluded by!**/.cache/**packages/app/src/locales/.cache/a8dd21006fc22ab432135ad9b38f8dc6d0279871is excluded by!**/.cache/**packages/app/src/locales/.cache/a93923d3107a7068fb8c37834c03c6ead9ec9dfais excluded by!**/.cache/**packages/app/src/locales/.cache/aa4b3a5a97af0e0070ae27ec8a85cd3594ffafebis excluded by!**/.cache/**packages/app/src/locales/.cache/ab0fa1a55156f91919c35f044b6c683472892ac3is excluded by!**/.cache/**packages/app/src/locales/.cache/abe1e82a3ef314496a4b0a5fcae712eb9c894466is excluded by!**/.cache/**packages/app/src/locales/.cache/ad3b247a76d5037bbd92716f481171c9243509a6is excluded by!**/.cache/**packages/app/src/locales/.cache/adfca0b33fec2feebed6fc2b04c8bbcf4be8f7abis excluded by!**/.cache/**packages/app/src/locales/.cache/b187aa7a9cbb0cbd609dbd8221029b6f0bbb8758is excluded by!**/.cache/**packages/app/src/locales/.cache/b324b5045d39a10bbb8c13120a20187776e80289is excluded by!**/.cache/**packages/app/src/locales/.cache/b3df997618857851b9a343ac02ebd10093b8ac1bis excluded by!**/.cache/**packages/app/src/locales/.cache/b44e8f74e7ba120de1d832024820fecfe8e0c236is excluded by!**/.cache/**packages/app/src/locales/.cache/b5f0e630367d5c1a26cad288378fd2c38aa2c078is excluded by!**/.cache/**packages/app/src/locales/.cache/b63d519358af9c4aed1b7fbcbd4a2e426b97931ais excluded by!**/.cache/**packages/app/src/locales/.cache/b71088bd26a5e07753fe69d791d1be70068b559dis excluded by!**/.cache/**packages/app/src/locales/.cache/b7baa8c93e02e9f000a261ee024c0e191dc8564fis excluded by!**/.cache/**packages/app/src/locales/.cache/b8dd12ff950dab772b0f1ffab13855ac7844ff56is excluded by!**/.cache/**packages/app/src/locales/.cache/b94f09295a97d2d479a3b28f4de5670fe8d3c74dis excluded by!**/.cache/**packages/app/src/locales/.cache/ba4a3365fc01fcb9a0822db992d98505349725c2is excluded by!**/.cache/**packages/app/src/locales/.cache/bb35d3b857506ce3989fb557dae537395973b164is excluded by!**/.cache/**packages/app/src/locales/.cache/bbebab58aea1d2b995f218456e36b7df6ec7d39eis excluded by!**/.cache/**packages/app/src/locales/.cache/bc506d5fe1f2b180db90e5c22340cf965f635c81is excluded by!**/.cache/**packages/app/src/locales/.cache/be2f1418acd4ea2195a94810e62efcd674ca3608is excluded by!**/.cache/**packages/app/src/locales/.cache/bf2ea01d1a93aec785762290bd2cd11aa3c13baeis excluded by!**/.cache/**packages/app/src/locales/.cache/c046bd5ace6d4391df8f8d30a8afda43ce24deb6is excluded by!**/.cache/**packages/app/src/locales/.cache/c0ea8bdaaa2fff5633642537329c4a9ecf614f53is excluded by!**/.cache/**packages/app/src/locales/.cache/c113339aaf8783ef8a22d0c41c29ab773b19061dis excluded by!**/.cache/**packages/app/src/locales/.cache/c2d81e38ad4e2e991ab78988a919b62496a7cbecis excluded by!**/.cache/**packages/app/src/locales/.cache/c31512f51550b60f73ecd5696865eb1696767af4is excluded by!**/.cache/**packages/app/src/locales/.cache/c449563fb0eb089596470657007806c1ff638823is excluded by!**/.cache/**packages/app/src/locales/.cache/c58ed661e0ed9795d9f1ee91a832a2b8c8a2e00cis excluded by!**/.cache/**packages/app/src/locales/.cache/c606a8834e58d3dde0b14be0b4e933ad1c82998dis excluded by!**/.cache/**packages/app/src/locales/.cache/c898dade1013c39e69c7923932308c15dd9a82f7is excluded by!**/.cache/**packages/app/src/locales/.cache/c9b6a313c6ae58a22300f0ce5898300092840bdeis excluded by!**/.cache/**packages/app/src/locales/.cache/ca5fbe3526cfc70641c49d3edffb62d62b69c8e0is excluded by!**/.cache/**packages/app/src/locales/.cache/cd15a609ee9136b21e96263f06a156e350891db2is excluded by!**/.cache/**packages/app/src/locales/.cache/d312ba3233641288b8627f6eea19b9c590a9c87fis excluded by!**/.cache/**packages/app/src/locales/.cache/d3d891e242b6259fa7c20f9bdf50e5fc136844cdis excluded by!**/.cache/**packages/app/src/locales/.cache/d420d83826b5e2964104d1a170dfb0969cbae2bdis excluded by!**/.cache/**packages/app/src/locales/.cache/d46a83a57a741e0aa6b170d0fd56731e3fa0fe1fis excluded by!**/.cache/**packages/app/src/locales/.cache/d74e30ef84c3f0c77fc330b0965d30b0cb83c6dfis excluded by!**/.cache/**packages/app/src/locales/.cache/d7b8aa9b9a49b7a7d622b578be499513eed50e32is excluded by!**/.cache/**packages/app/src/locales/.cache/d812e260b310bfd0a668e580e73223c0f688c90eis excluded by!**/.cache/**packages/app/src/locales/.cache/da3e9c24ac42d195c382e95cace300f0f21b2943is excluded by!**/.cache/**packages/app/src/locales/.cache/db6f286eb210d9d4a79c512f9f2fe84f269d61d8is excluded by!**/.cache/**packages/app/src/locales/.cache/dc5e0d76ce5171e92a93f5f4380f94029d571868is excluded by!**/.cache/**packages/app/src/locales/.cache/dd17734bfec2edab14686d3bf70ac7134699c606is excluded by!**/.cache/**packages/app/src/locales/.cache/e02e29045206a420484d9a740b413903bf543d8bis excluded by!**/.cache/**packages/app/src/locales/.cache/e095eb28ce90498d93f2dd2e21f326ffcb950429is excluded by!**/.cache/**packages/app/src/locales/.cache/e0fe957cac111570d4a0af02cf60301489041b9eis excluded by!**/.cache/**packages/app/src/locales/.cache/e297ce85f2c94e53550ed58fba94785fb3e5a927is excluded by!**/.cache/**packages/app/src/locales/.cache/e4f8b0dcb755d26b4e3621f6977b795a411be59dis excluded by!**/.cache/**packages/app/src/locales/.cache/e53c90433403e2fc2f1c63f0dde82f8450d93fb3is excluded by!**/.cache/**packages/app/src/locales/.cache/e6e39df2eb9e9c3ee2a77e9d5f8ad4f1fe6a909fis excluded by!**/.cache/**packages/app/src/locales/.cache/e9b119f2f84ff9a07539f53026da0aacf107e0f5is excluded by!**/.cache/**packages/app/src/locales/.cache/ea81cf5a2d92ab64855522ab1020be2608363e70is excluded by!**/.cache/**packages/app/src/locales/.cache/eaa95d25918b1bf6f885aaaa6c830cfb10396084is excluded by!**/.cache/**packages/app/src/locales/.cache/eb554f0d82cb743d58f79ad076ea33a29da71facis excluded by!**/.cache/**packages/app/src/locales/.cache/ebf116495baaddbb2ef3444b6d75361dc5a93c3cis excluded by!**/.cache/**packages/app/src/locales/.cache/ecc9288384691ff36690bb69836227926264ddebis excluded by!**/.cache/**packages/app/src/locales/.cache/f253c5f626705b4e2edeb73358dfaf6f7a85c015is excluded by!**/.cache/**packages/app/src/locales/.cache/f43973cc8c54606502a1bb23005f5e7fe56ed068is excluded by!**/.cache/**packages/app/src/locales/.cache/f4d5380d6cd5d11dbcfc52a0d6f03c3681837c62is excluded by!**/.cache/**packages/app/src/locales/.cache/f7753e841ad6edb4419344650df556484f2c56a9is excluded by!**/.cache/**packages/app/src/locales/.cache/f89b16398463e504893b4461d5a6a6f0953c6f88is excluded by!**/.cache/**packages/app/src/locales/.cache/fc4aa342da0c7bef9e1c111f1c9fd131143fda00is excluded by!**/.cache/**packages/app/src/locales/.cache/fcb50d39f71537c566942502a98f0d52bcbc657eis excluded by!**/.cache/**packages/app/src/locales/.cache/fcbefc81927df9e1acab8639442ce17d7ea16a5fis excluded by!**/.cache/**packages/app/src/locales/.cache/fcd1921260359f153f4506c891356e7d95da3706is excluded by!**/.cache/**packages/app/src/locales/.cache/fcd73ab67d5aafca358e1d950be4b98aff1f7086is excluded by!**/.cache/**packages/app/src/locales/.cache/fd8d31659f7a8942a5e40afd7e6eead7fb9fec26is excluded by!**/.cache/**packages/app/src/locales/.cache/fe5d7b5d83980faa4ee6d2e4aae7f169f01ef492is excluded by!**/.cache/**
📒 Files selected for processing (39)
packages/app/.gitignorepackages/app/compose.ymlpackages/app/docker/transmart/Dockerfilepackages/app/package.jsonpackages/app/src/locales/ar/about.jsonpackages/app/src/locales/ar/encryption.jsonpackages/app/src/locales/ar/features.jsonpackages/app/src/locales/ar/introduction.jsonpackages/app/src/locales/ar/vault.jsonpackages/app/src/locales/bg/about.jsonpackages/app/src/locales/bg/encryption.jsonpackages/app/src/locales/bg/features.jsonpackages/app/src/locales/bg/introduction.jsonpackages/app/src/locales/bg/vault.jsonpackages/app/src/locales/ca/about.jsonpackages/app/src/locales/ca/encryption.jsonpackages/app/src/locales/ca/features.jsonpackages/app/src/locales/ca/introduction.jsonpackages/app/src/locales/ca/vault.jsonpackages/app/src/locales/cs/about.jsonpackages/app/src/locales/cs/encryption.jsonpackages/app/src/locales/cs/features.jsonpackages/app/src/locales/cs/introduction.jsonpackages/app/src/locales/cs/vault.jsonpackages/app/src/locales/da/about.jsonpackages/app/src/locales/da/encryption.jsonpackages/app/src/locales/da/features.jsonpackages/app/src/locales/da/introduction.jsonpackages/app/src/locales/da/vault.jsonpackages/app/src/locales/de/about.jsonpackages/app/src/locales/de/encryption.jsonpackages/app/src/locales/de/features.jsonpackages/app/src/locales/de/introduction.jsonpackages/app/src/locales/de/vault.jsonpackages/app/src/locales/el/about.jsonpackages/app/src/locales/el/encryption.jsonpackages/app/src/locales/el/features.jsonpackages/app/src/locales/el/introduction.jsonpackages/app/src/locales/el/vault.json
💤 Files with no reviewable changes (2)
- packages/app/compose.yml
- packages/app/docker/transmart/Dockerfile
✅ Files skipped from review due to trivial changes (33)
- packages/app/.gitignore
- packages/app/src/locales/da/about.json
- packages/app/src/locales/bg/encryption.json
- packages/app/src/locales/de/encryption.json
- packages/app/src/locales/ar/about.json
- packages/app/src/locales/ca/about.json
- packages/app/src/locales/bg/introduction.json
- packages/app/src/locales/ar/introduction.json
- packages/app/src/locales/ar/encryption.json
- packages/app/src/locales/de/about.json
- packages/app/src/locales/el/introduction.json
- packages/app/src/locales/bg/about.json
- packages/app/src/locales/el/features.json
- packages/app/src/locales/ca/encryption.json
- packages/app/src/locales/da/encryption.json
- packages/app/src/locales/da/introduction.json
- packages/app/src/locales/de/features.json
- packages/app/src/locales/cs/features.json
- packages/app/src/locales/ca/introduction.json
- packages/app/src/locales/de/introduction.json
- packages/app/src/locales/cs/encryption.json
- packages/app/src/locales/bg/features.json
- packages/app/src/locales/el/about.json
- packages/app/src/locales/ar/features.json
- packages/app/src/locales/cs/vault.json
- packages/app/src/locales/ca/features.json
- packages/app/src/locales/ca/vault.json
- packages/app/src/locales/da/features.json
- packages/app/src/locales/da/vault.json
- packages/app/src/locales/bg/vault.json
- packages/app/src/locales/cs/about.json
- packages/app/src/locales/el/encryption.json
- packages/app/src/locales/cs/introduction.json
🚧 Files skipped from review as they are similar to previous changes (1)
- packages/app/package.json
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (1)
packages/app/src/features/App/VaultCreator/index.tsx (1)
436-442: Keep the docs link from kicking users out of the setup flow.Opening this help link in the current tab can discard the vault name/password/KDF values the user already entered. Please open it separately.
Small tweak
components={{ encryption: ( - <Link href="https://deepink.io/introduction/encryption/" /> + <Link + href="https://deepink.io/introduction/encryption/" + target="_blank" + rel="noopener noreferrer" + /> ), }}🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/app/src/features/App/VaultCreator/index.tsx` around lines 436 - 442, The docs Link inside the Trans component currently opens in the same tab and can discard form state; update the Link element used in VaultCreator (the Link passed as the "encryption" component in Trans) to open in a new tab by adding target="_blank" and rel="noopener noreferrer" (or the framework-equivalent props) so the help URL opens separately and doesn't interrupt the setup flow.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/app/src/features/App/VaultCreator/index.tsx`:
- Around line 244-255: The create handler can be invoked twice before
setIsPending(true) re-renders, causing duplicate onCreateVault calls; add a
synchronous submission lock (e.g., a ref like isSubmittingRef or a module-level
boolean) checked at start of the submit flow and set to true immediately before
awaiting onCreateVault, then reset only after the async completes/fails; update
the submit function that calls onCreateVault (and references setIsPending,
vaultName, usePassword, algorithm, password, argonOps, argonMemory) to bail
early if the lock is set so rapid double-clicks only trigger one onCreateVault
invocation.
In `@packages/app/src/locales/de/vault.json`:
- Around line 95-96: The German description string for the "description" key
contains an English/typoed term "Verschlüsselungscascade" — replace it with the
correct German term "Verschlüsselungskaskade" (or "Verschlüsselungskaskaden" if
plural) inside the same "description" JSON value so the sentence remains fully
German and grammatically correct while preserving the surrounding markup like
<encryption>.
---
Nitpick comments:
In `@packages/app/src/features/App/VaultCreator/index.tsx`:
- Around line 436-442: The docs Link inside the Trans component currently opens
in the same tab and can discard form state; update the Link element used in
VaultCreator (the Link passed as the "encryption" component in Trans) to open in
a new tab by adding target="_blank" and rel="noopener noreferrer" (or the
framework-equivalent props) so the help URL opens separately and doesn't
interrupt the setup flow.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: bfb559b3-38e2-46b9-bc5c-c1855aa396cd
📒 Files selected for processing (18)
packages/app/scripts/webpack/app.tspackages/app/src/core/features/files/StateFile.tspackages/app/src/features/App/ChooseVaultScreen.tsxpackages/app/src/features/App/VaultCreator/index.tsxpackages/app/src/features/App/Vaults/hooks/useVaultContainers.tspackages/app/src/i18n/index.tspackages/app/src/locales/ar/settings.jsonpackages/app/src/locales/ar/vault.jsonpackages/app/src/locales/bg/settings.jsonpackages/app/src/locales/bg/vault.jsonpackages/app/src/locales/ca/settings.jsonpackages/app/src/locales/ca/vault.jsonpackages/app/src/locales/cs/settings.jsonpackages/app/src/locales/cs/vault.jsonpackages/app/src/locales/da/settings.jsonpackages/app/src/locales/da/vault.jsonpackages/app/src/locales/de/settings.jsonpackages/app/src/locales/de/vault.json
✅ Files skipped from review due to trivial changes (8)
- packages/app/scripts/webpack/app.ts
- packages/app/src/locales/ar/settings.json
- packages/app/src/locales/bg/settings.json
- packages/app/src/locales/ca/settings.json
- packages/app/src/locales/cs/settings.json
- packages/app/src/locales/cs/vault.json
- packages/app/src/locales/da/settings.json
- packages/app/src/locales/de/settings.json
🚧 Files skipped from review as they are similar to previous changes (7)
- packages/app/src/locales/ar/vault.json
- packages/app/src/locales/ca/vault.json
- packages/app/src/locales/bg/vault.json
- packages/app/src/locales/da/vault.json
- packages/app/src/i18n/index.ts
- packages/app/src/features/App/ChooseVaultScreen.tsx
- packages/app/src/core/features/files/StateFile.ts
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@packages/app/src/locales/ca/menu.json`:
- Line 10: Update the Catalan translation for the "paste" key in menu.json:
replace the misspelled value "Enganxer" with the correct infinitive "Enganxar"
to match the neighboring action labels and maintain consistent infinitive-style
verbs for menu actions (key: "paste").
In `@packages/app/src/locales/cs/vault.json`:
- Line 100: Update the Czech KDF description string (the "description" JSON
value for the KDF entry) to correct the grammar by replacing "každou pokus" with
"každý pokus" so the sentence reads correctly; keep the rest of the text
unchanged.
- Around line 48-57: Update the two Czech vault name strings: replace the value
for key "32" currently "Měkká atlas" with the grammatically correct "Měkký
atlas", and replace the value for key "41" currently "Nevypowídaný archiv" with
the corrected spelling "Nevypovídaný archiv"; edit the JSON entries for keys
"32" and "41" accordingly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: bc6035ea-c64c-4af5-b200-04955395cc44
📒 Files selected for processing (35)
packages/app/src/locales/ar/about.jsonpackages/app/src/locales/ar/common.jsonpackages/app/src/locales/ar/encryption.jsonpackages/app/src/locales/ar/features.jsonpackages/app/src/locales/ar/introduction.jsonpackages/app/src/locales/ar/menu.jsonpackages/app/src/locales/ar/settings.jsonpackages/app/src/locales/ar/vault.jsonpackages/app/src/locales/ar/workspace.jsonpackages/app/src/locales/bg/about.jsonpackages/app/src/locales/bg/common.jsonpackages/app/src/locales/bg/encryption.jsonpackages/app/src/locales/bg/features.jsonpackages/app/src/locales/bg/introduction.jsonpackages/app/src/locales/bg/menu.jsonpackages/app/src/locales/bg/settings.jsonpackages/app/src/locales/bg/vault.jsonpackages/app/src/locales/bg/workspace.jsonpackages/app/src/locales/ca/common.jsonpackages/app/src/locales/ca/encryption.jsonpackages/app/src/locales/ca/features.jsonpackages/app/src/locales/ca/introduction.jsonpackages/app/src/locales/ca/menu.jsonpackages/app/src/locales/ca/settings.jsonpackages/app/src/locales/ca/vault.jsonpackages/app/src/locales/ca/workspace.jsonpackages/app/src/locales/cs/common.jsonpackages/app/src/locales/cs/encryption.jsonpackages/app/src/locales/cs/features.jsonpackages/app/src/locales/cs/introduction.jsonpackages/app/src/locales/cs/menu.jsonpackages/app/src/locales/cs/settings.jsonpackages/app/src/locales/cs/vault.jsonpackages/app/src/locales/cs/workspace.jsonpackages/app/src/locales/da/about.json
✅ Files skipped from review due to trivial changes (21)
- packages/app/src/locales/bg/encryption.json
- packages/app/src/locales/ca/encryption.json
- packages/app/src/locales/cs/common.json
- packages/app/src/locales/cs/workspace.json
- packages/app/src/locales/bg/common.json
- packages/app/src/locales/ar/workspace.json
- packages/app/src/locales/ar/encryption.json
- packages/app/src/locales/ar/common.json
- packages/app/src/locales/bg/about.json
- packages/app/src/locales/cs/introduction.json
- packages/app/src/locales/ar/about.json
- packages/app/src/locales/da/about.json
- packages/app/src/locales/cs/encryption.json
- packages/app/src/locales/ca/common.json
- packages/app/src/locales/ar/introduction.json
- packages/app/src/locales/bg/workspace.json
- packages/app/src/locales/ca/workspace.json
- packages/app/src/locales/cs/menu.json
- packages/app/src/locales/bg/menu.json
- packages/app/src/locales/bg/introduction.json
- packages/app/src/locales/ar/menu.json
🚧 Files skipped from review as they are similar to previous changes (11)
- packages/app/src/locales/ca/introduction.json
- packages/app/src/locales/ar/vault.json
- packages/app/src/locales/ca/vault.json
- packages/app/src/locales/ca/settings.json
- packages/app/src/locales/cs/features.json
- packages/app/src/locales/cs/settings.json
- packages/app/src/locales/ar/settings.json
- packages/app/src/locales/ar/features.json
- packages/app/src/locales/bg/settings.json
- packages/app/src/locales/ca/features.json
- packages/app/src/locales/bg/features.json
Closes #273
Changes
VaultEncryptionController. Now we have single entrypoint to manage the encryption. Added tests against the encryption pipeline and the encryption material zeroinglocalStorage.noStorage = trueand reload the window.TODO
features.jsoninto a many scoped namespacesSummary by CodeRabbit
New Features
Improvements
Tests