@open-mercato/cezar 0.9.1-pr470.729 → 0.9.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.
Files changed (77) hide show
  1. package/README.md +9 -13
  2. package/dist/config.d.ts +3 -7
  3. package/dist/config.js +1 -3
  4. package/dist/config.js.map +1 -1
  5. package/dist/core/agent-env.js +15 -21
  6. package/dist/core/agent-env.js.map +1 -1
  7. package/dist/core/agent-runner.d.ts +6 -16
  8. package/dist/core/agent-runner.js +3 -15
  9. package/dist/core/agent-runner.js.map +1 -1
  10. package/dist/core/backend-detect.d.ts +5 -5
  11. package/dist/core/backend-detect.js +5 -37
  12. package/dist/core/backend-detect.js.map +1 -1
  13. package/dist/core/model-identity.js +0 -4
  14. package/dist/core/model-identity.js.map +1 -1
  15. package/dist/core/model-presets.js +0 -5
  16. package/dist/core/model-presets.js.map +1 -1
  17. package/dist/core/runner-factory.js +0 -3
  18. package/dist/core/runner-factory.js.map +1 -1
  19. package/dist/core/ui-events.d.ts +1 -1
  20. package/dist/runs/store.d.ts +12 -13
  21. package/dist/runs/store.js +2 -3
  22. package/dist/runs/store.js.map +1 -1
  23. package/dist/server/open-in-app.d.ts +1 -2
  24. package/dist/server/open-in-app.js +0 -1
  25. package/dist/server/open-in-app.js.map +1 -1
  26. package/dist/server/server.d.ts +0 -7
  27. package/dist/server/server.js +7 -102
  28. package/dist/server/server.js.map +1 -1
  29. package/dist/server-install/steps.js +2 -6
  30. package/dist/server-install/steps.js.map +1 -1
  31. package/dist/workflows/types.d.ts +14 -14
  32. package/dist/workflows/types.js +1 -2
  33. package/dist/workflows/types.js.map +1 -1
  34. package/dist/workspace/config.d.ts +0 -11
  35. package/dist/workspace/config.js +0 -13
  36. package/dist/workspace/config.js.map +1 -1
  37. package/package.json +1 -1
  38. package/web/dist/assets/{centered-state-Dk2G08OJ.js → centered-state-DOsTcJZF.js} +11 -11
  39. package/web/dist/assets/{commit-list-BKRBe1ff.js → commit-list-BrxBEzRK.js} +1 -1
  40. package/web/dist/assets/{compare-variants-BcWTGJrd.js → compare-variants-Bv2c9ORF.js} +1 -1
  41. package/web/dist/assets/{diff-view-CFQ0zXBT.js → diff-view-DCeSegKk.js} +3 -3
  42. package/web/dist/assets/{dist-DC3TJo3T.js → dist-B6XQOhgM.js} +1 -1
  43. package/web/dist/assets/{git-toolbar-CaBCbiSp.js → git-toolbar-pIC1ubPM.js} +1 -1
  44. package/web/dist/assets/github-DTTSG0ht.js +1 -0
  45. package/web/dist/assets/index-Cijmlz7q.js +30 -0
  46. package/web/dist/assets/index-DzroxqBG.css +2 -0
  47. package/web/dist/assets/{project-router-CXmL3t6s.js → project-router-BMx4e8m-.js} +1 -1
  48. package/web/dist/assets/{repo-git-D5N2okPE.js → repo-git-BusYfa3t.js} +1 -1
  49. package/web/dist/assets/{run-diff-3xRPsGI4.js → run-diff-wOJ3odA-.js} +2 -2
  50. package/web/dist/assets/run-header-Cg5incil.js +1 -0
  51. package/web/dist/assets/skills-PpP2owbM.js +1 -0
  52. package/web/dist/assets/{tab-link-Q8NhDqnE.js → tab-link-F3uQrdm2.js} +1 -1
  53. package/web/dist/assets/{task-changes-DHpP7WS3.js → task-changes-iD9kS79I.js} +1 -1
  54. package/web/dist/assets/{task-commits-D0IcDbGX.js → task-commits-COkLaUri.js} +1 -1
  55. package/web/dist/assets/{task-files-DvKQHU1f.js → task-files-Ckttz7XH.js} +2 -2
  56. package/web/dist/assets/task-thread-CQD91VPt.js +9 -0
  57. package/web/dist/assets/{use-desktop-M42tdz-1.js → use-desktop-DUh0STzq.js} +2 -2
  58. package/web/dist/assets/workflows-BFk8C0co.js +11 -0
  59. package/web/dist/index.html +5 -5
  60. package/dist/core/pi-runner.d.ts +0 -24
  61. package/dist/core/pi-runner.js +0 -342
  62. package/dist/core/pi-runner.js.map +0 -1
  63. package/dist/core/pi-ui-mapper.d.ts +0 -24
  64. package/dist/core/pi-ui-mapper.js +0 -255
  65. package/dist/core/pi-ui-mapper.js.map +0 -1
  66. package/dist/skills-update.d.ts +0 -88
  67. package/dist/skills-update.js +0 -392
  68. package/dist/skills-update.js.map +0 -1
  69. package/scripts/mock-pi-rpc.mjs +0 -83
  70. package/web/dist/assets/circle-check-ClxqLJCI.js +0 -1
  71. package/web/dist/assets/github-Dn-ZvcbO.js +0 -1
  72. package/web/dist/assets/index-CDk4tcLt.js +0 -30
  73. package/web/dist/assets/index-CwNZ1v7S.css +0 -2
  74. package/web/dist/assets/run-header-Bd1vyMz_.js +0 -1
  75. package/web/dist/assets/skills-C5b1tbwv.js +0 -1
  76. package/web/dist/assets/task-thread-JlVT8p1a.js +0 -9
  77. package/web/dist/assets/workflows-D_gHO2WW.js +0 -11
@@ -1,342 +0,0 @@
1
- import { spawn as nodeSpawn } from 'node:child_process';
2
- import { buildChildEnv } from './agent-env.js';
3
- import { readNdjson } from './ndjson.js';
4
- import { createPiUiState, mapPiRpcMessage, piTurnStarted } from './pi-ui-mapper.js';
5
- const DEFAULT_TIMEOUT_MS = 30 * 60_000;
6
- const KILL_GRACE_MS = 10_000;
7
- const AUTO_END_DELAY_MS = 250;
8
- /**
9
- * Persistent subprocess adapter for pi's documented RPC mode.
10
- *
11
- * Contract: https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/rpc.md
12
- * Pi has its own command/event vocabulary; it is not Claude stream-json.
13
- */
14
- export class PiRunner {
15
- backend = 'pi';
16
- bin;
17
- timeoutMs;
18
- lastSession = null;
19
- constructor(opts = {}) {
20
- this.bin = opts.bin ?? process.env.CEZ_PI_BIN ?? (process.env.CEZ_DRY_RUN === '1' ? mockPiPath() : 'pi');
21
- this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
22
- }
23
- run(spec, onEvent) {
24
- return this.startSession(spec, onEvent, { autoEndAfterFirstTurn: true }).result;
25
- }
26
- async interrupt() {
27
- this.lastSession?.interrupt();
28
- }
29
- startSession(spec, onEvent, opts = {}) {
30
- const child = nodeSpawn(this.bin, buildPiArgs(spec), {
31
- cwd: spec.cwd,
32
- env: buildChildEnv({ backend: this.backend, extraEnv: spec.env }),
33
- });
34
- let open = true;
35
- let settled = true;
36
- let timedOut = false;
37
- let autoEndTimer;
38
- let killTimer;
39
- let piUi = createPiUiState();
40
- const textChunks = [];
41
- const toolCalls = [];
42
- let sessionId = spec.sessionId;
43
- let tokensUsed = 0;
44
- let spawnError = null;
45
- const stderr = [];
46
- child.on('error', (error) => {
47
- spawnError = wrapSpawnError(error, this.bin);
48
- });
49
- child.stderr.setEncoding('utf8');
50
- child.stderr.on('data', (chunk) => stderr.push(chunk));
51
- const emitUi = (value) => {
52
- const mapped = mapPiRpcMessage(value, piUi);
53
- piUi = mapped.state;
54
- for (const event of mapped.events)
55
- opts.onUiEvent?.(event);
56
- };
57
- const write = (command) => {
58
- if (!open || !child.stdin.writable)
59
- return false;
60
- try {
61
- child.stdin.write(`${JSON.stringify(command)}\n`);
62
- return true;
63
- }
64
- catch {
65
- return false;
66
- }
67
- };
68
- const sendMessage = (content) => {
69
- const { message, images } = toPiPrompt(content);
70
- if (autoEndTimer) {
71
- clearTimeout(autoEndTimer);
72
- autoEndTimer = undefined;
73
- }
74
- if (!write({
75
- type: 'prompt',
76
- message,
77
- ...(images.length > 0 ? { images } : {}),
78
- ...(!settled ? { streamingBehavior: 'steer' } : {}),
79
- })) {
80
- return false;
81
- }
82
- const mapped = piTurnStarted(piUi);
83
- piUi = mapped.state;
84
- for (const event of mapped.events)
85
- opts.onUiEvent?.(event);
86
- settled = false;
87
- return true;
88
- };
89
- const end = () => {
90
- if (!open)
91
- return;
92
- open = false;
93
- child.stdin.end();
94
- killTimer = setTimeout(() => child.exitCode == null && child.kill('SIGTERM'), KILL_GRACE_MS);
95
- killTimer.unref?.();
96
- };
97
- const interrupt = () => {
98
- if (!open)
99
- return;
100
- write({ type: 'abort' });
101
- open = false;
102
- child.kill('SIGTERM');
103
- };
104
- write({ id: 'cezar-state', type: 'get_state' });
105
- sendMessage([
106
- ...(spec.images ?? []),
107
- {
108
- type: 'text',
109
- text: spec.userPrompt,
110
- },
111
- ]);
112
- const limitMs = spec.timeoutMs ?? this.timeoutMs;
113
- const deadline = limitMs > 0
114
- ? setTimeout(() => {
115
- timedOut = true;
116
- interrupt();
117
- }, limitMs)
118
- : undefined;
119
- deadline?.unref?.();
120
- const result = (async () => {
121
- try {
122
- for await (const line of readNdjson(child.stdout)) {
123
- let value;
124
- try {
125
- value = JSON.parse(line);
126
- }
127
- catch {
128
- onEvent?.({ type: 'note', message: `pi: skipped unparseable RPC line: ${truncate(line)}` });
129
- continue;
130
- }
131
- emitUi(value);
132
- if (!isRecord(value))
133
- continue;
134
- if (value.type === 'response' && value.command === 'get_state' && value.success === true && isRecord(value.data)) {
135
- const discovered = string(value.data.sessionId);
136
- if (discovered && discovered !== sessionId) {
137
- sessionId = discovered;
138
- onEvent?.({ type: 'session', sessionId: discovered });
139
- }
140
- }
141
- else if (value.type === 'response' && value.success === false) {
142
- onEvent?.({ type: 'error', message: rpcError(value) });
143
- }
144
- else if (value.type === 'message_update' && isRecord(value.assistantMessageEvent)) {
145
- const update = value.assistantMessageEvent;
146
- if (update.type === 'text_delta' && typeof update.delta === 'string') {
147
- textChunks.push(update.delta);
148
- onEvent?.({ type: 'text', text: update.delta });
149
- }
150
- }
151
- else if (value.type === 'message_end' && isRecord(value.message) && value.message.role === 'assistant') {
152
- const usage = usageValues(value.message.usage);
153
- if (usage) {
154
- tokensUsed += usage.weighted;
155
- onEvent?.({ type: 'token-usage', tokensUsed });
156
- if (usage.cost > 0)
157
- onEvent?.({ type: 'cost', usd: usage.cost });
158
- }
159
- }
160
- else if (value.type === 'tool_execution_start') {
161
- const id = string(value.toolCallId);
162
- const name = string(value.toolName);
163
- if (id && name) {
164
- toolCalls.push({ id, name, input: value.args });
165
- onEvent?.({ type: 'tool-call', id, tool: name, input: value.args });
166
- }
167
- }
168
- else if (value.type === 'tool_execution_end') {
169
- const id = string(value.toolCallId);
170
- if (id) {
171
- onEvent?.({
172
- type: 'tool-result',
173
- toolCallId: id,
174
- result: contentText(isRecord(value.result) ? value.result.content : undefined) ?? '',
175
- isError: value.isError === true,
176
- });
177
- emitImages(isRecord(value.result) ? value.result.content : undefined, onEvent);
178
- }
179
- }
180
- else if (value.type === 'agent_settled') {
181
- settled = true;
182
- onEvent?.({ type: 'turn-end' });
183
- if (opts.autoEndAfterFirstTurn && open && !autoEndTimer) {
184
- autoEndTimer = setTimeout(end, AUTO_END_DELAY_MS);
185
- autoEndTimer.unref?.();
186
- }
187
- }
188
- else if (value.type === 'extension_error') {
189
- onEvent?.({ type: 'note', message: string(value.error) ?? 'pi extension error' });
190
- }
191
- }
192
- }
193
- finally {
194
- if (deadline)
195
- clearTimeout(deadline);
196
- if (autoEndTimer)
197
- clearTimeout(autoEndTimer);
198
- if (killTimer)
199
- clearTimeout(killTimer);
200
- open = false;
201
- }
202
- const exitCode = await waitForExit(child);
203
- if (spawnError)
204
- throw spawnError;
205
- if (timedOut) {
206
- const message = `pi CLI timed out after ${Math.round((limitMs / 60_000) * 10) / 10}m and was killed`;
207
- onEvent?.({ type: 'error', message });
208
- onEvent?.({ type: 'done' });
209
- return { text: textChunks.join('').trim(), toolCalls, tokensUsed, sessionId };
210
- }
211
- if (exitCode !== 0 && exitCode !== null) {
212
- const detail = stderr.join('').trim().split('\n').slice(-3).join(' | ');
213
- const message = `pi CLI exited with code ${exitCode}${detail ? ` — ${detail}` : ''}`;
214
- onEvent?.({ type: 'error', message });
215
- throw new Error(message);
216
- }
217
- if (!settled)
218
- onEvent?.({ type: 'note', message: 'pi RPC session ended before agent_settled' });
219
- if (tokensUsed === 0)
220
- onEvent?.({ type: 'note', message: 'token usage not reported by pi CLI' });
221
- opts.onUiEvent?.({ type: 'session.ended', reason: piUi.stopReason });
222
- onEvent?.({ type: 'done' });
223
- return { text: textChunks.join('').trim(), toolCalls, tokensUsed, sessionId };
224
- })();
225
- const session = {
226
- result,
227
- sendMessage,
228
- end,
229
- interrupt,
230
- pid: child.pid,
231
- get open() {
232
- return open;
233
- },
234
- };
235
- this.lastSession = session;
236
- return session;
237
- }
238
- }
239
- export function buildPiArgs(spec) {
240
- const args = ['--mode', 'rpc'];
241
- if (spec.sessionId)
242
- args.push(spec.resume ? '--session' : '--session-id', spec.sessionId);
243
- if (spec.systemPrompt)
244
- args.push('--append-system-prompt', spec.systemPrompt);
245
- if (spec.model)
246
- args.push('--model', spec.model);
247
- const tools = piTools(spec.allowedTools ?? [], spec.bashAllowlist);
248
- if (tools.length > 0)
249
- args.push('--tools', tools.join(','));
250
- return args;
251
- }
252
- function piTools(tools, bashAllowlist) {
253
- const map = {
254
- Read: 'read',
255
- Bash: 'bash',
256
- Edit: 'edit',
257
- Write: 'write',
258
- Grep: 'grep',
259
- Glob: 'find',
260
- };
261
- return [
262
- ...new Set(tools
263
- // Pi can allow/deny the whole bash tool but has no command-prefix
264
- // equivalent. Fail closed when a workflow requests that narrower mode.
265
- .filter((tool) => tool !== 'Bash' || !bashAllowlist || bashAllowlist.length === 0)
266
- .map((tool) => map[tool] ?? tool.toLowerCase())),
267
- ];
268
- }
269
- function toPiPrompt(content) {
270
- const text = [];
271
- const images = [];
272
- for (const block of content) {
273
- if (block.type === 'text')
274
- text.push(block.text);
275
- else
276
- images.push({ type: 'image', data: block.source.data, mimeType: block.source.media_type });
277
- }
278
- return { message: text.join('\n'), images };
279
- }
280
- function usageValues(value) {
281
- if (!isRecord(value))
282
- return undefined;
283
- const input = number(value.input) ?? 0;
284
- const output = number(value.output) ?? 0;
285
- const cacheRead = number(value.cacheRead) ?? 0;
286
- const cacheWrite = number(value.cacheWrite) ?? 0;
287
- const cost = isRecord(value.cost) ? number(value.cost.total) ?? 0 : 0;
288
- return { weighted: Math.round(input + output + cacheRead * 0.1 + cacheWrite * 1.25), cost };
289
- }
290
- function emitImages(value, onEvent) {
291
- if (!Array.isArray(value))
292
- return;
293
- for (const part of value) {
294
- if (isRecord(part) && part.type === 'image') {
295
- const data = string(part.data);
296
- const mediaType = string(part.mimeType);
297
- if (data && mediaType)
298
- onEvent?.({ type: 'image', data, mediaType });
299
- }
300
- }
301
- }
302
- function contentText(value) {
303
- if (typeof value === 'string')
304
- return value;
305
- if (!Array.isArray(value))
306
- return undefined;
307
- const text = value
308
- .map((part) => (isRecord(part) && part.type === 'text' ? string(part.text) : undefined))
309
- .filter((part) => part !== undefined);
310
- return text.length > 0 ? text.join('\n') : undefined;
311
- }
312
- function rpcError(value) {
313
- const error = isRecord(value.error) ? value.error : undefined;
314
- return string(error?.message) ?? string(value.message) ?? `pi RPC command ${string(value.command) ?? 'unknown'} failed`;
315
- }
316
- function waitForExit(child) {
317
- if (child.exitCode !== null)
318
- return Promise.resolve(child.exitCode);
319
- return new Promise((resolve) => child.once('close', resolve));
320
- }
321
- function wrapSpawnError(error, bin) {
322
- if (error.code === 'ENOENT') {
323
- return new Error(`\`${bin}\` not found on PATH — install pi and run \`pi\` once to configure a provider`);
324
- }
325
- return error;
326
- }
327
- function mockPiPath() {
328
- return new URL('../../scripts/mock-pi-rpc.mjs', import.meta.url).pathname;
329
- }
330
- function truncate(value, max = 200) {
331
- return value.length > max ? `${value.slice(0, max)}…` : value;
332
- }
333
- function isRecord(value) {
334
- return typeof value === 'object' && value !== null && !Array.isArray(value);
335
- }
336
- function string(value) {
337
- return typeof value === 'string' ? value : undefined;
338
- }
339
- function number(value) {
340
- return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
341
- }
342
- //# sourceMappingURL=pi-runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pi-runner.js","sourceRoot":"","sources":["../../src/core/pi-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAuC,MAAM,oBAAoB,CAAC;AAW7F,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEpF,MAAM,kBAAkB,GAAG,EAAE,GAAG,MAAM,CAAC;AACvC,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAS9B;;;;;GAKG;AACH,MAAM,OAAO,QAAQ;IACV,OAAO,GAAG,IAAa,CAAC;IAChB,GAAG,CAAS;IACZ,SAAS,CAAS;IAC3B,WAAW,GAAwB,IAAI,CAAC;IAEhD,YAAY,IAAI,GAAoB,EAAE;QACpC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACxD,CAAC;IAED,GAAG,CAAC,IAAkB,EAAE,OAAqC;QAC3D,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC;IAChC,CAAC;IAED,YAAY,CACV,IAAkB,EAClB,OAAqC,EACrC,IAAI,GAAmB,EAAE;QAEzB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE;YACnD,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,GAAG,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;SAClE,CAAC,CAAC;QACH,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,YAAwC,CAAC;QAC7C,IAAI,SAAqC,CAAC;QAC1C,IAAI,IAAI,GAAG,eAAe,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,SAAS,GAA0B,EAAE,CAAC;QAC5C,IAAI,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAAU,GAAiB,IAAI,CAAC;QACpC,MAAM,MAAM,GAAa,EAAE,CAAC;QAE5B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE;YACjD,UAAU,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,CAAC,KAAc,EAAQ,EAAE;YACtC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC5C,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM;gBAAE,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7D,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,CAAC,OAAgC,EAAW,EAAE;YAC1D,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACjD,IAAI,CAAC;gBACH,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAClD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC,CAAC;QACF,MAAM,WAAW,GAAG,CAAC,OAAuB,EAAW,EAAE;YACvD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC3B,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC;YACD,IACE,CAAC,KAAK,CAAC;gBACL,IAAI,EAAE,QAAQ;gBACd,OAAO;gBACP,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD,CAAC,EACF,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC;YACpB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM;gBAAE,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;YAC3D,OAAO,GAAG,KAAK,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC,CAAC;QACF,MAAM,GAAG,GAAG,GAAS,EAAE;YACrB,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,IAAI,GAAG,KAAK,CAAC;YACb,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAClB,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC,CAAC;YAC7F,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACtB,CAAC,CAAC;QACF,MAAM,SAAS,GAAG,GAAS,EAAE;YAC3B,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACzB,IAAI,GAAG,KAAK,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC,CAAC;QAEF,KAAK,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAChD,WAAW,CAAC;YACV,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;YACtB;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,UAAU;aACtB;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC;QACjD,MAAM,QAAQ,GACZ,OAAO,GAAG,CAAC;YACT,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;gBACd,QAAQ,GAAG,IAAI,CAAC;gBAChB,SAAS,EAAE,CAAC;YACd,CAAC,EAAE,OAAO,CAAC;YACb,CAAC,CAAC,SAAS,CAAC;QAChB,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QAEpB,MAAM,MAAM,GAAG,CAAC,KAAK,IAA6B,EAAE;YAClD,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;oBAClD,IAAI,KAAc,CAAC;oBACnB,IAAI,CAAC;wBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC3B,CAAC;oBAAC,MAAM,CAAC;wBACP,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qCAAqC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC5F,SAAS;oBACX,CAAC;oBACD,MAAM,CAAC,KAAK,CAAC,CAAC;oBACd,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;wBAAE,SAAS;oBAE/B,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBACjH,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAChD,IAAI,UAAU,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;4BAC3C,SAAS,GAAG,UAAU,CAAC;4BACvB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;wBACxD,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;wBAChE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBACzD,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC;wBACpF,MAAM,MAAM,GAAG,KAAK,CAAC,qBAAqB,CAAC;wBAC3C,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;4BACrE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;4BAC9B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;wBAClD,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;wBACzG,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;wBAC/C,IAAI,KAAK,EAAE,CAAC;4BACV,UAAU,IAAI,KAAK,CAAC,QAAQ,CAAC;4BAC7B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;4BAC/C,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;gCAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;wBACnE,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;wBACjD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBACpC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;wBACpC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;4BACf,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;4BAChD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;wBACtE,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;wBAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;wBACpC,IAAI,EAAE,EAAE,CAAC;4BACP,OAAO,EAAE,CAAC;gCACR,IAAI,EAAE,aAAa;gCACnB,UAAU,EAAE,EAAE;gCACd,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE;gCACpF,OAAO,EAAE,KAAK,CAAC,OAAO,KAAK,IAAI;6BAChC,CAAC,CAAC;4BACH,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;wBACjF,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;wBAC1C,OAAO,GAAG,IAAI,CAAC;wBACf,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;wBAChC,IAAI,IAAI,CAAC,qBAAqB,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;4BACxD,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;4BAClD,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;wBACzB,CAAC;oBACH,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;wBAC5C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;oBACpF,CAAC;gBACH,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,IAAI,QAAQ;oBAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACrC,IAAI,YAAY;oBAAE,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC7C,IAAI,SAAS;oBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;gBACvC,IAAI,GAAG,KAAK,CAAC;YACf,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,UAAU;gBAAE,MAAM,UAAU,CAAC;YACjC,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,0BAA0B,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,kBAAkB,CAAC;gBACrG,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC5B,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;YAChF,CAAC;YACD,IAAI,QAAQ,KAAK,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACxC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACxE,MAAM,OAAO,GAAG,2BAA2B,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACrF,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,2CAA2C,EAAE,CAAC,CAAC;YAChG,IAAI,UAAU,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oCAAoC,EAAE,CAAC,CAAC;YACjG,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;YACrE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5B,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QAChF,CAAC,CAAC,EAAE,CAAC;QAEL,MAAM,OAAO,GAAiB;YAC5B,MAAM;YACN,WAAW;YACX,GAAG;YACH,SAAS;YACT,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,IAAI,IAAI;gBACN,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC3B,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,IAAkB;IAC5C,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1F,IAAI,IAAI,CAAC,YAAY;QAAE,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9E,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACnE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,KAAe,EAAE,aAAwB;IACxD,MAAM,GAAG,GAAqC;QAC5C,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;KACb,CAAC;IACF,OAAO;QACL,GAAG,IAAI,GAAG,CACR,KAAK;YACH,kEAAkE;YAClE,uEAAuE;aACtE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,CAAC;aACjF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,CAClD;KACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,OAAuB;IAIzC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,MAAM,GAA6D,EAAE,CAAC;IAC5E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;;YAC5C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,GAAG,GAAG,UAAU,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AAC9F,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,OAAqC;IACvE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,IAAI,IAAI,SAAS;gBAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;SACvF,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,QAAQ,CAAC,KAA8B;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9D,OAAO,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,kBAAkB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,SAAS,SAAS,CAAC;AAC1H,CAAC;AAED,SAAS,WAAW,CAAC,KAAqC;IACxD,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,cAAc,CAAC,KAA4B,EAAE,GAAW;IAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,KAAK,CAAC,KAAK,GAAG,+EAA+E,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU;IACjB,OAAO,IAAI,GAAG,CAAC,+BAA+B,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;AAC5E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,GAAG,GAAG,GAAG;IACxC,OAAO,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAChE,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACjF,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Pure pi RPC → normalized protocol-v2 mapper.
3
- *
4
- * Contract: https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/docs/rpc.md
5
- * Unknown or malformed wire data is ignored; this mapper never throws.
6
- */
7
- import type { StopReason, UiEvent, UiToolItem } from './ui-events.js';
8
- export interface PiUiMapperState {
9
- readonly sessionStarted: boolean;
10
- readonly sessionId: string | null;
11
- readonly turnSeq: number;
12
- readonly turnId: string | null;
13
- readonly stopReason: StopReason;
14
- readonly startedItems: ReadonlySet<string>;
15
- readonly textByItem: ReadonlyMap<string, string>;
16
- readonly tools: ReadonlyMap<string, UiToolItem>;
17
- }
18
- export interface PiUiMapping {
19
- events: UiEvent[];
20
- state: PiUiMapperState;
21
- }
22
- export declare function createPiUiState(): PiUiMapperState;
23
- export declare function piTurnStarted(state: PiUiMapperState): PiUiMapping;
24
- export declare function mapPiRpcMessage(value: unknown, state: PiUiMapperState): PiUiMapping;
@@ -1,255 +0,0 @@
1
- import { toolDisplay } from './tool-display.js';
2
- export function createPiUiState() {
3
- return {
4
- sessionStarted: false,
5
- sessionId: null,
6
- turnSeq: 0,
7
- turnId: null,
8
- stopReason: 'end_turn',
9
- startedItems: new Set(),
10
- textByItem: new Map(),
11
- tools: new Map(),
12
- };
13
- }
14
- export function piTurnStarted(state) {
15
- const turnSeq = state.turnSeq + 1;
16
- const turnId = `turn_${turnSeq}`;
17
- return {
18
- events: [{ type: 'turn.started', turnId }],
19
- state: { ...state, turnSeq, turnId, stopReason: 'end_turn' },
20
- };
21
- }
22
- export function mapPiRpcMessage(value, state) {
23
- if (!isRecord(value) || typeof value.type !== 'string')
24
- return { events: [], state };
25
- if (value.type === 'response') {
26
- if (value.command === 'get_state' && value.success === true && isRecord(value.data)) {
27
- const sessionId = string(value.data.sessionId);
28
- if (sessionId && !state.sessionStarted) {
29
- const model = isRecord(value.data.model) ? string(value.data.model.id) : undefined;
30
- return {
31
- events: [{ type: 'session.started', sessionId, backend: 'pi', ...(model ? { model } : {}) }],
32
- state: { ...state, sessionStarted: true, sessionId },
33
- };
34
- }
35
- }
36
- if (value.success === false) {
37
- return {
38
- events: [{ type: 'session.error', message: rpcError(value), fatal: false }],
39
- state,
40
- };
41
- }
42
- return { events: [], state };
43
- }
44
- switch (value.type) {
45
- case 'message_update':
46
- return mapMessageUpdate(value, state);
47
- case 'message_end':
48
- return mapMessageEnd(value, state);
49
- case 'tool_execution_start':
50
- return mapToolStart(value, state);
51
- case 'tool_execution_update':
52
- return mapToolUpdate(value, state);
53
- case 'tool_execution_end':
54
- return mapToolEnd(value, state);
55
- case 'agent_settled':
56
- return completeTurn(state.stopReason, state);
57
- case 'extension_error': {
58
- const message = string(value.error) ?? string(value.message) ?? 'pi extension error';
59
- return { events: [{ type: 'session.error', message, fatal: false }], state };
60
- }
61
- default:
62
- return { events: [], state };
63
- }
64
- }
65
- function mapMessageUpdate(value, state) {
66
- const update = isRecord(value.assistantMessageEvent) ? value.assistantMessageEvent : undefined;
67
- const updateType = update ? string(update.type) : undefined;
68
- const contentIndex = update ? number(update.contentIndex) ?? 0 : 0;
69
- if (!update || !updateType || !state.turnId)
70
- return { events: [], state };
71
- if (updateType === 'done') {
72
- return {
73
- events: [],
74
- state: { ...state, stopReason: string(update.reason) === 'length' ? 'max_tokens' : 'end_turn' },
75
- };
76
- }
77
- if (updateType === 'error') {
78
- const reason = string(update.reason) === 'aborted' ? 'cancelled' : 'error';
79
- const error = isRecord(update.error) ? string(update.error.errorMessage) : undefined;
80
- return {
81
- events: [{ type: 'session.error', message: error ?? `pi model ${reason}`, fatal: false }],
82
- state: { ...state, stopReason: reason },
83
- };
84
- }
85
- const field = updateType.startsWith('thinking_') ? 'reasoning' : updateType.startsWith('text_') ? 'text' : null;
86
- if (!field)
87
- return { events: [], state };
88
- const itemId = `${state.turnId}_${field}_${contentIndex}`;
89
- const events = [];
90
- let startedItems = state.startedItems;
91
- let textByItem = state.textByItem;
92
- const makeItem = (text) => field === 'text'
93
- ? { kind: 'message', id: itemId, role: 'assistant', text }
94
- : { kind: 'reasoning', id: itemId, text };
95
- if (!startedItems.has(itemId)) {
96
- events.push({ type: 'item.started', item: makeItem('') });
97
- startedItems = new Set(startedItems).add(itemId);
98
- }
99
- const delta = string(update.delta);
100
- if (delta !== undefined) {
101
- events.push({ type: 'item.delta', itemId, field, delta });
102
- const next = new Map(textByItem);
103
- next.set(itemId, `${next.get(itemId) ?? ''}${delta}`);
104
- textByItem = next;
105
- }
106
- if (updateType.endsWith('_end')) {
107
- const text = string(update.content) ?? textByItem.get(itemId) ?? '';
108
- events.push({ type: 'item.completed', item: makeItem(text) });
109
- }
110
- return { events, state: { ...state, startedItems, textByItem } };
111
- }
112
- function mapToolStart(value, state) {
113
- const id = string(value.toolCallId);
114
- const name = string(value.toolName);
115
- if (!id || !name)
116
- return { events: [], state };
117
- const display = toolDisplay(name, value.args);
118
- const item = {
119
- kind: 'tool',
120
- id,
121
- name,
122
- toolKind: display.toolKind,
123
- title: display.title,
124
- status: 'running',
125
- input: value.args,
126
- };
127
- const diffs = toolDiffs(name, value.args);
128
- if (diffs)
129
- item.diffs = diffs;
130
- const tools = new Map(state.tools);
131
- tools.set(id, item);
132
- const events = [{ type: 'item.started', item }];
133
- const plan = toolPlan(name, value.args);
134
- if (plan)
135
- events.push({ type: 'plan.updated', entries: plan });
136
- return { events, state: { ...state, tools } };
137
- }
138
- function mapToolUpdate(value, state) {
139
- const id = string(value.toolCallId);
140
- const previous = id ? state.tools.get(id) : undefined;
141
- if (!id || !previous)
142
- return { events: [], state };
143
- const output = contentText(isRecord(value.partialResult) ? value.partialResult.content : undefined);
144
- if (output === undefined)
145
- return { events: [], state };
146
- const item = { ...previous, output };
147
- const tools = new Map(state.tools);
148
- tools.set(id, item);
149
- return { events: [{ type: 'item.updated', item }], state: { ...state, tools } };
150
- }
151
- function mapToolEnd(value, state) {
152
- const id = string(value.toolCallId);
153
- const previous = id ? state.tools.get(id) : undefined;
154
- if (!id || !previous)
155
- return { events: [], state };
156
- const result = isRecord(value.result) ? value.result : {};
157
- const output = contentText(result.content);
158
- const isError = value.isError === true;
159
- const item = {
160
- ...previous,
161
- status: isError ? 'failed' : 'completed',
162
- ...(isError ? { error: output ?? 'pi tool failed' } : output !== undefined ? { output } : {}),
163
- };
164
- const tools = new Map(state.tools);
165
- tools.set(id, item);
166
- return { events: [{ type: 'item.completed', item }], state: { ...state, tools } };
167
- }
168
- function completeTurn(reason, state) {
169
- if (!state.turnId)
170
- return { events: [], state };
171
- return {
172
- events: [{ type: 'turn.completed', turnId: state.turnId, stopReason: reason }],
173
- state: { ...state, turnId: null },
174
- };
175
- }
176
- function mapMessageEnd(value, state) {
177
- const message = isRecord(value.message) ? value.message : undefined;
178
- const usage = message && message.role === 'assistant' ? usageEvent(message.usage) : undefined;
179
- return { events: usage ? [usage] : [], state };
180
- }
181
- function usageEvent(value) {
182
- if (!isRecord(value))
183
- return undefined;
184
- const input = number(value.input) ?? 0;
185
- const output = number(value.output) ?? 0;
186
- const cacheRead = number(value.cacheRead);
187
- const cacheWrite = number(value.cacheWrite);
188
- const total = number(value.totalTokens) ?? input + output + (cacheRead ?? 0) + (cacheWrite ?? 0);
189
- if (total <= 0)
190
- return undefined;
191
- const cost = isRecord(value.cost) ? number(value.cost.total) : undefined;
192
- return {
193
- type: 'usage.updated',
194
- usage: {
195
- input,
196
- output,
197
- total,
198
- ...(cacheRead !== undefined ? { cacheRead } : {}),
199
- ...(cacheWrite !== undefined ? { cacheWrite } : {}),
200
- },
201
- ...(cost !== undefined ? { costUsd: cost } : {}),
202
- };
203
- }
204
- function toolDiffs(name, input) {
205
- if (!isRecord(input) || !['edit', 'write'].includes(name.toLowerCase()))
206
- return undefined;
207
- const path = string(input.path) ?? string(input.file_path) ?? string(input.filePath);
208
- if (!path)
209
- return undefined;
210
- const oldText = string(input.oldText) ?? string(input.old_string) ?? (name.toLowerCase() === 'write' ? null : undefined);
211
- const newText = string(input.newText) ?? string(input.new_string) ?? string(input.content);
212
- if (oldText === undefined && newText === undefined)
213
- return undefined;
214
- return [{ path, oldText: oldText ?? null, ...(newText !== undefined ? { newText } : {}) }];
215
- }
216
- function toolPlan(name, input) {
217
- if (!['todowrite', 'todo_write'].includes(name.toLowerCase()) || !isRecord(input) || !Array.isArray(input.todos)) {
218
- return undefined;
219
- }
220
- const entries = [];
221
- for (const todo of input.todos) {
222
- if (!isRecord(todo))
223
- continue;
224
- const content = string(todo.content);
225
- const status = string(todo.status);
226
- if (!content || !['pending', 'in_progress', 'completed', 'cancelled'].includes(status ?? ''))
227
- continue;
228
- entries.push({ content, status: status });
229
- }
230
- return entries;
231
- }
232
- function rpcError(value) {
233
- const error = isRecord(value.error) ? value.error : undefined;
234
- return string(error?.message) ?? string(value.message) ?? `pi RPC command ${string(value.command) ?? 'unknown'} failed`;
235
- }
236
- function contentText(value) {
237
- if (typeof value === 'string')
238
- return value;
239
- if (!Array.isArray(value))
240
- return undefined;
241
- const parts = value
242
- .map((part) => (isRecord(part) && part.type === 'text' ? string(part.text) : undefined))
243
- .filter((part) => part !== undefined);
244
- return parts.length > 0 ? parts.join('\n') : undefined;
245
- }
246
- function isRecord(value) {
247
- return typeof value === 'object' && value !== null && !Array.isArray(value);
248
- }
249
- function string(value) {
250
- return typeof value === 'string' ? value : undefined;
251
- }
252
- function number(value) {
253
- return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
254
- }
255
- //# sourceMappingURL=pi-ui-mapper.js.map