eklavya 1.18.3 → 1.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/README.md +1 -1
  2. package/dist/assets/dashboard.html +570 -15
  3. package/dist/assets/tutor/SKILL.md +5 -5
  4. package/dist/assets/tutor/references/focus-and-level.md +34 -5
  5. package/dist/assets/tutor/references/grading.md +1 -1
  6. package/dist/cli.js +753 -41
  7. package/dist/cli.js.map +1 -1
  8. package/dist/config-path.js +156 -0
  9. package/dist/config-path.js.map +1 -0
  10. package/dist/config.js +448 -31
  11. package/dist/config.js.map +1 -1
  12. package/dist/dashboard.js +357 -1
  13. package/dist/dashboard.js.map +1 -1
  14. package/dist/eval/retrieval-score.js +77 -0
  15. package/dist/eval/retrieval-score.js.map +1 -0
  16. package/dist/hooks/capture-tool.js +107 -0
  17. package/dist/hooks/capture-tool.js.map +1 -0
  18. package/dist/hooks/checkpoint-quiz.js +2 -2
  19. package/dist/hooks/checkpoint-quiz.js.map +1 -1
  20. package/dist/hooks/lib.js +4 -30
  21. package/dist/hooks/lib.js.map +1 -1
  22. package/dist/hooks/memory-lib.js +181 -0
  23. package/dist/hooks/memory-lib.js.map +1 -0
  24. package/dist/hooks/pre-tool-gate.js +2 -2
  25. package/dist/hooks/pre-tool-gate.js.map +1 -1
  26. package/dist/hooks/prompt-submit-nudge.js +57 -20
  27. package/dist/hooks/prompt-submit-nudge.js.map +1 -1
  28. package/dist/hooks/session-start.js +110 -80
  29. package/dist/hooks/session-start.js.map +1 -1
  30. package/dist/hooks/stop-quiz-check.js +58 -38
  31. package/dist/hooks/stop-quiz-check.js.map +1 -1
  32. package/dist/hooks/subagent-start.js +2 -2
  33. package/dist/hooks/subagent-start.js.map +1 -1
  34. package/dist/install.js +37 -0
  35. package/dist/install.js.map +1 -1
  36. package/dist/memory/capture.js +123 -0
  37. package/dist/memory/capture.js.map +1 -0
  38. package/dist/memory/code.js +186 -0
  39. package/dist/memory/code.js.map +1 -0
  40. package/dist/memory/collections.js +87 -0
  41. package/dist/memory/collections.js.map +1 -0
  42. package/dist/memory/embed.js +81 -0
  43. package/dist/memory/embed.js.map +1 -0
  44. package/dist/memory/hosts.js +71 -0
  45. package/dist/memory/hosts.js.map +1 -0
  46. package/dist/memory/identity.js +74 -0
  47. package/dist/memory/identity.js.map +1 -0
  48. package/dist/memory/import.js +916 -0
  49. package/dist/memory/import.js.map +1 -0
  50. package/dist/memory/learning.js +148 -0
  51. package/dist/memory/learning.js.map +1 -0
  52. package/dist/memory/notify.js +220 -0
  53. package/dist/memory/notify.js.map +1 -0
  54. package/dist/memory/privacy.js +117 -0
  55. package/dist/memory/privacy.js.map +1 -0
  56. package/dist/memory/provider.js +155 -0
  57. package/dist/memory/provider.js.map +1 -0
  58. package/dist/memory/recall.js +327 -0
  59. package/dist/memory/recall.js.map +1 -0
  60. package/dist/memory/replay.js +174 -0
  61. package/dist/memory/replay.js.map +1 -0
  62. package/dist/memory/search.js +143 -0
  63. package/dist/memory/search.js.map +1 -0
  64. package/dist/memory/spool.js +93 -0
  65. package/dist/memory/spool.js.map +1 -0
  66. package/dist/memory/store.js +399 -0
  67. package/dist/memory/store.js.map +1 -0
  68. package/dist/memory/summarize.js +178 -0
  69. package/dist/memory/summarize.js.map +1 -0
  70. package/dist/memory/sync.js +595 -0
  71. package/dist/memory/sync.js.map +1 -0
  72. package/dist/memory/tokens.js +55 -0
  73. package/dist/memory/tokens.js.map +1 -0
  74. package/dist/memory/worker.js +207 -0
  75. package/dist/memory/worker.js.map +1 -0
  76. package/dist/migrations/009_memory.sql +226 -0
  77. package/dist/migrations/010_import.sql +26 -0
  78. package/dist/migrations/011_sync.sql +76 -0
  79. package/dist/migrations/012_job_backoff.sql +13 -0
  80. package/dist/migrations/013_batch_provenance.sql +18 -0
  81. package/dist/migrations/014_batch_events_index.sql +18 -0
  82. package/dist/packs.js +26 -12
  83. package/dist/packs.js.map +1 -1
  84. package/dist/paths.js +60 -0
  85. package/dist/paths.js.map +1 -1
  86. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  87. package/dist/plugin/agents/tutor.md +3 -1
  88. package/dist/plugin/cli/CLAUDE.md +32 -8
  89. package/dist/plugin/cli/eklavya-gate +80 -9
  90. package/dist/plugin/hooks/CLAUDE.md +44 -19
  91. package/dist/plugin/hooks/hooks.json +10 -0
  92. package/dist/plugin/scripts/install-git-hook.sh +2 -1
  93. package/dist/plugin/skills/CLAUDE.md +29 -17
  94. package/dist/plugin/skills/gate/SKILL.md +1 -1
  95. package/dist/plugin/skills/level/SKILL.md +3 -3
  96. package/dist/plugin/skills/memory/SKILL.md +88 -0
  97. package/dist/plugin/skills/mode/SKILL.md +24 -16
  98. package/dist/plugin/skills/pack/SKILL.md +8 -4
  99. package/dist/plugin/skills/progress/SKILL.md +1 -1
  100. package/dist/plugin/skills/quiz/SKILL.md +2 -2
  101. package/dist/plugin/skills/setup/SKILL.md +25 -11
  102. package/dist/plugin/skills/tutor/SKILL.md +5 -5
  103. package/dist/plugin/skills/tutor/references/focus-and-level.md +34 -5
  104. package/dist/plugin/skills/tutor/references/grading.md +1 -1
  105. package/dist/session.js +1 -1
  106. package/dist/statusline.js +20 -6
  107. package/dist/statusline.js.map +1 -1
  108. package/dist/store.js +2 -2
  109. package/dist/store.js.map +1 -1
  110. package/dist/surface.js +1 -1
  111. package/dist/time.js +41 -0
  112. package/dist/time.js.map +1 -0
  113. package/dist/tools/code_tools.js +73 -0
  114. package/dist/tools/code_tools.js.map +1 -0
  115. package/dist/tools/collection_tools.js +92 -0
  116. package/dist/tools/collection_tools.js.map +1 -0
  117. package/dist/tools/config_tools.js +165 -32
  118. package/dist/tools/config_tools.js.map +1 -1
  119. package/dist/tools/get_learner_profile.js +2 -1
  120. package/dist/tools/get_learner_profile.js.map +1 -1
  121. package/dist/tools/get_session_quiz_plan.js +15 -9
  122. package/dist/tools/get_session_quiz_plan.js.map +1 -1
  123. package/dist/tools/index.js +15 -0
  124. package/dist/tools/index.js.map +1 -1
  125. package/dist/tools/memory_read_tools.js +277 -0
  126. package/dist/tools/memory_read_tools.js.map +1 -0
  127. package/dist/tools/memory_write_tools.js +115 -0
  128. package/dist/tools/memory_write_tools.js.map +1 -0
  129. package/dist/tools/types.js +1 -1
  130. package/dist/tools/types.js.map +1 -1
  131. package/dist/user-skill/eklavya/SKILL.md +95 -25
  132. package/package.json +2 -1
package/dist/config.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import fs from 'node:fs';
2
2
  import os from 'node:os';
3
3
  import path from 'node:path';
4
- import { globalConfigPath } from './paths.js';
4
+ import { globalConfigPath, projectConfigPath } from './paths.js';
5
5
  export const DEFAULT_CONFIG = {
6
- mode: 'ambient',
6
+ quiz: { enabled: true, enforced: false },
7
7
  focus: 'concept',
8
8
  focus_topic: null,
9
9
  cadence: 'interleaved',
@@ -18,8 +18,44 @@ export const DEFAULT_CONFIG = {
18
18
  quiet: false,
19
19
  max_new_concepts_per_session: 8,
20
20
  max_stop_blocks_per_session: 3,
21
+ memory: {
22
+ enabled: true,
23
+ capture: 'full',
24
+ batch_max_events: 40,
25
+ retention_days: null,
26
+ },
27
+ privacy: {
28
+ exclude_paths: [],
29
+ exclude_tools: [],
30
+ redact_patterns: [],
31
+ },
32
+ retrieval: {
33
+ mode: 'hybrid',
34
+ max_items: 6,
35
+ max_tokens: 1200,
36
+ cross_project: false,
37
+ },
38
+ providers: {
39
+ observer: null,
40
+ embeddings: null,
41
+ },
42
+ notifications: {
43
+ enabled: false,
44
+ sinks: [],
45
+ },
46
+ sync: {
47
+ enabled: false,
48
+ target: null,
49
+ device_id: null,
50
+ },
21
51
  };
22
- export const REPO_CONFIG_FILE = '.eklavya.json';
52
+ /**
53
+ * The file Eklavya used to keep inside the checkout, and no longer does.
54
+ *
55
+ * Still named here for one reason: `migrateLegacyRepoConfig` has to recognise
56
+ * it, lift it out and delete it. Nothing reads it as configuration any more.
57
+ */
58
+ export const LEGACY_REPO_CONFIG_FILE = '.eklavya.json';
23
59
  function realPath(p) {
24
60
  try {
25
61
  return fs.realpathSync(p);
@@ -42,40 +78,34 @@ function readJson(file) {
42
78
  }
43
79
  }
44
80
  /**
45
- * Walks up from `cwd` looking for a repo-level config, stopping at the git root
46
- * or the filesystem root. Returns the directory holding it, plus the git root if
47
- * one was passed on the way (Phase 3 stamps that onto gate rows).
81
+ * Walks up from `cwd` to the git root, which is the only thing a checkout still
82
+ * tells us: settings themselves live outside it, under `~/.eklavya/projects/`.
83
+ *
84
+ * Keeps its name because it is on the call path of every hook, the packs loader
85
+ * and the session pointer, and because "find the repo this config belongs to"
86
+ * is still exactly what it does.
48
87
  */
49
88
  export function findRepoConfig(cwd = process.cwd()) {
50
89
  // Resolve symlinks: `git rev-parse --show-toplevel` reports the real path, and
51
90
  // the git pre-commit hook matches gate rows on it. On macOS /tmp is a symlink
52
91
  // to /private/tmp, so without this the two sides silently never match.
53
92
  let dir = realPath(path.resolve(cwd));
54
- let repoPath = null;
55
- let repoRoot = null;
56
93
  for (;;) {
57
- if (!repoPath && fs.existsSync(path.join(dir, REPO_CONFIG_FILE))) {
58
- repoPath = path.join(dir, REPO_CONFIG_FILE);
59
- }
60
- if (!repoRoot && fs.existsSync(path.join(dir, '.git'))) {
61
- repoRoot = dir;
62
- // The git root is the boundary: a config above it belongs to another project.
63
- break;
64
- }
94
+ if (fs.existsSync(path.join(dir, '.git')))
95
+ return { repoRoot: dir };
65
96
  const parent = path.dirname(dir);
66
97
  if (parent === dir || dir === os.homedir())
67
- break;
98
+ return { repoRoot: null };
68
99
  dir = parent;
69
100
  }
70
- return { repoPath, repoRoot };
71
101
  }
72
102
  /**
73
103
  * The main checkout behind a git worktree, or the path unchanged.
74
104
  *
75
105
  * A linked worktree's `.git` is a file reading `gitdir: <main>/.git/worktrees/<name>`,
76
106
  * so `findRepoConfig` stops there and reports the worktree as the git root. That
77
- * is right for finding `.eklavya.json` -- the worktree has its own checkout of it
78
- * -- and wrong for identity: a branch parked in a worktree is the same codebase,
107
+ * is right for finding the checkout you are standing in, and wrong for
108
+ * identity: a branch parked in a worktree is the same codebase,
79
109
  * and keying a project on the worktree path mints a fresh project, at `easy`,
80
110
  * every time someone starts a branch.
81
111
  */
@@ -106,8 +136,6 @@ export function mainRepoRoot(repoRoot) {
106
136
  }
107
137
  function coerce(raw, base) {
108
138
  const out = { ...base };
109
- if (raw.mode === 'ambient' || raw.mode === 'enforced' || raw.mode === 'off')
110
- out.mode = raw.mode;
111
139
  if (raw.focus === 'project' || raw.focus === 'concept' || raw.focus === 'learn')
112
140
  out.focus = raw.focus;
113
141
  if (raw.cadence === 'interleaved' || raw.cadence === 'end')
@@ -158,29 +186,418 @@ function coerce(raw, base) {
158
186
  raw.max_stop_blocks_per_session >= 0) {
159
187
  out.max_stop_blocks_per_session = Math.floor(raw.max_stop_blocks_per_session);
160
188
  }
189
+ coerceNamespaces(raw, out);
190
+ return out;
191
+ }
192
+ function stringArray(value) {
193
+ return Array.isArray(value) && value.every((v) => typeof v === 'string') ? value : null;
194
+ }
195
+ function sinkOf(value) {
196
+ if (!value || typeof value !== 'object')
197
+ return null;
198
+ const v = value;
199
+ if (v.kind !== 'webhook' && v.kind !== 'command' && v.kind !== 'file')
200
+ return null;
201
+ if (typeof v.target !== 'string' || !v.target.trim())
202
+ return null;
203
+ return {
204
+ kind: v.kind,
205
+ target: v.target.trim(),
206
+ args: stringArray(v.args) ?? undefined,
207
+ events: stringArray(v.events) ?? undefined,
208
+ };
209
+ }
210
+ function provider(value) {
211
+ if (!value || typeof value !== 'object')
212
+ return null;
213
+ const v = value;
214
+ if (v.kind !== 'anthropic')
215
+ return null;
216
+ if (typeof v.model !== 'string' || !v.model.trim())
217
+ return null;
218
+ // A key in the config file would end up in every export, log and dashboard
219
+ // payload that ever prints configuration (PRD SEC-01). Only the name of the
220
+ // variable holding it lives here.
221
+ const keyEnv = typeof v.api_key_env === 'string' && v.api_key_env.trim() ? v.api_key_env.trim() : 'ANTHROPIC_API_KEY';
222
+ return { kind: 'anthropic', model: v.model.trim(), api_key_env: keyEnv };
223
+ }
224
+ /**
225
+ * The namespaced half. Unknown keys are left alone rather than dropped: the
226
+ * resolved `raw` still carries them, so `eklavya doctor` can report a typo
227
+ * instead of the setting silently doing nothing.
228
+ */
229
+ function coerceNamespaces(raw, out) {
230
+ const quiz = raw.quiz;
231
+ if (quiz && typeof quiz === 'object') {
232
+ out.quiz = { ...out.quiz };
233
+ if (typeof quiz.enabled === 'boolean')
234
+ out.quiz.enabled = quiz.enabled;
235
+ if (typeof quiz.enforced === 'boolean')
236
+ out.quiz.enforced = quiz.enforced;
237
+ }
238
+ // The one combination the flag pair can express and the old enum could not:
239
+ // a gate holding commits until questions are passed, with the questions
240
+ // switched off. Nothing would ever ask, so nothing would ever pass, and the
241
+ // developer would be locked out of `git commit` in their own repository with
242
+ // no message explaining which setting did it.
243
+ //
244
+ // `enabled` wins. The alternative -- honouring `enforced` by turning
245
+ // questions back on -- overrides an explicit request for silence in order to
246
+ // start interrupting someone, which is the worse way to be wrong. It also
247
+ // fails safe: the cost here is a gate that does not hold, and `eklavya doctor`
248
+ // reports the contradiction rather than leaving it to be discovered at the
249
+ // first blocked commit.
250
+ if (!out.quiz.enabled)
251
+ out.quiz.enforced = false;
252
+ const memory = raw.memory;
253
+ if (memory && typeof memory === 'object') {
254
+ out.memory = { ...out.memory };
255
+ if (typeof memory.enabled === 'boolean')
256
+ out.memory.enabled = memory.enabled;
257
+ if (memory.capture === 'full' || memory.capture === 'minimal' || memory.capture === 'off') {
258
+ out.memory.capture = memory.capture;
259
+ }
260
+ if (typeof memory.batch_max_events === 'number' && memory.batch_max_events > 0) {
261
+ out.memory.batch_max_events = Math.floor(memory.batch_max_events);
262
+ }
263
+ if (typeof memory.retention_days === 'number' && memory.retention_days > 0) {
264
+ out.memory.retention_days = Math.floor(memory.retention_days);
265
+ }
266
+ else if (memory.retention_days === null) {
267
+ out.memory.retention_days = null;
268
+ }
269
+ }
270
+ const privacy = raw.privacy;
271
+ if (privacy && typeof privacy === 'object') {
272
+ out.privacy = { ...out.privacy };
273
+ const paths = stringArray(privacy.exclude_paths);
274
+ if (paths)
275
+ out.privacy.exclude_paths = paths;
276
+ const tools = stringArray(privacy.exclude_tools);
277
+ if (tools)
278
+ out.privacy.exclude_tools = tools;
279
+ const patterns = stringArray(privacy.redact_patterns);
280
+ if (patterns)
281
+ out.privacy.redact_patterns = patterns;
282
+ }
283
+ const retrieval = raw.retrieval;
284
+ if (retrieval && typeof retrieval === 'object') {
285
+ out.retrieval = { ...out.retrieval };
286
+ if (retrieval.mode === 'keyword' || retrieval.mode === 'semantic' || retrieval.mode === 'hybrid') {
287
+ out.retrieval.mode = retrieval.mode;
288
+ }
289
+ if (typeof retrieval.max_items === 'number' && retrieval.max_items > 0) {
290
+ out.retrieval.max_items = Math.floor(retrieval.max_items);
291
+ }
292
+ if (typeof retrieval.max_tokens === 'number' && retrieval.max_tokens > 0) {
293
+ out.retrieval.max_tokens = Math.floor(retrieval.max_tokens);
294
+ }
295
+ if (typeof retrieval.cross_project === 'boolean')
296
+ out.retrieval.cross_project = retrieval.cross_project;
297
+ }
298
+ const notifications = raw.notifications;
299
+ if (notifications && typeof notifications === 'object') {
300
+ out.notifications = { ...out.notifications };
301
+ if (typeof notifications.enabled === 'boolean')
302
+ out.notifications.enabled = notifications.enabled;
303
+ if (Array.isArray(notifications.sinks)) {
304
+ out.notifications.sinks = notifications.sinks.flatMap((entry) => {
305
+ const sink = sinkOf(entry);
306
+ return sink ? [sink] : [];
307
+ });
308
+ }
309
+ }
310
+ const providers = raw.providers;
311
+ if (providers && typeof providers === 'object') {
312
+ out.providers = {
313
+ observer: provider(providers.observer),
314
+ embeddings: provider(providers.embeddings),
315
+ };
316
+ }
317
+ const sync = raw.sync;
318
+ if (sync && typeof sync === 'object') {
319
+ out.sync = { ...out.sync };
320
+ if (typeof sync.enabled === 'boolean')
321
+ out.sync.enabled = sync.enabled;
322
+ if (typeof sync.target === 'string' && sync.target.trim()) {
323
+ out.sync.target = sync.target.trim();
324
+ }
325
+ else if (sync.target === null) {
326
+ out.sync.target = null;
327
+ }
328
+ if (typeof sync.device_id === 'string' && sync.device_id.trim()) {
329
+ out.sync.device_id = sync.device_id.trim();
330
+ }
331
+ else if (sync.device_id === null) {
332
+ out.sync.device_id = null;
333
+ }
334
+ }
335
+ }
336
+ /**
337
+ * Keys a file that arrived by `git clone` may not set, ever.
338
+ *
339
+ * `REPO_FORBIDDEN_KEYS` was deleted with the committed settings file, on the
340
+ * reasoning that nothing arrives from a stranger any more. That is true of
341
+ * `~/.eklavya/projects/`, and **not** true of the one path that still reads a
342
+ * checkout: a repository shipping a legacy `.eklavya.json` is still handing
343
+ * this machine a configuration file somebody else wrote, right up until a
344
+ * session moves it. Without this the removal reintroduced the exact RCE the old
345
+ * list existed to stop — a `command` notification sink of `/bin/sh -c ...`,
346
+ * fired by the Stop hook's automatic wrap-up, on `git clone` plus ten minutes —
347
+ * and `migrateLegacyRepoConfig` then laundered it into the trusted location, so
348
+ * it survived the file being deleted.
349
+ *
350
+ * Each one has an effect *outside* the session: `notifications` runs a command
351
+ * or posts somewhere, `sync` writes files, `providers` sends this machine's
352
+ * work to an API, and `retrieval.cross_project` widens what the model sees. A
353
+ * dial is safe to inherit from a stranger; these are not.
354
+ */
355
+ const CLONED_FORBIDDEN = ['notifications', 'sync', 'providers'];
356
+ /**
357
+ * The same filter, applied to anything read out of a checkout. Dropped in
358
+ * silence rather than reported: the file is on its way to being deleted, and
359
+ * there is no setting to explain because it never applied.
360
+ */
361
+ function withoutUntrustedKeys(raw) {
362
+ const out = {};
363
+ for (const [key, value] of Object.entries(raw)) {
364
+ if (CLONED_FORBIDDEN.includes(key))
365
+ continue;
366
+ if (key === 'retrieval' && value && typeof value === 'object' && !Array.isArray(value)) {
367
+ // One key of this namespace is the dangerous one; the rest of it is an
368
+ // ordinary preference, so the namespace is trimmed rather than dropped.
369
+ const { cross_project: _crossProject, ...rest } = value;
370
+ out[key] = rest;
371
+ continue;
372
+ }
373
+ out[key] = value;
374
+ }
161
375
  return out;
162
376
  }
163
- /** Global config merged with the repo's, repo winning. */
377
+ /**
378
+ * A `<repo>/.eklavya.json` lifted out of the checkout, then deleted.
379
+ *
380
+ * Silent and automatic, by decision: a settings file in a repository was a
381
+ * mistake to be undone, not a choice to be confirmed every session. Prompting
382
+ * would put the mistake on screen once per project per developer for ever.
383
+ *
384
+ * **The two roots differ in a linked worktree**, and both matter. `.eklavya.json`
385
+ * was a *committed* file, so a worktree has its own checked-out copy of it: the
386
+ * file to delete is the one in the checkout you are standing in, while the
387
+ * settings belong to the main checkout's key, since a worktree is a branch of
388
+ * the same codebase rather than a project to configure again. Reading from the
389
+ * main root instead left every worktree's copy sitting in its working tree for
390
+ * ever — the file the whole change exists to remove.
391
+ *
392
+ * **It is never called from `loadConfig`.** That was the first shape and it was
393
+ * wrong: `loadConfig` runs from every hook, every tool call and the statusline
394
+ * on every prompt render, so putting a write behind it made a read function
395
+ * mutate the filesystem from a dozen call sites that had no business doing so.
396
+ * The test suite found it the honest way -- a run scattered thirty directories
397
+ * through the real `~/.eklavya/projects/`, because only spawned children had
398
+ * `EKLAVYA_HOME` pointed somewhere safe. A read that writes is a read nobody can
399
+ * reason about.
400
+ *
401
+ * So it is called from the three places that are genuinely a moment of work:
402
+ * the SessionStart hook, `eklavya doctor`, and `eklavya config`. SessionStart is
403
+ * what makes it feel automatic -- the move happens on the next session, with
404
+ * nothing on screen -- and `loadConfig` reads the legacy file as a fallback in
405
+ * the meantime, so settings never stop applying in the window before it runs.
406
+ *
407
+ * Three properties still matter, because sessions start in parallel:
408
+ *
409
+ * It never throws. A read-only checkout, a file owned by somebody else, a
410
+ * home directory that will not take a write -- all of them fall through to
411
+ * returning `false`, and the caller reads the legacy file this one time
412
+ * rather than losing the settings.
413
+ *
414
+ * It never loses a setting. When project config already exists the legacy
415
+ * keys are merged *underneath* it, so the newer file still wins and nothing
416
+ * in the old one is dropped on the floor.
417
+ *
418
+ * It is safe to lose a race. The write is temp-file-plus-rename, and the
419
+ * unlink tolerates a file another process already removed.
420
+ */
421
+ export function migrateLegacyRepoConfig(checkoutRoot, projectRoot = checkoutRoot) {
422
+ const legacyPath = path.join(checkoutRoot, LEGACY_REPO_CONFIG_FILE);
423
+ try {
424
+ if (!fs.existsSync(legacyPath))
425
+ return false;
426
+ const legacy = readJson(legacyPath);
427
+ // Unreadable or malformed: left exactly where it is. A trailing comma in a
428
+ // hand-edited file is still somebody's settings, and deleting it would lose
429
+ // them for good; `loadConfig` reads it as empty, so it does no harm there.
430
+ if (!legacy)
431
+ return false;
432
+ const target = projectConfigPath(projectRoot);
433
+ const existing = readJson(target) ?? {};
434
+ // Filtered on the way in. Everything under ~/.eklavya/projects/ is
435
+ // treated as written by the developer, so copying a cloned file's keys
436
+ // there verbatim would launder them into trust and outlive the deletion.
437
+ // A target stamped for another checkout makes `writeConfigFile` throw, so
438
+ // a slug collision keeps the legacy file rather than taking over the other.
439
+ writeConfigFile(target, {
440
+ ...withoutUntrustedKeys(legacy),
441
+ ...existing,
442
+ project: projectRoot,
443
+ });
444
+ fs.rmSync(legacyPath, { force: true });
445
+ return true;
446
+ }
447
+ catch {
448
+ return false;
449
+ }
450
+ }
451
+ /**
452
+ * `mode` rewritten to the `quiz` namespace that replaced it, one file at a time.
453
+ *
454
+ * This stays forever. A config written against `mode` outlives the rename by
455
+ * years, and dropping the alias would not error -- `coerce` ignores keys it does
456
+ * not know, so the dial would silently revert to the default.
457
+ *
458
+ * It runs **per file, before `mergeConfigs`**, and that is the whole subtlety.
459
+ * Resolving the alias on the merged object instead makes the two precedence
460
+ * rules fight: within one file an explicit `quiz` should beat a `mode` left
461
+ * lying beside it, and across files the project should beat the global whichever
462
+ * spelling each one used. Merged first, a global `quiz` silently outranked a
463
+ * project `mode`.
464
+ */
465
+ function normalizeLegacyKeys(raw) {
466
+ const fromMode = raw.mode === 'ambient'
467
+ ? { enabled: true, enforced: false }
468
+ : raw.mode === 'enforced'
469
+ ? { enabled: true, enforced: true }
470
+ : raw.mode === 'off'
471
+ ? { enabled: false, enforced: false }
472
+ : null;
473
+ if (!fromMode)
474
+ return raw;
475
+ // `mode` is dropped rather than carried along, so `overrides` compares the one
476
+ // key that now means something and nothing downstream sees two spellings.
477
+ const { mode: _mode, ...rest } = raw;
478
+ const explicit = raw.quiz && typeof raw.quiz === 'object' && !Array.isArray(raw.quiz)
479
+ ? raw.quiz
480
+ : {};
481
+ return { ...rest, quiz: { ...fromMode, ...explicit } };
482
+ }
483
+ /**
484
+ * Global then repo, one level deep for the namespaces.
485
+ *
486
+ * A flat spread is right for the dials and wrong for the namespaces: a repo
487
+ * setting `memory.capture` would replace the whole `memory` object and take
488
+ * the developer's `memory.enabled` with it. One level is all the schema has,
489
+ * so one level is all this does.
490
+ */
491
+ function mergeConfigs(base, over) {
492
+ const merged = { ...base };
493
+ for (const [key, value] of Object.entries(over)) {
494
+ const existing = merged[key];
495
+ const bothObjects = value !== null && typeof value === 'object' && !Array.isArray(value) &&
496
+ existing !== null && typeof existing === 'object' && !Array.isArray(existing);
497
+ merged[key] = bothObjects
498
+ ? { ...existing, ...value }
499
+ : value;
500
+ }
501
+ return merged;
502
+ }
164
503
  export function loadConfig(cwd = process.cwd()) {
165
504
  const globalPath = globalConfigPath();
166
- const { repoPath, repoRoot } = findRepoConfig(cwd);
167
- const globalRaw = readJson(globalPath) ?? {};
168
- const repoRaw = repoPath ? (readJson(repoPath) ?? {}) : {};
169
- const raw = { ...globalRaw, ...repoRaw };
170
- const overrides = Object.keys(repoRaw).filter((key) => key in globalRaw && JSON.stringify(globalRaw[key]) !== JSON.stringify(repoRaw[key]));
505
+ const { repoRoot } = findRepoConfig(cwd);
506
+ // A worktree is a branch of the same codebase, not a new project to configure
507
+ // from scratch -- the same fold `projectKey` applies to levels and mastery.
508
+ const projectRoot = repoRoot ? mainRepoRoot(repoRoot) : null;
509
+ const projectPath = projectRoot ? projectConfigPath(projectRoot) : null;
510
+ // Read-only, deliberately and permanently: see `migrateLegacyRepoConfig`.
511
+ let projectRaw = {};
512
+ if (repoRoot && projectRoot && projectPath) {
513
+ const onDisk = readJson(projectPath);
514
+ if (onDisk && belongsTo(onDisk, projectRoot)) {
515
+ projectRaw = onDisk;
516
+ }
517
+ else if (!onDisk) {
518
+ // Nothing outside the checkout yet. A legacy file still sitting in the
519
+ // repo is read until the next session moves it, so settings never stop
520
+ // applying in the window before the migration runs. A file that *is*
521
+ // there but belongs to another checkout falls through to global instead:
522
+ // that is a slug collision, and the legacy file is not the answer to it.
523
+ // From the checkout you are standing in: in a worktree that is where the
524
+ // committed copy actually is, and the main root may already be migrated.
525
+ //
526
+ // Filtered, because this is the one path left that reads a file which may
527
+ // have arrived by `git clone`. It applies for exactly as long as it takes
528
+ // a session to move the file, and that window is long enough to run a
529
+ // notification sink.
530
+ projectRaw = withoutUntrustedKeys(readJson(path.join(repoRoot, LEGACY_REPO_CONFIG_FILE)) ?? {});
531
+ }
532
+ }
533
+ const globalRaw = normalizeLegacyKeys(readJson(globalPath) ?? {});
534
+ const projectNormalized = normalizeLegacyKeys(withoutBookkeeping(projectRaw));
535
+ const raw = mergeConfigs(globalRaw, projectNormalized);
536
+ const overrides = Object.keys(projectNormalized).filter((key) => key in globalRaw &&
537
+ JSON.stringify(globalRaw[key]) !== JSON.stringify(projectNormalized[key]));
171
538
  return {
172
539
  config: coerce(raw, DEFAULT_CONFIG),
173
540
  raw,
174
541
  globalPath,
175
- repoPath,
542
+ projectPath,
176
543
  repoRoot,
177
544
  overrides,
178
545
  };
179
546
  }
180
- /** Writes via temp file + rename: the git hook may be reading mid-write. */
547
+ /**
548
+ * Whether a project config file is about the checkout we are asking about.
549
+ *
550
+ * `projectSlug` folds `/` and `-` together, so `/a/b-c` and `/a-b/c` land in
551
+ * one directory. The slug stays readable -- that is what it is for -- and this
552
+ * catches the collision instead: a file that names a different checkout is not
553
+ * this project's configuration, so it is ignored rather than applied to the
554
+ * wrong repository. A file written before `project` was recorded has nothing to
555
+ * disagree with and is trusted, which is what makes the field safe to add.
556
+ */
557
+ function belongsTo(raw, repoRoot) {
558
+ return typeof raw.project !== 'string' || raw.project === repoRoot;
559
+ }
560
+ /** `project` is bookkeeping for `belongsTo`, never a setting. */
561
+ function withoutBookkeeping(raw) {
562
+ if (!('project' in raw))
563
+ return raw;
564
+ const { project: _project, ...rest } = raw;
565
+ return rest;
566
+ }
567
+ /** One config file's raw contents, or `{}`. Exported so a caller building a
568
+ * patch can merge against what is actually in the file it is about to write. */
569
+ export function readConfigFile(file) {
570
+ return readJson(file) ?? {};
571
+ }
572
+ /**
573
+ * Writes via temp file + rename: the git hook may be reading mid-write.
574
+ *
575
+ * Refuses a patch stamped for one checkout onto a file stamped for another.
576
+ * That is a slug collision (see `belongsTo`), and merging would hand the other
577
+ * checkout's settings to this one while that checkout silently stopped reading
578
+ * its own file. Every project write routes through here, so this is the one
579
+ * place the collision is caught on the way in.
580
+ */
181
581
  export function writeConfigFile(file, patch) {
182
582
  const existing = readJson(file) ?? {};
183
- const merged = { ...existing, ...patch };
583
+ if (typeof patch.project === 'string' && !belongsTo(existing, patch.project)) {
584
+ throw new Error(`${file} already holds the settings for ${String(existing.project)}, a different checkout whose ` +
585
+ `path folds to the same directory name. Not overwriting it.`);
586
+ }
587
+ let merged = { ...existing, ...patch };
588
+ // A `quiz` written today retires a `mode` left beside it, folded in rather
589
+ // than dropped. Left in place, `mode: enforced` under a new `quiz.enabled:
590
+ // false` resolves to enforced-and-silent, which `doctor` then reports as a
591
+ // contradiction the developer never wrote. An explicit "off" also switches
592
+ // off the enforcement that only the retired dial implied.
593
+ if ('quiz' in patch && 'mode' in merged) {
594
+ const explicit = (merged.quiz ?? {});
595
+ merged = normalizeLegacyKeys(merged);
596
+ if (explicit.enabled === false && explicit.enforced === undefined) {
597
+ merged.quiz = { ...merged.quiz, enforced: false };
598
+ }
599
+ delete merged.mode;
600
+ }
184
601
  fs.mkdirSync(path.dirname(file), { recursive: true });
185
602
  const tmp = `${file}.tmp-${process.pid}`;
186
603
  fs.writeFileSync(tmp, `${JSON.stringify(merged, null, 2)}\n`, 'utf8');
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAiH9C,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,aAAa;IACtB,UAAU,EAAE,MAAM;IAClB,cAAc,EAAE,GAAG;IACnB,iBAAiB,EAAE,GAAG;IACtB,cAAc,EAAE,GAAG;IACnB,sBAAsB,EAAE,CAAC;IACzB,2BAA2B,EAAE,EAAE;IAC/B,+BAA+B,EAAE,CAAC;IAClC,eAAe,EAAE,CAAC,GAAG,CAAC;IACtB,KAAK,EAAE,KAAK;IACZ,4BAA4B,EAAE,CAAC;IAC/B,2BAA2B,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAoBhD,SAAS,QAAQ,CAAC,CAAS;IACzB,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;QAC3C,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACnE,CAAC,CAAE,MAAkC;YACrC,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,8EAA8E;QAC9E,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IAIxD,+EAA+E;IAC/E,8EAA8E;IAC9E,uEAAuE;IACvE,IAAI,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IAEnC,SAAS,CAAC;QACR,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;YACjE,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YACvD,QAAQ,GAAG,GAAG,CAAC;YACf,8EAA8E;YAC9E,MAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,OAAO,EAAE;YAAE,MAAM;QAClD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE;YAAE,OAAO,QAAQ,CAAC;QACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM;YAAE,OAAO,QAAQ,CAAC;QAC7B,6EAA6E;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC;QAChE,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,4EAA4E;QAC5E,4EAA4E;QAC5E,6EAA6E;QAC7E,2EAA2E;QAC3E,4EAA4E;QAC5E,sEAAsE;QACtE,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,GAA4B,EAAE,IAAmB;IAC/D,MAAM,GAAG,GAAkB,EAAE,GAAG,IAAI,EAAE,CAAC;IAEvC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK;QAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACjG,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO;QAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IACvG,IAAI,GAAG,CAAC,OAAO,KAAK,aAAa,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK;QAAE,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IACtF,IACE,GAAG,CAAC,UAAU,KAAK,MAAM;QACzB,GAAG,CAAC,UAAU,KAAK,MAAM;QACzB,GAAG,CAAC,UAAU,KAAK,QAAQ;QAC3B,GAAG,CAAC,UAAU,KAAK,MAAM,EACzB,CAAC;QACD,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,IAAI,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;QACrE,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC;IACD,IACE,OAAO,GAAG,CAAC,iBAAiB,KAAK,QAAQ;QACzC,GAAG,CAAC,iBAAiB,IAAI,CAAC;QAC1B,GAAG,CAAC,iBAAiB,IAAI,CAAC,EAC1B,CAAC;QACD,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,iBAAiB,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QAClE,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;SAAM,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QACpC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,IAAI,GAAG,CAAC,cAAc,IAAI,CAAC,IAAI,GAAG,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC;QACjG,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC;IAC1C,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,sBAAsB,KAAK,QAAQ,IAAI,GAAG,CAAC,sBAAsB,GAAG,CAAC,EAAE,CAAC;QACrF,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,2BAA2B,KAAK,QAAQ,IAAI,GAAG,CAAC,2BAA2B,IAAI,CAAC,EAAE,CAAC;QAChG,GAAG,CAAC,2BAA2B,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAChF,CAAC;IACD,IACE,OAAO,GAAG,CAAC,+BAA+B,KAAK,QAAQ;QACvD,GAAG,CAAC,+BAA+B,IAAI,CAAC,EACxC,CAAC;QACD,GAAG,CAAC,+BAA+B,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;QAClG,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,eAA2B,CAAC;IACxD,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,SAAS;QAAE,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;IAC1D,IACE,OAAO,GAAG,CAAC,4BAA4B,KAAK,QAAQ;QACpD,GAAG,CAAC,4BAA4B,IAAI,CAAC,EACrC,CAAC;QACD,GAAG,CAAC,4BAA4B,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAClF,CAAC;IACD,IACE,OAAO,GAAG,CAAC,2BAA2B,KAAK,QAAQ;QACnD,GAAG,CAAC,2BAA2B,IAAI,CAAC,EACpC,CAAC;QACD,GAAG,CAAC,2BAA2B,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,UAAU,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACpD,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEnD,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,MAAM,GAAG,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,OAAO,EAAE,CAAC;IAEzC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAC3C,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,IAAI,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CACtF,CAAC;IAEF,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,cAAc,CAAC;QACnC,GAAG;QACH,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,KAA8B;IAC1E,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC;IAEzC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IACzC,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAEzB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAqB,EAAE,MAAc;IACnE,OAAO,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACzF,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}