@codetreker/daynight 0.25.2 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -8
- package/config.example.yml +3 -0
- package/dist/api/client.js +2 -2
- package/dist/api/client.js.map +1 -1
- package/dist/api/parse.js +14 -2
- package/dist/api/parse.js.map +1 -1
- package/dist/api/types.d.ts +4 -1
- package/dist/api/worker-mode.d.ts +6 -0
- package/dist/api/worker-mode.js +14 -0
- package/dist/api/worker-mode.js.map +1 -0
- package/dist/cli/commands.js +2 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/commands/controller/command-controls.d.ts +4 -0
- package/dist/commands/controller/command-controls.js +33 -0
- package/dist/commands/controller/command-controls.js.map +1 -0
- package/dist/commands/controller/definition.d.ts +3 -0
- package/dist/commands/controller/definition.js +22 -0
- package/dist/commands/controller/definition.js.map +1 -0
- package/dist/commands/controller/independent.d.ts +3 -0
- package/dist/commands/controller/independent.js +344 -0
- package/dist/commands/controller/independent.js.map +1 -0
- package/dist/commands/controller/index.d.ts +12 -0
- package/dist/commands/controller/index.js +73 -0
- package/dist/commands/controller/index.js.map +1 -0
- package/dist/commands/controller/launch-ticket.d.ts +49 -0
- package/dist/commands/controller/launch-ticket.js +99 -0
- package/dist/commands/controller/launch-ticket.js.map +1 -0
- package/dist/commands/controller/lifecycle-store.d.ts +84 -0
- package/dist/commands/controller/lifecycle-store.js +278 -0
- package/dist/commands/controller/lifecycle-store.js.map +1 -0
- package/dist/commands/controller/local-client.d.ts +44 -0
- package/dist/commands/controller/local-client.js +75 -0
- package/dist/commands/controller/local-client.js.map +1 -0
- package/dist/commands/controller/local-content.d.ts +23 -0
- package/dist/commands/controller/local-content.js +103 -0
- package/dist/commands/controller/local-content.js.map +1 -0
- package/dist/commands/controller/process-proof.d.ts +13 -0
- package/dist/commands/controller/process-proof.js +121 -0
- package/dist/commands/controller/process-proof.js.map +1 -0
- package/dist/commands/controller/providers/claude.d.ts +2 -0
- package/dist/commands/controller/providers/claude.js +470 -0
- package/dist/commands/controller/providers/claude.js.map +1 -0
- package/dist/commands/controller/providers/codex.d.ts +2 -0
- package/dist/commands/controller/providers/codex.js +254 -0
- package/dist/commands/controller/providers/codex.js.map +1 -0
- package/dist/commands/controller/providers/controls-claude.d.ts +26 -0
- package/dist/commands/controller/providers/controls-claude.js +138 -0
- package/dist/commands/controller/providers/controls-claude.js.map +1 -0
- package/dist/commands/controller/providers/controls-codex.d.ts +38 -0
- package/dist/commands/controller/providers/controls-codex.js +199 -0
- package/dist/commands/controller/providers/controls-codex.js.map +1 -0
- package/dist/commands/controller/providers/controls-copilot.d.ts +20 -0
- package/dist/commands/controller/providers/controls-copilot.js +143 -0
- package/dist/commands/controller/providers/controls-copilot.js.map +1 -0
- package/dist/commands/controller/providers/controls.d.ts +21 -0
- package/dist/commands/controller/providers/controls.js +53 -0
- package/dist/commands/controller/providers/controls.js.map +1 -0
- package/dist/commands/controller/providers/copilot-interactions.d.ts +47 -0
- package/dist/commands/controller/providers/copilot-interactions.js +295 -0
- package/dist/commands/controller/providers/copilot-interactions.js.map +1 -0
- package/dist/commands/controller/providers/copilot-projection.d.ts +11 -0
- package/dist/commands/controller/providers/copilot-projection.js +93 -0
- package/dist/commands/controller/providers/copilot-projection.js.map +1 -0
- package/dist/commands/controller/providers/copilot-runtime.d.ts +9 -0
- package/dist/commands/controller/providers/copilot-runtime.js +127 -0
- package/dist/commands/controller/providers/copilot-runtime.js.map +1 -0
- package/dist/commands/controller/providers/copilot.d.ts +2 -0
- package/dist/commands/controller/providers/copilot.js +309 -0
- package/dist/commands/controller/providers/copilot.js.map +1 -0
- package/dist/commands/controller/providers/interactions.d.ts +3 -0
- package/dist/commands/controller/providers/interactions.js +79 -0
- package/dist/commands/controller/providers/interactions.js.map +1 -0
- package/dist/commands/controller/providers/native-rpc.d.ts +28 -0
- package/dist/commands/controller/providers/native-rpc.js +85 -0
- package/dist/commands/controller/providers/native-rpc.js.map +1 -0
- package/dist/commands/controller/providers/projection.d.ts +23 -0
- package/dist/commands/controller/providers/projection.js +99 -0
- package/dist/commands/controller/providers/projection.js.map +1 -0
- package/dist/commands/controller/providers/turns.d.ts +7 -0
- package/dist/commands/controller/providers/turns.js +21 -0
- package/dist/commands/controller/providers/turns.js.map +1 -0
- package/dist/commands/controller/providers/types.d.ts +44 -0
- package/dist/commands/controller/providers/types.js +2 -0
- package/dist/commands/controller/providers/types.js.map +1 -0
- package/dist/commands/controller/recovery.d.ts +6 -0
- package/dist/commands/controller/recovery.js +22 -0
- package/dist/commands/controller/recovery.js.map +1 -0
- package/dist/commands/controller/relay.d.ts +18 -0
- package/dist/commands/controller/relay.js +299 -0
- package/dist/commands/controller/relay.js.map +1 -0
- package/dist/commands/controller/resume.d.ts +18 -0
- package/dist/commands/controller/resume.js +193 -0
- package/dist/commands/controller/resume.js.map +1 -0
- package/dist/commands/controller/runtime.d.ts +5 -0
- package/dist/commands/controller/runtime.js +455 -0
- package/dist/commands/controller/runtime.js.map +1 -0
- package/dist/commands/controller/windows-job.d.ts +3 -0
- package/dist/commands/controller/windows-job.js +59 -0
- package/dist/commands/controller/windows-job.js.map +1 -0
- package/dist/commands/controller/wire-display.d.ts +5 -0
- package/dist/commands/controller/wire-display.js +11 -0
- package/dist/commands/controller/wire-display.js.map +1 -0
- package/dist/commands/skill/skills/using-daynight/SKILL.md +24 -20
- package/dist/commands/skill/skills/using-daynight/references/autopilot-managed-task.md +16 -10
- package/dist/commands/skill/skills/using-daynight/references/create-task.md +40 -39
- package/dist/commands/skill/skills/using-daynight/references/goal.md +40 -29
- package/dist/commands/skill/skills/using-daynight/references/handbook.md +4 -3
- package/dist/commands/skill/skills/using-daynight/references/handoff.md +3 -0
- package/dist/commands/skill/skills/using-daynight/references/run-task.md +3 -3
- package/dist/commands/skill/skills/using-daynight/references/task-content.md +96 -51
- package/dist/commands/skill/skills/using-daynight/references/task-execution.md +28 -22
- package/dist/commands/worker/backend.d.ts +7 -0
- package/dist/commands/worker/backend.js +7 -0
- package/dist/commands/worker/backend.js.map +1 -0
- package/dist/commands/worker/backends/grant-renewal.d.ts +13 -0
- package/dist/commands/worker/backends/grant-renewal.js +42 -0
- package/dist/commands/worker/backends/grant-renewal.js.map +1 -0
- package/dist/commands/worker/backends/session-api.d.ts +66 -0
- package/dist/commands/worker/backends/session-api.js +84 -0
- package/dist/commands/worker/backends/session-api.js.map +1 -0
- package/dist/commands/worker/backends/web-process.d.ts +79 -0
- package/dist/commands/worker/backends/web-process.js +156 -0
- package/dist/commands/worker/backends/web-process.js.map +1 -0
- package/dist/commands/worker/backends/web-store.d.ts +49 -0
- package/dist/commands/worker/backends/web-store.js +323 -0
- package/dist/commands/worker/backends/web-store.js.map +1 -0
- package/dist/commands/worker/backends/web-types.d.ts +83 -0
- package/dist/commands/worker/backends/web-types.js +3 -0
- package/dist/commands/worker/backends/web-types.js.map +1 -0
- package/dist/commands/worker/backends/web.d.ts +26 -0
- package/dist/commands/worker/backends/web.js +178 -0
- package/dist/commands/worker/backends/web.js.map +1 -0
- package/dist/commands/worker/config.js +12 -5
- package/dist/commands/worker/config.js.map +1 -1
- package/dist/commands/worker/control.d.ts +2 -0
- package/dist/commands/worker/control.js +11 -4
- package/dist/commands/worker/control.js.map +1 -1
- package/dist/commands/worker/coordinator.d.ts +7 -0
- package/dist/commands/worker/coordinator.js +138 -19
- package/dist/commands/worker/coordinator.js.map +1 -1
- package/dist/commands/worker/herdr/agents.js +11 -8
- package/dist/commands/worker/herdr/agents.js.map +1 -1
- package/dist/commands/worker/herdr/arguments.js +10 -5
- package/dist/commands/worker/herdr/arguments.js.map +1 -1
- package/dist/commands/worker/herdr/claude-input.d.ts +2 -0
- package/dist/commands/worker/herdr/claude-input.js +20 -0
- package/dist/commands/worker/herdr/claude-input.js.map +1 -0
- package/dist/commands/worker/herdr/instance.js +1 -1
- package/dist/commands/worker/herdr/instance.js.map +1 -1
- package/dist/commands/worker/herdr/preflight.d.ts +1 -1
- package/dist/commands/worker/herdr/preflight.js +31 -10
- package/dist/commands/worker/herdr/preflight.js.map +1 -1
- package/dist/commands/worker/herdr.js +5 -1
- package/dist/commands/worker/herdr.js.map +1 -1
- package/dist/commands/worker/prompts.js +5 -1
- package/dist/commands/worker/prompts.js.map +1 -1
- package/dist/commands/worker/repositories.js +2 -2
- package/dist/commands/worker/repositories.js.map +1 -1
- package/dist/commands/worker/runtime.js +62 -10
- package/dist/commands/worker/runtime.js.map +1 -1
- package/dist/commands/worker/setup-environment.d.ts +2 -1
- package/dist/commands/worker/setup-environment.js +10 -4
- package/dist/commands/worker/setup-environment.js.map +1 -1
- package/dist/commands/worker/setup.js +5 -5
- package/dist/commands/worker/setup.js.map +1 -1
- package/dist/commands/worker/store.d.ts +2 -1
- package/dist/commands/worker/store.js +19 -9
- package/dist/commands/worker/store.js.map +1 -1
- package/dist/commands/worker/types.d.ts +4 -1
- package/dist/commands/worker/worktrees.js +9 -6
- package/dist/commands/worker/worktrees.js.map +1 -1
- package/dist/session/controller-protocol.d.ts +245 -0
- package/dist/session/controller-protocol.js +218 -0
- package/dist/session/controller-protocol.js.map +1 -0
- package/dist/session/controls.d.ts +28 -0
- package/dist/session/controls.js +37 -0
- package/dist/session/controls.js.map +1 -0
- package/dist/session/protocol.d.ts +290 -0
- package/dist/session/protocol.js +307 -0
- package/dist/session/protocol.js.map +1 -0
- package/package.json +7 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { record, string } from "./native-rpc.js";
|
|
3
|
+
// Native item IDs survive reconnects; transport IDs must never create new timeline rows.
|
|
4
|
+
export const nativeEntryId = (session, item) => {
|
|
5
|
+
const h = createHash("sha256").update(session).update("\0").update(item).digest("hex");
|
|
6
|
+
return `${h.slice(0, 8)}-${h.slice(8, 12)}-4${h.slice(13, 16)}-8${h.slice(17, 20)}-${h.slice(20, 32)}`;
|
|
7
|
+
};
|
|
8
|
+
export const readable = (value) => typeof value === "string" ? value : JSON.stringify(value, null, 2) ?? "";
|
|
9
|
+
export const limited = (value) => {
|
|
10
|
+
if (value.length <= 200_000)
|
|
11
|
+
return value;
|
|
12
|
+
// UTF-16 limits must not split a scalar value accepted by the wire codec.
|
|
13
|
+
const end = /[\uD800-\uDBFF]/.test(value[199_999]) && /[\uDC00-\uDFFF]/.test(value[200_000]) ? 199_999 : 200_000;
|
|
14
|
+
return value.slice(0, end) + "\n[Output truncated at 200000 characters]";
|
|
15
|
+
};
|
|
16
|
+
export const parseProviderArguments = (provider, args) => {
|
|
17
|
+
const result = {};
|
|
18
|
+
for (let i = 0; i < args.length; i++) {
|
|
19
|
+
const arg = args[i], value = args[++i];
|
|
20
|
+
if (!value)
|
|
21
|
+
throw new Error(`Unsupported or incomplete Web ${provider} argument: ${arg}`);
|
|
22
|
+
if (provider === "codex" && ["--sandbox", "-s"].includes(arg) && ["read-only", "workspace-write"].includes(value))
|
|
23
|
+
result.sandbox = value;
|
|
24
|
+
else if (provider === "codex" && ["--ask-for-approval", "-a"].includes(arg) && ["untrusted", "on-request", "never"].includes(value))
|
|
25
|
+
result.approvalPolicy = value;
|
|
26
|
+
else if (provider === "claude" && arg === "--permission-mode" && ["default", "acceptEdits", "plan"].includes(value))
|
|
27
|
+
result.permissionMode = value;
|
|
28
|
+
else if (arg === "--effort" && (provider === "copilot" ? ["low", "medium", "high", "xhigh"] : ["low", "medium", "high", "xhigh", "max"]).includes(value))
|
|
29
|
+
result.effort = value;
|
|
30
|
+
else if (provider === "claude" && arg === "--add-dir")
|
|
31
|
+
(result.additionalDirectories ??= []).push(value);
|
|
32
|
+
else
|
|
33
|
+
throw new Error(`Unsupported Web ${provider} argument: ${arg}`);
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
export class CodexProjection {
|
|
38
|
+
sessionId;
|
|
39
|
+
emit;
|
|
40
|
+
content = new Map();
|
|
41
|
+
tools = new Map();
|
|
42
|
+
constructor(sessionId, emit) {
|
|
43
|
+
this.sessionId = sessionId;
|
|
44
|
+
this.emit = emit;
|
|
45
|
+
}
|
|
46
|
+
base(id) { return { entryId: nativeEntryId(this.sessionId, id), revision: "1" }; }
|
|
47
|
+
delta(id, delta, kind) {
|
|
48
|
+
const value = (this.content.get(id) ?? "") + delta;
|
|
49
|
+
this.content.set(id, value);
|
|
50
|
+
if (kind === "reasoning" && value.trim() === "")
|
|
51
|
+
return;
|
|
52
|
+
this.emit(kind === "reasoning" ? { ...this.base(id), kind, text: limited(value) } : { ...this.base(id), kind, content: [{ type: "text", text: limited(value) }] });
|
|
53
|
+
}
|
|
54
|
+
toolDelta(id, delta) {
|
|
55
|
+
const old = this.tools.get(id);
|
|
56
|
+
if (!old)
|
|
57
|
+
return;
|
|
58
|
+
const prior = old.output.map(part => part.type === "text" ? part.text : "").join("");
|
|
59
|
+
const output = prior + delta;
|
|
60
|
+
const entry = { ...old, output: [{ type: "text", text: limited(output) }], truncated: old.truncated || output.length > 200_000 };
|
|
61
|
+
this.tools.set(id, entry);
|
|
62
|
+
this.emit(entry);
|
|
63
|
+
}
|
|
64
|
+
item(value, completed) {
|
|
65
|
+
const item = record(value), id = string(item.id), type = string(item.type);
|
|
66
|
+
if (!id)
|
|
67
|
+
return;
|
|
68
|
+
const base = this.base(id);
|
|
69
|
+
if (type === "agentMessage") {
|
|
70
|
+
const text = string(item.text);
|
|
71
|
+
this.content.set(id, text);
|
|
72
|
+
this.emit({ ...base, kind: "assistant_message", content: [{ type: "text", text: limited(text) }] });
|
|
73
|
+
}
|
|
74
|
+
else if (type === "userMessage")
|
|
75
|
+
this.emit({ ...base, kind: "user_message", content: (Array.isArray(item.content) ? item.content : []).flatMap(part => { const p = record(part); return p.type === "text" ? [{ type: "text", text: limited(string(p.text)) }] : [{ type: "text", text: `[${string(p.type) || "unsupported native content"}]` }]; }) });
|
|
76
|
+
else if (type === "reasoning") {
|
|
77
|
+
const text = [...(Array.isArray(item.summary) ? item.summary : []), ...(Array.isArray(item.content) ? item.content : [])].map(readable).join("\n");
|
|
78
|
+
// Empty native reasoning can contain only opaque provider state. It is
|
|
79
|
+
// neither displayable text nor evidence that streamed text was removed.
|
|
80
|
+
if (text.trim() === "")
|
|
81
|
+
return;
|
|
82
|
+
this.content.set(id, text);
|
|
83
|
+
this.emit({ ...base, kind: "reasoning", text: limited(text) });
|
|
84
|
+
}
|
|
85
|
+
else if (["commandExecution", "fileChange", "mcpToolCall", "dynamicToolCall", "webSearch", "imageView", "collabAgentToolCall"].includes(type)) {
|
|
86
|
+
const output = readable(item.aggregatedOutput ?? item.result ?? item.error ?? item.changes ?? "");
|
|
87
|
+
const entry = { ...base, kind: "tool_call", callId: id, name: string(item.tool) || type, input: limited(readable(item.command ?? item.arguments ?? item.query ?? item.changes ?? item)), output: [{ type: "text", text: limited(output) }], status: ["failed", "declined"].includes(string(item.status)) || item.error ? "failed" : completed ? "completed" : "running", truncated: output.length > 200_000 };
|
|
88
|
+
this.tools.set(id, entry);
|
|
89
|
+
this.emit(entry);
|
|
90
|
+
}
|
|
91
|
+
else if (type === "contextCompaction")
|
|
92
|
+
this.emit({ ...base, kind: "compaction", summary: "Native conversation context compacted." });
|
|
93
|
+
else if (type === "plan")
|
|
94
|
+
this.emit({ ...base, kind: "assistant_message", content: [{ type: "text", text: limited(string(item.text) || readable(item)) }] });
|
|
95
|
+
else
|
|
96
|
+
this.emit({ ...base, kind: "error", code: "unsupported_native_item", message: `Unsupported native timeline item: ${type || "unknown"}. ${limited(readable(item))}` });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../../../../src/commands/controller/providers/projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export class NativeTurns {
|
|
2
|
+
completed = new Map();
|
|
3
|
+
waiters = new Map();
|
|
4
|
+
isComplete(id) { return this.completed.has(id); }
|
|
5
|
+
complete(id, error) { this.completed.set(id, error); for (const resolve of this.waiters.get(id) ?? [])
|
|
6
|
+
resolve(error); this.waiters.delete(id); }
|
|
7
|
+
wait(id, deadline) {
|
|
8
|
+
if (this.completed.has(id)) {
|
|
9
|
+
const error = this.completed.get(id);
|
|
10
|
+
return error ? Promise.reject(error) : Promise.resolve();
|
|
11
|
+
}
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
const finish = (error) => { clearTimeout(timer); this.waiters.get(id)?.delete(finish); error ? reject(error) : resolve(); };
|
|
14
|
+
const timer = setTimeout(() => finish(new Error("Native turn completion is unknown after its deadline.")), Math.max(0, deadline - Date.now()));
|
|
15
|
+
const waiters = this.waiters.get(id) ?? new Set();
|
|
16
|
+
waiters.add(finish);
|
|
17
|
+
this.waiters.set(id, waiters);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=turns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turns.js","sourceRoot":"","sources":["../../../../src/commands/controller/providers/turns.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAW;IACL,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC5C,OAAO,GAAG,IAAI,GAAG,EAA8C,CAAC;IACjF,UAAU,CAAC,EAAU,IAAa,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,QAAQ,CAAC,EAAU,EAAE,KAAmB,IAAU,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7K,IAAI,CAAC,EAAU,EAAE,QAAgB;QAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAAC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAAC,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC;QAC/H,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,MAAM,GAAG,CAAC,KAAmB,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1I,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC/I,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACxG,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { SessionControls } from "../../../session/controls.js";
|
|
2
|
+
import type { ChildProcess } from "node:child_process";
|
|
3
|
+
import type { InteractionResponse, SessionCapabilities, SessionSnapshot, TimelineEntry } from "../../../session/protocol.js";
|
|
4
|
+
export type ProviderEntry = TimelineEntry extends infer T ? T extends TimelineEntry ? Omit<T, "entrySeq"> : never : never;
|
|
5
|
+
export type ProviderState = {
|
|
6
|
+
nativeSessionId: string | null;
|
|
7
|
+
activity: SessionSnapshot["activity"];
|
|
8
|
+
currentTurnId: string | null;
|
|
9
|
+
capabilities: SessionCapabilities;
|
|
10
|
+
controls?: SessionControls;
|
|
11
|
+
turnStartedAt?: string | null;
|
|
12
|
+
};
|
|
13
|
+
export type ProviderOptions = {
|
|
14
|
+
cwd: string;
|
|
15
|
+
model: string | null;
|
|
16
|
+
args: readonly string[];
|
|
17
|
+
resumeNativeSessionId: string | null;
|
|
18
|
+
unattended?: boolean;
|
|
19
|
+
env?: NodeJS.ProcessEnv;
|
|
20
|
+
executable?: string;
|
|
21
|
+
controlsRevisionFloor?: string;
|
|
22
|
+
onTimeline(entry: ProviderEntry): void;
|
|
23
|
+
onState(state: ProviderState): void;
|
|
24
|
+
onSpawn(child: ChildProcess): void;
|
|
25
|
+
onDiagnostic?(line: string): void;
|
|
26
|
+
onFatalError?(error: Error): void;
|
|
27
|
+
onControlConfirmed?(operationId: string): void;
|
|
28
|
+
onInputObserved?(operationId: string): void;
|
|
29
|
+
};
|
|
30
|
+
export type ProviderReceipt = {
|
|
31
|
+
disposition: "started" | "queued" | "handled";
|
|
32
|
+
turnId?: string;
|
|
33
|
+
};
|
|
34
|
+
export interface NativeProvider {
|
|
35
|
+
readonly nativeSessionId: string;
|
|
36
|
+
send(text: string, operationId: string, expectedTurnId: string | null): Promise<ProviderReceipt>;
|
|
37
|
+
cancel(expectedTurnId: string): Promise<ProviderReceipt>;
|
|
38
|
+
respond(interactionId: string, revision: string, response: InteractionResponse): Promise<ProviderReceipt>;
|
|
39
|
+
setSetting?(settingId: string, value: string, operationId: string, expectedControlsRevision: string): Promise<ProviderReceipt>;
|
|
40
|
+
executeCommand?(commandId: string, args: string, operationId: string, expectedControlsRevision: string, expectedTurnId: string | null): Promise<ProviderReceipt>;
|
|
41
|
+
refreshControls?(): Promise<ProviderReceipt>;
|
|
42
|
+
waitForTurn(turnId: string, deadline: number): Promise<void>;
|
|
43
|
+
close(): Promise<void>;
|
|
44
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/commands/controller/providers/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ControllerLifecycleStore, ControllerOperation } from "./lifecycle-store.js";
|
|
2
|
+
export declare const isCleaningGeneration: (operations: readonly ControllerOperation[], generation: string) => boolean;
|
|
3
|
+
/** A native user-message identity proves receipt, not successful turn completion. */
|
|
4
|
+
export declare const observeNativeInput: (journal: ControllerLifecycleStore, operationId: string) => boolean;
|
|
5
|
+
/** A late native resolution can settle a timed-out response without resubmitting it. */
|
|
6
|
+
export declare const observeNativeInteraction: (journal: ControllerLifecycleStore, interactionId: string, generation: string) => ControllerOperation[];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export const isCleaningGeneration = (operations, generation) => operations.some(operation => operation.kind === "cleanup" && operation.executionGeneration === generation);
|
|
2
|
+
/** A native user-message identity proves receipt, not successful turn completion. */
|
|
3
|
+
export const observeNativeInput = (journal, operationId) => {
|
|
4
|
+
const operation = journal.getOperation(operationId);
|
|
5
|
+
if (!operation || !["initial", "send_message", "execute_command"].includes(operation.kind) || !["dispatching", "unknown"].includes(operation.state))
|
|
6
|
+
return false;
|
|
7
|
+
journal.recordOperation(operationId, "provider_accepted", operation.result);
|
|
8
|
+
return true;
|
|
9
|
+
};
|
|
10
|
+
/** A late native resolution can settle a timed-out response without resubmitting it. */
|
|
11
|
+
export const observeNativeInteraction = (journal, interactionId, generation) => {
|
|
12
|
+
const receipts = [];
|
|
13
|
+
for (const operation of journal.listOperations()) {
|
|
14
|
+
if (operation.executionGeneration !== generation || operation.kind !== "interaction_response" || !["dispatching", "provider_accepted", "unknown"].includes(operation.state))
|
|
15
|
+
continue;
|
|
16
|
+
if (!operation.payload || typeof operation.payload !== "object" || !("interactionId" in operation.payload) || operation.payload.interactionId !== interactionId)
|
|
17
|
+
continue;
|
|
18
|
+
receipts.push(journal.recordOperation(operation.operationId, "confirmed", { disposition: "handled" }));
|
|
19
|
+
}
|
|
20
|
+
return receipts;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recovery.js","sourceRoot":"","sources":["../../../src/commands/controller/recovery.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,UAA0C,EAAE,UAAkB,EAAW,EAAE,CAC9G,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,mBAAmB,KAAK,UAAU,CAAC,CAAC;AAE7G,qFAAqF;AACrF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAiC,EAAE,WAAmB,EAAW,EAAE;IACpG,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IACpD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClK,OAAO,CAAC,eAAe,CAAC,WAAW,EAAE,mBAAmB,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,wFAAwF;AACxF,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAAiC,EAAE,aAAqB,EAAE,UAAkB,EAAyB,EAAE;IAC9I,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;QACjD,IAAI,SAAS,CAAC,mBAAmB,KAAK,UAAU,IAAI,SAAS,CAAC,IAAI,KAAK,sBAAsB,IAAI,CAAC,CAAC,aAAa,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,SAAS;QACtL,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,aAAa,KAAK,aAAa;YAAE,SAAS;QAC1K,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACzG,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type SessionCommand, type SessionOperation } from "../../session/protocol.js";
|
|
2
|
+
import { type ControllerGrantResponse, type ControllerState } from "../../session/controller-protocol.js";
|
|
3
|
+
import type { ControllerLaunchTicket } from "./launch-ticket.js";
|
|
4
|
+
import type { ControllerLifecycleStore, ControllerOperation } from "./lifecycle-store.js";
|
|
5
|
+
export declare const publicOperation: (ticket: ControllerLaunchTicket, operation: ControllerOperation) => SessionOperation;
|
|
6
|
+
export declare const readControllerGrant: (ticket: ControllerLaunchTicket) => Promise<ControllerGrantResponse>;
|
|
7
|
+
export declare const createControllerRelay: (ticket: ControllerLaunchTicket, journal: ControllerLifecycleStore, callbacks: {
|
|
8
|
+
onConnection(connected: boolean): void;
|
|
9
|
+
onCommand(command: SessionCommand): Promise<void>;
|
|
10
|
+
onError(message: string): void;
|
|
11
|
+
readState?(): ControllerState;
|
|
12
|
+
}) => {
|
|
13
|
+
connected: () => boolean;
|
|
14
|
+
authorize: (operationId: string) => Promise<void>;
|
|
15
|
+
receipt: (operation: ControllerOperation) => void;
|
|
16
|
+
flush(timeoutMs?: number): Promise<void>;
|
|
17
|
+
close: () => void;
|
|
18
|
+
};
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { sessionDisplayEntry, sessionWireBytes } from "./wire-display.js";
|
|
2
|
+
import { sessionFence } from "../../session/protocol.js";
|
|
3
|
+
import { readFile, lstat } from "node:fs/promises";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import WebSocket from "ws";
|
|
6
|
+
import { SESSION_PROTOCOL } from "../../session/protocol.js";
|
|
7
|
+
import { RELAY_LIMITS, parseControllerGrantResponse, parseRelayMessage } from "../../session/controller-protocol.js";
|
|
8
|
+
export const publicOperation = (ticket, operation) => ({ protocol: SESSION_PROTOCOL, ...sessionFence(ticket), executionGeneration: operation.executionGeneration ?? ticket.executionGeneration, operationId: operation.operationId, kind: operation.kind === "initial" || operation.kind === "cleanup" ? "send_message" : operation.kind, state: operation.state, providerResult: operation.result?.disposition ?? null, error: operation.error ? { code: "native_operation_error", message: operation.error } : null });
|
|
9
|
+
export const readControllerGrant = async (ticket) => {
|
|
10
|
+
const metadata = await lstat(ticket.credentialFile);
|
|
11
|
+
if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.size > 16_384 || process.platform !== "win32" && (metadata.mode & 0o077) !== 0)
|
|
12
|
+
throw new Error("Controller credential must be a private regular file.");
|
|
13
|
+
const grant = parseControllerGrantResponse(JSON.parse(await readFile(ticket.credentialFile, "utf8")));
|
|
14
|
+
if (grant.sessionId !== ticket.sessionId || grant.claimId !== ticket.claimId || grant.testExecutionId !== ticket.testExecutionId || grant.executionGeneration !== ticket.executionGeneration || grant.controllerId !== ticket.controllerId || grant.controllerInstanceId !== ticket.controllerInstanceId || Date.parse(grant.expiresAt) <= Date.now())
|
|
15
|
+
throw new Error("Controller credential is stale or belongs to another execution.");
|
|
16
|
+
return grant;
|
|
17
|
+
};
|
|
18
|
+
export const createControllerRelay = (ticket, journal, callbacks) => {
|
|
19
|
+
let socket = null, fence = null, stopped = false, synchronized = false;
|
|
20
|
+
let reconciled = false, requiresLiveSync = false, syncPending = false, connectionFloor = "0";
|
|
21
|
+
let historyEpoch = "";
|
|
22
|
+
const contentRequests = [];
|
|
23
|
+
let reconciliation = [];
|
|
24
|
+
let pendingBatch = null, currentToken = "", lastHeartbeat = 0, reconnectAt = 0, connecting = false;
|
|
25
|
+
const authorization = new Map();
|
|
26
|
+
const settleDispatchRefusal = (operation, required = false, currentConnection = false) => {
|
|
27
|
+
const local = journal.getOperation(operation.operationId);
|
|
28
|
+
if (!required && local?.state !== "accepted")
|
|
29
|
+
return;
|
|
30
|
+
if (!local || local.state !== "accepted" || operation.kind !== local.kind || operation.sessionId !== ticket.sessionId || operation.claimId !== ticket.claimId || operation.testExecutionId !== ticket.testExecutionId || (local.executionGeneration ?? ticket.executionGeneration) !== operation.executionGeneration || currentConnection && operation.executionGeneration !== fence?.executionGeneration || (operation.state !== "rejected" && operation.state !== "expired"))
|
|
31
|
+
throw new Error("Invalid dispatch refusal receipt.");
|
|
32
|
+
journal.recordOperation(operation.operationId, operation.state, null, operation.error?.message ?? "Operation no longer has current permission or state.");
|
|
33
|
+
};
|
|
34
|
+
const clearConnection = () => { fence = null; synchronized = false; reconciled = false; syncPending = false; contentRequests.length = 0; pendingBatch = null; callbacks.onConnection(false); for (const waiter of authorization.values()) {
|
|
35
|
+
clearTimeout(waiter.timer);
|
|
36
|
+
waiter.reject(new Error("Relay disconnected before native dispatch authorization."));
|
|
37
|
+
} authorization.clear(); };
|
|
38
|
+
const send = (message) => { if (!socket || socket.readyState !== WebSocket.OPEN)
|
|
39
|
+
throw new Error("Session relay is offline."); const text = JSON.stringify(message); if (sessionWireBytes(message) > RELAY_LIMITS.maxFrameBytes)
|
|
40
|
+
throw new Error("Controller frame exceeds relay limit."); socket.send(text); };
|
|
41
|
+
const prefix = () => { if (!fence)
|
|
42
|
+
throw new Error("Session relay is not synchronized."); return { protocol: SESSION_PROTOCOL, ...fence }; };
|
|
43
|
+
const sendReconciliation = () => {
|
|
44
|
+
const batch = reconciliation.shift() ?? [];
|
|
45
|
+
send({ ...prefix(), type: "reconcile", final: reconciliation.length === 0, operations: batch.map(o => ({ operationId: o.operationId, state: o.state === "accepted" ? "not_submitted" : ["confirmed", "failed", "rejected", "expired", "provider_accepted"].includes(o.state) ? o.state : "unknown", providerResult: publicOperation(ticket, o).providerResult, error: publicOperation(ticket, o).error })) });
|
|
46
|
+
};
|
|
47
|
+
const connect = async () => {
|
|
48
|
+
if (stopped || connecting || socket)
|
|
49
|
+
return;
|
|
50
|
+
connecting = true;
|
|
51
|
+
try {
|
|
52
|
+
const grant = await readControllerGrant(ticket);
|
|
53
|
+
if (stopped)
|
|
54
|
+
return;
|
|
55
|
+
currentToken = grant.token;
|
|
56
|
+
const url = new URL("/api/v1/controller-channel", ticket.serverOrigin);
|
|
57
|
+
url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
|
|
58
|
+
const ws = new WebSocket(url, { headers: { Authorization: `Bearer ${grant.token}` }, handshakeTimeout: 10_000, maxPayload: RELAY_LIMITS.maxFrameBytes });
|
|
59
|
+
socket = ws;
|
|
60
|
+
ws.on("error", error => callbacks.onError(error.message));
|
|
61
|
+
ws.on("close", () => { if (socket !== ws)
|
|
62
|
+
return; socket = null; clearConnection(); reconnectAt = Date.now() + 1000; });
|
|
63
|
+
ws.on("open", () => { if (stopped || socket !== ws)
|
|
64
|
+
return; send({ type: "hello", protocol: SESSION_PROTOCOL, schemaVersion: 1, projectionVersion: 1, ...sessionFence(ticket), controllerId: ticket.controllerId, controllerInstanceId: ticket.controllerInstanceId, provider: ticket.provider, sourceEpoch: ticket.executionId, lastAckedSourceSeq: journal.getLastAcknowledgedSequence(), ...(journal.getSourceFloor ? { sourceFloor: connectionFloor = journal.getSourceFloor() } : {}) }); });
|
|
65
|
+
ws.on("message", data => {
|
|
66
|
+
if (stopped || socket !== ws)
|
|
67
|
+
return;
|
|
68
|
+
try {
|
|
69
|
+
const message = parseRelayMessage(JSON.parse(data.toString()));
|
|
70
|
+
if (message.type === "welcome") {
|
|
71
|
+
if (message.session.sessionId !== ticket.sessionId || message.session.claimId !== ticket.claimId || message.session.testExecutionId !== ticket.testExecutionId || message.session.executionGeneration !== ticket.executionGeneration || message.session.identity.controllerInstanceId !== ticket.controllerInstanceId)
|
|
72
|
+
throw new Error("Relay identity mismatch.");
|
|
73
|
+
fence = { ...sessionFence(ticket), connectionEpoch: message.connectionEpoch };
|
|
74
|
+
requiresLiveSync = message.requiresLiveSync === true;
|
|
75
|
+
historyEpoch = message.session.historyEpoch;
|
|
76
|
+
journal.acknowledgeEvents(message.lastAckedSourceSeq);
|
|
77
|
+
const unacknowledged = [];
|
|
78
|
+
let after;
|
|
79
|
+
for (;;) {
|
|
80
|
+
const page = journal.listUnacknowledgedOperations(100, after);
|
|
81
|
+
unacknowledged.push(...page.filter(o => o.kind !== "initial" && o.kind !== "cleanup"));
|
|
82
|
+
if (page.length < 100)
|
|
83
|
+
break;
|
|
84
|
+
after = page.at(-1).operationId;
|
|
85
|
+
}
|
|
86
|
+
reconciliation = [];
|
|
87
|
+
for (let i = 0; i < unacknowledged.length; i += 100)
|
|
88
|
+
reconciliation.push(unacknowledged.slice(i, i + 100));
|
|
89
|
+
if (!reconciliation.length)
|
|
90
|
+
reconciliation.push([]);
|
|
91
|
+
sendReconciliation();
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (!fence || message.sessionId !== fence.sessionId || message.claimId !== fence.claimId || message.testExecutionId !== fence.testExecutionId || message.executionGeneration !== fence.executionGeneration || message.connectionEpoch !== fence.connectionEpoch)
|
|
95
|
+
throw new Error("Stale relay frame.");
|
|
96
|
+
if (message.type === "reconcile_result") {
|
|
97
|
+
for (const operation of message.operations)
|
|
98
|
+
if (["confirmed", "failed", "rejected", "expired"].includes(operation.state)) {
|
|
99
|
+
if (operation.state === "rejected" || operation.state === "expired")
|
|
100
|
+
settleDispatchRefusal(operation);
|
|
101
|
+
journal.markOperationAcknowledged(operation.operationId);
|
|
102
|
+
}
|
|
103
|
+
if (reconciliation.length)
|
|
104
|
+
sendReconciliation();
|
|
105
|
+
else {
|
|
106
|
+
reconciled = true;
|
|
107
|
+
if (!requiresLiveSync) {
|
|
108
|
+
synchronized = true;
|
|
109
|
+
callbacks.onConnection(true);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else if (message.type === "sync_ack") {
|
|
114
|
+
if (!requiresLiveSync || !syncPending || !reconciled)
|
|
115
|
+
throw new Error("Unexpected live synchronization acknowledgement.");
|
|
116
|
+
syncPending = false;
|
|
117
|
+
synchronized = true;
|
|
118
|
+
callbacks.onConnection(true);
|
|
119
|
+
}
|
|
120
|
+
else if (message.type === "content_request") {
|
|
121
|
+
if (!synchronized || !requiresLiveSync)
|
|
122
|
+
throw new Error("Content requested before live synchronization.");
|
|
123
|
+
if (contentRequests.length >= 4) {
|
|
124
|
+
send({ ...prefix(), type: "content_response", requestId: message.requestId, sourceThrough: journal.getLastAcknowledgedSequence(), result: null, error: { code: "rate_limited", message: "Local content request capacity is unavailable." } });
|
|
125
|
+
}
|
|
126
|
+
else
|
|
127
|
+
contentRequests.push({ request: message, response: null });
|
|
128
|
+
}
|
|
129
|
+
else if (message.type === "receipt_ack") {
|
|
130
|
+
const operation = message.operation;
|
|
131
|
+
const waiter = authorization.get(operation.operationId);
|
|
132
|
+
if (waiter || operation.state === "rejected" || operation.state === "expired")
|
|
133
|
+
settleDispatchRefusal(operation, waiter !== undefined, true);
|
|
134
|
+
journal.markOperationAcknowledged(operation.operationId);
|
|
135
|
+
if (waiter) {
|
|
136
|
+
authorization.delete(operation.operationId);
|
|
137
|
+
clearTimeout(waiter.timer);
|
|
138
|
+
waiter.reject(new Error(operation.error?.message ?? "Operation no longer has current permission or state."));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else if (message.type === "events_ack") {
|
|
142
|
+
if (message.sourceEpoch !== ticket.executionId || !pendingBatch || message.batchId !== pendingBatch.id || BigInt(message.lastAckedSourceSeq) < BigInt(pendingBatch.through))
|
|
143
|
+
throw new Error("Invalid event ACK.");
|
|
144
|
+
journal.acknowledgeEvents(message.lastAckedSourceSeq);
|
|
145
|
+
pendingBatch = null;
|
|
146
|
+
}
|
|
147
|
+
else if (message.type === "operation_offer") {
|
|
148
|
+
if (!synchronized)
|
|
149
|
+
throw new Error("Operation offered before reconciliation.");
|
|
150
|
+
void callbacks.onCommand(message.command).catch(error => callbacks.onError(String(error)));
|
|
151
|
+
}
|
|
152
|
+
else if (message.type === "operation_authorized") {
|
|
153
|
+
const waiter = authorization.get(message.operationId);
|
|
154
|
+
if (waiter) {
|
|
155
|
+
authorization.delete(message.operationId);
|
|
156
|
+
clearTimeout(waiter.timer);
|
|
157
|
+
waiter.resolve();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else if (message.type === "error") {
|
|
161
|
+
callbacks.onError(`${message.code}: ${message.message}`);
|
|
162
|
+
ws.close();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
callbacks.onError(String(error));
|
|
167
|
+
ws.close(1008, "Invalid relay frame");
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
callbacks.onError(String(error));
|
|
173
|
+
reconnectAt = Date.now() + 1000;
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
connecting = false;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
let polling = false;
|
|
180
|
+
const tick = async () => {
|
|
181
|
+
if (stopped || polling)
|
|
182
|
+
return;
|
|
183
|
+
polling = true;
|
|
184
|
+
try {
|
|
185
|
+
if (!socket) {
|
|
186
|
+
if (Date.now() >= reconnectAt)
|
|
187
|
+
await connect();
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (!fence || !reconciled)
|
|
191
|
+
return;
|
|
192
|
+
if (journal.getSourceFloor && BigInt(journal.getSourceFloor()) > BigInt(connectionFloor)) {
|
|
193
|
+
socket.close(1000, "Local history synchronization required");
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (syncPending)
|
|
197
|
+
return;
|
|
198
|
+
if (Date.now() - lastHeartbeat > 10_000) {
|
|
199
|
+
const grant = await readControllerGrant(ticket);
|
|
200
|
+
if (stopped || !socket || !fence || !reconciled)
|
|
201
|
+
return;
|
|
202
|
+
if (grant.token !== currentToken) {
|
|
203
|
+
socket.close(1000, "Credential renewed");
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
send({ ...prefix(), type: "heartbeat" });
|
|
207
|
+
lastHeartbeat = Date.now();
|
|
208
|
+
}
|
|
209
|
+
if (pendingBatch)
|
|
210
|
+
return;
|
|
211
|
+
if (requiresLiveSync && !synchronized && !journal.pendingEvents(1).length) {
|
|
212
|
+
const snapshot = journal.getSnapshot();
|
|
213
|
+
const state = callbacks.readState?.() ?? { nativeSessionId: snapshot.nativeSessionId, initialInputState: snapshot.initialInputState, synchronized: true, activity: snapshot.activity, currentTurnId: snapshot.currentTurnId, capabilities: snapshot.capabilities, ...(snapshot.controls ? { controls: snapshot.controls } : {}), ...(snapshot.turnStartedAt !== undefined ? { turnStartedAt: snapshot.turnStartedAt } : {}) };
|
|
214
|
+
send({ ...prefix(), type: "sync_state", state: { ...state, synchronized: true }, pendingInteractions: journal.pendingInteractions() });
|
|
215
|
+
syncPending = true;
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const request = contentRequests[0];
|
|
219
|
+
if (request && !request.response) {
|
|
220
|
+
let result = null, error = null;
|
|
221
|
+
try {
|
|
222
|
+
if (request.request.kind === "timeline" && request.request.historyEpoch !== historyEpoch)
|
|
223
|
+
throw new Error("Timeline cursor belongs to another connection.");
|
|
224
|
+
result = request.request.kind === "timeline" ? journal.readTimeline(request.request) : journal.readResource(request.request.resourceId, request.request.offset, request.request.limit);
|
|
225
|
+
}
|
|
226
|
+
catch (failure) {
|
|
227
|
+
error = { code: "content_unavailable", message: failure instanceof Error ? failure.message.slice(0, 4096) : "Local content is unavailable." };
|
|
228
|
+
}
|
|
229
|
+
request.response = { requestId: request.request.requestId, sourceThrough: journal.getLastSourceSequence(), result, error };
|
|
230
|
+
}
|
|
231
|
+
const response = request?.response;
|
|
232
|
+
if (response && BigInt(journal.getLastAcknowledgedSequence()) >= BigInt(response.sourceThrough)) {
|
|
233
|
+
// The response and its source barrier share WS ordering. Newer events
|
|
234
|
+
// remain queued until after the server has captured this page's cursor.
|
|
235
|
+
send({ ...prefix(), type: "content_response", ...response });
|
|
236
|
+
contentRequests.shift();
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
journal.drainProjectionGap();
|
|
240
|
+
const events = [];
|
|
241
|
+
let bytes = 1024;
|
|
242
|
+
for (const row of journal.pendingEvents(RELAY_LIMITS.maxBatchEvents)) {
|
|
243
|
+
if (response && BigInt(row.sequence) > BigInt(response.sourceThrough))
|
|
244
|
+
break;
|
|
245
|
+
const source = { ...row.payload, sourceSeq: row.sequence };
|
|
246
|
+
// Older journals may already contain a display event that could never
|
|
247
|
+
// fit the relay. Preserve its source identity and project it as history does.
|
|
248
|
+
const event = requiresLiveSync && source.kind === "timeline_upsert" ? { ...source, payload: sessionDisplayEntry(source.payload) } : source;
|
|
249
|
+
const size = sessionWireBytes(event);
|
|
250
|
+
if (size + 1024 > RELAY_LIMITS.maxFrameBytes)
|
|
251
|
+
throw new Error("Durable controller event exceeds relay frame limit.");
|
|
252
|
+
if (bytes + size > RELAY_LIMITS.maxFrameBytes)
|
|
253
|
+
break;
|
|
254
|
+
events.push(event);
|
|
255
|
+
bytes += size;
|
|
256
|
+
}
|
|
257
|
+
if (events.length) {
|
|
258
|
+
const id = randomUUID();
|
|
259
|
+
pendingBatch = { id, through: events.at(-1).sourceSeq };
|
|
260
|
+
send({ ...prefix(), type: "events", batchId: id, sourceEpoch: ticket.executionId, events });
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
callbacks.onError(String(error));
|
|
265
|
+
socket?.close();
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
polling = false;
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
const timer = setInterval(() => { void tick(); }, 100);
|
|
272
|
+
void tick();
|
|
273
|
+
return {
|
|
274
|
+
connected: () => synchronized && fence !== null,
|
|
275
|
+
authorize: (operationId) => new Promise((resolve, reject) => {
|
|
276
|
+
if (!synchronized) {
|
|
277
|
+
reject(new Error("Session relay is offline."));
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const timeout = setTimeout(() => { authorization.delete(operationId); reject(new Error("Operation authorization is unknown; native was not called.")); }, 15_000);
|
|
281
|
+
authorization.set(operationId, { resolve, reject, timer: timeout });
|
|
282
|
+
try {
|
|
283
|
+
send({ ...prefix(), type: "operation_begin", operationId });
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
clearTimeout(timeout);
|
|
287
|
+
authorization.delete(operationId);
|
|
288
|
+
reject(error);
|
|
289
|
+
}
|
|
290
|
+
}),
|
|
291
|
+
receipt: (operation) => { if (synchronized && (!operation.executionGeneration || operation.executionGeneration === ticket.executionGeneration))
|
|
292
|
+
send({ ...prefix(), type: "operation_receipt", operation: publicOperation(ticket, operation) }); },
|
|
293
|
+
async flush(timeoutMs = 5000) { const end = Date.now() + timeoutMs; while (journal.pendingEvents(1).length && Date.now() < end)
|
|
294
|
+
await new Promise(resolve => setTimeout(resolve, 50)); if (journal.pendingEvents(1).length)
|
|
295
|
+
throw new Error("Session events remain in the durable outbox."); },
|
|
296
|
+
close: () => { stopped = true; clearInterval(timer); socket?.terminate(); socket = null; clearConnection(); },
|
|
297
|
+
};
|
|
298
|
+
};
|
|
299
|
+
//# sourceMappingURL=relay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../../../src/commands/controller/relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAoE,MAAM,2BAA2B,CAAC;AAC/H,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAE,iBAAiB,EAAgK,MAAM,sCAAsC,CAAC;AAInR,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAA8B,EAAE,SAA8B,EAAoB,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,mBAAmB,EAAE,SAAS,CAAC,mBAAmB,IAAI,MAAM,CAAC,mBAAmB,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,cAAc,EAAG,SAAS,CAAC,MAAoE,EAAE,WAAW,IAAI,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACvnB,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,MAA8B,EAAoC,EAAE;IAC5G,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,cAAc,EAAE,IAAI,QAAQ,CAAC,IAAI,GAAG,MAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IACzN,MAAM,KAAK,GAAG,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAY,CAAC,CAAC;IACjH,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,eAAe,KAAK,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC,mBAAmB,KAAK,MAAM,CAAC,mBAAmB,IAAI,KAAK,CAAC,YAAY,KAAK,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC,oBAAoB,KAAK,MAAM,CAAC,oBAAoB,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;IAC1a,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAA8B,EAAE,OAAiC,EAAE,SAAuK,EAAE,EAAE;IAClR,IAAI,MAAM,GAAqB,IAAI,EAAE,KAAK,GAA2B,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC;IACjH,IAAI,UAAU,GAAG,KAAK,EAAE,gBAAgB,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,eAAe,GAAG,GAAG,CAAC;IAC7F,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,MAAM,eAAe,GAAoE,EAAE,CAAC;IAC5F,IAAI,cAAc,GAA4B,EAAE,CAAC;IACjD,IAAI,YAAY,GAA2C,IAAI,EAAE,YAAY,GAAG,EAAE,EAAE,aAAa,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;IAC3I,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkF,CAAC;IAChH,MAAM,qBAAqB,GAAG,CAAC,SAA2B,EAAE,QAAQ,GAAG,KAAK,EAAE,iBAAiB,GAAG,KAAK,EAAQ,EAAE;QAC/G,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,KAAK,KAAK,UAAU;YAAE,OAAO;QACrD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,IAAI,SAAS,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,SAAS,CAAC,eAAe,KAAK,MAAM,CAAC,eAAe,IAAI,CAAC,KAAK,CAAC,mBAAmB,IAAI,MAAM,CAAC,mBAAmB,CAAC,KAAK,SAAS,CAAC,mBAAmB,IAAI,iBAAiB,IAAI,SAAS,CAAC,mBAAmB,KAAK,KAAK,EAAE,mBAAmB,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,UAAU,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACrgB,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,sDAAsD,CAAC,CAAC;IAC5J,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,GAAG,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,MAAM,IAAI,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;QAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC,CAAC;IAAC,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACzX,MAAM,IAAI,GAAG,CAAC,OAA0B,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnU,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7I,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC9B,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,KAAK,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3a,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,OAAO,IAAI,UAAU,IAAI,MAAM;YAAE,OAAO;QAAC,UAAU,GAAG,IAAI,CAAC;QAC/D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAAC,IAAI,OAAO;gBAAE,OAAO;YAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC;YACjG,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,4BAA4B,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;YAAC,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YAClI,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC;YAAC,MAAM,GAAG,EAAE,CAAC;YACtK,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1D,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,MAAM,KAAK,EAAE;gBAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACxH,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,OAAO,IAAI,MAAM,KAAK,EAAE;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,kBAAkB,EAAE,OAAO,CAAC,2BAA2B,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACle,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE;gBACtB,IAAI,OAAO,IAAI,MAAM,KAAK,EAAE;oBAAE,OAAO;gBACrC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;oBAC/D,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;wBAC/B,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,eAAe,KAAK,MAAM,CAAC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,mBAAmB,KAAK,MAAM,CAAC,mBAAmB,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,KAAK,MAAM,CAAC,oBAAoB;4BAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;wBACnW,KAAK,GAAG,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;wBAC9E,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,KAAK,IAAI,CAAC;wBAAC,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC;wBAClG,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;wBACtD,MAAM,cAAc,GAA0B,EAAE,CAAC;wBACjD,IAAI,KAAyB,CAAC;wBAC9B,SAAS,CAAC;4BAAC,MAAM,IAAI,GAAG,OAAO,CAAC,4BAA4B,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;4BAAC,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC;4BAAC,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;gCAAE,MAAM;4BAAC,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,CAAC;wBAAC,CAAC;wBACnO,cAAc,GAAG,EAAE,CAAC;wBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,GAAG;4BAAE,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;wBAC3G,IAAI,CAAC,cAAc,CAAC,MAAM;4BAAE,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBACpD,kBAAkB,EAAE,CAAC;wBACrB,OAAO;oBACT,CAAC;oBACD,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,eAAe,KAAK,KAAK,CAAC,eAAe,IAAI,OAAO,CAAC,mBAAmB,KAAK,KAAK,CAAC,mBAAmB,IAAI,OAAO,CAAC,eAAe,KAAK,KAAK,CAAC,eAAe;wBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;oBACvS,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;wBACxC,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU;4BAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gCACzH,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS;oCAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;gCACtG,OAAO,CAAC,yBAAyB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;4BAC3D,CAAC;wBACD,IAAI,cAAc,CAAC,MAAM;4BAAE,kBAAkB,EAAE,CAAC;6BAAM,CAAC;4BAAC,UAAU,GAAG,IAAI,CAAC;4BAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;gCAAC,YAAY,GAAG,IAAI,CAAC;gCAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;4BAAC,CAAC;wBAAC,CAAC;oBAC5J,CAAC;yBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;wBACvC,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW,IAAI,CAAC,UAAU;4BAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;wBAC1H,WAAW,GAAG,KAAK,CAAC;wBAAC,YAAY,GAAG,IAAI,CAAC;wBAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;oBACzE,CAAC;yBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;wBAC9C,IAAI,CAAC,YAAY,IAAI,CAAC,gBAAgB;4BAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;wBAC1G,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;4BAChC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,2BAA2B,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,gDAAgD,EAAE,EAAE,CAAC,CAAC;wBAChP,CAAC;;4BAAM,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;oBACpE,CAAC;yBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;wBACpC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;wBACxD,IAAI,MAAM,IAAI,SAAS,CAAC,KAAK,KAAK,UAAU,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS;4BAAE,qBAAqB,CAAC,SAAS,EAAE,MAAM,KAAK,SAAS,EAAE,IAAI,CAAC,CAAC;wBAC5I,OAAO,CAAC,yBAAyB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;wBACzD,IAAI,MAAM,EAAE,CAAC;4BACX,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;4BAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;4BACxE,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,sDAAsD,CAAC,CAAC,CAAC;wBAC/G,CAAC;oBACH,CAAC;yBACI,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;wBAAC,IAAI,OAAO,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,OAAO,KAAK,YAAY,CAAC,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC;4BAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;wBAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;wBAAC,YAAY,GAAG,IAAI,CAAC;oBAAC,CAAC;yBACtU,IAAI,OAAO,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;wBAAC,IAAI,CAAC,YAAY;4BAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;wBAAC,KAAK,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAAC,CAAC;yBACvN,IAAI,OAAO,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;wBAAC,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;wBAAC,IAAI,MAAM,EAAE,CAAC;4BAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;4BAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;4BAAC,MAAM,CAAC,OAAO,EAAE,CAAC;wBAAC,CAAC;oBAAC,CAAC;yBAChN,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;wBAAC,SAAS,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;wBAAC,EAAE,CAAC,KAAK,EAAE,CAAC;oBAAC,CAAC;gBAC9G,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;gBAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAAC,CAAC;gBAC9E,CAAC;YAAC,UAAU,GAAG,KAAK,CAAC;QAAC,CAAC;IACjC,CAAC,CAAC;IACF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,OAAO,IAAI,OAAO;YAAE,OAAO;QAAC,OAAO,GAAG,IAAI,CAAC;QAC/C,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,CAAC;gBAAC,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW;oBAAE,MAAM,OAAO,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACxE,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU;gBAAE,OAAO;YAClC,IAAI,OAAO,CAAC,cAAc,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;gBAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,wCAAwC,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACnK,IAAI,WAAW;gBAAE,OAAO;YACxB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,MAAM,EAAE,CAAC;gBAAC,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;gBAAC,IAAI,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU;oBAAE,OAAO;gBAAC,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;oBAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;gBAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;YACpT,IAAI,YAAY;gBAAE,OAAO;YACzB,IAAI,gBAAgB,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;gBAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;gBACvC,MAAM,KAAK,GAAG,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,CAAC,eAAe,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC9Z,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;gBACvI,WAAW,GAAG,IAAI,CAAC;gBAAC,OAAO;YAC7B,CAAC;YACD,MAAM,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACjC,IAAI,MAAM,GAA8B,IAAI,EAAE,KAAK,GAA6B,IAAI,CAAC;gBACrF,IAAI,CAAC;oBACH,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,YAAY,KAAK,YAAY;wBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;oBAC5J,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACzL,CAAC;gBAAC,OAAO,OAAO,EAAE,CAAC;oBAAC,KAAK,GAAG,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,+BAA+B,EAAE,CAAC;gBAAC,CAAC;gBACpK,OAAO,CAAC,QAAQ,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC7H,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC;YACnC,IAAI,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBAChG,sEAAsE;gBACtE,wEAAwE;gBACxE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;gBAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBAAC,OAAO;YAChG,CAAC;YACD,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAkB,EAAE,CAAC;YAAC,IAAI,KAAK,GAAG,IAAI,CAAC;YACnD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrE,IAAI,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;oBAAE,MAAM;gBAC7E,MAAM,MAAM,GAAG,EAAE,GAAI,GAAG,CAAC,OAAkB,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAiB,CAAC;gBACtF,sEAAsE;gBACtE,8EAA8E;gBAC9E,MAAM,KAAK,GAAG,gBAAgB,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC3I,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACrC,IAAI,IAAI,GAAG,IAAI,GAAG,YAAY,CAAC,aAAa;oBAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBACrH,IAAI,KAAK,GAAG,IAAI,GAAG,YAAY,CAAC,aAAa;oBAAE,MAAM;gBACrD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAAC,KAAK,IAAI,IAAI,CAAC;YACpC,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAAC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;gBAAC,YAAY,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,SAAS,EAAE,CAAC;gBAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;YAAC,CAAC;QACxM,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;gBAC9D,CAAC;YAAC,OAAO,GAAG,KAAK,CAAC;QAAC,CAAC;IAC9B,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,KAAK,IAAI,EAAE,CAAC;IACZ,OAAO;QACL,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,IAAI,KAAK,KAAK,IAAI;QAC/C,SAAS,EAAE,CAAC,WAAmB,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjF,IAAI,CAAC,YAAY,EAAE,CAAC;gBAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAC9E,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAClK,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACpE,IAAI,CAAC;gBAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC;QACjK,CAAC,CAAC;QACF,OAAO,EAAE,CAAC,SAA8B,EAAE,EAAE,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,IAAI,SAAS,CAAC,mBAAmB,KAAK,MAAM,CAAC,mBAAmB,CAAC;YAAE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvQ,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,IAAmB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG;YAAE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC,CAAC;QAC7S,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;KAC9G,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CliContext } from "../../cli/context.js";
|
|
2
|
+
import type { SessionProvider } from "../../session/protocol.js";
|
|
3
|
+
import { type ControllerLaunchTicket } from "./launch-ticket.js";
|
|
4
|
+
export type ResumeLease = {
|
|
5
|
+
ticket: ControllerLaunchTicket;
|
|
6
|
+
nativeSessionId: string;
|
|
7
|
+
release(): Promise<void>;
|
|
8
|
+
};
|
|
9
|
+
/** Acquire one stopped local Test Session's native writer. The caller releases
|
|
10
|
+
* the lease only after proving its new controller and descendants stopped; an
|
|
11
|
+
* uncertain stop deliberately retains the lease for explicit reconciliation. */
|
|
12
|
+
export declare const acquireResume: (input: {
|
|
13
|
+
provider: SessionProvider;
|
|
14
|
+
sessionId?: string;
|
|
15
|
+
}, context: CliContext, config: {
|
|
16
|
+
serverUrl: string;
|
|
17
|
+
serverToken: string;
|
|
18
|
+
}) => Promise<ResumeLease>;
|