claude-launchpad 1.12.0 → 1.14.0

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 (61) hide show
  1. package/README.md +11 -3
  2. package/dist/{chunk-DTCCQWOU.js → chunk-D6RAMWH6.js} +3 -3
  3. package/dist/{chunk-DTCCQWOU.js.map → chunk-D6RAMWH6.js.map} +1 -1
  4. package/dist/chunk-HSGSTSVN.js +212 -0
  5. package/dist/chunk-HSGSTSVN.js.map +1 -0
  6. package/dist/{chunk-DXDOVWOA.js → chunk-IDH3M4EI.js} +20 -232
  7. package/dist/chunk-IDH3M4EI.js.map +1 -0
  8. package/dist/{chunk-YZ53W47Z.js → chunk-IIWOSSL4.js} +2 -1
  9. package/dist/chunk-IIWOSSL4.js.map +1 -0
  10. package/dist/{chunk-ZLI4LI33.js → chunk-M6GVFN67.js} +2 -2
  11. package/dist/{chunk-F6SLV2FR.js → chunk-N2SCF7DB.js} +5 -6
  12. package/dist/chunk-N2SCF7DB.js.map +1 -0
  13. package/dist/chunk-OPORVSAF.js +225 -0
  14. package/dist/chunk-OPORVSAF.js.map +1 -0
  15. package/dist/{chunk-KPO4YURF.js → chunk-QEPE3WVF.js} +457 -85
  16. package/dist/chunk-QEPE3WVF.js.map +1 -0
  17. package/dist/chunk-UN43OVRW.js +184 -0
  18. package/dist/chunk-UN43OVRW.js.map +1 -0
  19. package/dist/{chunk-PH5OWJ42.js → chunk-VF7U63AI.js} +9 -5
  20. package/dist/{chunk-PH5OWJ42.js.map → chunk-VF7U63AI.js.map} +1 -1
  21. package/dist/cli.js +307 -87
  22. package/dist/cli.js.map +1 -1
  23. package/dist/commands/memory/server.js +48 -14
  24. package/dist/commands/memory/server.js.map +1 -1
  25. package/dist/{context-JALSYDYO.js → context-YIPO4LBS.js} +58 -55
  26. package/dist/context-YIPO4LBS.js.map +1 -0
  27. package/dist/doctor-DCHFJ3XV.js +108 -0
  28. package/dist/doctor-DCHFJ3XV.js.map +1 -0
  29. package/dist/{install-Q23F37GK.js → install-D32PV7SF.js} +12 -10
  30. package/dist/install-D32PV7SF.js.map +1 -0
  31. package/dist/{pull-FYKNNLYC.js → pull-YUQTDRUP.js} +17 -19
  32. package/dist/pull-YUQTDRUP.js.map +1 -0
  33. package/dist/{push-QSBK7BQU.js → push-U4IVTFOU.js} +13 -12
  34. package/dist/push-U4IVTFOU.js.map +1 -0
  35. package/dist/{require-deps-ZISUZLYD.js → require-deps-WDMHDGBN.js} +3 -3
  36. package/dist/{stats-SV53G6PQ.js → stats-77BYLKYP.js} +9 -7
  37. package/dist/{stats-SV53G6PQ.js.map → stats-77BYLKYP.js.map} +1 -1
  38. package/dist/{sync-2LDM44U4.js → sync-DTCWK2CY.js} +5 -5
  39. package/dist/{sync-clean-HQ523N7V.js → sync-clean-ACZCB3NZ.js} +4 -5
  40. package/dist/sync-clean-ACZCB3NZ.js.map +1 -0
  41. package/dist/{sync-status-V6WTI32X.js → sync-status-2V2RCYZO.js} +13 -12
  42. package/dist/sync-status-2V2RCYZO.js.map +1 -0
  43. package/dist/{tui-2UJ2OIHB.js → tui-HVJNLRY2.js} +11 -7
  44. package/dist/{tui-2UJ2OIHB.js.map → tui-HVJNLRY2.js.map} +1 -1
  45. package/package.json +27 -7
  46. package/scenarios/workflow/premature-victory.yaml +44 -0
  47. package/dist/chunk-DXDOVWOA.js.map +0 -1
  48. package/dist/chunk-F6SLV2FR.js.map +0 -1
  49. package/dist/chunk-KPO4YURF.js.map +0 -1
  50. package/dist/chunk-YZ53W47Z.js.map +0 -1
  51. package/dist/chunk-ZIG75MOB.js +0 -366
  52. package/dist/chunk-ZIG75MOB.js.map +0 -1
  53. package/dist/context-JALSYDYO.js.map +0 -1
  54. package/dist/install-Q23F37GK.js.map +0 -1
  55. package/dist/pull-FYKNNLYC.js.map +0 -1
  56. package/dist/push-QSBK7BQU.js.map +0 -1
  57. package/dist/sync-clean-HQ523N7V.js.map +0 -1
  58. package/dist/sync-status-V6WTI32X.js.map +0 -1
  59. /package/dist/{chunk-ZLI4LI33.js.map → chunk-M6GVFN67.js.map} +0 -0
  60. /package/dist/{require-deps-ZISUZLYD.js.map → require-deps-WDMHDGBN.js.map} +0 -0
  61. /package/dist/{sync-2LDM44U4.js.map → sync-DTCWK2CY.js.map} +0 -0
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  mergeFromRemote,
4
4
  parsePayload
5
- } from "./chunk-F6SLV2FR.js";
5
+ } from "./chunk-N2SCF7DB.js";
6
6
  import {
7
7
  assertGhAvailable,
8
8
  filenameToProject,
@@ -10,30 +10,31 @@ import {
10
10
  loadSyncConfig,
11
11
  projectToFilename,
12
12
  readGistFile
13
- } from "./chunk-ZLI4LI33.js";
14
- import "./chunk-YZ53W47Z.js";
13
+ } from "./chunk-M6GVFN67.js";
14
+ import "./chunk-IIWOSSL4.js";
15
15
  import {
16
16
  detectProject
17
17
  } from "./chunk-NAW47BYA.js";
18
18
  import {
19
19
  initStorage
20
- } from "./chunk-PH5OWJ42.js";
21
- import "./chunk-DXDOVWOA.js";
22
- import "./chunk-ZIG75MOB.js";
23
- import "./chunk-DTCCQWOU.js";
20
+ } from "./chunk-VF7U63AI.js";
21
+ import "./chunk-HSGSTSVN.js";
22
+ import "./chunk-OPORVSAF.js";
23
+ import "./chunk-IDH3M4EI.js";
24
+ import "./chunk-UN43OVRW.js";
25
+ import "./chunk-D6RAMWH6.js";
24
26
  import {
25
27
  log
26
- } from "./chunk-KPO4YURF.js";
28
+ } from "./chunk-QEPE3WVF.js";
27
29
 
28
30
  // src/commands/memory/subcommands/pull.ts
29
31
  async function runPull(opts) {
30
32
  assertGhAvailable();
31
33
  const syncConfig = loadSyncConfig();
32
34
  if (!syncConfig) {
33
- log.error("No sync gist found. Run `memory push` first.");
34
- return;
35
+ throw new Error("No sync gist found. Run `memory push` first.");
35
36
  }
36
- const { requireMemoryDeps } = await import("./require-deps-ZISUZLYD.js");
37
+ const { requireMemoryDeps } = await import("./require-deps-WDMHDGBN.js");
37
38
  await requireMemoryDeps();
38
39
  const ctx = initStorage();
39
40
  try {
@@ -49,18 +50,16 @@ async function runPull(opts) {
49
50
  function pullProject(ctx, gistId, opts = {}) {
50
51
  const project = detectProject(process.cwd());
51
52
  if (!project) {
52
- log.error("Could not detect project. Run from a project directory or use --all.");
53
- return;
53
+ throw new Error("Could not detect project. Run from a project directory or use --all.");
54
54
  }
55
55
  const filename = projectToFilename(project);
56
56
  const payload = parsePayload(readGistFile(gistId, filename));
57
57
  if (!payload) {
58
58
  if (opts.quietMissing) {
59
59
  log.info(`No remote memories yet for "${project}" \u2014 push will create them.`);
60
- } else {
61
- log.error(`No memories found for project "${project}" in gist.`);
60
+ return;
62
61
  }
63
- return;
62
+ throw new Error(`No memories found for project "${project}" in gist.`);
64
63
  }
65
64
  const localCount = ctx.memoryRepo.count(project);
66
65
  if (localCount === 0) {
@@ -73,8 +72,7 @@ function pullAll(ctx, gistId) {
73
72
  const files = listGistFiles(gistId);
74
73
  const projectFiles = files.filter((f) => filenameToProject(f) !== null);
75
74
  if (projectFiles.length === 0) {
76
- log.error("No memory files found in gist.");
77
- return;
75
+ throw new Error("No memory files found in gist.");
78
76
  }
79
77
  const perProject = [];
80
78
  const skipped = [];
@@ -141,4 +139,4 @@ function printResult(result, project) {
141
139
  export {
142
140
  runPull
143
141
  };
144
- //# sourceMappingURL=pull-FYKNNLYC.js.map
142
+ //# sourceMappingURL=pull-YUQTDRUP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/memory/subcommands/pull.ts"],"sourcesContent":["import { log } from '../../../lib/output.js';\nimport { initStorage } from './init-storage.js';\nimport {\n assertGhAvailable,\n loadSyncConfig,\n readGistFile,\n listGistFiles,\n filenameToProject,\n projectToFilename,\n} from '../utils/gist-transport.js';\nimport { mergeFromRemote, parsePayload } from '../utils/sync-merge.js';\nimport type { MergeResult } from '../types.js';\nimport { detectProject } from '../utils/project.js';\n\ninterface PullOpts {\n readonly all?: boolean;\n /** First-sync friendly: a missing remote file is expected, not an error. */\n readonly quietMissing?: boolean;\n}\n\nexport async function runPull(opts: PullOpts): Promise<void> {\n assertGhAvailable();\n\n const syncConfig = loadSyncConfig();\n if (!syncConfig) {\n throw new Error('No sync gist found. Run `memory push` first.');\n }\n\n const { requireMemoryDeps } = await import('../utils/require-deps.js');\n await requireMemoryDeps();\n const ctx = initStorage();\n\n try {\n if (opts.all) {\n pullAll(ctx, syncConfig.gistId);\n } else {\n pullProject(ctx, syncConfig.gistId, opts);\n }\n } finally {\n ctx.close();\n }\n}\n\nfunction pullProject(ctx: ReturnType<typeof initStorage>, gistId: string, opts: PullOpts = {}): void {\n const project = detectProject(process.cwd());\n if (!project) {\n throw new Error('Could not detect project. Run from a project directory or use --all.');\n }\n\n const filename = projectToFilename(project);\n const payload = parsePayload(readGistFile(gistId, filename));\n if (!payload) {\n if (opts.quietMissing) {\n log.info(`No remote memories yet for \"${project}\" — push will create them.`);\n return;\n }\n throw new Error(`No memories found for project \"${project}\" in gist.`);\n }\n\n const localCount = ctx.memoryRepo.count(project);\n if (localCount === 0) {\n log.warn(`No local memories for \"${project}\" — creating fresh database from remote.`);\n }\n\n const result = mergeFromRemote(ctx.memoryRepo, ctx.relationRepo, payload);\n printResult(result, project);\n}\n\nfunction pullAll(ctx: ReturnType<typeof initStorage>, gistId: string): void {\n const files = listGistFiles(gistId);\n const projectFiles = files.filter((f) => filenameToProject(f) !== null);\n\n if (projectFiles.length === 0) {\n throw new Error('No memory files found in gist.');\n }\n\n const perProject: { project: string; result: MergeResult }[] = [];\n const skipped: string[] = [];\n let totalInserted = 0;\n let totalUpdated = 0;\n let totalRelations = 0;\n\n for (const filename of projectFiles) {\n const project = filenameToProject(filename);\n if (!project) continue;\n\n // Skip projects not set up on this machine (zero local memories).\n // User must `cd` into the project and run `memory pull` to opt-in to a new project.\n if (ctx.memoryRepo.count(project) === 0) {\n skipped.push(project);\n continue;\n }\n\n const payload = parsePayload(readGistFile(gistId, filename));\n if (!payload) continue;\n const result = mergeFromRemote(ctx.memoryRepo, ctx.relationRepo, payload);\n perProject.push({ project, result });\n totalInserted += result.inserted;\n totalUpdated += result.updated;\n totalRelations += result.relationsAdded;\n }\n\n const changed = perProject.filter((p) => p.result.inserted > 0 || p.result.updated > 0 || p.result.relationsAdded > 0);\n const syncedCount = perProject.length;\n\n log.blank();\n if (syncedCount === 0) {\n log.step('No locally set up projects to sync');\n } else if (changed.length === 0) {\n log.step(`Already in sync (${syncedCount} project${syncedCount === 1 ? '' : 's'})`);\n } else {\n log.step(`Pull complete (${changed.length} of ${syncedCount} projects updated)`);\n for (const { project, result } of changed) {\n const parts: string[] = [];\n if (result.inserted > 0) parts.push(`+${result.inserted} new`);\n if (result.updated > 0) parts.push(`~${result.updated} updated`);\n if (result.relationsAdded > 0) parts.push(`+${result.relationsAdded} relations`);\n log.info(`${project.padEnd(30)} ${parts.join(', ')}`);\n }\n if (totalInserted + totalUpdated + totalRelations > 0) {\n log.blank();\n log.info(`Total: +${totalInserted} new, ~${totalUpdated} updated, +${totalRelations} relations`);\n }\n }\n if (skipped.length > 0) {\n log.blank();\n log.info(`Skipped ${skipped.length} project${skipped.length === 1 ? '' : 's'} not set up on this machine:`);\n for (const project of skipped) log.info(` - ${project}`);\n log.info('Run `memory pull` from a project directory to pull that project for the first time.');\n }\n log.blank();\n}\n\nfunction printResult(result: MergeResult, project: string): void {\n log.blank();\n if (result.inserted === 0 && result.updated === 0 && result.relationsAdded === 0) {\n log.step(`${project}: already in sync`);\n } else {\n log.step(`${project}: pull complete`);\n if (result.inserted > 0) log.info(`Inserted: ${result.inserted}`);\n if (result.updated > 0) log.info(`Updated: ${result.updated}`);\n if (result.relationsAdded > 0) log.info(`Relations: ${result.relationsAdded} added`);\n }\n log.info('Tip: run `memory pull --all` to sync every project in this gist.');\n log.blank();\n}\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  mergeFromRemote,
5
5
  parsePayload,
6
6
  tombstoneToSyncRow
7
- } from "./chunk-F6SLV2FR.js";
7
+ } from "./chunk-N2SCF7DB.js";
8
8
  import {
9
9
  assertGhAvailable,
10
10
  createGist,
@@ -12,20 +12,22 @@ import {
12
12
  projectToFilename,
13
13
  readGistFile,
14
14
  updateGistFiles
15
- } from "./chunk-ZLI4LI33.js";
16
- import "./chunk-YZ53W47Z.js";
15
+ } from "./chunk-M6GVFN67.js";
16
+ import "./chunk-IIWOSSL4.js";
17
17
  import {
18
18
  detectProject
19
19
  } from "./chunk-NAW47BYA.js";
20
20
  import {
21
21
  initStorage
22
- } from "./chunk-PH5OWJ42.js";
23
- import "./chunk-DXDOVWOA.js";
24
- import "./chunk-ZIG75MOB.js";
25
- import "./chunk-DTCCQWOU.js";
22
+ } from "./chunk-VF7U63AI.js";
23
+ import "./chunk-HSGSTSVN.js";
24
+ import "./chunk-OPORVSAF.js";
25
+ import "./chunk-IDH3M4EI.js";
26
+ import "./chunk-UN43OVRW.js";
27
+ import "./chunk-D6RAMWH6.js";
26
28
  import {
27
29
  log
28
- } from "./chunk-KPO4YURF.js";
30
+ } from "./chunk-QEPE3WVF.js";
29
31
 
30
32
  // src/commands/memory/subcommands/push.ts
31
33
  import { hostname } from "os";
@@ -50,7 +52,7 @@ function filterRelations(allRelations, memoryIds) {
50
52
  }
51
53
  async function runPush(opts) {
52
54
  assertGhAvailable();
53
- const { requireMemoryDeps } = await import("./require-deps-ZISUZLYD.js");
55
+ const { requireMemoryDeps } = await import("./require-deps-WDMHDGBN.js");
54
56
  await requireMemoryDeps();
55
57
  const ctx = initStorage();
56
58
  try {
@@ -68,8 +70,7 @@ async function runPush(opts) {
68
70
  async function pushProject(ctx, allRelations, syncConfig, opts) {
69
71
  const project = detectProject(process.cwd());
70
72
  if (!project) {
71
- log.error("Could not detect project. Run from a project directory or use --all.");
72
- return;
73
+ throw new Error("Could not detect project. Run from a project directory or use --all.");
73
74
  }
74
75
  const filename = projectToFilename(project);
75
76
  if (syncConfig) {
@@ -171,4 +172,4 @@ async function confirmCreate() {
171
172
  export {
172
173
  runPush
173
174
  };
174
- //# sourceMappingURL=push-QSBK7BQU.js.map
175
+ //# sourceMappingURL=push-U4IVTFOU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/memory/subcommands/push.ts"],"sourcesContent":["import { hostname } from 'node:os';\nimport { confirm } from '@inquirer/prompts';\nimport { log } from '../../../lib/output.js';\nimport { initStorage } from './init-storage.js';\nimport type { StorageContext } from './init-storage.js';\nimport {\n assertGhAvailable,\n loadSyncConfig,\n createGist,\n readGistFile,\n updateGistFiles,\n projectToFilename,\n} from '../utils/gist-transport.js';\nimport { mergeFromRemote, memoryToSyncRow, tombstoneToSyncRow, parsePayload } from '../utils/sync-merge.js';\nimport type { Memory, SyncPayload, SyncRelationRow, SyncTombstone, Tombstone } from '../types.js';\nimport { detectProject } from '../utils/project.js';\n\ninterface PushOpts {\n readonly all?: boolean;\n readonly yes?: boolean;\n}\n\nfunction buildPayload(\n memories: readonly ReturnType<typeof memoryToSyncRow>[],\n relations: readonly SyncRelationRow[],\n tombstones: readonly SyncTombstone[],\n): SyncPayload {\n return {\n version: 2,\n machine_id: hostname(),\n pushed_at: new Date().toISOString(),\n memories,\n relations,\n tombstones,\n };\n}\n\nfunction filterRelations(\n allRelations: readonly { sourceId: string; targetId: string; relationType: string; createdAt: string }[],\n memoryIds: ReadonlySet<string>,\n): readonly SyncRelationRow[] {\n return allRelations\n .filter((r) => memoryIds.has(r.sourceId) && memoryIds.has(r.targetId))\n .map((r) => ({\n source_id: r.sourceId,\n target_id: r.targetId,\n relation_type: r.relationType as SyncRelationRow['relation_type'],\n created_at: r.createdAt,\n }));\n}\n\nexport async function runPush(opts: PushOpts): Promise<void> {\n assertGhAvailable();\n\n const { requireMemoryDeps } = await import('../utils/require-deps.js');\n await requireMemoryDeps();\n const ctx = initStorage();\n\n try {\n const syncConfig = loadSyncConfig();\n const allRelations = ctx.relationRepo.getAll();\n\n if (opts.all) {\n await pushAll(ctx, allRelations, syncConfig, opts);\n } else {\n await pushProject(ctx, allRelations, syncConfig, opts);\n }\n } finally {\n ctx.close();\n }\n}\n\nasync function pushProject(\n ctx: StorageContext,\n allRelations: readonly { sourceId: string; targetId: string; relationType: string; createdAt: string }[],\n syncConfig: { gistId: string } | null,\n opts: PushOpts,\n): Promise<void> {\n const project = detectProject(process.cwd());\n if (!project) {\n throw new Error('Could not detect project. Run from a project directory or use --all.');\n }\n\n const filename = projectToFilename(project);\n\n // Pull-before-push for this project\n if (syncConfig) {\n const remote = parsePayload(readGistFile(syncConfig.gistId, filename));\n if (remote) mergeFromRemote(ctx.memoryRepo, ctx.relationRepo, remote);\n }\n\n const memories = ctx.memoryRepo.getAllForSync(project);\n const tombstones = ctx.memoryRepo.getTombstonesByProject(project);\n\n if (memories.length === 0 && tombstones.length === 0) {\n log.warn(`No memories found for \"${project}\". Nothing to push.`);\n return;\n }\n\n const memoryIds = new Set(memories.map((m) => m.id));\n const relations = filterRelations(allRelations, memoryIds);\n const json = JSON.stringify(\n buildPayload(memories.map(memoryToSyncRow), relations, tombstones.map(tombstoneToSyncRow)),\n null,\n 2,\n );\n\n if (!syncConfig) {\n if (!opts.yes && !(await confirmCreate())) return;\n createGist(filename, json);\n } else {\n updateGistFiles(syncConfig.gistId, { [filename]: json });\n }\n\n log.blank();\n log.step('Push complete');\n log.info(`Project: ${project} (${memories.length} memories)`);\n log.info(`Relations: ${relations.length}`);\n log.blank();\n}\n\nasync function pushAll(\n ctx: StorageContext,\n allRelations: readonly { sourceId: string; targetId: string; relationType: string; createdAt: string }[],\n syncConfig: { gistId: string } | null,\n opts: PushOpts,\n): Promise<void> {\n const allMemories = ctx.memoryRepo.getAllForSync();\n const allTombstones = ctx.memoryRepo.getAllTombstones();\n\n if (allMemories.length === 0 && allTombstones.length === 0) {\n log.warn('No memories found. Nothing to push.');\n return;\n }\n\n const byProject = groupByProject(allMemories);\n const tombstonesByProject = groupTombstonesByProject(allTombstones);\n\n // Ensure every project with tombstones-only state still produces a file.\n for (const project of tombstonesByProject.keys()) {\n if (!byProject.has(project)) byProject.set(project, []);\n }\n\n const files: Record<string, string> = {};\n for (const [project, memories] of byProject) {\n const memoryIds = new Set(memories.map((m) => m.id));\n const relations = filterRelations(allRelations, memoryIds);\n const tombstones = tombstonesByProject.get(project) ?? [];\n files[projectToFilename(project)] = JSON.stringify(\n buildPayload(memories.map(memoryToSyncRow), relations, tombstones.map(tombstoneToSyncRow)),\n null,\n 2,\n );\n }\n\n if (!syncConfig) {\n if (!opts.yes && !(await confirmCreate())) return;\n const entries = Object.entries(files);\n const gistId = createGist(entries[0]![0], entries[0]![1]);\n if (entries.length > 1) {\n updateGistFiles(gistId, Object.fromEntries(entries.slice(1)));\n }\n } else {\n updateGistFiles(syncConfig.gistId, files);\n }\n\n log.blank();\n log.step('Push complete');\n log.info(`Projects: ${byProject.size}`);\n log.info(`Memories: ${allMemories.length}`);\n log.blank();\n}\n\nfunction groupByProject(memories: readonly Memory[]): Map<string, Memory[]> {\n const byProject = new Map<string, Memory[]>();\n for (const m of memories) {\n const key = m.project ?? '_global';\n const list = byProject.get(key) ?? [];\n list.push(m);\n byProject.set(key, list);\n }\n return byProject;\n}\n\nfunction groupTombstonesByProject(tombstones: readonly Tombstone[]): Map<string, Tombstone[]> {\n const byProject = new Map<string, Tombstone[]>();\n for (const t of tombstones) {\n const key = t.project ?? '_global';\n const list = byProject.get(key) ?? [];\n list.push(t);\n byProject.set(key, list);\n }\n return byProject;\n}\n\nasync function confirmCreate(): Promise<boolean> {\n const proceed = await confirm({\n message: 'Create a private GitHub Gist for memory sync?',\n default: true,\n });\n if (!proceed) log.info('Skipped.');\n return proceed;\n}\n"],"mappings":"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","names":[]}
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  cwdRequire,
4
4
  requireMemoryDeps
5
- } from "./chunk-DTCCQWOU.js";
6
- import "./chunk-KPO4YURF.js";
5
+ } from "./chunk-D6RAMWH6.js";
6
+ import "./chunk-QEPE3WVF.js";
7
7
  export {
8
8
  cwdRequire,
9
9
  requireMemoryDeps
10
10
  };
11
- //# sourceMappingURL=require-deps-ZISUZLYD.js.map
11
+ //# sourceMappingURL=require-deps-WDMHDGBN.js.map
@@ -1,13 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  initStorage
4
- } from "./chunk-PH5OWJ42.js";
5
- import "./chunk-DXDOVWOA.js";
6
- import "./chunk-ZIG75MOB.js";
7
- import "./chunk-DTCCQWOU.js";
4
+ } from "./chunk-VF7U63AI.js";
5
+ import "./chunk-HSGSTSVN.js";
6
+ import "./chunk-OPORVSAF.js";
7
+ import "./chunk-IDH3M4EI.js";
8
+ import "./chunk-UN43OVRW.js";
9
+ import "./chunk-D6RAMWH6.js";
8
10
  import {
9
11
  log
10
- } from "./chunk-KPO4YURF.js";
12
+ } from "./chunk-QEPE3WVF.js";
11
13
 
12
14
  // src/commands/memory/subcommands/stats.ts
13
15
  import { existsSync, statSync } from "fs";
@@ -18,7 +20,7 @@ function formatBytes(bytes) {
18
20
  return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
19
21
  }
20
22
  async function runStats(opts) {
21
- const { requireMemoryDeps } = await import("./require-deps-ZISUZLYD.js");
23
+ const { requireMemoryDeps } = await import("./require-deps-WDMHDGBN.js");
22
24
  await requireMemoryDeps();
23
25
  const ctx = initStorage(opts.dbPath);
24
26
  try {
@@ -72,4 +74,4 @@ async function runStats(opts) {
72
74
  export {
73
75
  runStats
74
76
  };
75
- //# sourceMappingURL=stats-SV53G6PQ.js.map
77
+ //# sourceMappingURL=stats-77BYLKYP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/memory/subcommands/stats.ts"],"sourcesContent":["import { existsSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { log } from '../../../lib/output.js';\nimport { initStorage } from './init-storage.js';\n\ninterface StatsOpts {\n readonly json?: boolean;\n readonly dbPath?: string;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nexport async function runStats(opts: StatsOpts): Promise<void> {\n const { requireMemoryDeps } = await import('../utils/require-deps.js');\n await requireMemoryDeps();\n const ctx = initStorage(opts.dbPath);\n\n try {\n const total = ctx.memoryRepo.count();\n const byType = ctx.memoryRepo.countByType();\n const relations = ctx.relationRepo.count();\n const dateRange = ctx.memoryRepo.dateRange();\n const topInjected = ctx.memoryRepo.topInjected(5);\n\n let dbSize = 0;\n try {\n const dbPath = join(ctx.dataDir, 'memory.db');\n if (existsSync(dbPath)) {\n dbSize = statSync(dbPath).size;\n }\n } catch { /* ignore */ }\n\n if (opts.json) {\n process.stdout.write(JSON.stringify({\n totalMemories: total,\n byType,\n totalRelations: relations,\n dbSizeBytes: dbSize,\n oldestMemory: dateRange.oldest,\n newestMemory: dateRange.newest,\n topInjected,\n }, null, 2) + '\\n');\n } else {\n log.blank();\n log.step('Memory stats');\n log.info(`Memories: ${total}`);\n for (const [type, count] of Object.entries(byType)) {\n log.info(` ${type}: ${count}`);\n }\n log.info(`Relations: ${relations}`);\n log.info(`DB size: ${formatBytes(dbSize)}`);\n log.info(`Oldest: ${dateRange.oldest ?? 'none'}`);\n log.info(`Newest: ${dateRange.newest ?? 'none'}`);\n if (topInjected.length > 0) {\n log.blank();\n log.info('Top injected:');\n for (const m of topInjected) {\n log.info(` ${m.title ?? m.id} (${m.injectionCount}x)`);\n }\n }\n log.blank();\n }\n } finally {\n ctx.close();\n }\n}\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,YAAY,gBAAgB;AACrC,SAAS,YAAY;AASrB,SAAS,YAAY,OAAuB;AAC1C,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,SAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9C;AAEA,eAAsB,SAAS,MAAgC;AAC7D,QAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,4BAA0B;AACrE,QAAM,kBAAkB;AACxB,QAAM,MAAM,YAAY,KAAK,MAAM;AAEnC,MAAI;AACF,UAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,UAAM,SAAS,IAAI,WAAW,YAAY;AAC1C,UAAM,YAAY,IAAI,aAAa,MAAM;AACzC,UAAM,YAAY,IAAI,WAAW,UAAU;AAC3C,UAAM,cAAc,IAAI,WAAW,YAAY,CAAC;AAEhD,QAAI,SAAS;AACb,QAAI;AACF,YAAM,SAAS,KAAK,IAAI,SAAS,WAAW;AAC5C,UAAI,WAAW,MAAM,GAAG;AACtB,iBAAS,SAAS,MAAM,EAAE;AAAA,MAC5B;AAAA,IACF,QAAQ;AAAA,IAAe;AAEvB,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,KAAK,UAAU;AAAA,QAClC,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB;AAAA,QAChB,aAAa;AAAA,QACb,cAAc,UAAU;AAAA,QACxB,cAAc,UAAU;AAAA,QACxB;AAAA,MACF,GAAG,MAAM,CAAC,IAAI,IAAI;AAAA,IACpB,OAAO;AACL,UAAI,MAAM;AACV,UAAI,KAAK,cAAc;AACvB,UAAI,KAAK,eAAe,KAAK,EAAE;AAC/B,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,YAAI,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE;AAAA,MAChC;AACA,UAAI,KAAK,eAAe,SAAS,EAAE;AACnC,UAAI,KAAK,eAAe,YAAY,MAAM,CAAC,EAAE;AAC7C,UAAI,KAAK,eAAe,UAAU,UAAU,MAAM,EAAE;AACpD,UAAI,KAAK,eAAe,UAAU,UAAU,MAAM,EAAE;AACpD,UAAI,YAAY,SAAS,GAAG;AAC1B,YAAI,MAAM;AACV,YAAI,KAAK,eAAe;AACxB,mBAAW,KAAK,aAAa;AAC3B,cAAI,KAAK,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,cAAc,IAAI;AAAA,QACxD;AAAA,MACF;AACA,UAAI,MAAM;AAAA,IACZ;AAAA,EACF,UAAE;AACA,QAAI,MAAM;AAAA,EACZ;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/commands/memory/subcommands/stats.ts"],"sourcesContent":["import { existsSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { log } from '../../../lib/output.js';\nimport { initStorage } from './init-storage.js';\n\ninterface StatsOpts {\n readonly json?: boolean;\n readonly dbPath?: string;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;\n}\n\nexport async function runStats(opts: StatsOpts): Promise<void> {\n const { requireMemoryDeps } = await import('../utils/require-deps.js');\n await requireMemoryDeps();\n const ctx = initStorage(opts.dbPath);\n\n try {\n const total = ctx.memoryRepo.count();\n const byType = ctx.memoryRepo.countByType();\n const relations = ctx.relationRepo.count();\n const dateRange = ctx.memoryRepo.dateRange();\n const topInjected = ctx.memoryRepo.topInjected(5);\n\n let dbSize = 0;\n try {\n const dbPath = join(ctx.dataDir, 'memory.db');\n if (existsSync(dbPath)) {\n dbSize = statSync(dbPath).size;\n }\n } catch { /* ignore */ }\n\n if (opts.json) {\n process.stdout.write(JSON.stringify({\n totalMemories: total,\n byType,\n totalRelations: relations,\n dbSizeBytes: dbSize,\n oldestMemory: dateRange.oldest,\n newestMemory: dateRange.newest,\n topInjected,\n }, null, 2) + '\\n');\n } else {\n log.blank();\n log.step('Memory stats');\n log.info(`Memories: ${total}`);\n for (const [type, count] of Object.entries(byType)) {\n log.info(` ${type}: ${count}`);\n }\n log.info(`Relations: ${relations}`);\n log.info(`DB size: ${formatBytes(dbSize)}`);\n log.info(`Oldest: ${dateRange.oldest ?? 'none'}`);\n log.info(`Newest: ${dateRange.newest ?? 'none'}`);\n if (topInjected.length > 0) {\n log.blank();\n log.info('Top injected:');\n for (const m of topInjected) {\n log.info(` ${m.title ?? m.id} (${m.injectionCount}x)`);\n }\n }\n log.blank();\n }\n } finally {\n ctx.close();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,YAAY,gBAAgB;AACrC,SAAS,YAAY;AASrB,SAAS,YAAY,OAAuB;AAC1C,MAAI,QAAQ,KAAM,QAAO,GAAG,KAAK;AACjC,MAAI,QAAQ,OAAO,KAAM,QAAO,IAAI,QAAQ,MAAM,QAAQ,CAAC,CAAC;AAC5D,SAAO,IAAI,SAAS,OAAO,OAAO,QAAQ,CAAC,CAAC;AAC9C;AAEA,eAAsB,SAAS,MAAgC;AAC7D,QAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,4BAA0B;AACrE,QAAM,kBAAkB;AACxB,QAAM,MAAM,YAAY,KAAK,MAAM;AAEnC,MAAI;AACF,UAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,UAAM,SAAS,IAAI,WAAW,YAAY;AAC1C,UAAM,YAAY,IAAI,aAAa,MAAM;AACzC,UAAM,YAAY,IAAI,WAAW,UAAU;AAC3C,UAAM,cAAc,IAAI,WAAW,YAAY,CAAC;AAEhD,QAAI,SAAS;AACb,QAAI;AACF,YAAM,SAAS,KAAK,IAAI,SAAS,WAAW;AAC5C,UAAI,WAAW,MAAM,GAAG;AACtB,iBAAS,SAAS,MAAM,EAAE;AAAA,MAC5B;AAAA,IACF,QAAQ;AAAA,IAAe;AAEvB,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,KAAK,UAAU;AAAA,QAClC,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB;AAAA,QAChB,aAAa;AAAA,QACb,cAAc,UAAU;AAAA,QACxB,cAAc,UAAU;AAAA,QACxB;AAAA,MACF,GAAG,MAAM,CAAC,IAAI,IAAI;AAAA,IACpB,OAAO;AACL,UAAI,MAAM;AACV,UAAI,KAAK,cAAc;AACvB,UAAI,KAAK,eAAe,KAAK,EAAE;AAC/B,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,YAAI,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE;AAAA,MAChC;AACA,UAAI,KAAK,eAAe,SAAS,EAAE;AACnC,UAAI,KAAK,eAAe,YAAY,MAAM,CAAC,EAAE;AAC7C,UAAI,KAAK,eAAe,UAAU,UAAU,MAAM,EAAE;AACpD,UAAI,KAAK,eAAe,UAAU,UAAU,MAAM,EAAE;AACpD,UAAI,YAAY,SAAS,GAAG;AAC1B,YAAI,MAAM;AACV,YAAI,KAAK,eAAe;AACxB,mBAAW,KAAK,aAAa;AAC3B,cAAI,KAAK,KAAK,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,cAAc,IAAI;AAAA,QACxD;AAAA,MACF;AACA,UAAI,MAAM;AAAA,IACZ;AAAA,EACF,UAAE;AACA,QAAI,MAAM;AAAA,EACZ;AACF;","names":[]}
@@ -1,23 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  loadSyncConfig
4
- } from "./chunk-ZLI4LI33.js";
4
+ } from "./chunk-M6GVFN67.js";
5
5
  import {
6
6
  log
7
- } from "./chunk-KPO4YURF.js";
7
+ } from "./chunk-QEPE3WVF.js";
8
8
 
9
9
  // src/commands/memory/subcommands/sync.ts
10
10
  async function runSync(opts) {
11
11
  if (loadSyncConfig()) {
12
- const { runPull } = await import("./pull-FYKNNLYC.js");
12
+ const { runPull } = await import("./pull-YUQTDRUP.js");
13
13
  await runPull({ all: opts.all, quietMissing: true });
14
14
  } else {
15
15
  log.info("No sync gist yet \u2014 skipping pull; push will create it.");
16
16
  }
17
- const { runPush } = await import("./push-QSBK7BQU.js");
17
+ const { runPush } = await import("./push-U4IVTFOU.js");
18
18
  await runPush(opts);
19
19
  }
20
20
  export {
21
21
  runSync
22
22
  };
23
- //# sourceMappingURL=sync-2LDM44U4.js.map
23
+ //# sourceMappingURL=sync-DTCWK2CY.js.map
@@ -6,10 +6,10 @@ import {
6
6
  listGistFiles,
7
7
  loadSyncConfig,
8
8
  projectToFilename
9
- } from "./chunk-ZLI4LI33.js";
9
+ } from "./chunk-M6GVFN67.js";
10
10
  import {
11
11
  log
12
- } from "./chunk-KPO4YURF.js";
12
+ } from "./chunk-QEPE3WVF.js";
13
13
 
14
14
  // src/commands/memory/subcommands/sync-clean.ts
15
15
  import { confirm } from "@inquirer/prompts";
@@ -17,8 +17,7 @@ async function runSyncClean(project, opts) {
17
17
  assertGhAvailable();
18
18
  const syncConfig = loadSyncConfig();
19
19
  if (!syncConfig) {
20
- log.error("No sync gist found. Run `memory push` first.");
21
- return;
20
+ throw new Error("No sync gist found. Run `memory push` first.");
22
21
  }
23
22
  const filename = projectToFilename(project);
24
23
  const files = listGistFiles(syncConfig.gistId);
@@ -50,4 +49,4 @@ async function runSyncClean(project, opts) {
50
49
  export {
51
50
  runSyncClean
52
51
  };
53
- //# sourceMappingURL=sync-clean-HQ523N7V.js.map
52
+ //# sourceMappingURL=sync-clean-ACZCB3NZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/memory/subcommands/sync-clean.ts"],"sourcesContent":["import { confirm } from '@inquirer/prompts';\nimport { log } from '../../../lib/output.js';\nimport {\n assertGhAvailable,\n loadSyncConfig,\n listGistFiles,\n filenameToProject,\n projectToFilename,\n deleteGistFile,\n} from '../utils/gist-transport.js';\n\ninterface SyncCleanOpts {\n readonly yes?: boolean;\n}\n\nexport async function runSyncClean(project: string, opts: SyncCleanOpts): Promise<void> {\n assertGhAvailable();\n\n const syncConfig = loadSyncConfig();\n if (!syncConfig) {\n throw new Error('No sync gist found. Run `memory push` first.');\n }\n\n const filename = projectToFilename(project);\n const files = listGistFiles(syncConfig.gistId);\n const projectFiles = files.filter((f) => filenameToProject(f) !== null);\n\n if (!projectFiles.includes(filename)) {\n log.error(`Project \"${project}\" not found in gist.`);\n if (projectFiles.length > 0) {\n log.blank();\n log.info('Available projects:');\n for (const f of projectFiles) {\n log.info(` ${filenameToProject(f)}`);\n }\n }\n return;\n }\n\n if (!opts.yes) {\n const proceed = await confirm({\n message: `Remove \"${project}\" from sync gist? This only removes the remote copy.`,\n default: false,\n });\n if (!proceed) {\n log.info('Skipped.');\n return;\n }\n }\n\n deleteGistFile(syncConfig.gistId, filename);\n log.success(`Removed \"${project}\" from sync gist.`);\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,eAAe;AAexB,eAAsB,aAAa,SAAiB,MAAoC;AACtF,oBAAkB;AAElB,QAAM,aAAa,eAAe;AAClC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,QAAM,WAAW,kBAAkB,OAAO;AAC1C,QAAM,QAAQ,cAAc,WAAW,MAAM;AAC7C,QAAM,eAAe,MAAM,OAAO,CAAC,MAAM,kBAAkB,CAAC,MAAM,IAAI;AAEtE,MAAI,CAAC,aAAa,SAAS,QAAQ,GAAG;AACpC,QAAI,MAAM,YAAY,OAAO,sBAAsB;AACnD,QAAI,aAAa,SAAS,GAAG;AAC3B,UAAI,MAAM;AACV,UAAI,KAAK,qBAAqB;AAC9B,iBAAW,KAAK,cAAc;AAC5B,YAAI,KAAK,KAAK,kBAAkB,CAAC,CAAC,EAAE;AAAA,MACtC;AAAA,IACF;AACA;AAAA,EACF;AAEA,MAAI,CAAC,KAAK,KAAK;AACb,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,SAAS,WAAW,OAAO;AAAA,MAC3B,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,SAAS;AACZ,UAAI,KAAK,UAAU;AACnB;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,WAAW,QAAQ,QAAQ;AAC1C,MAAI,QAAQ,YAAY,OAAO,mBAAmB;AACpD;","names":[]}
@@ -1,34 +1,35 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  parsePayload
4
- } from "./chunk-F6SLV2FR.js";
4
+ } from "./chunk-N2SCF7DB.js";
5
5
  import {
6
6
  assertGhAvailable,
7
7
  filenameToProject,
8
8
  listGistFiles,
9
9
  loadSyncConfig,
10
10
  readGistFile
11
- } from "./chunk-ZLI4LI33.js";
12
- import "./chunk-YZ53W47Z.js";
11
+ } from "./chunk-M6GVFN67.js";
12
+ import "./chunk-IIWOSSL4.js";
13
13
  import {
14
14
  initStorage
15
- } from "./chunk-PH5OWJ42.js";
16
- import "./chunk-DXDOVWOA.js";
17
- import "./chunk-ZIG75MOB.js";
18
- import "./chunk-DTCCQWOU.js";
15
+ } from "./chunk-VF7U63AI.js";
16
+ import "./chunk-HSGSTSVN.js";
17
+ import "./chunk-OPORVSAF.js";
18
+ import "./chunk-IDH3M4EI.js";
19
+ import "./chunk-UN43OVRW.js";
20
+ import "./chunk-D6RAMWH6.js";
19
21
  import {
20
22
  log
21
- } from "./chunk-KPO4YURF.js";
23
+ } from "./chunk-QEPE3WVF.js";
22
24
 
23
25
  // src/commands/memory/subcommands/sync-status.ts
24
26
  async function runSyncStatus() {
25
27
  assertGhAvailable();
26
28
  const syncConfig = loadSyncConfig();
27
29
  if (!syncConfig) {
28
- log.error("No sync gist found. Run `memory push` first.");
29
- return;
30
+ throw new Error("No sync gist found. Run `memory push` first.");
30
31
  }
31
- const { requireMemoryDeps } = await import("./require-deps-ZISUZLYD.js");
32
+ const { requireMemoryDeps } = await import("./require-deps-WDMHDGBN.js");
32
33
  await requireMemoryDeps();
33
34
  const ctx = initStorage();
34
35
  try {
@@ -72,4 +73,4 @@ async function runSyncStatus() {
72
73
  export {
73
74
  runSyncStatus
74
75
  };
75
- //# sourceMappingURL=sync-status-V6WTI32X.js.map
76
+ //# sourceMappingURL=sync-status-2V2RCYZO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/memory/subcommands/sync-status.ts"],"sourcesContent":["import { log } from '../../../lib/output.js';\nimport { initStorage } from './init-storage.js';\nimport {\n assertGhAvailable,\n loadSyncConfig,\n listGistFiles,\n filenameToProject,\n readGistFile,\n} from '../utils/gist-transport.js';\nimport { parsePayload } from '../utils/sync-merge.js';\n\nexport async function runSyncStatus(): Promise<void> {\n assertGhAvailable();\n\n const syncConfig = loadSyncConfig();\n if (!syncConfig) {\n throw new Error('No sync gist found. Run `memory push` first.');\n }\n\n const { requireMemoryDeps } = await import('../utils/require-deps.js');\n await requireMemoryDeps();\n const ctx = initStorage();\n\n try {\n const localCounts = ctx.memoryRepo.projectCounts();\n const localTombstoneIds = new Set(ctx.memoryRepo.getAllTombstones().map((t) => t.id));\n const remoteFiles = listGistFiles(syncConfig.gistId);\n\n // Cosmetic display only: a local tombstone may still be resurrected by a newer remote\n // updated_at, but mergeFromRemote handles that. Excluding tombstoned ids here keeps\n // the reported delta close to what `pull --all` actually ingests most of the time.\n const remoteCounts = new Map<string, number>();\n for (const file of remoteFiles) {\n const project = filenameToProject(file);\n if (!project) continue;\n const payload = parsePayload(readGistFile(syncConfig.gistId, file));\n if (!payload) {\n remoteCounts.set(project, 0);\n continue;\n }\n const mergeable = payload.memories.filter((m) => !localTombstoneIds.has(m.id)).length;\n remoteCounts.set(project, mergeable);\n }\n\n const allProjects = new Set([...localCounts.keys(), ...remoteCounts.keys()]);\n\n log.blank();\n log.step('Sync status');\n log.info(`Gist: ${syncConfig.gistId}`);\n log.blank();\n\n if (allProjects.size === 0) {\n log.info('No projects found locally or remotely.');\n } else {\n log.info('Project Local Remote');\n log.info('─────────────────────────────── ───── ──────');\n for (const project of [...allProjects].sort()) {\n const local = localCounts.get(project) ?? 0;\n const remote = remoteCounts.get(project) ?? 0;\n const name = project.length > 33 ? project.slice(0, 30) + '...' : project;\n log.info(`${name.padEnd(33)} ${String(local).padStart(5)} ${String(remote).padStart(6)}`);\n }\n }\n log.blank();\n } finally {\n ctx.close();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAWA,eAAsB,gBAA+B;AACnD,oBAAkB;AAElB,QAAM,aAAa,eAAe;AAClC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,QAAM,EAAE,kBAAkB,IAAI,MAAM,OAAO,4BAA0B;AACrE,QAAM,kBAAkB;AACxB,QAAM,MAAM,YAAY;AAExB,MAAI;AACF,UAAM,cAAc,IAAI,WAAW,cAAc;AACjD,UAAM,oBAAoB,IAAI,IAAI,IAAI,WAAW,iBAAiB,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACpF,UAAM,cAAc,cAAc,WAAW,MAAM;AAKnD,UAAM,eAAe,oBAAI,IAAoB;AAC7C,eAAW,QAAQ,aAAa;AAC9B,YAAM,UAAU,kBAAkB,IAAI;AACtC,UAAI,CAAC,QAAS;AACd,YAAM,UAAU,aAAa,aAAa,WAAW,QAAQ,IAAI,CAAC;AAClE,UAAI,CAAC,SAAS;AACZ,qBAAa,IAAI,SAAS,CAAC;AAC3B;AAAA,MACF;AACA,YAAM,YAAY,QAAQ,SAAS,OAAO,CAAC,MAAM,CAAC,kBAAkB,IAAI,EAAE,EAAE,CAAC,EAAE;AAC/E,mBAAa,IAAI,SAAS,SAAS;AAAA,IACrC;AAEA,UAAM,cAAc,oBAAI,IAAI,CAAC,GAAG,YAAY,KAAK,GAAG,GAAG,aAAa,KAAK,CAAC,CAAC;AAE3E,QAAI,MAAM;AACV,QAAI,KAAK,aAAa;AACtB,QAAI,KAAK,SAAS,WAAW,MAAM,EAAE;AACrC,QAAI,MAAM;AAEV,QAAI,YAAY,SAAS,GAAG;AAC1B,UAAI,KAAK,wCAAwC;AAAA,IACnD,OAAO;AACL,UAAI,KAAK,gDAAgD;AACzD,UAAI,KAAK,kQAAgD;AACzD,iBAAW,WAAW,CAAC,GAAG,WAAW,EAAE,KAAK,GAAG;AAC7C,cAAM,QAAQ,YAAY,IAAI,OAAO,KAAK;AAC1C,cAAM,SAAS,aAAa,IAAI,OAAO,KAAK;AAC5C,cAAM,OAAO,QAAQ,SAAS,KAAK,QAAQ,MAAM,GAAG,EAAE,IAAI,QAAQ;AAClE,YAAI,KAAK,GAAG,KAAK,OAAO,EAAE,CAAC,IAAI,OAAO,KAAK,EAAE,SAAS,CAAC,CAAC,KAAK,OAAO,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE;AAAA,MAC3F;AAAA,IACF;AACA,QAAI,MAAM;AAAA,EACZ,UAAE;AACA,QAAI,MAAM;AAAA,EACZ;AACF;","names":[]}
@@ -1,19 +1,23 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
- MemoryRepo,
4
3
  RelationRepo,
5
4
  SearchRepo
6
- } from "./chunk-DXDOVWOA.js";
5
+ } from "./chunk-HSGSTSVN.js";
6
+ import {
7
+ migrate
8
+ } from "./chunk-OPORVSAF.js";
9
+ import {
10
+ MemoryRepo
11
+ } from "./chunk-IDH3M4EI.js";
7
12
  import {
8
13
  DEFAULT_DECAY_PARAMS,
9
14
  closeDatabase,
10
15
  createDatabase,
11
16
  loadConfig,
12
- migrate,
13
17
  resolveDataDir
14
- } from "./chunk-ZIG75MOB.js";
15
- import "./chunk-DTCCQWOU.js";
16
- import "./chunk-KPO4YURF.js";
18
+ } from "./chunk-UN43OVRW.js";
19
+ import "./chunk-D6RAMWH6.js";
20
+ import "./chunk-QEPE3WVF.js";
17
21
 
18
22
  // src/commands/memory/dashboard/tui.tsx
19
23
  import { render } from "ink";
@@ -1306,4 +1310,4 @@ async function startTui(options) {
1306
1310
  export {
1307
1311
  startTui
1308
1312
  };
1309
- //# sourceMappingURL=tui-2UJ2OIHB.js.map
1313
+ //# sourceMappingURL=tui-HVJNLRY2.js.map