@duetso/agent 0.1.201 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -9
- package/dist/package.json +1 -1
- package/dist/src/cli/help.d.ts +1 -0
- package/dist/src/cli/help.d.ts.map +1 -1
- package/dist/src/cli/help.js +73 -26
- package/dist/src/cli/help.js.map +1 -1
- package/dist/src/cli/inline-slash.js +1 -1
- package/dist/src/cli/login.d.ts +2 -3
- package/dist/src/cli/login.d.ts.map +1 -1
- package/dist/src/cli/login.js +17 -32
- package/dist/src/cli/login.js.map +1 -1
- package/dist/src/cli/memory-add.d.ts +8 -1
- package/dist/src/cli/memory-add.d.ts.map +1 -1
- package/dist/src/cli/memory-add.js +49 -53
- package/dist/src/cli/memory-add.js.map +1 -1
- package/dist/src/cli/memory-db.d.ts +23 -0
- package/dist/src/cli/memory-db.d.ts.map +1 -1
- package/dist/src/cli/memory-db.js +48 -1
- package/dist/src/cli/memory-db.js.map +1 -1
- package/dist/src/cli/memory-json.d.ts +67 -0
- package/dist/src/cli/memory-json.d.ts.map +1 -0
- package/dist/src/cli/memory-json.js +28 -0
- package/dist/src/cli/memory-json.js.map +1 -0
- package/dist/src/cli/memory-query.d.ts +20 -1
- package/dist/src/cli/memory-query.d.ts.map +1 -1
- package/dist/src/cli/memory-query.js +45 -20
- package/dist/src/cli/memory-query.js.map +1 -1
- package/dist/src/cli/memory-recall.d.ts +53 -0
- package/dist/src/cli/memory-recall.d.ts.map +1 -0
- package/dist/src/cli/memory-recall.js +217 -0
- package/dist/src/cli/memory-recall.js.map +1 -0
- package/dist/src/cli/memory.d.ts +3 -1
- package/dist/src/cli/memory.d.ts.map +1 -1
- package/dist/src/cli/memory.js +10 -4
- package/dist/src/cli/memory.js.map +1 -1
- package/dist/src/cli/model-gateway.d.ts +3 -3
- package/dist/src/cli/model-gateway.js +3 -3
- package/dist/src/cli/rpc.d.ts +19 -5
- package/dist/src/cli/rpc.d.ts.map +1 -1
- package/dist/src/cli/rpc.js +20 -19
- package/dist/src/cli/rpc.js.map +1 -1
- package/dist/src/cli/run.d.ts +8 -0
- package/dist/src/cli/run.d.ts.map +1 -1
- package/dist/src/cli/run.js +7 -20
- package/dist/src/cli/run.js.map +1 -1
- package/dist/src/cli/send-feedback.d.ts +1 -1
- package/dist/src/cli/send-feedback.js +1 -1
- package/dist/src/cli/shared.d.ts +16 -3
- package/dist/src/cli/shared.d.ts.map +1 -1
- package/dist/src/cli/shared.js +19 -4
- package/dist/src/cli/shared.js.map +1 -1
- package/dist/src/cli/train.d.ts.map +1 -1
- package/dist/src/cli/train.js +40 -23
- package/dist/src/cli/train.js.map +1 -1
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +1 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/duet-api-url.d.ts +9 -0
- package/dist/src/lib/duet-api-url.d.ts.map +1 -0
- package/dist/src/lib/duet-api-url.js +18 -0
- package/dist/src/lib/duet-api-url.js.map +1 -0
- package/dist/src/lib/feedback.d.ts +1 -1
- package/dist/src/lib/feedback.js +4 -4
- package/dist/src/lib/feedback.js.map +1 -1
- package/dist/src/lib/login.d.ts +24 -21
- package/dist/src/lib/login.d.ts.map +1 -1
- package/dist/src/lib/login.js +50 -114
- package/dist/src/lib/login.js.map +1 -1
- package/dist/src/memory/embedding.d.ts +20 -15
- package/dist/src/memory/embedding.d.ts.map +1 -1
- package/dist/src/memory/embedding.js +26 -20
- package/dist/src/memory/embedding.js.map +1 -1
- package/dist/src/memory/recall.d.ts +44 -0
- package/dist/src/memory/recall.d.ts.map +1 -1
- package/dist/src/memory/recall.js +92 -6
- package/dist/src/memory/recall.js.map +1 -1
- package/dist/src/model-resolution/duet-gateway.d.ts +4 -3
- package/dist/src/model-resolution/duet-gateway.d.ts.map +1 -1
- package/dist/src/model-resolution/duet-gateway.js +12 -6
- package/dist/src/model-resolution/duet-gateway.js.map +1 -1
- package/dist/src/tui/app.d.ts +2 -2
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +20 -2
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/paste-controller.d.ts +3 -0
- package/dist/src/tui/paste-controller.d.ts.map +1 -1
- package/dist/src/tui/paste-controller.js +25 -0
- package/dist/src/tui/paste-controller.js.map +1 -1
- package/dist/src/tui/session-subscription.d.ts +10 -0
- package/dist/src/tui/session-subscription.d.ts.map +1 -1
- package/dist/src/tui/session-subscription.js +22 -5
- package/dist/src/tui/session-subscription.js.map +1 -1
- package/dist/src/tui/slash-commands.d.ts +4 -4
- package/dist/src/tui/slash-commands.js +4 -4
- package/dist/src/tui/step-renderer.d.ts +4 -0
- package/dist/src/tui/step-renderer.d.ts.map +1 -1
- package/dist/src/tui/step-renderer.js +41 -37
- package/dist/src/tui/step-renderer.js.map +1 -1
- package/dist/src/tui/tool-formatters.d.ts +2 -2
- package/dist/src/tui/tool-formatters.d.ts.map +1 -1
- package/dist/src/turn-runner/agent-events.d.ts +12 -1
- package/dist/src/turn-runner/agent-events.d.ts.map +1 -1
- package/dist/src/turn-runner/agent-events.js +60 -42
- package/dist/src/turn-runner/agent-events.js.map +1 -1
- package/dist/src/turn-runner/tools.d.ts.map +1 -1
- package/dist/src/turn-runner/tools.js +15 -54
- package/dist/src/turn-runner/tools.js.map +1 -1
- package/dist/src/turn-runner/turn-runner.d.ts +2 -0
- package/dist/src/turn-runner/turn-runner.d.ts.map +1 -1
- package/dist/src/turn-runner/turn-runner.js +4 -2
- package/dist/src/turn-runner/turn-runner.js.map +1 -1
- package/dist/src/types/memory.d.ts +11 -0
- package/dist/src/types/memory.d.ts.map +1 -1
- package/dist/src/types/protocol.d.ts +22 -3
- package/dist/src/types/protocol.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/src/lib/duet-app-url.d.ts +0 -10
- package/dist/src/lib/duet-app-url.d.ts.map +0 -1
- package/dist/src/lib/duet-app-url.js +0 -19
- package/dist/src/lib/duet-app-url.js.map +0 -1
- package/dist/src/lib/sync-skills.d.ts +0 -54
- package/dist/src/lib/sync-skills.d.ts.map +0 -1
- package/dist/src/lib/sync-skills.js +0 -215
- package/dist/src/lib/sync-skills.js.map +0 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { DEFAULT_MEMORY_DB_PATH } from "../session/session-manager.js";
|
|
2
2
|
import { printMemoryHelp } from "./help.js";
|
|
3
3
|
import { scoreObservation, withMemoryDb } from "./memory-db.js";
|
|
4
|
-
import {
|
|
4
|
+
import { toMemoryJson } from "./memory-json.js";
|
|
5
|
+
import { resolveUserPath, usageError } from "./shared.js";
|
|
5
6
|
/**
|
|
6
7
|
* Build a runtime filter list that must enumerate *every* member of `T`.
|
|
7
8
|
* A bare `satisfies readonly T[]` only checks each element is a valid `T`; it
|
|
@@ -14,40 +15,51 @@ function exhaustiveList() {
|
|
|
14
15
|
return (list) => list;
|
|
15
16
|
}
|
|
16
17
|
const KINDS = exhaustiveList()(["observation", "reflection", "note", "manual"]);
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
/**
|
|
19
|
+
* The canonical `--priority` and `--source` value sets, compile-time-checked
|
|
20
|
+
* to enumerate every union member. Exported so sibling memory commands
|
|
21
|
+
* (e.g. `memory add`) validate the same axes against one source of truth
|
|
22
|
+
* instead of redeclaring parallel literal lists that can silently drift.
|
|
23
|
+
*/
|
|
24
|
+
export const PRIORITIES = exhaustiveList()(["high", "medium", "low"]);
|
|
25
|
+
export const SOURCES = exhaustiveList()(["user", "agent", "system", "api", "import"]);
|
|
19
26
|
/** Parse UTC date filters; date-only bounds cover the whole day. */
|
|
20
27
|
function parseDateBound(raw, flag, edge) {
|
|
21
28
|
if (/^\d{4}-\d{2}-\d{2}$/.test(raw)) {
|
|
22
29
|
const iso = `${raw}T${edge === "start" ? "00:00:00.000" : "23:59:59.999"}Z`;
|
|
23
30
|
const ms = Date.parse(iso);
|
|
24
31
|
if (Number.isNaN(ms))
|
|
25
|
-
|
|
32
|
+
usageError(`Invalid ${flag} date: ${raw}`);
|
|
26
33
|
// Reject impossible calendar dates (e.g. 2026-02-31) that JS silently
|
|
27
34
|
// normalizes into a different day rather than returning NaN — otherwise a
|
|
28
35
|
// typo slides the createdAt window and the wrong rows get exported.
|
|
29
36
|
if (new Date(ms).toISOString().slice(0, 10) !== raw) {
|
|
30
|
-
|
|
37
|
+
usageError(`Invalid ${flag} date: ${raw} is not a real calendar date`);
|
|
31
38
|
}
|
|
32
39
|
return ms;
|
|
33
40
|
}
|
|
34
41
|
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/.test(raw)) {
|
|
35
42
|
const ms = Date.parse(`${raw}Z`);
|
|
36
43
|
if (Number.isNaN(ms))
|
|
37
|
-
|
|
44
|
+
usageError(`Invalid ${flag} datetime: ${raw}`);
|
|
38
45
|
// Same round-trip guard for the datetime form (e.g. 2026-02-31T00:00:00).
|
|
39
46
|
if (new Date(ms).toISOString().slice(0, 19) !== raw) {
|
|
40
|
-
|
|
47
|
+
usageError(`Invalid ${flag} datetime: ${raw} is not a real calendar datetime`);
|
|
41
48
|
}
|
|
42
49
|
return ms;
|
|
43
50
|
}
|
|
44
|
-
|
|
51
|
+
usageError(`Invalid ${flag} value: ${raw} (expected YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS)`);
|
|
45
52
|
}
|
|
46
|
-
|
|
53
|
+
/**
|
|
54
|
+
* Validate a flag value against a closed set, exiting `64` (usage error) on a
|
|
55
|
+
* missing or out-of-set value. Shared across memory subcommands so every enum
|
|
56
|
+
* flag reports the same message shape and exit code.
|
|
57
|
+
*/
|
|
58
|
+
export function parseEnum(raw, allowed, flag) {
|
|
47
59
|
if (!raw || raw.startsWith("-"))
|
|
48
|
-
|
|
60
|
+
usageError(`Missing value for ${flag}`);
|
|
49
61
|
if (!allowed.includes(raw)) {
|
|
50
|
-
|
|
62
|
+
usageError(`Invalid ${flag} value: ${raw} (expected one of ${allowed.join(", ")})`);
|
|
51
63
|
}
|
|
52
64
|
return raw;
|
|
53
65
|
}
|
|
@@ -68,7 +80,7 @@ export function parseMemoryArgs(args) {
|
|
|
68
80
|
switch (arg) {
|
|
69
81
|
case "--db":
|
|
70
82
|
if (!args[i + 1] || args[i + 1]?.startsWith("-"))
|
|
71
|
-
|
|
83
|
+
usageError(`Missing value for ${arg}`);
|
|
72
84
|
dbPath = resolveUserPath(args[++i]);
|
|
73
85
|
break;
|
|
74
86
|
// `--type` and `--kind` are aliases for the same `Observation.kind` axis.
|
|
@@ -85,10 +97,18 @@ export function parseMemoryArgs(args) {
|
|
|
85
97
|
filters.source = parseEnum(args[++i], SOURCES, arg);
|
|
86
98
|
hasFilter = true;
|
|
87
99
|
break;
|
|
100
|
+
case "--session": {
|
|
101
|
+
const raw = args[++i];
|
|
102
|
+
if (!raw || raw.startsWith("-"))
|
|
103
|
+
usageError(`Missing value for ${arg}`);
|
|
104
|
+
filters.sessionId = raw;
|
|
105
|
+
hasFilter = true;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
88
108
|
case "--from": {
|
|
89
109
|
const raw = args[++i];
|
|
90
110
|
if (!raw || raw.startsWith("-"))
|
|
91
|
-
|
|
111
|
+
usageError(`Missing value for ${arg}`);
|
|
92
112
|
filters.fromMs = parseDateBound(raw, arg, "start");
|
|
93
113
|
hasFilter = true;
|
|
94
114
|
break;
|
|
@@ -96,7 +116,7 @@ export function parseMemoryArgs(args) {
|
|
|
96
116
|
case "--to": {
|
|
97
117
|
const raw = args[++i];
|
|
98
118
|
if (!raw || raw.startsWith("-"))
|
|
99
|
-
|
|
119
|
+
usageError(`Missing value for ${arg}`);
|
|
100
120
|
filters.toMs = parseDateBound(raw, arg, "end");
|
|
101
121
|
hasFilter = true;
|
|
102
122
|
break;
|
|
@@ -108,7 +128,7 @@ export function parseMemoryArgs(args) {
|
|
|
108
128
|
const raw = args[++i];
|
|
109
129
|
const seconds = Number(raw);
|
|
110
130
|
if (!Number.isFinite(seconds) || seconds < 0) {
|
|
111
|
-
|
|
131
|
+
usageError(`Invalid --wait value: ${raw} (expected non-negative number of seconds)`);
|
|
112
132
|
}
|
|
113
133
|
waitBudgetMs = seconds * 1000;
|
|
114
134
|
break;
|
|
@@ -118,11 +138,11 @@ export function parseMemoryArgs(args) {
|
|
|
118
138
|
printMemoryHelp();
|
|
119
139
|
return undefined;
|
|
120
140
|
default:
|
|
121
|
-
|
|
141
|
+
usageError(`Unknown memory option: ${arg}`);
|
|
122
142
|
}
|
|
123
143
|
}
|
|
124
144
|
if (filters.fromMs !== undefined && filters.toMs !== undefined && filters.fromMs > filters.toMs) {
|
|
125
|
-
|
|
145
|
+
usageError("--from must not be after --to");
|
|
126
146
|
}
|
|
127
147
|
return { dbPath, json, filters, waitBudgetMs, queryMode: json || hasFilter };
|
|
128
148
|
}
|
|
@@ -139,7 +159,7 @@ export function formatMemoryTable(observations) {
|
|
|
139
159
|
kind: o.kind,
|
|
140
160
|
priority: o.priority,
|
|
141
161
|
source: o.source.kind,
|
|
142
|
-
score: o.
|
|
162
|
+
score: o.packScore.toFixed(2),
|
|
143
163
|
content: truncate(o.content, 60),
|
|
144
164
|
id: o.id,
|
|
145
165
|
}));
|
|
@@ -183,8 +203,13 @@ export async function runMemoryQuery(options, io = { stdout: process.stdout }) {
|
|
|
183
203
|
const now = Date.now();
|
|
184
204
|
const scored = observations.map((o) => ({
|
|
185
205
|
...o,
|
|
186
|
-
|
|
206
|
+
packScore: scoreObservation(o, now),
|
|
187
207
|
}));
|
|
188
|
-
|
|
208
|
+
if (options.json) {
|
|
209
|
+
const json = scored.map((o) => toMemoryJson(o, { packScore: o.packScore }));
|
|
210
|
+
io.stdout.write(`${JSON.stringify(json, null, 2)}\n`);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
io.stdout.write(`${formatMemoryTable(scored)}\n`);
|
|
189
214
|
}
|
|
190
215
|
//# sourceMappingURL=memory-query.js.map
|
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"memory-query.js","sourceRoot":"","sources":["../../../src/cli/memory-query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type EmbedFn } from "../memory/embedding.js";
|
|
2
|
+
import { type RecallScope } from "../memory/recall.js";
|
|
3
|
+
import type { Observation } from "../types/memory.js";
|
|
4
|
+
interface RecallCommandOptions {
|
|
5
|
+
dbPath: string;
|
|
6
|
+
/** Search text from `--query <q>` or positional args, joined with spaces. */
|
|
7
|
+
query: string;
|
|
8
|
+
scope: RecallScope;
|
|
9
|
+
/** Session id used to evaluate `--scope session|global`; ignored for `all`. */
|
|
10
|
+
sessionId?: string;
|
|
11
|
+
limit: number;
|
|
12
|
+
/** Run paraphrase expansion before fusion. Off by default to keep it cheap. */
|
|
13
|
+
expand: boolean;
|
|
14
|
+
/** Model used to generate paraphrases when `--expand` is set. */
|
|
15
|
+
model: string;
|
|
16
|
+
json: boolean;
|
|
17
|
+
waitBudgetMs?: number;
|
|
18
|
+
}
|
|
19
|
+
interface RecallCommandIO {
|
|
20
|
+
stdout: NodeJS.WritableStream;
|
|
21
|
+
/**
|
|
22
|
+
* Embedding client for the vector path. Defaults to the Duet endpoint
|
|
23
|
+
* client; tests inject a stub (or a throwing one) to exercise fusion and
|
|
24
|
+
* the keyword-only fallback without a network call.
|
|
25
|
+
*/
|
|
26
|
+
embed?: EmbedFn;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Run `duet memory recall <query>` — the CLI surface over the same hybrid
|
|
30
|
+
* retrieval pipeline the runner's `recall_memory` tool uses. Both call
|
|
31
|
+
* {@link recallMemoryExpanded}, so a query returns the same fused ranking
|
|
32
|
+
* whether it comes from the model mid-turn or from the shell.
|
|
33
|
+
*
|
|
34
|
+
* Embeddings come from the Duet endpoint via {@link createEmbeddingClient};
|
|
35
|
+
* when `DUET_API_KEY` is unset the vector path degrades to keyword-only and
|
|
36
|
+
* the output is flagged as such, matching the tool's fallback. Passing
|
|
37
|
+
* `--expand` adds model-generated paraphrases (default {@link
|
|
38
|
+
* DEFAULT_CLI_MEMORY_MODEL}) before fusion, again matching the tool.
|
|
39
|
+
*/
|
|
40
|
+
export declare function runMemoryRecallCommand(args: string[], io?: RecallCommandIO): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Parse `duet memory recall` flags and positional query. Pure (no I/O) so it
|
|
43
|
+
* can be unit-tested. Returns `undefined` when `--help` was handled.
|
|
44
|
+
*/
|
|
45
|
+
export declare function parseMemoryRecallArgs(args: string[]): RecallCommandOptions | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Render fused recall hits as an aligned table. Rows are printed in ranked
|
|
48
|
+
* order (best match first), so a RANK column carries the ordering rather than
|
|
49
|
+
* the global-pack `score` the filter-query path prints.
|
|
50
|
+
*/
|
|
51
|
+
export declare function formatRecallTable(observations: Observation[]): string;
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=memory-recall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-recall.d.ts","sourceRoot":"","sources":["../../../src/cli/memory-recall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAwB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAG7E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMtD,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,CAAC;IACnB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,MAAM,EAAE,OAAO,CAAC;IAChB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC;IAC9B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EAAE,EACd,EAAE,GAAE,eAA4C,GAC/C,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,oBAAoB,GAAG,SAAS,CAuGtF;AAOD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,MAAM,CA4CrE"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { createEmbeddingClient } from "../memory/embedding.js";
|
|
2
|
+
import { recallMemoryExpanded } from "../memory/recall.js";
|
|
3
|
+
import { DEFAULT_CLI_MEMORY_MODEL } from "../model-resolution/resolver.js";
|
|
4
|
+
import { DEFAULT_MEMORY_DB_PATH } from "../session/session-manager.js";
|
|
5
|
+
import { printMemoryRecallHelp } from "./help.js";
|
|
6
|
+
import { scoreObservation, withMemorySession } from "./memory-db.js";
|
|
7
|
+
import { toMemoryJson } from "./memory-json.js";
|
|
8
|
+
import { resolveUserPath, usageError } from "./shared.js";
|
|
9
|
+
const SCOPES = ["session", "global", "all"];
|
|
10
|
+
/**
|
|
11
|
+
* Run `duet memory recall <query>` — the CLI surface over the same hybrid
|
|
12
|
+
* retrieval pipeline the runner's `recall_memory` tool uses. Both call
|
|
13
|
+
* {@link recallMemoryExpanded}, so a query returns the same fused ranking
|
|
14
|
+
* whether it comes from the model mid-turn or from the shell.
|
|
15
|
+
*
|
|
16
|
+
* Embeddings come from the Duet endpoint via {@link createEmbeddingClient};
|
|
17
|
+
* when `DUET_API_KEY` is unset the vector path degrades to keyword-only and
|
|
18
|
+
* the output is flagged as such, matching the tool's fallback. Passing
|
|
19
|
+
* `--expand` adds model-generated paraphrases (default {@link
|
|
20
|
+
* DEFAULT_CLI_MEMORY_MODEL}) before fusion, again matching the tool.
|
|
21
|
+
*/
|
|
22
|
+
export async function runMemoryRecallCommand(args, io = { stdout: process.stdout }) {
|
|
23
|
+
const options = parseMemoryRecallArgs(args);
|
|
24
|
+
if (!options)
|
|
25
|
+
return;
|
|
26
|
+
const embed = io.embed ?? createEmbeddingClient();
|
|
27
|
+
const result = await withMemorySession(options.dbPath, (session) => recallMemoryExpanded({
|
|
28
|
+
session,
|
|
29
|
+
embed,
|
|
30
|
+
query: options.query,
|
|
31
|
+
limit: options.limit,
|
|
32
|
+
scope: options.scope,
|
|
33
|
+
...(options.sessionId ? { sessionId: options.sessionId } : {}),
|
|
34
|
+
...(options.expand ? { expansionModel: options.model } : {}),
|
|
35
|
+
}), { waitBudgetMs: options.waitBudgetMs });
|
|
36
|
+
if (options.json) {
|
|
37
|
+
// A single `now` so every row's pack score is computed against the same
|
|
38
|
+
// clock, then attach the fused relevance score the pipeline already
|
|
39
|
+
// returned per id. Emitted as a bare array of canonical memory objects,
|
|
40
|
+
// ordered best-first, matching the `duet memory` query output.
|
|
41
|
+
const now = Date.now();
|
|
42
|
+
const rows = result.observations.map((observation) => toMemoryJson(observation, {
|
|
43
|
+
packScore: scoreObservation(observation, now),
|
|
44
|
+
...(result.relevanceById.has(observation.id)
|
|
45
|
+
? { relevanceScore: result.relevanceById.get(observation.id) }
|
|
46
|
+
: {}),
|
|
47
|
+
}));
|
|
48
|
+
io.stdout.write(`${JSON.stringify(rows, null, 2)}\n`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const degraded = result.vectorSearchAttempted && !result.vectorSearchSucceeded;
|
|
52
|
+
if (degraded) {
|
|
53
|
+
io.stdout.write("Semantic search unavailable (keyword-only fallback). Run `duet login` to enable hybrid retrieval.\n");
|
|
54
|
+
}
|
|
55
|
+
io.stdout.write(`${formatRecallTable(result.observations)}\n`);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Parse `duet memory recall` flags and positional query. Pure (no I/O) so it
|
|
59
|
+
* can be unit-tested. Returns `undefined` when `--help` was handled.
|
|
60
|
+
*/
|
|
61
|
+
export function parseMemoryRecallArgs(args) {
|
|
62
|
+
let dbPath = DEFAULT_MEMORY_DB_PATH;
|
|
63
|
+
let scope = "all";
|
|
64
|
+
let sessionId;
|
|
65
|
+
let limit = 8;
|
|
66
|
+
let expand = false;
|
|
67
|
+
let model = DEFAULT_CLI_MEMORY_MODEL;
|
|
68
|
+
let json = false;
|
|
69
|
+
let waitBudgetMs;
|
|
70
|
+
const queryParts = [];
|
|
71
|
+
let flagQuery;
|
|
72
|
+
for (let i = 0; i < args.length; i++) {
|
|
73
|
+
const arg = args[i];
|
|
74
|
+
switch (arg) {
|
|
75
|
+
case "--db":
|
|
76
|
+
if (!args[i + 1] || args[i + 1]?.startsWith("-"))
|
|
77
|
+
usageError(`Missing value for ${arg}`);
|
|
78
|
+
dbPath = resolveUserPath(args[++i]);
|
|
79
|
+
break;
|
|
80
|
+
case "--scope": {
|
|
81
|
+
const raw = args[++i];
|
|
82
|
+
if (!raw || !SCOPES.includes(raw)) {
|
|
83
|
+
usageError(`Invalid --scope value: ${raw} (expected one of ${SCOPES.join(", ")})`);
|
|
84
|
+
}
|
|
85
|
+
scope = raw;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case "--session":
|
|
89
|
+
if (!args[i + 1] || args[i + 1]?.startsWith("-"))
|
|
90
|
+
usageError(`Missing value for ${arg}`);
|
|
91
|
+
sessionId = args[++i];
|
|
92
|
+
break;
|
|
93
|
+
case "--query":
|
|
94
|
+
if (!args[i + 1] || args[i + 1]?.startsWith("-"))
|
|
95
|
+
usageError(`Missing value for ${arg}`);
|
|
96
|
+
flagQuery = args[++i];
|
|
97
|
+
break;
|
|
98
|
+
case "--limit": {
|
|
99
|
+
const raw = args[++i];
|
|
100
|
+
const value = Number(raw);
|
|
101
|
+
if (!raw || !Number.isInteger(value) || value < 1) {
|
|
102
|
+
usageError(`Invalid --limit value: ${raw} (expected a positive integer)`);
|
|
103
|
+
}
|
|
104
|
+
limit = value;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case "--expand":
|
|
108
|
+
expand = true;
|
|
109
|
+
break;
|
|
110
|
+
case "--model":
|
|
111
|
+
if (!args[i + 1] || args[i + 1]?.startsWith("-"))
|
|
112
|
+
usageError(`Missing value for ${arg}`);
|
|
113
|
+
model = args[++i];
|
|
114
|
+
break;
|
|
115
|
+
case "--json":
|
|
116
|
+
json = true;
|
|
117
|
+
break;
|
|
118
|
+
case "--wait": {
|
|
119
|
+
const raw = args[++i];
|
|
120
|
+
const seconds = Number(raw);
|
|
121
|
+
if (!raw || !Number.isFinite(seconds) || seconds < 0) {
|
|
122
|
+
usageError(`Invalid --wait value: ${raw} (expected non-negative number of seconds)`);
|
|
123
|
+
}
|
|
124
|
+
waitBudgetMs = Math.round(seconds * 1000);
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
case "--help":
|
|
128
|
+
case "-h":
|
|
129
|
+
printMemoryRecallHelp();
|
|
130
|
+
return undefined;
|
|
131
|
+
default:
|
|
132
|
+
if (arg.startsWith("-"))
|
|
133
|
+
usageError(`Unknown recall option: ${arg}`);
|
|
134
|
+
queryParts.push(arg);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// `--query` and positional args are both accepted; positional is the
|
|
138
|
+
// human-friendly form. When both are present they combine, with the
|
|
139
|
+
// explicit flag first.
|
|
140
|
+
const query = [flagQuery, queryParts.join(" ")]
|
|
141
|
+
.filter((part) => Boolean(part && part.trim()))
|
|
142
|
+
.join(" ")
|
|
143
|
+
.trim();
|
|
144
|
+
if (query.length === 0) {
|
|
145
|
+
usageError("No query provided. Pass the text to recall, e.g. `duet memory recall wire budget cap`.");
|
|
146
|
+
}
|
|
147
|
+
// session/global scope filter is a no-op without an id to compare against,
|
|
148
|
+
// so require one rather than silently returning an unfiltered (or empty)
|
|
149
|
+
// result set.
|
|
150
|
+
if ((scope === "session" || scope === "global") && !sessionId) {
|
|
151
|
+
usageError(`--scope ${scope} requires --session <id> to compare against.`);
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
dbPath,
|
|
155
|
+
query,
|
|
156
|
+
scope,
|
|
157
|
+
...(sessionId ? { sessionId } : {}),
|
|
158
|
+
limit,
|
|
159
|
+
expand,
|
|
160
|
+
model,
|
|
161
|
+
json,
|
|
162
|
+
...(waitBudgetMs !== undefined ? { waitBudgetMs } : {}),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
function truncate(value, max) {
|
|
166
|
+
const collapsed = value.replace(/\s+/g, " ");
|
|
167
|
+
return collapsed.length <= max ? collapsed : `${collapsed.slice(0, max - 1)}…`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Render fused recall hits as an aligned table. Rows are printed in ranked
|
|
171
|
+
* order (best match first), so a RANK column carries the ordering rather than
|
|
172
|
+
* the global-pack `score` the filter-query path prints.
|
|
173
|
+
*/
|
|
174
|
+
export function formatRecallTable(observations) {
|
|
175
|
+
if (observations.length === 0) {
|
|
176
|
+
return "No memories matched. Try different words, `--expand`, or a wider `--scope`.";
|
|
177
|
+
}
|
|
178
|
+
const rows = observations.map((o, index) => ({
|
|
179
|
+
rank: String(index + 1),
|
|
180
|
+
created: new Date(o.createdAt).toISOString().slice(0, 10),
|
|
181
|
+
kind: o.kind,
|
|
182
|
+
priority: o.priority,
|
|
183
|
+
source: o.source.kind,
|
|
184
|
+
content: truncate(o.content, 70),
|
|
185
|
+
id: o.id,
|
|
186
|
+
}));
|
|
187
|
+
const headers = {
|
|
188
|
+
rank: "#",
|
|
189
|
+
created: "CREATED",
|
|
190
|
+
kind: "KIND",
|
|
191
|
+
priority: "PRIORITY",
|
|
192
|
+
source: "SOURCE",
|
|
193
|
+
content: "CONTENT",
|
|
194
|
+
id: "MEMORY ID",
|
|
195
|
+
};
|
|
196
|
+
const width = (key, cap) => Math.min(cap, Math.max(headers[key].length, ...rows.map((row) => row[key].length)));
|
|
197
|
+
const w = {
|
|
198
|
+
rank: width("rank", 3),
|
|
199
|
+
created: width("created", 10),
|
|
200
|
+
kind: width("kind", 11),
|
|
201
|
+
priority: width("priority", 8),
|
|
202
|
+
source: width("source", 6),
|
|
203
|
+
content: width("content", 70),
|
|
204
|
+
id: width("id", 20),
|
|
205
|
+
};
|
|
206
|
+
const line = (cells) => [
|
|
207
|
+
cells.rank.padStart(w.rank),
|
|
208
|
+
cells.created.padEnd(w.created),
|
|
209
|
+
cells.kind.padEnd(w.kind),
|
|
210
|
+
cells.priority.padEnd(w.priority),
|
|
211
|
+
cells.source.padEnd(w.source),
|
|
212
|
+
truncate(cells.content, w.content).padEnd(w.content),
|
|
213
|
+
cells.id,
|
|
214
|
+
].join(" ");
|
|
215
|
+
return [line(headers), ...rows.map(line)].join("\n");
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=memory-recall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-recall.js","sourceRoot":"","sources":["../../../src/cli/memory-recall.ts"],"names":[],"mappings":"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"}
|
package/dist/src/cli/memory.d.ts
CHANGED
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
* memory` opens the interactive TUI for browsing/editing/deleting, while
|
|
6
6
|
* passing `--json` or any filter flag (`--type`/`--kind`/`--priority`/
|
|
7
7
|
* `--source`/`--from`/`--to`) turns the same invocation into a non-TUI,
|
|
8
|
-
* scriptable query. `duet memory
|
|
8
|
+
* scriptable query. `duet memory recall` runs hybrid semantic search over the
|
|
9
|
+
* same pipeline as the runner's `recall_memory` tool, and `duet memory
|
|
10
|
+
* reflect` remains a separate subcommand.
|
|
9
11
|
*
|
|
10
12
|
* Defaults to the same `~/.duet/memory.db` the runner writes to so changes
|
|
11
13
|
* propagate to the next session immediately.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/cli/memory.ts"],"names":[],"mappings":"AASA
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/cli/memory.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyCpE"}
|
package/dist/src/cli/memory.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { MemoryLockTimeoutError } from "../memory/pglite.js";
|
|
2
2
|
import { runMemoryAddCommand } from "./memory-add.js";
|
|
3
|
-
import { MemoryDb } from "./memory-db.js";
|
|
3
|
+
import { failMemoryLockTimeout, MemoryDb } from "./memory-db.js";
|
|
4
4
|
import { parseMemoryArgs, runMemoryQuery } from "./memory-query.js";
|
|
5
|
+
import { runMemoryRecallCommand } from "./memory-recall.js";
|
|
5
6
|
import { runMemoryReflectCommand } from "./memory-reflect.js";
|
|
6
7
|
import { runMemoryTui } from "./memory-tui.js";
|
|
7
|
-
import { fail } from "./shared.js";
|
|
8
8
|
import { installShutdownHandlers } from "./shutdown.js";
|
|
9
9
|
/**
|
|
10
10
|
* Run `duet memory` (alias: `duet memories`).
|
|
@@ -13,7 +13,9 @@ import { installShutdownHandlers } from "./shutdown.js";
|
|
|
13
13
|
* memory` opens the interactive TUI for browsing/editing/deleting, while
|
|
14
14
|
* passing `--json` or any filter flag (`--type`/`--kind`/`--priority`/
|
|
15
15
|
* `--source`/`--from`/`--to`) turns the same invocation into a non-TUI,
|
|
16
|
-
* scriptable query. `duet memory
|
|
16
|
+
* scriptable query. `duet memory recall` runs hybrid semantic search over the
|
|
17
|
+
* same pipeline as the runner's `recall_memory` tool, and `duet memory
|
|
18
|
+
* reflect` remains a separate subcommand.
|
|
17
19
|
*
|
|
18
20
|
* Defaults to the same `~/.duet/memory.db` the runner writes to so changes
|
|
19
21
|
* propagate to the next session immediately.
|
|
@@ -27,6 +29,10 @@ export async function runMemoryCommand(args) {
|
|
|
27
29
|
await runMemoryAddCommand(args.slice(1));
|
|
28
30
|
return;
|
|
29
31
|
}
|
|
32
|
+
if (args[0] === "recall") {
|
|
33
|
+
await runMemoryRecallCommand(args.slice(1));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
30
36
|
const options = parseMemoryArgs(args);
|
|
31
37
|
if (!options)
|
|
32
38
|
return;
|
|
@@ -41,7 +47,7 @@ export async function runMemoryCommand(args) {
|
|
|
41
47
|
}
|
|
42
48
|
catch (error) {
|
|
43
49
|
if (error instanceof MemoryLockTimeoutError) {
|
|
44
|
-
|
|
50
|
+
failMemoryLockTimeout(error);
|
|
45
51
|
}
|
|
46
52
|
throw error;
|
|
47
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/cli/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/cli/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAc;IACnD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACtB,MAAM,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACzB,MAAM,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACzC,IAAI,EAAY,CAAC;IACjB,IAAI,CAAC;QACH,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;YAC5C,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACzE,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;YAAS,CAAC;QACT,sBAAsB,EAAE,CAAC;QACzB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -2,9 +2,9 @@ import { createGateway } from "ai";
|
|
|
2
2
|
/**
|
|
3
3
|
* The `duet model` subcommand talks to models directly through the Vercel AI
|
|
4
4
|
* SDK (`ai@^7`), pointed at the Duet gateway instead of the pi harness. The
|
|
5
|
-
* gateway
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* gateway provider speaks the versioned `/v4/ai` protocol path, and
|
|
6
|
+
* `/v1/models` serves the catalog. Auth is the workspace-scoped `DUET_API_KEY`
|
|
7
|
+
* Bearer token.
|
|
8
8
|
*/
|
|
9
9
|
export declare const DUET_API_KEY_ENV = "DUET_API_KEY";
|
|
10
10
|
/** Capability classes the gateway tags each model with via `/v1/models`. */
|
|
@@ -3,9 +3,9 @@ import { getDuetGatewayBaseUrl } from "../model-resolution/duet-gateway.js";
|
|
|
3
3
|
/**
|
|
4
4
|
* The `duet model` subcommand talks to models directly through the Vercel AI
|
|
5
5
|
* SDK (`ai@^7`), pointed at the Duet gateway instead of the pi harness. The
|
|
6
|
-
* gateway
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* gateway provider speaks the versioned `/v4/ai` protocol path, and
|
|
7
|
+
* `/v1/models` serves the catalog. Auth is the workspace-scoped `DUET_API_KEY`
|
|
8
|
+
* Bearer token.
|
|
9
9
|
*/
|
|
10
10
|
export const DUET_API_KEY_ENV = "DUET_API_KEY";
|
|
11
11
|
// Generation can be slow — image/video models routinely run for minutes — so
|
package/dist/src/cli/rpc.d.ts
CHANGED
|
@@ -35,9 +35,17 @@ export interface RpcRunner {
|
|
|
35
35
|
* recover from a bad line without losing an in-flight turn.
|
|
36
36
|
*
|
|
37
37
|
* Unlike the TUI path, RPC mode bypasses {@link SessionManager} entirely:
|
|
38
|
-
* no
|
|
39
|
-
*
|
|
40
|
-
*
|
|
38
|
+
* no `state.json`, no resume hints. Persistence policy lives with the caller.
|
|
39
|
+
* Memory still works regardless of session: `--incognito` keeps it in-process,
|
|
40
|
+
* otherwise it persists to the configured memory db.
|
|
41
|
+
*
|
|
42
|
+
* Session attribution is opt-in via the `--session <id>` spawn flag. One RPC
|
|
43
|
+
* process is one logical session (a second `start` is rejected), so the id is
|
|
44
|
+
* a construction-time config value rather than a per-turn field: it lands on
|
|
45
|
+
* `config.sessionId` before the runner is built and stamps every observation
|
|
46
|
+
* written during the process. The `start` command and `turn_started` event
|
|
47
|
+
* shape are unchanged — the caller already supplied the id, so it is not
|
|
48
|
+
* echoed back.
|
|
41
49
|
*/
|
|
42
50
|
export declare function runRpcCommand(args: string[], pkg: PackageMetadata): Promise<void>;
|
|
43
51
|
export interface ParsedRpcArgs {
|
|
@@ -53,9 +61,15 @@ export interface ParsedRpcArgs {
|
|
|
53
61
|
* default so RPC mode persists memory just like the TUI/run path.
|
|
54
62
|
*/
|
|
55
63
|
dbPath?: string;
|
|
64
|
+
/**
|
|
65
|
+
* Caller-owned session id from the `--session <id>` spawn flag. Flows into
|
|
66
|
+
* `config.sessionId` before the {@link TurnRunner} is constructed, so every
|
|
67
|
+
* observation written during the process is attributed to this session. One
|
|
68
|
+
* RPC process is one logical session; omitted when the host does not want
|
|
69
|
+
* per-session attribution (writes then carry no session id).
|
|
70
|
+
*/
|
|
71
|
+
sessionId?: string;
|
|
56
72
|
incognito: boolean;
|
|
57
|
-
/** When true, skip the on-load default-skill sync. */
|
|
58
|
-
noSkillSync: boolean;
|
|
59
73
|
}
|
|
60
74
|
/**
|
|
61
75
|
* Parse CLI args for `--rpc`. The accepted set mirrors the run command's
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../src/cli/rpc.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../../src/cli/rpc.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,kBAAkB,EAClB,4BAA4B,EAE5B,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAKhD;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,IAAI,CACF,OAAO,EAAE,OAAO,CAAC,iBAAiB,EAAE;QAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAA;KAAE,CAAC,GAC1E,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC9B,SAAS,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC/C,iBAAiB,CAAC,OAAO,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAC/D,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEvF;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,aAAa,CAoG1D;AAED,MAAM,WAAW,mBAAmB;IAClC;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;CACzC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,aAAa,CAAC,iBAAiB,CAAC,EAC1C,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAsFf;AA0BD;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,yBAAyB,CAuB9E"}
|