@nifrajs/coding-agent 3.2.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.
Files changed (211) hide show
  1. package/EXTENSIONS.md +25 -0
  2. package/PERFORMANCE.md +19 -0
  3. package/README.md +69 -0
  4. package/REGISTRY.md +15 -0
  5. package/SECURITY.md +32 -0
  6. package/dist/approvals.d.ts +70 -0
  7. package/dist/approvals.d.ts.map +1 -0
  8. package/dist/approvals.js +174 -0
  9. package/dist/approvals.js.map +1 -0
  10. package/dist/capabilities.d.ts +20 -0
  11. package/dist/capabilities.d.ts.map +1 -0
  12. package/dist/capabilities.js +49 -0
  13. package/dist/capabilities.js.map +1 -0
  14. package/dist/cli.d.ts +24 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +380 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/context.d.ts +17 -0
  19. package/dist/context.d.ts.map +1 -0
  20. package/dist/context.js +66 -0
  21. package/dist/context.js.map +1 -0
  22. package/dist/deployment-adapters.d.ts +40 -0
  23. package/dist/deployment-adapters.d.ts.map +1 -0
  24. package/dist/deployment-adapters.js +147 -0
  25. package/dist/deployment-adapters.js.map +1 -0
  26. package/dist/diff.d.ts +17 -0
  27. package/dist/diff.d.ts.map +1 -0
  28. package/dist/diff.js +61 -0
  29. package/dist/diff.js.map +1 -0
  30. package/dist/errors.d.ts +9 -0
  31. package/dist/errors.d.ts.map +1 -0
  32. package/dist/errors.js +35 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/extensions.d.ts +104 -0
  35. package/dist/extensions.d.ts.map +1 -0
  36. package/dist/extensions.js +284 -0
  37. package/dist/extensions.js.map +1 -0
  38. package/dist/handoffs.d.ts +97 -0
  39. package/dist/handoffs.d.ts.map +1 -0
  40. package/dist/handoffs.js +199 -0
  41. package/dist/handoffs.js.map +1 -0
  42. package/dist/healing.d.ts +56 -0
  43. package/dist/healing.d.ts.map +1 -0
  44. package/dist/healing.js +54 -0
  45. package/dist/healing.js.map +1 -0
  46. package/dist/host.d.ts +61 -0
  47. package/dist/host.d.ts.map +1 -0
  48. package/dist/host.js +369 -0
  49. package/dist/host.js.map +1 -0
  50. package/dist/index.d.ts +26 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +26 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/isolated-worker.d.ts +2 -0
  55. package/dist/isolated-worker.d.ts.map +1 -0
  56. package/dist/isolated-worker.js +155 -0
  57. package/dist/isolated-worker.js.map +1 -0
  58. package/dist/isolated.d.ts +52 -0
  59. package/dist/isolated.d.ts.map +1 -0
  60. package/dist/isolated.js +293 -0
  61. package/dist/isolated.js.map +1 -0
  62. package/dist/native.d.ts +92 -0
  63. package/dist/native.d.ts.map +1 -0
  64. package/dist/native.js +339 -0
  65. package/dist/native.js.map +1 -0
  66. package/dist/orchestration/artifact-port.d.ts +30 -0
  67. package/dist/orchestration/artifact-port.d.ts.map +1 -0
  68. package/dist/orchestration/artifact-port.js +59 -0
  69. package/dist/orchestration/artifact-port.js.map +1 -0
  70. package/dist/orchestration/catalog.d.ts +71 -0
  71. package/dist/orchestration/catalog.d.ts.map +1 -0
  72. package/dist/orchestration/catalog.js +46 -0
  73. package/dist/orchestration/catalog.js.map +1 -0
  74. package/dist/orchestration/compile.d.ts +59 -0
  75. package/dist/orchestration/compile.d.ts.map +1 -0
  76. package/dist/orchestration/compile.js +268 -0
  77. package/dist/orchestration/compile.js.map +1 -0
  78. package/dist/orchestration/dispatch.d.ts +115 -0
  79. package/dist/orchestration/dispatch.d.ts.map +1 -0
  80. package/dist/orchestration/dispatch.js +220 -0
  81. package/dist/orchestration/dispatch.js.map +1 -0
  82. package/dist/orchestration/durable-jobs.d.ts +35 -0
  83. package/dist/orchestration/durable-jobs.d.ts.map +1 -0
  84. package/dist/orchestration/durable-jobs.js +273 -0
  85. package/dist/orchestration/durable-jobs.js.map +1 -0
  86. package/dist/orchestration/effect-key.d.ts +23 -0
  87. package/dist/orchestration/effect-key.d.ts.map +1 -0
  88. package/dist/orchestration/effect-key.js +24 -0
  89. package/dist/orchestration/effect-key.js.map +1 -0
  90. package/dist/orchestration/evidence-store.d.ts +75 -0
  91. package/dist/orchestration/evidence-store.d.ts.map +1 -0
  92. package/dist/orchestration/evidence-store.js +183 -0
  93. package/dist/orchestration/evidence-store.js.map +1 -0
  94. package/dist/orchestration/hash.d.ts +12 -0
  95. package/dist/orchestration/hash.d.ts.map +1 -0
  96. package/dist/orchestration/hash.js +43 -0
  97. package/dist/orchestration/hash.js.map +1 -0
  98. package/dist/orchestration/host.d.ts +121 -0
  99. package/dist/orchestration/host.d.ts.map +1 -0
  100. package/dist/orchestration/host.js +334 -0
  101. package/dist/orchestration/host.js.map +1 -0
  102. package/dist/orchestration/index.d.ts +20 -0
  103. package/dist/orchestration/index.d.ts.map +1 -0
  104. package/dist/orchestration/index.js +19 -0
  105. package/dist/orchestration/index.js.map +1 -0
  106. package/dist/orchestration/policy.d.ts +63 -0
  107. package/dist/orchestration/policy.d.ts.map +1 -0
  108. package/dist/orchestration/policy.js +80 -0
  109. package/dist/orchestration/policy.js.map +1 -0
  110. package/dist/orchestration/recovery.d.ts +87 -0
  111. package/dist/orchestration/recovery.d.ts.map +1 -0
  112. package/dist/orchestration/recovery.js +197 -0
  113. package/dist/orchestration/recovery.js.map +1 -0
  114. package/dist/orchestration/tracer.d.ts +31 -0
  115. package/dist/orchestration/tracer.d.ts.map +1 -0
  116. package/dist/orchestration/tracer.js +141 -0
  117. package/dist/orchestration/tracer.js.map +1 -0
  118. package/dist/plans.d.ts +35 -0
  119. package/dist/plans.d.ts.map +1 -0
  120. package/dist/plans.js +63 -0
  121. package/dist/plans.js.map +1 -0
  122. package/dist/presets.d.ts +10 -0
  123. package/dist/presets.d.ts.map +1 -0
  124. package/dist/presets.js +70 -0
  125. package/dist/presets.js.map +1 -0
  126. package/dist/process.d.ts +6 -0
  127. package/dist/process.d.ts.map +1 -0
  128. package/dist/process.js +42 -0
  129. package/dist/process.js.map +1 -0
  130. package/dist/registry.d.ts +37 -0
  131. package/dist/registry.d.ts.map +1 -0
  132. package/dist/registry.js +51 -0
  133. package/dist/registry.js.map +1 -0
  134. package/dist/replay.d.ts +24 -0
  135. package/dist/replay.d.ts.map +1 -0
  136. package/dist/replay.js +154 -0
  137. package/dist/replay.js.map +1 -0
  138. package/dist/rpc.d.ts +51 -0
  139. package/dist/rpc.d.ts.map +1 -0
  140. package/dist/rpc.js +412 -0
  141. package/dist/rpc.js.map +1 -0
  142. package/dist/session-migration.d.ts +59 -0
  143. package/dist/session-migration.d.ts.map +1 -0
  144. package/dist/session-migration.js +315 -0
  145. package/dist/session-migration.js.map +1 -0
  146. package/dist/sessions.d.ts +74 -0
  147. package/dist/sessions.d.ts.map +1 -0
  148. package/dist/sessions.js +222 -0
  149. package/dist/sessions.js.map +1 -0
  150. package/dist/subagents.d.ts +51 -0
  151. package/dist/subagents.d.ts.map +1 -0
  152. package/dist/subagents.js +141 -0
  153. package/dist/subagents.js.map +1 -0
  154. package/dist/tools.d.ts +13 -0
  155. package/dist/tools.d.ts.map +1 -0
  156. package/dist/tools.js +37 -0
  157. package/dist/tools.js.map +1 -0
  158. package/dist/ui.d.ts +42 -0
  159. package/dist/ui.d.ts.map +1 -0
  160. package/dist/ui.js +93 -0
  161. package/dist/ui.js.map +1 -0
  162. package/dist/verification.d.ts +34 -0
  163. package/dist/verification.d.ts.map +1 -0
  164. package/dist/verification.js +91 -0
  165. package/dist/verification.js.map +1 -0
  166. package/dist/workflows.d.ts +98 -0
  167. package/dist/workflows.d.ts.map +1 -0
  168. package/dist/workflows.js +174 -0
  169. package/dist/workflows.js.map +1 -0
  170. package/package.json +84 -0
  171. package/src/approvals.ts +249 -0
  172. package/src/capabilities.ts +74 -0
  173. package/src/cli.ts +405 -0
  174. package/src/context.ts +81 -0
  175. package/src/deployment-adapters.ts +181 -0
  176. package/src/diff.ts +80 -0
  177. package/src/errors.ts +46 -0
  178. package/src/extensions.ts +402 -0
  179. package/src/handoffs.ts +299 -0
  180. package/src/healing.ts +93 -0
  181. package/src/host.ts +465 -0
  182. package/src/index.ts +165 -0
  183. package/src/isolated-worker.ts +177 -0
  184. package/src/isolated.ts +344 -0
  185. package/src/native.ts +478 -0
  186. package/src/orchestration/artifact-port.ts +75 -0
  187. package/src/orchestration/catalog.ts +102 -0
  188. package/src/orchestration/compile.ts +373 -0
  189. package/src/orchestration/dispatch.ts +383 -0
  190. package/src/orchestration/durable-jobs.ts +374 -0
  191. package/src/orchestration/effect-key.ts +35 -0
  192. package/src/orchestration/evidence-store.ts +233 -0
  193. package/src/orchestration/hash.ts +43 -0
  194. package/src/orchestration/host.ts +445 -0
  195. package/src/orchestration/index.ts +131 -0
  196. package/src/orchestration/policy.ts +116 -0
  197. package/src/orchestration/recovery.ts +271 -0
  198. package/src/orchestration/tracer.ts +177 -0
  199. package/src/plans.ts +105 -0
  200. package/src/presets.ts +90 -0
  201. package/src/process.ts +47 -0
  202. package/src/registry.ts +80 -0
  203. package/src/replay.ts +190 -0
  204. package/src/rpc.ts +598 -0
  205. package/src/session-migration.ts +401 -0
  206. package/src/sessions.ts +303 -0
  207. package/src/subagents.ts +210 -0
  208. package/src/tools.ts +52 -0
  209. package/src/ui.ts +137 -0
  210. package/src/verification.ts +133 -0
  211. package/src/workflows.ts +279 -0
package/dist/rpc.js ADDED
@@ -0,0 +1,412 @@
1
+ import { resumeFromCursor, } from "@nifrajs/agent-protocol";
2
+ import { readProjectDiff } from "./diff.js";
3
+ import { publicErrorDetails } from "./errors.js";
4
+ import { CodingAgentHost } from "./host.js";
5
+ import { readBoundedText } from "./process.js";
6
+ import { runNifraVerification } from "./verification.js";
7
+ /**
8
+ * Minimal loopback RPC surface for the CLI, Workbench, CI clients, and a future mobile companion.
9
+ * Turn output is SSE so clients do not need a WebSocket dependency; every event is still a versioned
10
+ * protocol event from the backend.
11
+ */
12
+ export class CodingAgentRpcServer {
13
+ host;
14
+ options;
15
+ token;
16
+ maxBodyBytes;
17
+ listener;
18
+ constructor(options) {
19
+ this.options = Object.freeze({ ...options });
20
+ this.host = new CodingAgentHost({
21
+ backend: options.backend,
22
+ ...(options.sessionStore === undefined ? {} : { sessionStore: options.sessionStore }),
23
+ ...(options.contextWindow === undefined ? {} : { contextWindow: options.contextWindow }),
24
+ ...(options.extensions === undefined ? {} : { extensions: options.extensions }),
25
+ ...(options.verifyAfterTurn === undefined
26
+ ? {}
27
+ : { verifyAfterTurn: options.verifyAfterTurn }),
28
+ ...(options.maxRepairAttempts === undefined
29
+ ? {}
30
+ : { maxRepairAttempts: options.maxRepairAttempts }),
31
+ exposeErrorStacks: options.exposeErrorStacks === true,
32
+ ...(options.verification === undefined ? {} : { verification: options.verification }),
33
+ });
34
+ this.token = options.authToken ?? crypto.randomUUID().replaceAll("-", "");
35
+ if (!/^[A-Za-z0-9._~-]{16,256}$/.test(this.token))
36
+ throw new TypeError("agent rpc: authToken must be a bounded token");
37
+ this.maxBodyBytes = options.maxBodyBytes ?? 1_048_576;
38
+ if (!Number.isSafeInteger(this.maxBodyBytes) || this.maxBodyBytes < 1024)
39
+ throw new RangeError("agent rpc: maxBodyBytes must be at least 1024");
40
+ }
41
+ async start() {
42
+ if (this.listener !== undefined)
43
+ throw new Error("agent rpc: server is already running");
44
+ const hostname = this.options.hostname ?? "127.0.0.1";
45
+ if (!this.options.allowRemote && !isLoopbackHost(hostname))
46
+ throw new Error("agent rpc: remote binding requires allowRemote: true");
47
+ if (this.options.exposeErrorStacks === true && this.options.allowRemote === true)
48
+ throw new Error("agent rpc: exposeErrorStacks is only allowed for local-only binding");
49
+ this.listener = Bun.serve({
50
+ hostname,
51
+ port: this.options.port ?? 0,
52
+ fetch: (request) => this.fetch(request),
53
+ });
54
+ const listener = this.listener;
55
+ return {
56
+ url: listener.url.toString().replace(/\/$/, ""),
57
+ token: this.token,
58
+ stop: async () => {
59
+ await this.stop();
60
+ },
61
+ };
62
+ }
63
+ async stop() {
64
+ const listener = this.listener;
65
+ this.listener = undefined;
66
+ await this.host.stop("rpc server stopped");
67
+ listener?.stop(true);
68
+ }
69
+ async fetch(request) {
70
+ const cors = corsHeaders(request);
71
+ if (request.method === "OPTIONS")
72
+ return new Response(null, { status: 204, headers: cors });
73
+ const url = new URL(request.url);
74
+ if (url.pathname === "/health" && request.method === "GET")
75
+ return json({ ok: true, protocol: 1 }, 200, cors);
76
+ if (!authorized(request, this.token))
77
+ return json({ error: { code: "unauthorized", message: "agent RPC authorization required" } }, 401, cors);
78
+ if (url.pathname !== "/rpc" || request.method !== "POST")
79
+ return json({ error: { code: "not_found", message: "unknown agent RPC endpoint" } }, 404, cors);
80
+ const body = await this.readRequest(request);
81
+ if (!body.ok)
82
+ return json({ error: { code: "invalid_request", message: body.error } }, body.status, cors);
83
+ let rpc;
84
+ try {
85
+ rpc = parseRpcRequest(body.text);
86
+ }
87
+ catch (error) {
88
+ return json({ error: this.protocolError("invalid_request", error, "request body is invalid") }, 400, cors, this.options.exposeErrorStacks === true);
89
+ }
90
+ try {
91
+ return await this.dispatch(rpc, request, cors);
92
+ }
93
+ catch (error) {
94
+ return json({ error: this.protocolError("rpc_failed", error, "request could not be completed") }, 500, cors, this.options.exposeErrorStacks === true);
95
+ }
96
+ }
97
+ async dispatch(request, httpRequest, cors) {
98
+ switch (request.method) {
99
+ case "session.create": {
100
+ const params = record(request.params);
101
+ const snapshot = this.host.snapshot ??
102
+ (await this.host.start({
103
+ cwd: this.options.cwd,
104
+ backend: this.options.backend.info.name,
105
+ ...(typeof params.sessionId === "string" ? { sessionId: params.sessionId } : {}),
106
+ }));
107
+ return json(snapshot, 200, cors);
108
+ }
109
+ case "session.snapshot": {
110
+ const snapshot = this.requireSnapshot();
111
+ return json(snapshot, 200, cors);
112
+ }
113
+ case "session.resume": {
114
+ const params = record(request.params);
115
+ if (typeof params.sessionId !== "string" ||
116
+ !/^[A-Za-z0-9._:-]{1,128}$/.test(params.sessionId))
117
+ return json({ error: { code: "invalid_session", message: "sessionId is required" } }, 422, cors);
118
+ const snapshot = this.host.snapshot ??
119
+ (await this.host.start({
120
+ cwd: this.options.cwd,
121
+ backend: this.options.backend.info.name,
122
+ sessionId: params.sessionId,
123
+ }));
124
+ return json(snapshot, 200, cors);
125
+ }
126
+ case "session.events": {
127
+ const snapshot = this.requireSnapshot();
128
+ const params = record(request.params);
129
+ const limit = params.limit === undefined ? 512 : Number(params.limit);
130
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 4096)
131
+ return json({
132
+ error: { code: "invalid_history_limit", message: "limit must be between 1 and 4096" },
133
+ }, 422, cors);
134
+ const window = await this.host.history(limit);
135
+ // Legacy shape when no cursor is requested; a cursor opts into bounded snapshot + resume.
136
+ if (params.cursor === undefined)
137
+ return json({ entries: window }, 200, cors);
138
+ const cursor = Number(params.cursor);
139
+ if (!Number.isSafeInteger(cursor) || cursor < -1)
140
+ return json({ error: { code: "invalid_cursor", message: "cursor must be a safe integer >= -1" } }, 422, cors);
141
+ return json({ snapshot, resume: resumeFromCursor(window, cursor) }, 200, cors);
142
+ }
143
+ case "session.checkpoint": {
144
+ this.requireSnapshot();
145
+ const params = record(request.params);
146
+ await this.host.checkpoint(params.payload);
147
+ return json({ ok: true }, 200, cors);
148
+ }
149
+ case "session.fork": {
150
+ this.requireSnapshot();
151
+ const params = record(request.params);
152
+ if (params.targetSessionId !== undefined && typeof params.targetSessionId !== "string")
153
+ return json({ error: { code: "invalid_session", message: "targetSessionId must be a string" } }, 422, cors);
154
+ return json(await this.host.fork(params.targetSessionId), 201, cors);
155
+ }
156
+ case "turn.send": {
157
+ const params = record(request.params);
158
+ if (typeof params.message !== "string" ||
159
+ params.message.trim().length === 0 ||
160
+ params.message.length > this.maxBodyBytes)
161
+ return json({
162
+ error: {
163
+ code: "invalid_message",
164
+ message: "message must be a non-empty bounded string",
165
+ },
166
+ }, 422, cors);
167
+ const stream = this.host.prompt(params.message, httpRequest.signal);
168
+ const encoder = new TextEncoder();
169
+ const includeErrorStacks = this.options.exposeErrorStacks === true;
170
+ const turnError = (error) => ({
171
+ code: "turn_failed",
172
+ ...publicErrorDetails(error, "turn could not be completed", includeErrorStacks),
173
+ });
174
+ const body = new ReadableStream({
175
+ async start(controller) {
176
+ try {
177
+ for await (const event of stream)
178
+ controller.enqueue(encoder.encode(`data: ${serializeRpcValue(event, includeErrorStacks)}\n\n`));
179
+ controller.close();
180
+ }
181
+ catch (error) {
182
+ controller.enqueue(encoder.encode(`event: error\ndata: ${JSON.stringify(turnError(error))}\n\n`));
183
+ controller.close();
184
+ }
185
+ },
186
+ });
187
+ return new Response(body, {
188
+ status: 200,
189
+ headers: new Headers({
190
+ ...Object.fromEntries(cors),
191
+ "content-type": "text/event-stream; charset=utf-8",
192
+ "cache-control": "no-cache, no-transform",
193
+ connection: "keep-alive",
194
+ }),
195
+ });
196
+ }
197
+ case "session.reload": {
198
+ const result = await this.host.reload();
199
+ return json(result, 200, cors);
200
+ }
201
+ case "session.compact": {
202
+ this.requireSnapshot();
203
+ return json(await this.host.compact("manual"), 200, cors);
204
+ }
205
+ case "approval.list": {
206
+ this.requireSnapshot();
207
+ return json({ pending: this.host.pendingApprovals }, 200, cors);
208
+ }
209
+ case "approval.request": {
210
+ const params = record(request.params);
211
+ if (typeof params.action !== "string" || typeof params.capability !== "string")
212
+ return json({ error: { code: "invalid_approval", message: "action and capability are required" } }, 422, cors);
213
+ this.requireSnapshot();
214
+ const approval = await this.host.offerApproval({
215
+ ...(typeof params.approvalId === "string"
216
+ ? { id: params.approvalId }
217
+ : { id: crypto.randomUUID().replaceAll("-", "") }),
218
+ action: params.action,
219
+ capability: params.capability,
220
+ ...(typeof params.turnId === "string" ? { turnId: params.turnId } : {}),
221
+ ...(typeof params.reason === "string" ? { reason: params.reason } : {}),
222
+ });
223
+ if (approval === undefined)
224
+ return json({ error: { code: "approval_limit", message: "too many pending approvals" } }, 429, cors);
225
+ return json(approval, 201, cors);
226
+ }
227
+ case "approval.resolve": {
228
+ const params = record(request.params);
229
+ if (typeof params.approvalId !== "string" || typeof params.approved !== "boolean")
230
+ return json({
231
+ error: { code: "invalid_approval", message: "approvalId and approved are required" },
232
+ }, 422, cors);
233
+ this.requireSnapshot();
234
+ const decision = await this.host.resolveApproval(params.approvalId, params.approved, typeof params.reason === "string" ? params.reason : undefined);
235
+ if (decision === undefined)
236
+ return json({ error: { code: "approval_not_found", message: "approval is not pending" } }, 404, cors);
237
+ return json(decision, 200, cors);
238
+ }
239
+ case "ui.snapshot": {
240
+ this.requireSnapshot();
241
+ return json(this.options.ui === undefined
242
+ ? { revision: "0", active: [] }
243
+ : { revision: this.options.ui.currentRevision, active: this.options.ui.extensions }, 200, cors);
244
+ }
245
+ case "ui.reload": {
246
+ this.requireSnapshot();
247
+ if (this.options.ui === undefined)
248
+ return json({ error: { code: "ui_unavailable", message: "UI extension host is not configured" } }, 409, cors);
249
+ const params = record(request.params);
250
+ if (!Array.isArray(params.manifests))
251
+ return json({ error: { code: "invalid_ui", message: "manifests must be an array" } }, 422, cors);
252
+ return json(this.options.ui.reload(params.manifests), 200, cors);
253
+ }
254
+ case "ui.preview": {
255
+ this.requireSnapshot();
256
+ if (this.options.ui === undefined)
257
+ return json({ error: { code: "ui_unavailable", message: "UI extension host is not configured" } }, 409, cors);
258
+ const params = record(request.params);
259
+ if (!Array.isArray(params.manifests))
260
+ return json({ error: { code: "invalid_ui", message: "manifests must be an array" } }, 422, cors);
261
+ return json(this.options.ui.preview(params.manifests), 200, cors);
262
+ }
263
+ case "workflow.list": {
264
+ this.requireSnapshot();
265
+ return json({ workflows: this.options.extensions?.availableWorkflows ?? [] }, 200, cors);
266
+ }
267
+ case "subagent.list": {
268
+ this.requireSnapshot();
269
+ return json({ subagents: this.options.extensions?.availableSubagents ?? [] }, 200, cors);
270
+ }
271
+ case "provider.list": {
272
+ this.requireSnapshot();
273
+ return json({ providers: this.options.extensions?.availableProviders ?? [] }, 200, cors);
274
+ }
275
+ case "workflow.run": {
276
+ this.requireSnapshot();
277
+ if (this.options.extensions === undefined)
278
+ return json({ error: { code: "workflow_unavailable", message: "workflow host is not configured" } }, 409, cors);
279
+ const params = record(request.params);
280
+ if (typeof params.name !== "string" || !/^[a-z][a-z0-9._-]{0,63}$/.test(params.name))
281
+ return json({ error: { code: "invalid_workflow", message: "name must be a bounded workflow id" } }, 422, cors);
282
+ const result = await this.options.extensions.runWorkflow(params.name, {
283
+ ...(httpRequest.signal === undefined ? {} : { signal: httpRequest.signal }),
284
+ ...(typeof params.maxSteps === "number" &&
285
+ Number.isSafeInteger(params.maxSteps) &&
286
+ params.maxSteps > 0
287
+ ? { maxSteps: Math.min(params.maxSteps, 512) }
288
+ : {}),
289
+ ...(typeof params.maxDepth === "number" &&
290
+ Number.isSafeInteger(params.maxDepth) &&
291
+ params.maxDepth > 0
292
+ ? { maxDepth: Math.min(params.maxDepth, 16) }
293
+ : {}),
294
+ exposeErrorStacks: this.options.exposeErrorStacks === true,
295
+ });
296
+ return json(result, result.ok ? 200 : 422, cors, this.options.exposeErrorStacks === true);
297
+ }
298
+ case "verification.run": {
299
+ const params = record(request.params);
300
+ const name = params.name;
301
+ if (name !== "check" && name !== "assure" && name !== "test")
302
+ return json({
303
+ error: {
304
+ code: "invalid_verification",
305
+ message: "name must be check, assure, or test",
306
+ },
307
+ }, 422, cors);
308
+ this.requireSnapshot();
309
+ return json(await runNifraVerification(name, {
310
+ cwd: this.options.cwd,
311
+ exposeErrorStacks: this.options.exposeErrorStacks === true,
312
+ }), 200, cors, this.options.exposeErrorStacks === true);
313
+ }
314
+ case "project.diff": {
315
+ this.requireSnapshot();
316
+ return json(await readProjectDiff({
317
+ cwd: this.options.cwd,
318
+ exposeErrorStacks: this.options.exposeErrorStacks === true,
319
+ }), 200, cors, this.options.exposeErrorStacks === true);
320
+ }
321
+ case "session.stop": {
322
+ await this.host.stop("rpc request");
323
+ return json({ ok: true }, 200, cors);
324
+ }
325
+ default:
326
+ return json({ error: { code: "method_not_found", message: `unknown method: ${request.method}` } }, 404, cors);
327
+ }
328
+ }
329
+ requireSnapshot() {
330
+ if (this.host.snapshot === undefined)
331
+ throw new Error("agent RPC session has not been created");
332
+ return this.host.snapshot;
333
+ }
334
+ protocolError(code, error, fallback) {
335
+ return { code, ...publicErrorDetails(error, fallback, this.options.exposeErrorStacks === true) };
336
+ }
337
+ async readRequest(request) {
338
+ const length = Number(request.headers.get("content-length") ?? "0");
339
+ if (Number.isFinite(length) && length > this.maxBodyBytes)
340
+ return { ok: false, status: 413, error: "request body is too large" };
341
+ const result = await readBoundedText(request.body, this.maxBodyBytes);
342
+ if (result.truncated)
343
+ return { ok: false, status: 413, error: "request body is too large" };
344
+ return { ok: true, text: result.text };
345
+ }
346
+ }
347
+ function parseRpcRequest(text) {
348
+ let value;
349
+ try {
350
+ value = JSON.parse(text);
351
+ }
352
+ catch {
353
+ throw new Error("request body must be JSON");
354
+ }
355
+ const object = record(value);
356
+ if (typeof object.method !== "string" || !/^[a-z][a-z0-9._-]{1,63}$/.test(object.method))
357
+ throw new Error("request method is invalid");
358
+ return {
359
+ method: object.method,
360
+ ...(Object.hasOwn(object, "params") ? { params: object.params } : {}),
361
+ };
362
+ }
363
+ function record(value) {
364
+ if (value === null || typeof value !== "object" || Array.isArray(value))
365
+ return {};
366
+ return value;
367
+ }
368
+ function authorized(request, token) {
369
+ const header = request.headers.get("authorization");
370
+ if (header === null || !header.startsWith("Bearer "))
371
+ return false;
372
+ return constantTimeEqual(header.slice(7), token);
373
+ }
374
+ function constantTimeEqual(left, right) {
375
+ const a = new TextEncoder().encode(left);
376
+ const b = new TextEncoder().encode(right);
377
+ let difference = a.length ^ b.length;
378
+ const length = Math.max(a.length, b.length);
379
+ for (let index = 0; index < length; index++)
380
+ difference |= (a[index] ?? 0) ^ (b[index] ?? 0);
381
+ return difference === 0;
382
+ }
383
+ function corsHeaders(request) {
384
+ const headers = new Headers({
385
+ vary: "Origin",
386
+ "access-control-allow-headers": "authorization, content-type",
387
+ "access-control-allow-methods": "GET, POST, OPTIONS",
388
+ });
389
+ const origin = request.headers.get("origin");
390
+ if (origin !== null && /^https?:\/\/(?:127\.0\.0\.1|localhost)(?::\d+)?$/.test(origin))
391
+ headers.set("access-control-allow-origin", origin);
392
+ return headers;
393
+ }
394
+ function isLoopbackHost(hostname) {
395
+ return (hostname === "localhost" ||
396
+ hostname === "127.0.0.1" ||
397
+ hostname === "::1" ||
398
+ hostname === "[::1]");
399
+ }
400
+ function json(value, status, inherited, includeErrorStacks = false) {
401
+ const headers = new Headers(inherited);
402
+ headers.set("content-type", "application/json; charset=utf-8");
403
+ // lgtm [js/stack-trace-exposure] the default replacer removes stack fields from protocol data;
404
+ // stacks are serialized only in explicitly opt-in, loopback-only diagnostics mode.
405
+ return new Response(serializeRpcValue(value, includeErrorStacks), { status, headers });
406
+ }
407
+ function serializeRpcValue(value, includeErrorStacks) {
408
+ return JSON.stringify(value, includeErrorStacks
409
+ ? undefined
410
+ : (key, nested) => (key === "stack" ? undefined : nested));
411
+ }
412
+ //# sourceMappingURL=rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,gBAAgB,GACjB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAEhD,OAAO,EAAE,eAAe,EAA+B,MAAM,WAAW,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAG9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAuCxD;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;IACtB,IAAI,CAAiB;IACb,OAAO,CAA6B;IACpC,KAAK,CAAQ;IACb,YAAY,CAAQ;IAC7B,QAAQ,CAA2B;IAE3C,YAAY,OAAoC;QAC9C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI,GAAG,IAAI,eAAe,CAAC;YAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;YACrF,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;YACxF,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC;YAC/E,GAAG,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;gBACvC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;YACjD,GAAG,CAAC,OAAO,CAAC,iBAAiB,KAAK,SAAS;gBACzC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACrD,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,KAAK,IAAI;YACrD,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;SACtF,CAAC,CAAA;QACF,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QACzE,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAC/C,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAA;QACrE,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,SAAS,CAAA;QACrD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI;YACtE,MAAM,IAAI,UAAU,CAAC,+CAA+C,CAAC,CAAA;IACzE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAA;QACrD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;QACzE,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,IAAI;YAC9E,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAA;QACxF,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC;YACxB,QAAQ;YACR,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;YAC5B,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;SACxC,CAAC,CAAA;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,OAAO;YACL,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;YAC/C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;YACnB,CAAC;SACF,CAAA;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAA;QACzB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;QAC1C,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IACtB,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,OAAgB;QAClC,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;QACjC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3F,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAChC,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;YACxD,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QACnD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;YAClC,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,kCAAkC,EAAE,EAAE,EAChF,GAAG,EACH,IAAI,CACL,CAAA;QACH,IAAI,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;YACtD,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,4BAA4B,EAAE,EAAE,EACvE,GAAG,EACH,IAAI,CACL,CAAA;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE;YACV,OAAO,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QAC7F,IAAI,GAAe,CAAA;QACnB,IAAI,CAAC;YACH,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,KAAK,EAAE,yBAAyB,CAAC,EAAE,EAClF,GAAG,EACH,IAAI,EACJ,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,CACxC,CAAA;QACH,CAAC;QACD,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,EAAE,gCAAgC,CAAC,EAAE,EACpF,GAAG,EACH,IAAI,EACJ,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,CACxC,CAAA;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,OAAmB,EACnB,WAAoB,EACpB,IAAa;QAEb,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;YACvB,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,MAAM,QAAQ,GACZ,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAClB,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;wBACrB,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;wBACrB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;wBACvC,GAAG,CAAC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACjF,CAAC,CAAC,CAAA;gBACL,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAClC,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;gBACvC,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAClC,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,IACE,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;oBACpC,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;oBAElD,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,EACxE,GAAG,EACH,IAAI,CACL,CAAA;gBACH,MAAM,QAAQ,GACZ,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAClB,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;wBACrB,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;wBACrB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;wBACvC,SAAS,EAAE,MAAM,CAAC,SAAS;qBAC5B,CAAC,CAAC,CAAA;gBACL,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAClC,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;gBACvC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBACrE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI;oBAC3D,OAAO,IAAI,CACT;wBACE,KAAK,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,kCAAkC,EAAE;qBACtF,EACD,GAAG,EACH,IAAI,CACL,CAAA;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;gBAC7C,0FAA0F;gBAC1F,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;oBAAE,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;gBAC5E,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBACpC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC;oBAC9C,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,qCAAqC,EAAE,EAAE,EACrF,GAAG,EACH,IAAI,CACL,CAAA;gBACH,OAAO,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAChF,CAAC;YACD,KAAK,oBAAoB,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBAC1C,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;YACD,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ;oBACpF,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,kCAAkC,EAAE,EAAE,EACnF,GAAG,EACH,IAAI,CACL,CAAA;gBACH,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAqC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC5F,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,IACE,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ;oBAClC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;oBAClC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY;oBAEzC,OAAO,IAAI,CACT;wBACE,KAAK,EAAE;4BACL,IAAI,EAAE,iBAAiB;4BACvB,OAAO,EAAE,4CAA4C;yBACtD;qBACF,EACD,GAAG,EACH,IAAI,CACL,CAAA;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;gBACnE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;gBACjC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,CAAA;gBAClE,MAAM,SAAS,GAAG,CAAC,KAAc,EAAE,EAAE,CAAC,CAAC;oBACrC,IAAI,EAAE,aAAa;oBACnB,GAAG,kBAAkB,CAAC,KAAK,EAAE,6BAA6B,EAAE,kBAAkB,CAAC;iBAChF,CAAC,CAAA;gBACF,MAAM,IAAI,GAAG,IAAI,cAAc,CAAa;oBAC1C,KAAK,CAAC,KAAK,CAAC,UAAU;wBACpB,IAAI,CAAC;4BACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM;gCAC9B,UAAU,CAAC,OAAO,CAChB,OAAO,CAAC,MAAM,CAAC,SAAS,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,CAAC,MAAM,CAAC,CAC5E,CAAA;4BACH,UAAU,CAAC,KAAK,EAAE,CAAA;wBACpB,CAAC;wBAAC,OAAO,KAAK,EAAE,CAAC;4BACf,UAAU,CAAC,OAAO,CAChB,OAAO,CAAC,MAAM,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAC9E,CAAA;4BACD,UAAU,CAAC,KAAK,EAAE,CAAA;wBACpB,CAAC;oBACH,CAAC;iBACF,CAAC,CAAA;gBACF,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;oBACxB,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE,IAAI,OAAO,CAAC;wBACnB,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;wBAC3B,cAAc,EAAE,kCAAkC;wBAClD,eAAe,EAAE,wBAAwB;wBACzC,UAAU,EAAE,YAAY;qBACzB,CAAC;iBACH,CAAC,CAAA;YACJ,CAAC;YACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,MAAM,GAAiB,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAA;gBACrD,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAChC,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC3D,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YACjE,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;oBAC5E,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,oCAAoC,EAAE,EAAE,EACtF,GAAG,EACH,IAAI,CACL,CAAA;gBACH,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;oBAC7C,GAAG,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;wBACvC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;wBAC3B,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;oBACpD,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvE,GAAG,CAAC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACxE,CAAC,CAAA;gBACF,IAAI,QAAQ,KAAK,SAAS;oBACxB,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,4BAA4B,EAAE,EAAE,EAC5E,GAAG,EACH,IAAI,CACL,CAAA;gBACH,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAClC,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,SAAS;oBAC/E,OAAO,IAAI,CACT;wBACE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,sCAAsC,EAAE;qBACrF,EACD,GAAG,EACH,IAAI,CACL,CAAA;gBACH,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAC9C,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,QAAQ,EACf,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAC9D,CAAA;gBACD,IAAI,QAAQ,KAAK,SAAS;oBACxB,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,EAC7E,GAAG,EACH,IAAI,CACL,CAAA;gBACH,OAAO,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAClC,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,OAAO,IAAI,CACT,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS;oBAC3B,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;oBAC/B,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,EACrF,GAAG,EACH,IAAI,CACL,CAAA;YACH,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS;oBAC/B,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,qCAAqC,EAAE,EAAE,EACrF,GAAG,EACH,IAAI,CACL,CAAA;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;oBAClC,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,4BAA4B,EAAE,EAAE,EACxE,GAAG,EACH,IAAI,CACL,CAAA;gBACH,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAkC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC3F,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS;oBAC/B,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,qCAAqC,EAAE,EAAE,EACrF,GAAG,EACH,IAAI,CACL,CAAA;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;oBAClC,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,4BAA4B,EAAE,EAAE,EACxE,GAAG,EACH,IAAI,CACL,CAAA;gBACH,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAkC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC5F,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,OAAO,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,kBAAkB,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC1F,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,OAAO,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,kBAAkB,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC1F,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,OAAO,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,kBAAkB,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YAC1F,CAAC;YACD,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS;oBACvC,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,iCAAiC,EAAE,EAAE,EACvF,GAAG,EACH,IAAI,CACL,CAAA;gBACH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAClF,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,oCAAoC,EAAE,EAAE,EACtF,GAAG,EACH,IAAI,CACL,CAAA;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE;oBACpE,GAAG,CAAC,WAAW,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;oBAC3E,GAAG,CAAC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;wBACvC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC;wBACrC,MAAM,CAAC,QAAQ,GAAG,CAAC;wBACjB,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;wBAC9C,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;wBACvC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC;wBACrC,MAAM,CAAC,QAAQ,GAAG,CAAC;wBACjB,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE;wBAC7C,CAAC,CAAC,EAAE,CAAC;oBACP,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI;iBAC3D,CAAC,CAAA;gBACF,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,CAAC,CAAA;YAC3F,CAAC;YACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;gBACxB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACrC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;gBACxB,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,MAAM;oBAC1D,OAAO,IAAI,CACT;wBACE,KAAK,EAAE;4BACL,IAAI,EAAE,sBAAsB;4BAC5B,OAAO,EAAE,qCAAqC;yBAC/C;qBACF,EACD,GAAG,EACH,IAAI,CACL,CAAA;gBACH,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,OAAO,IAAI,CACT,MAAM,oBAAoB,CAAC,IAAI,EAAE;oBAC/B,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;oBACrB,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI;iBAC3D,CAAC,EACF,GAAG,EACH,IAAI,EACJ,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,CACxC,CAAA;YACH,CAAC;YACD,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,eAAe,EAAE,CAAA;gBACtB,OAAO,IAAI,CACT,MAAM,eAAe,CAAC;oBACpB,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG;oBACrB,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI;iBAC3D,CAAC,EACF,GAAG,EACH,IAAI,EACJ,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,CACxC,CAAA;YACH,CAAC;YACD,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;gBACnC,OAAO,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;YACD;gBACE,OAAO,IAAI,CACT,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,mBAAmB,OAAO,CAAC,MAAM,EAAE,EAAE,EAAE,EACrF,GAAG,EACH,IAAI,CACL,CAAA;QACL,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;QAC/F,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAA;IAC3B,CAAC;IAEO,aAAa,CACnB,IAAY,EACZ,KAAc,EACd,QAAgB;QAEhB,OAAO,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,KAAK,IAAI,CAAC,EAAE,CAAA;IAClG,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,OAAgB;QAKhB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAA;QACnE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,IAAI,CAAC,YAAY;YACvD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAA;QACvE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QACrE,IAAI,MAAM,CAAC,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,2BAA2B,EAAE,CAAA;QAC3F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;IACxC,CAAC;CACF;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,KAAc,CAAA;IAClB,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAC9C,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5B,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QACtF,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAA;IAC9C,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtE,CAAA;AACH,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAClF,OAAO,KAAgC,CAAA;AACzC,CAAC;AAED,SAAS,UAAU,CAAC,OAAgB,EAAE,KAAa;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IACnD,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAA;IAClE,OAAO,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AAClD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY,EAAE,KAAa;IACpD,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,CAAC,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACzC,IAAI,UAAU,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;IAC3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE;QAAE,UAAU,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5F,OAAO,UAAU,KAAK,CAAC,CAAA;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,OAAgB;IACnC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;QAC1B,IAAI,EAAE,QAAQ;QACd,8BAA8B,EAAE,6BAA6B;QAC7D,8BAA8B,EAAE,oBAAoB;KACrD,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC5C,IAAI,MAAM,KAAK,IAAI,IAAI,kDAAkD,CAAC,IAAI,CAAC,MAAM,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAA;IACpD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,OAAO,CACL,QAAQ,KAAK,WAAW;QACxB,QAAQ,KAAK,WAAW;QACxB,QAAQ,KAAK,KAAK;QAClB,QAAQ,KAAK,OAAO,CACrB,CAAA;AACH,CAAC;AAED,SAAS,IAAI,CACX,KAAc,EACd,MAAc,EACd,SAAkB,EAClB,kBAAkB,GAAG,KAAK;IAE1B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAA;IACtC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAA;IAC9D,+FAA+F;IAC/F,mFAAmF;IACnF,OAAO,IAAI,QAAQ,CAAC,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;AACxF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc,EAAE,kBAA2B;IACpE,OAAO,IAAI,CAAC,SAAS,CACnB,KAAK,EACL,kBAAkB;QAChB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,CAAC,GAAW,EAAE,MAAe,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAC7E,CAAA;AACH,CAAC"}
@@ -0,0 +1,59 @@
1
+ /** Version of the evidence-only legacy session file format. */
2
+ export declare const SESSION_EVIDENCE_VERSION: 1;
3
+ /**
4
+ * A single legacy session record after content has been removed.
5
+ *
6
+ * `digest` covers this record without the digest field. It is an integrity identifier, not a
7
+ * digest of the legacy payload. The payload is never written to the migration target.
8
+ */
9
+ export interface SessionEvidenceRecord {
10
+ readonly version: typeof SESSION_EVIDENCE_VERSION;
11
+ readonly sessionId: string;
12
+ readonly seq: number;
13
+ readonly at: number;
14
+ readonly code: string;
15
+ readonly count: 1;
16
+ readonly digest: string;
17
+ readonly pinned?: boolean;
18
+ }
19
+ /** Counts and integrity metadata emitted after a target has been fully validated. */
20
+ export interface SessionMigrationReport {
21
+ readonly version: typeof SESSION_EVIDENCE_VERSION;
22
+ readonly sessionId: string;
23
+ readonly records: number;
24
+ /** Number of source event types replaced by the stable unknown-event code. */
25
+ readonly skipped: number;
26
+ readonly skippedByCode: Readonly<Record<string, number>>;
27
+ readonly counts: Readonly<Record<string, number>>;
28
+ readonly firstSeq?: number;
29
+ readonly lastSeq?: number;
30
+ /** Digest of the complete evidence-only target file, including line separators. */
31
+ readonly digest: string;
32
+ }
33
+ export interface MigrateLegacySessionOptions {
34
+ readonly sourceRoot: string;
35
+ readonly targetRoot: string;
36
+ readonly sessionId: string;
37
+ /** Abort before any target commit. The legacy source is never modified. */
38
+ readonly signal?: AbortSignal;
39
+ /** Bound the amount of legacy data read into transient memory. */
40
+ readonly maxSourceBytes?: number;
41
+ }
42
+ export declare class SessionMigrationError extends Error {
43
+ readonly code: string;
44
+ constructor(code: string, message: string);
45
+ }
46
+ /**
47
+ * Convert a legacy event type into a stable, content-free evidence code.
48
+ * Unknown event names are intentionally not copied to the target: their SHA-256 prefix gives a
49
+ * repeatable grouping key without disclosing an arbitrary source string.
50
+ */
51
+ export declare function stableSessionEventCode(type: string): Promise<{
52
+ readonly code: string;
53
+ readonly replaced: boolean;
54
+ }>;
55
+ /** Parse one evidence record strictly. Payload-bearing or unknown fields are rejected. */
56
+ export declare function parseSessionEvidenceRecord(value: unknown): SessionEvidenceRecord;
57
+ /** Read, project, validate, and atomically commit one legacy local session. */
58
+ export declare function migrateLegacySession(options: MigrateLegacySessionOptions): Promise<SessionMigrationReport>;
59
+ //# sourceMappingURL=session-migration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-migration.d.ts","sourceRoot":"","sources":["../src/session-migration.ts"],"names":[],"mappings":"AAGA,+DAA+D;AAC/D,eAAO,MAAM,wBAAwB,EAAG,CAAU,CAAA;AAOlD;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,wBAAwB,CAAA;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;IACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B;AAED,qFAAqF;AACrF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,wBAAwB,CAAA;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACxD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,mFAAmF;IACnF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAE5C,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAZ,IAAI,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAKlB;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAIhE;AAED,0FAA0F;AAC1F,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,CA6BhF;AAED,+EAA+E;AAC/E,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CA2EjC"}