@duetso/agent 0.1.202 → 0.2.1
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 +3 -6
- package/dist/package.json +1 -1
- package/dist/src/cli/help.d.ts.map +1 -1
- package/dist/src/cli/help.js +15 -21
- package/dist/src/cli/help.js.map +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 +12 -2
- package/dist/src/cli/memory-add.d.ts.map +1 -1
- package/dist/src/cli/memory-add.js +8 -3
- package/dist/src/cli/memory-add.js.map +1 -1
- package/dist/src/cli/memory-query.d.ts +1 -1
- package/dist/src/cli/memory-recall.d.ts.map +1 -1
- package/dist/src/cli/memory-recall.js +3 -0
- package/dist/src/cli/memory-recall.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 +0 -2
- package/dist/src/cli/rpc.d.ts.map +1 -1
- package/dist/src/cli/rpc.js +1 -16
- package/dist/src/cli/rpc.js.map +1 -1
- package/dist/src/cli/run.d.ts.map +1 -1
- package/dist/src/cli/run.js +1 -15
- 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/train.d.ts.map +1 -1
- package/dist/src/cli/train.js +6 -2
- package/dist/src/cli/train.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-worker.d.ts +41 -1
- package/dist/src/memory/embedding-worker.d.ts.map +1 -1
- package/dist/src/memory/embedding-worker.js +70 -33
- package/dist/src/memory/embedding-worker.js.map +1 -1
- package/dist/src/memory/embedding.d.ts +23 -18
- package/dist/src/memory/embedding.d.ts.map +1 -1
- package/dist/src/memory/embedding.js +33 -25
- package/dist/src/memory/embedding.js.map +1 -1
- package/dist/src/memory/recall.d.ts +6 -1
- package/dist/src/memory/recall.d.ts.map +1 -1
- package/dist/src/memory/recall.js +5 -4
- package/dist/src/memory/recall.js.map +1 -1
- package/dist/src/memory/storage.d.ts +12 -2
- package/dist/src/memory/storage.d.ts.map +1 -1
- package/dist/src/memory/storage.js +46 -10
- package/dist/src/memory/storage.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/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 +3 -0
- 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/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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/memory/storage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/memory/storage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAyB,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AASrE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGrD;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,aAAa,GAAG,SAAS,CAAC;IACnC,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iGAAiG;IACjG,WAAW,CAAC,EAAE;QACZ,KAAK,EAAE,kBAAkB,CAAC;QAC1B,QAAQ,EAAE,2BAA2B,CAAC;QACtC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;IACnE;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,EACtC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,uBAAuB,CAAC,CA6FlC;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,WAAW,GAAG,YAAY,CAAC,EAC3D,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAChC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CA2BlC;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,SAAS,WAAW,EAAE,GACnC,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,2BAA2B;IAC1C,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,2BAA2B,CAAC,CAiBtC;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,aAAa,EACtB,YAAY,EAAE,SAAS,WAAW,EAAE,GACnC,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,2BAA2B,CAAC,CAmBtC;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { homedir } from "node:os";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { EMBEDDING_BATCH_LIMIT } from "./embedding.js";
|
|
4
|
+
import { backfillNewestEmbeddings, embedAndPersistObservations, EmbeddingBackfillWorker, } from "./embedding-worker.js";
|
|
4
5
|
import { rebuildMemoryContextPack } from "./context-pack.js";
|
|
5
6
|
import { runMigrations } from "./migrations.js";
|
|
6
7
|
import { estimateTokens } from "./observational.js";
|
|
@@ -26,13 +27,13 @@ export async function loadStoredMemory(memoryPath, cwd, options = {}) {
|
|
|
26
27
|
},
|
|
27
28
|
...(options.onWarn ? { onWarn: options.onWarn } : {}),
|
|
28
29
|
});
|
|
29
|
-
// The backfill worker
|
|
30
|
-
//
|
|
31
|
-
// reflectors write rows during turns, the
|
|
32
|
-
// `session.notifyWrite()`, and the embedding lands
|
|
33
|
-
// the background. Skipping the worker (no `embed`
|
|
34
|
-
// intentional for tests and one-shot tools that do not
|
|
35
|
-
// recall_memory.
|
|
30
|
+
// The backfill worker owns whatever embedding backlog the bounded
|
|
31
|
+
// startup catch-up below does not cover, then stops until a write
|
|
32
|
+
// kicks it: observers and reflectors write rows during turns, the
|
|
33
|
+
// write helpers call `session.notifyWrite()`, and the embedding lands
|
|
34
|
+
// within seconds in the background. Skipping the worker (no `embed`
|
|
35
|
+
// option) is intentional for tests and one-shot tools that do not
|
|
36
|
+
// call recall_memory.
|
|
36
37
|
const worker = options.embed
|
|
37
38
|
? new EmbeddingBackfillWorker({
|
|
38
39
|
session,
|
|
@@ -42,7 +43,6 @@ export async function loadStoredMemory(memoryPath, cwd, options = {}) {
|
|
|
42
43
|
: undefined;
|
|
43
44
|
if (worker) {
|
|
44
45
|
session.onWrite(() => worker.kick());
|
|
45
|
-
worker.start();
|
|
46
46
|
}
|
|
47
47
|
// Eager probe: open + run migrations once at startup. This keeps
|
|
48
48
|
// the "fail fast on corruption" property of the old eager loader
|
|
@@ -51,6 +51,23 @@ export async function loadStoredMemory(memoryPath, cwd, options = {}) {
|
|
|
51
51
|
// lazy-open behavior. The handle idle-closes within 2s afterwards
|
|
52
52
|
// unless the contextPack rebuild below grabs it first.
|
|
53
53
|
await session.withDb(async () => { });
|
|
54
|
+
// Bounded synchronous catch-up before the worker starts (and before
|
|
55
|
+
// the first turn can dispatch): embed the newest rows still missing
|
|
56
|
+
// vectors so a memory written by an embed-less flow (`duet memory
|
|
57
|
+
// add` / `duet train` while embeddings were down) is semantically
|
|
58
|
+
// recallable in the very first turn rather than whenever the async
|
|
59
|
+
// drain lands. Capped at one embedding HTTP request; the worker owns
|
|
60
|
+
// any deeper backlog. Best-effort: on failure (no API key, endpoint
|
|
61
|
+
// down) the worker's retry loop takes over.
|
|
62
|
+
if (options.embed) {
|
|
63
|
+
try {
|
|
64
|
+
await backfillNewestEmbeddings(session, options.embed, EMBEDDING_BATCH_LIMIT);
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Degrade to the async backfill path; the worker logs the cause.
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
worker?.start();
|
|
54
71
|
if (options.contextPack) {
|
|
55
72
|
// Initial compaction trigger: freeze the rendered memory pack
|
|
56
73
|
// before the first turn dispatches so the prefix is stable from
|
|
@@ -91,8 +108,16 @@ function defaultEmbeddingLogPath() {
|
|
|
91
108
|
* when the cross-process lock could not be acquired within the
|
|
92
109
|
* session's wait budget — writes are silently dropped in that case so
|
|
93
110
|
* a concurrent duet CLI does not crash the foreground turn.
|
|
111
|
+
*
|
|
112
|
+
* When `options.embed` is set, the row's embedding is written
|
|
113
|
+
* synchronously in the same open so the memory is vector-recallable the
|
|
114
|
+
* moment the call returns. One-shot CLI writers (`duet memory add`,
|
|
115
|
+
* `duet train`) pass it because no backfill worker runs in their
|
|
116
|
+
* process — without it the row stays keyword-only until some later
|
|
117
|
+
* runner drains the backlog. An embed failure never fails the write:
|
|
118
|
+
* the row still lands and the next backfill pass picks it up.
|
|
94
119
|
*/
|
|
95
|
-
export async function appendObservation(session, input) {
|
|
120
|
+
export async function appendObservation(session, input, options = {}) {
|
|
96
121
|
const observation = {
|
|
97
122
|
...input,
|
|
98
123
|
id: createMemoryId(),
|
|
@@ -101,6 +126,17 @@ export async function appendObservation(session, input) {
|
|
|
101
126
|
};
|
|
102
127
|
const result = await session.withDb(async (db) => {
|
|
103
128
|
await upsertObservation(db, observation);
|
|
129
|
+
if (options.embed) {
|
|
130
|
+
try {
|
|
131
|
+
await embedAndPersistObservations(db, [{ id: observation.id, content: observation.content }], options.embed);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Embeddings unavailable (no key, rate limit exhausted,
|
|
135
|
+
// endpoint down). The observation row is already in; the
|
|
136
|
+
// notifyWrite below kicks any running backfill worker and the
|
|
137
|
+
// startup catch-up covers CLI-only flows.
|
|
138
|
+
}
|
|
139
|
+
}
|
|
104
140
|
return observation;
|
|
105
141
|
});
|
|
106
142
|
if (result)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/memory/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/memory/storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,15 +5,16 @@ import { type Model } from "@earendil-works/pi-ai";
|
|
|
5
5
|
* parallel model registry, the `duet-gateway` provider piggybacks on upstream
|
|
6
6
|
* model definitions and only swaps `baseUrl` to point at Duet.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* `DUET_GATEWAY_BASE_URL` can point model traffic at a dedicated gateway
|
|
9
|
+
* origin. When it is unset, model traffic goes directly to
|
|
10
|
+
* `https://gateway.duet.so`.
|
|
11
11
|
*
|
|
12
12
|
* Auth flows through pi-ai's existing vercel-ai-gateway path, which reads
|
|
13
13
|
* `AI_GATEWAY_API_KEY` — the CLI shims that env var from `DUET_API_KEY` at
|
|
14
14
|
* startup so users only need to set the duet token.
|
|
15
15
|
*/
|
|
16
16
|
export declare const DUET_GATEWAY_API_KEY_ENV = "DUET_API_KEY";
|
|
17
|
+
export declare const DUET_GATEWAY_BASE_URL_ENV = "DUET_GATEWAY_BASE_URL";
|
|
17
18
|
export declare function getDuetGatewayBaseUrl(): string;
|
|
18
19
|
/**
|
|
19
20
|
* Resolve a `duet-gateway:<modelId>` string to a Model.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duet-gateway.d.ts","sourceRoot":"","sources":["../../../src/model-resolution/duet-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"duet-gateway.d.ts","sourceRoot":"","sources":["../../../src/model-resolution/duet-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAO3E;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,wBAAwB,iBAAiB,CAAC;AACvD,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AAEjE,wBAAgB,qBAAqB,IAAI,MAAM,CAI9C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CASnE;AAuED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAK7F;AAaD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK1E"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { getEnvApiKey, getModel } from "@earendil-works/pi-ai";
|
|
2
|
-
|
|
3
|
-
const GATEWAY_PATH = "/api/v1/ai-gateway";
|
|
2
|
+
const DEFAULT_DUET_GATEWAY_BASE_URL = "https://gateway.duet.so";
|
|
4
3
|
const OPENAI_MODEL_PREFIX = "openai/";
|
|
5
4
|
const VERCEL_GATEWAY_BASE_URL = "https://ai-gateway.vercel.sh";
|
|
6
5
|
const OPENAI_BASE_URL = "https://api.openai.com/v1";
|
|
@@ -10,17 +9,21 @@ const OPENAI_BASE_URL = "https://api.openai.com/v1";
|
|
|
10
9
|
* parallel model registry, the `duet-gateway` provider piggybacks on upstream
|
|
11
10
|
* model definitions and only swaps `baseUrl` to point at Duet.
|
|
12
11
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
12
|
+
* `DUET_GATEWAY_BASE_URL` can point model traffic at a dedicated gateway
|
|
13
|
+
* origin. When it is unset, model traffic goes directly to
|
|
14
|
+
* `https://gateway.duet.so`.
|
|
16
15
|
*
|
|
17
16
|
* Auth flows through pi-ai's existing vercel-ai-gateway path, which reads
|
|
18
17
|
* `AI_GATEWAY_API_KEY` — the CLI shims that env var from `DUET_API_KEY` at
|
|
19
18
|
* startup so users only need to set the duet token.
|
|
20
19
|
*/
|
|
21
20
|
export const DUET_GATEWAY_API_KEY_ENV = "DUET_API_KEY";
|
|
21
|
+
export const DUET_GATEWAY_BASE_URL_ENV = "DUET_GATEWAY_BASE_URL";
|
|
22
22
|
export function getDuetGatewayBaseUrl() {
|
|
23
|
-
|
|
23
|
+
const override = process.env[DUET_GATEWAY_BASE_URL_ENV]?.trim();
|
|
24
|
+
if (override)
|
|
25
|
+
return stripTrailingSlash(override);
|
|
26
|
+
return DEFAULT_DUET_GATEWAY_BASE_URL;
|
|
24
27
|
}
|
|
25
28
|
/**
|
|
26
29
|
* Resolve a `duet-gateway:<modelId>` string to a Model.
|
|
@@ -125,6 +128,9 @@ function getDuetGatewayBaseUrlForModel(model) {
|
|
|
125
128
|
}
|
|
126
129
|
return getDuetGatewayBaseUrl();
|
|
127
130
|
}
|
|
131
|
+
function stripTrailingSlash(url) {
|
|
132
|
+
return url.endsWith("/") ? url.slice(0, -1) : url;
|
|
133
|
+
}
|
|
128
134
|
/**
|
|
129
135
|
* Resolve the API key for a provider, including the project-local
|
|
130
136
|
* `duet-gateway` provider that pi-ai's built-in env-key map does not
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duet-gateway.js","sourceRoot":"","sources":["../../../src/model-resolution/duet-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAc,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"duet-gateway.js","sourceRoot":"","sources":["../../../src/model-resolution/duet-gateway.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,7 +38,11 @@ export declare class StepRenderer {
|
|
|
38
38
|
type: "memory";
|
|
39
39
|
}>): void;
|
|
40
40
|
private renderDelta;
|
|
41
|
+
private renderToolCallStart;
|
|
41
42
|
private renderToolCall;
|
|
43
|
+
/** Mount a new tool block into the transcript, or return undefined when the
|
|
44
|
+
* formatter hides this tool (e.g. ask_user_question owns its own display). */
|
|
45
|
+
private mountToolBlock;
|
|
42
46
|
private finalizeToolCall;
|
|
43
47
|
private finalizeDelta;
|
|
44
48
|
private toolBlockColumns;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-renderer.d.ts","sourceRoot":"","sources":["../../../src/tui/step-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,eAAe,CAAC;AACjE,OAAO,EAAgC,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"step-renderer.d.ts","sourceRoot":"","sources":["../../../src/tui/step-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,eAAe,CAAC;AACjE,OAAO,EAAgC,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AASxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA+BhF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,WAAW,CAAC;IACtB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC;;6CAEyC;IACzC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,qBAAa,YAAY;IAQX,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPjC,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,qBAAqB,CAA6B;IAI1D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgC;gBAEpC,IAAI,EAAE,mBAAmB;IAEtD,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAiDhC;;wEAEoE;IACpE,uBAAuB,IAAI,IAAI;IAa/B,WAAW,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,IAAI;IAwBzC,iBAAiB,IAAI,IAAI;IAazB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAWpC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,GAAG,IAAI;IAcvE,OAAO,CAAC,WAAW;IA+BnB,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,cAAc;IAyBtB;mFAC+E;IAC/E,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,gBAAgB;CAIzB;AAOD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,GAAG,MAAM,CAS3F"}
|
|
@@ -2,7 +2,7 @@ import { TextRenderable } from "@opentui/core";
|
|
|
2
2
|
import { formatElapsed, runningMarker } from "./status-controller.js";
|
|
3
3
|
import { SIDEBAR_WIDTH } from "./sidebar.js";
|
|
4
4
|
import { COLORS } from "./theme.js";
|
|
5
|
-
import { assembleToolBlock, formatToolBlock, truncateReasoningBody } from "./tool-formatters.js";
|
|
5
|
+
import { assembleToolBlock, formatToolBlock, truncateReasoningBody, } from "./tool-formatters.js";
|
|
6
6
|
/**
|
|
7
7
|
* Renders the streaming surface of a turn: text deltas, reasoning deltas,
|
|
8
8
|
* tool-call blocks (live spinner → ✓/✗), memory phase banners, and the
|
|
@@ -16,8 +16,8 @@ export class StepRenderer {
|
|
|
16
16
|
opts;
|
|
17
17
|
activeTextStream;
|
|
18
18
|
activeReasoningStream;
|
|
19
|
-
// Tool calls fire twice (
|
|
20
|
-
// block by toolCallId so the
|
|
19
|
+
// Tool calls fire twice (tool_call_start → tool_call). Track the rendered
|
|
20
|
+
// block by toolCallId so the canonical step updates the same line in place
|
|
21
21
|
// instead of pushing a separate block.
|
|
22
22
|
activeToolBlocks = new Map();
|
|
23
23
|
constructor(opts) {
|
|
@@ -51,6 +51,9 @@ export class StepRenderer {
|
|
|
51
51
|
this.opts.transcriptWriter.appendBlock("[reasoning]", truncateReasoningBody(trimmed), COLORS.reasoning);
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
+
else if (step.type === "tool_call_start") {
|
|
55
|
+
this.renderToolCallStart(step);
|
|
56
|
+
}
|
|
54
57
|
else if (step.type === "tool_call") {
|
|
55
58
|
this.renderToolCall(step);
|
|
56
59
|
}
|
|
@@ -139,57 +142,58 @@ export class StepRenderer {
|
|
|
139
142
|
updateStreamingBlock(next);
|
|
140
143
|
return next;
|
|
141
144
|
}
|
|
142
|
-
// Render a tool call as a single, self-updating block. The
|
|
143
|
-
//
|
|
144
|
-
//
|
|
145
|
-
//
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
|
|
145
|
+
// Render a tool call as a single, self-updating block. The
|
|
146
|
+
// `tool_call_start` step creates the block with a spinner; the canonical
|
|
147
|
+
// `tool_call` step replaces the spinner with ✓/✗ and appends the truncated
|
|
148
|
+
// result inline so the call and its outcome stay visually paired. Per-tool
|
|
149
|
+
// formatters in `tool-formatters.ts` decide the header text and whether the
|
|
150
|
+
// call should appear in the transcript at all (e.g. ask_user_question hides
|
|
151
|
+
// itself live and lets the `ask` terminal event own the question display).
|
|
152
|
+
renderToolCallStart(step) {
|
|
153
|
+
const block = this.mountToolBlock(formatToolBlock({
|
|
154
|
+
toolName: step.toolName,
|
|
155
|
+
status: "running",
|
|
156
|
+
input: step.input,
|
|
157
|
+
mode: "live",
|
|
158
|
+
}), COLORS.tool, Date.now());
|
|
159
|
+
if (block)
|
|
160
|
+
this.activeToolBlocks.set(step.toolCallId, block);
|
|
161
|
+
}
|
|
150
162
|
renderToolCall(step) {
|
|
151
163
|
const existing = this.activeToolBlocks.get(step.toolCallId);
|
|
152
164
|
if (existing) {
|
|
153
165
|
this.finalizeToolCall(step, existing);
|
|
154
166
|
return;
|
|
155
167
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
168
|
+
// No live block — the canonical step arrived without a preceding
|
|
169
|
+
// `tool_call_start` (cached/replayed history). It echoes the call's
|
|
170
|
+
// input, so it renders as a complete block on its own; there is just no
|
|
171
|
+
// real duration because we never saw the call start.
|
|
172
|
+
const block = this.mountToolBlock(formatToolBlock({
|
|
159
173
|
toolName: step.toolName,
|
|
160
|
-
status:
|
|
174
|
+
status: step.isError ? "error" : "completed",
|
|
161
175
|
input: step.input,
|
|
162
176
|
output: step.output,
|
|
163
177
|
mode: "live",
|
|
164
|
-
});
|
|
178
|
+
}), step.isError ? COLORS.error : COLORS.tool, undefined);
|
|
179
|
+
if (block)
|
|
180
|
+
this.finalizeToolCall(step, block);
|
|
181
|
+
}
|
|
182
|
+
/** Mount a new tool block into the transcript, or return undefined when the
|
|
183
|
+
* formatter hides this tool (e.g. ask_user_question owns its own display). */
|
|
184
|
+
mountToolBlock(formatted, fg, startedAt) {
|
|
165
185
|
if (formatted.hidden)
|
|
166
|
-
return;
|
|
167
|
-
const startedAt = isLive ? Date.now() : undefined;
|
|
168
|
-
const marker = "⏳";
|
|
169
|
-
const fg = step.status === "error" ? COLORS.error : COLORS.tool;
|
|
170
|
-
const columns = this.toolBlockColumns();
|
|
186
|
+
return undefined;
|
|
171
187
|
const line = new TextRenderable(this.opts.renderer, {
|
|
172
|
-
content: assembleToolBlock(formatted,
|
|
188
|
+
content: assembleToolBlock(formatted, "⏳", { columns: this.toolBlockColumns() }),
|
|
173
189
|
fg,
|
|
174
190
|
});
|
|
175
191
|
this.opts.transcriptWriter.beginBlock();
|
|
176
192
|
this.opts.transcriptWriter.mount(line);
|
|
177
|
-
|
|
178
|
-
line,
|
|
179
|
-
header: formatted.header,
|
|
180
|
-
body: formatted.body ?? "",
|
|
181
|
-
input: step.input,
|
|
182
|
-
startedAt,
|
|
183
|
-
};
|
|
184
|
-
this.activeToolBlocks.set(step.toolCallId, block);
|
|
185
|
-
// The same event may already carry a terminal status (cached/replayed
|
|
186
|
-
// history). Fall through to finalize against the just-created block.
|
|
187
|
-
if (!isLive) {
|
|
188
|
-
this.finalizeToolCall(step, block);
|
|
189
|
-
}
|
|
193
|
+
return { line, header: formatted.header, body: formatted.body ?? "", startedAt };
|
|
190
194
|
}
|
|
191
195
|
finalizeToolCall(step, block) {
|
|
192
|
-
const isError = step.
|
|
196
|
+
const isError = step.isError;
|
|
193
197
|
const glyph = isError ? "✗" : "✓";
|
|
194
198
|
const elapsedMs = block.startedAt === undefined ? 0 : Date.now() - block.startedAt;
|
|
195
199
|
// Sub-second runs drop the elapsed suffix so the transcript does not get
|
|
@@ -198,7 +202,7 @@ export class StepRenderer {
|
|
|
198
202
|
const formatted = formatToolBlock({
|
|
199
203
|
toolName: step.toolName,
|
|
200
204
|
status: isError ? "error" : "completed",
|
|
201
|
-
input:
|
|
205
|
+
input: step.input,
|
|
202
206
|
output: step.output,
|
|
203
207
|
mode: "live",
|
|
204
208
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"step-renderer.js","sourceRoot":"","sources":["../../../src/tui/step-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,cAAc,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAoB,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,
|
|
1
|
+
{"version":3,"file":"step-renderer.js","sourceRoot":"","sources":["../../../src/tui/step-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,8 +15,8 @@ import type { ImageContent, TextContent } from "@earendil-works/pi-ai";
|
|
|
15
15
|
* history, so the formatter sees which path it is on and can branch. */
|
|
16
16
|
export type ToolFormatMode = "live" | "history";
|
|
17
17
|
/** Status of a tool call as visible to the formatter. `running` covers the
|
|
18
|
-
*
|
|
19
|
-
*
|
|
18
|
+
* spinner phase before any result is available; `completed` and `error`
|
|
19
|
+
* carry the tool result. */
|
|
20
20
|
export type ToolCallStatus = "running" | "completed" | "error";
|
|
21
21
|
export interface ToolCallSpec {
|
|
22
22
|
toolName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-formatters.d.ts","sourceRoot":"","sources":["../../../src/tui/tool-formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGvE;;;;;;;;;;GAUG;AAEH;;wEAEwE;AACxE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhD;;
|
|
1
|
+
{"version":3,"file":"tool-formatters.d.ts","sourceRoot":"","sources":["../../../src/tui/tool-formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGvE;;;;;;;;;;GAUG;AAEH;;wEAEwE;AACxE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhD;;4BAE4B;AAC5B,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,0EAA0E;IAC1E,MAAM,CAAC,EAAE,aAAa,CAAC,WAAW,GAAG,YAAY,CAAC,CAAC;IACnD,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC;6EACyE;IACzE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;OAMG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM1D;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,wBAA6B,GACrC,MAAM,CAaR;AA2BD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,aAAa,CAAC,WAAW,GAAG,YAAY,CAAC,GAAG,SAAS,GAC7D,MAAM,CAMR;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,aAAa,CAGjE"}
|
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import type { AgentEvent, AgentMessage } from "@earendil-works/pi-agent-core";
|
|
2
2
|
import type { TurnStepEvent } from "../types/protocol.js";
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Build a translator from pi agent events to turn step events.
|
|
5
|
+
*
|
|
6
|
+
* The translator is stateful: pi's `tool_execution_end` does not carry the
|
|
7
|
+
* tool arguments, but the canonical `tool_call` step is self-contained (it
|
|
8
|
+
* echoes the call's `input`, mirroring how the canonical `text` step carries
|
|
9
|
+
* the full text after `text_delta`). Each call's input is remembered from
|
|
10
|
+
* `tool_execution_start` until its end event arrives. Tool call ids are
|
|
11
|
+
* unique across the parent and state agents, so one translator per runner is
|
|
12
|
+
* enough.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createAgentEventTranslator(): (event: AgentEvent) => TurnStepEvent[];
|
|
4
15
|
export declare function agentMessageText(message: AgentMessage): string;
|
|
5
16
|
//# sourceMappingURL=agent-events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-events.d.ts","sourceRoot":"","sources":["../../../src/turn-runner/agent-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,wBAAgB,
|
|
1
|
+
{"version":3,"file":"agent-events.d.ts","sourceRoot":"","sources":["../../../src/turn-runner/agent-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,IAAI,CAAC,KAAK,EAAE,UAAU,KAAK,aAAa,EAAE,CAqDnF;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAW9D"}
|
|
@@ -1,48 +1,66 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Build a translator from pi agent events to turn step events.
|
|
3
|
+
*
|
|
4
|
+
* The translator is stateful: pi's `tool_execution_end` does not carry the
|
|
5
|
+
* tool arguments, but the canonical `tool_call` step is self-contained (it
|
|
6
|
+
* echoes the call's `input`, mirroring how the canonical `text` step carries
|
|
7
|
+
* the full text after `text_delta`). Each call's input is remembered from
|
|
8
|
+
* `tool_execution_start` until its end event arrives. Tool call ids are
|
|
9
|
+
* unique across the parent and state agents, so one translator per runner is
|
|
10
|
+
* enough.
|
|
11
|
+
*/
|
|
12
|
+
export function createAgentEventTranslator() {
|
|
13
|
+
const inputByToolCallId = new Map();
|
|
14
|
+
return (event) => {
|
|
15
|
+
switch (event.type) {
|
|
16
|
+
case "message_update": {
|
|
17
|
+
const update = event.assistantMessageEvent;
|
|
18
|
+
switch (update.type) {
|
|
19
|
+
case "text_delta":
|
|
20
|
+
return [{ type: "step", step: { type: "text_delta", delta: update.delta } }];
|
|
21
|
+
case "thinking_delta":
|
|
22
|
+
return [{ type: "step", step: { type: "reasoning_delta", delta: update.delta } }];
|
|
23
|
+
case "text_end":
|
|
24
|
+
return [{ type: "step", step: { type: "text", text: update.content } }];
|
|
25
|
+
case "thinking_end":
|
|
26
|
+
return [{ type: "step", step: { type: "reasoning", text: update.content } }];
|
|
27
|
+
}
|
|
28
|
+
return [];
|
|
14
29
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
input: event.args,
|
|
30
|
+
case "tool_execution_start":
|
|
31
|
+
inputByToolCallId.set(event.toolCallId, event.args);
|
|
32
|
+
return [
|
|
33
|
+
{
|
|
34
|
+
type: "step",
|
|
35
|
+
step: {
|
|
36
|
+
type: "tool_call_start",
|
|
37
|
+
toolName: event.toolName,
|
|
38
|
+
toolCallId: event.toolCallId,
|
|
39
|
+
input: event.args,
|
|
40
|
+
},
|
|
27
41
|
},
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
];
|
|
43
|
+
case "tool_execution_end": {
|
|
44
|
+
const input = inputByToolCallId.get(event.toolCallId);
|
|
45
|
+
inputByToolCallId.delete(event.toolCallId);
|
|
46
|
+
return [
|
|
47
|
+
{
|
|
48
|
+
type: "step",
|
|
49
|
+
step: {
|
|
50
|
+
type: "tool_call",
|
|
51
|
+
toolName: event.toolName,
|
|
52
|
+
toolCallId: event.toolCallId,
|
|
53
|
+
input,
|
|
54
|
+
isError: event.isError,
|
|
55
|
+
output: event.result?.content,
|
|
56
|
+
},
|
|
40
57
|
},
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
58
|
+
];
|
|
59
|
+
}
|
|
60
|
+
default:
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
};
|
|
46
64
|
}
|
|
47
65
|
export function agentMessageText(message) {
|
|
48
66
|
const content = "content" in message ? message.content : undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-events.js","sourceRoot":"","sources":["../../../src/turn-runner/agent-events.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"agent-events.js","sourceRoot":"","sources":["../../../src/turn-runner/agent-events.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,MAAM,UAAU,0BAA0B;IACxC,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA2C,CAAC;IAE7E,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC;gBAC3C,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;oBACpB,KAAK,YAAY;wBACf,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC/E,KAAK,gBAAgB;wBACnB,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBACpF,KAAK,UAAU;wBACb,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAC1E,KAAK,cAAc;wBACjB,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACjF,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,KAAK,sBAAsB;gBACzB,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpD,OAAO;oBACL;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;4BACJ,IAAI,EAAE,iBAAiB;4BACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;4BACxB,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,KAAK,EAAE,KAAK,CAAC,IAAI;yBAClB;qBACF;iBACF,CAAC;YACJ,KAAK,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBACtD,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC3C,OAAO;oBACL;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;4BACJ,IAAI,EAAE,WAAW;4BACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;4BACxB,UAAU,EAAE,KAAK,CAAC,UAAU;4BAC5B,KAAK;4BACL,OAAO,EAAE,KAAK,CAAC,OAAO;4BACtB,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;yBAC9B;qBACF;iBACF,CAAC;YACJ,CAAC;YACD;gBACE,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAqB;IACpD,MAAM,OAAO,GAAG,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,OAAO;SACX,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAChB,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QACjF,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACb,CAAC,CAAC,EAAE,CACP;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
|