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.
- package/README.md +11 -3
- package/dist/{chunk-DTCCQWOU.js → chunk-D6RAMWH6.js} +3 -3
- package/dist/{chunk-DTCCQWOU.js.map → chunk-D6RAMWH6.js.map} +1 -1
- package/dist/chunk-HSGSTSVN.js +212 -0
- package/dist/chunk-HSGSTSVN.js.map +1 -0
- package/dist/{chunk-DXDOVWOA.js → chunk-IDH3M4EI.js} +20 -232
- package/dist/chunk-IDH3M4EI.js.map +1 -0
- package/dist/{chunk-YZ53W47Z.js → chunk-IIWOSSL4.js} +2 -1
- package/dist/chunk-IIWOSSL4.js.map +1 -0
- package/dist/{chunk-ZLI4LI33.js → chunk-M6GVFN67.js} +2 -2
- package/dist/{chunk-F6SLV2FR.js → chunk-N2SCF7DB.js} +5 -6
- package/dist/chunk-N2SCF7DB.js.map +1 -0
- package/dist/chunk-OPORVSAF.js +225 -0
- package/dist/chunk-OPORVSAF.js.map +1 -0
- package/dist/{chunk-KPO4YURF.js → chunk-QEPE3WVF.js} +457 -85
- package/dist/chunk-QEPE3WVF.js.map +1 -0
- package/dist/chunk-UN43OVRW.js +184 -0
- package/dist/chunk-UN43OVRW.js.map +1 -0
- package/dist/{chunk-PH5OWJ42.js → chunk-VF7U63AI.js} +9 -5
- package/dist/{chunk-PH5OWJ42.js.map → chunk-VF7U63AI.js.map} +1 -1
- package/dist/cli.js +307 -87
- package/dist/cli.js.map +1 -1
- package/dist/commands/memory/server.js +48 -14
- package/dist/commands/memory/server.js.map +1 -1
- package/dist/{context-JALSYDYO.js → context-YIPO4LBS.js} +58 -55
- package/dist/context-YIPO4LBS.js.map +1 -0
- package/dist/doctor-DCHFJ3XV.js +108 -0
- package/dist/doctor-DCHFJ3XV.js.map +1 -0
- package/dist/{install-Q23F37GK.js → install-D32PV7SF.js} +12 -10
- package/dist/install-D32PV7SF.js.map +1 -0
- package/dist/{pull-FYKNNLYC.js → pull-YUQTDRUP.js} +17 -19
- package/dist/pull-YUQTDRUP.js.map +1 -0
- package/dist/{push-QSBK7BQU.js → push-U4IVTFOU.js} +13 -12
- package/dist/push-U4IVTFOU.js.map +1 -0
- package/dist/{require-deps-ZISUZLYD.js → require-deps-WDMHDGBN.js} +3 -3
- package/dist/{stats-SV53G6PQ.js → stats-77BYLKYP.js} +9 -7
- package/dist/{stats-SV53G6PQ.js.map → stats-77BYLKYP.js.map} +1 -1
- package/dist/{sync-2LDM44U4.js → sync-DTCWK2CY.js} +5 -5
- package/dist/{sync-clean-HQ523N7V.js → sync-clean-ACZCB3NZ.js} +4 -5
- package/dist/sync-clean-ACZCB3NZ.js.map +1 -0
- package/dist/{sync-status-V6WTI32X.js → sync-status-2V2RCYZO.js} +13 -12
- package/dist/sync-status-2V2RCYZO.js.map +1 -0
- package/dist/{tui-2UJ2OIHB.js → tui-HVJNLRY2.js} +11 -7
- package/dist/{tui-2UJ2OIHB.js.map → tui-HVJNLRY2.js.map} +1 -1
- package/package.json +27 -7
- package/scenarios/workflow/premature-victory.yaml +44 -0
- package/dist/chunk-DXDOVWOA.js.map +0 -1
- package/dist/chunk-F6SLV2FR.js.map +0 -1
- package/dist/chunk-KPO4YURF.js.map +0 -1
- package/dist/chunk-YZ53W47Z.js.map +0 -1
- package/dist/chunk-ZIG75MOB.js +0 -366
- package/dist/chunk-ZIG75MOB.js.map +0 -1
- package/dist/context-JALSYDYO.js.map +0 -1
- package/dist/install-Q23F37GK.js.map +0 -1
- package/dist/pull-FYKNNLYC.js.map +0 -1
- package/dist/push-QSBK7BQU.js.map +0 -1
- package/dist/sync-clean-HQ523N7V.js.map +0 -1
- package/dist/sync-status-V6WTI32X.js.map +0 -1
- /package/dist/{chunk-ZLI4LI33.js.map → chunk-M6GVFN67.js.map} +0 -0
- /package/dist/{require-deps-ZISUZLYD.js.map → require-deps-WDMHDGBN.js.map} +0 -0
- /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-
|
|
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-
|
|
14
|
-
import "./chunk-
|
|
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-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
23
|
-
import "./chunk-
|
|
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-
|
|
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
|
-
|
|
34
|
-
return;
|
|
35
|
+
throw new Error("No sync gist found. Run `memory push` first.");
|
|
35
36
|
}
|
|
36
|
-
const { requireMemoryDeps } = await import("./require-deps-
|
|
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
|
-
|
|
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
|
-
|
|
61
|
-
log.error(`No memories found for project "${project}" in gist.`);
|
|
60
|
+
return;
|
|
62
61
|
}
|
|
63
|
-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
16
|
-
import "./chunk-
|
|
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-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
6
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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":"
|
|
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-
|
|
4
|
+
} from "./chunk-M6GVFN67.js";
|
|
5
5
|
import {
|
|
6
6
|
log
|
|
7
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
23
|
+
//# sourceMappingURL=sync-DTCWK2CY.js.map
|
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
listGistFiles,
|
|
7
7
|
loadSyncConfig,
|
|
8
8
|
projectToFilename
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-M6GVFN67.js";
|
|
10
10
|
import {
|
|
11
11
|
log
|
|
12
|
-
} from "./chunk-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
12
|
-
import "./chunk-
|
|
11
|
+
} from "./chunk-M6GVFN67.js";
|
|
12
|
+
import "./chunk-IIWOSSL4.js";
|
|
13
13
|
import {
|
|
14
14
|
initStorage
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
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-
|
|
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
|
-
|
|
29
|
-
return;
|
|
30
|
+
throw new Error("No sync gist found. Run `memory push` first.");
|
|
30
31
|
}
|
|
31
|
-
const { requireMemoryDeps } = await import("./require-deps-
|
|
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-
|
|
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-
|
|
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-
|
|
15
|
-
import "./chunk-
|
|
16
|
-
import "./chunk-
|
|
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-
|
|
1313
|
+
//# sourceMappingURL=tui-HVJNLRY2.js.map
|