@scotthuang/agent-knock-knock-pi 0.1.0-poc.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/lib/index.js ADDED
@@ -0,0 +1,418 @@
1
+ /** Pi-as-orchestrator POC: Pi controls Codex and Claude Code through AKK. */
2
+ import path from "node:path";
3
+ import { VERSION as PI_RUNTIME_VERSION } from "@earendil-works/pi-coding-agent";
4
+ import { createHostAdapter, } from "@scotthuang/agent-knock-knock/host-adapter";
5
+ import { CONNECTOR_STORE_DIR_ENV, CONNECTOR_NAME, LIFECYCLE_INTERVAL_MS, SUPPORTED_PI_VERSION, } from "./constants.js";
6
+ import { CallbackInbox } from "./callback-inbox.js";
7
+ import { createCallbackIpcServer } from "./ipc.js";
8
+ import { createConnectorProfileResources, } from "./profile.js";
9
+ import { PiRouteTable, } from "./routes.js";
10
+ import { adaptHostToolInputSchema, compileAuthoritativeInputValidator, } from "./schema-adapter.js";
11
+ const CALLBACK_CUSTOM_TYPE = "agent-knock-knock-callback";
12
+ const COMMAND_CUSTOM_TYPE = "agent-knock-knock-command";
13
+ const APPROVE_TOOL = "agent_knock_knock_approve";
14
+ const CANCEL_TOOL = "agent_knock_knock_cancel";
15
+ const STATUS_TOOL = "agent_knock_knock_status";
16
+ const EXPECTED_TOOL_COUNT = 16;
17
+ const MAX_APPROVAL_DISPLAY_CHARS = 8_000;
18
+ const DEFAULT_DEPENDENCIES = Object.freeze({
19
+ piVersion: PI_RUNTIME_VERSION,
20
+ createConnectorProfileResources,
21
+ createCallbackInbox: (options) => new CallbackInbox(options),
22
+ createRouteTable: (inbox, instanceNonce) => new PiRouteTable(inbox, instanceNonce),
23
+ createCallbackIpcServer,
24
+ createHostAdapter,
25
+ });
26
+ /** Mount one Host-owned AKK runtime for the current Pi session incarnation. */
27
+ export default function agentKnockKnockPi(pi) {
28
+ applyWithDependencies(pi);
29
+ }
30
+ /** @internal Mount with deterministic process, IPC, and HostAdapter seams. */
31
+ export function applyWithDependencies(pi, dependencies = {}) {
32
+ const resolved = { ...DEFAULT_DEPENDENCIES, ...dependencies };
33
+ let live;
34
+ pi.on("session_start", async (_event, ctx) => {
35
+ if (live?.running) {
36
+ throw new Error("Pi AKK connector started more than once");
37
+ }
38
+ assertSupportedPiVersion(resolved.piVersion);
39
+ const connector = await startConnector(pi, ctx, resolved);
40
+ live = connector;
41
+ try {
42
+ registerPiSurface(pi, connector, () => requiredLive(live));
43
+ ctx.ui.setStatus(CONNECTOR_NAME, "AKK ready");
44
+ }
45
+ catch (error) {
46
+ live = undefined;
47
+ await stopConnector(connector);
48
+ throw error;
49
+ }
50
+ });
51
+ pi.on("session_tree", (_event, ctx) => {
52
+ const current = requiredLive(live);
53
+ rotateControllerTarget(pi, current, ctx, () => live);
54
+ });
55
+ pi.on("session_shutdown", async (_event, ctx) => {
56
+ const current = live;
57
+ ctx.ui.setStatus(CONNECTOR_NAME, undefined);
58
+ try {
59
+ if (current)
60
+ await stopConnector(current);
61
+ }
62
+ finally {
63
+ if (live === current)
64
+ live = undefined;
65
+ }
66
+ });
67
+ }
68
+ async function startConnector(pi, ctx, dependencies) {
69
+ const resources = dependencies.createConnectorProfileResources(relayEnvironment(process.env));
70
+ let inbox;
71
+ let routes;
72
+ let server;
73
+ let adapter;
74
+ let connector;
75
+ let lifecycleStarted = false;
76
+ try {
77
+ inbox = dependencies.createCallbackInbox({
78
+ filePath: path.join(resources.stateDirectory, "callback-inbox.json"),
79
+ });
80
+ routes = dependencies.createRouteTable(inbox, resources.instanceNonce);
81
+ server = dependencies.createCallbackIpcServer({
82
+ socketPath: resources.socketPath,
83
+ token: resources.token,
84
+ routes,
85
+ });
86
+ const lifecycleControllerId = `akk-pi:${resources.instanceNonce}:lifecycle`;
87
+ const pluginConfig = connectorPluginConfig(process.env);
88
+ adapter = dependencies.createHostAdapter({
89
+ environmentForContext(context) {
90
+ if (context.sessionKey !== context.sessionId) {
91
+ throw new Error("Pi AKK controller identities diverged");
92
+ }
93
+ return resources.environment(context.sessionKey);
94
+ },
95
+ lifecycleEnvironment: resources.environment(lifecycleControllerId),
96
+ lifecycleIntervalMs: LIFECYCLE_INTERVAL_MS,
97
+ pluginConfig,
98
+ logger: {
99
+ debug: () => undefined,
100
+ info: () => undefined,
101
+ warn: () => undefined,
102
+ error: () => undefined,
103
+ },
104
+ });
105
+ let current = {};
106
+ const target = createTarget(pi, ctx, resources, 0, () => current);
107
+ connector = {
108
+ resources,
109
+ inbox,
110
+ routes,
111
+ server,
112
+ adapter,
113
+ target,
114
+ branchEpoch: 0,
115
+ running: true,
116
+ };
117
+ current = connector;
118
+ await server.start();
119
+ adapter.lifecycle.start();
120
+ lifecycleStarted = true;
121
+ return connector;
122
+ }
123
+ catch (error) {
124
+ if (connector)
125
+ connector.running = false;
126
+ if (lifecycleStarted)
127
+ await adapter?.lifecycle.stop().catch(() => undefined);
128
+ await server?.stop().catch(() => undefined);
129
+ await routes?.close().catch(() => undefined);
130
+ await inbox?.close().catch(() => undefined);
131
+ resources.remove();
132
+ throw error;
133
+ }
134
+ }
135
+ function registerPiSurface(pi, initial, current) {
136
+ pi.registerCommand(initial.adapter.command.name, {
137
+ description: initial.adapter.command.description,
138
+ handler: async (args, ctx) => {
139
+ const connector = current();
140
+ const result = await connector.adapter.executeCommand(controllerContext(connector), args, ctx.signal);
141
+ pi.sendMessage({
142
+ customType: COMMAND_CUSTOM_TYPE,
143
+ content: result.text,
144
+ display: true,
145
+ details: { isError: result.isError === true },
146
+ }, { triggerTurn: false });
147
+ if (result.isError)
148
+ ctx.ui.notify("AKK command failed", "error");
149
+ },
150
+ });
151
+ if (initial.adapter.tools.length !== EXPECTED_TOOL_COUNT) {
152
+ throw new Error(`agent-knock-knock-pi expected ${EXPECTED_TOOL_COUNT} AKK tools, ` +
153
+ `received ${initial.adapter.tools.length}`);
154
+ }
155
+ for (const metadata of initial.adapter.tools) {
156
+ pi.registerTool(toolDefinition(metadata, current));
157
+ }
158
+ }
159
+ function toolDefinition(metadata, current) {
160
+ const parameters = adaptHostToolInputSchema(metadata.inputSchema);
161
+ const validate = compileAuthoritativeInputValidator(metadata.inputSchema);
162
+ return {
163
+ name: metadata.name,
164
+ label: toolLabel(metadata.name),
165
+ description: metadata.description,
166
+ parameters,
167
+ executionMode: "sequential",
168
+ async execute(toolCallId, rawParameters, signal, _onUpdate, ctx) {
169
+ validate(rawParameters);
170
+ const args = requiredRecord(rawParameters, metadata.name);
171
+ const connector = current();
172
+ const result = metadata.name === APPROVE_TOOL
173
+ ? await executeApproval(connector, toolCallId, args, signal, ctx)
174
+ : metadata.name === CANCEL_TOOL
175
+ ? await executeConfirmedCancel(connector, toolCallId, args, signal, ctx)
176
+ : await connector.adapter.executeTool(controllerContext(connector), metadata.name, toolCallId, args, signal);
177
+ if (result.isError)
178
+ throw new Error(hostToolResultText(result));
179
+ return {
180
+ content: [{ type: "text", text: hostToolResultText(result) }],
181
+ details: losslessDetails(result),
182
+ };
183
+ },
184
+ };
185
+ }
186
+ async function executeApproval(connector, toolCallId, args, signal, ctx) {
187
+ if (!ctx.hasUI) {
188
+ throw new Error("AKK approval requires an interactive Pi confirmation");
189
+ }
190
+ const statusArgs = approvalStatusArguments(args);
191
+ const controller = controllerContext(connector);
192
+ const status = await connector.adapter.executeTool(controller, STATUS_TOOL, `${toolCallId}:approval-status`, statusArgs, signal);
193
+ if (status.isError)
194
+ throw new Error(hostToolResultText(status));
195
+ const statusText = truncateForDialog(hostToolResultText(status));
196
+ const turnId = nonBlankString(args.turn_id);
197
+ const choices = turnId
198
+ ? ["Approve once", "Reject and cancel task", "Keep pending"]
199
+ : ["Approve once", "Keep pending"];
200
+ const choice = await ctx.ui.select(`AKK approval request\n\n${statusText}`, choices, signal ? { signal } : undefined);
201
+ if (choice === "Approve once") {
202
+ return connector.adapter.executeTool(controller, APPROVE_TOOL, toolCallId, args, signal);
203
+ }
204
+ if (choice === "Reject and cancel task") {
205
+ const confirmed = await ctx.ui.confirm("Reject approval and cancel AKK task?", "This interrupts the current managed task; it is not a native deny-and-continue action.", signal ? { signal } : undefined);
206
+ if (confirmed) {
207
+ return connector.adapter.executeTool(controller, CANCEL_TOOL, `${toolCallId}:cancel`, approvalCancelArguments(args), signal);
208
+ }
209
+ }
210
+ return informationalResult("Approval was not sent; the request remains pending.");
211
+ }
212
+ async function executeConfirmedCancel(connector, toolCallId, args, signal, ctx) {
213
+ if (!ctx.hasUI) {
214
+ throw new Error("AKK cancellation requires an interactive Pi confirmation");
215
+ }
216
+ const confirmed = await ctx.ui.confirm("Cancel AKK task?", "This interrupts the exact AKK task selected by the tool call.", signal ? { signal } : undefined);
217
+ if (!confirmed)
218
+ return informationalResult("Cancellation was not sent.");
219
+ return connector.adapter.executeTool(controllerContext(connector), CANCEL_TOOL, toolCallId, args, signal);
220
+ }
221
+ function createTarget(pi, ctx, resources, branchEpoch, current) {
222
+ const authority = Object.freeze({
223
+ connector: CONNECTOR_NAME,
224
+ nonce: resources.instanceNonce,
225
+ branchEpoch,
226
+ });
227
+ const sessionId = ctx.sessionManager.getSessionId();
228
+ const runtimeGeneration = `${resources.instanceNonce}:branch:${branchEpoch}`;
229
+ const anchorLeafId = ctx.sessionManager.getLeafId();
230
+ let target;
231
+ target = Object.freeze({
232
+ authority,
233
+ sessionId,
234
+ runtimeGeneration,
235
+ anchorLeafId,
236
+ isLive() {
237
+ const connector = current();
238
+ return connector.running && connector.target === target &&
239
+ ctx.sessionManager.getSessionId() === sessionId;
240
+ },
241
+ deliver(body, request) {
242
+ if (!target.isLive()) {
243
+ throw new Error("Pi callback target is no longer live");
244
+ }
245
+ pi.sendMessage({
246
+ customType: CALLBACK_CUSTOM_TYPE,
247
+ content: body,
248
+ display: true,
249
+ details: {
250
+ controllerId: request.controllerId,
251
+ deliveryId: request.deliveryId,
252
+ messageId: request.messageId,
253
+ idempotencyKey: request.idempotencyKey,
254
+ sessionId,
255
+ runtimeGeneration,
256
+ anchorLeafId,
257
+ },
258
+ }, {
259
+ triggerTurn: true,
260
+ ...(ctx.isIdle() ? {} : { deliverAs: "followUp" }),
261
+ });
262
+ },
263
+ });
264
+ return target;
265
+ }
266
+ function rotateControllerTarget(pi, connector, ctx, current) {
267
+ const previous = connector.target;
268
+ connector.routes.dispose(previous);
269
+ connector.adapter.disposeContext(previous.authority);
270
+ connector.branchEpoch += 1;
271
+ connector.target = createTarget(pi, ctx, connector.resources, connector.branchEpoch, () => current() ?? connector);
272
+ ctx.ui.notify("AKK controller route was renewed for the selected Pi branch.", "info");
273
+ }
274
+ async function stopConnector(connector) {
275
+ if (connector.stopPromise)
276
+ return connector.stopPromise;
277
+ connector.stopPromise = (async () => {
278
+ const failures = [];
279
+ await settleCleanup(() => connector.adapter.lifecycle.stop(), failures);
280
+ await settleCleanup(() => connector.server.stop(), failures);
281
+ connector.running = false;
282
+ settleSynchronousCleanup(() => {
283
+ connector.routes.dispose(connector.target);
284
+ connector.adapter.disposeContext(connector.target.authority);
285
+ }, failures);
286
+ await settleCleanup(() => connector.routes.close(), failures);
287
+ await settleCleanup(() => connector.inbox.close(), failures);
288
+ settleSynchronousCleanup(() => connector.resources.remove(), failures);
289
+ if (failures.length > 0) {
290
+ throw new AggregateError(failures, "Pi AKK connector cleanup failed");
291
+ }
292
+ })();
293
+ return connector.stopPromise;
294
+ }
295
+ function controllerContext(connector) {
296
+ if (!connector.running)
297
+ throw new Error("Pi AKK connector is not running");
298
+ const route = connector.routes.bind(connector.target);
299
+ return Object.freeze({
300
+ sessionKey: route.controllerId,
301
+ sessionId: route.controllerId,
302
+ authority: connector.target.authority,
303
+ });
304
+ }
305
+ function approvalStatusArguments(args) {
306
+ const turnId = nonBlankString(args.turn_id);
307
+ if (turnId)
308
+ return { turn_id: turnId };
309
+ const terminalId = nonBlankString(args.terminal_id);
310
+ if (terminalId)
311
+ return { conversation_id: terminalId };
312
+ throw new Error("AKK approval requires turn_id or terminal_id");
313
+ }
314
+ function approvalCancelArguments(args) {
315
+ const turnId = nonBlankString(args.turn_id);
316
+ if (turnId)
317
+ return { turn_id: turnId };
318
+ throw new Error("AKK approval cancellation requires a managed turn_id");
319
+ }
320
+ function assertSupportedPiVersion(version) {
321
+ if (version !== SUPPORTED_PI_VERSION) {
322
+ throw new Error(`agent-knock-knock-pi POC requires Pi ${SUPPORTED_PI_VERSION}; ` +
323
+ `received ${version || "unknown"}`);
324
+ }
325
+ }
326
+ function connectorPluginConfig(environment) {
327
+ const storeDir = environment[CONNECTOR_STORE_DIR_ENV];
328
+ if (!storeDir)
329
+ return Object.freeze({});
330
+ if (!path.isAbsolute(storeDir)) {
331
+ throw new Error(`${CONNECTOR_STORE_DIR_ENV} must be an absolute path`);
332
+ }
333
+ return Object.freeze({ storeDir: path.resolve(storeDir) });
334
+ }
335
+ async function settleCleanup(cleanup, failures) {
336
+ try {
337
+ await cleanup();
338
+ }
339
+ catch (error) {
340
+ failures.push(error);
341
+ }
342
+ }
343
+ function settleSynchronousCleanup(cleanup, failures) {
344
+ try {
345
+ cleanup();
346
+ }
347
+ catch (error) {
348
+ failures.push(error);
349
+ }
350
+ }
351
+ function hostToolResultText(result) {
352
+ const text = result.content
353
+ ?.filter((block) => block.type === "text" && typeof block.text === "string")
354
+ .map((block) => block.text)
355
+ .join("\n")
356
+ .trim();
357
+ if (text)
358
+ return text;
359
+ if (result.details !== undefined) {
360
+ try {
361
+ return JSON.stringify(result.details);
362
+ }
363
+ catch {
364
+ // Fall through to one stable result below.
365
+ }
366
+ }
367
+ return "AKK command completed.";
368
+ }
369
+ function informationalResult(text) {
370
+ return { content: [{ type: "text", text }], details: { acknowledged: false } };
371
+ }
372
+ function losslessDetails(value) {
373
+ try {
374
+ const encoded = JSON.stringify(value);
375
+ return encoded === undefined ? undefined : JSON.parse(encoded);
376
+ }
377
+ catch {
378
+ return undefined;
379
+ }
380
+ }
381
+ function requiredRecord(value, toolName) {
382
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
383
+ throw new Error(`${toolName} arguments must be an object`);
384
+ }
385
+ return value;
386
+ }
387
+ function requiredLive(value) {
388
+ if (!value?.running)
389
+ throw new Error("Pi AKK connector is not running");
390
+ return value;
391
+ }
392
+ function truncateForDialog(value) {
393
+ if (value.length <= MAX_APPROVAL_DISPLAY_CHARS)
394
+ return value;
395
+ return `${value.slice(0, MAX_APPROVAL_DISPLAY_CHARS)}\n…(truncated)`;
396
+ }
397
+ function toolLabel(name) {
398
+ return name
399
+ .replace(/^agent_knock_knock_/u, "AKK ")
400
+ .split("_")
401
+ .map((part) => part.length > 0
402
+ ? `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`
403
+ : part)
404
+ .join(" ");
405
+ }
406
+ function nonBlankString(value) {
407
+ return typeof value === "string" && value.trim().length > 0
408
+ ? value
409
+ : undefined;
410
+ }
411
+ /** Keep the Pi model credential out of AKK relay and callback subprocesses. */
412
+ function relayEnvironment(environment) {
413
+ const relay = { ...environment };
414
+ delete relay.ZAI_CODING_CN_API_KEY;
415
+ delete relay.ZAI_API_KEY;
416
+ return relay;
417
+ }
418
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EACL,iBAAiB,GAMlB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAA0B,MAAM,UAAU,CAAC;AAC3E,OAAO,EACL,+BAA+B,GAEhC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,YAAY,GAGb,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,kCAAkC,GACnC,MAAM,qBAAqB,CAAC;AAE7B,MAAM,oBAAoB,GAAG,4BAA4B,CAAC;AAC1D,MAAM,mBAAmB,GAAG,2BAA2B,CAAC;AACxD,MAAM,YAAY,GAAG,2BAA2B,CAAC;AACjD,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAC/C,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAC/C,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,MAAM,0BAA0B,GAAG,KAAK,CAAC;AA6BzC,MAAM,oBAAoB,GAA0B,MAAM,CAAC,MAAM,CAAC;IAChE,SAAS,EAAE,kBAAkB;IAC7B,+BAA+B;IAC/B,mBAAmB,EAAE,CACnB,OAAuD,EACvD,EAAE,CAAC,IAAI,aAAa,CAAC,OAAO,CAAC;IAC/B,gBAAgB,EAAE,CAAC,KAAoB,EAAE,aAAqB,EAAE,EAAE,CAChE,IAAI,YAAY,CAAC,KAAK,EAAE,aAAa,CAAC;IACxC,uBAAuB;IACvB,iBAAiB;CAClB,CAAC,CAAC;AAEH,+EAA+E;AAC/E,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EAAgB;IACxD,qBAAqB,CAAC,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,qBAAqB,CACnC,EAAgB,EAChB,eAA+C,EAAE;IAEjD,MAAM,QAAQ,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,YAAY,EAAE,CAAC;IAC9D,IAAI,IAA+B,CAAC;IAEpC,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC3C,IAAI,IAAI,EAAE,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QACD,wBAAwB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,GAAG,SAAS,CAAC;QACjB,IAAI,CAAC;YACH,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3D,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,GAAG,SAAS,CAAC;YACjB,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,sBAAsB,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,IAAI,OAAO;gBAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,OAAO;gBAAE,IAAI,GAAG,SAAS,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,EAAgB,EAChB,GAAqB,EACrB,YAAmC;IAEnC,MAAM,SAAS,GAAG,YAAY,CAAC,+BAA+B,CAC5D,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAC9B,CAAC;IACF,IAAI,KAAgC,CAAC;IACrC,IAAI,MAAgC,CAAC;IACrC,IAAI,MAAqC,CAAC;IAC1C,IAAI,OAAgC,CAAC;IACrC,IAAI,SAAoC,CAAC;IACzC,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,IAAI,CAAC;QACH,KAAK,GAAG,YAAY,CAAC,mBAAmB,CAAC;YACvC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,qBAAqB,CAAC;SACrE,CAAC,CAAC;QACH,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,KAAK,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;QACvE,MAAM,GAAG,YAAY,CAAC,uBAAuB,CAAC;YAC5C,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,MAAM;SACP,CAAC,CAAC;QACH,MAAM,qBAAqB,GAAG,UAAU,SAAS,CAAC,aAAa,YAAY,CAAC;QAC5E,MAAM,YAAY,GAAG,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,GAAG,YAAY,CAAC,iBAAiB,CAAC;YACvC,qBAAqB,CAAC,OAAO;gBAC3B,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;oBAC7C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAC3D,CAAC;gBACD,OAAO,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACnD,CAAC;YACD,oBAAoB,EAAE,SAAS,CAAC,WAAW,CAAC,qBAAqB,CAAC;YAClE,mBAAmB,EAAE,qBAAqB;YAC1C,YAAY;YACZ,MAAM,EAAE;gBACN,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;gBACtB,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;gBACrB,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;gBACrB,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS;aACvB;SACF,CAAC,CAAC;QACH,IAAI,OAAO,GAAG,EAAmB,CAAC;QAClC,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAClE,SAAS,GAAG;YACV,SAAS;YACT,KAAK;YACL,MAAM;YACN,MAAM;YACN,OAAO;YACP,MAAM;YACN,WAAW,EAAE,CAAC;YACd,OAAO,EAAE,IAAI;SACd,CAAC;QACF,OAAO,GAAG,SAAS,CAAC;QACpB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC1B,gBAAgB,GAAG,IAAI,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS;YAAE,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;QACzC,IAAI,gBAAgB;YAAE,MAAM,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7E,MAAM,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC5C,SAAS,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,EAAgB,EAChB,OAAsB,EACtB,OAA4B;IAE5B,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;QAC/C,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW;QAChD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;YAC3B,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,cAAc,CACnD,iBAAiB,CAAC,SAAS,CAAC,EAC5B,IAAI,EACJ,GAAG,CAAC,MAAM,CACX,CAAC;YACF,EAAE,CAAC,WAAW,CAAC;gBACb,UAAU,EAAE,mBAAmB;gBAC/B,OAAO,EAAE,MAAM,CAAC,IAAI;gBACpB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE;aAC9C,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3B,IAAI,MAAM,CAAC,OAAO;gBAAE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QACnE,CAAC;KACF,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,mBAAmB,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,iCAAiC,mBAAmB,cAAc;YAClE,YAAY,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAC3C,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7C,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,QAAiC,EACjC,OAA4B;IAE5B,MAAM,UAAU,GAAG,wBAAwB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,kCAAkC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1E,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,UAAU;QACV,aAAa,EAAE,YAAY;QAC3B,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;YAC7D,QAAQ,CAAC,aAAa,CAAC,CAAC;YACxB,MAAM,IAAI,GAAG,cAAc,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,KAAK,YAAY;gBAC3C,CAAC,CAAC,MAAM,eAAe,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC;gBACjE,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW;oBAC7B,CAAC,CAAC,MAAM,sBAAsB,CAC1B,SAAS,EACT,UAAU,EACV,IAAI,EACJ,MAAM,EACN,GAAG,CACJ;oBACH,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,WAAW,CACjC,iBAAiB,CAAC,SAAS,CAAC,EAC5B,QAAQ,CAAC,IAAI,EACb,UAAU,EACV,IAAI,EACJ,MAAM,CACP,CAAC;YACR,IAAI,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;YAChE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7D,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC;aACjC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,SAAwB,EACxB,UAAkB,EAClB,IAAuC,EACvC,MAA+B,EAC/B,GAAqB;IAErB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,WAAW,CAChD,UAAU,EACV,WAAW,EACX,GAAG,UAAU,kBAAkB,EAC/B,UAAU,EACV,MAAM,CACP,CAAC;IACF,IAAI,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhE,MAAM,UAAU,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM;QACpB,CAAC,CAAC,CAAC,cAAc,EAAE,wBAAwB,EAAE,cAAc,CAAC;QAC5D,CAAC,CAAC,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAChC,2BAA2B,UAAU,EAAE,EACvC,OAAO,EACP,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAChC,CAAC;IACF,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,CAClC,UAAU,EACV,YAAY,EACZ,UAAU,EACV,IAAI,EACJ,MAAM,CACP,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,KAAK,wBAAwB,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CACpC,sCAAsC,EACtC,wFAAwF,EACxF,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAChC,CAAC;QACF,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,CAClC,UAAU,EACV,WAAW,EACX,GAAG,UAAU,SAAS,EACtB,uBAAuB,CAAC,IAAI,CAAC,EAC7B,MAAM,CACP,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,mBAAmB,CAAC,qDAAqD,CAAC,CAAC;AACpF,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,SAAwB,EACxB,UAAkB,EAClB,IAAuC,EACvC,MAA+B,EAC/B,GAAqB;IAErB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,OAAO,CACpC,kBAAkB,EAClB,+DAA+D,EAC/D,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAChC,CAAC;IACF,IAAI,CAAC,SAAS;QAAE,OAAO,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;IACzE,OAAO,SAAS,CAAC,OAAO,CAAC,WAAW,CAClC,iBAAiB,CAAC,SAAS,CAAC,EAC5B,WAAW,EACX,UAAU,EACV,IAAI,EACJ,MAAM,CACP,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,EAAgB,EAChB,GAAqB,EACrB,SAAoC,EACpC,WAAmB,EACnB,OAA4B;IAE5B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,SAAS,EAAE,cAAc;QACzB,KAAK,EAAE,SAAS,CAAC,aAAa;QAC9B,WAAW;KACZ,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;IACpD,MAAM,iBAAiB,GAAG,GAAG,SAAS,CAAC,aAAa,WAAW,WAAW,EAAE,CAAC;IAC7E,MAAM,YAAY,GAAG,GAAG,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;IACpD,IAAI,MAAwB,CAAC;IAC7B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACrB,SAAS;QACT,SAAS;QACT,iBAAiB;QACjB,YAAY;QACZ,MAAM;YACJ,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM;gBACrD,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,KAAK,SAAS,CAAC;QACpD,CAAC;QACD,OAAO,CAAC,IAAY,EAAE,OAAwB;YAC5C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC1D,CAAC;YACD,EAAE,CAAC,WAAW,CAAC;gBACb,UAAU,EAAE,oBAAoB;gBAChC,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP,YAAY,EAAE,OAAO,CAAC,YAAY;oBAClC,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;oBACtC,SAAS;oBACT,iBAAiB;oBACjB,YAAY;iBACb;aACF,EAAE;gBACD,WAAW,EAAE,IAAI;gBACjB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,UAAmB,EAAE,CAAC;aAC5D,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAC7B,EAAgB,EAChB,SAAwB,EACxB,GAAqB,EACrB,OAAwC;IAExC,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC;IAClC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrD,SAAS,CAAC,WAAW,IAAI,CAAC,CAAC;IAC3B,SAAS,CAAC,MAAM,GAAG,YAAY,CAC7B,EAAE,EACF,GAAG,EACH,SAAS,CAAC,SAAS,EACnB,SAAS,CAAC,WAAW,EACrB,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,SAAS,CAC7B,CAAC;IACF,GAAG,CAAC,EAAE,CAAC,MAAM,CACX,8DAA8D,EAC9D,MAAM,CACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,SAAwB;IACnD,IAAI,SAAS,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC,WAAW,CAAC;IACxD,SAAS,CAAC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QAClC,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,MAAM,aAAa,CACjB,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EACxC,QAAQ,CACT,CAAC;QACF,MAAM,aAAa,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC7D,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;QAC1B,wBAAwB,CAAC,GAAG,EAAE;YAC5B,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC3C,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC,EAAE,QAAQ,CAAC,CAAC;QACb,MAAM,aAAa,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,aAAa,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC7D,wBAAwB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;QACvE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,cAAc,CAAC,QAAQ,EAAE,iCAAiC,CAAC,CAAC;QACxE,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,SAAS,CAAC,WAAW,CAAC;AAC/B,CAAC;AAED,SAAS,iBAAiB,CACxB,SAAwB;IAExB,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE,KAAK,CAAC,YAAY;QAC9B,SAAS,EAAE,KAAK,CAAC,YAAY;QAC7B,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS;KACtC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAAuC;IAEvC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACvC,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,UAAU;QAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;IACvD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAAuC;IAEvC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACvC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAC/C,IAAI,OAAO,KAAK,oBAAoB,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,wCAAwC,oBAAoB,IAAI;YAChE,YAAY,OAAO,IAAI,SAAS,EAAE,CACnC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,WAAwC;IAExC,MAAM,QAAQ,GAAG,WAAW,CAAC,uBAAuB,CAAC,CAAC;IACtD,IAAI,CAAC,QAAQ;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,GAAG,uBAAuB,2BAA2B,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,OAA4B,EAC5B,QAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,OAAmB,EACnB,QAAmB;IAEnB,IAAI,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,MAA4B;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO;QACzB,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;SAC3E,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;IACV,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,wBAAwB,CAAC;AAClC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,KAAc,EACd,QAAgB;IAEhB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,8BAA8B,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,KAA0C,CAAC;AACpD,CAAC;AAED,SAAS,YAAY,CAAC,KAAgC;IACpD,IAAI,CAAC,KAAK,EAAE,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,IAAI,KAAK,CAAC,MAAM,IAAI,0BAA0B;QAAE,OAAO,KAAK,CAAC;IAC7D,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,0BAA0B,CAAC,gBAAgB,CAAC;AACvE,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,OAAO,CAAC,sBAAsB,EAAE,MAAM,CAAC;SACvC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAC5B,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QACnD,CAAC,CAAC,IAAI,CAAC;SACR,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QACzD,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,SAAS,gBAAgB,CACvB,WAAwC;IAExC,MAAM,KAAK,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IACjC,OAAO,KAAK,CAAC,qBAAqB,CAAC;IACnC,OAAO,KAAK,CAAC,WAAW,CAAC;IACzB,OAAO,KAAK,CAAC;AACf,CAAC"}
package/lib/ipc.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ import type { CallbackRequest, CallbackStatus, PiRouteTable } from "./routes.js";
2
+ import { CALLBACK_MAX_RESPONSE_BYTES, CALLBACK_SOCKET_ENV, CALLBACK_TIMEOUT_MS, CALLBACK_TOKEN_ENV } from "./constants.js";
3
+ export { CALLBACK_MAX_RESPONSE_BYTES, CALLBACK_SOCKET_ENV, CALLBACK_TIMEOUT_MS, CALLBACK_TOKEN_ENV, };
4
+ export declare const CALLBACK_MAX_BODY_BYTES: number;
5
+ export declare const CALLBACK_MAX_REQUEST_BYTES: number;
6
+ export interface CallbackWireRequest extends CallbackRequest {
7
+ readonly token: string;
8
+ }
9
+ export interface CallbackWireResponse {
10
+ readonly deliveryId: string;
11
+ readonly messageId: string;
12
+ readonly status: CallbackStatus;
13
+ readonly acceptanceId?: string;
14
+ readonly errorCode?: string;
15
+ }
16
+ export interface CallbackIpcServer {
17
+ start(): Promise<void>;
18
+ stop(): Promise<void>;
19
+ }
20
+ /** Host an authenticated, one-frame-per-connection Pi callback transport. */
21
+ export declare function createCallbackIpcServer(options: {
22
+ readonly socketPath: string;
23
+ readonly token: string;
24
+ readonly routes: Pick<PiRouteTable, "deliver">;
25
+ }): CallbackIpcServer;
26
+ /** Send one authenticated request from the short-lived Profile helper. */
27
+ export declare function sendCallbackOverIpc(options: {
28
+ readonly socketPath: string;
29
+ readonly request: CallbackWireRequest;
30
+ }): Promise<CallbackWireResponse>;