@plurnk/plurnk 0.66.2 → 0.67.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 +5 -5
- package/dist/agui_cli.d.ts +12 -0
- package/dist/agui_cli.d.ts.map +1 -1
- package/dist/agui_cli.js +44 -0
- package/dist/agui_cli.js.map +1 -1
- package/dist/auth.d.ts +4 -2
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/cli.d.ts +0 -14
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +0 -330
- package/dist/cli.js.map +1 -1
- package/dist/dispatcher.d.ts.map +1 -1
- package/dist/dispatcher.js +38 -172
- package/dist/dispatcher.js.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/subcommands.d.ts +11 -7
- package/dist/subcommands.d.ts.map +1 -1
- package/dist/subcommands.js +1 -1
- package/dist/subcommands.js.map +1 -1
- package/dist/transport.d.ts +0 -16
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +0 -79
- package/dist/transport.js.map +1 -1
- package/dist/tui.d.ts +5 -3
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# plurnk
|
|
2
2
|
|
|
3
|
-
Terminal client for [plurnk-service](https://github.com/plurnk/plurnk-service) — type a prompt, drive a real model loop through the plurnk DSL. CLI one-shot, interactive TUI, and read-only subcommands over
|
|
3
|
+
Terminal client for [plurnk-service](https://github.com/plurnk/plurnk-service) — type a prompt, drive a real model loop through the plurnk DSL. CLI one-shot, interactive TUI, and read-only subcommands over ONE wire: AG-UI+ (the daemon's sole client surface).
|
|
4
4
|
|
|
5
5
|
## install
|
|
6
6
|
|
|
@@ -15,12 +15,12 @@ npx @plurnk/plurnk "what is 2+2?" # client — terminal 2
|
|
|
15
15
|
Or install for keeps:
|
|
16
16
|
|
|
17
17
|
```
|
|
18
|
-
npm install -g @plurnk/plurnk # the client — lean,
|
|
18
|
+
npm install -g @plurnk/plurnk # the client — lean, a pure AG-UI+ consumer
|
|
19
19
|
npm install -g @plurnk/plurnk-service # the daemon — its own (lean) install story
|
|
20
20
|
plurnk-service # start the background daemon
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
The client is a pure
|
|
23
|
+
The client is a pure AG-UI+ consumer: it POSTs runs/actions to the daemon's module at `http://PLURNK_HOST:PLURNK_PORT` (default `127.0.0.1:3044`) and never starts one — the daemon is installed and run separately. All engine config — models, turns, providers — lives in the daemon's environment.
|
|
24
24
|
|
|
25
25
|
## use
|
|
26
26
|
|
|
@@ -34,7 +34,7 @@ plurnk models | session list | log read … # read-only subcommands
|
|
|
34
34
|
plurnk --help # full flag list
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
**Two output modes.** Default: stdout is the bare answer, stderr the trace — `plurnk "X" > a.txt` captures just the answer. `--json` (or `PLURNK_CLIENT_JSON`): one complete structured document on stdout (`response` + `turns[].ops` + `telemetry` + `usage`), stderr silent, errors as `{"error":…}`. Op *content* isn't inlined — fetch it on demand with `plurnk read <coord>`. The CLI is the integration layer: shell out, parse
|
|
37
|
+
**Two output modes.** Default: stdout is the bare answer, stderr the trace — `plurnk "X" > a.txt` captures just the answer. `--json` (or `PLURNK_CLIENT_JSON`): one complete structured document on stdout (`response` + `turns[].ops` + `telemetry` + `usage`), stderr silent, errors as `{"error":…}`. Op *content* isn't inlined — fetch it on demand with `plurnk read <coord>`. The CLI is the integration layer: shell out, parse — no protocol client to build.
|
|
38
38
|
|
|
39
39
|
**Line language** (converged across the TUI, the CLI prefixes, and plurnk.nvim's `:AI`):
|
|
40
40
|
|
|
@@ -50,7 +50,7 @@ Tab completes verbs, model aliases, file paths (`/pick`, `@file`), and DSL ops (
|
|
|
50
50
|
|
|
51
51
|
**Key flags:** `--model <alias>` · `--yolo` · `--json` · `--session/--run <name>` · `--project-root <p>` · `--max-turns <n>` · `--timeout <s>` · membership `--pick/--hide/--view <glob>` · `--manifest-items <n>` · `--md NAME=path`.
|
|
52
52
|
|
|
53
|
-
**Env:** `
|
|
53
|
+
**Env:** `PLURNK_HOST`/`PLURNK_PORT` (the daemon's one client surface, default `127.0.0.1:3044`; `PLURNK_AGUI_URL` overrides for a remote portal) · `PLURNK_CLIENT_SESSION` / `PLURNK_CLIENT_RUN` (resume) · `PLURNK_MODEL` · `PLURNK_CLIENT_YOLO` · `PLURNK_CLIENT_PROJECT_ROOT`. Shared **`~/.plurnk`** cascade with the daemon: `~/.plurnk/.env.example` < `~/.plurnk/.env` < `./.env` < `--env-file`/`--env-file-if-exists` < shell. The client ships no `.env.example` of its own — the floor is the daemon's; the client just reads `PLURNK_HOST`/`PLURNK_PORT` from it (and works with no config at all).
|
|
54
54
|
|
|
55
55
|
## what plurnk is
|
|
56
56
|
|
package/dist/agui_cli.d.ts
CHANGED
|
@@ -38,6 +38,12 @@ export interface CliRunSinks {
|
|
|
38
38
|
yolo: boolean;
|
|
39
39
|
noReviewChannel: boolean;
|
|
40
40
|
review: (p: ProposalParams) => Promise<Resolution>;
|
|
41
|
+
onActionResult?: (v: {
|
|
42
|
+
kind: string;
|
|
43
|
+
ok: boolean;
|
|
44
|
+
result?: unknown;
|
|
45
|
+
error?: string;
|
|
46
|
+
}) => void;
|
|
41
47
|
}
|
|
42
48
|
export declare const consumeCliRun: (events: AsyncIterable<AguiEvent>, io: CliRunSinks) => Promise<CliRunResult>;
|
|
43
49
|
export declare const runCliViaBridge: (target: BridgeTarget, prompt: string, opts: {
|
|
@@ -46,5 +52,11 @@ export declare const runCliViaBridge: (target: BridgeTarget, prompt: string, opt
|
|
|
46
52
|
json: boolean;
|
|
47
53
|
projectRoot?: string | null;
|
|
48
54
|
}) => Promise<number>;
|
|
55
|
+
export declare const runScriptViaBridge: (target: BridgeTarget, text: string, opts: {
|
|
56
|
+
threadId: string;
|
|
57
|
+
yolo: boolean;
|
|
58
|
+
json: boolean;
|
|
59
|
+
projectRoot?: string | null;
|
|
60
|
+
}) => Promise<number>;
|
|
49
61
|
export {};
|
|
50
62
|
//# sourceMappingURL=agui_cli.d.ts.map
|
package/dist/agui_cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agui_cli.d.ts","sourceRoot":"","sources":["../src/agui_cli.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAkB,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAErF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAgB,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAO5E,UAAU,eAAe;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CACjK;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAC;IAGjB,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACtG,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,SAAS,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"agui_cli.d.ts","sourceRoot":"","sources":["../src/agui_cli.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAkB,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAErF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,OAAO,EAAgB,KAAK,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AAO5E,UAAU,eAAe;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CACjK;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAC;IAGjB,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACtG,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,SAAS,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IACnD,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACjG;AAkBD,eAAO,MAAM,aAAa,WAAkB,aAAa,CAAC,SAAS,CAAC,MAAM,WAAW,KAAG,OAAO,CAAC,YAAY,CA6D3G,CAAC;AAMF,eAAO,MAAM,eAAe,WAChB,YAAY,UACZ,MAAM,QACR;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,KACtF,OAAO,CAAC,MAAM,CAqDhB,CAAC;AAIF,eAAO,MAAM,kBAAkB,WACnB,YAAY,QACd,MAAM,QACN;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,KACtF,OAAO,CAAC,MAAM,CAoChB,CAAC"}
|
package/dist/agui_cli.js
CHANGED
|
@@ -91,6 +91,9 @@ export const consumeCliRun = async (events, io) => {
|
|
|
91
91
|
finalStatus = terminated.finalStatus; // authoritative outcome
|
|
92
92
|
hitMaxTurns = terminated.hitMaxTurns;
|
|
93
93
|
}
|
|
94
|
+
else if (name === "plurnk.action.result") {
|
|
95
|
+
io.onActionResult?.(value);
|
|
96
|
+
}
|
|
94
97
|
else if (name === "plurnk.telemetry") {
|
|
95
98
|
if (io.json)
|
|
96
99
|
telemetry.push(value);
|
|
@@ -174,4 +177,45 @@ export const runCliViaBridge = async (target, prompt, opts) => {
|
|
|
174
177
|
}
|
|
175
178
|
return result.exitCode;
|
|
176
179
|
};
|
|
180
|
+
// Script mode over AG-UI+ (one op.parse action; gated ops pause/resume like any run).
|
|
181
|
+
// Exit honesty matches the WS runScript: worst op status ≥400 → 4, else 0.
|
|
182
|
+
export const runScriptViaBridge = async (target, text, opts) => {
|
|
183
|
+
const noReviewChannel = !opts.yolo && process.stdin.isTTY !== true;
|
|
184
|
+
let parse = null;
|
|
185
|
+
const io = {
|
|
186
|
+
out: (s) => process.stdout.write(s),
|
|
187
|
+
err: (s) => process.stderr.write(s),
|
|
188
|
+
telemetry: (e) => report(e),
|
|
189
|
+
json: opts.json, yolo: opts.yolo, noReviewChannel,
|
|
190
|
+
review: reviewProposal,
|
|
191
|
+
onActionResult: (v) => {
|
|
192
|
+
if (v.kind !== "op.parse")
|
|
193
|
+
return;
|
|
194
|
+
if (!v.ok)
|
|
195
|
+
throw new Error(`op.parse failed: ${v.error ?? "unknown"}`);
|
|
196
|
+
parse = v.result;
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
const started = Date.now();
|
|
200
|
+
const forwardedProps = {
|
|
201
|
+
action: { kind: "op.parse", text },
|
|
202
|
+
...(opts.projectRoot !== undefined && opts.projectRoot !== null ? { projectRoot: opts.projectRoot } : {}),
|
|
203
|
+
};
|
|
204
|
+
let next = { messages: [], forwardedProps };
|
|
205
|
+
let result = await consumeCliRun(runViaBridge(target, { threadId: opts.threadId, ...next }), io);
|
|
206
|
+
while (result.pendingResume !== null) {
|
|
207
|
+
const r = result.pendingResume;
|
|
208
|
+
next = { messages: [{ role: "tool", toolCallId: `prop:${r.logEntryId}`, content: JSON.stringify({ decision: r.decision, ...(r.body !== undefined ? { body: r.body } : {}) }) }] };
|
|
209
|
+
result = await consumeCliRun(runViaBridge(target, { threadId: opts.threadId, ...next }), io);
|
|
210
|
+
}
|
|
211
|
+
const results = parse === null ? [] : parse.results;
|
|
212
|
+
const worst = results.reduce((w, r) => (r.status > w ? r.status : w), 0);
|
|
213
|
+
const exitCode = worst >= 400 ? 4 : 0;
|
|
214
|
+
if (opts.json) {
|
|
215
|
+
process.stdout.write(`${JSON.stringify({ schemaVersion: 1, script: true, results, worst, exitCode, wallMs: Date.now() - started })}\n`);
|
|
216
|
+
return exitCode;
|
|
217
|
+
}
|
|
218
|
+
process.stderr.write(`\n${results.length} op${results.length === 1 ? "" : "s"}, ${Date.now() - started}ms${worst >= 400 ? `, worst status ${worst}` : ""}\n`);
|
|
219
|
+
return exitCode;
|
|
220
|
+
};
|
|
177
221
|
//# sourceMappingURL=agui_cli.js.map
|
package/dist/agui_cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agui_cli.js","sourceRoot":"","sources":["../src/agui_cli.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,8EAA8E;AAC9E,iFAAiF;AACjF,kFAAkF;AAClF,6EAA6E;AAC7E,iFAAiF;AACjF,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,mFAAmF;AAEnF,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAwC,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,WAAqE,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,YAAY,EAAqC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"agui_cli.js","sourceRoot":"","sources":["../src/agui_cli.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,8EAA8E;AAC9E,iFAAiF;AACjF,kFAAkF;AAClF,6EAA6E;AAC7E,iFAAiF;AACjF,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,mFAAmF;AAEnF,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAwC,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,WAAqE,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,YAAY,EAAqC,MAAM,WAAW,CAAC;AAuC5E,mFAAmF;AACnF,4EAA4E;AAC5E,sFAAsF;AACtF,MAAM,cAAc,GAAG,KAAK,EAAE,CAAiB,EAAE,EAAe,EAA4F,EAAE;IAC1J,IAAI,EAAE,CAAC,IAAI;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrE,IAAI,EAAE,CAAC,eAAe;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAChF,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5I,CAAC,CAAC;AAEF,0EAA0E;AAC1E,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,mDAAmD;AACnD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,MAAgC,EAAE,EAAe,EAAyB,EAAE;IAC5G,IAAI,WAAW,GAAG,GAAG,CAAC;IACtB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,UAAU,GAA2B,IAAI,CAAC;IAC9C,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,IAAI,aAAa,GAAkC,IAAI,CAAC;IACxD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,CAAE,CAAuB,CAAC,IAAI,CAAC,CAAC;YACnD,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YAC7D,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,CAAE,CAA0B,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;YACjF,IAAI,CAAC,EAAE,CAAC,IAAI;gBAAE,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAE,CAA0B,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;YAC/E,SAAS;QACb,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAAC,MAAM,GAAG,MAAM,CAAE,CAA8B,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YAAC,QAAQ,GAAG,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QACjI,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAAC,QAAQ,IAAI,MAAM,CAAE,CAAyB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACxI,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAA4B,CAAC;YACvF,aAAa,GAAG,MAAM,cAAc,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAA+B,EAAE,EAAE,CAAC,CAAC;YACrH,SAAS;QACb,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS,CAAG,6CAA6C;QAClF,MAAM,IAAI,GAAI,CAAuB,CAAC,IAAI,CAAC;QAC3C,MAAM,KAAK,GAAI,CAAyB,CAAC,KAAK,CAAC;QAC/C,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,KAAqB,CAAC;YACpC,MAAM,KAAK,GAAI,KAA6B,CAAC,MAAM,CAAC;YACpD,IAAI,UAAU,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,UAAU,GAAG,KAAK,CAAC;YACrG,IAAI,mBAAmB,CAAC,KAAK,CAAC;gBAAE,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC5E,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAAC,SAAS;YAAC,CAAC;YAC/C,EAAE,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,EAAE,CAAC,GAAG,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;QACnF,CAAC;aAAM,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACtC,UAAU,GAAG,KAAwB,CAAC;YACtC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,CAAG,wBAAwB;YAChE,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;QACzC,CAAC;aAAM,IAAI,IAAI,KAAK,sBAAsB,EAAE,CAAC;YACzC,EAAE,CAAC,cAAc,EAAE,CAAC,KAAwE,CAAC,CAAC;QAClG,CAAC;aAAM,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;YACrC,IAAI,EAAE,CAAC,IAAI;gBAAE,SAAS,CAAC,IAAI,CAAC,KAAuB,CAAC,CAAC;;gBAAM,EAAE,CAAC,SAAS,CAAC,KAAuB,CAAC,CAAC;QACrG,CAAC;aAAM,IAAI,IAAI,KAAK,eAAe,EAAE,CAAC;YAClC,qEAAqE;YACrE,yEAAyE;YACzE,+DAA+D;YAC/D,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;gBACX,IAAI,OAAQ,KAAmC,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;oBACvE,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,KAA+B,CAAC,IAAI,CAAC,CAAC;gBACtE,CAAC;qBAAM,CAAC;oBACJ,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAA2B,CAAC,CAAC;oBACxD,IAAI,IAAI,KAAK,IAAI;wBAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;gBAC3C,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;AACxI,CAAC,CAAC;AAEF,2EAA2E;AAC3E,4EAA4E;AAC5E,+EAA+E;AAC/E,mDAAmD;AACnD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAChC,MAAoB,EACpB,MAAc,EACd,IAAqF,EACtE,EAAE;IACjB,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IACnE,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,SAAS,aAAa,MAAM,MAAM,CAAC,CAAC;IAC3F,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACnI,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,EAAE,GAAG;QACP,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,SAAS,EAAE,CAAC,CAA+B,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,eAAe;QACf,MAAM,EAAE,cAAc;KACzB,CAAC;IACF,2EAA2E;IAC3E,8EAA8E;IAC9E,iDAAiD;IACjD,IAAI,IAAI,GAA6G,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IAChJ,IAAI,MAAM,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACjG,OAAO,MAAM,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC;QAC/B,IAAI,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAClL,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAChG,MAAM,GAAG;YACL,GAAG,GAAG;YACN,OAAO,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;YAC5C,SAAS,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC;YAClD,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ;YAClE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU;SAClD,CAAC;IACN,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;QAC5B,MAAM,GAAG,GAAG,eAAe,CAAC;YACxB,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,SAAS,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE;YACvD,MAAM;YACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,MAAM,EAAE;gBACJ,MAAM,EAAE,CAAC,EAAE,MAAM,IAAI,CAAC;gBACtB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;gBAC1C,OAAO,EAAE,CAAC,EAAE,OAAO,IAAI,EAAE;gBACzB,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,GAAG;gBAClC,WAAW,EAAE,CAAC,EAAE,WAAW,IAAI,KAAK;gBACpC,KAAK,EAAE,CAAC,EAAE,KAAK;aAClB;YACD,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;YAC5B,QAAQ,EAAE,KAAK;SAClB,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC;AAC3B,CAAC,CAAC;AAEF,sFAAsF;AACtF,2EAA2E;AAC3E,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACnC,MAAoB,EACpB,IAAY,EACZ,IAAqF,EACtE,EAAE;IACjB,MAAM,eAAe,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IACnE,IAAI,KAAK,GAAkD,IAAI,CAAC;IAChE,MAAM,EAAE,GAAgB;QACpB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACnC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,eAAe;QACjD,MAAM,EAAE,cAAc;QACtB,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE;YAClB,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;gBAAE,OAAO;YAClC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;YACvE,KAAK,GAAG,CAAC,CAAC,MAAgD,CAAC;QAC/D,CAAC;KACJ,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,cAAc,GAA4B;QAC5C,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;QAClC,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5G,CAAC;IACF,IAAI,IAAI,GAA4F,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC;IACrI,IAAI,MAAM,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACjG,OAAO,MAAM,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC;QAC/B,IAAI,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAClL,MAAM,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,KAAgD,CAAC,OAAO,CAAC;IAChG,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QACxI,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,MAAM,MAAM,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,KAAK,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9J,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC"}
|
package/dist/auth.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
export interface Caller {
|
|
2
|
+
call(method: string, params?: object): Promise<unknown>;
|
|
3
|
+
}
|
|
2
4
|
export interface OAuthResult {
|
|
3
5
|
ok: boolean;
|
|
4
6
|
message: string;
|
|
5
7
|
}
|
|
6
|
-
export declare const runOAuth: (rpc:
|
|
8
|
+
export declare const runOAuth: (rpc: Caller, target: string, io: {
|
|
7
9
|
print: (line: string) => void;
|
|
8
10
|
sleep?: (ms: number) => Promise<void>;
|
|
9
11
|
nowMs?: () => number;
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,MAAM;IAAG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE;AAEnF,MAAM,WAAW,WAAW;IAAG,EAAE,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAkB7D,eAAO,MAAM,QAAQ,QACZ,MAAM,UACH,MAAM,MACV;IAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAA;CAAE,KACnG,OAAO,CAAC,WAAW,CAqBrB,CAAC"}
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yEAAyE;AACzE,0EAA0E;AAC1E,gFAAgF;AAChF,EAAE;AACF,iFAAiF;AACjF,iFAAiF;AACjF,sEAAsE;AACtE,+FAA+F;AAC/F,sEAAsE;AACtE,gFAAgF;AAChF,2EAA2E;AAC3E,gFAAgF;AAChF,8EAA8E;AAC9E,+BAA+B;AAE/B,OAAO,OAAO,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,yEAAyE;AACzE,0EAA0E;AAC1E,gFAAgF;AAChF,EAAE;AACF,iFAAiF;AACjF,iFAAiF;AACjF,sEAAsE;AACtE,+FAA+F;AAC/F,sEAAsE;AACtE,gFAAgF;AAChF,2EAA2E;AAC3E,gFAAgF;AAChF,8EAA8E;AAC9E,+BAA+B;AAE/B,OAAO,OAAO,MAAM,cAAc,CAAC;AAkBnC,MAAM,SAAS,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEvF,kFAAkF;AAClF,gFAAgF;AAChF,4CAA4C;AAC5C,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EACzB,GAAW,EACX,MAAc,EACd,EAAkG,EAC9E,EAAE;IACtB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,IAAI,SAAS,CAAC;IACpC,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC;IACjC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,CAAkB,CAAC;IAExE,EAAE,CAAC,KAAK,CAAC,kBAAkB,MAAM,WAAW,CAAC,CAAC;IAC9C,EAAE,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,eAAe,SAAS,EAAE,CAAC,CAAC;IACpG,EAAE,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,CAAC,uBAAuB,KAAK,SAAS;QAAE,EAAE,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,uBAAuB,GAAG,CAAC,CAAC;IAE/G,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAChD,MAAM,QAAQ,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IACzD,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QACtB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAA2B,CAAC;QACjH,IAAI,MAAM,KAAK,YAAY;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,mCAAmC,EAAE,CAAC;QACxG,IAAI,MAAM,KAAK,QAAQ;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,wBAAwB,EAAE,CAAC;QAC1F,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,uCAAuC,MAAM,QAAQ,EAAE,CAAC;QACxH,IAAI,MAAM,KAAK,WAAW;YAAE,UAAU,IAAI,KAAK,CAAC,CAAG,wCAAwC;QAC3F,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,yCAAyC,MAAM,QAAQ,EAAE,CAAC;AACpG,CAAC,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type Rpc from "./rpc.ts";
|
|
2
1
|
import type { LogEntryWire, LoopUsage } from "./render.ts";
|
|
3
2
|
import type { TelemetryEvent } from "./telemetry.ts";
|
|
4
3
|
interface SessionResult {
|
|
@@ -37,18 +36,5 @@ export declare const buildScriptJsonRecord: (input: {
|
|
|
37
36
|
telemetry: TelemetryEvent[];
|
|
38
37
|
wallMs: number;
|
|
39
38
|
}) => Record<string, unknown>;
|
|
40
|
-
export declare const runScript: (rpc: Rpc, text: string, session: SessionResult, opts: {
|
|
41
|
-
json: boolean;
|
|
42
|
-
yolo: boolean;
|
|
43
|
-
}) => Promise<number>;
|
|
44
|
-
export declare const runCli: (rpc: Rpc, prompt: string, session: SessionResult, opts: {
|
|
45
|
-
json: boolean;
|
|
46
|
-
modelAlias?: string;
|
|
47
|
-
model?: string;
|
|
48
|
-
yolo: boolean;
|
|
49
|
-
loopFlags?: Record<string, unknown>;
|
|
50
|
-
maxTurns?: number;
|
|
51
|
-
timeoutSec?: number;
|
|
52
|
-
}) => Promise<number>;
|
|
53
39
|
export {};
|
|
54
40
|
//# sourceMappingURL=cli.d.ts.map
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAmCrD,UAAU,aAAa;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAIpD,eAAO,MAAM,eAAe,gBAAiB,MAAM,eAAe,OAAO,KAAG,MAK3E,CAAC;AAUF,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAkCrC,eAAO,MAAM,eAAe,UAAW;IACnC,OAAO,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IACzD,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,SAAS,EAAE,cAAc,EAAE,CAAC;IACrD,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;IAClJ,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;CACrC,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAsBzB,CAAC;AAIF,eAAO,MAAM,cAAc,SAAU,MAAM,WAAW,MAAM,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAGpH,CAAC;AAEH,eAAO,MAAM,WAAW,UAAW,YAAY,KAAG,MAoBjD,CAAC;AAMF,eAAO,MAAM,mBAAmB,UAAW,YAAY,KAAG,OAKL,CAAC;AAGtD,eAAO,MAAM,qBAAqB,UAAW;IACzC,OAAO,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,SAAS,EAAE,cAAc,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;CACxE,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAOxB,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -2,11 +2,6 @@
|
|
|
2
2
|
// per SPEC.md §2 / TUI.md §2. Subscribes to log/entry notifications and
|
|
3
3
|
// prints each op as a plain trace line on stderr; only the terminal SEND
|
|
4
4
|
// body lands on stdout (§5.4). Suitable for piping to grep / awk / head / jq.
|
|
5
|
-
import { extractSendBody, contextGauge } from "./render.js";
|
|
6
|
-
import { reviewProposal, isServerResolved } from "./proposal.js";
|
|
7
|
-
import { report, clientProposalEditsBlocked, NO_MODEL_HINT } from "./telemetry.js";
|
|
8
|
-
import StreamTrace, { inlineable, renderInline, reportStream } from "./stream.js";
|
|
9
|
-
import { extractOpenPaths } from "./openpaths.js";
|
|
10
5
|
// Exit-code honesty (SPEC §4): a 4xx/5xx loop death is a FAILURE (4), not a
|
|
11
6
|
// user cancellation (3) — benchmark stats must distinguish them.
|
|
12
7
|
export const exitCodeForLoop = (finalStatus, hitMaxTurns) => {
|
|
@@ -118,32 +113,6 @@ export const isTerminalBroadcast = (entry) => entry.op === "SEND"
|
|
|
118
113
|
&& typeof entry.signal === "number"
|
|
119
114
|
&& (entry.signal === 200 || entry.signal === 499);
|
|
120
115
|
// One-shot exec: `plurnk "! make test"` — op.exec via the daemon, stream to
|
|
121
|
-
// conclusion, exec stdout→stdout / stderr→stderr, exit by closeStatus.
|
|
122
|
-
const runCliExec = async (rpc, command) => {
|
|
123
|
-
const concluded = new Promise((res) => {
|
|
124
|
-
rpc.onNotification("stream/concluded", (p) => res(p));
|
|
125
|
-
});
|
|
126
|
-
const result = await rpc.call("op.exec", { command });
|
|
127
|
-
if (result.status >= 400) {
|
|
128
|
-
process.stderr.write(`exec rejected: ${result.status}\n`);
|
|
129
|
-
return 4;
|
|
130
|
-
}
|
|
131
|
-
const fin = await concluded;
|
|
132
|
-
const read = await rpc.call("entry.read", { target: fin.target });
|
|
133
|
-
const channels = read.entry?.channels ?? {};
|
|
134
|
-
const out = channels.stdout?.content;
|
|
135
|
-
const err = channels.stderr?.content;
|
|
136
|
-
if (typeof out === "string" && out.length > 0)
|
|
137
|
-
process.stdout.write(out);
|
|
138
|
-
if (typeof err === "string" && err.length > 0)
|
|
139
|
-
process.stderr.write(err);
|
|
140
|
-
process.stderr.write(`exec: ${fin.closeStatus}\n`);
|
|
141
|
-
return fin.closeStatus === 200 ? 0 : fin.closeStatus === 499 ? 3 : 4;
|
|
142
|
-
};
|
|
143
|
-
// The complete client-observed record of a `plurnk script` run. Pure →
|
|
144
|
-
// unit-testable without a daemon. Mirrors buildJsonRecord's turn grouping, minus
|
|
145
|
-
// the loop-only fields (no prompt/response/usage — a straight-line script has
|
|
146
|
-
// neither a model nor a conversation).
|
|
147
116
|
export const buildScriptJsonRecord = (input) => ({
|
|
148
117
|
schemaVersion: JSON_SCHEMA_VERSION,
|
|
149
118
|
session: { id: input.session.id, name: input.session.name },
|
|
@@ -156,303 +125,4 @@ export const buildScriptJsonRecord = (input) => ({
|
|
|
156
125
|
// trace. The client is a dumb feeder: read bytes, hand the text to the daemon
|
|
157
126
|
// (which owns the grammar + dispatch), render the log/entry broadcasts, exit by
|
|
158
127
|
// worst op status. What's IN the file — flat ops today, richer topologies later
|
|
159
|
-
// — is the daemon's business; this surface never changes as the language grows.
|
|
160
|
-
export const runScript = async (rpc, text, session, opts) => {
|
|
161
|
-
const json = opts.json;
|
|
162
|
-
const entries = [];
|
|
163
|
-
const telemetryEvents = [];
|
|
164
|
-
if (!json)
|
|
165
|
-
process.stderr.write(`session: ${session.name}\n\n`);
|
|
166
|
-
rpc.onNotification("log/entry", (params) => {
|
|
167
|
-
const p = params;
|
|
168
|
-
if (json) {
|
|
169
|
-
entries.push(p.entry);
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
process.stderr.write(`${formatPlain(p.entry)}\n`);
|
|
173
|
-
if (!isTerminalBroadcast(p.entry))
|
|
174
|
-
return;
|
|
175
|
-
const out = extractSendBody(p.entry.tx, /* prettify */ false);
|
|
176
|
-
if (out.length > 0)
|
|
177
|
-
process.stdout.write(`${out}\n`);
|
|
178
|
-
});
|
|
179
|
-
rpc.onNotification("telemetry/event", (params) => {
|
|
180
|
-
const p = params;
|
|
181
|
-
if (json) {
|
|
182
|
-
telemetryEvents.push(p.event);
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
|
-
report(p.event);
|
|
186
|
-
});
|
|
187
|
-
// Side-effecting ops (EDIT/MOVE/COPY) pause for review — same three paths as
|
|
188
|
-
// the loop: --yolo auto-accepts, a TTY reviews interactively, a non-TTY with
|
|
189
|
-
// no review channel auto-rejects locally. op.parse has no noProposals flag, so
|
|
190
|
-
// the client MUST settle the proposal or the daemon's dispatch hangs.
|
|
191
|
-
const noReviewChannel = !opts.yolo && process.stdin.isTTY !== true;
|
|
192
|
-
if (noReviewChannel && !json)
|
|
193
|
-
report(clientProposalEditsBlocked());
|
|
194
|
-
rpc.onNotification("loop/proposal", (params) => {
|
|
195
|
-
const p = params;
|
|
196
|
-
void (async () => {
|
|
197
|
-
if (isServerResolved(p))
|
|
198
|
-
return;
|
|
199
|
-
if (opts.yolo) {
|
|
200
|
-
await rpc.call("loop.resolve", { logEntryId: p.logEntryId, decision: "accept", outcome: "client_yolo" });
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
if (noReviewChannel) {
|
|
204
|
-
await rpc.call("loop.resolve", { logEntryId: p.logEntryId, decision: "reject", outcome: "no_review_channel" });
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
const resolution = await reviewProposal(p);
|
|
208
|
-
await rpc.call("loop.resolve", { logEntryId: p.logEntryId, ...resolution });
|
|
209
|
-
})();
|
|
210
|
-
});
|
|
211
|
-
// EXEC ops narrate via stream/event — same coalescing as the loop.
|
|
212
|
-
const streams = new StreamTrace();
|
|
213
|
-
rpc.onNotification("stream/event", (params) => {
|
|
214
|
-
if (json)
|
|
215
|
-
return;
|
|
216
|
-
const line = streams.event(params);
|
|
217
|
-
if (line !== null)
|
|
218
|
-
reportStream(line);
|
|
219
|
-
});
|
|
220
|
-
rpc.onNotification("stream/concluded", (params) => {
|
|
221
|
-
if (json)
|
|
222
|
-
return;
|
|
223
|
-
const p = params;
|
|
224
|
-
reportStream(streams.concluded(p));
|
|
225
|
-
void rpc.call("entry.read", { target: p.target }).then((r) => {
|
|
226
|
-
const channels = r.entry?.channels ?? {};
|
|
227
|
-
for (const name of ["stdout", "stderr"]) {
|
|
228
|
-
const content = channels[name]?.content;
|
|
229
|
-
if (typeof content === "string" && inlineable(content))
|
|
230
|
-
reportStream(renderInline(name, content));
|
|
231
|
-
}
|
|
232
|
-
}).catch(() => { });
|
|
233
|
-
});
|
|
234
|
-
// op.parse fires its log/entry notifications BEFORE the response (svc #253),
|
|
235
|
-
// so entries[] is complete the moment this resolves.
|
|
236
|
-
const start = Date.now();
|
|
237
|
-
const { results } = await rpc.call("op.parse", { text });
|
|
238
|
-
const wallMs = Date.now() - start;
|
|
239
|
-
// Exit honesty: worst op status drives the code. Any 4xx/5xx → 4 (failure);
|
|
240
|
-
// all clear → 0. A straight-line script has no cancellation/max-turns cases.
|
|
241
|
-
const worst = results.reduce((w, r) => (r.status > w ? r.status : w), 0);
|
|
242
|
-
const exitCode = worst >= 400 ? 4 : 0;
|
|
243
|
-
if (json) {
|
|
244
|
-
process.stdout.write(`${JSON.stringify(buildScriptJsonRecord({ session, results, entries, telemetry: telemetryEvents, wallMs }))}\n`);
|
|
245
|
-
return exitCode;
|
|
246
|
-
}
|
|
247
|
-
process.stderr.write(`\n${results.length} op${results.length === 1 ? "" : "s"}, ${wallMs}ms${worst >= 400 ? `, worst status ${worst}` : ""}\n`);
|
|
248
|
-
return exitCode;
|
|
249
|
-
};
|
|
250
|
-
export const runCli = async (rpc, prompt, session, opts) => {
|
|
251
|
-
// Two output modes. text (default): stdout = the answer, stderr = the human
|
|
252
|
-
// trace (`plurnk "X" > answer.txt` captures just the broadcast body, SPEC §2).
|
|
253
|
-
// json: accumulate everything, stay SILENT on both streams until the end,
|
|
254
|
-
// then emit ONE complete document on stdout (buildJsonRecord).
|
|
255
|
-
const json = opts.json;
|
|
256
|
-
const entries = [];
|
|
257
|
-
const telemetryEvents = [];
|
|
258
|
-
let response = "";
|
|
259
|
-
if (!json) {
|
|
260
|
-
process.stderr.write(`session: ${session.name}\n`);
|
|
261
|
-
process.stderr.write(`prompt: ${prompt}\n\n`);
|
|
262
|
-
}
|
|
263
|
-
rpc.onNotification("log/entry", (params) => {
|
|
264
|
-
const p = params;
|
|
265
|
-
if (json) {
|
|
266
|
-
entries.push(p.entry);
|
|
267
|
-
if (isTerminalBroadcast(p.entry))
|
|
268
|
-
response = extractSendBody(p.entry.tx, /* prettify */ false);
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
process.stderr.write(`${formatPlain(p.entry)}\n`);
|
|
272
|
-
if (!isTerminalBroadcast(p.entry))
|
|
273
|
-
return;
|
|
274
|
-
const out = extractSendBody(p.entry.tx, /* prettify */ false);
|
|
275
|
-
if (out.length > 0)
|
|
276
|
-
process.stdout.write(`${out}\n`);
|
|
277
|
-
});
|
|
278
|
-
// telemetry/event — parse errors, engine rail signals, scheme/provider
|
|
279
|
-
// failures. Per SPEC.md §8. json mode folds them into the record's telemetry[].
|
|
280
|
-
rpc.onNotification("telemetry/event", (params) => {
|
|
281
|
-
const p = params;
|
|
282
|
-
if (json) {
|
|
283
|
-
telemetryEvents.push(p.event);
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
report(p.event);
|
|
287
|
-
});
|
|
288
|
-
// No review channel (non-TTY, no --yolo): the loop runs with
|
|
289
|
-
// flags.noProposals (set below), so the SERVER auto-rejects
|
|
290
|
-
// side-effecting ops in-process — fail-closed without a per-proposal
|
|
291
|
-
// client roundtrip, no 5-minute hang. The proposal still broadcasts;
|
|
292
|
-
// isServerResolved suppresses the handler. plurnk #24 (#169 client half).
|
|
293
|
-
const noReviewChannel = !opts.yolo && process.stdin.isTTY !== true;
|
|
294
|
-
// Proposal lifecycle (plurnk-service #42): pause-and-review for side-effecting
|
|
295
|
-
// ops. Three paths:
|
|
296
|
-
// - server-resolved (flags.yolo / flags.noProposals): the daemon settles the
|
|
297
|
-
// entry in-process; a client loop.resolve would race it. Skip entirely.
|
|
298
|
-
// - --yolo: auto-accept locally without prompting (server still sends the notification).
|
|
299
|
-
// - TTY: interactive review.
|
|
300
|
-
rpc.onNotification("loop/proposal", (params) => {
|
|
301
|
-
const p = params;
|
|
302
|
-
void (async () => {
|
|
303
|
-
if (isServerResolved(p))
|
|
304
|
-
return;
|
|
305
|
-
if (opts.yolo) {
|
|
306
|
-
await rpc.call("loop.resolve", { logEntryId: p.logEntryId, decision: "accept", outcome: "client_yolo" });
|
|
307
|
-
return;
|
|
308
|
-
}
|
|
309
|
-
const resolution = await reviewProposal(p);
|
|
310
|
-
await rpc.call("loop.resolve", { logEntryId: p.logEntryId, ...resolution });
|
|
311
|
-
})();
|
|
312
|
-
});
|
|
313
|
-
// Prompt prefixes — the same habits as nvim and the TUI: `! cmd` execs,
|
|
314
|
-
// `? text` asks (read-only loop), `: text` acts. Prefix wins over a
|
|
315
|
-
// --flags mode.
|
|
316
|
-
if (prompt.startsWith("!")) {
|
|
317
|
-
const command = prompt.replace(/^!+\s*/, "");
|
|
318
|
-
if (command.length === 0) {
|
|
319
|
-
process.stderr.write("usage: plurnk \"! <command>\"\n");
|
|
320
|
-
return 64;
|
|
321
|
-
}
|
|
322
|
-
return await runCliExec(rpc, command);
|
|
323
|
-
}
|
|
324
|
-
// Streams, coalesced (loop mode only — exec one-shot prints its own
|
|
325
|
-
// output above): one start line, one conclusion line, tiny concluded
|
|
326
|
-
// outputs inlined via the single bounded content fetch (SPEC §5.3).
|
|
327
|
-
// Stream traces are content/progress narration → stderr, text mode only.
|
|
328
|
-
// In json mode the EXEC/stream op already appears in turns[].ops; its output
|
|
329
|
-
// is content, fetched on demand via `plurnk read L/T/S` (not inlined).
|
|
330
|
-
const streams = new StreamTrace();
|
|
331
|
-
rpc.onNotification("stream/event", (params) => {
|
|
332
|
-
if (json)
|
|
333
|
-
return;
|
|
334
|
-
const line = streams.event(params);
|
|
335
|
-
if (line !== null)
|
|
336
|
-
reportStream(line);
|
|
337
|
-
});
|
|
338
|
-
rpc.onNotification("stream/concluded", (params) => {
|
|
339
|
-
if (json)
|
|
340
|
-
return;
|
|
341
|
-
const p = params;
|
|
342
|
-
reportStream(streams.concluded(p));
|
|
343
|
-
void rpc.call("entry.read", { target: p.target }).then((r) => {
|
|
344
|
-
const channels = r.entry?.channels ?? {};
|
|
345
|
-
for (const name of ["stdout", "stderr"]) {
|
|
346
|
-
const content = channels[name]?.content;
|
|
347
|
-
if (typeof content === "string" && inlineable(content)) {
|
|
348
|
-
reportStream(renderInline(name, content));
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
}).catch(() => { });
|
|
352
|
-
});
|
|
353
|
-
let effectiveFlags = opts.loopFlags;
|
|
354
|
-
const p0 = prompt[0];
|
|
355
|
-
if (p0 === "?" || p0 === ":") {
|
|
356
|
-
effectiveFlags = { ...(opts.loopFlags ?? {}), mode: p0 === "?" ? "ask" : "act" };
|
|
357
|
-
prompt = prompt.replace(/^[?:]+\s*/, "");
|
|
358
|
-
}
|
|
359
|
-
// No review channel → run with noProposals and own the explanation (text
|
|
360
|
-
// mode; in json mode the server-rejected proposals show in turns[].ops).
|
|
361
|
-
if (noReviewChannel) {
|
|
362
|
-
effectiveFlags = { ...(effectiveFlags ?? {}), noProposals: true };
|
|
363
|
-
if (!json)
|
|
364
|
-
report(clientProposalEditsBlocked());
|
|
365
|
-
}
|
|
366
|
-
const start = Date.now();
|
|
367
|
-
const loopParams = { prompt };
|
|
368
|
-
if (opts.modelAlias !== undefined)
|
|
369
|
-
loopParams.alias = opts.modelAlias; // display label
|
|
370
|
-
if (opts.model !== undefined)
|
|
371
|
-
loopParams.model = opts.model; // #90 client-resolved routing (precedence)
|
|
372
|
-
if (effectiveFlags !== undefined && Object.keys(effectiveFlags).length > 0)
|
|
373
|
-
loopParams.flags = effectiveFlags;
|
|
374
|
-
if (opts.maxTurns !== undefined)
|
|
375
|
-
loopParams.maxTurns = opts.maxTurns;
|
|
376
|
-
const openPaths = extractOpenPaths(prompt); // @file refs → daemon turn-0 READs (#260)
|
|
377
|
-
if (openPaths.length > 0)
|
|
378
|
-
loopParams.openPaths = openPaths;
|
|
379
|
-
// loop.run only ACKS now (svc 0.45.0+); the outcome rides loop/terminated.
|
|
380
|
-
// Register the waiter BEFORE the call so a fast loop that terminates before
|
|
381
|
-
// the ack lands can't slip past us. Single-shot: the first terminated is ours
|
|
382
|
-
// (the doc-materialization EDITs run as a plurnk run, not a model loop).
|
|
383
|
-
const terminated = new Promise((res) => {
|
|
384
|
-
rpc.onNotification("loop/terminated", (p) => res(p));
|
|
385
|
-
});
|
|
386
|
-
// First Ctrl-C cancels the run's active drain via loop.cancel
|
|
387
|
-
// (plurnk-service §13.5) — loop/terminated then fires with finalStatus 499
|
|
388
|
-
// and the normal exit-code path (3) applies. A second Ctrl-C force-exits in
|
|
389
|
-
// case the daemon never comes back.
|
|
390
|
-
let cancelRequested = false;
|
|
391
|
-
const onSigint = () => {
|
|
392
|
-
if (cancelRequested)
|
|
393
|
-
process.exit(3);
|
|
394
|
-
cancelRequested = true;
|
|
395
|
-
process.stderr.write("cancelling… (ctrl-c again to force quit)\n");
|
|
396
|
-
void rpc.call("loop.cancel", { reason: "user_sigint" });
|
|
397
|
-
};
|
|
398
|
-
process.on("SIGINT", onSigint);
|
|
399
|
-
// --timeout: wall-clock cap. A wedged loop must not wedge the harness;
|
|
400
|
-
// cancel via the wire and let the normal 499 path resolve.
|
|
401
|
-
let timedOut = false;
|
|
402
|
-
let timer;
|
|
403
|
-
if (opts.timeoutSec !== undefined && opts.timeoutSec > 0) {
|
|
404
|
-
timer = setTimeout(() => {
|
|
405
|
-
timedOut = true;
|
|
406
|
-
process.stderr.write(`timeout: ${opts.timeoutSec}s — cancelling\n`);
|
|
407
|
-
void rpc.call("loop.cancel", { reason: "client_timeout" });
|
|
408
|
-
}, opts.timeoutSec * 1000);
|
|
409
|
-
}
|
|
410
|
-
let result;
|
|
411
|
-
try {
|
|
412
|
-
const ack = await rpc.call("loop.run", loopParams);
|
|
413
|
-
// 501 = no model configured → repeat the .env pointer (#120).
|
|
414
|
-
if (ack.error !== undefined)
|
|
415
|
-
throw new Error(ack.status === 501 ? ack.error + NO_MODEL_HINT : ack.error);
|
|
416
|
-
// Status-100 ack → block on loop/terminated for the real outcome;
|
|
417
|
-
// assemble the result from the ack (loopId/modelRunId) + the event.
|
|
418
|
-
// Any non-100 status is already terminal (defensive — shouldn't occur).
|
|
419
|
-
if (ack.finalStatus === 100 && ack.loopId !== undefined) {
|
|
420
|
-
const t = await terminated;
|
|
421
|
-
result = { loopId: ack.loopId, modelRunId: ack.modelRunId, turnIds: t.turnIds, finalStatus: t.finalStatus, hitMaxTurns: t.hitMaxTurns, usage: t.usage };
|
|
422
|
-
}
|
|
423
|
-
else {
|
|
424
|
-
result = { loopId: ack.loopId ?? 0, modelRunId: ack.modelRunId, turnIds: [], finalStatus: ack.finalStatus ?? ack.status ?? 0, hitMaxTurns: false };
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
finally {
|
|
428
|
-
process.removeListener("SIGINT", onSigint);
|
|
429
|
-
if (timer !== undefined)
|
|
430
|
-
clearTimeout(timer);
|
|
431
|
-
}
|
|
432
|
-
const wallMs = Date.now() - start;
|
|
433
|
-
if (json) {
|
|
434
|
-
// ONE complete document on stdout; stderr stayed silent throughout.
|
|
435
|
-
const doc = buildJsonRecord({ session, prompt, response, entries, telemetry: telemetryEvents, result, wallMs, timedOut });
|
|
436
|
-
process.stdout.write(`${JSON.stringify(doc)}\n`);
|
|
437
|
-
return exitCodeForLoop(result.finalStatus, result.hitMaxTurns);
|
|
438
|
-
}
|
|
439
|
-
process.stderr.write(`\nfinal status: ${result.finalStatus}${result.hitMaxTurns ? " (maxTurns reached)" : ""}\n`);
|
|
440
|
-
// Real provider usage (plurnk-service #197) — a model loop always carries it.
|
|
441
|
-
let tokenPart = "";
|
|
442
|
-
if (result.usage !== undefined) {
|
|
443
|
-
tokenPart = `, tokens: ↑${result.usage.promptTokens} ↓${result.usage.completionTokens}`;
|
|
444
|
-
if (result.usage.costPico > 0)
|
|
445
|
-
tokenPart += `, cost: $${(result.usage.costPico / 1e12).toFixed(4)}`;
|
|
446
|
-
}
|
|
447
|
-
// Context gauge (svc#263): the active model's window is the denominator. One
|
|
448
|
-
// cheap co-located call, text mode only — json already carries contextTokens.
|
|
449
|
-
let contextSize;
|
|
450
|
-
try {
|
|
451
|
-
const pl = await rpc.call("providers.list");
|
|
452
|
-
contextSize = pl.aliases?.find((a) => a.active)?.contextSize;
|
|
453
|
-
}
|
|
454
|
-
catch { /* gauge omitted */ }
|
|
455
|
-
process.stderr.write(`turns: ${result.turnIds.length}, wall: ${(wallMs / 1000).toFixed(2)}s${tokenPart}${contextGauge(result.usage?.contextTokens, contextSize)}\n`);
|
|
456
|
-
return exitCodeForLoop(result.finalStatus, result.hitMaxTurns);
|
|
457
|
-
};
|
|
458
128
|
//# sourceMappingURL=cli.js.map
|