workplane 0.2.0 → 0.3.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/dist/cli.js CHANGED
@@ -1,4 +1,110 @@
1
1
  #!/usr/bin/env node
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __esm = (fn, res) => function __init() {
5
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
6
+ };
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+
12
+ // ../workplans/src/providers/anthropic.ts
13
+ var anthropic_exports = {};
14
+ __export(anthropic_exports, {
15
+ runAnthropicStep: () => runAnthropicStep
16
+ });
17
+ import Anthropic from "@anthropic-ai/sdk";
18
+ async function runAnthropicStep(opts) {
19
+ const client = new Anthropic({ apiKey: opts.apiKey ?? process.env.ANTHROPIC_API_KEY });
20
+ const message = await client.messages.create({
21
+ model: opts.model,
22
+ max_tokens: 4096,
23
+ messages: [{ role: "user", content: opts.prompt }]
24
+ });
25
+ const block = message.content[0];
26
+ return block.type === "text" ? block.text : "";
27
+ }
28
+ var init_anthropic = __esm({
29
+ "../workplans/src/providers/anthropic.ts"() {
30
+ "use strict";
31
+ }
32
+ });
33
+
34
+ // ../workplans/src/providers/openai.ts
35
+ var openai_exports = {};
36
+ __export(openai_exports, {
37
+ runOpenAIStep: () => runOpenAIStep
38
+ });
39
+ import OpenAI from "openai";
40
+ async function runOpenAIStep(opts) {
41
+ const client = new OpenAI({ apiKey: opts.apiKey ?? process.env.OPENAI_API_KEY });
42
+ const completion = await client.chat.completions.create({
43
+ model: opts.model,
44
+ messages: [{ role: "user", content: opts.prompt }]
45
+ });
46
+ return completion.choices[0]?.message.content ?? "";
47
+ }
48
+ var init_openai = __esm({
49
+ "../workplans/src/providers/openai.ts"() {
50
+ "use strict";
51
+ }
52
+ });
53
+
54
+ // ../workplans/src/providers/ollama.ts
55
+ var ollama_exports = {};
56
+ __export(ollama_exports, {
57
+ runOllamaStep: () => runOllamaStep
58
+ });
59
+ import { Ollama } from "ollama";
60
+ async function runOllamaStep(opts) {
61
+ const host = opts.host ?? process.env.OLLAMA_HOST ?? "http://localhost:11434";
62
+ const client = new Ollama({ host });
63
+ const response = await client.generate({ model: opts.model, prompt: opts.prompt });
64
+ return response.response;
65
+ }
66
+ var init_ollama = __esm({
67
+ "../workplans/src/providers/ollama.ts"() {
68
+ "use strict";
69
+ }
70
+ });
71
+
72
+ // ../workplans/src/providers/shell.ts
73
+ var shell_exports = {};
74
+ __export(shell_exports, {
75
+ runShellStep: () => runShellStep
76
+ });
77
+ import { exec } from "child_process";
78
+ import { promisify } from "util";
79
+ async function runShellStep(opts) {
80
+ const { stdout } = await execAsync(opts.command, {
81
+ cwd: opts.cwd,
82
+ maxBuffer: 10 * 1024 * 1024
83
+ });
84
+ return stdout;
85
+ }
86
+ var execAsync;
87
+ var init_shell = __esm({
88
+ "../workplans/src/providers/shell.ts"() {
89
+ "use strict";
90
+ execAsync = promisify(exec);
91
+ }
92
+ });
93
+
94
+ // ../workplans/src/providers/file.ts
95
+ var file_exports = {};
96
+ __export(file_exports, {
97
+ runFileStep: () => runFileStep
98
+ });
99
+ import { readFile } from "fs/promises";
100
+ async function runFileStep(opts) {
101
+ return readFile(opts.path, opts.encoding ?? "utf8");
102
+ }
103
+ var init_file = __esm({
104
+ "../workplans/src/providers/file.ts"() {
105
+ "use strict";
106
+ }
107
+ });
2
108
 
3
109
  // ../core/src/env.ts
4
110
  import { config as dotenvConfig } from "dotenv";
@@ -64,6 +170,292 @@ async function workplaneFetch(serverUrl2, path, options = {}) {
64
170
  return await response.json();
65
171
  }
66
172
 
173
+ // ../agent-skills/src/skills/code-review.ts
174
+ function codeReviewPlan(opts = {}) {
175
+ const { repoPath = ".", model = "claude-haiku-4-5-20251001", branch } = opts;
176
+ const diffCmd = branch ? `git diff ${branch}..HEAD` : "git diff HEAD~1";
177
+ return {
178
+ id: "code-review",
179
+ name: "Code Review",
180
+ steps: [
181
+ {
182
+ id: "diff",
183
+ name: "Git Diff",
184
+ adapter: "shell",
185
+ provider: "shell",
186
+ payload: { command: diffCmd, cwd: repoPath },
187
+ output: { dest: "next" }
188
+ },
189
+ {
190
+ id: "summarize",
191
+ name: "Summarize",
192
+ adapter: "ollama",
193
+ provider: "ollama",
194
+ model: "llama3",
195
+ payload: { prompt: "Summarize these code changes concisely:\n{{prevOutput}}" },
196
+ output: { dest: "next" }
197
+ },
198
+ {
199
+ id: "critique",
200
+ name: "Critique",
201
+ adapter: "anthropic",
202
+ provider: "anthropic",
203
+ model,
204
+ payload: { prompt: "Review this summary for correctness, security issues, and code quality:\n{{prevOutput}}" }
205
+ }
206
+ ]
207
+ };
208
+ }
209
+
210
+ // ../agent-skills/src/skills/summarize-file.ts
211
+ function summarizeFilePlan(opts) {
212
+ const { filePath, provider = "ollama", model = "llama3" } = opts;
213
+ return {
214
+ id: "summarize-file",
215
+ name: "Summarize File",
216
+ steps: [
217
+ {
218
+ id: "read",
219
+ name: "Read File",
220
+ adapter: "file",
221
+ provider: "file",
222
+ payload: { path: filePath },
223
+ output: { dest: "next" }
224
+ },
225
+ {
226
+ id: "summarize",
227
+ name: "Summarize",
228
+ adapter: provider,
229
+ provider,
230
+ model,
231
+ payload: { prompt: "Summarize the following file content concisely:\n{{prevOutput}}" }
232
+ }
233
+ ]
234
+ };
235
+ }
236
+
237
+ // ../agent-skills/src/skills/index.ts
238
+ var SkillRegistry = class {
239
+ skills = /* @__PURE__ */ new Map();
240
+ register(entry) {
241
+ this.skills.set(entry.name, entry);
242
+ }
243
+ get(name) {
244
+ return this.skills.get(name);
245
+ }
246
+ list() {
247
+ return Array.from(this.skills.values());
248
+ }
249
+ };
250
+ function createDefaultRegistry() {
251
+ const registry = new SkillRegistry();
252
+ registry.register({
253
+ name: "code-review",
254
+ description: "Git diff \u2192 local summarize (ollama) \u2192 frontier critique (anthropic)",
255
+ buildPlan: (opts) => codeReviewPlan({
256
+ repoPath: typeof opts.repo === "string" ? opts.repo : void 0,
257
+ model: typeof opts.model === "string" ? opts.model : void 0,
258
+ branch: typeof opts.branch === "string" ? opts.branch : void 0
259
+ })
260
+ });
261
+ registry.register({
262
+ name: "summarize-file",
263
+ description: "Read file \u2192 summarize with configurable provider (default: ollama)",
264
+ buildPlan: (opts) => {
265
+ const filePath = typeof opts.file === "string" ? opts.file : "";
266
+ if (!filePath) throw new Error("--file is required for summarize-file");
267
+ return summarizeFilePlan({
268
+ filePath,
269
+ provider: typeof opts.provider === "string" ? opts.provider : void 0,
270
+ model: typeof opts.model === "string" ? opts.model : void 0
271
+ });
272
+ }
273
+ });
274
+ return registry;
275
+ }
276
+ function listSkills(registry) {
277
+ for (const skill of registry.list()) {
278
+ process.stdout.write(` ${skill.name.padEnd(20)} ${skill.description}
279
+ `);
280
+ }
281
+ }
282
+
283
+ // ../workplans/src/template.ts
284
+ function applyTemplate(payload, prevOutput) {
285
+ return Object.fromEntries(
286
+ Object.entries(payload).map(([k, v]) => [
287
+ k,
288
+ typeof v === "string" ? v.replaceAll("{{prevOutput}}", prevOutput) : v
289
+ ])
290
+ );
291
+ }
292
+
293
+ // ../workplans/src/runner.ts
294
+ var INLINE_PROVIDERS = /* @__PURE__ */ new Set(["anthropic", "openai", "ollama", "shell", "file"]);
295
+ async function runInlineStep(step, prompt) {
296
+ const provider = step.provider;
297
+ if (provider === "anthropic") {
298
+ const { runAnthropicStep: runAnthropicStep2 } = await Promise.resolve().then(() => (init_anthropic(), anthropic_exports));
299
+ return runAnthropicStep2({ model: step.model ?? "claude-haiku-4-5-20251001", prompt });
300
+ }
301
+ if (provider === "openai") {
302
+ const { runOpenAIStep: runOpenAIStep2 } = await Promise.resolve().then(() => (init_openai(), openai_exports));
303
+ return runOpenAIStep2({ model: step.model ?? "gpt-4o-mini", prompt });
304
+ }
305
+ if (provider === "ollama") {
306
+ const { runOllamaStep: runOllamaStep2 } = await Promise.resolve().then(() => (init_ollama(), ollama_exports));
307
+ return runOllamaStep2({ model: step.model ?? "llama3", prompt });
308
+ }
309
+ if (provider === "shell") {
310
+ const { runShellStep: runShellStep2 } = await Promise.resolve().then(() => (init_shell(), shell_exports));
311
+ return runShellStep2({
312
+ command: String(step.payload.command ?? ""),
313
+ cwd: typeof step.payload.cwd === "string" ? step.payload.cwd : void 0
314
+ });
315
+ }
316
+ if (provider === "file") {
317
+ const { runFileStep: runFileStep2 } = await Promise.resolve().then(() => (init_file(), file_exports));
318
+ return runFileStep2({ path: String(step.payload.path ?? "") });
319
+ }
320
+ throw new Error(`unknown inline provider: ${provider}`);
321
+ }
322
+ var SequentialWorkplanRunner = class {
323
+ async run(plan, ctx) {
324
+ const results = [];
325
+ let prevOutput = "";
326
+ let planSucceeded = true;
327
+ for (const step of plan.steps) {
328
+ const payload = prevOutput ? applyTemplate(step.payload, prevOutput) : step.payload;
329
+ const prompt = typeof payload.prompt === "string" ? payload.prompt : "";
330
+ const start = Date.now();
331
+ let output = "";
332
+ let exitCode = 0;
333
+ try {
334
+ if (step.provider && INLINE_PROVIDERS.has(step.provider)) {
335
+ output = await runInlineStep({ ...step, payload }, prompt);
336
+ } else {
337
+ const node = await ctx.resolveNode(step.requires ?? [], step.provider);
338
+ const result = await node.execute({ ...step, payload });
339
+ output = result.output;
340
+ exitCode = result.exitCode;
341
+ }
342
+ } catch (err) {
343
+ exitCode = 1;
344
+ output = err instanceof Error ? err.message : String(err);
345
+ planSucceeded = false;
346
+ const stepResult2 = {
347
+ stepId: step.id,
348
+ output,
349
+ exitCode,
350
+ durationMs: Date.now() - start
351
+ };
352
+ results.push(stepResult2);
353
+ ctx.emitResult(step.id, step.name, output);
354
+ if (!step.continueOnError) {
355
+ return {
356
+ planId: plan.id,
357
+ status: "step_failed",
358
+ steps: results,
359
+ succeeded: false
360
+ };
361
+ }
362
+ prevOutput = "";
363
+ continue;
364
+ }
365
+ const dest = step.output?.dest ?? "stdout";
366
+ const stepResult = {
367
+ stepId: step.id,
368
+ output,
369
+ exitCode,
370
+ durationMs: Date.now() - start
371
+ };
372
+ results.push(stepResult);
373
+ if (dest === "stdout" || dest === "artifact") {
374
+ ctx.emitResult(step.id, step.name, output);
375
+ prevOutput = "";
376
+ } else if (dest === "next") {
377
+ prevOutput = output;
378
+ }
379
+ }
380
+ return {
381
+ planId: plan.id,
382
+ status: planSucceeded ? "completed" : "failed",
383
+ steps: results,
384
+ succeeded: planSucceeded
385
+ };
386
+ }
387
+ };
388
+
389
+ // ../workplans/src/sinks/stdout.ts
390
+ function printStepResult(stepName, output) {
391
+ process.stdout.write(`=== step: ${stepName} ===
392
+ ${output}
393
+
394
+ `);
395
+ }
396
+
397
+ // ../workplans/src/context.ts
398
+ var WorkplaneNodeHandle = class {
399
+ constructor(serverUrl2, nodeToken) {
400
+ this.serverUrl = serverUrl2;
401
+ this.nodeToken = nodeToken;
402
+ }
403
+ serverUrl;
404
+ nodeToken;
405
+ async execute(step) {
406
+ const start = Date.now();
407
+ const taskRes = await fetch(`${this.serverUrl}/tasks`, {
408
+ method: "POST",
409
+ headers: {
410
+ "content-type": "application/json",
411
+ authorization: `Bearer ${this.nodeToken}`
412
+ },
413
+ body: JSON.stringify({
414
+ kind: "workplan.step",
415
+ adapter: step.adapter,
416
+ payload: step.payload,
417
+ requires: step.requires ?? []
418
+ })
419
+ });
420
+ if (!taskRes.ok) {
421
+ throw new Error(`failed to submit step ${step.id}: ${taskRes.status}`);
422
+ }
423
+ const task = await taskRes.json();
424
+ const output = await this.pollUntilDone(task.id);
425
+ return { stepId: step.id, output, exitCode: 0, durationMs: Date.now() - start };
426
+ }
427
+ async pollUntilDone(taskId) {
428
+ const terminalStatuses = /* @__PURE__ */ new Set(["succeeded", "failed", "cancelled"]);
429
+ for (; ; ) {
430
+ await new Promise((r) => setTimeout(r, 1e3));
431
+ const res = await fetch(`${this.serverUrl}/tasks/${taskId}`, {
432
+ headers: { authorization: `Bearer ${this.nodeToken}` }
433
+ });
434
+ const task = await res.json();
435
+ if (terminalStatuses.has(task.status)) {
436
+ if (task.status !== "succeeded") {
437
+ throw new Error(`step task ${taskId} ended with status: ${task.status}`);
438
+ }
439
+ return typeof task.payload?.output === "string" ? task.payload.output : "";
440
+ }
441
+ }
442
+ }
443
+ };
444
+ var LocalWorkplanContext = class {
445
+ serverUrl;
446
+ nodeToken;
447
+ constructor(opts = {}) {
448
+ this.serverUrl = opts.serverUrl ?? process.env.WORKPLANE_SERVER_URL ?? "http://localhost:8787";
449
+ this.nodeToken = opts.nodeToken ?? process.env.WORKPLANE_NODE_TOKEN ?? "";
450
+ }
451
+ async resolveNode(_requires, _provider) {
452
+ return new WorkplaneNodeHandle(this.serverUrl, this.nodeToken);
453
+ }
454
+ emitResult(_stepId, stepName, output) {
455
+ printStepResult(stepName, output);
456
+ }
457
+ };
458
+
67
459
  // ../cli/src/index.ts
68
460
  loadLocalEnv();
69
461
  var serverUrl = process.env.WORKPLANE_SERVER_URL ?? "http://localhost:8787";
@@ -120,7 +512,9 @@ function usage() {
120
512
  " run input <runId> --signal <SIGTERM|SIGKILL|SIGINT>",
121
513
  " run input <runId> --resize <COLSxROWS>",
122
514
  " logs <runId|taskId>",
123
- " artifacts <runId>"
515
+ " artifacts <runId>",
516
+ " skill list",
517
+ " skill run <name> [--key value ...]"
124
518
  ].join("\n")
125
519
  );
126
520
  }
@@ -364,6 +758,41 @@ async function main() {
364
758
  printJson(artifacts);
365
759
  return;
366
760
  }
761
+ if (command === "skill" && subcommand === "list") {
762
+ const registry = createDefaultRegistry();
763
+ process.stdout.write("Available skills:\n");
764
+ listSkills(registry);
765
+ return;
766
+ }
767
+ if (command === "skill" && subcommand === "run") {
768
+ const skillName = rest[0];
769
+ if (!skillName) {
770
+ throw new Error("skill name is required");
771
+ }
772
+ const registry = createDefaultRegistry();
773
+ const skill = registry.get(skillName);
774
+ if (!skill) {
775
+ throw new Error(`unknown skill: ${skillName}. Run 'workplane skill list' to see available skills.`);
776
+ }
777
+ const optArgs = rest.slice(1);
778
+ const options = {};
779
+ for (let i = 0; i < optArgs.length - 1; i++) {
780
+ if (optArgs[i].startsWith("--")) {
781
+ options[optArgs[i].slice(2)] = optArgs[i + 1];
782
+ i++;
783
+ }
784
+ }
785
+ const plan = skill.buildPlan(options);
786
+ const runner = new SequentialWorkplanRunner();
787
+ const ctx = new LocalWorkplanContext();
788
+ const result = await runner.run(plan, ctx);
789
+ if (!result.succeeded) {
790
+ process.stderr.write(`skill '${skillName}' failed at step '${result.steps.at(-1)?.stepId ?? "unknown"}'
791
+ `);
792
+ process.exit(1);
793
+ }
794
+ return;
795
+ }
367
796
  usage();
368
797
  }
369
798
  main().catch((error) => {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../core/src/env.ts","../../core/src/config.ts","../../core/src/auth.ts","../../core/src/http-client.ts","../../cli/src/index.ts"],"sourcesContent":["import { config as dotenvConfig } from \"dotenv\";\n\nlet envLoaded = false;\n\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env\" });\n dotenvConfig({ path: \".env.local\", override: true });\n\n envLoaded = true;\n}\n\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().min(1),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","import { authHeaders } from \"./auth.js\";\n\nexport interface WorkplaneHttpOptions {\n method?: string;\n body?: unknown;\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function buildWorkplaneHeaders(options: WorkplaneHttpOptions = {}): Record<string, string> {\n const token = options.nodeToken ?? options.operatorToken;\n return {\n \"content-type\": \"application/json\",\n ...authHeaders(token),\n };\n}\n\nexport async function workplaneFetch<T>(\n serverUrl: string,\n path: string,\n options: WorkplaneHttpOptions = {},\n): Promise<T> {\n const response = await fetch(`${serverUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: buildWorkplaneHeaders(options),\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${response.status} ${response.statusText} from ${path}: ${text}`);\n }\n\n return (await response.json()) as T;\n}\n","import { loadLocalEnv } from \"../../core/src/env.js\";\nimport { parseCsv } from \"../../core/src/config.js\";\nimport { workplaneFetch } from \"../../core/src/http-client.js\";\n\nloadLocalEnv();\n\nconst serverUrl = process.env.WORKPLANE_SERVER_URL ?? \"http://localhost:8787\";\nconst operatorToken = process.env.WORKPLANE_OPERATOR_TOKEN;\n\nasync function httpJson<T>(\n path: string,\n options?: { method?: string; body?: Record<string, unknown>; operator?: boolean },\n): Promise<T> {\n return workplaneFetch<T>(serverUrl, path, {\n method: options?.method,\n body: options?.body,\n operatorToken: options?.operator ? operatorToken : undefined,\n });\n}\n\ninterface RunListResponse {\n runs: Array<{ id: string }>;\n}\n\nfunction valueArg(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) {\n return undefined;\n }\n return args[index + 1];\n}\n\nfunction printJson(payload: unknown): void {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n}\n\nasync function resolveRunIdFromTaskId(taskId: string): Promise<string> {\n const runs = await httpJson<RunListResponse>(`/runs?taskId=${encodeURIComponent(taskId)}`);\n const runId = runs.runs[0]?.id;\n if (!runId) {\n throw new Error(`no runs found for task ${taskId}`);\n }\n return runId;\n}\n\nasync function showLogsById(id: string): Promise<void> {\n const runId = id.startsWith(\"task_\") ? await resolveRunIdFromTaskId(id) : id;\n const logs = await httpJson(`/runs/${runId}/logs`);\n printJson(logs);\n}\n\nfunction usage(): void {\n process.stdout.write(\n [\n \"workplane CLI\",\n \"\",\n \"Env: WORKPLANE_SERVER_URL, WORKPLANE_OPERATOR_TOKEN (for task submit/retry/cancel)\",\n \"\",\n \"Commands:\",\n \" server start / node start # use pnpm dev:server / dev:node\",\n \" task submit shell --command <cmd> [--repo <url>] [--branch <b>] [--cwd <path>]\",\n \" task submit aider --prompt <text> --repo <url> [--model <m>] [--test-command <cmd>]\",\n \" task submit inference --model <m> --prompt <text> [--requires ollama]\",\n \" task submit harness --harness <codex|claude-code> --repo <url> --prompt <text> [--interactive]\",\n \" tasks [--status <status>]\",\n \" task show|logs|retry|cancel <taskId>\",\n \" runs [--task-id <id>] [--status <status>]\",\n \" run show <runId>\",\n \" run input <runId> --stdin <text>\",\n \" run input <runId> --signal <SIGTERM|SIGKILL|SIGINT>\",\n \" run input <runId> --resize <COLSxROWS>\",\n \" logs <runId|taskId>\",\n \" artifacts <runId>\",\n ].join(\"\\n\"),\n );\n}\n\nasync function submitShell(args: string[]): Promise<void> {\n const command = valueArg(args, \"--command\");\n if (!command) {\n throw new Error(\"--command is required\");\n }\n\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"shell\");\n const repo = valueArg(args, \"--repo\");\n const branch = valueArg(args, \"--branch\");\n const cwd = valueArg(args, \"--cwd\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"shell.exec\",\n adapter: \"shell\",\n requires,\n payload: { command, repo, branch, cwd },\n },\n });\n\n printJson(task);\n}\n\nasync function submitAider(args: string[]): Promise<void> {\n const prompt = valueArg(args, \"--prompt\");\n if (!prompt) {\n throw new Error(\"--prompt is required\");\n }\n\n const model = valueArg(args, \"--model\");\n const repo = valueArg(args, \"--repo\");\n if (!repo) {\n throw new Error(\"--repo is required\");\n }\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"git,aider\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: \"aider\",\n requires,\n payload: { prompt, model, repo, branch, testCommand },\n },\n });\n\n printJson(task);\n}\n\nasync function submitInference(args: string[]): Promise<void> {\n const model = valueArg(args, \"--model\");\n const prompt = valueArg(args, \"--prompt\");\n if (!model || !prompt) {\n throw new Error(\"--model and --prompt are required\");\n }\n\n const adapter = valueArg(args, \"--adapter\") ?? \"ollama\";\n const requires = parseCsv(valueArg(args, \"--requires\") ?? adapter);\n const inputFile = valueArg(args, \"--input-file\");\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"inference.batch\",\n adapter,\n requires,\n payload: { model, prompt, inputFile },\n },\n });\n\n printJson(task);\n}\n\nasync function submitHarness(args: string[]): Promise<void> {\n const harness = valueArg(args, \"--harness\");\n const prompt = valueArg(args, \"--prompt\");\n const repo = valueArg(args, \"--repo\");\n if (!harness || !prompt || !repo) {\n throw new Error(\"--harness, --prompt, and --repo are required\");\n }\n\n if (harness !== \"codex\" && harness !== \"claude-code\") {\n throw new Error(\"--harness must be codex or claude-code\");\n }\n\n const model = valueArg(args, \"--model\");\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const interactive = args.includes(\"--interactive\") || undefined;\n const requires = parseCsv(valueArg(args, \"--requires\") ?? `${harness},git`);\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: harness,\n requires,\n payload: { prompt, repo, model, branch, testCommand, interactive },\n },\n });\n\n printJson(task);\n}\n\nasync function main(): Promise<void> {\n const [command, subcommand, ...rest] = process.argv.slice(2);\n\n if (!command) {\n usage();\n return;\n }\n\n if (command === \"server\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:server\\n\");\n return;\n }\n\n if (command === \"node\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:node\\n\");\n return;\n }\n\n if (command === \"task\" && subcommand === \"submit\") {\n const adapter = rest[0];\n const adapterArgs = rest.slice(1);\n if (adapter === \"shell\") {\n await submitShell(adapterArgs);\n return;\n }\n if (adapter === \"aider\") {\n await submitAider(adapterArgs);\n return;\n }\n if (adapter === \"inference\") {\n await submitInference(adapterArgs);\n return;\n }\n if (adapter === \"harness\") {\n await submitHarness(adapterArgs);\n return;\n }\n throw new Error(`unsupported adapter submit: ${adapter}`);\n }\n\n if (command === \"tasks\") {\n const status = valueArg([subcommand, ...rest].filter(Boolean) as string[], \"--status\");\n const tasks = await httpJson(status ? `/tasks?status=${encodeURIComponent(status)}` : \"/tasks\");\n printJson(tasks);\n return;\n }\n\n if (command === \"task\" && subcommand === \"show\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}`);\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"retry\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/retry`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"logs\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n await showLogsById(taskId);\n return;\n }\n\n if (command === \"task\" && subcommand === \"cancel\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/cancel`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"runs\") {\n const taskId = valueArg(rest, \"--task-id\");\n const status = valueArg(rest, \"--status\");\n const query = new URLSearchParams();\n if (taskId) {\n query.set(\"taskId\", taskId);\n }\n if (status) {\n query.set(\"status\", status);\n }\n const runs = await httpJson(query.size > 0 ? `/runs?${query.toString()}` : \"/runs\");\n printJson(runs);\n return;\n }\n\n if (command === \"run\" && subcommand === \"input\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const inputArgs = rest.slice(1);\n const stdinData = valueArg(inputArgs, \"--stdin\");\n const signal = valueArg(inputArgs, \"--signal\");\n const resize = valueArg(inputArgs, \"--resize\");\n\n let body: Record<string, unknown>;\n if (stdinData !== undefined) {\n body = { kind: \"stdin\", payload: { data: stdinData } };\n } else if (signal !== undefined) {\n if (signal !== \"SIGTERM\" && signal !== \"SIGKILL\" && signal !== \"SIGINT\") {\n throw new Error(\"--signal must be SIGTERM, SIGKILL, or SIGINT\");\n }\n body = { kind: \"signal\", payload: { signal } };\n } else if (resize !== undefined) {\n const match = /^(\\d+)x(\\d+)$/.exec(resize);\n if (!match) {\n throw new Error(\"--resize must be in COLSxROWS format, e.g. 220x50\");\n }\n body = { kind: \"resize\", payload: { cols: Number(match[1]), rows: Number(match[2]) } };\n } else {\n throw new Error(\"one of --stdin, --signal, or --resize is required\");\n }\n\n const result = await httpJson(`/runs/${runId}/input`, { method: \"POST\", operator: true, body });\n printJson(result);\n return;\n }\n\n if (command === \"run\" && subcommand === \"show\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const run = await httpJson(`/runs/${runId}`);\n printJson(run);\n return;\n }\n\n if (command === \"logs\") {\n const id = subcommand;\n if (!id) {\n throw new Error(\"run id or task id is required\");\n }\n await showLogsById(id);\n return;\n }\n\n if (command === \"artifacts\") {\n const runId = subcommand;\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const artifacts = await httpJson(`/runs/${runId}/artifacts`);\n printJson(artifacts);\n return;\n }\n\n usage();\n}\n\nmain().catch((error) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n"],"mappings":"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","names":["serverUrl"]}
1
+ {"version":3,"sources":["../../workplans/src/providers/anthropic.ts","../../workplans/src/providers/openai.ts","../../workplans/src/providers/ollama.ts","../../workplans/src/providers/shell.ts","../../workplans/src/providers/file.ts","../../core/src/env.ts","../../core/src/config.ts","../../core/src/auth.ts","../../core/src/http-client.ts","../../agent-skills/src/skills/code-review.ts","../../agent-skills/src/skills/summarize-file.ts","../../agent-skills/src/skills/index.ts","../../workplans/src/template.ts","../../workplans/src/runner.ts","../../workplans/src/sinks/stdout.ts","../../workplans/src/context.ts","../../cli/src/index.ts"],"sourcesContent":["import Anthropic from \"@anthropic-ai/sdk\";\n\nexport interface AnthropicStepOptions {\n model: string;\n prompt: string;\n apiKey?: string;\n}\n\nexport async function runAnthropicStep(opts: AnthropicStepOptions): Promise<string> {\n const client = new Anthropic({ apiKey: opts.apiKey ?? process.env.ANTHROPIC_API_KEY });\n const message = await client.messages.create({\n model: opts.model,\n max_tokens: 4096,\n messages: [{ role: \"user\", content: opts.prompt }],\n });\n const block = message.content[0];\n return block.type === \"text\" ? block.text : \"\";\n}\n","import OpenAI from \"openai\";\n\nexport interface OpenAIStepOptions {\n model: string;\n prompt: string;\n apiKey?: string;\n}\n\nexport async function runOpenAIStep(opts: OpenAIStepOptions): Promise<string> {\n const client = new OpenAI({ apiKey: opts.apiKey ?? process.env.OPENAI_API_KEY });\n const completion = await client.chat.completions.create({\n model: opts.model,\n messages: [{ role: \"user\", content: opts.prompt }],\n });\n return completion.choices[0]?.message.content ?? \"\";\n}\n","import { Ollama } from \"ollama\";\n\nexport interface OllamaStepOptions {\n model: string;\n prompt: string;\n host?: string;\n}\n\nexport async function runOllamaStep(opts: OllamaStepOptions): Promise<string> {\n const host = opts.host ?? process.env.OLLAMA_HOST ?? \"http://localhost:11434\";\n const client = new Ollama({ host });\n const response = await client.generate({ model: opts.model, prompt: opts.prompt });\n return response.response;\n}\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execAsync = promisify(exec);\n\nexport interface ShellStepOptions {\n command: string;\n cwd?: string;\n}\n\nexport async function runShellStep(opts: ShellStepOptions): Promise<string> {\n const { stdout } = await execAsync(opts.command, {\n cwd: opts.cwd,\n maxBuffer: 10 * 1024 * 1024,\n });\n return stdout;\n}\n","import { readFile } from \"node:fs/promises\";\n\nexport interface FileStepOptions {\n path: string;\n encoding?: BufferEncoding;\n}\n\nexport async function runFileStep(opts: FileStepOptions): Promise<string> {\n return readFile(opts.path, opts.encoding ?? \"utf8\");\n}\n","import { config as dotenvConfig } from \"dotenv\";\n\nlet envLoaded = false;\n\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n\n dotenvConfig({ path: \".env\" });\n dotenvConfig({ path: \".env.local\", override: true });\n\n envLoaded = true;\n}\n\n","import { z } from \"zod\";\nimport { loadLocalEnv } from \"./env.js\";\n\nloadLocalEnv();\n\nconst serverEnvSchema = z.object({\n DATABASE_URL: z.string().min(1),\n WORKPLANE_SERVER_PORT: z\n .string()\n .optional()\n .default(\"8787\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_OPERATOR_TOKEN: z.string().optional(),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nconst nodeEnvSchema = z.object({\n WORKPLANE_SERVER_URL: z.string().url().optional().default(\"http://localhost:8787\"),\n WORKPLANE_NODE_NAME: z.string().optional().default(\"local-node-1\"),\n WORKPLANE_NODE_ID: z.string().optional(),\n WORKPLANE_NODE_CAPABILITIES: z\n .string()\n .optional()\n .default(\"shell,git,node,typescript,aider,ollama,codex,claude-code\"),\n WORKPLANE_NODE_TOKEN: z.string().optional(),\n WORKPLANE_POLL_INTERVAL_MS: z\n .string()\n .optional()\n .default(\"3000\")\n .transform((value) => Number.parseInt(value, 10)),\n WORKPLANE_ENV_ALLOWLIST: z.string().optional(),\n});\n\nexport interface ServerConfig {\n databaseUrl: string;\n port: number;\n nodeToken?: string;\n operatorToken?: string;\n envAllowlist: string[];\n}\n\nexport interface NodeConfig {\n serverUrl: string;\n nodeName: string;\n nodeId?: string;\n nodeCapabilities: string[];\n nodeToken?: string;\n pollIntervalMs: number;\n envAllowlist: string[];\n}\n\nexport function loadServerConfig(env: NodeJS.ProcessEnv = process.env): ServerConfig {\n const parsed = serverEnvSchema.parse(env);\n\n return {\n databaseUrl: parsed.DATABASE_URL,\n port: parsed.WORKPLANE_SERVER_PORT,\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n operatorToken: parsed.WORKPLANE_OPERATOR_TOKEN,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function loadNodeConfig(env: NodeJS.ProcessEnv = process.env): NodeConfig {\n const parsed = nodeEnvSchema.parse(env);\n\n return {\n serverUrl: parsed.WORKPLANE_SERVER_URL,\n nodeName: parsed.WORKPLANE_NODE_NAME,\n nodeId: parsed.WORKPLANE_NODE_ID,\n nodeCapabilities: parseCsv(parsed.WORKPLANE_NODE_CAPABILITIES),\n nodeToken: parsed.WORKPLANE_NODE_TOKEN,\n pollIntervalMs: parsed.WORKPLANE_POLL_INTERVAL_MS,\n envAllowlist: parseCsv(parsed.WORKPLANE_ENV_ALLOWLIST ?? \"\"),\n };\n}\n\nexport function parseCsv(value: string): string[] {\n return value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n}\n","import type { IncomingMessage } from \"node:http\";\n\nexport function parseBearerToken(authorizationHeader: string | undefined): string | undefined {\n if (!authorizationHeader) {\n return undefined;\n }\n const match = /^Bearer\\s+(.+)$/i.exec(authorizationHeader.trim());\n return match?.[1];\n}\n\nexport function isAuthorizedBearer(provided: string | undefined, expected: string | undefined): boolean {\n if (!expected) {\n return true;\n }\n if (!provided) {\n return false;\n }\n return provided === expected;\n}\n\nexport function getRequestBearer(req: IncomingMessage): string | undefined {\n const header = req.headers.authorization;\n const value = Array.isArray(header) ? header[0] : header;\n return parseBearerToken(value);\n}\n\nexport function authHeaders(token: string | undefined): Record<string, string> {\n if (!token) {\n return {};\n }\n return { authorization: `Bearer ${token}` };\n}\n","import { authHeaders } from \"./auth.js\";\n\nexport interface WorkplaneHttpOptions {\n method?: string;\n body?: unknown;\n nodeToken?: string;\n operatorToken?: string;\n}\n\nexport function buildWorkplaneHeaders(options: WorkplaneHttpOptions = {}): Record<string, string> {\n const token = options.nodeToken ?? options.operatorToken;\n return {\n \"content-type\": \"application/json\",\n ...authHeaders(token),\n };\n}\n\nexport async function workplaneFetch<T>(\n serverUrl: string,\n path: string,\n options: WorkplaneHttpOptions = {},\n): Promise<T> {\n const response = await fetch(`${serverUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: buildWorkplaneHeaders(options),\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${response.status} ${response.statusText} from ${path}: ${text}`);\n }\n\n return (await response.json()) as T;\n}\n","import type { Workplan } from \"@workplane/workplans\";\n\nexport interface CodeReviewOptions {\n repoPath?: string;\n model?: string;\n branch?: string;\n}\n\nexport function codeReviewPlan(opts: CodeReviewOptions = {}): Workplan {\n const { repoPath = \".\", model = \"claude-haiku-4-5-20251001\", branch } = opts;\n const diffCmd = branch ? `git diff ${branch}..HEAD` : \"git diff HEAD~1\";\n\n return {\n id: \"code-review\",\n name: \"Code Review\",\n steps: [\n {\n id: \"diff\",\n name: \"Git Diff\",\n adapter: \"shell\",\n provider: \"shell\",\n payload: { command: diffCmd, cwd: repoPath },\n output: { dest: \"next\" },\n },\n {\n id: \"summarize\",\n name: \"Summarize\",\n adapter: \"ollama\",\n provider: \"ollama\",\n model: \"llama3\",\n payload: { prompt: \"Summarize these code changes concisely:\\n{{prevOutput}}\" },\n output: { dest: \"next\" },\n },\n {\n id: \"critique\",\n name: \"Critique\",\n adapter: \"anthropic\",\n provider: \"anthropic\",\n model,\n payload: { prompt: \"Review this summary for correctness, security issues, and code quality:\\n{{prevOutput}}\" },\n },\n ],\n };\n}\n","import type { Workplan } from \"@workplane/workplans\";\n\nexport interface SummarizeFileOptions {\n filePath: string;\n provider?: string;\n model?: string;\n}\n\nexport function summarizeFilePlan(opts: SummarizeFileOptions): Workplan {\n const { filePath, provider = \"ollama\", model = \"llama3\" } = opts;\n\n return {\n id: \"summarize-file\",\n name: \"Summarize File\",\n steps: [\n {\n id: \"read\",\n name: \"Read File\",\n adapter: \"file\",\n provider: \"file\",\n payload: { path: filePath },\n output: { dest: \"next\" },\n },\n {\n id: \"summarize\",\n name: \"Summarize\",\n adapter: provider,\n provider,\n model,\n payload: { prompt: \"Summarize the following file content concisely:\\n{{prevOutput}}\" },\n },\n ],\n };\n}\n","import type { SkillEntry } from \"../types.js\";\nimport { codeReviewPlan } from \"./code-review.js\";\nimport { summarizeFilePlan } from \"./summarize-file.js\";\n\nexport class SkillRegistry {\n private readonly skills = new Map<string, SkillEntry>();\n\n register(entry: SkillEntry): void {\n this.skills.set(entry.name, entry);\n }\n\n get(name: string): SkillEntry | undefined {\n return this.skills.get(name);\n }\n\n list(): SkillEntry[] {\n return Array.from(this.skills.values());\n }\n}\n\nexport function createDefaultRegistry(): SkillRegistry {\n const registry = new SkillRegistry();\n\n registry.register({\n name: \"code-review\",\n description: \"Git diff → local summarize (ollama) → frontier critique (anthropic)\",\n buildPlan: (opts) =>\n codeReviewPlan({\n repoPath: typeof opts.repo === \"string\" ? opts.repo : undefined,\n model: typeof opts.model === \"string\" ? opts.model : undefined,\n branch: typeof opts.branch === \"string\" ? opts.branch : undefined,\n }),\n });\n\n registry.register({\n name: \"summarize-file\",\n description: \"Read file → summarize with configurable provider (default: ollama)\",\n buildPlan: (opts) => {\n const filePath = typeof opts.file === \"string\" ? opts.file : \"\";\n if (!filePath) throw new Error(\"--file is required for summarize-file\");\n return summarizeFilePlan({\n filePath,\n provider: typeof opts.provider === \"string\" ? opts.provider : undefined,\n model: typeof opts.model === \"string\" ? opts.model : undefined,\n });\n },\n });\n\n return registry;\n}\n\nexport function listSkills(registry: SkillRegistry): void {\n for (const skill of registry.list()) {\n process.stdout.write(` ${skill.name.padEnd(20)} ${skill.description}\\n`);\n }\n}\n","export function applyTemplate(payload: Record<string, unknown>, prevOutput: string): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(payload).map(([k, v]) => [\n k,\n typeof v === \"string\" ? v.replaceAll(\"{{prevOutput}}\", prevOutput) : v,\n ]),\n );\n}\n","import type { Workplan, WorkplanResult, WorkplanRunner, WorkplanRunContext, StepResult, WorkplanStep } from \"./types.js\";\nimport { applyTemplate } from \"./template.js\";\n\nconst INLINE_PROVIDERS = new Set([\"anthropic\", \"openai\", \"ollama\", \"shell\", \"file\"]);\n\nasync function runInlineStep(step: WorkplanStep, prompt: string): Promise<string> {\n const provider = step.provider!;\n if (provider === \"anthropic\") {\n const { runAnthropicStep } = await import(\"./providers/anthropic.js\");\n return runAnthropicStep({ model: step.model ?? \"claude-haiku-4-5-20251001\", prompt });\n }\n if (provider === \"openai\") {\n const { runOpenAIStep } = await import(\"./providers/openai.js\");\n return runOpenAIStep({ model: step.model ?? \"gpt-4o-mini\", prompt });\n }\n if (provider === \"ollama\") {\n const { runOllamaStep } = await import(\"./providers/ollama.js\");\n return runOllamaStep({ model: step.model ?? \"llama3\", prompt });\n }\n if (provider === \"shell\") {\n const { runShellStep } = await import(\"./providers/shell.js\");\n return runShellStep({\n command: String(step.payload.command ?? \"\"),\n cwd: typeof step.payload.cwd === \"string\" ? step.payload.cwd : undefined,\n });\n }\n if (provider === \"file\") {\n const { runFileStep } = await import(\"./providers/file.js\");\n return runFileStep({ path: String(step.payload.path ?? \"\") });\n }\n throw new Error(`unknown inline provider: ${provider}`);\n}\n\nexport class SequentialWorkplanRunner implements WorkplanRunner {\n async run(plan: Workplan, ctx: WorkplanRunContext): Promise<WorkplanResult> {\n const results: StepResult[] = [];\n let prevOutput = \"\";\n let planSucceeded = true;\n\n for (const step of plan.steps) {\n const payload = prevOutput ? applyTemplate(step.payload, prevOutput) : step.payload;\n const prompt = typeof payload.prompt === \"string\" ? payload.prompt : \"\";\n const start = Date.now();\n let output = \"\";\n let exitCode = 0;\n\n try {\n if (step.provider && INLINE_PROVIDERS.has(step.provider)) {\n output = await runInlineStep({ ...step, payload }, prompt);\n } else {\n const node = await ctx.resolveNode(step.requires ?? [], step.provider);\n const result = await node.execute({ ...step, payload });\n output = result.output;\n exitCode = result.exitCode;\n }\n } catch (err) {\n exitCode = 1;\n output = err instanceof Error ? err.message : String(err);\n planSucceeded = false;\n\n const stepResult: StepResult = {\n stepId: step.id,\n output,\n exitCode,\n durationMs: Date.now() - start,\n };\n results.push(stepResult);\n ctx.emitResult(step.id, step.name, output);\n\n if (!step.continueOnError) {\n return {\n planId: plan.id,\n status: \"step_failed\",\n steps: results,\n succeeded: false,\n };\n }\n prevOutput = \"\";\n continue;\n }\n\n const dest = step.output?.dest ?? \"stdout\";\n const stepResult: StepResult = {\n stepId: step.id,\n output,\n exitCode,\n durationMs: Date.now() - start,\n };\n results.push(stepResult);\n\n if (dest === \"stdout\" || dest === \"artifact\") {\n ctx.emitResult(step.id, step.name, output);\n prevOutput = \"\";\n } else if (dest === \"next\") {\n prevOutput = output;\n }\n }\n\n return {\n planId: plan.id,\n status: planSucceeded ? \"completed\" : \"failed\",\n steps: results,\n succeeded: planSucceeded,\n };\n }\n}\n","export function printStepResult(stepName: string, output: string): void {\n process.stdout.write(`=== step: ${stepName} ===\\n${output}\\n\\n`);\n}\n","import type { NodeHandle, WorkplanRunContext, WorkplanStep, StepResult } from \"./types.js\";\nimport { printStepResult } from \"./sinks/stdout.js\";\n\nexport interface LocalWorkplanContextOptions {\n serverUrl?: string;\n nodeToken?: string;\n}\n\nclass WorkplaneNodeHandle implements NodeHandle {\n constructor(\n private readonly serverUrl: string,\n private readonly nodeToken: string,\n ) {}\n\n async execute(step: WorkplanStep): Promise<StepResult> {\n const start = Date.now();\n const taskRes = await fetch(`${this.serverUrl}/tasks`, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.nodeToken}`,\n },\n body: JSON.stringify({\n kind: \"workplan.step\",\n adapter: step.adapter,\n payload: step.payload,\n requires: step.requires ?? [],\n }),\n });\n\n if (!taskRes.ok) {\n throw new Error(`failed to submit step ${step.id}: ${taskRes.status}`);\n }\n\n const task = (await taskRes.json()) as { id: string };\n const output = await this.pollUntilDone(task.id);\n return { stepId: step.id, output, exitCode: 0, durationMs: Date.now() - start };\n }\n\n private async pollUntilDone(taskId: string): Promise<string> {\n const terminalStatuses = new Set([\"succeeded\", \"failed\", \"cancelled\"]);\n for (;;) {\n await new Promise((r) => setTimeout(r, 1000));\n const res = await fetch(`${this.serverUrl}/tasks/${taskId}`, {\n headers: { authorization: `Bearer ${this.nodeToken}` },\n });\n const task = (await res.json()) as { status: string; payload?: Record<string, unknown> };\n if (terminalStatuses.has(task.status)) {\n if (task.status !== \"succeeded\") {\n throw new Error(`step task ${taskId} ended with status: ${task.status}`);\n }\n return typeof task.payload?.output === \"string\" ? task.payload.output : \"\";\n }\n }\n }\n}\n\nexport class LocalWorkplanContext implements WorkplanRunContext {\n private readonly serverUrl: string;\n private readonly nodeToken: string;\n\n constructor(opts: LocalWorkplanContextOptions = {}) {\n this.serverUrl = opts.serverUrl ?? process.env.WORKPLANE_SERVER_URL ?? \"http://localhost:8787\";\n this.nodeToken = opts.nodeToken ?? process.env.WORKPLANE_NODE_TOKEN ?? \"\";\n }\n\n async resolveNode(_requires: string[], _provider?: string): Promise<NodeHandle> {\n return new WorkplaneNodeHandle(this.serverUrl, this.nodeToken);\n }\n\n emitResult(_stepId: string, stepName: string, output: string): void {\n printStepResult(stepName, output);\n }\n}\n","import { loadLocalEnv } from \"../../core/src/env.js\";\nimport { parseCsv } from \"../../core/src/config.js\";\nimport { workplaneFetch } from \"../../core/src/http-client.js\";\nimport { createDefaultRegistry, listSkills } from \"../../agent-skills/src/skills/index.js\";\nimport { SequentialWorkplanRunner } from \"../../workplans/src/runner.js\";\nimport { LocalWorkplanContext } from \"../../workplans/src/context.js\";\n\nloadLocalEnv();\n\nconst serverUrl = process.env.WORKPLANE_SERVER_URL ?? \"http://localhost:8787\";\nconst operatorToken = process.env.WORKPLANE_OPERATOR_TOKEN;\n\nasync function httpJson<T>(\n path: string,\n options?: { method?: string; body?: Record<string, unknown>; operator?: boolean },\n): Promise<T> {\n return workplaneFetch<T>(serverUrl, path, {\n method: options?.method,\n body: options?.body,\n operatorToken: options?.operator ? operatorToken : undefined,\n });\n}\n\ninterface RunListResponse {\n runs: Array<{ id: string }>;\n}\n\nfunction valueArg(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1) {\n return undefined;\n }\n return args[index + 1];\n}\n\nfunction printJson(payload: unknown): void {\n process.stdout.write(`${JSON.stringify(payload, null, 2)}\\n`);\n}\n\nasync function resolveRunIdFromTaskId(taskId: string): Promise<string> {\n const runs = await httpJson<RunListResponse>(`/runs?taskId=${encodeURIComponent(taskId)}`);\n const runId = runs.runs[0]?.id;\n if (!runId) {\n throw new Error(`no runs found for task ${taskId}`);\n }\n return runId;\n}\n\nasync function showLogsById(id: string): Promise<void> {\n const runId = id.startsWith(\"task_\") ? await resolveRunIdFromTaskId(id) : id;\n const logs = await httpJson(`/runs/${runId}/logs`);\n printJson(logs);\n}\n\nfunction usage(): void {\n process.stdout.write(\n [\n \"workplane CLI\",\n \"\",\n \"Env: WORKPLANE_SERVER_URL, WORKPLANE_OPERATOR_TOKEN (for task submit/retry/cancel)\",\n \"\",\n \"Commands:\",\n \" server start / node start # use pnpm dev:server / dev:node\",\n \" task submit shell --command <cmd> [--repo <url>] [--branch <b>] [--cwd <path>]\",\n \" task submit aider --prompt <text> --repo <url> [--model <m>] [--test-command <cmd>]\",\n \" task submit inference --model <m> --prompt <text> [--requires ollama]\",\n \" task submit harness --harness <codex|claude-code> --repo <url> --prompt <text> [--interactive]\",\n \" tasks [--status <status>]\",\n \" task show|logs|retry|cancel <taskId>\",\n \" runs [--task-id <id>] [--status <status>]\",\n \" run show <runId>\",\n \" run input <runId> --stdin <text>\",\n \" run input <runId> --signal <SIGTERM|SIGKILL|SIGINT>\",\n \" run input <runId> --resize <COLSxROWS>\",\n \" logs <runId|taskId>\",\n \" artifacts <runId>\",\n \" skill list\",\n \" skill run <name> [--key value ...]\",\n ].join(\"\\n\"),\n );\n}\n\nasync function submitShell(args: string[]): Promise<void> {\n const command = valueArg(args, \"--command\");\n if (!command) {\n throw new Error(\"--command is required\");\n }\n\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"shell\");\n const repo = valueArg(args, \"--repo\");\n const branch = valueArg(args, \"--branch\");\n const cwd = valueArg(args, \"--cwd\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"shell.exec\",\n adapter: \"shell\",\n requires,\n payload: { command, repo, branch, cwd },\n },\n });\n\n printJson(task);\n}\n\nasync function submitAider(args: string[]): Promise<void> {\n const prompt = valueArg(args, \"--prompt\");\n if (!prompt) {\n throw new Error(\"--prompt is required\");\n }\n\n const model = valueArg(args, \"--model\");\n const repo = valueArg(args, \"--repo\");\n if (!repo) {\n throw new Error(\"--repo is required\");\n }\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const requires = parseCsv(valueArg(args, \"--requires\") ?? \"git,aider\");\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: \"aider\",\n requires,\n payload: { prompt, model, repo, branch, testCommand },\n },\n });\n\n printJson(task);\n}\n\nasync function submitInference(args: string[]): Promise<void> {\n const model = valueArg(args, \"--model\");\n const prompt = valueArg(args, \"--prompt\");\n if (!model || !prompt) {\n throw new Error(\"--model and --prompt are required\");\n }\n\n const adapter = valueArg(args, \"--adapter\") ?? \"ollama\";\n const requires = parseCsv(valueArg(args, \"--requires\") ?? adapter);\n const inputFile = valueArg(args, \"--input-file\");\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"inference.batch\",\n adapter,\n requires,\n payload: { model, prompt, inputFile },\n },\n });\n\n printJson(task);\n}\n\nasync function submitHarness(args: string[]): Promise<void> {\n const harness = valueArg(args, \"--harness\");\n const prompt = valueArg(args, \"--prompt\");\n const repo = valueArg(args, \"--repo\");\n if (!harness || !prompt || !repo) {\n throw new Error(\"--harness, --prompt, and --repo are required\");\n }\n\n if (harness !== \"codex\" && harness !== \"claude-code\") {\n throw new Error(\"--harness must be codex or claude-code\");\n }\n\n const model = valueArg(args, \"--model\");\n const branch = valueArg(args, \"--branch\");\n const testCommand = valueArg(args, \"--test-command\");\n const interactive = args.includes(\"--interactive\") || undefined;\n const requires = parseCsv(valueArg(args, \"--requires\") ?? `${harness},git`);\n\n const task = await httpJson(\"/tasks\", {\n method: \"POST\",\n operator: true,\n body: {\n kind: \"agent.run\",\n adapter: harness,\n requires,\n payload: { prompt, repo, model, branch, testCommand, interactive },\n },\n });\n\n printJson(task);\n}\n\nasync function main(): Promise<void> {\n const [command, subcommand, ...rest] = process.argv.slice(2);\n\n if (!command) {\n usage();\n return;\n }\n\n if (command === \"server\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:server\\n\");\n return;\n }\n\n if (command === \"node\" && subcommand === \"start\") {\n process.stdout.write(\"Use: pnpm dev:node\\n\");\n return;\n }\n\n if (command === \"task\" && subcommand === \"submit\") {\n const adapter = rest[0];\n const adapterArgs = rest.slice(1);\n if (adapter === \"shell\") {\n await submitShell(adapterArgs);\n return;\n }\n if (adapter === \"aider\") {\n await submitAider(adapterArgs);\n return;\n }\n if (adapter === \"inference\") {\n await submitInference(adapterArgs);\n return;\n }\n if (adapter === \"harness\") {\n await submitHarness(adapterArgs);\n return;\n }\n throw new Error(`unsupported adapter submit: ${adapter}`);\n }\n\n if (command === \"tasks\") {\n const status = valueArg([subcommand, ...rest].filter(Boolean) as string[], \"--status\");\n const tasks = await httpJson(status ? `/tasks?status=${encodeURIComponent(status)}` : \"/tasks\");\n printJson(tasks);\n return;\n }\n\n if (command === \"task\" && subcommand === \"show\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}`);\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"retry\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/retry`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"task\" && subcommand === \"logs\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n await showLogsById(taskId);\n return;\n }\n\n if (command === \"task\" && subcommand === \"cancel\") {\n const taskId = rest[0];\n if (!taskId) {\n throw new Error(\"task id is required\");\n }\n const task = await httpJson(`/tasks/${taskId}/cancel`, { method: \"POST\", operator: true });\n printJson(task);\n return;\n }\n\n if (command === \"runs\") {\n const taskId = valueArg(rest, \"--task-id\");\n const status = valueArg(rest, \"--status\");\n const query = new URLSearchParams();\n if (taskId) {\n query.set(\"taskId\", taskId);\n }\n if (status) {\n query.set(\"status\", status);\n }\n const runs = await httpJson(query.size > 0 ? `/runs?${query.toString()}` : \"/runs\");\n printJson(runs);\n return;\n }\n\n if (command === \"run\" && subcommand === \"input\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const inputArgs = rest.slice(1);\n const stdinData = valueArg(inputArgs, \"--stdin\");\n const signal = valueArg(inputArgs, \"--signal\");\n const resize = valueArg(inputArgs, \"--resize\");\n\n let body: Record<string, unknown>;\n if (stdinData !== undefined) {\n body = { kind: \"stdin\", payload: { data: stdinData } };\n } else if (signal !== undefined) {\n if (signal !== \"SIGTERM\" && signal !== \"SIGKILL\" && signal !== \"SIGINT\") {\n throw new Error(\"--signal must be SIGTERM, SIGKILL, or SIGINT\");\n }\n body = { kind: \"signal\", payload: { signal } };\n } else if (resize !== undefined) {\n const match = /^(\\d+)x(\\d+)$/.exec(resize);\n if (!match) {\n throw new Error(\"--resize must be in COLSxROWS format, e.g. 220x50\");\n }\n body = { kind: \"resize\", payload: { cols: Number(match[1]), rows: Number(match[2]) } };\n } else {\n throw new Error(\"one of --stdin, --signal, or --resize is required\");\n }\n\n const result = await httpJson(`/runs/${runId}/input`, { method: \"POST\", operator: true, body });\n printJson(result);\n return;\n }\n\n if (command === \"run\" && subcommand === \"show\") {\n const runId = rest[0];\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const run = await httpJson(`/runs/${runId}`);\n printJson(run);\n return;\n }\n\n if (command === \"logs\") {\n const id = subcommand;\n if (!id) {\n throw new Error(\"run id or task id is required\");\n }\n await showLogsById(id);\n return;\n }\n\n if (command === \"artifacts\") {\n const runId = subcommand;\n if (!runId) {\n throw new Error(\"run id is required\");\n }\n const artifacts = await httpJson(`/runs/${runId}/artifacts`);\n printJson(artifacts);\n return;\n }\n\n if (command === \"skill\" && subcommand === \"list\") {\n const registry = createDefaultRegistry();\n process.stdout.write(\"Available skills:\\n\");\n listSkills(registry);\n return;\n }\n\n if (command === \"skill\" && subcommand === \"run\") {\n const skillName = rest[0];\n if (!skillName) {\n throw new Error(\"skill name is required\");\n }\n const registry = createDefaultRegistry();\n const skill = registry.get(skillName);\n if (!skill) {\n throw new Error(`unknown skill: ${skillName}. Run 'workplane skill list' to see available skills.`);\n }\n\n const optArgs = rest.slice(1);\n const options: Record<string, unknown> = {};\n for (let i = 0; i < optArgs.length - 1; i++) {\n if (optArgs[i].startsWith(\"--\")) {\n options[optArgs[i].slice(2)] = optArgs[i + 1];\n i++;\n }\n }\n\n const plan = skill.buildPlan(options);\n const runner = new SequentialWorkplanRunner();\n const ctx = new LocalWorkplanContext();\n const result = await runner.run(plan, ctx);\n\n if (!result.succeeded) {\n process.stderr.write(`skill '${skillName}' failed at step '${result.steps.at(-1)?.stepId ?? \"unknown\"}'\\n`);\n process.exit(1);\n }\n return;\n }\n\n usage();\n}\n\nmain().catch((error) => {\n process.stderr.write(`${String(error)}\\n`);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,OAAO,eAAe;AAQtB,eAAsB,iBAAiB,MAA6C;AAClF,QAAM,SAAS,IAAI,UAAU,EAAE,QAAQ,KAAK,UAAU,QAAQ,IAAI,kBAAkB,CAAC;AACrF,QAAM,UAAU,MAAM,OAAO,SAAS,OAAO;AAAA,IAC3C,OAAO,KAAK;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,KAAK,OAAO,CAAC;AAAA,EACnD,CAAC;AACD,QAAM,QAAQ,QAAQ,QAAQ,CAAC;AAC/B,SAAO,MAAM,SAAS,SAAS,MAAM,OAAO;AAC9C;AAjBA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA,OAAO,YAAY;AAQnB,eAAsB,cAAc,MAA0C;AAC5E,QAAM,SAAS,IAAI,OAAO,EAAE,QAAQ,KAAK,UAAU,QAAQ,IAAI,eAAe,CAAC;AAC/E,QAAM,aAAa,MAAM,OAAO,KAAK,YAAY,OAAO;AAAA,IACtD,OAAO,KAAK;AAAA,IACZ,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,KAAK,OAAO,CAAC;AAAA,EACnD,CAAC;AACD,SAAO,WAAW,QAAQ,CAAC,GAAG,QAAQ,WAAW;AACnD;AAfA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA,SAAS,cAAc;AAQvB,eAAsB,cAAc,MAA0C;AAC5E,QAAM,OAAO,KAAK,QAAQ,QAAQ,IAAI,eAAe;AACrD,QAAM,SAAS,IAAI,OAAO,EAAE,KAAK,CAAC;AAClC,QAAM,WAAW,MAAM,OAAO,SAAS,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,CAAC;AACjF,SAAO,SAAS;AAClB;AAbA;AAAA;AAAA;AAAA;AAAA;;;ACAA;AAAA;AAAA;AAAA;AAAA,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAS1B,eAAsB,aAAa,MAAyC;AAC1E,QAAM,EAAE,OAAO,IAAI,MAAM,UAAU,KAAK,SAAS;AAAA,IAC/C,KAAK,KAAK;AAAA,IACV,WAAW,KAAK,OAAO;AAAA,EACzB,CAAC;AACD,SAAO;AACT;AAhBA,IAGM;AAHN;AAAA;AAAA;AAGA,IAAM,YAAY,UAAU,IAAI;AAAA;AAAA;;;ACHhC;AAAA;AAAA;AAAA;AAAA,SAAS,gBAAgB;AAOzB,eAAsB,YAAY,MAAwC;AACxE,SAAO,SAAS,KAAK,MAAM,KAAK,YAAY,MAAM;AACpD;AATA;AAAA;AAAA;AAAA;AAAA;;;ACAA,SAAS,UAAU,oBAAoB;AAEvC,IAAI,YAAY;AAET,SAAS,eAAqB;AACnC,MAAI,WAAW;AACb;AAAA,EACF;AAEA,eAAa,EAAE,MAAM,OAAO,CAAC;AAC7B,eAAa,EAAE,MAAM,cAAc,UAAU,KAAK,CAAC;AAEnD,cAAY;AACd;;;ACbA,SAAS,SAAS;AAGlB,aAAa;AAEb,IAAM,kBAAkB,EAAE,OAAO;AAAA,EAC/B,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC9B,uBAAuB,EACpB,OAAO,EACP,SAAS,EACT,QAAQ,MAAM,EACd,UAAU,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC;AAAA,EAClD,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,0BAA0B,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9C,yBAAyB,EAAE,OAAO,EAAE,SAAS;AAC/C,CAAC;AAED,IAAM,gBAAgB,EAAE,OAAO;AAAA,EAC7B,sBAAsB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,uBAAuB;AAAA,EACjF,qBAAqB,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,cAAc;AAAA,EACjE,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,6BAA6B,EAC1B,OAAO,EACP,SAAS,EACT,QAAQ,0DAA0D;AAAA,EACrE,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,4BAA4B,EACzB,OAAO,EACP,SAAS,EACT,QAAQ,MAAM,EACd,UAAU,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC;AAAA,EAClD,yBAAyB,EAAE,OAAO,EAAE,SAAS;AAC/C,CAAC;AA8CM,SAAS,SAAS,OAAyB;AAChD,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AACnB;;;ACzDO,SAAS,YAAY,OAAmD;AAC7E,MAAI,CAAC,OAAO;AACV,WAAO,CAAC;AAAA,EACV;AACA,SAAO,EAAE,eAAe,UAAU,KAAK,GAAG;AAC5C;;;ACtBO,SAAS,sBAAsB,UAAgC,CAAC,GAA2B;AAChG,QAAM,QAAQ,QAAQ,aAAa,QAAQ;AAC3C,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,GAAG,YAAY,KAAK;AAAA,EACtB;AACF;AAEA,eAAsB,eACpBA,YACA,MACA,UAAgC,CAAC,GACrB;AACZ,QAAM,WAAW,MAAM,MAAM,GAAGA,UAAS,GAAG,IAAI,IAAI;AAAA,IAClD,QAAQ,QAAQ,UAAU;AAAA,IAC1B,SAAS,sBAAsB,OAAO;AAAA,IACtC,MAAM,QAAQ,OAAO,KAAK,UAAU,QAAQ,IAAI,IAAI;AAAA,EACtD,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,IAAI,MAAM,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU,SAAS,IAAI,KAAK,IAAI,EAAE;AAAA,EACnF;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;;;AC1BO,SAAS,eAAe,OAA0B,CAAC,GAAa;AACrE,QAAM,EAAE,WAAW,KAAK,QAAQ,6BAA6B,OAAO,IAAI;AACxE,QAAM,UAAU,SAAS,YAAY,MAAM,WAAW;AAEtD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV,SAAS,EAAE,SAAS,SAAS,KAAK,SAAS;AAAA,QAC3C,QAAQ,EAAE,MAAM,OAAO;AAAA,MACzB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO;AAAA,QACP,SAAS,EAAE,QAAQ,0DAA0D;AAAA,QAC7E,QAAQ,EAAE,MAAM,OAAO;AAAA,MACzB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV;AAAA,QACA,SAAS,EAAE,QAAQ,0FAA0F;AAAA,MAC/G;AAAA,IACF;AAAA,EACF;AACF;;;ACnCO,SAAS,kBAAkB,MAAsC;AACtE,QAAM,EAAE,UAAU,WAAW,UAAU,QAAQ,SAAS,IAAI;AAE5D,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV,SAAS,EAAE,MAAM,SAAS;AAAA,QAC1B,QAAQ,EAAE,MAAM,OAAO;AAAA,MACzB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,SAAS,EAAE,QAAQ,kEAAkE;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AACF;;;AC7BO,IAAM,gBAAN,MAAoB;AAAA,EACR,SAAS,oBAAI,IAAwB;AAAA,EAEtD,SAAS,OAAyB;AAChC,SAAK,OAAO,IAAI,MAAM,MAAM,KAAK;AAAA,EACnC;AAAA,EAEA,IAAI,MAAsC;AACxC,WAAO,KAAK,OAAO,IAAI,IAAI;AAAA,EAC7B;AAAA,EAEA,OAAqB;AACnB,WAAO,MAAM,KAAK,KAAK,OAAO,OAAO,CAAC;AAAA,EACxC;AACF;AAEO,SAAS,wBAAuC;AACrD,QAAM,WAAW,IAAI,cAAc;AAEnC,WAAS,SAAS;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW,CAAC,SACV,eAAe;AAAA,MACb,UAAU,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,MACtD,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,MACrD,QAAQ,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAAA,IAC1D,CAAC;AAAA,EACL,CAAC;AAED,WAAS,SAAS;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,WAAW,CAAC,SAAS;AACnB,YAAM,WAAW,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAC7D,UAAI,CAAC,SAAU,OAAM,IAAI,MAAM,uCAAuC;AACtE,aAAO,kBAAkB;AAAA,QACvB;AAAA,QACA,UAAU,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AAAA,QAC9D,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAAA,MACvD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,SAAS,WAAW,UAA+B;AACxD,aAAW,SAAS,SAAS,KAAK,GAAG;AACnC,YAAQ,OAAO,MAAM,KAAK,MAAM,KAAK,OAAO,EAAE,CAAC,IAAI,MAAM,WAAW;AAAA,CAAI;AAAA,EAC1E;AACF;;;ACvDO,SAAS,cAAc,SAAkC,YAA6C;AAC3G,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM;AAAA,MACtC;AAAA,MACA,OAAO,MAAM,WAAW,EAAE,WAAW,kBAAkB,UAAU,IAAI;AAAA,IACvE,CAAC;AAAA,EACH;AACF;;;ACJA,IAAM,mBAAmB,oBAAI,IAAI,CAAC,aAAa,UAAU,UAAU,SAAS,MAAM,CAAC;AAEnF,eAAe,cAAc,MAAoB,QAAiC;AAChF,QAAM,WAAW,KAAK;AACtB,MAAI,aAAa,aAAa;AAC5B,UAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM;AACnC,WAAOA,kBAAiB,EAAE,OAAO,KAAK,SAAS,6BAA6B,OAAO,CAAC;AAAA,EACtF;AACA,MAAI,aAAa,UAAU;AACzB,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,WAAOA,eAAc,EAAE,OAAO,KAAK,SAAS,eAAe,OAAO,CAAC;AAAA,EACrE;AACA,MAAI,aAAa,UAAU;AACzB,UAAM,EAAE,eAAAC,eAAc,IAAI,MAAM;AAChC,WAAOA,eAAc,EAAE,OAAO,KAAK,SAAS,UAAU,OAAO,CAAC;AAAA,EAChE;AACA,MAAI,aAAa,SAAS;AACxB,UAAM,EAAE,cAAAC,cAAa,IAAI,MAAM;AAC/B,WAAOA,cAAa;AAAA,MAClB,SAAS,OAAO,KAAK,QAAQ,WAAW,EAAE;AAAA,MAC1C,KAAK,OAAO,KAAK,QAAQ,QAAQ,WAAW,KAAK,QAAQ,MAAM;AAAA,IACjE,CAAC;AAAA,EACH;AACA,MAAI,aAAa,QAAQ;AACvB,UAAM,EAAE,aAAAC,aAAY,IAAI,MAAM;AAC9B,WAAOA,aAAY,EAAE,MAAM,OAAO,KAAK,QAAQ,QAAQ,EAAE,EAAE,CAAC;AAAA,EAC9D;AACA,QAAM,IAAI,MAAM,4BAA4B,QAAQ,EAAE;AACxD;AAEO,IAAM,2BAAN,MAAyD;AAAA,EAC9D,MAAM,IAAI,MAAgB,KAAkD;AAC1E,UAAM,UAAwB,CAAC;AAC/B,QAAI,aAAa;AACjB,QAAI,gBAAgB;AAEpB,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,UAAU,aAAa,cAAc,KAAK,SAAS,UAAU,IAAI,KAAK;AAC5E,YAAM,SAAS,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;AACrE,YAAM,QAAQ,KAAK,IAAI;AACvB,UAAI,SAAS;AACb,UAAI,WAAW;AAEf,UAAI;AACF,YAAI,KAAK,YAAY,iBAAiB,IAAI,KAAK,QAAQ,GAAG;AACxD,mBAAS,MAAM,cAAc,EAAE,GAAG,MAAM,QAAQ,GAAG,MAAM;AAAA,QAC3D,OAAO;AACL,gBAAM,OAAO,MAAM,IAAI,YAAY,KAAK,YAAY,CAAC,GAAG,KAAK,QAAQ;AACrE,gBAAM,SAAS,MAAM,KAAK,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC;AACtD,mBAAS,OAAO;AAChB,qBAAW,OAAO;AAAA,QACpB;AAAA,MACF,SAAS,KAAK;AACZ,mBAAW;AACX,iBAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD,wBAAgB;AAEhB,cAAMC,cAAyB;AAAA,UAC7B,QAAQ,KAAK;AAAA,UACb;AAAA,UACA;AAAA,UACA,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B;AACA,gBAAQ,KAAKA,WAAU;AACvB,YAAI,WAAW,KAAK,IAAI,KAAK,MAAM,MAAM;AAEzC,YAAI,CAAC,KAAK,iBAAiB;AACzB,iBAAO;AAAA,YACL,QAAQ,KAAK;AAAA,YACb,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,WAAW;AAAA,UACb;AAAA,QACF;AACA,qBAAa;AACb;AAAA,MACF;AAEA,YAAM,OAAO,KAAK,QAAQ,QAAQ;AAClC,YAAM,aAAyB;AAAA,QAC7B,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AACA,cAAQ,KAAK,UAAU;AAEvB,UAAI,SAAS,YAAY,SAAS,YAAY;AAC5C,YAAI,WAAW,KAAK,IAAI,KAAK,MAAM,MAAM;AACzC,qBAAa;AAAA,MACf,WAAW,SAAS,QAAQ;AAC1B,qBAAa;AAAA,MACf;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,QAAQ,gBAAgB,cAAc;AAAA,MACtC,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,EACF;AACF;;;ACzGO,SAAS,gBAAgB,UAAkB,QAAsB;AACtE,UAAQ,OAAO,MAAM,aAAa,QAAQ;AAAA,EAAS,MAAM;AAAA;AAAA,CAAM;AACjE;;;ACMA,IAAM,sBAAN,MAAgD;AAAA,EAC9C,YACmBC,YACA,WACjB;AAFiB,qBAAAA;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAGnB,MAAM,QAAQ,MAAyC;AACrD,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,UAAU,MAAM,MAAM,GAAG,KAAK,SAAS,UAAU;AAAA,MACrD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,SAAS;AAAA,MACzC;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,QACd,SAAS,KAAK;AAAA,QACd,UAAU,KAAK,YAAY,CAAC;AAAA,MAC9B,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,QAAQ,IAAI;AACf,YAAM,IAAI,MAAM,yBAAyB,KAAK,EAAE,KAAK,QAAQ,MAAM,EAAE;AAAA,IACvE;AAEA,UAAM,OAAQ,MAAM,QAAQ,KAAK;AACjC,UAAM,SAAS,MAAM,KAAK,cAAc,KAAK,EAAE;AAC/C,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,UAAU,GAAG,YAAY,KAAK,IAAI,IAAI,MAAM;AAAA,EAChF;AAAA,EAEA,MAAc,cAAc,QAAiC;AAC3D,UAAM,mBAAmB,oBAAI,IAAI,CAAC,aAAa,UAAU,WAAW,CAAC;AACrE,eAAS;AACP,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAC5C,YAAM,MAAM,MAAM,MAAM,GAAG,KAAK,SAAS,UAAU,MAAM,IAAI;AAAA,QAC3D,SAAS,EAAE,eAAe,UAAU,KAAK,SAAS,GAAG;AAAA,MACvD,CAAC;AACD,YAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,UAAI,iBAAiB,IAAI,KAAK,MAAM,GAAG;AACrC,YAAI,KAAK,WAAW,aAAa;AAC/B,gBAAM,IAAI,MAAM,aAAa,MAAM,uBAAuB,KAAK,MAAM,EAAE;AAAA,QACzE;AACA,eAAO,OAAO,KAAK,SAAS,WAAW,WAAW,KAAK,QAAQ,SAAS;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,uBAAN,MAAyD;AAAA,EAC7C;AAAA,EACA;AAAA,EAEjB,YAAY,OAAoC,CAAC,GAAG;AAClD,SAAK,YAAY,KAAK,aAAa,QAAQ,IAAI,wBAAwB;AACvE,SAAK,YAAY,KAAK,aAAa,QAAQ,IAAI,wBAAwB;AAAA,EACzE;AAAA,EAEA,MAAM,YAAY,WAAqB,WAAyC;AAC9E,WAAO,IAAI,oBAAoB,KAAK,WAAW,KAAK,SAAS;AAAA,EAC/D;AAAA,EAEA,WAAW,SAAiB,UAAkB,QAAsB;AAClE,oBAAgB,UAAU,MAAM;AAAA,EAClC;AACF;;;AClEA,aAAa;AAEb,IAAM,YAAY,QAAQ,IAAI,wBAAwB;AACtD,IAAM,gBAAgB,QAAQ,IAAI;AAElC,eAAe,SACb,MACA,SACY;AACZ,SAAO,eAAkB,WAAW,MAAM;AAAA,IACxC,QAAQ,SAAS;AAAA,IACjB,MAAM,SAAS;AAAA,IACf,eAAe,SAAS,WAAW,gBAAgB;AAAA,EACrD,CAAC;AACH;AAMA,SAAS,SAAS,MAAgB,MAAkC;AAClE,QAAM,QAAQ,KAAK,QAAQ,IAAI;AAC/B,MAAI,UAAU,IAAI;AAChB,WAAO;AAAA,EACT;AACA,SAAO,KAAK,QAAQ,CAAC;AACvB;AAEA,SAAS,UAAU,SAAwB;AACzC,UAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAC9D;AAEA,eAAe,uBAAuB,QAAiC;AACrE,QAAM,OAAO,MAAM,SAA0B,gBAAgB,mBAAmB,MAAM,CAAC,EAAE;AACzF,QAAM,QAAQ,KAAK,KAAK,CAAC,GAAG;AAC5B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,0BAA0B,MAAM,EAAE;AAAA,EACpD;AACA,SAAO;AACT;AAEA,eAAe,aAAa,IAA2B;AACrD,QAAM,QAAQ,GAAG,WAAW,OAAO,IAAI,MAAM,uBAAuB,EAAE,IAAI;AAC1E,QAAM,OAAO,MAAM,SAAS,SAAS,KAAK,OAAO;AACjD,YAAU,IAAI;AAChB;AAEA,SAAS,QAAc;AACrB,UAAQ,OAAO;AAAA,IACb;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,eAAe,YAAY,MAA+B;AACxD,QAAM,UAAU,SAAS,MAAM,WAAW;AAC1C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAEA,QAAM,WAAW,SAAS,SAAS,MAAM,YAAY,KAAK,OAAO;AACjE,QAAM,OAAO,SAAS,MAAM,QAAQ;AACpC,QAAM,SAAS,SAAS,MAAM,UAAU;AACxC,QAAM,MAAM,SAAS,MAAM,OAAO;AAClC,QAAM,OAAO,MAAM,SAAS,UAAU;AAAA,IACpC,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,SAAS,EAAE,SAAS,MAAM,QAAQ,IAAI;AAAA,IACxC;AAAA,EACF,CAAC;AAED,YAAU,IAAI;AAChB;AAEA,eAAe,YAAY,MAA+B;AACxD,QAAM,SAAS,SAAS,MAAM,UAAU;AACxC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,sBAAsB;AAAA,EACxC;AAEA,QAAM,QAAQ,SAAS,MAAM,SAAS;AACtC,QAAM,OAAO,SAAS,MAAM,QAAQ;AACpC,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,oBAAoB;AAAA,EACtC;AACA,QAAM,SAAS,SAAS,MAAM,UAAU;AACxC,QAAM,cAAc,SAAS,MAAM,gBAAgB;AACnD,QAAM,WAAW,SAAS,SAAS,MAAM,YAAY,KAAK,WAAW;AACrE,QAAM,OAAO,MAAM,SAAS,UAAU;AAAA,IACpC,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,SAAS,EAAE,QAAQ,OAAO,MAAM,QAAQ,YAAY;AAAA,IACtD;AAAA,EACF,CAAC;AAED,YAAU,IAAI;AAChB;AAEA,eAAe,gBAAgB,MAA+B;AAC5D,QAAM,QAAQ,SAAS,MAAM,SAAS;AACtC,QAAM,SAAS,SAAS,MAAM,UAAU;AACxC,MAAI,CAAC,SAAS,CAAC,QAAQ;AACrB,UAAM,IAAI,MAAM,mCAAmC;AAAA,EACrD;AAEA,QAAM,UAAU,SAAS,MAAM,WAAW,KAAK;AAC/C,QAAM,WAAW,SAAS,SAAS,MAAM,YAAY,KAAK,OAAO;AACjE,QAAM,YAAY,SAAS,MAAM,cAAc;AAE/C,QAAM,OAAO,MAAM,SAAS,UAAU;AAAA,IACpC,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,SAAS,EAAE,OAAO,QAAQ,UAAU;AAAA,IACtC;AAAA,EACF,CAAC;AAED,YAAU,IAAI;AAChB;AAEA,eAAe,cAAc,MAA+B;AAC1D,QAAM,UAAU,SAAS,MAAM,WAAW;AAC1C,QAAM,SAAS,SAAS,MAAM,UAAU;AACxC,QAAM,OAAO,SAAS,MAAM,QAAQ;AACpC,MAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM;AAChC,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,MAAI,YAAY,WAAW,YAAY,eAAe;AACpD,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAEA,QAAM,QAAQ,SAAS,MAAM,SAAS;AACtC,QAAM,SAAS,SAAS,MAAM,UAAU;AACxC,QAAM,cAAc,SAAS,MAAM,gBAAgB;AACnD,QAAM,cAAc,KAAK,SAAS,eAAe,KAAK;AACtD,QAAM,WAAW,SAAS,SAAS,MAAM,YAAY,KAAK,GAAG,OAAO,MAAM;AAE1E,QAAM,OAAO,MAAM,SAAS,UAAU;AAAA,IACpC,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,SAAS,EAAE,QAAQ,MAAM,OAAO,QAAQ,aAAa,YAAY;AAAA,IACnE;AAAA,EACF,CAAC;AAED,YAAU,IAAI;AAChB;AAEA,eAAe,OAAsB;AACnC,QAAM,CAAC,SAAS,YAAY,GAAG,IAAI,IAAI,QAAQ,KAAK,MAAM,CAAC;AAE3D,MAAI,CAAC,SAAS;AACZ,UAAM;AACN;AAAA,EACF;AAEA,MAAI,YAAY,YAAY,eAAe,SAAS;AAClD,YAAQ,OAAO,MAAM,wBAAwB;AAC7C;AAAA,EACF;AAEA,MAAI,YAAY,UAAU,eAAe,SAAS;AAChD,YAAQ,OAAO,MAAM,sBAAsB;AAC3C;AAAA,EACF;AAEA,MAAI,YAAY,UAAU,eAAe,UAAU;AACjD,UAAM,UAAU,KAAK,CAAC;AACtB,UAAM,cAAc,KAAK,MAAM,CAAC;AAChC,QAAI,YAAY,SAAS;AACvB,YAAM,YAAY,WAAW;AAC7B;AAAA,IACF;AACA,QAAI,YAAY,SAAS;AACvB,YAAM,YAAY,WAAW;AAC7B;AAAA,IACF;AACA,QAAI,YAAY,aAAa;AAC3B,YAAM,gBAAgB,WAAW;AACjC;AAAA,IACF;AACA,QAAI,YAAY,WAAW;AACzB,YAAM,cAAc,WAAW;AAC/B;AAAA,IACF;AACA,UAAM,IAAI,MAAM,+BAA+B,OAAO,EAAE;AAAA,EAC1D;AAEA,MAAI,YAAY,SAAS;AACvB,UAAM,SAAS,SAAS,CAAC,YAAY,GAAG,IAAI,EAAE,OAAO,OAAO,GAAe,UAAU;AACrF,UAAM,QAAQ,MAAM,SAAS,SAAS,iBAAiB,mBAAmB,MAAM,CAAC,KAAK,QAAQ;AAC9F,cAAU,KAAK;AACf;AAAA,EACF;AAEA,MAAI,YAAY,UAAU,eAAe,QAAQ;AAC/C,UAAM,SAAS,KAAK,CAAC;AACrB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,UAAM,OAAO,MAAM,SAAS,UAAU,MAAM,EAAE;AAC9C,cAAU,IAAI;AACd;AAAA,EACF;AAEA,MAAI,YAAY,UAAU,eAAe,SAAS;AAChD,UAAM,SAAS,KAAK,CAAC;AACrB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,UAAM,OAAO,MAAM,SAAS,UAAU,MAAM,UAAU,EAAE,QAAQ,QAAQ,UAAU,KAAK,CAAC;AACxF,cAAU,IAAI;AACd;AAAA,EACF;AAEA,MAAI,YAAY,UAAU,eAAe,QAAQ;AAC/C,UAAM,SAAS,KAAK,CAAC;AACrB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,UAAM,aAAa,MAAM;AACzB;AAAA,EACF;AAEA,MAAI,YAAY,UAAU,eAAe,UAAU;AACjD,UAAM,SAAS,KAAK,CAAC;AACrB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACvC;AACA,UAAM,OAAO,MAAM,SAAS,UAAU,MAAM,WAAW,EAAE,QAAQ,QAAQ,UAAU,KAAK,CAAC;AACzF,cAAU,IAAI;AACd;AAAA,EACF;AAEA,MAAI,YAAY,QAAQ;AACtB,UAAM,SAAS,SAAS,MAAM,WAAW;AACzC,UAAM,SAAS,SAAS,MAAM,UAAU;AACxC,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,QAAQ;AACV,YAAM,IAAI,UAAU,MAAM;AAAA,IAC5B;AACA,QAAI,QAAQ;AACV,YAAM,IAAI,UAAU,MAAM;AAAA,IAC5B;AACA,UAAM,OAAO,MAAM,SAAS,MAAM,OAAO,IAAI,SAAS,MAAM,SAAS,CAAC,KAAK,OAAO;AAClF,cAAU,IAAI;AACd;AAAA,EACF;AAEA,MAAI,YAAY,SAAS,eAAe,SAAS;AAC/C,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AACA,UAAM,YAAY,KAAK,MAAM,CAAC;AAC9B,UAAM,YAAY,SAAS,WAAW,SAAS;AAC/C,UAAM,SAAS,SAAS,WAAW,UAAU;AAC7C,UAAM,SAAS,SAAS,WAAW,UAAU;AAE7C,QAAI;AACJ,QAAI,cAAc,QAAW;AAC3B,aAAO,EAAE,MAAM,SAAS,SAAS,EAAE,MAAM,UAAU,EAAE;AAAA,IACvD,WAAW,WAAW,QAAW;AAC/B,UAAI,WAAW,aAAa,WAAW,aAAa,WAAW,UAAU;AACvE,cAAM,IAAI,MAAM,8CAA8C;AAAA,MAChE;AACA,aAAO,EAAE,MAAM,UAAU,SAAS,EAAE,OAAO,EAAE;AAAA,IAC/C,WAAW,WAAW,QAAW;AAC/B,YAAM,QAAQ,gBAAgB,KAAK,MAAM;AACzC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,mDAAmD;AAAA,MACrE;AACA,aAAO,EAAE,MAAM,UAAU,SAAS,EAAE,MAAM,OAAO,MAAM,CAAC,CAAC,GAAG,MAAM,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE;AAAA,IACvF,OAAO;AACL,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAEA,UAAM,SAAS,MAAM,SAAS,SAAS,KAAK,UAAU,EAAE,QAAQ,QAAQ,UAAU,MAAM,KAAK,CAAC;AAC9F,cAAU,MAAM;AAChB;AAAA,EACF;AAEA,MAAI,YAAY,SAAS,eAAe,QAAQ;AAC9C,UAAM,QAAQ,KAAK,CAAC;AACpB,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AACA,UAAM,MAAM,MAAM,SAAS,SAAS,KAAK,EAAE;AAC3C,cAAU,GAAG;AACb;AAAA,EACF;AAEA,MAAI,YAAY,QAAQ;AACtB,UAAM,KAAK;AACX,QAAI,CAAC,IAAI;AACP,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AACA,UAAM,aAAa,EAAE;AACrB;AAAA,EACF;AAEA,MAAI,YAAY,aAAa;AAC3B,UAAM,QAAQ;AACd,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AACA,UAAM,YAAY,MAAM,SAAS,SAAS,KAAK,YAAY;AAC3D,cAAU,SAAS;AACnB;AAAA,EACF;AAEA,MAAI,YAAY,WAAW,eAAe,QAAQ;AAChD,UAAM,WAAW,sBAAsB;AACvC,YAAQ,OAAO,MAAM,qBAAqB;AAC1C,eAAW,QAAQ;AACnB;AAAA,EACF;AAEA,MAAI,YAAY,WAAW,eAAe,OAAO;AAC/C,UAAM,YAAY,KAAK,CAAC;AACxB,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AACA,UAAM,WAAW,sBAAsB;AACvC,UAAM,QAAQ,SAAS,IAAI,SAAS;AACpC,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,kBAAkB,SAAS,uDAAuD;AAAA,IACpG;AAEA,UAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,UAAM,UAAmC,CAAC;AAC1C,aAAS,IAAI,GAAG,IAAI,QAAQ,SAAS,GAAG,KAAK;AAC3C,UAAI,QAAQ,CAAC,EAAE,WAAW,IAAI,GAAG;AAC/B,gBAAQ,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC;AAC5C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,UAAU,OAAO;AACpC,UAAM,SAAS,IAAI,yBAAyB;AAC5C,UAAM,MAAM,IAAI,qBAAqB;AACrC,UAAM,SAAS,MAAM,OAAO,IAAI,MAAM,GAAG;AAEzC,QAAI,CAAC,OAAO,WAAW;AACrB,cAAQ,OAAO,MAAM,UAAU,SAAS,qBAAqB,OAAO,MAAM,GAAG,EAAE,GAAG,UAAU,SAAS;AAAA,CAAK;AAC1G,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA;AAAA,EACF;AAEA,QAAM;AACR;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,OAAO,MAAM,GAAG,OAAO,KAAK,CAAC;AAAA,CAAI;AACzC,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["serverUrl","runAnthropicStep","runOpenAIStep","runOllamaStep","runShellStep","runFileStep","stepResult","serverUrl"]}