@duetso/agent 0.1.196 → 0.1.198

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 (45) hide show
  1. package/dist/package.json +3 -2
  2. package/dist/src/cli/help.d.ts +2 -0
  3. package/dist/src/cli/help.d.ts.map +1 -1
  4. package/dist/src/cli/help.js +71 -0
  5. package/dist/src/cli/help.js.map +1 -1
  6. package/dist/src/cli/memory-add.d.ts +38 -0
  7. package/dist/src/cli/memory-add.d.ts.map +1 -0
  8. package/dist/src/cli/memory-add.js +149 -0
  9. package/dist/src/cli/memory-add.js.map +1 -0
  10. package/dist/src/cli/memory-db.d.ts.map +1 -1
  11. package/dist/src/cli/memory-db.js +11 -4
  12. package/dist/src/cli/memory-db.js.map +1 -1
  13. package/dist/src/cli/memory.d.ts.map +1 -1
  14. package/dist/src/cli/memory.js +8 -0
  15. package/dist/src/cli/memory.js.map +1 -1
  16. package/dist/src/cli/model-gateway.d.ts +27 -0
  17. package/dist/src/cli/model-gateway.d.ts.map +1 -0
  18. package/dist/src/cli/model-gateway.js +51 -0
  19. package/dist/src/cli/model-gateway.js.map +1 -0
  20. package/dist/src/cli/model.d.ts +46 -0
  21. package/dist/src/cli/model.d.ts.map +1 -0
  22. package/dist/src/cli/model.js +347 -0
  23. package/dist/src/cli/model.js.map +1 -0
  24. package/dist/src/cli.d.ts +2 -0
  25. package/dist/src/cli.d.ts.map +1 -1
  26. package/dist/src/cli.js +7 -0
  27. package/dist/src/cli.js.map +1 -1
  28. package/dist/src/memory/context-pack.d.ts.map +1 -1
  29. package/dist/src/memory/context-pack.js +1 -0
  30. package/dist/src/memory/context-pack.js.map +1 -1
  31. package/dist/src/memory/loader.d.ts +6 -0
  32. package/dist/src/memory/loader.d.ts.map +1 -1
  33. package/dist/src/memory/loader.js +10 -2
  34. package/dist/src/memory/loader.js.map +1 -1
  35. package/dist/src/memory/observational.d.ts +18 -2
  36. package/dist/src/memory/observational.d.ts.map +1 -1
  37. package/dist/src/memory/observational.js +15 -4
  38. package/dist/src/memory/observational.js.map +1 -1
  39. package/dist/src/memory/recall.d.ts +13 -2
  40. package/dist/src/memory/recall.d.ts.map +1 -1
  41. package/dist/src/memory/recall.js +59 -8
  42. package/dist/src/memory/recall.js.map +1 -1
  43. package/dist/src/types/memory.d.ts +23 -10
  44. package/dist/src/types/memory.d.ts.map +1 -1
  45. package/package.json +3 -2
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duetso/agent",
3
- "version": "0.1.196",
3
+ "version": "0.1.198",
4
4
  "description": "An opinionated full-stack agent turn runner with native memories, interrupts, and multi-agent orchestration",
5
5
  "keywords": [
6
6
  "agent",
@@ -63,6 +63,7 @@
63
63
  "@modelcontextprotocol/sdk": "^1.29.0",
64
64
  "@opentui/core": "^0.2.5",
65
65
  "@vscode/ripgrep": "^1.18.0",
66
+ "ai": "^7",
66
67
  "ajv": "^8.20.0",
67
68
  "dedent": "^1.7.2",
68
69
  "dotenv": "^17.4.2",
@@ -83,7 +84,7 @@
83
84
  "typescript": "^5.7.0"
84
85
  },
85
86
  "engines": {
86
- "node": ">=20"
87
+ "node": ">=22"
87
88
  },
88
89
  "packageManager": "bun@1.3.11"
89
90
  }
@@ -10,7 +10,9 @@ export declare function printLoginHelp(): void;
10
10
  export declare function printEnvHelp(): void;
11
11
  export declare function printSkillsHelp(): void;
12
12
  export declare function printMemoryHelp(): void;
13
+ export declare function printMemoryAddHelp(): void;
13
14
  export declare function printMemoryReflectHelp(): void;
15
+ export declare function printModelHelp(): void;
14
16
  export declare function printTrainHelp(): void;
15
17
  export declare function printSendFeedbackHelp(): void;
16
18
  export declare function printUpgradeHelp(packageName: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/cli/help.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAqFtD;AAED,wBAAgB,cAAc,IAAI,IAAI,CA0BrC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAsBnC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAqBtC;AAED,wBAAgB,eAAe,IAAI,IAAI,CA2BtC;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAuC7C;AAED,wBAAgB,cAAc,IAAI,IAAI,CA+DrC;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAiB5C;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAe1D"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/cli/help.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAyFtD;AAED,wBAAgB,cAAc,IAAI,IAAI,CA0BrC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAsBnC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAqBtC;AAED,wBAAgB,eAAe,IAAI,IAAI,CA6BtC;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAyBzC;AAED,wBAAgB,sBAAsB,IAAI,IAAI,CAuC7C;AAED,wBAAgB,cAAc,IAAI,IAAI,CAsCrC;AAED,wBAAgB,cAAc,IAAI,IAAI,CA+DrC;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAiB5C;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAe1D"}
@@ -16,6 +16,7 @@ USAGE
16
16
  duet env [--env-file <path>] [--import [path]|--keys]
17
17
  duet skills [--workdir <path>]
18
18
  duet memory [--db <path>]
19
+ duet model -m <model> [--type text|image|video] [prompt]
19
20
  duet send-feedback [--file <path>] [text...]
20
21
  duet upgrade [--manager npm|bun|pnpm|yarn]
21
22
  echo "prompt" | duet
@@ -25,6 +26,7 @@ COMMANDS
25
26
  env Manually create or update the shared duet env file with provider API keys
26
27
  skills List installed skills + collisions as JSON
27
28
  memory Open a TUI to view, edit, and delete observational memories (alias: memories)
29
+ model Call a gateway model directly (text/image/video) via the AI SDK
28
30
  send-feedback Send free-form markdown feedback to the Duet team
29
31
  upgrade Upgrade the global ${packageName} installation
30
32
 
@@ -87,6 +89,8 @@ EXAMPLES
87
89
  duet login
88
90
  duet env
89
91
  duet memory
92
+ duet model -m openai/gpt-5.5 "write a haiku about gateways"
93
+ duet model -m black-forest-labs/flux-1.1-pro -o art.png "a fox in snow"
90
94
  duet train ./docs/my-project
91
95
  duet send-feedback "the TUI flickers when..."
92
96
  duet upgrade
@@ -176,6 +180,8 @@ ALIASES
176
180
  duet memories
177
181
 
178
182
  SUBCOMMANDS
183
+ add Write a single user-added note memory
184
+ (run \`duet memory add --help\` for add-specific options)
179
185
  reflect Condense old global observations into reflection rows
180
186
  (run \`duet memory reflect --help\` for reflect-specific options)
181
187
 
@@ -192,6 +198,32 @@ KEYS
192
198
  q / Esc Quit
193
199
  `);
194
200
  }
201
+ export function printMemoryAddHelp() {
202
+ console.log(`
203
+ duet memory add — Write a single user-added note memory
204
+
205
+ USAGE
206
+ duet memory add [options] <content>
207
+ echo "<content>" | duet memory add [options]
208
+
209
+ DESCRIPTION
210
+ Stores a note memory into the same ~/.duet/memory.db the runner reads, so
211
+ it surfaces in the next session. Notes get a small ranking bump above
212
+ reflections (far below a 'duet train' corpus) and stay eligible for
213
+ 'duet memory reflect' compaction, folding like any observation once aged.
214
+
215
+ Content comes from the positional arguments, or from stdin when none are
216
+ given so longer memories can be piped in.
217
+
218
+ OPTIONS
219
+ --priority <level> high, medium, or low (default: medium)
220
+ --tag <tag> Attach a label; repeat to add several
221
+ --db <path> Memory database path (default: ~/.duet/memory.db)
222
+ --wait <seconds> Seconds to wait for the cross-process open-lock
223
+ (default: 30; 0 fails immediately)
224
+ -h, --help Show this help
225
+ `);
226
+ }
195
227
  export function printMemoryReflectHelp() {
196
228
  console.log(`
197
229
  duet memory reflect — Condense old global observations into reflection rows
@@ -232,6 +264,45 @@ OPTIONS
232
264
  -h, --help Show this help
233
265
  `);
234
266
  }
267
+ export function printModelHelp() {
268
+ console.log(`
269
+ duet model — Call a gateway model directly via the AI SDK
270
+
271
+ USAGE
272
+ duet model -m <model> [options] [prompt]
273
+ echo "prompt" | duet model -m <model>
274
+
275
+ DESCRIPTION
276
+ Talks to a model directly through the Vercel AI SDK pointed at the Duet
277
+ gateway, bypassing the agent harness. The request type is inferred from
278
+ the gateway model catalog (language→text, image→image, video→video) and
279
+ can be overridden with --type. Text streams to stdout; image and video
280
+ generations write files and print each path. Auth uses DUET_API_KEY.
281
+
282
+ OPTIONS
283
+ -m, --model <name> Gateway model id, e.g. openai/gpt-5.5 (required)
284
+ --type text|image|video Override the catalog-inferred request type
285
+ --image <path> Input image: vision context (text), edit source
286
+ (image), or still to animate (video)
287
+ -o, --out <path> Write output here; image/video auto-name when omitted
288
+ --system <text> System prompt for text/image-language models
289
+ --size <WxH> Image size, e.g. 1024x1024
290
+ --aspect <W:H> Aspect ratio, e.g. 16:9
291
+ --n <count> Number of outputs to generate
292
+ --seed <int> Generation seed
293
+ --duration <seconds> Video length
294
+ --resolution <WxH> Video resolution, e.g. 1280x720
295
+ --fps <int> Video frames per second
296
+ --env-file <path> Shared env file to load after cwd .env
297
+ -h, --help Show this help
298
+
299
+ EXAMPLES
300
+ duet model -m openai/gpt-5.5 "write a haiku about gateways"
301
+ duet model -m black-forest-labs/flux-1.1-pro -o art.png "a fox in snow"
302
+ duet model -m google/gemini-2.5-flash-image --type image --image src.png "add a hat"
303
+ duet model -m bytedance/seedance-1.0 --type video -o clip.mp4 "slow pan over dunes"
304
+ `);
305
+ }
235
306
  export function printTrainHelp() {
236
307
  console.log(`
237
308
  duet train — Ingest a project corpus into one durable memory observation
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/cli/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAExE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC;AAEjD,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;gDAmBkC,WAAW;;;;;;;;;;;;;gHAaqD,+BAA+B;;;;;oFAK3D,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CxG,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;wEAW0D,qBAAqB;;;;;;;;;;;;;CAa5F,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;yDAa2C,qBAAqB;;;;;;IAM1E,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;CAChC,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;CAmBb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyBb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Db,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;CAeb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,CAAC,GAAG,CAAC;oCACsB,WAAW;;;;;;;;;;;;CAY9C,CAAC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/cli/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAExE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC;AAEjD,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;gDAqBkC,WAAW;;;;;;;;;;;;;gHAaqD,+BAA+B;;;;;oFAK3D,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDxG,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;wEAW0D,qBAAqB;;;;;;;;;;;;;CAa5F,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;yDAa2C,qBAAqB;;;;;;IAM1E,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;CAChC,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;CAmBb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Bb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuBb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6Db,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;CAeb,CAAC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,CAAC,GAAG,CAAC;oCACsB,WAAW;;;;;;;;;;;;CAY9C,CAAC,CAAC;AACH,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { ObservationPriority } from "../types/memory.js";
2
+ interface AddCommandOptions {
3
+ dbPath: string;
4
+ /** Positional content joined with spaces; empty when the caller pipes via stdin instead. */
5
+ content: string;
6
+ priority: ObservationPriority;
7
+ tags: string[];
8
+ waitBudgetMs?: number;
9
+ }
10
+ interface AddCommandIO {
11
+ stdout: NodeJS.WritableStream;
12
+ stdin: NodeJS.ReadableStream & {
13
+ isTTY?: boolean;
14
+ };
15
+ }
16
+ /**
17
+ * Run `duet memory add` — write a single user-added note row into the same
18
+ * `~/.duet/memory.db` the runner reads from, so it surfaces in the next
19
+ * session. Stored as `kind: "note"` with no `sessionId`, so it lands in the
20
+ * cross-session global pack with a small `noteBias` bump (above reflections,
21
+ * far below a `duet train` corpus) and stays eligible for `duet memory
22
+ * reflect` compaction, folding like any other observation once aged.
23
+ *
24
+ * Content comes from the positional arguments, or from stdin when none are
25
+ * given so callers can pipe longer text (`echo "…" | duet memory add`).
26
+ *
27
+ * Embeddings are not computed here; the next runner session's startup
28
+ * backfill worker picks the row up and embeds it so `recall_memory` reaches it.
29
+ */
30
+ export declare function runMemoryAddCommand(args: string[], io?: AddCommandIO): Promise<void>;
31
+ /**
32
+ * Parse `duet memory add` flags and positional content. Returns `undefined`
33
+ * when `--help` was handled. Pure (no I/O) so it can be unit-tested; stdin
34
+ * fallback for empty content happens later in {@link resolveContent}.
35
+ */
36
+ export declare function parseMemoryAddArgs(args: string[]): AddCommandOptions | undefined;
37
+ export {};
38
+ //# sourceMappingURL=memory-add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-add.d.ts","sourceRoot":"","sources":["../../../src/cli/memory-add.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAK9D,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,YAAY;IACpB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,cAAc,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACpD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,GAAE,YAA+D,GAClE,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,GAAG,SAAS,CAoDhF"}
@@ -0,0 +1,149 @@
1
+ import { runMigrations } from "../memory/migrations.js";
2
+ import { MemoryLockTimeoutError } from "../memory/pglite.js";
3
+ import { MemorySession } from "../memory/session.js";
4
+ import { appendObservation } from "../memory/storage.js";
5
+ import { DEFAULT_MEMORY_DB_PATH } from "../session/session-manager.js";
6
+ import { printMemoryAddHelp } from "./help.js";
7
+ import { fail, resolveUserPath } from "./shared.js";
8
+ import { installShutdownHandlers } from "./shutdown.js";
9
+ /**
10
+ * Run `duet memory add` — write a single user-added note row into the same
11
+ * `~/.duet/memory.db` the runner reads from, so it surfaces in the next
12
+ * session. Stored as `kind: "note"` with no `sessionId`, so it lands in the
13
+ * cross-session global pack with a small `noteBias` bump (above reflections,
14
+ * far below a `duet train` corpus) and stays eligible for `duet memory
15
+ * reflect` compaction, folding like any other observation once aged.
16
+ *
17
+ * Content comes from the positional arguments, or from stdin when none are
18
+ * given so callers can pipe longer text (`echo "…" | duet memory add`).
19
+ *
20
+ * Embeddings are not computed here; the next runner session's startup
21
+ * backfill worker picks the row up and embeds it so `recall_memory` reaches it.
22
+ */
23
+ export async function runMemoryAddCommand(args, io = { stdout: process.stdout, stdin: process.stdin }) {
24
+ const options = parseMemoryAddArgs(args);
25
+ if (!options)
26
+ return;
27
+ const content = await resolveContent(options.content, io);
28
+ const session = new MemorySession({
29
+ path: options.dbPath,
30
+ openOptions: {
31
+ init: async (db) => {
32
+ await runMigrations(db);
33
+ },
34
+ },
35
+ ...(options.waitBudgetMs !== undefined ? { lockWaitBudgetMs: options.waitBudgetMs } : {}),
36
+ idleCloseMs: 60_000,
37
+ });
38
+ const removeShutdownHandlers = installShutdownHandlers(() => session.dispose());
39
+ try {
40
+ const observation = await appendObservation(session, {
41
+ kind: "note",
42
+ priority: options.priority,
43
+ source: { kind: "user" },
44
+ content,
45
+ tags: options.tags,
46
+ observedDate: new Date().toISOString().slice(0, 10),
47
+ });
48
+ if (!observation) {
49
+ fail(`Could not write memory to ${options.dbPath} (lock contention).`);
50
+ }
51
+ const tagSuffix = observation.tags.length > 0 ? ` [${observation.tags.join(", ")}]` : "";
52
+ io.stdout.write(`Added ${observation.priority}-priority memory ${observation.id} (${observation.observedDate})${tagSuffix}\n`);
53
+ }
54
+ catch (error) {
55
+ if (error instanceof MemoryLockTimeoutError) {
56
+ 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.`);
57
+ }
58
+ throw error;
59
+ }
60
+ finally {
61
+ removeShutdownHandlers();
62
+ await session.dispose();
63
+ }
64
+ }
65
+ const PRIORITIES = ["high", "medium", "low"];
66
+ /**
67
+ * Parse `duet memory add` flags and positional content. Returns `undefined`
68
+ * when `--help` was handled. Pure (no I/O) so it can be unit-tested; stdin
69
+ * fallback for empty content happens later in {@link resolveContent}.
70
+ */
71
+ export function parseMemoryAddArgs(args) {
72
+ let dbPath = DEFAULT_MEMORY_DB_PATH;
73
+ let priority = "medium";
74
+ const tags = [];
75
+ let waitBudgetMs;
76
+ const contentParts = [];
77
+ for (let i = 0; i < args.length; i++) {
78
+ const arg = args[i];
79
+ switch (arg) {
80
+ case "--db":
81
+ if (!args[i + 1] || args[i + 1]?.startsWith("-"))
82
+ fail(`Missing value for ${arg}`);
83
+ dbPath = resolveUserPath(args[++i]);
84
+ break;
85
+ case "--priority": {
86
+ const raw = args[++i];
87
+ if (!raw || !PRIORITIES.includes(raw)) {
88
+ fail(`Invalid --priority value: ${raw} (expected high, medium, or low)`);
89
+ }
90
+ priority = raw;
91
+ break;
92
+ }
93
+ case "--tag":
94
+ if (!args[i + 1] || args[i + 1]?.startsWith("-"))
95
+ fail(`Missing value for ${arg}`);
96
+ tags.push(args[++i]);
97
+ break;
98
+ case "--wait": {
99
+ const raw = args[++i];
100
+ const seconds = Number(raw);
101
+ if (!raw || !Number.isFinite(seconds) || seconds < 0) {
102
+ fail(`Invalid --wait value: ${raw} (expected non-negative number of seconds)`);
103
+ }
104
+ waitBudgetMs = Math.round(seconds * 1000);
105
+ break;
106
+ }
107
+ case "--help":
108
+ case "-h":
109
+ printMemoryAddHelp();
110
+ return undefined;
111
+ default:
112
+ if (arg.startsWith("-"))
113
+ fail(`Unknown add option: ${arg}`);
114
+ contentParts.push(arg);
115
+ }
116
+ }
117
+ return {
118
+ dbPath,
119
+ content: contentParts.join(" ").trim(),
120
+ priority,
121
+ tags,
122
+ ...(waitBudgetMs !== undefined ? { waitBudgetMs } : {}),
123
+ };
124
+ }
125
+ /**
126
+ * Resolve the memory text: positional content when present, otherwise stdin
127
+ * so longer memories can be piped in. A TTY with no content is a usage error
128
+ * rather than an indefinite wait, and empty resolved content is rejected.
129
+ */
130
+ async function resolveContent(positional, io) {
131
+ let content = positional;
132
+ if (content.length === 0) {
133
+ if (io.stdin.isTTY) {
134
+ fail("No memory content provided. Pass it as an argument or pipe via stdin.");
135
+ }
136
+ content = (await readStream(io.stdin)).trim();
137
+ }
138
+ if (content.length === 0)
139
+ fail("Refusing to add an empty memory.");
140
+ return content;
141
+ }
142
+ async function readStream(stream) {
143
+ const chunks = [];
144
+ for await (const chunk of stream) {
145
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
146
+ }
147
+ return Buffer.concat(chunks).toString("utf8");
148
+ }
149
+ //# sourceMappingURL=memory-add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-add.js","sourceRoot":"","sources":["../../../src/cli/memory-add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAgBxD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAc,EACd,KAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;IAEnE,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAE1D,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC;QAChC,IAAI,EAAE,OAAO,CAAC,MAAM;QACpB,WAAW,EAAE;YACX,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;gBACjB,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;YAC1B,CAAC;SACF;QACD,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,WAAW,EAAE,MAAM;KACpB,CAAC,CAAC;IACH,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEhF,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE;YACnD,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;YACxB,OAAO;YACP,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,YAAY,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACpD,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,6BAA6B,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,SAAS,WAAW,CAAC,QAAQ,oBAAoB,WAAW,CAAC,EAAE,KAAK,WAAW,CAAC,YAAY,IAAI,SAAS,IAAI,CAC9G,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;YAC5C,IAAI,CACF,sBAAsB,KAAK,CAAC,OAAO,gCAAgC,KAAK,CAAC,SAAS,UAChF,KAAK,CAAC,QAAQ,GAAG,IACnB,2EAA2E,CAC5E,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,sBAAsB,EAAE,CAAC;QACzB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAmC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;AAE7E;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAc;IAC/C,IAAI,MAAM,GAAG,sBAAsB,CAAC;IACpC,IAAI,QAAQ,GAAwB,QAAQ,CAAC;IAC7C,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,YAAgC,CAAC;IACrC,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACrB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,MAAM;gBACT,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;gBACnF,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAE,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAA0B,CAAC,EAAE,CAAC;oBAC7D,IAAI,CAAC,6BAA6B,GAAG,kCAAkC,CAAC,CAAC;gBAC3E,CAAC;gBACD,QAAQ,GAAG,GAA0B,CAAC;gBACtC,MAAM;YACR,CAAC;YACD,KAAK,OAAO;gBACV,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;gBACnF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAE,CAAC,CAAC;gBACtB,MAAM;YACR,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC5B,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBACrD,IAAI,CAAC,yBAAyB,GAAG,4CAA4C,CAAC,CAAC;gBACjF,CAAC;gBACD,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;gBAC1C,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,kBAAkB,EAAE,CAAC;gBACrB,OAAO,SAAS,CAAC;YACnB;gBACE,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;gBAC5D,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;QACtC,QAAQ;QACR,IAAI;QACJ,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,EAAgB;IAChE,IAAI,OAAO,GAAG,UAAU,CAAC;IACzB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,uEAAuE,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACnE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAA6B;IACrD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"memory-db.d.ts","sourceRoot":"","sources":["../../../src/cli/memory-db.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAK3F;AAED;;;;GAIG;AACH,qBAAa,QAAQ;IACC,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAvC,OAAO;IAEP;;;;;;;;;OASG;WACU,IAAI,CACf,IAAI,EAAE,MAAM,EACZ,EAAE,YAA+C,EAAE,GAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO,GAClF,OAAO,CAAC,QAAQ,CAAC;IAiBpB,yDAAyD;IACnD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAO9B;;;;;;;;;;;;OAYG;IACG,UAAU,CAAC,EACf,KAAK,EACL,MAAM,EACN,GAAgB,GACjB,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA6B1B;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAOhD;;;;;OAKG;IACG,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;YAO1D,qBAAqB;YAWrB,YAAY;IAe1B,gFAAgF;IAC1E,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D;;;;;OAKG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"memory-db.d.ts","sourceRoot":"","sources":["../../../src/cli/memory-db.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAO3F;AAED;;;;GAIG;AACH,qBAAa,QAAQ;IACC,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAvC,OAAO;IAEP;;;;;;;;;OASG;WACU,IAAI,CACf,IAAI,EAAE,MAAM,EACZ,EAAE,YAA+C,EAAE,GAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAO,GAClF,OAAO,CAAC,QAAQ,CAAC;IAiBpB,yDAAyD;IACnD,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAO9B;;;;;;;;;;;;OAYG;IACG,UAAU,CAAC,EACf,KAAK,EACL,MAAM,EACN,GAAgB,GACjB,EAAE;QACD,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAkC1B;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAOhD;;;;;OAKG;IACG,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;YAO1D,qBAAqB;YAWrB,YAAY;IAe1B,gFAAgF;IAC1E,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D;;;;;OAKG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1,6 +1,6 @@
1
1
  import { observationScore, PRIORITY_WEIGHT } from "../memory/loader.js";
2
2
  import { runMigrations } from "../memory/migrations.js";
3
- import { DEFAULT_RECENCY_HALF_LIFE_MS, DEFAULT_REFLECTION_BIAS } from "../memory/observational.js";
3
+ import { DEFAULT_MANUAL_BIAS, DEFAULT_NOTE_BIAS, DEFAULT_RECENCY_HALF_LIFE_MS, DEFAULT_REFLECTION_BIAS, } from "../memory/observational.js";
4
4
  import { DEFAULT_OPEN_LOCK_WAIT_BUDGET_MS, openPGliteWaitingForLock } from "../memory/pglite.js";
5
5
  import { readArchiveManifest, removeArchive } from "../train/archive.js";
6
6
  import { isTrainTagged, slugFromTags } from "../train/tags.js";
@@ -17,6 +17,8 @@ export function scoreObservation(observation, now = Date.now()) {
17
17
  return observationScore(observation, now, {
18
18
  recencyHalfLifeMs: DEFAULT_RECENCY_HALF_LIFE_MS,
19
19
  reflectionBias: DEFAULT_REFLECTION_BIAS,
20
+ manualBias: DEFAULT_MANUAL_BIAS,
21
+ noteBias: DEFAULT_NOTE_BIAS,
20
22
  });
21
23
  }
22
24
  /**
@@ -77,16 +79,21 @@ export class MemoryDb {
77
79
  (CASE priority WHEN 'high' THEN $1::float
78
80
  WHEN 'medium' THEN $2::float
79
81
  ELSE $3::float END)
80
- * power(0.5::float, ($6::float - last_used_at::float) / $5::float)
81
- * (CASE kind WHEN 'reflection' THEN $4::float ELSE 1.0 END)
82
+ * power(0.5::float, ($8::float - last_used_at::float) / $7::float)
83
+ * (CASE kind WHEN 'reflection' THEN $4::float
84
+ WHEN 'manual' THEN $5::float
85
+ WHEN 'note' THEN $6::float
86
+ ELSE 1.0 END)
82
87
  DESC,
83
88
  created_at DESC,
84
89
  id ASC
85
- LIMIT $7 OFFSET $8`, [
90
+ LIMIT $9 OFFSET $10`, [
86
91
  PRIORITY_WEIGHT.high,
87
92
  PRIORITY_WEIGHT.medium,
88
93
  PRIORITY_WEIGHT.low,
89
94
  DEFAULT_REFLECTION_BIAS,
95
+ DEFAULT_MANUAL_BIAS,
96
+ DEFAULT_NOTE_BIAS,
90
97
  DEFAULT_RECENCY_HALF_LIFE_MS,
91
98
  now,
92
99
  limit,
@@ -1 +1 @@
1
- {"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../../../src/cli/memory-db.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../../../src/cli/memory-db.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/cli/memory.ts"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DpE"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/cli/memory.ts"],"names":[],"mappings":"AAUA;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqEpE"}
@@ -1,6 +1,7 @@
1
1
  import { MemoryLockTimeoutError } from "../memory/pglite.js";
2
2
  import { DEFAULT_MEMORY_DB_PATH } from "../session/session-manager.js";
3
3
  import { printMemoryHelp } from "./help.js";
4
+ import { runMemoryAddCommand } from "./memory-add.js";
4
5
  import { MemoryDb } from "./memory-db.js";
5
6
  import { runMemoryReflectCommand } from "./memory-reflect.js";
6
7
  import { runMemoryTui } from "./memory-tui.js";
@@ -21,6 +22,13 @@ export async function runMemoryCommand(args) {
21
22
  await runMemoryReflectCommand(args.slice(1));
22
23
  return;
23
24
  }
25
+ // Route `duet memory add ...` to the manual-write command. Kept as a
26
+ // subcommand under `memory` so the bare `duet memory` invocation stays
27
+ // the TUI browser.
28
+ if (args[0] === "add") {
29
+ await runMemoryAddCommand(args.slice(1));
30
+ return;
31
+ }
24
32
  let dbPath = DEFAULT_MEMORY_DB_PATH;
25
33
  // Wait budget for the cross-process open-lock, in seconds. Defaults to the shared
26
34
  // `DEFAULT_OPEN_LOCK_WAIT_BUDGET_MS` (30s) inside `MemoryDb.open`; `--wait 0` opts out
@@ -1 +1 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/cli/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/cli/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { createGateway } from "ai";
2
+ /**
3
+ * The `duet model` subcommand talks to models directly through the Vercel AI
4
+ * SDK (`ai@^7`), pointed at the Duet gateway instead of the pi harness. The
5
+ * gateway re-exposes Vercel's AI Gateway under `/api/v1/ai-gateway`; the SDK's
6
+ * gateway provider speaks the versioned `/v4/ai` protocol path, and `/v1/models`
7
+ * serves the catalog. Auth is the org-scoped `DUET_API_KEY` Bearer token.
8
+ */
9
+ export declare const DUET_API_KEY_ENV = "DUET_API_KEY";
10
+ /** Capability classes the gateway tags each model with via `/v1/models`. */
11
+ export type ModelType = "language" | "image" | "video" | "embedding" | "realtime" | "reranking" | "speech" | "transcription";
12
+ /**
13
+ * Build an AI SDK gateway provider bound to the Duet proxy. Callers resolve a
14
+ * model with `gateway('<provider>/<model>')` and pass it to `generateText`,
15
+ * `generateImage`, etc. The base URL appends `/v4/ai` to the gateway origin —
16
+ * the protocol version the duet.so proxy currently serves. The custom `fetch`
17
+ * only raises the abort timeout; everything else is the platform default.
18
+ */
19
+ export declare function createDuetModelGateway(): ReturnType<typeof createGateway>;
20
+ /**
21
+ * Fetch the gateway model catalog and return a map of model id -> capability
22
+ * type. Used to validate a requested model and route it to the right generation
23
+ * call (text vs image vs video). Hits `/v1/models` directly because the catalog
24
+ * is an org-scoped read, not a generation, so it bypasses the SDK provider.
25
+ */
26
+ export declare function fetchModelCatalog(): Promise<Map<string, ModelType>>;
27
+ //# sourceMappingURL=model-gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-gateway.d.ts","sourceRoot":"","sources":["../../../src/cli/model-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAGnC;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAM/C,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GACjB,UAAU,GACV,OAAO,GACP,OAAO,GACP,WAAW,GACX,UAAU,GACV,WAAW,GACX,QAAQ,GACR,eAAe,CAAC;AAEpB;;;;;;GAMG;AACH,wBAAgB,sBAAsB,IAAI,UAAU,CAAC,OAAO,aAAa,CAAC,CAazE;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAazE"}
@@ -0,0 +1,51 @@
1
+ import { createGateway } from "ai";
2
+ import { getDuetGatewayBaseUrl } from "../model-resolution/duet-gateway.js";
3
+ /**
4
+ * The `duet model` subcommand talks to models directly through the Vercel AI
5
+ * SDK (`ai@^7`), pointed at the Duet gateway instead of the pi harness. The
6
+ * gateway re-exposes Vercel's AI Gateway under `/api/v1/ai-gateway`; the SDK's
7
+ * gateway provider speaks the versioned `/v4/ai` protocol path, and `/v1/models`
8
+ * serves the catalog. Auth is the org-scoped `DUET_API_KEY` Bearer token.
9
+ */
10
+ export const DUET_API_KEY_ENV = "DUET_API_KEY";
11
+ // Generation can be slow — image/video models routinely run for minutes — so
12
+ // requests get a 15-minute ceiling rather than the SDK/runtime default.
13
+ const GENERATION_TIMEOUT_MS = 15 * 60 * 1000;
14
+ /**
15
+ * Build an AI SDK gateway provider bound to the Duet proxy. Callers resolve a
16
+ * model with `gateway('<provider>/<model>')` and pass it to `generateText`,
17
+ * `generateImage`, etc. The base URL appends `/v4/ai` to the gateway origin —
18
+ * the protocol version the duet.so proxy currently serves. The custom `fetch`
19
+ * only raises the abort timeout; everything else is the platform default.
20
+ */
21
+ export function createDuetModelGateway() {
22
+ // Preserve `fetch.preconnect` so the wrapper still satisfies the platform
23
+ // fetch signature; only the abort timeout is overridden.
24
+ const longTimeoutFetch = Object.assign((input, init) => fetch(input, { ...init, signal: AbortSignal.timeout(GENERATION_TIMEOUT_MS) }), { preconnect: fetch.preconnect });
25
+ return createGateway({
26
+ baseURL: `${getDuetGatewayBaseUrl()}/v4/ai`,
27
+ apiKey: process.env[DUET_API_KEY_ENV],
28
+ fetch: longTimeoutFetch,
29
+ });
30
+ }
31
+ /**
32
+ * Fetch the gateway model catalog and return a map of model id -> capability
33
+ * type. Used to validate a requested model and route it to the right generation
34
+ * call (text vs image vs video). Hits `/v1/models` directly because the catalog
35
+ * is an org-scoped read, not a generation, so it bypasses the SDK provider.
36
+ */
37
+ export async function fetchModelCatalog() {
38
+ const response = await fetch(`${getDuetGatewayBaseUrl()}/v1/models`, {
39
+ headers: { Authorization: `Bearer ${process.env[DUET_API_KEY_ENV] ?? ""}` },
40
+ });
41
+ if (!response.ok) {
42
+ throw new Error(`Failed to fetch model catalog: ${response.status} ${response.statusText}`);
43
+ }
44
+ const body = (await response.json());
45
+ const catalog = new Map();
46
+ for (const model of body.data ?? []) {
47
+ catalog.set(model.id, model.type);
48
+ }
49
+ return catalog;
50
+ }
51
+ //# sourceMappingURL=model-gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-gateway.js","sourceRoot":"","sources":["../../../src/cli/model-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAE/C,6EAA6E;AAC7E,wEAAwE;AACxE,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAa7C;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB;IACpC,0EAA0E;IAC1E,yDAAyD;IACzD,MAAM,gBAAgB,GAAiB,MAAM,CAAC,MAAM,CAClD,CAAC,KAAkC,EAAE,IAAkC,EAAE,EAAE,CACzE,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC,EAC/E,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CACjC,CAAC;IACF,OAAO,aAAa,CAAC;QACnB,OAAO,EAAE,GAAG,qBAAqB,EAAE,QAAQ;QAC3C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACrC,KAAK,EAAE,gBAAgB;KACxB,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,qBAAqB,EAAE,YAAY,EAAE;QACnE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE;KAC5E,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsD,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { type ModelType } from "./model-gateway.js";
2
+ /**
3
+ * High-level capability the CLI routes a request to. The gateway catalog uses
4
+ * `language` for text models; everything else maps straight through. `--type`
5
+ * lets the user override routing when the catalog is missing or wrong.
6
+ */
7
+ type RequestType = "text" | "image" | "video";
8
+ /** Parsed `duet model` flags. Prompt is positional or read from stdin. */
9
+ interface ModelArgs {
10
+ model?: string;
11
+ type?: RequestType;
12
+ imagePath?: string;
13
+ out?: string;
14
+ system?: string;
15
+ size?: string;
16
+ aspect?: string;
17
+ n?: number;
18
+ seed?: number;
19
+ duration?: number;
20
+ resolution?: string;
21
+ fps?: number;
22
+ envFile?: string;
23
+ prompt?: string;
24
+ help: boolean;
25
+ }
26
+ /**
27
+ * Map a gateway catalog capability to the CLI request type. `language` covers
28
+ * text models, including the gemini `*-image` models that emit images as message
29
+ * files; those are still text completions, so `--type image` is what reroutes
30
+ * them. An unknown/missing catalog entry defaults to text.
31
+ */
32
+ export declare function requestTypeForCapability(type: ModelType | undefined): RequestType;
33
+ /** Language models emit images via result.files, not the image endpoint. */
34
+ export declare function usesLanguageImagePath(type: ModelType | undefined): boolean;
35
+ /**
36
+ * Generate a timestamped output filename like `model-20260629T141500-1.png`.
37
+ * Used when the user does not pass `--out` for image/video generations so each
38
+ * run lands a distinct, sortable file. Lives here so the image and video units
39
+ * share one naming scheme.
40
+ */
41
+ export declare function autoOutputFilename(extension: string, index?: number): string;
42
+ /** Run `duet model` — call a gateway model directly via the AI SDK. */
43
+ export declare function runModelCommand(args: string[]): Promise<void>;
44
+ export declare function parseArgs(args: string[]): ModelArgs;
45
+ export {};
46
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/cli/model.ts"],"names":[],"mappings":"AAWA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/F;;;;GAIG;AACH,KAAK,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAE9C,0EAA0E;AAC1E,UAAU,SAAS;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAIjF;AAED,4EAA4E;AAC5E,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAE1E;AAWD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,CAMvE;AAED,uEAAuE;AACvE,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBnE;AAoOD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CA6DnD"}