@krapht/ork 1.0.0-alpha.11 → 1.0.0-alpha.12

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 (36) hide show
  1. package/dist/{__build_info__-CIchF6nr.mjs → __build_info__-BJbE3Zvp.mjs} +3 -2
  2. package/dist/attach-BmV5ckb9.mjs +89 -0
  3. package/dist/bin.mjs +132 -1208
  4. package/dist/{decide-B6PnKeqo.mjs → builtin-files-w0YULJ4c.mjs} +2 -50
  5. package/dist/{chips-BA7SrrH5.mjs → chips-CyeB_rhR.mjs} +1 -1
  6. package/dist/{clean-Di-KT7Mf.mjs → clean-D8GI_2K-.mjs} +1 -1
  7. package/dist/{completion-C5D0sEs5.mjs → completion-CzElB8nS.mjs} +7 -6
  8. package/dist/{context-BaNshWr9.mjs → context-BAwgVSX5.mjs} +5 -5
  9. package/dist/decide-DlbyctOE.mjs +50 -0
  10. package/dist/{find-BicBbGMg.mjs → find-p05wlbmu.mjs} +1 -1
  11. package/dist/{format-lWhN-jYR.mjs → format-Dni98cbh.mjs} +5 -85
  12. package/dist/{help-groups-BwYoAWsh.mjs → help-groups-DYP_zMRP.mjs} +4 -0
  13. package/dist/{in-a-run-CgkVouyG.mjs → in-a-run-BI-hLIl_.mjs} +4 -2
  14. package/dist/{limits-jZQp9ZJC.mjs → limits-CElmhowV.mjs} +1 -1
  15. package/dist/{list-CEaJ07jd.mjs → list-zW2xKuGr.mjs} +1 -1
  16. package/dist/{mcp-DYgVA9f5.mjs → mcp-CM3b65AZ.mjs} +6 -6
  17. package/dist/{output-CM95njYt.mjs → output-CnRzrbUM.mjs} +3 -1
  18. package/dist/{pause-D6PuSlNl.mjs → pause-BuS83WAI.mjs} +4 -4
  19. package/dist/{relay-DNx7be9k.mjs → relay-DAsJA8wF.mjs} +2 -2
  20. package/dist/{remove-CpMb4NDl.mjs → remove-Dh7D_hVn.mjs} +3 -3
  21. package/dist/{send-CLs_fyg7.mjs → send-MFEQZH31.mjs} +3 -3
  22. package/dist/{src-9iGkjnsy.mjs → src-BfxkJOYm.mjs} +1 -1
  23. package/dist/{src-D6_xjm-x.mjs → src-CdDTQLdQ.mjs} +173 -24
  24. package/dist/{src-BnZgZGrf.mjs → src-D1QedD5y.mjs} +1 -1
  25. package/dist/{src-B6KvTm7B.mjs → src-S9yK2OHU.mjs} +7 -6
  26. package/dist/store-B2OaE4ID.mjs +1356 -0
  27. package/dist/ui/assets/{app-CxURph7a.js → app-CAoZtku5.js} +1 -1
  28. package/dist/ui/assets/{index-By_8KKG6.js → index-BL7Ad0OA.js} +2 -2
  29. package/dist/ui/index.html +1 -1
  30. package/dist/{ui-CIci4UBW.mjs → ui-C4Ys26oO.mjs} +4 -4
  31. package/dist/{usage-GceBGMjU.mjs → usage-C2zx-X6q.mjs} +6 -6
  32. package/dist/verdict-CIy8tAyX.mjs +84 -0
  33. package/dist/{watch-BmoybMQg.mjs → watch-DzCeqM05.mjs} +7 -7
  34. package/dist/{workflows-DZvW3i1e.mjs → workflows-Rr5w90A0.mjs} +3 -3
  35. package/dist/{worktrees-Be51E2rB.mjs → worktrees-f6SAbum5.mjs} +5 -5
  36. package/package.json +1 -1
@@ -544,13 +544,14 @@ const DriverSchema = z.enum(DRIVER_IDS, { error: (issue) => retiredDriverHint(is
544
544
  /** `opus`, `sonnet`, `haiku`, or a full model id such as `claude-opus-5-5`. */
545
545
  const ModelSchema = z.string().min(1);
546
546
  /** How hard the model thinks; Claude Code's own default when unset. */
547
- const EffortSchema = z.enum([
547
+ const EFFORTS = [
548
548
  "low",
549
549
  "medium",
550
550
  "high",
551
551
  "xhigh",
552
552
  "max"
553
- ]).describe("Reasoning effort. Default: Claude Code's for the model.");
553
+ ];
554
+ const EffortSchema = z.enum(EFFORTS).describe("Reasoning effort. Default: Claude Code's for the model.");
554
555
  const IsolationSchema = z.enum([
555
556
  "worktree",
556
557
  "continue",
@@ -720,13 +721,20 @@ const TOOL_NODE_SCHEMAS = INTEGRATIONS.map((i) => toolNodeSchema(i));
720
721
  const base = nodeBaseFields;
721
722
  /** A Claude node's output field that is not a list: a rule or JSON Schema. */
722
723
  const NotListSchema = z.unknown().refine((value) => typeof value !== "object" || value === null || !("list" in value), { message: LIST_RULE_HINT });
724
+ const NODE_EFFORT_HINT = "expected low, medium, high, xhigh or max, or {{item.<field>}}";
725
+ /**
726
+ * A Claude node's effort: a level, or on a `forEach` node a template reading
727
+ * its item (`{{item.effort}}`), which the compiler checks and each item
728
+ * renders.
729
+ */
730
+ const NodeEffortSchema = z.union([EffortSchema, z.string().regex(/\{\{.*\}\}/su, { error: NODE_EFFORT_HINT })], { error: NODE_EFFORT_HINT }).describe("Reasoning effort, or {{item.<field>}} on a forEach node. Default: Claude Code's for the model.");
723
731
  /**
724
732
  * What an agent brings to the node it fills, and what a plain Claude node sets
725
733
  * itself. A node's own value wins over its agent's.
726
734
  */
727
735
  const agentSettings = {
728
736
  model: ModelSchema.optional(),
729
- effort: EffortSchema.optional(),
737
+ effort: NodeEffortSchema.optional(),
730
738
  driver: DriverSchema.optional(),
731
739
  skills: z.array(z.string()).optional().describe("Node-layer skills (highest precedence)."),
732
740
  context: z.array(z.string()).optional().describe("Node-layer context files."),
@@ -6449,6 +6457,122 @@ const gatherProblems = (id, node) => {
6449
6457
  return isList(rule) ? [] : [error("output.gather", `\`${field}\` isn't declared as a list (\`{ type: array }\` or \`{ list: … }\`), so its rounds can't be added together`, [...path, index])];
6450
6458
  });
6451
6459
  };
6460
+ // ../core/src/graph/item-settings.ts
6461
+ /**
6462
+ * @file A fanned node's `model` and `effort` from its item (`{{item.model}}`):
6463
+ * the compiler's checks (only on a `forEach` node, reading only `item`, and
6464
+ * every written item's value), and the rendering each item's session plan
6465
+ * uses, which checks an item from `from:` when it runs.
6466
+ */
6467
+ const FIELDS$1 = ["model", "effort"];
6468
+ /**
6469
+ * The parts of a template that reads something, or `null` for a plain value (or
6470
+ * one that does not parse, which the compiler reports).
6471
+ */
6472
+ const templateOf$1 = (text) => {
6473
+ const parsed = parseTemplate(text);
6474
+ if (!parsed.ok) return null;
6475
+ return parsed.parts.some((part) => typeof part !== "string") ? parsed.parts : null;
6476
+ };
6477
+ const isEffort = (text) => EFFORTS.includes(text);
6478
+ /** Checks what one item's template rendered to. */
6479
+ const checkRendered = (field, template, rendered) => {
6480
+ const text = rendered.trim();
6481
+ if (text === "") return {
6482
+ ok: true,
6483
+ value: void 0
6484
+ };
6485
+ return (field === "effort" ? isEffort(text) : /^[^\s{}"]+$/u.test(text)) ? {
6486
+ ok: true,
6487
+ value: text
6488
+ } : {
6489
+ ok: false,
6490
+ error: `\`${field}: ${template}\` gave \`${text}\`, which is not ${field === "effort" ? `an effort level (${EFFORTS.join(", ")})` : "a model name"}`
6491
+ };
6492
+ };
6493
+ /**
6494
+ * A node's `model` or `effort` for one item: a plain value as written, a
6495
+ * template rendered with the item. Without an item, a template renders empty.
6496
+ */
6497
+ const itemSetting = (field, value, scope) => {
6498
+ if (value === void 0) return {
6499
+ ok: true,
6500
+ value: void 0
6501
+ };
6502
+ const parts = templateOf$1(value);
6503
+ if (parts === null) return {
6504
+ ok: true,
6505
+ value
6506
+ };
6507
+ return checkRendered(field, value, renderTemplate(parts, scope));
6508
+ };
6509
+ /** `itemSetting` for `effort`, as an effort level. */
6510
+ const itemEffort = (value, scope) => {
6511
+ const given = itemSetting("effort", value, scope);
6512
+ if (!given.ok) return given;
6513
+ if (given.value === void 0) return {
6514
+ ok: true,
6515
+ value: void 0
6516
+ };
6517
+ return isEffort(given.value) ? {
6518
+ ok: true,
6519
+ value: given.value
6520
+ } : {
6521
+ ok: false,
6522
+ error: `\`effort\` is \`${given.value}\``
6523
+ };
6524
+ };
6525
+ /** A `model` or `effort` template's problems on one node. */
6526
+ const checkNodeField = (workflow, says, id, field) => {
6527
+ const node = workflow.nodes[id];
6528
+ const value = node === void 0 ? void 0 : Reflect.get(node, field);
6529
+ if (node === void 0 || typeof value !== "string") return [];
6530
+ const path = [
6531
+ "nodes",
6532
+ id,
6533
+ field
6534
+ ];
6535
+ const parsed = parseTemplate(value);
6536
+ if (!parsed.ok) return [error("template.syntax", `${parsed.message} at column ${parsed.offset + 1}`, path)];
6537
+ if (parsed.parts.every((part) => typeof part === "string")) return [];
6538
+ const each = forEachOf$1(node);
6539
+ if (each === void 0) return [error(`${field}.template`, `\`${field}\` may be a template only on a node with \`forEach\`, reading its item, e.g. \`{{item.${field}}}\``, path)];
6540
+ const reads = parsed.parts.flatMap((part) => typeof part === "string" ? [] : collectPaths(part.expr));
6541
+ const outside = reads.filter(([root]) => root !== "item");
6542
+ if (outside.length > 0) return outside.map((segments) => error(`${field}.template`, `\`${describePath(segments)}\`: a \`${field}\` template reads only the item, e.g. \`{{item.${field}}}\``, path));
6543
+ const scope = { fields: itemFieldsOf(node, says) };
6544
+ const fields = reads.flatMap((segments) => checkItemRead(segments, scope, path));
6545
+ if (fields.length > 0 || !("items" in each)) return fields;
6546
+ return each.items.flatMap((item, index) => {
6547
+ const given = checkRendered(field, value, renderTemplate(parsed.parts, {
6548
+ inputs: {},
6549
+ nodes: {},
6550
+ item,
6551
+ index
6552
+ }));
6553
+ return given.ok ? [] : [error(`${field}.item`, `item ${String(index)}: ${given.error}`, [
6554
+ "nodes",
6555
+ id,
6556
+ "forEach",
6557
+ "items",
6558
+ index
6559
+ ])];
6560
+ });
6561
+ };
6562
+ /**
6563
+ * `model` and `effort` templates: only on a `forEach` node, reading only
6564
+ * `item`, and every written item's value a model name or an effort level.
6565
+ * `defaults:` belong to no node, so they take no template.
6566
+ */
6567
+ const checkItemSettings = (workflow, edges) => {
6568
+ const says = nodeSays(workflow.nodes, edges);
6569
+ const defaults = FIELDS$1.flatMap((field) => {
6570
+ const value = workflow.defaults?.[field];
6571
+ return value !== void 0 && templateOf$1(value) !== null ? [error(`${field}.template`, `\`defaults.${field}\` applies to every node, so it can't read an item; set the template on the \`forEach\` node`, ["defaults", field])] : [];
6572
+ });
6573
+ const nodes = Object.entries(workflow.nodes).flatMap(([id, node]) => isClaudeNode(node) ? FIELDS$1.flatMap((field) => checkNodeField(workflow, says, id, field)) : []);
6574
+ return [...defaults, ...nodes];
6575
+ };
6452
6576
  // ../core/src/graph/script.ts
6453
6577
  /**
6454
6578
  * @file Checks on the programs a workflow declares (RFC-006): a tool node's and
@@ -6514,7 +6638,7 @@ const statusProblems = (id, node) => {
6514
6638
  };
6515
6639
  /** Per-type checks that need the rest of the graph. */
6516
6640
  const checkNodes = (workflow, edges) => {
6517
- const diagnostics = checkScripts(workflow);
6641
+ const diagnostics = [...checkScripts(workflow), ...checkItemSettings(workflow, edges)];
6518
6642
  for (const [id, node] of Object.entries(workflow.nodes)) {
6519
6643
  const path = ["nodes", id];
6520
6644
  const incoming = edges.filter((e) => e.to === id);
@@ -7090,11 +7214,13 @@ const startAt = (priority, bin, args, env = process.env) => {
7090
7214
  return [first, [...rest, ...args]];
7091
7215
  };
7092
7216
  /**
7093
- * Lowers a started child's priority for `low`, best effort; what it starts
7094
- * later inherits it.
7217
+ * Lowers a started child's priority for `low` where {@link startAt} had no
7218
+ * `nice` to start it under (Windows), best effort; what it starts later
7219
+ * inherits it. Under `nice` it does nothing: `nice` lowers relative to the
7220
+ * priority it finds, so lowering here too could land first and the two add up.
7095
7221
  */
7096
7222
  const lowerChild = (priority, pid) => {
7097
- if (priority !== "low" || pid === void 0) return;
7223
+ if (priority !== "low" || pid === void 0 || existsSync(NICE)) return;
7098
7224
  try {
7099
7225
  setPriority(pid, constants$1.priority.PRIORITY_BELOW_NORMAL);
7100
7226
  } catch {}
@@ -11481,12 +11607,13 @@ const parseReport = (value) => {
11481
11607
  // ../core/src/run/brief.ts
11482
11608
  /**
11483
11609
  * @file What a Claude node is asked: its brief, rendered against the run's
11484
- * inputs and outputs, and its `claude.subagent` children as Claude Code
11485
- * subagents of its session (the SDK's `agents`, the CLI's `--agents`). A
11486
- * subagent's role (its agent's instructions), `instructions` and `prompt` are
11487
- * its system prompt, and its `description` says when the session hands it
11488
- * work with the Agent tool; it runs inside that session, with no process,
11489
- * worktree or edges of its own.
11610
+ * inputs and outputs, the model and effort it runs on (a fanned node's from
11611
+ * its item), and its `claude.subagent` children as Claude Code subagents of
11612
+ * its session (the SDK's `agents`, the CLI's `--agents`). A subagent's role
11613
+ * (its agent's instructions), `instructions` and `prompt` are its system
11614
+ * prompt, and its `description` says when the session hands it work with the
11615
+ * Agent tool; it runs inside that session, with no process, worktree or edges
11616
+ * of its own.
11490
11617
  */
11491
11618
  /** The tool a session hands a subagent work with. */
11492
11619
  const AGENT_TOOL = "Agent";
@@ -11515,6 +11642,23 @@ const renderBrief = (text, inputs, outputs, before, item) => {
11515
11642
  warnings
11516
11643
  };
11517
11644
  };
11645
+ /**
11646
+ * The model and effort a session asks for: the node's own, rendered with its
11647
+ * item on a fanned node (`{{item.model}}`), else the workflow's defaults. An
11648
+ * item's value that is no model name or effort level fails it.
11649
+ */
11650
+ const modelOf = (node, defaults, run) => {
11651
+ const scope = runScope(run.inputs, run.outputs ?? {}, void 0, run.item);
11652
+ const model = itemSetting("model", node.model, scope);
11653
+ if (!model.ok) return model;
11654
+ const effort = itemEffort(node.effort, scope);
11655
+ if (!effort.ok) return effort;
11656
+ return {
11657
+ ok: true,
11658
+ model: model.value ?? defaults.model,
11659
+ effort: effort.value ?? defaults.effort
11660
+ };
11661
+ };
11518
11662
  const rendered = (text, inputs, outputs) => {
11519
11663
  const brief = renderBrief(text, inputs, outputs);
11520
11664
  return brief.ok ? brief.text : (text ?? "").trim();
@@ -11691,6 +11835,11 @@ const planNodeSession = (workflow, id, options) => {
11691
11835
  ok: false,
11692
11836
  error: `\`${id}\` uses worktree isolation, which a run on its own does not set up; run the whole workflow, or pass \`--in-place\` to run it in this checkout`
11693
11837
  };
11838
+ const models = modelOf(node, defaults, options);
11839
+ if (!models.ok) return {
11840
+ ok: false,
11841
+ error: models.error
11842
+ };
11694
11843
  const warnings = [];
11695
11844
  const brief = renderBrief(node.prompt, options.inputs, options.outputs, options.before, options.item);
11696
11845
  if (!brief.ok) return {
@@ -11738,10 +11887,8 @@ const planNodeSession = (workflow, id, options) => {
11738
11887
  spec.agents = agents;
11739
11888
  spec.tools.only?.push(AGENT_TOOL);
11740
11889
  }
11741
- const model = node.model ?? defaults.model;
11742
- if (model !== void 0) spec.model = model;
11743
- const effort = node.effort ?? defaults.effort;
11744
- if (effort !== void 0) spec.effort = effort;
11890
+ if (models.model !== void 0) spec.model = models.model;
11891
+ if (models.effort !== void 0) spec.effort = models.effort;
11745
11892
  const maxTurns = node.maxTurns ?? defaults.maxTurns;
11746
11893
  if (maxTurns !== void 0) spec.maxTurns = maxTurns;
11747
11894
  const budgets = [node.budgetUsd ?? defaults.budgetUsd, options.budgetLeftUsd].filter((b) => b !== void 0);
@@ -12063,18 +12210,16 @@ const followEvents = async (store, runId, onEvent, options) => {
12063
12210
  seq: options.after ?? 0,
12064
12211
  finished: false
12065
12212
  };
12066
- const done = new AbortController();
12067
12213
  const emit = (stored) => {
12068
12214
  if (stored.seq <= seen.seq) return;
12069
12215
  seen.seq = stored.seq;
12070
12216
  onEvent(stored);
12071
- if (stored.event.type === "run.finished") {
12072
- seen.finished = true;
12073
- done.abort();
12074
- }
12217
+ const { type } = stored.event;
12218
+ if (type === "run.finished") seen.finished = true;
12219
+ else if (type === "run.started" || type === "run.resumed") seen.finished = false;
12075
12220
  };
12076
12221
  const aborted = () => options.signal?.aborted === true;
12077
- /** Takes what the store has; true once `run.finished` is among it. */
12222
+ /** Takes what the store has; true once the run's latest go has finished. */
12078
12223
  const drain = () => {
12079
12224
  for (const stored of store.events(runId, seen.seq)) emit(stored);
12080
12225
  return seen.finished;
@@ -12083,7 +12228,11 @@ const followEvents = async (store, runId, onEvent, options) => {
12083
12228
  if (drain()) return "finished";
12084
12229
  if (!options.follow) return "stored";
12085
12230
  if (aborted()) return "aborted";
12086
- const via = await followSocket(socketPath(runId, options.home), seen.seq, emit, options.signal === void 0 ? done.signal : AbortSignal.any([options.signal, done.signal]));
12231
+ const done = new AbortController();
12232
+ const via = await followSocket(socketPath(runId, options.home), seen.seq, (stored) => {
12233
+ emit(stored);
12234
+ if (seen.finished) done.abort();
12235
+ }, options.signal === void 0 ? done.signal : AbortSignal.any([options.signal, done.signal]));
12087
12236
  if (seen.finished) return "finished";
12088
12237
  if (aborted()) return "aborted";
12089
12238
  if (via === "ended") continue;
@@ -1,4 +1,4 @@
1
- import { Ar as AGENT_DRIVERS, Bt as lowerChild, En as maskSecrets, Vt as startAt, an as FEEDBACK_SEVERITIES, en as outcomeEnd, ft as parseReport, in as FEEDBACK_KINDS, nn as END_KINDS, on as FEEDBACK_TARGETS, rn as endFor, wn as MASK } from "./src-D6_xjm-x.mjs";
1
+ import { Ar as AGENT_DRIVERS, Bt as lowerChild, En as maskSecrets, Vt as startAt, an as FEEDBACK_SEVERITIES, en as outcomeEnd, ft as parseReport, in as FEEDBACK_KINDS, nn as END_KINDS, on as FEEDBACK_TARGETS, rn as endFor, wn as MASK } from "./src-CdDTQLdQ.mjs";
2
2
  import path from "node:path";
3
3
  import { z } from "zod";
4
4
  import { existsSync, linkSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
@@ -1,10 +1,11 @@
1
- import { $n as skillsIn, $t as endOf, At as nestItems, B as linkNodes, Bn as placeFiles, C as openStore, Ct as runStatus, Dt as processAlive, G as requestContinue, Gn as workflowDirOf, In as loadAgents, J as tellLiveRun, Jn as LESSON_CAP_TOKENS, K as requestPause, Kn as inside, S as isNodeEvent, St as pausedOf, U as unlinkNodes, Un as runDirOf, Ut as nodeSays, Vn as placeFor, X as detachResume, Z as resumable, a as releaseNotes, c as detectInstaller, cn as planPost, er as WorkflowEditSchema, et as detachRun, gt as walkSummary, hr as NodeSchema, ht as walkChecks, i as planUpgrade, it as limitsReport, ln as runGh, mt as checkWorkflowText, nn as END_KINDS, nr as newWorkflowText, o as runningRunIds, or as renderJsonSchema, p as triggersReport, pr as expandEdge, q as requestStop, r as capsHere, rr as readDocument, s as runningScript, sn as DISCUSSIONS, sr as parseWorkflow, st as explainWorkflowText, tr as applyEdits, tt as followEvents, un as sendPost, ur as EdgeInputSchema, w as storePath, x as activeTree, xt as liveStatus, yn as readCondition } from "./src-D6_xjm-x.mjs";
2
- import { C as feedbackActions, S as placeOf$1, _ as previewPost, a as registryShown, b as acceptItem, c as checkDue, f as readUpdateCache, g as nodeSession, h as writeUpdateCache, i as registryOf, l as fetchLatest, m as updateCachePath, o as updateSwitchOff, p as refreshUpdateCache, s as runInstall, u as newerVersion, w as openFixRun, x as lessonPlaceOf, y as recordNote } from "./__build_info__-CIchF6nr.mjs";
3
- import { n as pendingDecisions, r as builtinProblem, t as answerDecision } from "./decide-B6PnKeqo.mjs";
4
- import { n as newRunId, t as findRun } from "./find-BicBbGMg.mjs";
1
+ import { $n as skillsIn, $t as endOf, At as nestItems, B as linkNodes, Bn as placeFiles, C as openStore, Ct as runStatus, Dt as processAlive, G as requestContinue, Gn as workflowDirOf, In as loadAgents, J as tellLiveRun, Jn as LESSON_CAP_TOKENS, K as requestPause, Kn as inside, S as isNodeEvent, St as pausedOf, U as unlinkNodes, Un as runDirOf, Ut as nodeSays, Vn as placeFor, X as detachResume, Z as resumable, a as releaseNotes, c as detectInstaller, cn as planPost, er as WorkflowEditSchema, et as detachRun, gt as walkSummary, hr as NodeSchema, ht as walkChecks, i as planUpgrade, it as limitsReport, ln as runGh, mt as checkWorkflowText, nn as END_KINDS, nr as newWorkflowText, o as runningRunIds, or as renderJsonSchema, p as triggersReport, pr as expandEdge, q as requestStop, r as capsHere, rr as readDocument, s as runningScript, sn as DISCUSSIONS, sr as parseWorkflow, st as explainWorkflowText, tr as applyEdits, tt as followEvents, un as sendPost, ur as EdgeInputSchema, w as storePath, x as activeTree, xt as liveStatus, yn as readCondition } from "./src-CdDTQLdQ.mjs";
2
+ import { C as feedbackActions, S as placeOf$1, _ as previewPost, a as registryShown, b as acceptItem, c as checkDue, f as readUpdateCache, g as nodeSession, h as writeUpdateCache, i as registryOf, l as fetchLatest, m as updateCachePath, o as updateSwitchOff, p as refreshUpdateCache, s as runInstall, u as newerVersion, w as openFixRun, x as lessonPlaceOf, y as recordNote } from "./__build_info__-BJbE3Zvp.mjs";
3
+ import { t as builtinProblem } from "./builtin-files-w0YULJ4c.mjs";
4
+ import { n as pendingDecisions, t as answerDecision } from "./decide-DlbyctOE.mjs";
5
+ import { n as newRunId, t as findRun } from "./find-p05wlbmu.mjs";
5
6
  import { n as usageReport } from "./report-CEN8VoUb.mjs";
6
- import { a as planClean, i as keyOf, o as stepActs, r as cleanStep, s as stepPrunes, t as applyClean } from "./clean-Di-KT7Mf.mjs";
7
- import { a as readWorktrees, c as mergeStateOf, d as stateParts, i as projectHead, l as planLine, n as lostWork, r as planRemove, s as labelOf, t as applyRemove, u as removeRefusal } from "./remove-CpMb4NDl.mjs";
7
+ import { a as planClean, i as keyOf, o as stepActs, r as cleanStep, s as stepPrunes, t as applyClean } from "./clean-D8GI_2K-.mjs";
8
+ import { a as readWorktrees, c as mergeStateOf, d as stateParts, i as projectHead, l as planLine, n as lostWork, r as planRemove, s as labelOf, t as applyRemove, u as removeRefusal } from "./remove-Dh7D_hVn.mjs";
8
9
  import path from "node:path";
9
10
  import { z } from "zod";
10
11
  import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";