@duetso/agent 0.1.198 → 0.1.200

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 (37) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/cli/help.d.ts.map +1 -1
  3. package/dist/src/cli/help.js +43 -17
  4. package/dist/src/cli/help.js.map +1 -1
  5. package/dist/src/cli/memory-db.d.ts +26 -5
  6. package/dist/src/cli/memory-db.d.ts.map +1 -1
  7. package/dist/src/cli/memory-db.js +62 -5
  8. package/dist/src/cli/memory-db.js.map +1 -1
  9. package/dist/src/cli/memory-query.d.ts +35 -0
  10. package/dist/src/cli/memory-query.d.ts.map +1 -0
  11. package/dist/src/cli/memory-query.js +190 -0
  12. package/dist/src/cli/memory-query.js.map +1 -0
  13. package/dist/src/cli/memory.d.ts +7 -2
  14. package/dist/src/cli/memory.d.ts.map +1 -1
  15. package/dist/src/cli/memory.js +16 -42
  16. package/dist/src/cli/memory.js.map +1 -1
  17. package/dist/src/cli/model.d.ts.map +1 -1
  18. package/dist/src/cli/model.js +19 -22
  19. package/dist/src/cli/model.js.map +1 -1
  20. package/dist/src/cli/train.d.ts.map +1 -1
  21. package/dist/src/cli/train.js +22 -35
  22. package/dist/src/cli/train.js.map +1 -1
  23. package/dist/src/turn-runner/prompts.d.ts +12 -0
  24. package/dist/src/turn-runner/prompts.d.ts.map +1 -1
  25. package/dist/src/turn-runner/prompts.js +19 -1
  26. package/dist/src/turn-runner/prompts.js.map +1 -1
  27. package/dist/src/turn-runner/tools.d.ts +2 -1
  28. package/dist/src/turn-runner/tools.d.ts.map +1 -1
  29. package/dist/src/turn-runner/tools.js +7 -1
  30. package/dist/src/turn-runner/tools.js.map +1 -1
  31. package/dist/src/turn-runner/turn-runner.d.ts +3 -0
  32. package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
  33. package/dist/src/turn-runner/turn-runner.js +57 -17
  34. package/dist/src/turn-runner/turn-runner.js.map +1 -1
  35. package/dist/src/types/state-machine.d.ts +26 -0
  36. package/dist/src/types/state-machine.d.ts.map +1 -1
  37. package/package.json +1 -1
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duetso/agent",
3
- "version": "0.1.198",
3
+ "version": "0.1.200",
4
4
  "description": "An opinionated full-stack agent turn runner with native memories, interrupts, and multi-agent orchestration",
5
5
  "keywords": [
6
6
  "agent",
@@ -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,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"}
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,CAuDtC;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"}
@@ -15,7 +15,7 @@ USAGE
15
15
  duet login [--no-browser] [--skip-skill-sync]
16
16
  duet env [--env-file <path>] [--import [path]|--keys]
17
17
  duet skills [--workdir <path>]
18
- duet memory [--db <path>]
18
+ duet memory [--db <path>] [--json] [filters]
19
19
  duet model -m <model> [--type text|image|video] [prompt]
20
20
  duet send-feedback [--file <path>] [text...]
21
21
  duet upgrade [--manager npm|bun|pnpm|yarn]
@@ -25,7 +25,7 @@ COMMANDS
25
25
  login Sign in via browser; saves DUET_API_KEY and syncs default skills (recommended)
26
26
  env Manually create or update the shared duet env file with provider API keys
27
27
  skills List installed skills + collisions as JSON
28
- memory Open a TUI to view, edit, and delete observational memories (alias: memories)
28
+ memory Browse memories in a TUI, or query them with --json/filters (alias: memories)
29
29
  model Call a gateway model directly (text/image/video) via the AI SDK
30
30
  send-feedback Send free-form markdown feedback to the Duet team
31
31
  upgrade Upgrade the global ${packageName} installation
@@ -170,28 +170,54 @@ OUTPUT
170
170
  }
171
171
  export function printMemoryHelp() {
172
172
  console.log(`
173
- duet memory — Browse, edit, and delete observational memories
173
+ duet memory — Browse, query, edit, and delete observational memories
174
174
 
175
175
  USAGE
176
176
  duet memory [--db <path>] [--wait <seconds>]
177
+ duet memory [--json] [--type <kind>] [--priority <level>] [--source <origin>]
178
+ [--from <date>] [--to <date>]
177
179
  duet memory reflect [options]
178
180
 
179
181
  ALIASES
180
182
  duet memories
181
183
 
184
+ DESCRIPTION
185
+ Bare \`duet memory\` opens an interactive TUI to browse, edit, and delete
186
+ durable observations. Passing --json or any filter flag instead runs a
187
+ non-TUI, scriptable query: it prints a flat, chronological list (newest
188
+ createdAt first) of the matching observations, each carrying a computed
189
+ \`score\` field matching the runner's global-pack ranking. With --json the
190
+ output is a machine-readable array; otherwise an aligned table is printed.
191
+
192
+ Examples:
193
+ duet memory
194
+ duet memory --json --type reflection --from 2026-06-26
195
+ duet memory --json --from "$(date -u -d '24 hours ago' +%Y-%m-%dT%H:%M:%S)"
196
+
182
197
  SUBCOMMANDS
183
198
  add Write a single user-added note memory
184
199
  (run \`duet memory add --help\` for add-specific options)
185
200
  reflect Condense old global observations into reflection rows
186
201
  (run \`duet memory reflect --help\` for reflect-specific options)
187
202
 
203
+ QUERY OPTIONS
204
+ --json Emit a JSON array instead of a table (also enables query mode)
205
+ --type <kind> Filter by kind: observation | reflection | note | manual
206
+ --kind <kind> Alias for --type
207
+ --priority <level> Filter by priority: high | medium | low
208
+ --source <origin> Filter by source: user | agent | system
209
+ --from <date> Inclusive lower bound on createdAt. Accepts
210
+ YYYY-MM-DD (start of day UTC) or YYYY-MM-DDTHH:MM:SS (UTC)
211
+ --to <date> Inclusive upper bound on createdAt. Accepts
212
+ YYYY-MM-DD (end of day UTC) or YYYY-MM-DDTHH:MM:SS (UTC)
213
+
188
214
  OPTIONS
189
215
  --db <path> Memory database path (default: ~/.duet/memory.db)
190
216
  --wait <seconds> Seconds to wait for the cross-process open-lock when a peer
191
217
  duet process is holding it (default: 30; 0 fails immediately)
192
218
  -h, --help Show this help
193
219
 
194
- KEYS
220
+ KEYS (TUI)
195
221
  ↑ / ↓ Move selection
196
222
  e Edit selected memory in $EDITOR
197
223
  d Delete selected memory
@@ -287,20 +313,20 @@ OPTIONS
287
313
  -o, --out <path> Write output here; image/video auto-name when omitted
288
314
  --system <text> System prompt for text/image-language models
289
315
  --size <WxH> Image size, e.g. 1024x1024
290
- --aspect <W:H> Aspect ratio, e.g. 16:9
316
+ --aspect <W:H> Aspect ratio, e.g. 16:9
291
317
  --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
318
+ --seed <int> Generation seed
319
+ --duration <seconds> Video length
320
+ --resolution <WxH> Video resolution, e.g. 1280x720
321
+ --fps <int> Video frames per second
322
+ --env-file <path> Shared env file to load after cwd .env
323
+ -h, --help Show this help
298
324
 
299
325
  EXAMPLES
300
326
  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"
327
+ duet model -m bfl/flux-pro-1.1 -o art.png "a fox in snow"
302
328
  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"
329
+ duet model -m bytedance/seedance-2.0 --type video -o clip.mp4 "slow pan over dunes"
304
330
  `);
305
331
  }
306
332
  export function printTrainHelp() {
@@ -309,10 +335,10 @@ duet train — Ingest a project corpus into one durable memory observation
309
335
 
310
336
  USAGE
311
337
  duet train <folder> [--slug <name>] [--model <name>] [--db <path>] [--wait <seconds>]
312
- duet train list [--db <path>] [--json]
313
- duet train show <slug> [--db <path>] [--json]
314
- duet train update <slug> --content-file <path> [--db <path>] [--json]
315
- duet train delete <slug> [--db <path>] [--json]
338
+ duet train list [--db <path>] [--json] [--wait <seconds>]
339
+ duet train show <slug> [--db <path>] [--json] [--wait <seconds>]
340
+ duet train update <slug> --content-file <path> [--db <path>] [--json] [--wait <seconds>]
341
+ duet train delete <slug> [--db <path>] [--json] [--wait <seconds>]
316
342
 
317
343
  DESCRIPTION
318
344
  Launches a duet agent with the corpus folder as its working directory.
@@ -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;;;;;;;;;;;;;;;;;;;;;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"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDb,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"}
@@ -1,13 +1,23 @@
1
1
  import type { TrainListEntry, TrainRecord } from "../train/types.js";
2
- import type { Observation } from "../types/memory.js";
2
+ import type { Observation, ObservationSource } from "../types/memory.js";
3
3
  /** Rows fetched per page by the ranked, lazily-paginated TUI list. */
4
4
  export declare const MEMORY_PAGE_SIZE = 25;
5
+ export interface MemoryQueryFilters {
6
+ kind?: Observation["kind"];
7
+ priority?: Observation["priority"];
8
+ source?: ObservationSource["kind"];
9
+ fromMs?: number;
10
+ toMs?: number;
11
+ }
5
12
  /**
6
13
  * Absolute global-pack score for one observation under the CLI defaults.
7
- * Reuses the shared {@link observationScore} formula so the displayed value
8
- * tracks the runner's ranking exactly. Hardcoded to the runner's global-pack
9
- * defaults so the TUI ordering and the per-row score number match what the
10
- * runtime ranking would produce (loader.ts), with no flags to drift out of sync.
14
+ * Reuses the shared {@link observationScore} formula but layers the manual
15
+ * multiplier on top `observationScore` only applies `reflectionBias`, so
16
+ * calling it directly would under-report curated/manual rows by the manual
17
+ * multiplier. The runner's `loadGlobalPack` applies `manualBias` to
18
+ * `kind === "manual"` as a separate factor, and the value surfaced here must
19
+ * match that ranking so the TUI ordering and the per-row score number agree
20
+ * with the runtime ranking across every kind, including manual rows.
11
21
  */
12
22
  export declare function scoreObservation(observation: Observation, now?: number): number;
13
23
  /**
@@ -51,6 +61,8 @@ export declare class MemoryDb {
51
61
  offset: number;
52
62
  now?: number;
53
63
  }): Promise<Observation[]>;
64
+ /** Query observations newest-first with the optional `duet memory` query filters. */
65
+ queryObservations(filters?: MemoryQueryFilters): Promise<Observation[]>;
54
66
  /**
55
67
  * Every `duet train` row (those tagged `train`), newest-first, joined to its
56
68
  * archive manifest for headline/model/provenance. Backs `duet train list`.
@@ -76,4 +88,13 @@ export declare class MemoryDb {
76
88
  delete(id: string): Promise<void>;
77
89
  close(): Promise<void>;
78
90
  }
91
+ /**
92
+ * Open the memory database for a one-shot CLI subcommand, run `fn`, and always
93
+ * close it. Cross-process lock contention surfaces as the same friendly,
94
+ * actionable message every memory/train subcommand uses rather than a raw
95
+ * error. Shared by `duet train` management commands and `duet memory` queries.
96
+ */
97
+ export declare function withMemoryDb<T>(dbPath: string, fn: (db: MemoryDb) => Promise<T>, { waitBudgetMs }?: {
98
+ waitBudgetMs?: number;
99
+ }): Promise<T>;
79
100
  //# sourceMappingURL=memory-db.d.ts.map
@@ -1 +1 @@
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
+ {"version":3,"file":"memory-db.d.ts","sourceRoot":"","sources":["../../../src/cli/memory-db.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAIzE,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;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,qFAAqF;IAC/E,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAwBjF;;;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;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,EAChC,EAAE,YAAY,EAAE,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/C,OAAO,CAAC,CAAC,CAAC,CAqBZ"}
@@ -1,17 +1,22 @@
1
1
  import { observationScore, PRIORITY_WEIGHT } from "../memory/loader.js";
2
2
  import { runMigrations } from "../memory/migrations.js";
3
3
  import { DEFAULT_MANUAL_BIAS, DEFAULT_NOTE_BIAS, DEFAULT_RECENCY_HALF_LIFE_MS, DEFAULT_REFLECTION_BIAS, } from "../memory/observational.js";
4
- import { DEFAULT_OPEN_LOCK_WAIT_BUDGET_MS, openPGliteWaitingForLock } from "../memory/pglite.js";
4
+ import { DEFAULT_OPEN_LOCK_WAIT_BUDGET_MS, MemoryLockTimeoutError, openPGliteWaitingForLock, } from "../memory/pglite.js";
5
5
  import { readArchiveManifest, removeArchive } from "../train/archive.js";
6
6
  import { isTrainTagged, slugFromTags } from "../train/tags.js";
7
+ import { fail } from "./shared.js";
8
+ import { installShutdownHandlers } from "./shutdown.js";
7
9
  /** Rows fetched per page by the ranked, lazily-paginated TUI list. */
8
10
  export const MEMORY_PAGE_SIZE = 25;
9
11
  /**
10
12
  * Absolute global-pack score for one observation under the CLI defaults.
11
- * Reuses the shared {@link observationScore} formula so the displayed value
12
- * tracks the runner's ranking exactly. Hardcoded to the runner's global-pack
13
- * defaults so the TUI ordering and the per-row score number match what the
14
- * runtime ranking would produce (loader.ts), with no flags to drift out of sync.
13
+ * Reuses the shared {@link observationScore} formula but layers the manual
14
+ * multiplier on top `observationScore` only applies `reflectionBias`, so
15
+ * calling it directly would under-report curated/manual rows by the manual
16
+ * multiplier. The runner's `loadGlobalPack` applies `manualBias` to
17
+ * `kind === "manual"` as a separate factor, and the value surfaced here must
18
+ * match that ranking so the TUI ordering and the per-row score number agree
19
+ * with the runtime ranking across every kind, including manual rows.
15
20
  */
16
21
  export function scoreObservation(observation, now = Date.now()) {
17
22
  return observationScore(observation, now, {
@@ -101,6 +106,32 @@ export class MemoryDb {
101
106
  ]);
102
107
  return result.rows.map(rowToObservation);
103
108
  }
109
+ /** Query observations newest-first with the optional `duet memory` query filters. */
110
+ async queryObservations(filters = {}) {
111
+ const conditions = [];
112
+ const params = [];
113
+ const bind = (clause, value) => {
114
+ params.push(value);
115
+ conditions.push(clause.replace("$?", `$${params.length}`));
116
+ };
117
+ if (filters.kind !== undefined)
118
+ bind("kind = $?", filters.kind);
119
+ if (filters.priority !== undefined)
120
+ bind("priority = $?", filters.priority);
121
+ if (filters.source !== undefined)
122
+ bind("(source_json::json->>'kind') = $?", filters.source);
123
+ if (filters.fromMs !== undefined)
124
+ bind("created_at >= $?", filters.fromMs);
125
+ if (filters.toMs !== undefined)
126
+ bind("created_at <= $?", filters.toMs);
127
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
128
+ const result = await this.db.query(`SELECT id, created_at, last_used_at, session_id, kind, observed_date, referenced_date, relative_date,
129
+ time_of_day, priority, source_json, content, tags_json
130
+ FROM observations
131
+ ${where}
132
+ ORDER BY created_at DESC, id ASC`, params);
133
+ return result.rows.map(rowToObservation);
134
+ }
104
135
  /**
105
136
  * Every `duet train` row (those tagged `train`), newest-first, joined to its
106
137
  * archive manifest for headline/model/provenance. Backs `duet train list`.
@@ -164,6 +195,32 @@ export class MemoryDb {
164
195
  await this.db.close();
165
196
  }
166
197
  }
198
+ /**
199
+ * Open the memory database for a one-shot CLI subcommand, run `fn`, and always
200
+ * close it. Cross-process lock contention surfaces as the same friendly,
201
+ * actionable message every memory/train subcommand uses rather than a raw
202
+ * error. Shared by `duet train` management commands and `duet memory` queries.
203
+ */
204
+ export async function withMemoryDb(dbPath, fn, { waitBudgetMs } = {}) {
205
+ let db;
206
+ try {
207
+ db = await MemoryDb.open(dbPath, { waitBudgetMs });
208
+ }
209
+ catch (error) {
210
+ if (error instanceof MemoryLockTimeoutError) {
211
+ 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.`);
212
+ }
213
+ throw error;
214
+ }
215
+ const removeShutdownHandlers = installShutdownHandlers(() => db.close());
216
+ try {
217
+ return await fn(db);
218
+ }
219
+ finally {
220
+ removeShutdownHandlers();
221
+ await db.close();
222
+ }
223
+ }
167
224
  function rowToObservation(row) {
168
225
  return {
169
226
  id: row.id,
@@ -1 +1 @@
1
- {"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../../../src/cli/memory-db.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAI/D,sEAAsE;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAwB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IACjF,OAAO,gBAAgB,CAAC,WAAW,EAAE,GAAG,EAAE;QACxC,iBAAiB,EAAE,4BAA4B;QAC/C,cAAc,EAAE,uBAAuB;QACvC,UAAU,EAAE,mBAAmB;QAC/B,QAAQ,EAAE,iBAAiB;KAC5B,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,QAAQ;IACkB;IAArC,YAAqC,EAAU;QAAV,OAAE,GAAF,EAAE,CAAQ;IAAG,CAAC;IAEnD;;;;;;;;;OASG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,CACf,IAAY,EACZ,EAAE,YAAY,GAAG,gCAAgC,KAAgC,EAAE;QAEnF,sEAAsE;QACtE,gEAAgE;QAChE,kEAAkE;QAClE,kEAAkE;QAClE,MAAM,EAAE,GAAG,MAAM,wBAAwB,CACvC,IAAI,EACJ;YACE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;gBACvB,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;SACF,EACD,YAAY,CACb,CAAC;QACF,OAAO,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC,iDAAiD,CAClD,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,UAAU,CAAC,EACf,KAAK,EACL,MAAM,EACN,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAKjB;QACC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC;;;;;;;;;;;;;;;2BAeqB,EACrB;YACE,eAAe,CAAC,IAAI;YACpB,eAAe,CAAC,MAAM;YACtB,eAAe,CAAC,GAAG;YACnB,uBAAuB;YACvB,mBAAmB;YACnB,iBAAiB;YACjB,4BAA4B;YAC5B,GAAG;YACH,KAAK;YACL,MAAM;SACP,CACF,CAAC;QACF,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CAAC,IAAY;QACnC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QACxF,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IACrE,CAAC;IAEO,KAAK,CAAC,qBAAqB;QACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAChC;;yBAEmB,CACpB,CAAC;QACF,OAAO,MAAM,CAAC,IAAI;aACf,GAAG,CAAC,gBAAgB,CAAC;aACrB,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,WAAwB;QACjD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO;YACL,IAAI,EAAE,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,WAAW;YACnD,QAAQ,EAAE,WAAW,CAAC,EAAE;YACxB,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,YAAY,EAAE,WAAW,CAAC,YAAY;YACtC,QAAQ,EAAE,QAAQ,EAAE,QAAQ;YAC5B,KAAK,EAAE,QAAQ,EAAE,KAAK;YACtB,YAAY,EAAE,QAAQ,EAAE,YAAY;YACpC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM;YACjC,UAAU,EAAE,QAAQ,KAAK,SAAS;SACnC,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,aAAa,CAAC,EAAU,EAAE,OAAe;QAC7C,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,oDAAoD,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,wCAAwC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF;AAkBD,SAAS,gBAAgB,CAAC,GAAmB;IAC3C,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,UAAU,EAAE,GAAG,CAAC,YAAY;QAC5B,GAAG,CAAC,GAAG,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,YAAY,EAAE,GAAG,CAAC,aAAa;QAC/B,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAA0B;QAC5D,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAa;KAC5C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"memory-db.js","sourceRoot":"","sources":["../../../src/cli/memory-db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Observation } from "../types/memory.js";
2
+ import { type MemoryQueryFilters } from "./memory-db.js";
3
+ interface MemoryQueryIO {
4
+ stdout: NodeJS.WritableStream;
5
+ }
6
+ type ScoredObservation = Observation & {
7
+ score: number;
8
+ };
9
+ export interface MemoryQueryOptions {
10
+ dbPath: string;
11
+ json: boolean;
12
+ filters: MemoryQueryFilters;
13
+ waitBudgetMs?: number;
14
+ /**
15
+ * True when the invocation requested a non-TUI query — i.e. it passed
16
+ * `--json` or any filter flag. Bare `duet memory` (only `--db`/`--wait`)
17
+ * leaves this false and opens the interactive TUI instead.
18
+ */
19
+ queryMode: boolean;
20
+ }
21
+ /**
22
+ * Parse the shared `duet memory` argument set. The same flags drive both the
23
+ * interactive TUI (bare invocation) and the scriptable query (any filter or
24
+ * `--json`); `queryMode` records which path the caller asked for. Returns
25
+ * `undefined` when `--help` was handled.
26
+ */
27
+ export declare function parseMemoryArgs(args: string[]): MemoryQueryOptions | undefined;
28
+ export declare function formatMemoryTable(observations: ScoredObservation[]): string;
29
+ /**
30
+ * Run the non-TUI query path of `duet memory`: fetch the filtered rows,
31
+ * compute each row's global-pack score, and print JSON or an aligned table.
32
+ */
33
+ export declare function runMemoryQuery(options: MemoryQueryOptions, io?: MemoryQueryIO): Promise<void>;
34
+ export {};
35
+ //# sourceMappingURL=memory-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-query.d.ts","sourceRoot":"","sources":["../../../src/cli/memory-query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAwC,MAAM,oBAAoB,CAAC;AAE5F,OAAO,EAAE,KAAK,kBAAkB,EAAkC,MAAM,gBAAgB,CAAC;AAGzF,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;CAC/B;AAED,KAAK,iBAAiB,GAAG,WAAW,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAmBzD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,kBAAkB,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB;AAwCD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,kBAAkB,GAAG,SAAS,CAoE9E;AAOD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,iBAAiB,EAAE,GAAG,MAAM,CA4C3E;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,kBAAkB,EAC3B,EAAE,GAAE,aAA0C,GAC7C,OAAO,CAAC,IAAI,CAAC,CAgBf"}
@@ -0,0 +1,190 @@
1
+ import { DEFAULT_MEMORY_DB_PATH } from "../session/session-manager.js";
2
+ import { printMemoryHelp } from "./help.js";
3
+ import { scoreObservation, withMemoryDb } from "./memory-db.js";
4
+ import { fail, resolveUserPath } from "./shared.js";
5
+ /**
6
+ * Build a runtime filter list that must enumerate *every* member of `T`.
7
+ * A bare `satisfies readonly T[]` only checks each element is a valid `T`; it
8
+ * silently tolerates a missing member — that gap is how `note` dropped out of
9
+ * the kind filter and made `--type note` get rejected. This helper fails to
10
+ * compile when the array omits any union member, so adding a new
11
+ * `ObservationKind`/priority/source forces the matching filter to grow with it.
12
+ */
13
+ function exhaustiveList() {
14
+ return (list) => list;
15
+ }
16
+ const KINDS = exhaustiveList()(["observation", "reflection", "note", "manual"]);
17
+ const PRIORITIES = exhaustiveList()(["high", "medium", "low"]);
18
+ const SOURCES = exhaustiveList()(["user", "agent", "system"]);
19
+ /** Parse UTC date filters; date-only bounds cover the whole day. */
20
+ function parseDateBound(raw, flag, edge) {
21
+ if (/^\d{4}-\d{2}-\d{2}$/.test(raw)) {
22
+ const iso = `${raw}T${edge === "start" ? "00:00:00.000" : "23:59:59.999"}Z`;
23
+ const ms = Date.parse(iso);
24
+ if (Number.isNaN(ms))
25
+ fail(`Invalid ${flag} date: ${raw}`);
26
+ // Reject impossible calendar dates (e.g. 2026-02-31) that JS silently
27
+ // normalizes into a different day rather than returning NaN — otherwise a
28
+ // typo slides the createdAt window and the wrong rows get exported.
29
+ if (new Date(ms).toISOString().slice(0, 10) !== raw) {
30
+ fail(`Invalid ${flag} date: ${raw} is not a real calendar date`);
31
+ }
32
+ return ms;
33
+ }
34
+ if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/.test(raw)) {
35
+ const ms = Date.parse(`${raw}Z`);
36
+ if (Number.isNaN(ms))
37
+ fail(`Invalid ${flag} datetime: ${raw}`);
38
+ // Same round-trip guard for the datetime form (e.g. 2026-02-31T00:00:00).
39
+ if (new Date(ms).toISOString().slice(0, 19) !== raw) {
40
+ fail(`Invalid ${flag} datetime: ${raw} is not a real calendar datetime`);
41
+ }
42
+ return ms;
43
+ }
44
+ fail(`Invalid ${flag} value: ${raw} (expected YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS)`);
45
+ }
46
+ function parseEnum(raw, allowed, flag) {
47
+ if (!raw || raw.startsWith("-"))
48
+ fail(`Missing value for ${flag}`);
49
+ if (!allowed.includes(raw)) {
50
+ fail(`Invalid ${flag} value: ${raw} (expected one of ${allowed.join(", ")})`);
51
+ }
52
+ return raw;
53
+ }
54
+ /**
55
+ * Parse the shared `duet memory` argument set. The same flags drive both the
56
+ * interactive TUI (bare invocation) and the scriptable query (any filter or
57
+ * `--json`); `queryMode` records which path the caller asked for. Returns
58
+ * `undefined` when `--help` was handled.
59
+ */
60
+ export function parseMemoryArgs(args) {
61
+ let dbPath = DEFAULT_MEMORY_DB_PATH;
62
+ let json = false;
63
+ let waitBudgetMs;
64
+ let hasFilter = false;
65
+ const filters = {};
66
+ for (let i = 0; i < args.length; i++) {
67
+ const arg = args[i];
68
+ switch (arg) {
69
+ case "--db":
70
+ if (!args[i + 1] || args[i + 1]?.startsWith("-"))
71
+ fail(`Missing value for ${arg}`);
72
+ dbPath = resolveUserPath(args[++i]);
73
+ break;
74
+ // `--type` and `--kind` are aliases for the same `Observation.kind` axis.
75
+ case "--type":
76
+ case "--kind":
77
+ filters.kind = parseEnum(args[++i], KINDS, arg);
78
+ hasFilter = true;
79
+ break;
80
+ case "--priority":
81
+ filters.priority = parseEnum(args[++i], PRIORITIES, arg);
82
+ hasFilter = true;
83
+ break;
84
+ case "--source":
85
+ filters.source = parseEnum(args[++i], SOURCES, arg);
86
+ hasFilter = true;
87
+ break;
88
+ case "--from": {
89
+ const raw = args[++i];
90
+ if (!raw || raw.startsWith("-"))
91
+ fail(`Missing value for ${arg}`);
92
+ filters.fromMs = parseDateBound(raw, arg, "start");
93
+ hasFilter = true;
94
+ break;
95
+ }
96
+ case "--to": {
97
+ const raw = args[++i];
98
+ if (!raw || raw.startsWith("-"))
99
+ fail(`Missing value for ${arg}`);
100
+ filters.toMs = parseDateBound(raw, arg, "end");
101
+ hasFilter = true;
102
+ break;
103
+ }
104
+ case "--json":
105
+ json = true;
106
+ break;
107
+ case "--wait": {
108
+ const raw = args[++i];
109
+ const seconds = Number(raw);
110
+ if (!Number.isFinite(seconds) || seconds < 0) {
111
+ fail(`Invalid --wait value: ${raw} (expected non-negative number of seconds)`);
112
+ }
113
+ waitBudgetMs = seconds * 1000;
114
+ break;
115
+ }
116
+ case "--help":
117
+ case "-h":
118
+ printMemoryHelp();
119
+ return undefined;
120
+ default:
121
+ fail(`Unknown memory option: ${arg}`);
122
+ }
123
+ }
124
+ if (filters.fromMs !== undefined && filters.toMs !== undefined && filters.fromMs > filters.toMs) {
125
+ fail("--from must not be after --to");
126
+ }
127
+ return { dbPath, json, filters, waitBudgetMs, queryMode: json || hasFilter };
128
+ }
129
+ function truncate(value, max) {
130
+ const collapsed = value.replace(/\s+/g, " ");
131
+ return collapsed.length <= max ? collapsed : `${collapsed.slice(0, max - 1)}…`;
132
+ }
133
+ export function formatMemoryTable(observations) {
134
+ if (observations.length === 0) {
135
+ return "No memories matched. Adjust the filters or run `duet memory --help`.";
136
+ }
137
+ const rows = observations.map((o) => ({
138
+ created: new Date(o.createdAt).toISOString().slice(0, 10),
139
+ kind: o.kind,
140
+ priority: o.priority,
141
+ source: o.source.kind,
142
+ score: o.score.toFixed(2),
143
+ content: truncate(o.content, 60),
144
+ id: o.id,
145
+ }));
146
+ const headers = {
147
+ created: "CREATED",
148
+ kind: "KIND",
149
+ priority: "PRIORITY",
150
+ source: "SOURCE",
151
+ score: "SCORE",
152
+ content: "CONTENT",
153
+ id: "MEMORY ID",
154
+ };
155
+ const width = (key, cap) => Math.min(cap, Math.max(headers[key].length, ...rows.map((row) => row[key].length)));
156
+ const w = {
157
+ created: width("created", 10),
158
+ kind: width("kind", 11),
159
+ priority: width("priority", 8),
160
+ source: width("source", 6),
161
+ score: width("score", 8),
162
+ content: width("content", 60),
163
+ id: width("id", 20),
164
+ };
165
+ const line = (cells) => [
166
+ cells.created.padEnd(w.created),
167
+ cells.kind.padEnd(w.kind),
168
+ cells.priority.padEnd(w.priority),
169
+ cells.source.padEnd(w.source),
170
+ cells.score.padStart(w.score),
171
+ truncate(cells.content, w.content).padEnd(w.content),
172
+ cells.id,
173
+ ].join(" ");
174
+ return [line(headers), ...rows.map(line)].join("\n");
175
+ }
176
+ /**
177
+ * Run the non-TUI query path of `duet memory`: fetch the filtered rows,
178
+ * compute each row's global-pack score, and print JSON or an aligned table.
179
+ */
180
+ export async function runMemoryQuery(options, io = { stdout: process.stdout }) {
181
+ const observations = await withMemoryDb(options.dbPath, (db) => db.queryObservations(options.filters), { waitBudgetMs: options.waitBudgetMs });
182
+ // Score with a single `now` so every row's value is comparable.
183
+ const now = Date.now();
184
+ const scored = observations.map((o) => ({
185
+ ...o,
186
+ score: scoreObservation(o, now),
187
+ }));
188
+ io.stdout.write(options.json ? `${JSON.stringify(scored, null, 2)}\n` : `${formatMemoryTable(scored)}\n`);
189
+ }
190
+ //# sourceMappingURL=memory-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-query.js","sourceRoot":"","sources":["../../../src/cli/memory-query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAA2B,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQpD;;;;;;;GAOG;AACH,SAAS,cAAc;IACrB,OAAO,CAAyB,IAAyC,EAAK,EAAE,CAAC,IAAI,CAAC;AACxF,CAAC;AAED,MAAM,KAAK,GAAG,cAAc,EAAmB,CAAC,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACjG,MAAM,UAAU,GAAG,cAAc,EAAuB,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAEpF,MAAM,OAAO,GAAG,cAAc,EAAc,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAe1E,oEAAoE;AACpE,SAAS,cAAc,CAAC,GAAW,EAAE,IAAY,EAAE,IAAqB;IACtE,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,GAAG,CAAC;QAC5E,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,WAAW,IAAI,UAAU,GAAG,EAAE,CAAC,CAAC;QAC3D,sEAAsE;QACtE,0EAA0E;QAC1E,oEAAoE;QACpE,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;YACpD,IAAI,CAAC,WAAW,IAAI,UAAU,GAAG,8BAA8B,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,uCAAuC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACtD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,WAAW,IAAI,cAAc,GAAG,EAAE,CAAC,CAAC;QAC/D,0EAA0E;QAC1E,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;YACpD,IAAI,CAAC,WAAW,IAAI,cAAc,GAAG,kCAAkC,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,WAAW,IAAI,WAAW,GAAG,+CAA+C,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,SAAS,CAChB,GAAuB,EACvB,OAAqB,EACrB,IAAY;IAEZ,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACnE,IAAI,CAAE,OAA6B,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,WAAW,IAAI,WAAW,GAAG,qBAAqB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,GAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAc;IAC5C,IAAI,MAAM,GAAG,sBAAsB,CAAC;IACpC,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,YAAgC,CAAC;IACrC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,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,0EAA0E;YAC1E,KAAK,QAAQ,CAAC;YACd,KAAK,QAAQ;gBACX,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;gBAChD,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,KAAK,YAAY;gBACf,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;gBACzD,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;gBACpD,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;gBAClE,OAAO,CAAC,MAAM,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;gBACnD,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;gBAClE,OAAO,CAAC,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC/C,SAAS,GAAG,IAAI,CAAC;gBACjB,MAAM;YACR,CAAC;YACD,KAAK,QAAQ;gBACX,IAAI,GAAG,IAAI,CAAC;gBACZ,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,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;oBAC7C,IAAI,CAAC,yBAAyB,GAAG,4CAA4C,CAAC,CAAC;gBACjF,CAAC;gBACD,YAAY,GAAG,OAAO,GAAG,IAAI,CAAC;gBAC9B,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,eAAe,EAAE,CAAC;gBAClB,OAAO,SAAS,CAAC;YACnB;gBACE,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAChG,IAAI,CAAC,+BAA+B,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,IAAI,SAAS,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAW;IAC1C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,YAAiC;IACjE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,sEAAsE,CAAC;IAChF,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QACzD,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;QACrB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACzB,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAChC,EAAE,EAAE,CAAC,CAAC,EAAE;KACT,CAAC,CAAC,CAAC;IACJ,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,SAAS;QAClB,EAAE,EAAE,WAAW;KAChB,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,GAAyB,EAAE,GAAW,EAAE,EAAE,CACvD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,GAAG;QACR,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACvB,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9B,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1B,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACxB,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,CAAC;QAC7B,EAAE,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;KACpB,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,KAAqB,EAAE,EAAE,CACrC;QACE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACzB,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC7B,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7B,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACpD,KAAK,CAAC,EAAE;KACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA2B,EAC3B,KAAoB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;IAE9C,MAAM,YAAY,GAAG,MAAM,YAAY,CACrC,OAAO,CAAC,MAAM,EACd,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,CAAC,EAC7C,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CACvC,CAAC;IACF,gEAAgE;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAwB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC;QACJ,KAAK,EAAE,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC;KAChC,CAAC,CAAC,CAAC;IAEJ,EAAE,CAAC,MAAM,CAAC,KAAK,CACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CACzF,CAAC;AACJ,CAAC"}
@@ -1,6 +1,11 @@
1
1
  /**
2
- * Run `duet memory` (alias: `duet memories`) — open the memory database in a TUI for browsing,
3
- * editing, and deleting durable observations.
2
+ * Run `duet memory` (alias: `duet memories`).
3
+ *
4
+ * One entry point for fetching and viewing durable memories: bare `duet
5
+ * memory` opens the interactive TUI for browsing/editing/deleting, while
6
+ * passing `--json` or any filter flag (`--type`/`--kind`/`--priority`/
7
+ * `--source`/`--from`/`--to`) turns the same invocation into a non-TUI,
8
+ * scriptable query. `duet memory reflect` remains a separate subcommand.
4
9
  *
5
10
  * Defaults to the same `~/.duet/memory.db` the runner writes to so changes
6
11
  * propagate to the next session immediately.
@@ -1 +1 @@
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
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/cli/memory.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCpE"}