@claudexor/cli 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +22 -0
  3. package/dist/args.d.ts +12 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +88 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/attachment-resolver.d.ts +11 -0
  8. package/dist/attachment-resolver.d.ts.map +1 -0
  9. package/dist/attachment-resolver.js +61 -0
  10. package/dist/attachment-resolver.js.map +1 -0
  11. package/dist/capabilities.d.ts +13 -0
  12. package/dist/capabilities.d.ts.map +1 -0
  13. package/dist/capabilities.js +90 -0
  14. package/dist/capabilities.js.map +1 -0
  15. package/dist/claudexord.d.ts +3 -0
  16. package/dist/claudexord.d.ts.map +1 -0
  17. package/dist/claudexord.js +564 -0
  18. package/dist/claudexord.js.map +1 -0
  19. package/dist/cli-io.d.ts +28 -0
  20. package/dist/cli-io.d.ts.map +1 -0
  21. package/dist/cli-io.js +37 -0
  22. package/dist/cli-io.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +1459 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/command-registry.d.ts +105 -0
  28. package/dist/command-registry.d.ts.map +1 -0
  29. package/dist/command-registry.js +516 -0
  30. package/dist/command-registry.js.map +1 -0
  31. package/dist/daemon-lifecycle.d.ts +18 -0
  32. package/dist/daemon-lifecycle.d.ts.map +1 -0
  33. package/dist/daemon-lifecycle.js +62 -0
  34. package/dist/daemon-lifecycle.js.map +1 -0
  35. package/dist/daemon-run.d.ts +86 -0
  36. package/dist/daemon-run.d.ts.map +1 -0
  37. package/dist/daemon-run.js +269 -0
  38. package/dist/daemon-run.js.map +1 -0
  39. package/dist/decision.d.ts +18 -0
  40. package/dist/decision.d.ts.map +1 -0
  41. package/dist/decision.js +46 -0
  42. package/dist/decision.js.map +1 -0
  43. package/dist/live.d.ts +26 -0
  44. package/dist/live.d.ts.map +1 -0
  45. package/dist/live.js +311 -0
  46. package/dist/live.js.map +1 -0
  47. package/dist/mcp-runner.d.ts +41 -0
  48. package/dist/mcp-runner.d.ts.map +1 -0
  49. package/dist/mcp-runner.js +306 -0
  50. package/dist/mcp-runner.js.map +1 -0
  51. package/dist/ops-commands.d.ts +11 -0
  52. package/dist/ops-commands.d.ts.map +1 -0
  53. package/dist/ops-commands.js +358 -0
  54. package/dist/ops-commands.js.map +1 -0
  55. package/dist/orchestrate-options.d.ts +9 -0
  56. package/dist/orchestrate-options.d.ts.map +1 -0
  57. package/dist/orchestrate-options.js +16 -0
  58. package/dist/orchestrate-options.js.map +1 -0
  59. package/dist/orphan-reaper.d.ts +9 -0
  60. package/dist/orphan-reaper.d.ts.map +1 -0
  61. package/dist/orphan-reaper.js +97 -0
  62. package/dist/orphan-reaper.js.map +1 -0
  63. package/dist/orphan-sweeper.d.ts +7 -0
  64. package/dist/orphan-sweeper.d.ts.map +1 -0
  65. package/dist/orphan-sweeper.js +289 -0
  66. package/dist/orphan-sweeper.js.map +1 -0
  67. package/dist/plugins.d.ts +44 -0
  68. package/dist/plugins.d.ts.map +1 -0
  69. package/dist/plugins.js +1383 -0
  70. package/dist/plugins.js.map +1 -0
  71. package/dist/primary-output.d.ts +14 -0
  72. package/dist/primary-output.d.ts.map +1 -0
  73. package/dist/primary-output.js +34 -0
  74. package/dist/primary-output.js.map +1 -0
  75. package/dist/registry.d.ts +26 -0
  76. package/dist/registry.d.ts.map +1 -0
  77. package/dist/registry.js +71 -0
  78. package/dist/registry.js.map +1 -0
  79. package/dist/release.d.ts +14 -0
  80. package/dist/release.d.ts.map +1 -0
  81. package/dist/release.js +49 -0
  82. package/dist/release.js.map +1 -0
  83. package/dist/repl.d.ts +26 -0
  84. package/dist/repl.d.ts.map +1 -0
  85. package/dist/repl.js +277 -0
  86. package/dist/repl.js.map +1 -0
  87. package/dist/review-command.d.ts +3 -0
  88. package/dist/review-command.d.ts.map +1 -0
  89. package/dist/review-command.js +83 -0
  90. package/dist/review-command.js.map +1 -0
  91. package/dist/reviewer-options.d.ts +18 -0
  92. package/dist/reviewer-options.d.ts.map +1 -0
  93. package/dist/reviewer-options.js +110 -0
  94. package/dist/reviewer-options.js.map +1 -0
  95. package/dist/run-options.d.ts +8 -0
  96. package/dist/run-options.d.ts.map +1 -0
  97. package/dist/run-options.js +50 -0
  98. package/dist/run-options.js.map +1 -0
  99. package/dist/run-secret-scan.d.ts +2 -0
  100. package/dist/run-secret-scan.d.ts.map +1 -0
  101. package/dist/run-secret-scan.js +5 -0
  102. package/dist/run-secret-scan.js.map +1 -0
  103. package/dist/settings-command.d.ts +3 -0
  104. package/dist/settings-command.d.ts.map +1 -0
  105. package/dist/settings-command.js +202 -0
  106. package/dist/settings-command.js.map +1 -0
  107. package/dist/settings-display.d.ts +3 -0
  108. package/dist/settings-display.d.ts.map +1 -0
  109. package/dist/settings-display.js +33 -0
  110. package/dist/settings-display.js.map +1 -0
  111. package/dist/settings-service.d.ts +15 -0
  112. package/dist/settings-service.d.ts.map +1 -0
  113. package/dist/settings-service.js +91 -0
  114. package/dist/settings-service.js.map +1 -0
  115. package/dist/setup-jobs.d.ts +28 -0
  116. package/dist/setup-jobs.d.ts.map +1 -0
  117. package/dist/setup-jobs.js +477 -0
  118. package/dist/setup-jobs.js.map +1 -0
  119. package/dist/spec.d.ts +84 -0
  120. package/dist/spec.d.ts.map +1 -0
  121. package/dist/spec.js +438 -0
  122. package/dist/spec.js.map +1 -0
  123. package/dist/trust-command.d.ts +3 -0
  124. package/dist/trust-command.d.ts.map +1 -0
  125. package/dist/trust-command.js +80 -0
  126. package/dist/trust-command.js.map +1 -0
  127. package/dist/trust-services.d.ts +7 -0
  128. package/dist/trust-services.d.ts.map +1 -0
  129. package/dist/trust-services.js +35 -0
  130. package/dist/trust-services.js.map +1 -0
  131. package/package.json +59 -0
package/dist/live.js ADDED
@@ -0,0 +1,311 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { createInterface } from "node:readline/promises";
4
+ import { daemonDir, readToken } from "@claudexor/daemon";
5
+ import { InteractionQuestion as InteractionQuestionSchema } from "@claudexor/schema";
6
+ const print = (s) => {
7
+ process.stdout.write(s + "\n");
8
+ };
9
+ /**
10
+ * One concise line per run event for live terminal progress. Returns null for
11
+ * noise (heartbeats, raw harness deltas we do not surface in a TTY).
12
+ */
13
+ export function formatRunEventLine(ev) {
14
+ const type = String(ev["type"] ?? "");
15
+ const p = (ev["payload"] ?? {});
16
+ const who = [p["attempt_id"], p["harness_id"]].filter(Boolean).join("/");
17
+ switch (type) {
18
+ case "run.created":
19
+ return `run created (${String(p["mode"] ?? "?")})`;
20
+ case "project.git.initialized":
21
+ return `initialized git repository at ${String(p["repo_root"] ?? "?")} (baseline commit)`;
22
+ case "harness.started":
23
+ return `[${who}] started (web=${String(p["external_context_policy"] ?? "auto")})`;
24
+ case "harness.event": {
25
+ const sub = String(p["type"] ?? "");
26
+ if (sub === "message" && typeof p["title"] === "string")
27
+ return `[${who}] ${truncate(String(p["title"]), 160)}`;
28
+ if (sub === "tool_call" && p["tool"] && typeof p["tool"] === "object") {
29
+ const tool = p["tool"];
30
+ return `[${who}] tool ${String(tool["name"] ?? "?")}${tool["target"] ? ` — ${truncate(String(tool["target"]), 100)}` : ""}`;
31
+ }
32
+ if (sub === "interaction_requested")
33
+ return `[${who}] waiting on your answer…`;
34
+ return null;
35
+ }
36
+ case "interaction.requested":
37
+ return `[${who}] QUESTION pending (interaction ${String(p["interaction_id"] ?? "?")})`;
38
+ case "interaction.answered":
39
+ return `[${who}] answer delivered`;
40
+ case "interaction.timeout":
41
+ return `[${who}] no answer in time — continuing with assumptions`;
42
+ case "harness.completed":
43
+ return `[${who}] completed: ${String(p["status"] ?? "?")}${p["error"] ? ` — ${truncate(String(p["error"]), 160)}` : ""}`;
44
+ case "gate.completed":
45
+ return `[${String(p["attempt_id"] ?? "?")}] gates ${p["passed"] ? "passed" : "failed"}`;
46
+ case "review.started":
47
+ return `review started (${String(p["reviewers"] ?? 0)} reviewer(s))`;
48
+ case "reviewer.completed":
49
+ return `reviewer completed (${String(p["harness_id"] ?? "?")})`;
50
+ case "synthesis.started":
51
+ return p["synthesize"] ? "synthesis started" : null;
52
+ case "arbitration.completed":
53
+ return `arbitration: winner=${String(p["winner"] ?? "none")} status=${String(p["status"] ?? "?")}`;
54
+ case "output.ready":
55
+ return `output ready: ${String(p["path"] ?? "?")}${p["state"] ? ` (${String(p["state"])})` : ""}`;
56
+ case "budget.observation":
57
+ return typeof p["usd"] === "number" ? `spend +$${p["usd"].toFixed(4)}` : null;
58
+ case "run.completed":
59
+ return `run completed: ${String(p["status"] ?? "success")}`;
60
+ case "run.failed":
61
+ return `run failed: ${truncate(String(p["error"] ?? p["status"] ?? "failed"), 200)}`;
62
+ case "run.blocked":
63
+ return `run blocked: ${truncate(String(p["error"] ?? "needs human decision"), 200)}`;
64
+ default:
65
+ return null;
66
+ }
67
+ }
68
+ function truncate(s, n) {
69
+ return s.length > n ? `${s.slice(0, n - 1)}…` : s;
70
+ }
71
+ /**
72
+ * Prompt the questions on the controlling TTY. Returns null on a non-TTY
73
+ * stdin or when the deadline passes (the engine then declines benignly).
74
+ */
75
+ export async function promptQuestionsOnTty(interactionId, questions, timeoutAt) {
76
+ if (!process.stdin.isTTY) {
77
+ print("(question received, but stdin is not a TTY — the run continues with assumptions)");
78
+ return null;
79
+ }
80
+ const deadlineMs = timeoutAt ? Date.parse(timeoutAt) - Date.now() : null;
81
+ if (deadlineMs !== null && (!Number.isFinite(deadlineMs) || deadlineMs <= 0)) {
82
+ // An already-expired deadline must decline immediately — prompting with
83
+ // no signal would hang the TTY forever on a question the engine already
84
+ // timed out (e.g. a historical event replayed by `follow`).
85
+ print("(question already timed out — the run continues with assumptions)");
86
+ return null;
87
+ }
88
+ const signal = deadlineMs !== null ? AbortSignal.timeout(deadlineMs) : undefined;
89
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
90
+ try {
91
+ const answers = [];
92
+ for (const q of questions) {
93
+ print("");
94
+ print(`? ${q.header ? `[${q.header}] ` : ""}${q.question}`);
95
+ q.options.forEach((o, idx) => print(` ${idx + 1}) ${o.label}${o.description ? ` — ${o.description}` : ""}`));
96
+ const hint = q.options.length > 0
97
+ ? q.multi_select
98
+ ? "numbers separated by commas, or free text"
99
+ : "a number, or free text"
100
+ : "free text";
101
+ const raw = (signal
102
+ ? await rl.question(` answer (${hint}): `, { signal })
103
+ : await rl.question(` answer (${hint}): `)).trim();
104
+ if (!raw)
105
+ continue;
106
+ const picks = raw
107
+ .split(",")
108
+ .map((part) => Number.parseInt(part.trim(), 10))
109
+ .filter((n) => Number.isInteger(n) && n >= 1 && n <= q.options.length);
110
+ if (picks.length > 0 && picks.length === raw.split(",").length) {
111
+ answers.push({
112
+ question_id: q.id,
113
+ selected_labels: picks.map((n) => q.options[n - 1]?.label ?? "").filter(Boolean),
114
+ free_text: null,
115
+ });
116
+ }
117
+ else {
118
+ answers.push({ question_id: q.id, selected_labels: [], free_text: raw });
119
+ }
120
+ }
121
+ return answers.length > 0 ? { interaction_id: interactionId, answers } : null;
122
+ }
123
+ catch {
124
+ print("(answer window closed — the run continues with assumptions)");
125
+ return null;
126
+ }
127
+ finally {
128
+ rl.close();
129
+ }
130
+ }
131
+ export function controlApiAddress() {
132
+ const info = JSON.parse(readFileSync(join(daemonDir(), "control-api.json"), "utf8"));
133
+ const token = readToken();
134
+ if (!info.host || !info.port || !token)
135
+ throw new Error("daemon control API is not available (run: claudexor daemon start)");
136
+ return { baseUrl: `http://${info.host}:${info.port}`, token };
137
+ }
138
+ /**
139
+ * `claudexor follow <run_id>`: live SSE tail of a daemon-backed run with full
140
+ * replay (persisted seq), bounded reconnects via Last-Event-ID, and
141
+ * interactive TTY answering of harness questions. Exit honesty: a
142
+ * stream that ends WITHOUT a terminal event is a LOSS (exit 1, "stream
143
+ * lost"), never a silent success — success requires an observed terminal or
144
+ * an `end` frame the server sent after one.
145
+ */
146
+ export async function followRun(runId, json) {
147
+ let addr;
148
+ try {
149
+ addr = controlApiAddress();
150
+ }
151
+ catch (err) {
152
+ process.stderr.write(`claudexor follow: ${err instanceof Error ? err.message : String(err)}\n`);
153
+ return 1;
154
+ }
155
+ let exitCode = 0;
156
+ let sawTerminal = false;
157
+ let lastSeq = 0;
158
+ const maxReconnects = 5;
159
+ const handleFrame = async (name, data) => {
160
+ if (name === "end")
161
+ return "end";
162
+ if (!data)
163
+ return "continue";
164
+ let ev;
165
+ try {
166
+ ev = JSON.parse(data);
167
+ }
168
+ catch {
169
+ return "continue";
170
+ }
171
+ if (typeof ev["seq"] === "number" && Number.isFinite(ev["seq"]))
172
+ lastSeq = ev["seq"];
173
+ if (json) {
174
+ print(JSON.stringify(ev));
175
+ }
176
+ else {
177
+ const line = formatRunEventLine(ev);
178
+ if (line)
179
+ print(line);
180
+ }
181
+ const type = String(ev["type"] ?? "");
182
+ if (type === "run.completed" || type === "run.failed" || type === "run.blocked")
183
+ sawTerminal = true;
184
+ if (type === "run.failed" || type === "run.blocked")
185
+ exitCode = 1;
186
+ if (type === "interaction.requested" && !json) {
187
+ await answerInteractionFromTty(addr, runId, ev);
188
+ }
189
+ return "continue";
190
+ };
191
+ for (let attempt = 0; attempt <= maxReconnects; attempt += 1) {
192
+ if (attempt > 0) {
193
+ await new Promise((r) => setTimeout(r, Math.min(500 * attempt, 3_000)));
194
+ if (!json)
195
+ process.stderr.write(`claudexor follow: reconnecting (${attempt}/${maxReconnects}, resume from seq ${lastSeq})...\n`);
196
+ }
197
+ let res;
198
+ try {
199
+ res = await fetch(`${addr.baseUrl}/runs/${encodeURIComponent(runId)}/events`, {
200
+ headers: {
201
+ Authorization: `Bearer ${addr.token}`,
202
+ Accept: "text/event-stream",
203
+ ...(lastSeq > 0 ? { "Last-Event-ID": String(lastSeq) } : {}),
204
+ },
205
+ });
206
+ }
207
+ catch {
208
+ continue; // transport refusal (daemon restarting) — retry with backoff
209
+ }
210
+ if (res.status === 404) {
211
+ process.stderr.write(`claudexor follow: no such run '${runId}'\n`);
212
+ return 1;
213
+ }
214
+ if (!res.ok || !res.body) {
215
+ continue;
216
+ }
217
+ const decoder = new TextDecoder();
218
+ let buffer = "";
219
+ let dataLines = [];
220
+ let eventName = "message";
221
+ try {
222
+ for await (const chunk of res.body) {
223
+ buffer += decoder.decode(chunk, { stream: true });
224
+ let nl;
225
+ while ((nl = buffer.indexOf("\n")) >= 0) {
226
+ const line = buffer.slice(0, nl).replace(/\r$/, "");
227
+ buffer = buffer.slice(nl + 1);
228
+ if (line === "") {
229
+ const outcome = await handleFrame(eventName, dataLines.join("\n"));
230
+ dataLines = [];
231
+ eventName = "message";
232
+ if (outcome === "end") {
233
+ if (sawTerminal)
234
+ return exitCode;
235
+ // Server-side end WITHOUT a terminal event (interrupted run,
236
+ // never-materialized job): the run did not finish cleanly.
237
+ process.stderr.write("claudexor follow: stream ended without a terminal event\n");
238
+ return 1;
239
+ }
240
+ continue;
241
+ }
242
+ if (line.startsWith(":"))
243
+ continue;
244
+ if (line.startsWith("event:"))
245
+ eventName = line.slice(6).trim();
246
+ else if (line.startsWith("data:"))
247
+ dataLines.push(line.slice(5).trimStart());
248
+ }
249
+ }
250
+ }
251
+ catch {
252
+ /* mid-stream transport drop — fall through to reconnect */
253
+ }
254
+ if (sawTerminal)
255
+ return exitCode;
256
+ }
257
+ process.stderr.write(`claudexor follow: stream lost after ${maxReconnects} reconnects (no terminal event observed)\n`);
258
+ return 1;
259
+ }
260
+ async function answerInteractionFromTty(addr, runId, ev) {
261
+ const p = (ev["payload"] ?? {});
262
+ const interactionId = typeof p["interaction_id"] === "string" ? p["interaction_id"] : null;
263
+ if (!interactionId)
264
+ return;
265
+ const questions = Array.isArray(p["questions"])
266
+ ? p["questions"]
267
+ .map((q) => InteractionQuestionSchema.safeParse(q))
268
+ .filter((r) => r.success)
269
+ .map((r) => r.data)
270
+ : [];
271
+ if (questions.length === 0)
272
+ return;
273
+ // Replay safety: the events stream replays from seq 1, so historical
274
+ // interaction.requested events arrive for questions long answered or timed
275
+ // out. Only prompt when the daemon still reports this interaction pending
276
+ // (the registry is populated before the event reaches any subscriber, so a
277
+ // LIVE question is always visible here). On a detail fetch failure, fall
278
+ // through — the expired-deadline guard in promptQuestionsOnTty still holds.
279
+ try {
280
+ const detailRes = await fetch(`${addr.baseUrl}/runs/${encodeURIComponent(runId)}`, {
281
+ headers: { Authorization: `Bearer ${addr.token}` },
282
+ });
283
+ if (detailRes.ok) {
284
+ const detail = (await detailRes.json());
285
+ const state = detail.summary?.state ?? "";
286
+ const active = state === "running" || state === "queued";
287
+ const stillPending = (detail.pendingInteractions ?? []).some((pi) => pi.interactionId === interactionId);
288
+ if (!active || !stillPending)
289
+ return;
290
+ }
291
+ }
292
+ catch {
293
+ /* fall through to the deadline guard */
294
+ }
295
+ const answers = await promptQuestionsOnTty(interactionId, questions, typeof p["timeout_at"] === "string" ? p["timeout_at"] : undefined);
296
+ if (!answers)
297
+ return;
298
+ const body = {
299
+ answers: answers.answers.map((a) => ({ questionId: a.question_id, selectedLabels: a.selected_labels, freeText: a.free_text })),
300
+ };
301
+ const res = await fetch(`${addr.baseUrl}/runs/${encodeURIComponent(runId)}/interactions/${encodeURIComponent(interactionId)}/answer`, {
302
+ method: "POST",
303
+ headers: { Authorization: `Bearer ${addr.token}`, "Content-Type": "application/json" },
304
+ body: JSON.stringify(body),
305
+ });
306
+ if (!res.ok) {
307
+ const detail = await res.text().catch(() => "");
308
+ print(`(answer not delivered: ${res.status}${detail ? ` ${truncate(detail, 120)}` : ""})`);
309
+ }
310
+ }
311
+ //# sourceMappingURL=live.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.js","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { ControlApiAddress } from "./live.js";
2
+ export interface SurfaceRunnerHooks {
3
+ onEvent?: (event: any) => void;
4
+ onInteraction?: (ctx: any) => Promise<any | null>;
5
+ signal?: AbortSignal;
6
+ }
7
+ /**
8
+ * The IN-PROCESS runner for read-only surface calls (ask/plan/audit and a
9
+ * suggest-autonomy orchestrate — nothing to apply or unblock, per the CLI
10
+ * doctrine in cli.ts). Also answers `__status` from the doctor-backed gateway.
11
+ */
12
+ export declare function orchestratorRunner(): (p: any, hooks?: SurfaceRunnerHooks) => Promise<unknown>;
13
+ /**
14
+ * The MCP surface runner: MUTATING verbs (mode=agent — agent/best-of/create)
15
+ * are DAEMON-TRACKED exactly like the CLI (`GET /runs` sees them, `claudexor
16
+ * decision` can unblock them, cancel works), read-only verbs stay in-process
17
+ * — the same doctrine split as cli.ts. Interactive questions on daemon runs
18
+ * bridge through pendingInteractions polling + the typed answer endpoint,
19
+ * driven by the caller's onInteraction hook (the MCP server maps that hook to
20
+ * host elicitation).
21
+ */
22
+ export declare function mcpSurfaceRunner(): (p: any, hooks?: SurfaceRunnerHooks) => Promise<unknown>;
23
+ /**
24
+ * Cancel bridge: once the run is BOUND (we know its id), an aborted host
25
+ * signal posts the typed cancel control exactly once. Runs on the poll tick
26
+ * so an abort that races run-binding still lands.
27
+ */
28
+ export declare function makeCancelBridge(addr: ControlApiAddress, signal: AbortSignal): (info: {
29
+ runId: string;
30
+ }) => void;
31
+ /**
32
+ * Poll-tick bridge: watch the run's pendingInteractions on the control API and
33
+ * forward each NEW interaction to the caller's hook exactly once; answers go
34
+ * back through the typed answer endpoint. A stale answer (engine already
35
+ * timed out and declined) is the endpoint's problem to refuse — the bridge
36
+ * never fakes delivery.
37
+ */
38
+ export declare function makeInteractionBridge(addr: ControlApiAddress, onInteraction: (ctx: any) => Promise<any | null>): (info: {
39
+ runId: string;
40
+ }) => Promise<void>;
41
+ //# sourceMappingURL=mcp-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-runner.d.ts","sourceRoot":"","sources":["../src/mcp-runner.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGnD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,KAGlB,GAAG,GAAG,EAAE,QAAQ,kBAAkB,sBA4EjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,KAEhB,GAAG,GAAG,EAAE,QAAQ,kBAAkB,sBAwDjD;AAmED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,GAAG,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,CAahH;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,iBAAiB,EACvB,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAC/C,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAkD5C"}