@duetso/agent 0.1.190 → 0.1.192

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 (46) hide show
  1. package/README.md +27 -0
  2. package/dist/package.json +2 -2
  3. package/dist/src/cli/help.d.ts +1 -0
  4. package/dist/src/cli/help.d.ts.map +1 -1
  5. package/dist/src/cli/help.js +65 -0
  6. package/dist/src/cli/help.js.map +1 -1
  7. package/dist/src/cli/memory-db.d.ts +21 -1
  8. package/dist/src/cli/memory-db.d.ts.map +1 -1
  9. package/dist/src/cli/memory-db.js +54 -1
  10. package/dist/src/cli/memory-db.js.map +1 -1
  11. package/dist/src/cli/memory-reflect.js +1 -1
  12. package/dist/src/cli/memory-reflect.js.map +1 -1
  13. package/dist/src/cli/train.d.ts +31 -0
  14. package/dist/src/cli/train.d.ts.map +1 -0
  15. package/dist/src/cli/train.js +565 -0
  16. package/dist/src/cli/train.js.map +1 -0
  17. package/dist/src/cli.d.ts +1 -0
  18. package/dist/src/cli.d.ts.map +1 -1
  19. package/dist/src/cli.js +6 -0
  20. package/dist/src/cli.js.map +1 -1
  21. package/dist/src/memory/context-pack.d.ts.map +1 -1
  22. package/dist/src/memory/context-pack.js +1 -0
  23. package/dist/src/memory/context-pack.js.map +1 -1
  24. package/dist/src/memory/loader.d.ts +4 -1
  25. package/dist/src/memory/loader.d.ts.map +1 -1
  26. package/dist/src/memory/loader.js +7 -3
  27. package/dist/src/memory/loader.js.map +1 -1
  28. package/dist/src/memory/observational.d.ts +3 -0
  29. package/dist/src/memory/observational.d.ts.map +1 -1
  30. package/dist/src/memory/observational.js +16 -0
  31. package/dist/src/memory/observational.js.map +1 -1
  32. package/dist/src/train/archive.d.ts +26 -0
  33. package/dist/src/train/archive.d.ts.map +1 -0
  34. package/dist/src/train/archive.js +98 -0
  35. package/dist/src/train/archive.js.map +1 -0
  36. package/dist/src/train/tags.d.ts +17 -0
  37. package/dist/src/train/tags.d.ts.map +1 -0
  38. package/dist/src/train/tags.js +24 -0
  39. package/dist/src/train/tags.js.map +1 -0
  40. package/dist/src/train/types.d.ts +62 -0
  41. package/dist/src/train/types.d.ts.map +1 -0
  42. package/dist/src/train/types.js +2 -0
  43. package/dist/src/train/types.js.map +1 -0
  44. package/dist/src/types/memory.d.ts +25 -9
  45. package/dist/src/types/memory.d.ts.map +1 -1
  46. package/package.json +2 -2
@@ -0,0 +1,565 @@
1
+ import { readFile, rm, stat } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import dedent from "dedent";
4
+ import { runMigrations } from "../memory/migrations.js";
5
+ import { MemoryLockTimeoutError } from "../memory/pglite.js";
6
+ import { MemorySession } from "../memory/session.js";
7
+ import { appendObservation } from "../memory/storage.js";
8
+ import { resolveCliModel } from "../model-resolution/resolver.js";
9
+ import { DEFAULT_MEMORY_DB_PATH, SessionManager } from "../session/session-manager.js";
10
+ import { collectArchiveFiles, removeArchive, writeArchive } from "../train/archive.js";
11
+ import { TRAIN_TAG, trainSlugTag } from "../train/tags.js";
12
+ import { printTrainHelp } from "./help.js";
13
+ import { MemoryDb } from "./memory-db.js";
14
+ import { fail, loadCliEnvFiles, resolveUserPath } from "./shared.js";
15
+ import { installShutdownHandlers } from "./shutdown.js";
16
+ /**
17
+ * Lowercase a base name and collapse anything that isn't a-z/0-9 into
18
+ * single dashes so the slug can serve as a tag (`train:<slug>`) and a
19
+ * folder name without quoting.
20
+ */
21
+ function sanitizeSlug(name) {
22
+ return name
23
+ .toLowerCase()
24
+ .replace(/[^a-z0-9-]+/g, "-")
25
+ .replace(/^-+|-+$/g, "");
26
+ }
27
+ export function parseTrainArgs(args) {
28
+ let folder;
29
+ let slugOverride;
30
+ // Default model is resolved at run time via `resolveCliModel`, mirroring
31
+ // `duet run`'s actor model selection. Env var `DUET_MODEL` is honored by
32
+ // the resolver itself; we keep `--model` as the user's explicit override.
33
+ let model;
34
+ let dbPath = DEFAULT_MEMORY_DB_PATH;
35
+ let waitBudgetMs;
36
+ for (let i = 0; i < args.length; i++) {
37
+ const arg = args[i];
38
+ switch (arg) {
39
+ case "--slug":
40
+ if (!args[i + 1] || args[i + 1]?.startsWith("-"))
41
+ fail(`Missing value for ${arg}`);
42
+ slugOverride = args[++i];
43
+ break;
44
+ case "--model":
45
+ if (!args[i + 1] || args[i + 1]?.startsWith("-"))
46
+ fail(`Missing value for ${arg}`);
47
+ model = args[++i];
48
+ break;
49
+ case "--db":
50
+ if (!args[i + 1] || args[i + 1]?.startsWith("-"))
51
+ fail(`Missing value for ${arg}`);
52
+ dbPath = resolveUserPath(args[++i]);
53
+ break;
54
+ case "--wait": {
55
+ const raw = args[++i];
56
+ const seconds = Number(raw);
57
+ if (!Number.isFinite(seconds) || seconds < 0) {
58
+ fail(`Invalid --wait value: ${raw} (expected non-negative number of seconds)`);
59
+ }
60
+ waitBudgetMs = Math.round(seconds * 1000);
61
+ break;
62
+ }
63
+ case "--help":
64
+ case "-h":
65
+ printTrainHelp();
66
+ return undefined;
67
+ default:
68
+ if (arg.startsWith("-"))
69
+ fail(`Unknown train option: ${arg}`);
70
+ if (folder !== undefined)
71
+ fail(`Unexpected extra argument: ${arg}`);
72
+ folder = arg;
73
+ }
74
+ }
75
+ if (!folder)
76
+ fail("duet train requires a <folder> argument");
77
+ const resolved = path.resolve(folder);
78
+ const slug = sanitizeSlug(slugOverride ?? path.basename(resolved));
79
+ if (slug.length === 0) {
80
+ fail(`Could not derive a slug from "${folder}"; pass --slug <name>`);
81
+ }
82
+ return {
83
+ folder: resolved,
84
+ slug,
85
+ model,
86
+ dbPath,
87
+ ...(waitBudgetMs !== undefined ? { waitBudgetMs } : {}),
88
+ };
89
+ }
90
+ /**
91
+ * Verbatim system prompt for the synthesis sub-agent. The agent's cwd is
92
+ * the corpus folder, so file-reading tools resolve relative paths against
93
+ * it directly.
94
+ */
95
+ const TRAIN_SYSTEM_PROMPT = dedent `
96
+ You are synthesizing a project corpus into a single durable memory
97
+ observation.
98
+
99
+ The working directory IS the corpus. Read every file that looks
100
+ substantive — markdown, plain text, CSVs, PDFs, spreadsheets, images,
101
+ source code. Skip lockfiles, build artifacts, node_modules, .git, and
102
+ other obvious noise. Use your file-reading tools (read, ls, grep) to
103
+ explore until you understand what this corpus is about.
104
+
105
+ Extract EXHAUSTIVELY, not as a summary. A weaker reader of this corpus
106
+ tends to keep the headline claim and silently drop the specifics fused
107
+ to it — that is the failure to avoid. As you read, preserve EVERY
108
+ load-bearing concrete fact:
109
+ - Every number, quantity, percentage, version, and date — including
110
+ the second and third value in any enumeration (if a fact says
111
+ "X across A, B, and C", keep A, B, AND C, never just A).
112
+ - Every named feature, product, option, tool, attribute, and API —
113
+ by its exact name, not a generic paraphrase.
114
+ - Every member of a list, and the qualifier attached to each member
115
+ (if every option "supports both X and Y", state that for the set).
116
+ - Exact syntax, identifiers, code values, and config snippets as
117
+ written (e.g. a property name and its literal example value).
118
+ Never collapse an enumeration to its first item and never generalize a
119
+ specific into a category. When in doubt, include the detail.
120
+
121
+ When you have read enough to write an accurate synthesis, produce
122
+ EXACTLY one file at the cwd root and nothing else:
123
+
124
+ \`.duet-train.json\` — a JSON object with exactly two string fields:
125
+ {
126
+ "headline": "<short title for this corpus, under 120 characters, no trailing punctuation>",
127
+ "observationContent": "<dense, concrete, durable, high-priority knowledge an agent would need to act on this material. Use as much length as it takes to retain every load-bearing fact above — completeness beats brevity — but keep it a single standalone memory entry of tight prose, not a document dump. No preamble, no 'this corpus contains' framing.>"
128
+ }
129
+
130
+ Do NOT write \`AGENTS.md\` or any other file. The JSON handoff is the
131
+ only deliverable. Neither field may be empty. After writing the file,
132
+ stop. You do not need to say anything else.
133
+ `;
134
+ /**
135
+ * Launch the duet agent inside the corpus folder and let it produce a
136
+ * `.duet-train.json` handoff file. Returns the parsed synthesis result.
137
+ * The handoff file is removed before launch (so a leftover from a failed
138
+ * run can't be mistaken for fresh output) and after a successful read
139
+ * (so it doesn't leak into the corpus or the archive).
140
+ */
141
+ async function runAgentSynthesis(options, io) {
142
+ const handoffPath = path.join(options.folder, ".duet-train.json");
143
+ await rm(handoffPath, { force: true });
144
+ const config = {
145
+ cwd: options.folder,
146
+ model: options.model,
147
+ // Don't write to the durable memory DB during synthesis; the train
148
+ // command owns the single observation row that lands at the end.
149
+ memoryDbPath: false,
150
+ // Synthesis must not be steered by the corpus's own AGENTS.md (if
151
+ // present) — the agent reads files as data, not as instructions.
152
+ systemPromptFiles: [],
153
+ // Avoid local user-skill drift influencing what the sub-agent does.
154
+ skillDiscovery: { includeDefaults: false },
155
+ systemInstructions: TRAIN_SYSTEM_PROMPT,
156
+ mode: "agent",
157
+ };
158
+ const manager = new SessionManager(config);
159
+ // Quietly surface what the sub-agent is doing so a long synthesis run
160
+ // doesn't look frozen. We only relay tool calls (the visible work) and
161
+ // any system-level messages; assistant text and reasoning are skipped.
162
+ const unsubscribe = manager.subscribe(({ event }) => {
163
+ if (event.type === "step") {
164
+ const step = event.step;
165
+ if (step.type === "tool_call" && step.status === "running") {
166
+ io.stderr.write(`[agent] ${step.toolName}\n`);
167
+ }
168
+ else if (step.type === "system") {
169
+ io.stderr.write(`[agent] ${step.message}\n`);
170
+ }
171
+ }
172
+ else if (event.type === "system") {
173
+ io.stderr.write(`[agent] ${event.message}\n`);
174
+ }
175
+ });
176
+ try {
177
+ const session = manager.create({
178
+ prompt: `Synthesize the corpus in this directory. Slug: ${options.slug}.`,
179
+ });
180
+ const terminal = await session.waitForTerminal();
181
+ if (terminal.type !== "complete") {
182
+ throw new Error(`train: agent terminated with type=${terminal.type}; expected "complete"`);
183
+ }
184
+ }
185
+ finally {
186
+ unsubscribe();
187
+ await manager.dispose();
188
+ }
189
+ const raw = await readFile(handoffPath, "utf8").catch(() => {
190
+ throw new Error(`train: agent did not produce ${handoffPath}. Re-run with --model <stronger model> if the model is too small.`);
191
+ });
192
+ await rm(handoffPath, { force: true });
193
+ let parsed;
194
+ try {
195
+ parsed = JSON.parse(raw);
196
+ }
197
+ catch (err) {
198
+ throw new Error(`train: .duet-train.json was not valid JSON: ${err.message}`);
199
+ }
200
+ if (!parsed || typeof parsed !== "object") {
201
+ throw new Error(`train: .duet-train.json must be a JSON object, got ${typeof parsed}`);
202
+ }
203
+ const { headline, observationContent } = parsed;
204
+ if (typeof headline !== "string" || headline.trim().length === 0) {
205
+ throw new Error(`train: .duet-train.json missing non-empty string "headline"`);
206
+ }
207
+ if (typeof observationContent !== "string" || observationContent.trim().length === 0) {
208
+ throw new Error(`train: .duet-train.json missing non-empty string "observationContent"`);
209
+ }
210
+ return {
211
+ headline: headline.trim(),
212
+ observationContent: observationContent.trim(),
213
+ };
214
+ }
215
+ /**
216
+ * Run `duet train <folder>` — launch a sub-agent that reads the corpus
217
+ * and writes a structured handoff file (.duet-train.json), persist the
218
+ * synthesized observation into durable memory (replacing any prior
219
+ * `train:<slug>` row), archive the corpus under `~/.duet/train/<memoryId>/`,
220
+ * and verify both side effects landed.
221
+ */
222
+ export async function runTrainCommand(args, io = { stdout: process.stdout, stderr: process.stderr }) {
223
+ // The management subcommands are read/edit/delete siblings of the synthesis
224
+ // command. They route before the synthesis arg parser, which would otherwise
225
+ // treat the subcommand word as a corpus folder. Everything else falls
226
+ // through to the default `train <folder>` create flow.
227
+ switch (args[0]) {
228
+ case "list":
229
+ return runTrainListCommand(args.slice(1), io);
230
+ case "show":
231
+ return runTrainShowCommand(args.slice(1), io);
232
+ case "update":
233
+ return runTrainUpdateCommand(args.slice(1), io);
234
+ case "delete":
235
+ return runTrainDeleteCommand(args.slice(1), io);
236
+ }
237
+ const options = parseTrainArgs(args);
238
+ if (!options)
239
+ return;
240
+ // Post-parse failures throw instead of calling `fail()`: the CLI entry
241
+ // (`runCli`) prints them identically, while in-process callers (the
242
+ // eval harness, the model sweep) can catch them and run their cleanup.
243
+ const folderStat = await stat(options.folder).catch(() => undefined);
244
+ if (!folderStat || !folderStat.isDirectory()) {
245
+ throw new Error(`Folder not found or not a directory: ${options.folder}`);
246
+ }
247
+ // Resolve the model the same way `duet run` does so shorthands and
248
+ // provider routing behave identically. Env files in the corpus folder
249
+ // can supply provider credentials; load them before resolution.
250
+ const dotenvKeys = loadCliEnvFiles(options.folder);
251
+ const modelResolution = resolveCliModel(options.model, dotenvKeys);
252
+ const resolvedModel = modelResolution.modelName;
253
+ const session = new MemorySession({
254
+ path: options.dbPath,
255
+ openOptions: {
256
+ init: async (db) => {
257
+ await runMigrations(db);
258
+ },
259
+ },
260
+ ...(options.waitBudgetMs !== undefined ? { lockWaitBudgetMs: options.waitBudgetMs } : {}),
261
+ idleCloseMs: 60_000,
262
+ });
263
+ const removeShutdownHandlers = installShutdownHandlers(() => session.dispose());
264
+ try {
265
+ await session.withDb(async () => { });
266
+ io.stderr.write(`[synthesize] model=${resolvedModel}\n`);
267
+ const synthesis = await runAgentSynthesis({ folder: options.folder, slug: options.slug, model: resolvedModel }, io);
268
+ // Insert the new row BEFORE deleting priors: if the process dies
269
+ // between the two steps the worst case is a duplicate `train:<slug>`
270
+ // row (cleaned up by the next train run), never zero rows. The row is
271
+ // written as `kind: "manual"` so the loader's manualBias ranks it at
272
+ // the top of the global pack (a manual row with no sessionId never
273
+ // matches a live session, so it lands in the global pack via the
274
+ // loader's NULL-session handling), and `duet memory reflect`'s prune
275
+ // preserves it by kind regardless of age.
276
+ const trainTag = trainSlugTag(options.slug);
277
+ const observedDate = new Date().toISOString().slice(0, 10);
278
+ const observation = await appendObservation(session, {
279
+ kind: "manual",
280
+ priority: "high",
281
+ source: { kind: "system" },
282
+ content: synthesis.observationContent,
283
+ tags: [TRAIN_TAG, trainTag],
284
+ observedDate,
285
+ });
286
+ if (!observation) {
287
+ throw new Error(`Could not write training memory to ${options.dbPath} (lock contention).`);
288
+ }
289
+ // SELECT + DELETE share one `withDb` so the replace step is atomic
290
+ // against peer writers and lock failure surfaces in one place.
291
+ // Invariant after this block: exactly one `train:<slug>` row — the
292
+ // one written above.
293
+ const priorIds = await session.withDb(async (db) => {
294
+ const result = await db.query("SELECT id, tags_json FROM observations");
295
+ const ids = [];
296
+ for (const row of result.rows) {
297
+ if (row.id === observation.id)
298
+ continue;
299
+ let tags;
300
+ try {
301
+ tags = JSON.parse(row.tags_json);
302
+ }
303
+ catch {
304
+ continue;
305
+ }
306
+ if (Array.isArray(tags) && tags.includes(trainTag)) {
307
+ ids.push(row.id);
308
+ }
309
+ }
310
+ for (const id of ids) {
311
+ await db.query("DELETE FROM observations WHERE id = $1", [id]);
312
+ }
313
+ return ids;
314
+ });
315
+ if (priorIds === undefined) {
316
+ throw new Error(`Could not remove prior training rows from ${options.dbPath} (lock contention); ` +
317
+ `the new row ${observation.id} was written. Re-run train to clean up the duplicate.`);
318
+ }
319
+ for (const id of priorIds) {
320
+ await removeArchive(id);
321
+ }
322
+ const replacedSuffix = priorIds.length > 0 ? ` (replaced ${priorIds.length} prior row(s))` : "";
323
+ io.stderr.write(`[persist] memory id=${observation.id}${replacedSuffix}\n`);
324
+ // `runAgentSynthesis` already removed `.duet-train.json`; the
325
+ // walker's skip list is defense in depth.
326
+ const archivedFiles = await collectArchiveFiles(options.folder);
327
+ const manifest = {
328
+ memoryId: observation.id,
329
+ slug: options.slug,
330
+ createdAt: observation.createdAt,
331
+ sourceFolder: options.folder,
332
+ model: resolvedModel,
333
+ headline: synthesis.headline,
334
+ files: archivedFiles.map((file) => ({
335
+ relPath: file.relPath,
336
+ bytes: file.bytes,
337
+ sha256: file.sha256,
338
+ })),
339
+ };
340
+ const archivePath = await writeArchive({
341
+ memoryId: observation.id,
342
+ files: archivedFiles,
343
+ manifest,
344
+ });
345
+ const verifyRows = await session.withDb(async (db) => db.query("SELECT content FROM observations WHERE id = $1", [
346
+ observation.id,
347
+ ]));
348
+ if (verifyRows === undefined) {
349
+ throw new Error(`Could not verify training memory at ${options.dbPath} (lock contention).`);
350
+ }
351
+ if (verifyRows.rows[0]?.content !== synthesis.observationContent) {
352
+ throw new Error(`Verification failed: observation ${observation.id} did not round-trip through the DB.`);
353
+ }
354
+ io.stdout.write(`Trained "${synthesis.headline}"\n`);
355
+ io.stdout.write(` memory id : ${observation.id}\n`);
356
+ io.stdout.write(` archive : ${archivePath}\n`);
357
+ io.stdout.write(` files : ${archivedFiles.length} file(s)\n`);
358
+ io.stdout.write(` model : ${resolvedModel}\n`);
359
+ io.stdout.write(`\n${synthesis.observationContent}\n`);
360
+ }
361
+ catch (error) {
362
+ if (error instanceof MemoryLockTimeoutError) {
363
+ throw new Error(`Memory database at ${error.dataDir} is still locked by duet pid ${error.holderPid} after ${error.budgetMs / 1000}s. Stop that process (or pass --wait <seconds> to wait longer) and retry.`);
364
+ }
365
+ throw error;
366
+ }
367
+ finally {
368
+ removeShutdownHandlers();
369
+ await session.dispose();
370
+ }
371
+ }
372
+ function truncate(value, max) {
373
+ return value.length <= max ? value : `${value.slice(0, max - 1)}…`;
374
+ }
375
+ /** Render the list as an aligned text table. Pure so it is unit-testable
376
+ * without a database. */
377
+ export function formatTrainList(entries) {
378
+ if (entries.length === 0) {
379
+ return "No trainings found. Run `duet train <folder>` to create one.";
380
+ }
381
+ const rows = entries.map((entry) => ({
382
+ slug: entry.slug,
383
+ headline: entry.headline ?? (entry.hasArchive ? "—" : "(archive missing)"),
384
+ model: entry.model ?? "—",
385
+ files: entry.fileCount === undefined ? "—" : String(entry.fileCount),
386
+ trained: entry.observedDate,
387
+ id: entry.memoryId,
388
+ }));
389
+ const headers = {
390
+ slug: "SLUG",
391
+ headline: "HEADLINE",
392
+ model: "MODEL",
393
+ files: "FILES",
394
+ trained: "TRAINED",
395
+ id: "MEMORY ID",
396
+ };
397
+ const width = (key, cap) => Math.min(cap, Math.max(headers[key].length, ...rows.map((row) => row[key].length)));
398
+ const w = {
399
+ slug: width("slug", 24),
400
+ headline: width("headline", 48),
401
+ model: width("model", 18),
402
+ files: width("files", 5),
403
+ trained: width("trained", 10),
404
+ id: width("id", 20),
405
+ };
406
+ const line = (cells) => [
407
+ truncate(cells.slug, w.slug).padEnd(w.slug),
408
+ truncate(cells.headline, w.headline).padEnd(w.headline),
409
+ truncate(cells.model, w.model).padEnd(w.model),
410
+ cells.files.padStart(w.files),
411
+ cells.trained.padEnd(w.trained),
412
+ cells.id,
413
+ ].join(" ");
414
+ return [line(headers), ...rows.map(line)].join("\n");
415
+ }
416
+ /** Multi-line detail view for a single training (`duet train show`). */
417
+ function formatTrainRecord(record) {
418
+ return [
419
+ `slug : ${record.slug}`,
420
+ `headline : ${record.headline ?? "—"}`,
421
+ `memory id : ${record.memoryId}`,
422
+ `model : ${record.model ?? "—"}`,
423
+ `files : ${record.fileCount ?? "—"}`,
424
+ `source : ${record.sourceFolder ?? "—"}`,
425
+ `trained : ${record.observedDate}`,
426
+ `archive : ${record.hasArchive ? "present" : "missing"}`,
427
+ "",
428
+ record.content,
429
+ ].join("\n");
430
+ }
431
+ /**
432
+ * Shared arg parser for the management subcommands. Each command validates
433
+ * which fields it actually requires (e.g. `show` needs a slug, `update` also
434
+ * needs `--content-file`); this only does the lexing.
435
+ */
436
+ function parseTrainSubArgs(args) {
437
+ let slug;
438
+ let dbPath = DEFAULT_MEMORY_DB_PATH;
439
+ let json = false;
440
+ let contentFile;
441
+ for (let i = 0; i < args.length; i++) {
442
+ const arg = args[i];
443
+ switch (arg) {
444
+ case "--db":
445
+ if (!args[i + 1] || args[i + 1]?.startsWith("-"))
446
+ fail(`Missing value for ${arg}`);
447
+ dbPath = resolveUserPath(args[++i]);
448
+ break;
449
+ case "--content-file":
450
+ if (!args[i + 1] || args[i + 1]?.startsWith("-"))
451
+ fail(`Missing value for ${arg}`);
452
+ contentFile = resolveUserPath(args[++i]);
453
+ break;
454
+ case "--json":
455
+ json = true;
456
+ break;
457
+ case "--help":
458
+ case "-h":
459
+ printTrainHelp();
460
+ return undefined;
461
+ default:
462
+ if (arg.startsWith("-"))
463
+ fail(`Unknown train option: ${arg}`);
464
+ if (slug !== undefined)
465
+ fail(`Unexpected extra argument: ${arg}`);
466
+ slug = arg;
467
+ }
468
+ }
469
+ return { slug, dbPath, json, contentFile };
470
+ }
471
+ /**
472
+ * Open the memory database for a management subcommand, run `fn`, and always
473
+ * close it. Lock contention surfaces as a friendly message (the same one the
474
+ * create flow uses) rather than a raw error.
475
+ */
476
+ async function withTrainMemoryDb(dbPath, fn) {
477
+ let db;
478
+ try {
479
+ db = await MemoryDb.open(dbPath);
480
+ }
481
+ catch (error) {
482
+ if (error instanceof MemoryLockTimeoutError) {
483
+ fail(`Memory database at ${error.dataDir} is still locked by duet pid ${error.holderPid} after ${error.budgetMs / 1000}s. Stop that process (or pass --wait <seconds> to wait longer) and retry.`);
484
+ }
485
+ throw error;
486
+ }
487
+ const removeShutdownHandlers = installShutdownHandlers(() => db.close());
488
+ try {
489
+ return await fn(db);
490
+ }
491
+ finally {
492
+ removeShutdownHandlers();
493
+ await db.close();
494
+ }
495
+ }
496
+ export async function runTrainListCommand(args, io) {
497
+ const options = parseTrainSubArgs(args);
498
+ if (!options)
499
+ return;
500
+ if (options.slug !== undefined)
501
+ fail(`Unexpected argument for train list: ${options.slug}`);
502
+ const entries = await withTrainMemoryDb(options.dbPath, (db) => db.listTrainings());
503
+ io.stdout.write(options.json ? `${JSON.stringify(entries, null, 2)}\n` : `${formatTrainList(entries)}\n`);
504
+ }
505
+ export async function runTrainShowCommand(args, io) {
506
+ const options = parseTrainSubArgs(args);
507
+ if (!options)
508
+ return;
509
+ if (!options.slug)
510
+ fail("duet train show requires a <slug> argument");
511
+ const slug = options.slug;
512
+ const record = await withTrainMemoryDb(options.dbPath, (db) => db.findTrainingBySlug(slug));
513
+ if (!record)
514
+ fail(`No training found for slug "${slug}".`);
515
+ io.stdout.write(options.json ? `${JSON.stringify(record, null, 2)}\n` : `${formatTrainRecord(record)}\n`);
516
+ }
517
+ export async function runTrainUpdateCommand(args, io) {
518
+ const options = parseTrainSubArgs(args);
519
+ if (!options)
520
+ return;
521
+ if (!options.slug)
522
+ fail("duet train update requires a <slug> argument");
523
+ if (!options.contentFile)
524
+ fail("duet train update requires --content-file <path>");
525
+ const slug = options.slug;
526
+ const content = await readFile(options.contentFile, "utf8");
527
+ if (content.trim().length === 0) {
528
+ fail(`Refusing to write empty content from ${options.contentFile}.`);
529
+ }
530
+ const updated = await withTrainMemoryDb(options.dbPath, async (db) => {
531
+ const record = await db.findTrainingBySlug(slug);
532
+ if (!record)
533
+ fail(`No training found for slug "${slug}".`);
534
+ await db.updateContent(record.memoryId, content);
535
+ // updateContent only touches `content`, so the stored row is the prior
536
+ // record with the new text.
537
+ return { ...record, content };
538
+ });
539
+ if (options.json) {
540
+ io.stdout.write(`${JSON.stringify(updated, null, 2)}\n`);
541
+ return;
542
+ }
543
+ io.stdout.write(`Updated "${slug}" (memory id ${updated.memoryId}).\n`);
544
+ }
545
+ export async function runTrainDeleteCommand(args, io) {
546
+ const options = parseTrainSubArgs(args);
547
+ if (!options)
548
+ return;
549
+ if (!options.slug)
550
+ fail("duet train delete requires a <slug> argument");
551
+ const slug = options.slug;
552
+ const deleted = await withTrainMemoryDb(options.dbPath, async (db) => {
553
+ const record = await db.findTrainingBySlug(slug);
554
+ if (!record)
555
+ fail(`No training found for slug "${slug}".`);
556
+ await db.delete(record.memoryId);
557
+ return record;
558
+ });
559
+ if (options.json) {
560
+ io.stdout.write(`${JSON.stringify({ deleted: true, slug: deleted.slug, memoryId: deleted.memoryId }, null, 2)}\n`);
561
+ return;
562
+ }
563
+ io.stdout.write(`Deleted "${deleted.slug}" (memory id ${deleted.memoryId}) and its archive.\n`);
564
+ }
565
+ //# sourceMappingURL=train.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"train.js","sourceRoot":"","sources":["../../../src/cli/train.ts"],"names":[],"mappings":"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"}
package/dist/src/cli.d.ts CHANGED
@@ -22,6 +22,7 @@ export { runSkillsCommand } from "./cli/skills.js";
22
22
  export { runUpgradeCommand } from "./cli/upgrade.js";
23
23
  export { runMemoryCommand } from "./cli/memory.js";
24
24
  export { runMemoryReflectCommand } from "./cli/memory-reflect.js";
25
+ export { runTrainCommand } from "./cli/train.js";
25
26
  export { runSendFeedbackCommand } from "./cli/send-feedback.js";
26
27
  export type { SendFeedbackCommandIO } from "./cli/send-feedback.js";
27
28
  export { cliEnvFilePaths, defaultDuetEnvFilePath, expandHomeDir, fileExists, formatEnvEntries, loadCliEnvFiles, parseResumeHistoryMessages, resolveUserPath, shellQuote, } from "./cli/shared.js";
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG;AAiBH,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,0BAA0B,EAC1B,eAAe,EACf,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,+BAA+B,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjG,YAAY,EAAE,cAAc,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAO/D,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA2C5C"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;GAWG;AAkBH,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjG,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,YAAY,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,0BAA0B,EAC1B,eAAe,EACf,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,+BAA+B,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACjG,YAAY,EAAE,cAAc,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAO/D,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CA+C5C"}
package/dist/src/cli.js CHANGED
@@ -20,6 +20,7 @@ import { runRpcCommand } from "./cli/rpc.js";
20
20
  import { runRunCommand } from "./cli/run.js";
21
21
  import { runSendFeedbackCommand } from "./cli/send-feedback.js";
22
22
  import { runSkillsCommand } from "./cli/skills.js";
23
+ import { runTrainCommand } from "./cli/train.js";
23
24
  import { runUpgradeCommand } from "./cli/upgrade.js";
24
25
  export { buildCliTurnConfig, runRunCommand, shouldUseTui } from "./cli/run.js";
25
26
  export { runRpcCommand } from "./cli/rpc.js";
@@ -29,6 +30,7 @@ export { runSkillsCommand } from "./cli/skills.js";
29
30
  export { runUpgradeCommand } from "./cli/upgrade.js";
30
31
  export { runMemoryCommand } from "./cli/memory.js";
31
32
  export { runMemoryReflectCommand } from "./cli/memory-reflect.js";
33
+ export { runTrainCommand } from "./cli/train.js";
32
34
  export { runSendFeedbackCommand } from "./cli/send-feedback.js";
33
35
  export { cliEnvFilePaths, defaultDuetEnvFilePath, expandHomeDir, fileExists, formatEnvEntries, loadCliEnvFiles, parseResumeHistoryMessages, resolveUserPath, shellQuote, } from "./cli/shared.js";
34
36
  export { detectPackageManagerFromContext, globalUpgradeCommand } from "./cli/package-manager.js";
@@ -62,6 +64,10 @@ export async function runCli() {
62
64
  await runMemoryCommand(args.slice(1));
63
65
  return;
64
66
  }
67
+ if (subcommand === "train") {
68
+ await runTrainCommand(args.slice(1));
69
+ return;
70
+ }
65
71
  if (subcommand === "send-feedback") {
66
72
  await runSendFeedbackCommand(args.slice(1));
67
73
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}