@krapht/ork 1.0.0-alpha.7 → 1.0.0-alpha.8

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 (32) hide show
  1. package/dist/{__build_info__-BGoaUwLd.mjs → __build_info__-B83zdwIv.mjs} +2 -2
  2. package/dist/bin.mjs +29 -29
  3. package/dist/{clean-BPITM-6p.mjs → clean-NtapkN2x.mjs} +1 -1
  4. package/dist/{completion-CCn8xWmO.mjs → completion-DAQMrf1u.mjs} +5 -5
  5. package/dist/{context-CZNM454F.mjs → context-C5wQNjp9.mjs} +3 -3
  6. package/dist/{decide-DsA6kOT7.mjs → decide-BaEOo7sO.mjs} +1 -1
  7. package/dist/{find-ntyniv2E.mjs → find-DDAkEoda.mjs} +1 -1
  8. package/dist/{format-DaROJUgG.mjs → format-sGEQmQid.mjs} +3 -22
  9. package/dist/{in-a-run-D_fnj1Mw.mjs → in-a-run-DENitTUe.mjs} +1 -1
  10. package/dist/{limits-BKzVMwkt.mjs → limits-DezRXN0Z.mjs} +1 -1
  11. package/dist/{list-D9HPWLPH.mjs → list-CZTh_wdE.mjs} +1 -1
  12. package/dist/{mcp-BFl3cIDp.mjs → mcp-B2DW26HO.mjs} +6 -6
  13. package/dist/{output-CwqlG1Le.mjs → output-D1wMNIly.mjs} +1 -1
  14. package/dist/{pause-DhgKQORW.mjs → pause-HuQhHyET.mjs} +4 -4
  15. package/dist/{relay-Cp8JGrdv.mjs → relay-DCGGYSdz.mjs} +2 -2
  16. package/dist/{remove-CSpT_nJH.mjs → remove-0L02cre2.mjs} +3 -3
  17. package/dist/{send-CHiYkM6X.mjs → send-C8pQfhED.mjs} +3 -3
  18. package/dist/{src-DhGLtYR-.mjs → src-BNhCiDQw.mjs} +1 -1
  19. package/dist/{src-CUeMUVwW.mjs → src-COHxAj7X.mjs} +1 -1
  20. package/dist/{src-BwnitlJh.mjs → src-DCCbIABO.mjs} +8 -8
  21. package/dist/{src-BsLHKQRc.mjs → src-DosUvy4B.mjs} +45 -8
  22. package/dist/ui/assets/app-D14lfYns.css +1 -0
  23. package/dist/ui/assets/{app-D4CoH-lh.js → app-DBYZFrdE.js} +19 -19
  24. package/dist/ui/assets/{index-DxDGdEwz.js → index-DXoKpYjA.js} +2 -2
  25. package/dist/ui/index.html +1 -1
  26. package/dist/{ui-BxE0L7V0.mjs → ui-Cdb05xJw.mjs} +4 -4
  27. package/dist/{usage-BuzDsEhq.mjs → usage-jYI2QHt7.mjs} +5 -5
  28. package/dist/{watch-CCj0vU3B.mjs → watch-D4lFXnHT.mjs} +6 -6
  29. package/dist/{workflows-BNCDD6J-.mjs → workflows-BF9fO-ER.mjs} +3 -3
  30. package/dist/{worktrees-DBBcaimX.mjs → worktrees-0iUiA6eD.mjs} +4 -4
  31. package/package.json +1 -1
  32. package/dist/ui/assets/app-Dt_tjFj6.css +0 -1
@@ -1,4 +1,4 @@
1
- import { Cn as placeFiles, Ct as runTree, Fn as writePlainFile, Ht as FEEDBACK_SEVERITIES, Jt as publishPost, Mn as estimateTokens, Nn as guardedBase, Pn as plainPathInside, Qt as targetOf, Vt as FEEDBACK_KINDS, Xt as fingerprint, cn as maskSecrets, g as parseVersion, h as isNewer, jn as LESSON_CAP_TOKENS, kn as inside, m as compareVersions, wn as placeFor } from "./src-BsLHKQRc.mjs";
1
+ import { Ct as runTree, En as placeFor, Fn as guardedBase, In as plainPathInside, Ln as writePlainFile, Nn as LESSON_CAP_TOKENS, Pn as estimateTokens, Qt as fingerprint, Tn as placeFiles, Ut as FEEDBACK_KINDS, Wt as FEEDBACK_SEVERITIES, Xt as publishPost, en as targetOf, g as parseVersion, h as isNewer, jn as inside, m as compareVersions, un as maskSecrets } from "./src-DosUvy4B.mjs";
2
2
  import path from "node:path";
3
3
  import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, writeFileSync } from "node:fs";
4
4
  import { homedir } from "node:os";
@@ -680,5 +680,5 @@ const registryShown = (registry) => {
680
680
  * fails when it is stale.
681
681
  */
682
682
  const ORK_NAME = "@krapht/ork";
683
- const ORK_VERSION = "1.0.0-alpha.7";
683
+ const ORK_VERSION = "1.0.0-alpha.8";
684
684
  export { placeOf as C, lessonPlaceOf as S, openFixRun as T, nodeSession as _, registryShown as a, recordNote as b, checkDue as c, pendingNotice as d, readUpdateCache as f, activeTree as g, writeUpdateCache as h, registryOf as i, fetchLatest as l, updateCachePath as m, ORK_VERSION as n, updateSwitchOff as o, refreshUpdateCache as p, isSwitchedOn as r, runInstall as s, ORK_NAME as t, newerVersion as u, previewPost as v, feedbackActions as w, acceptItem as x, checkNote as y };
package/dist/bin.mjs CHANGED
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
- import { $ as adoptedCalls, $n as isClaudeNode, An as projectRootOf, B as peerOf, Cn as placeFiles, Ct as runTree, D as inspectProject, Dn as shownPath, En as runDirOf, F as createCalls, Ft as PROJECT_FILE, Gn as serializeWorkflow, Gt as planPost, Ht as FEEDBACK_SEVERITIES, I as addressOf, It as gitRulesOf, Jn as WorkflowSchema, K as requestStop, L as endLink, Lt as loadProject, M as clearGitLocalEnv, N as parseInputPairs, P as resolveInputs, R as endLinksOf, Sn as newProjectId, St as runStatus, Tn as projectsHome, U as flattenTree, Ut as FEEDBACK_TARGETS, V as tellNode, Vn as beforeOf, Vt as FEEDBACK_KINDS, Xt as fingerprint, Yt as createFeedback, Zn as settingsOf, Zt as normalizeTitle, _ as lateTriggers, _n as catalogAgent, an as socketRoom, at as followEvents, bn as hasInRepoFiles, bt as liveStatus, cr as CLAUDE_DRIVERS, ct as planNodeSession, d as runningRunIds, dn as planMoveInto, dr as experimentsOn, et as detachResume, f as runningScript, fn as linkTools, fr as knownExperiments, gn as deleteAgent, gt as startRun, h as isNewer, hn as createAgent, ht as walkSummary, i as NOT_STARTED, in as socketPath, it as detachRun, kn as inside, l as planUpgrade, ln as planAgentMigration, lr as firstLine, lt as namingNoDriver, mn as toolsInUse, n as resolveBase, nt as listKey, on as wakeRun, or as AGENT_TOOL_LAYOUTS, pn as toolLinks, q as tellLiveRun, qt as sendPost, rn as serveRun, rr as INTEGRATIONS, sn as maskReplacer, sr as ORK_LAYOUT, t as createWorkspace, tt as resumable, u as releaseNotes, un as applySteps, ur as EXPERIMENTS, ut as sessionDriver, v as triggersReport, vn as loadAgents, vt as userMessageText, wn as placeFor, wt as templateOf, xn as inRepoPlace } from "./src-BsLHKQRc.mjs";
3
- import { a as formatEvent, c as createDecisionQueue, i as nestItems, n as formatRuns, o as formatRunEvent, r as formatTree, s as createTerminalHuman, t as ago } from "./format-DaROJUgG.mjs";
4
- import { C as placeOf, T as openFixRun, _ as nodeSession, b as recordNote, c as checkDue, d as pendingNotice, f as readUpdateCache, g as activeTree, h as writeUpdateCache, i as registryOf, l as fetchLatest, m as updateCachePath, n as ORK_VERSION, o as updateSwitchOff, p as refreshUpdateCache, r as isSwitchedOn, s as runInstall, t as ORK_NAME, u as newerVersion$1, v as previewPost, w as feedbackActions, x as acceptItem, y as checkNote } from "./__build_info__-BGoaUwLd.mjs";
5
- import { i as builtinWorkflowFile, n as pendingDecisions, r as builtinProblem, t as answerDecision } from "./decide-DsA6kOT7.mjs";
6
- import { n as newRunId, t as findRun } from "./find-ntyniv2E.mjs";
7
- import { a as write, c as openStore, i as style, l as storePath, n as cost, o as writeErr, s as isNodeEvent, t as confirm } from "./output-CwqlG1Le.mjs";
8
- import { n as listOrkWorktrees, t as createdWorktrees } from "./list-D9HPWLPH.mjs";
9
- import { a as planClean, t as applyClean } from "./clean-BPITM-6p.mjs";
2
+ import { $ as adoptedCalls, $n as settingsOf, $t as normalizeTitle, B as peerOf, Cn as inRepoPlace, Ct as runTree, D as inspectProject, Dn as projectsHome, En as placeFor, F as createCalls, Gt as FEEDBACK_TARGETS, I as addressOf, K as requestStop, L as endLink, Lt as PROJECT_FILE, M as clearGitLocalEnv, Mn as projectRootOf, N as parseInputPairs, On as runDirOf, P as resolveInputs, Qt as fingerprint, R as endLinksOf, Rt as gitRulesOf, Sn as hasInRepoFiles, St as runStatus, Tn as placeFiles, U as flattenTree, Un as beforeOf, Ut as FEEDBACK_KINDS, V as tellNode, Wt as FEEDBACK_SEVERITIES, Xn as WorkflowSchema, Yt as sendPost, Zt as createFeedback, _ as lateTriggers, _n as createAgent, an as serveRun, ar as INTEGRATIONS, at as followEvents, bn as loadAgents, bt as liveStatus, cn as wakeRun, cr as AGENT_TOOL_LAYOUTS, ct as planNodeSession, d as runningRunIds, dn as planAgentMigration, dr as firstLine, et as detachResume, f as runningScript, fn as applySteps, fr as EXPERIMENTS, gn as toolsInUse, gt as startRun, h as isNewer, hn as toolLinks, ht as walkSummary, i as NOT_STARTED, it as detachRun, jn as inside, kn as shownPath, kt as nestItems, l as planUpgrade, ln as maskReplacer, lr as ORK_LAYOUT, lt as namingNoDriver, mn as linkTools, mr as knownExperiments, n as resolveBase, nt as listKey, on as socketPath, pn as planMoveInto, pr as experimentsOn, q as tellLiveRun, qn as serializeWorkflow, qt as planPost, sn as socketRoom, t as createWorkspace, tr as isClaudeNode, tt as resumable, u as releaseNotes, ur as CLAUDE_DRIVERS, ut as sessionDriver, v as triggersReport, vn as deleteAgent, vt as userMessageText, wn as newProjectId, wt as templateOf, yn as catalogAgent, zt as loadProject } from "./src-DosUvy4B.mjs";
3
+ import { a as formatRunEvent, i as formatEvent, n as formatRuns, o as createTerminalHuman, r as formatTree, s as createDecisionQueue, t as ago } from "./format-sGEQmQid.mjs";
4
+ import { C as placeOf, T as openFixRun, _ as nodeSession, b as recordNote, c as checkDue, d as pendingNotice, f as readUpdateCache, g as activeTree, h as writeUpdateCache, i as registryOf, l as fetchLatest, m as updateCachePath, n as ORK_VERSION, o as updateSwitchOff, p as refreshUpdateCache, r as isSwitchedOn, s as runInstall, t as ORK_NAME, u as newerVersion$1, v as previewPost, w as feedbackActions, x as acceptItem, y as checkNote } from "./__build_info__-B83zdwIv.mjs";
5
+ import { i as builtinWorkflowFile, n as pendingDecisions, r as builtinProblem, t as answerDecision } from "./decide-BaEOo7sO.mjs";
6
+ import { n as newRunId, t as findRun } from "./find-DDAkEoda.mjs";
7
+ import { a as write, c as openStore, i as style, l as storePath, n as cost, o as writeErr, s as isNodeEvent, t as confirm } from "./output-D1wMNIly.mjs";
8
+ import { n as listOrkWorktrees, t as createdWorktrees } from "./list-CZTh_wdE.mjs";
9
+ import { a as planClean, t as applyClean } from "./clean-NtapkN2x.mjs";
10
10
  import { c as subcommandsOf, i as argsOf, n as groupedEntries, o as publicArgs, s as resolved, t as groupOf } from "./help-groups-BwYoAWsh.mjs";
11
- import { _ as namedMcpEntries, a as builtinExecutors, d as maskedEnv, f as maskedNamesOfRun, g as clearOutputFiles, h as sessionEnv, i as onPath, l as clearStateFiles, m as runScrubber, n as missingProgramMessage, r as missingPrograms, t as envProblems, v as resultOf } from "./src-CUeMUVwW.mjs";
12
- import { c as registeredProjects, i as refusedBuiltin, n as WORKFLOW_SUFFIX, o as workflowArg, s as projectAt, t as WORKFLOW_DIR } from "./workflows-BNCDD6J-.mjs";
13
- import { a as validate, c as warningLines, i as loadWorkflow, o as validateFile, r as formatReport, s as walkLoaded, t as context } from "./context-CZNM454F.mjs";
14
- import { i as runLimits, r as limitsRefusal, t as chatNotice } from "./limits-BKzVMwkt.mjs";
15
- import { i as decideRefusal, n as chatRefusal } from "./in-a-run-D_fnj1Mw.mjs";
11
+ import { _ as namedMcpEntries, a as builtinExecutors, d as maskedEnv, f as maskedNamesOfRun, g as clearOutputFiles, h as sessionEnv, i as onPath, l as clearStateFiles, m as runScrubber, n as missingProgramMessage, r as missingPrograms, t as envProblems, v as resultOf } from "./src-COHxAj7X.mjs";
12
+ import { c as registeredProjects, i as refusedBuiltin, n as WORKFLOW_SUFFIX, o as workflowArg, s as projectAt, t as WORKFLOW_DIR } from "./workflows-BF9fO-ER.mjs";
13
+ import { a as validate, c as warningLines, i as loadWorkflow, o as validateFile, r as formatReport, s as walkLoaded, t as context } from "./context-C5wQNjp9.mjs";
14
+ import { i as runLimits, r as limitsRefusal, t as chatNotice } from "./limits-DezRXN0Z.mjs";
15
+ import { i as decideRefusal, n as chatRefusal } from "./in-a-run-DENitTUe.mjs";
16
16
  import path from "node:path";
17
17
  import { stringify } from "yaml";
18
18
  import { z } from "zod";
@@ -1634,7 +1634,7 @@ const flagValues = (rawArgs, flag) => {
1634
1634
  };
1635
1635
  const isDriver = (value) => CLAUDE_DRIVERS.some((d) => d.id === value);
1636
1636
  /** Loads the drivers only when a run starts, so other commands stay fast. */
1637
- const loadRuntime = async (driver) => (await import("./src-DhGLtYR-.mjs")).createRuntime(driver, sessionEnv(process.env));
1637
+ const loadRuntime = async (driver) => (await import("./src-BNhCiDQw.mjs")).createRuntime(driver, sessionEnv(process.env));
1638
1638
  /**
1639
1639
  * Ctrl-C asks the run to stop, and so does a terminal closing or a polite kill,
1640
1640
  * so that the run ends tidily and leaves no result unscrubbed.
@@ -2321,7 +2321,7 @@ const ORK_SKILLS = {
2321
2321
  principles: "---\nname: principles\ndescription: Use when deciding how to split work into an Ork workflow - which steps are programs, which are Claude sessions, where a person decides - so it costs less than doing it by hand and can't go wrong quietly.\n---\n\n# How Ork splits work\n\nOrk exists to do long jobs for less than doing them by hand, and safely. Four\nrules decide the shape of a workflow.\n\n## 1. A program for what a program can do\n\nA model turn is for judgment. Anything a program can decide, it should: run the\ntests, read a pull request's state, count what changed, wait for CI.\n\n- **A tool node** (`tool.shell`, `tool.git`, `tool.gh`, `tool.aws`) or an\n **`mcp.call`** does it with no session. With `output: { format: json }`, its\n answer routes the run: `when: \"json.state == 'OPEN'\"`.\n- **`verify:`** on a session runs a check before its report counts, so a session\n can't claim success past failing tests. **`before:`** hands it what a program\n found, so it doesn't spend turns finding it.\n- **`watch:`** waits on CI or a review with a program that looks every few\n seconds; hours of waiting cost nothing.\n- **`notify:`** lets a program tell a running session what it found, with no\n model turn to carry the news.\n\n## 2. Spend where it pays\n\n- A small model and low effort for a narrow task (`model: haiku`,\n `effort: low`); the large ones where thinking pays.\n- `budgetUsd` on each session and on the run (`limits.budgetUsd`). A loop of\n sessions without a budget or `limits.timeout` gets a warning, for good reason.\n- Give a session what it needs in its `prompt` and `before:`, rather than\n letting it search; and `isolation: readonly` for a reviewer that only reads.\n\n## 3. Make a mistake impossible before checking for it\n\n- Declare what a node says: `output.schema` lists on tool JSON and Claude\n reports (`verdict: [approve, escalate]`). Conditions then compare against a\n closed list, and a run fails a value off it rather than matching nothing.\n- A verdict is a declared field, never words to search a summary for.\n- Give each condition its opposite, and each failure a handler (`when: \"!ok\"`).\n- Check every draft with Ork's `check` tool until it's clean.\n\n## 4. A person decides what can't be undone\n\nMerging, deploying, publishing, spending a lot: put a `human.gate` before it,\nwith the safe option `recommended`. For a run nobody watches, give it a\n`timeout` and the safe `default`. You never answer a gate yourself.\n\n## An example\n\nA review that a program checks first, and a person signs off:\n\n```yaml\nschemaVersion: 1\nname: careful-review\ndescription: Lint with a program, review with a small model, and ask before merging.\ninputs:\n pr:\n type: string\n required: true\nlimits:\n budgetUsd: 3\nnodes:\n lint:\n type: tool.shell\n command: pnpm lint\n allow: [pnpm lint]\n review:\n type: claude.worker\n prompt: \"Review pull request {{inputs.pr}}. The linter passed.\"\n model: haiku\n effort: low\n isolation: readonly\n budgetUsd: 1\n output:\n schema:\n verdict: [approve, escalate]\n ask:\n type: human.gate\n question: \"Merge pull request {{inputs.pr}}? The review says {{nodes.review.output.verdict}}.\"\n options: [merge, wait]\n recommended: wait\n merge:\n type: tool.gh\n command: pr merge {{inputs.pr}} --squash\n allow: [pr merge]\nedges:\n - lint -> review\n - review -> ask\n - from: ask\n to: merge\n when: \"choice == 'merge'\"\n```\n\n`lint` costs nothing, `review` is a small model with a cap, and nothing merges\nwithout a person.\n",
2322
2322
  run: "---\nname: run\ndescription: Use when starting, following or explaining an Ork run - what it's doing, why it failed, what it cost, and what waits on the person - and when the person asks about their Ork runs.\n---\n\n# Running and following Ork workflows\n\nOrk runs workflows on the person's machine with their accounts, so a run spends\ntheir money and can push, merge or deploy. Start one only when they ask, and\nnever answer a decision for them.\n\n## Starting\n\n1. Find it: Ork's `workflows` tool gives each workflow's name and inputs.\n2. Check it first with `check` (`workflow: <name>`). Don't start one with an\n error.\n3. Start it with `start_run`, giving every required input. Claude Code asks the\n person first, unless they've allowed it. It answers with the run's id; the run goes on in the\n background, whatever happens to this conversation.\n\nWithout Ork's tools: `ork run <workflow> --detach --input name=value`.\n\n## Following\n\n- `run` gives a run's status, what it waits on, its cost so far, and each\n node's state. `runs` lists the newest runs.\n- `run_events` gives its newest events; `node` narrows them, and `last` or\n `after` widens them. A `node.finished` event with `ok: false` says why a node\n failed.\n- `explain_context` says what a node's session was given: its agent,\n instructions, skills and files. Use it when a node didn't know something.\n- `usage` says what runs spent, by workflow and model, and how close the limits\n are.\n\nSay what you found plainly: which node, what it said, and what it cost. Quote a\nnode's own words rather than retelling them.\n\n## What only the person does\n\n- **Decisions.** `decisions` lists the questions waiting on them: a gate, a loop\n that ran out of rounds, a permission. Tell them what each asks, the options,\n and the recommended one, and that they answer in `ork ui` or with\n `ork decide` in their own terminal. Don't answer one: never run\n `ork decide --id … --choose …`; with Ork's plugin, a hook stops it.\n- **Stopping, pausing, resuming.** Tell them the command: `ork stop <run>`,\n `ork pause <run>`, `ork continue <run>`, `ork resume <run>`. A node can be\n stopped alone with `--node <id>`.\n\n## Without Ork's tools\n\n| Want | Command |\n| ---------------------- | ------------------------------ |\n| Runs, newest first | `ork ps` |\n| A run's transcript | `ork logs <run>` (`--follow`) |\n| Its nodes and cost | `ork tree <run>` |\n| What runs spent | `ork usage` |\n| What waits on a person | `ork decide --list` |\n| A node's context | `ork context explain <wf> <n>` |\n",
2323
2323
  setup: "---\nname: setup\ndescription: Use when the person asks you to set up Ork, install it, or get started with it in a repository - checking it's installed, setting up the project, making Ork's tools available to you, and a first workflow.\n---\n\n# Setting up Ork\n\nOrk runs workflows on the person's machine with their own accounts. Setting it\nup changes their machine and their repository, so say what each step does and\nask before it. Work through these in order, and stop where they say no.\n\n## 1. Check\n\n```sh\nork --version\nork doctor\n```\n\n- **No `ork`:** it needs Node 24.20 or later (`node --version`). The install is\n `npm install --global @krapht/ork`; show it and run it only when they say\n yes. The guide:\n https://github.com/mimshins/ork/blob/main/docs/getting-started/installation.md\n- **Read `ork doctor` to them.** It needs git, a git repository with a commit,\n and one Claude driver. Don't run `git init` or a commit without asking.\n- **A driver not ready:** they log in themselves, with `claude` (the CLI\n driver), or by setting `ANTHROPIC_API_KEY` or a cloud provider in their own\n shell (the SDK driver). Never ask for a key, never take one pasted to you, and\n never write one into a file or a command. `gh` and `aws` are optional, and\n their logins are their own too (`gh auth login`, `aws sso login`).\n\n## 2. The project\n\n- **`ork init`** keeps Ork's files in the repository, in `.ork/`, committed with\n the code. It adds `.ork/runs/` to `.gitignore`, links `.claude/` and similar\n folders to `.ork/`, and writes a starter workflow, `hello`.\n- **`ork register`** keeps them beside it, in `~/.ork/projects/<id>/`, and\n writes nothing into the repository. For a repository whose process isn't\n theirs to change, or to try Ork first.\n\nExplain both and ask which. Skip the question when the repository decides it: a\n`.ork/` folder means `ork init` has run (`ork projects` lists what's\nregistered). Neither overwrites a file.\n\n## 3. Make Ork available to you\n\nIf Ork's tools (`workflows`, `check`) already answer you, skip this. Otherwise,\nby where you run, and asking before each change to a config:\n\n- **Claude Code:** Ork's plugin brings the skills and the tools. The person\n types these themselves:\n\n ```\n /plugin marketplace add mimshins/ork\n /plugin install ork@ork\n ```\n\n Or, in a project set up with `ork init`, the skills in the repository for\n everyone who clones it, then the tools:\n\n ```sh\n ork init --skills\n claude mcp add ork -- ork mcp\n ```\n\n New tools start when they restart Claude Code or reconnect `ork` in `/mcp`;\n so does the plugin's, once `ork` is installed.\n\n- **Another MCP client:** add a server named `ork` with command `ork` and args\n `[\"mcp\"]` to its MCP config, where its own docs say. Its tools find the\n project by its id, from `ork projects`.\n- **A shell only:** use the CLI. `ork --help` and each command's `--help` say\n what it takes.\n\n## 4. A first workflow\n\nOffer to write one for a task they name. Follow `/ork:write`, check each draft\n(the `check` tool, or `ork validate <file>`) until it has no error, then save\nit. Don't start it: a run spends their money. Start it only when they say so,\nin the background with its inputs (`start_run`, or\n`ork run <name> --detach --input name=value`), and follow it with `/ork:run`.\n\n## 5. Show them `ork ui`\n\nTell them to run `ork ui` in their own terminal: their runs, graphs and logs in\nthe browser, and where they answer what a run asks.\n\n## Never\n\n- Ask for, store or pass on a password, key or token.\n- Answer a run's decision: they answer in `ork ui` or with `ork decide` in\n their own terminal.\n- Install, edit a config, or start a run without a yes.\n",
2324
- write: "---\nname: write\ndescription: Use when writing or changing an Ork workflow (a `.ork/workflows/*.ork.yaml` file) - its nodes, edges, conditions and loops - and checking each draft until Ork accepts it.\n---\n\n# Writing an Ork workflow\n\nAn Ork workflow is one YAML file in the project, `.ork/workflows/<name>.ork.yaml`.\nIt names the nodes (Claude sessions, programs, a person's decisions) and the\nedges that carry work between them. Ork runs it on the person's machine with\ntheir own accounts.\n\n## How to work\n\n1. **Look first.** Ork's `workflows` tool lists the project's workflows; read\n one that's close. `agents` lists the agents a node can use. Before you split\n the work, read `/ork:principles`: a program where a program will do, a\n session only for judgment.\n2. **Don't guess a field.** `workflow_format` gives the format; ask it for one\n node type (`nodeType: \"human.gate\"`) to see that type's fields.\n3. **Check every draft** with Ork's `check` tool (`text`, or `workflow` for a\n file), and fix what it says until it has no error. Read its warnings: they\n mean something. Without Ork's tools, run `ork validate <file>`.\n4. **Then save the file**, beginning with the schema line below, so editors can\n check it too.\n\n## The shape of a file\n\n```yaml\n# yaml-language-server: $schema=https://raw.githubusercontent.com/mimshins/ork/main/packages/schema/workflow.schema.json\nschemaVersion: 1\nname: fix-and-ship\ndescription: Fix a failing test, check it with the test suite, and ask before opening a pull request.\ninputs:\n issue:\n type: string\n required: true\n description: What fails.\ndefaults:\n model: sonnet\n budgetUsd: 2\nlimits:\n budgetUsd: 10\nnodes:\n fix:\n type: claude.worker\n prompt: \"Fix this, and keep the change small: {{inputs.issue}}\"\n tests:\n type: tool.shell\n command: pnpm test\n allow: [pnpm test]\n ask:\n type: human.gate\n question: \"Open a pull request for {{nodes.fix.output.branch}}?\"\n options: [open, hold]\n recommended: hold\n pr:\n type: tool.gh\n command: pr create --fill --head {{nodes.fix.output.branch}}\n allow: [pr create]\nedges:\n - fix -> tests\n - from: tests\n to: fix\n when: \"!ok\"\n maxRounds: 2\n - from: tests\n to: ask\n when: ok\n - from: ask\n to: pr\n when: \"choice == 'open'\"\n```\n\nNode ids are lowercase: letters, digits, `-` and `_`. Secrets never go in the\nfile: a tool reads one with `env:` and `{{env.NAME}}`.\n\n## Nodes\n\n| Type | Does |\n| --------------------------------- | ------------------------------------------------------------------- |\n| `claude.worker` | A Claude session that does one task and reports |\n| `claude.leader` | A session that plans and delegates to the nodes it owns (`parent:`) |\n| `claude.subagent` | A subagent inside its parent's session; it takes no edges |\n| `tool.shell` | Any program, run without a shell; `allow:` lists command prefixes |\n| `tool.git`, `tool.gh`, `tool.aws` | The person's own `git`, `gh`, `aws`, with an allow list |\n| `mcp.call` | One tool call on an MCP server, with no session |\n| `human.gate` | A question with options and a recommended one |\n| `control.join` | Waits for its inputs: `all` (default), `any`, or `n` of them |\n| `control.router`, `control.split` | Pass their input on; a router takes its first matching edge |\n| `workflow.call` | Starts another workflow as its own run |\n\n- **A Claude node reports** `status` (`pass`, `changes_requested`, `done` or\n `fail`), `summary`, `artifacts`, `branch`, and any field its `output.schema`\n declares, such as `verdict: [approve, escalate]`. For another verdict, declare\n a field: `status` can't take other values.\n- **A tool node reports** `exitCode`, `stdout`, `stderr`, and with\n `output: { format: json, schema: { state: [OPEN, CLOSED] } }` its JSON as\n `json`. Declare the fields you read: a run then checks them, and a typo can't\n pass.\n- **A gate reports** `choice` and `answeredBy`. A `timeout` needs a `default`.\n\n## Edges and conditions\n\n- `a -> b`, `a -> b, c`, `b, c -> j` are plain edges, taken when the source\n succeeded. A failed node takes no plain edge: handle a failure with\n `when: \"!ok\"`, or `status == 'fail'` on a Claude node.\n- `{ from: a, to: b, when: \"...\" }` is taken when the condition holds. A bare\n name reads the source's output: `when: \"verdict == 'approve'\"`. Quote any\n condition that starts with `!`, or YAML reads it as a tag.\n- Conditions have `==`, `!=`, `<`, `>`, `&&`, `||`, `!`, and `any`, `all`,\n `count`, `len`, `contains`. A join's `statuses` suits `any(statuses, 'fail')`.\n- A node runs when any edge into it is taken; only a join waits. A node with no\n way in taken is skipped, and so is what follows it.\n- Templates, `{{inputs.x}}`, `{{nodes.a.output.field}}`, `{{run.id}}`, go in\n `prompt`, `instructions`, `command`, `cwd` and `question`. Each value stays\n one argument of a command, so it can't inject one.\n\n## Loops\n\nEvery cycle needs an edge with `maxRounds`. Give the way back a condition and\nthe way out its opposite, as `!ok` and `ok` above; a plain edge beside a loop\nfires every round. When a loop runs out, Ork asks a person what to do.\n\n## What `check` refuses, and why\n\n- **A value the source can't have** (`when.value`): `status == 'failed'` (it's\n `fail`), a gate's `choice == 'aprove'` for `approve`, a value outside a\n declared list. The message names the values it can have.\n- **A loop no condition ends**, a plain edge beside a loop, a loop of sessions\n with no `limits.budgetUsd` or `limits.timeout`: warnings, each worth fixing.\n- **`no way the walk tried reaches x`**: Ork tried every way through, and none\n got to `x`. A join waiting on a branch a first-match router never takes is\n the usual cause.\n"
2324
+ write: "---\nname: write\ndescription: Use when writing or changing an Ork workflow (a `.ork/workflows/*.ork.yaml` file) - its nodes, edges, conditions and loops - and checking each draft until Ork accepts it.\n---\n\n# Writing an Ork workflow\n\nAn Ork workflow is one YAML file in the project, `.ork/workflows/<name>.ork.yaml`.\nIt names the nodes (Claude sessions, programs, a person's decisions) and the\nedges that carry work between them. Ork runs it on the person's machine with\ntheir own accounts.\n\n## How to work\n\n1. **Look first.** Ork's `workflows` tool lists the project's workflows; read\n one that's close. `agents` lists the agents a node can use. Before you split\n the work, read `/ork:principles`: a program where a program will do, a\n session only for judgment.\n2. **Don't guess a field.** `workflow_format` gives the format; ask it for one\n node type (`nodeType: \"human.gate\"`) to see that type's fields.\n3. **Check every draft** with Ork's `check` tool (`text`, or `workflow` for a\n file), and fix what it says until it has no error. Read its warnings: they\n mean something. Without Ork's tools, run `ork validate <file>`.\n4. **Then save the file**, beginning with the schema line below, so editors can\n check it too.\n\n## The shape of a file\n\n```yaml\n# yaml-language-server: $schema=https://raw.githubusercontent.com/mimshins/ork/main/packages/schema/workflow.schema.json\nschemaVersion: 1\nname: fix-and-ship\ndescription: Fix a failing test, check it with the test suite, and ask before opening a pull request.\ninputs:\n issue:\n type: string\n required: true\n description: What fails.\ndefaults:\n model: sonnet\n budgetUsd: 2\nlimits:\n budgetUsd: 10\nnodes:\n fix:\n type: claude.worker\n prompt: \"Fix this, and keep the change small: {{inputs.issue}}\"\n tests:\n type: tool.shell\n command: pnpm test\n allow: [pnpm test]\n ask:\n type: human.gate\n question: \"Open a pull request for {{nodes.fix.output.branch}}?\"\n options: [open, hold]\n recommended: hold\n pr:\n type: tool.gh\n command: pr create --fill --head {{nodes.fix.output.branch}}\n allow: [pr create]\nedges:\n - fix -> tests\n - from: tests\n to: fix\n when: \"!ok\"\n maxRounds: 2\n - from: tests\n to: ask\n when: ok\n - from: ask\n to: pr\n when: \"choice == 'open'\"\n```\n\nNode ids are lowercase: letters, digits, `-` and `_`. Secrets never go in the\nfile: a tool reads one with `env:` and `{{env.NAME}}`.\n\n## Nodes\n\n| Type | Does |\n| --------------------------------- | ------------------------------------------------------------------- |\n| `claude.worker` | A Claude session that does one task and reports |\n| `claude.leader` | A session that plans and delegates to the nodes it owns (`parent:`) |\n| `claude.subagent` | A subagent inside its parent's session; it takes no edges |\n| `tool.shell` | Any program, run without a shell; `allow:` lists command prefixes |\n| `tool.git`, `tool.gh`, `tool.aws` | The person's own `git`, `gh`, `aws`, with an allow list |\n| `mcp.call` | One tool call on an MCP server, with no session |\n| `human.gate` | A question with options and a recommended one |\n| `control.join` | Waits for its inputs: `all` (default), `any`, or `n` of them |\n| `control.router`, `control.split` | Pass their input on; a router takes its first matching edge |\n| `workflow.call` | Starts another workflow as its own run |\n\nA worker, tool node, `mcp.call` or `workflow.call` can run once per entry of a\nlist: see [One node per item](#one-node-per-item).\n\n- **A Claude node reports** `status` (`pass`, `changes_requested`, `done` or\n `fail`), `summary`, `artifacts`, `branch`, and any field its `output.schema`\n declares, such as `verdict: [approve, escalate]`. For another verdict, declare\n a field: `status` can't take other values.\n- **A tool node reports** `exitCode`, `stdout`, `stderr`, and with\n `output: { format: json, schema: { state: [OPEN, CLOSED] } }` its JSON as\n `json`. Declare the fields you read: a run then checks them, and a typo can't\n pass.\n- **A gate reports** `choice` and `answeredBy`. A `timeout` needs a `default`.\n\n## Edges and conditions\n\n- `a -> b`, `a -> b, c`, `b, c -> j` are plain edges, taken when the source\n succeeded. A failed node takes no plain edge: handle a failure with\n `when: \"!ok\"`, or `status == 'fail'` on a Claude node.\n- `{ from: a, to: b, when: \"...\" }` is taken when the condition holds. A bare\n name reads the source's output: `when: \"verdict == 'approve'\"`. Quote any\n condition that starts with `!`, or YAML reads it as a tag.\n- Conditions have `==`, `!=`, `<`, `>`, `&&`, `||`, `!`, and `any`, `all`,\n `count`, `len`, `contains`. A join's `statuses` suits `any(statuses, 'fail')`.\n- A node runs when any edge into it is taken; only a join waits. A node with no\n way in taken is skipped, and so is what follows it.\n- Templates, `{{inputs.x}}`, `{{nodes.a.output.field}}`, `{{run.id}}`, go in\n `prompt`, `instructions`, `command`, `cwd` and `question`. Each value stays\n one argument of a command, so it can't inject one.\n\n## One node per item\n\n`forEach` runs a worker, a tool node, an `mcp.call` or a `workflow.call` once\nper entry of a list, with no model turn to fan out or gather. Not a leader, a\ngate, a subagent or a control node.\n\n```yaml\nplan:\n type: claude.worker\n prompt: \"Split this into at most 6 independent tasks: {{inputs.goal}}\"\n isolation: readonly\n output:\n schema:\n tasks:\n list: { title: string, detail: string } # declare the list and its shape\nbuild:\n type: claude.worker\n prompt: \"Task {{index}}: {{item.title}}. {{item.detail}}\"\n isolation: worktree\n forEach:\n from: \"{{nodes.plan.output.tasks}}\" # exactly one path to a declared list\n maxItems: 6 # required with `from`: the cap on sessions started\n maxParallel: 3\n```\n\n- `forEach: { items: [a, b] }` takes a list written in the file instead.\n- `{{item}}` and `{{index}}` work only in a node with `forEach`, in `prompt`,\n `command`, `arguments`, `inputs`, `env` and `ref`. A program also gets\n `ORK_ITEM` and `ORK_INDEX`.\n- The next node reads `items`, `results` (each item's output, `summary`,\n `branch`), `statuses` and `count`: `{{nodes.build.output.results}}`,\n `when: \"all(statuses, 'pass')\"`. Items follow no edges; the node does.\n- `onFailure: finish` (default) runs every item; `stop` starts no more after a\n failure. A list over `maxItems` makes Ork ask a person.\n- Declare the source's `list`, or `check` warns `forEach.undeclared`. Fix\n `forEach.not-list`, `forEach.order` and `item.field` errors; they name the\n field or node.\n\n## Loops\n\nEvery cycle needs an edge with `maxRounds`. Give the way back a condition and\nthe way out its opposite, as `!ok` and `ok` above; a plain edge beside a loop\nfires every round. When a loop runs out, Ork asks a person what to do.\n\n## What `check` refuses, and why\n\n- **A value the source can't have** (`when.value`): `status == 'failed'` (it's\n `fail`), a gate's `choice == 'aprove'` for `approve`, a value outside a\n declared list. The message names the values it can have.\n- **A loop no condition ends**, a plain edge beside a loop, a loop of sessions\n with no `limits.budgetUsd` or `limits.timeout`: warnings, each worth fixing.\n- **`no way the walk tried reaches x`**: Ork tried every way through, and none\n got to `x`. A join waiting on a branch a first-match router never takes is\n the usual cause.\n"
2325
2325
  };
2326
2326
  // src/project/init-skills.ts
2327
2327
  /**
@@ -4550,27 +4550,27 @@ const main = defineCommand({
4550
4550
  ps,
4551
4551
  logs,
4552
4552
  tree,
4553
- usage: () => import("./usage-BuzDsEhq.mjs").then((module) => module.usage),
4554
- prune: () => import("./usage-BuzDsEhq.mjs").then((module) => module.prune),
4553
+ usage: () => import("./usage-jYI2QHt7.mjs").then((module) => module.usage),
4554
+ prune: () => import("./usage-jYI2QHt7.mjs").then((module) => module.prune),
4555
4555
  decide,
4556
- relay: () => import("./relay-Cp8JGrdv.mjs").then((module) => module.relay),
4557
- pause: () => import("./pause-DhgKQORW.mjs").then((module) => module.pause),
4558
- continue: () => import("./pause-DhgKQORW.mjs").then((module) => module.continueRun),
4556
+ relay: () => import("./relay-DCGGYSdz.mjs").then((module) => module.relay),
4557
+ pause: () => import("./pause-HuQhHyET.mjs").then((module) => module.pause),
4558
+ continue: () => import("./pause-HuQhHyET.mjs").then((module) => module.continueRun),
4559
4559
  stop,
4560
4560
  chat,
4561
- send: () => import("./send-CHiYkM6X.mjs").then((module) => module.send),
4561
+ send: () => import("./send-C8pQfhED.mjs").then((module) => module.send),
4562
4562
  resume,
4563
4563
  feedback,
4564
4564
  context,
4565
- worktrees: () => import("./worktrees-DBBcaimX.mjs").then((module) => module.worktrees),
4566
- wt: () => import("./worktrees-DBBcaimX.mjs").then((module) => module.worktrees),
4567
- watch: () => import("./watch-CCj0vU3B.mjs").then((module) => module.watch),
4568
- mcp: () => import("./mcp-BFl3cIDp.mjs").then((module) => module.mcp),
4569
- ui: () => import("./ui-BxE0L7V0.mjs").then((module) => module.ui),
4565
+ worktrees: () => import("./worktrees-0iUiA6eD.mjs").then((module) => module.worktrees),
4566
+ wt: () => import("./worktrees-0iUiA6eD.mjs").then((module) => module.worktrees),
4567
+ watch: () => import("./watch-D4lFXnHT.mjs").then((module) => module.watch),
4568
+ mcp: () => import("./mcp-B2DW26HO.mjs").then((module) => module.mcp),
4569
+ ui: () => import("./ui-Cdb05xJw.mjs").then((module) => module.ui),
4570
4570
  doctor,
4571
4571
  upgrade,
4572
- completion: () => import("./completion-CCn8xWmO.mjs").then((module) => module.completion),
4573
- __complete: () => import("./completion-CCn8xWmO.mjs").then((module) => module.completeCommand(main))
4572
+ completion: () => import("./completion-DAQMrf1u.mjs").then((module) => module.completion),
4573
+ __complete: () => import("./completion-DAQMrf1u.mjs").then((module) => module.completeCommand(main))
4574
4574
  }
4575
4575
  });
4576
4576
  // src/bin.ts
@@ -4588,7 +4588,7 @@ const main = defineCommand({
4588
4588
  clearGitLocalEnv();
4589
4589
  const argv = process.argv.slice(2);
4590
4590
  if (argv[0] === "__complete") {
4591
- const { printCompletions } = await import("./completion-CCn8xWmO.mjs");
4591
+ const { printCompletions } = await import("./completion-DAQMrf1u.mjs");
4592
4592
  await printCompletions(main, argv.slice(1));
4593
4593
  } else if (process.env["ORK_UPDATE_CHECK_CHILD"] === "1") await runUpdateChild();
4594
4594
  else {
@@ -1,4 +1,4 @@
1
- import { A as gitOk, O as removeWorktree } from "./src-BsLHKQRc.mjs";
1
+ import { A as gitOk, O as removeWorktree } from "./src-DosUvy4B.mjs";
2
2
  // ../core/src/worktree/clean.ts
3
3
  /**
4
4
  * @file What `ork worktrees clean` and `ork worktrees remove` do with what
@@ -1,9 +1,9 @@
1
- import { Cn as placeFiles, bt as liveStatus, cr as CLAUDE_DRIVERS, tr as NodeIdSchema, wn as placeFor } from "./src-BsLHKQRc.mjs";
2
- import { a as builtinWorkflowNames, n as pendingDecisions, o as builtinWorkflowText, s as isBuiltinArg } from "./decide-DsA6kOT7.mjs";
3
- import { t as findRun } from "./find-ntyniv2E.mjs";
4
- import { c as openStore, l as storePath, o as writeErr } from "./output-CwqlG1Le.mjs";
1
+ import { En as placeFor, Tn as placeFiles, bt as liveStatus, rr as NodeIdSchema, ur as CLAUDE_DRIVERS } from "./src-DosUvy4B.mjs";
2
+ import { a as builtinWorkflowNames, n as pendingDecisions, o as builtinWorkflowText, s as isBuiltinArg } from "./decide-BaEOo7sO.mjs";
3
+ import { t as findRun } from "./find-DDAkEoda.mjs";
4
+ import { c as openStore, l as storePath, o as writeErr } from "./output-D1wMNIly.mjs";
5
5
  import { a as findEntry, c as subcommandsOf, d as SHELL_SCRIPTS, l as COMPLETE_COMMAND, n as groupedEntries, r as argInfoOf, t as groupOf, u as SHELLS } from "./help-groups-BwYoAWsh.mjs";
6
- import { a as resolveWorkflowArg, n as WORKFLOW_SUFFIX } from "./workflows-BNCDD6J-.mjs";
6
+ import { a as resolveWorkflowArg, n as WORKFLOW_SUFFIX } from "./workflows-BF9fO-ER.mjs";
7
7
  import path from "node:path";
8
8
  import { parse } from "yaml";
9
9
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
@@ -1,6 +1,6 @@
1
- import { C as workflowTextHash, Cn as placeFiles, On as workflowDirOf, S as readProjectTriggers, ht as walkSummary, jn as LESSON_CAP_TOKENS, mt as walkChecks, pt as checkWorkflowText, st as explainSession, wn as placeFor } from "./src-BsLHKQRc.mjs";
2
- import { a as write, i as style, r as plain } from "./output-CwqlG1Le.mjs";
3
- import { c as registeredProjects, i as refusedBuiltin, o as workflowArg, r as findWorkflowFiles, s as projectAt } from "./workflows-BNCDD6J-.mjs";
1
+ import { An as workflowDirOf, C as workflowTextHash, En as placeFor, Nn as LESSON_CAP_TOKENS, S as readProjectTriggers, Tn as placeFiles, ht as walkSummary, mt as walkChecks, pt as checkWorkflowText, st as explainSession } from "./src-DosUvy4B.mjs";
2
+ import { a as write, i as style, r as plain } from "./output-D1wMNIly.mjs";
3
+ import { c as registeredProjects, i as refusedBuiltin, o as workflowArg, r as findWorkflowFiles, s as projectAt } from "./workflows-BF9fO-ER.mjs";
4
4
  import path from "node:path";
5
5
  import { readFileSync } from "node:fs";
6
6
  import { defineCommand } from "citty";
@@ -1,4 +1,4 @@
1
- import { Cn as placeFiles, Fn as writePlainFile, Nn as guardedBase, Pn as plainPathInside, bt as liveStatus, in as socketPath, on as wakeRun } from "./src-BsLHKQRc.mjs";
1
+ import { Fn as guardedBase, In as plainPathInside, Ln as writePlainFile, Tn as placeFiles, bt as liveStatus, cn as wakeRun, on as socketPath } from "./src-DosUvy4B.mjs";
2
2
  import path from "node:path";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  import { createHash } from "node:crypto";
@@ -1,4 +1,4 @@
1
- import { wn as placeFor } from "./src-BsLHKQRc.mjs";
1
+ import { En as placeFor } from "./src-DosUvy4B.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  // ../core/src/remote/find.ts
4
4
  /**
@@ -1,5 +1,5 @@
1
- import { bt as liveStatus, cn as maskSecrets } from "./src-BsLHKQRc.mjs";
2
- import { i as style, n as cost } from "./output-CwqlG1Le.mjs";
1
+ import { Ot as isItem, bt as liveStatus, un as maskSecrets } from "./src-DosUvy4B.mjs";
2
+ import { i as style, n as cost } from "./output-D1wMNIly.mjs";
3
3
  import { createInterface } from "node:readline/promises";
4
4
  // ../core/src/control/queue.ts
5
5
  const PERMISSION_OPTIONS = [{
@@ -617,25 +617,6 @@ const stateText = (node) => {
617
617
  }
618
618
  return node.state;
619
619
  };
620
- const isItem = (node) => node.template !== void 0 && /\.\d+$/u.test(node.id);
621
- /**
622
- * Moves each item of a node with `forEach` (`build.2`) under its node, in list
623
- * order, from beside it or under its owner, where the events put it.
624
- */
625
- const nestItems = (roots) => {
626
- const all = [];
627
- const collect = (node) => {
628
- all.push(node);
629
- for (const child of node.children) collect(child);
630
- };
631
- for (const root of roots) collect(root);
632
- const items = all.filter((node) => isItem(node));
633
- const home = new Map(all.map((node) => [node.id, node]));
634
- const isMoved = (node) => items.includes(node) && home.has(node.template ?? "");
635
- for (const node of all) node.children = node.children.filter((c) => !isMoved(c));
636
- for (const item of items) home.get(item.template ?? "")?.children.push(item);
637
- return roots.filter((root) => !isMoved(root));
638
- };
639
620
  /** The ownership tree, one line per node, children under their owner. */
640
621
  const formatTree = (roots, now = Date.now()) => {
641
622
  const lines = [];
@@ -659,4 +640,4 @@ const formatTree = (roots, now = Date.now()) => {
659
640
  return `${text.padEnd(label)} ${style("dim", node.type.padEnd(type))} ${state}${spent}${usage}`;
660
641
  });
661
642
  };
662
- export { formatEvent as a, createDecisionQueue as c, nestItems as i, formatRuns as n, formatRunEvent as o, formatTree as r, createTerminalHuman as s, ago as t };
643
+ export { formatRunEvent as a, formatEvent as i, formatRuns as n, createTerminalHuman as o, formatTree as r, createDecisionQueue as s, ago as t };
@@ -1,4 +1,4 @@
1
- import { p as runMarkerIn } from "./src-CUeMUVwW.mjs";
1
+ import { p as runMarkerIn } from "./src-COHxAj7X.mjs";
2
2
  // src/commands/in-a-run.ts
3
3
  /**
4
4
  * @file The commands that act as the user refuse a program or an agent in a run
@@ -1,4 +1,4 @@
1
- import { a as limitsNow, i as NOT_STARTED, o as limitsReport, r as capsHere } from "./src-BsLHKQRc.mjs";
1
+ import { a as limitsNow, i as NOT_STARTED, o as limitsReport, r as capsHere } from "./src-DosUvy4B.mjs";
2
2
  // src/run/limits.ts
3
3
  /**
4
4
  * @file The limits across runs that apply here (RFC-007): the user's settings
@@ -1,4 +1,4 @@
1
- import { A as gitOk, j as lines, k as git } from "./src-BsLHKQRc.mjs";
1
+ import { A as gitOk, j as lines, k as git } from "./src-DosUvy4B.mjs";
2
2
  import { existsSync } from "node:fs";
3
3
  // ../core/src/worktree/list.ts
4
4
  /**
@@ -1,8 +1,8 @@
1
- import { h as isNewer } from "./src-BsLHKQRc.mjs";
2
- import { n as ORK_VERSION } from "./__build_info__-BGoaUwLd.mjs";
3
- import { p as runMarkerIn } from "./src-CUeMUVwW.mjs";
4
- import { n as explainNode } from "./context-CZNM454F.mjs";
5
- import { a as openMcp, c as refused, o as tool, s as answer } from "./src-BwnitlJh.mjs";
1
+ import { h as isNewer } from "./src-DosUvy4B.mjs";
2
+ import { n as ORK_VERSION } from "./__build_info__-B83zdwIv.mjs";
3
+ import { p as runMarkerIn } from "./src-COHxAj7X.mjs";
4
+ import { n as explainNode } from "./context-C5wQNjp9.mjs";
5
+ import { a as openMcp, c as refused, o as tool, s as answer } from "./src-DCCbIABO.mjs";
6
6
  import { z } from "zod";
7
7
  import { defineCommand } from "citty";
8
8
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -43,7 +43,7 @@ const orkMcpServer = (options = {}) => {
43
43
  ...options.script === void 0 ? {} : { script: options.script }
44
44
  });
45
45
  const all = [...opened.tools, explainTool(opened, options.home)];
46
- const tools = options.expects !== void 0 && isNewer(options.expects, "1.0.0-alpha.7") ? tooOld(all, options.expects) : all;
46
+ const tools = options.expects !== void 0 && isNewer(options.expects, "1.0.0-alpha.8") ? tooOld(all, options.expects) : all;
47
47
  const server = new McpServer({
48
48
  name: "ork",
49
49
  version: ORK_VERSION
@@ -1,4 +1,4 @@
1
- import { Ht as FEEDBACK_SEVERITIES, J as backfillUsage, Q as text, Tt as ownProcessStart, Ut as FEEDBACK_TARGETS, Vt as FEEDBACK_KINDS, X as eventOf, Y as usageQueries, Z as inTransaction, cn as maskSecrets, sn as maskReplacer, yn as PROJECT_MODES } from "./src-BsLHKQRc.mjs";
1
+ import { Gt as FEEDBACK_TARGETS, J as backfillUsage, Q as text, Tt as ownProcessStart, Ut as FEEDBACK_KINDS, Wt as FEEDBACK_SEVERITIES, X as eventOf, Y as usageQueries, Z as inTransaction, ln as maskReplacer, un as maskSecrets, xn as PROJECT_MODES } from "./src-DosUvy4B.mjs";
2
2
  import path from "node:path";
3
3
  import { mkdirSync } from "node:fs";
4
4
  import { homedir } from "node:os";
@@ -1,7 +1,7 @@
1
- import { G as requestPause, W as requestContinue } from "./src-BsLHKQRc.mjs";
2
- import { t as findRun } from "./find-ntyniv2E.mjs";
3
- import { a as write, c as openStore, i as style, o as writeErr } from "./output-CwqlG1Le.mjs";
4
- import { r as continueRefusal } from "./in-a-run-D_fnj1Mw.mjs";
1
+ import { G as requestPause, W as requestContinue } from "./src-DosUvy4B.mjs";
2
+ import { t as findRun } from "./find-DDAkEoda.mjs";
3
+ import { a as write, c as openStore, i as style, o as writeErr } from "./output-D1wMNIly.mjs";
4
+ import { r as continueRefusal } from "./in-a-run-DENitTUe.mjs";
5
5
  import { defineCommand } from "citty";
6
6
  // src/commands/pause.ts
7
7
  /**
@@ -1,5 +1,5 @@
1
- import { H as unlinkNodes, I as addressOf, z as linkNodes } from "./src-BsLHKQRc.mjs";
2
- import { a as write, c as openStore, i as style, o as writeErr } from "./output-CwqlG1Le.mjs";
1
+ import { H as unlinkNodes, I as addressOf, z as linkNodes } from "./src-DosUvy4B.mjs";
2
+ import { a as write, c as openStore, i as style, o as writeErr } from "./output-D1wMNIly.mjs";
3
3
  import { defineCommand } from "citty";
4
4
  // src/commands/relay.ts
5
5
  /**
@@ -1,6 +1,6 @@
1
- import { bt as liveStatus, j as lines, k as git } from "./src-BsLHKQRc.mjs";
2
- import { n as listOrkWorktrees, t as createdWorktrees } from "./list-D9HPWLPH.mjs";
3
- import { i as keyOf, n as applyStep, r as cleanStep, s as stepPrunes } from "./clean-BPITM-6p.mjs";
1
+ import { bt as liveStatus, j as lines, k as git } from "./src-DosUvy4B.mjs";
2
+ import { n as listOrkWorktrees, t as createdWorktrees } from "./list-CZTh_wdE.mjs";
3
+ import { i as keyOf, n as applyStep, r as cleanStep, s as stepPrunes } from "./clean-NtapkN2x.mjs";
4
4
  // ../core/src/worktree/words.ts
5
5
  /**
6
6
  * @file The plain words for what `ork worktrees` shows, in one place, so the
@@ -1,6 +1,6 @@
1
- import { bt as liveStatus, in as socketPath, kt as scriptContactsOf, on as wakeRun } from "./src-BsLHKQRc.mjs";
2
- import { c as openStore, o as writeErr } from "./output-CwqlG1Le.mjs";
3
- import { u as inheritedScrubber } from "./src-CUeMUVwW.mjs";
1
+ import { bt as liveStatus, cn as wakeRun, jt as scriptContactsOf, on as socketPath } from "./src-DosUvy4B.mjs";
2
+ import { c as openStore, o as writeErr } from "./output-D1wMNIly.mjs";
3
+ import { u as inheritedScrubber } from "./src-COHxAj7X.mjs";
4
4
  import { defineCommand } from "citty";
5
5
  // ../core/src/remote/send.ts
6
6
  /**
@@ -1,4 +1,4 @@
1
- import { Ht as FEEDBACK_SEVERITIES, Ut as FEEDBACK_TARGETS, Vt as FEEDBACK_KINDS, dt as parseReport } from "./src-BsLHKQRc.mjs";
1
+ import { Gt as FEEDBACK_TARGETS, Ut as FEEDBACK_KINDS, Wt as FEEDBACK_SEVERITIES, dt as parseReport } from "./src-DosUvy4B.mjs";
2
2
  import { z } from "zod";
3
3
  import { randomBytes, timingSafeEqual } from "node:crypto";
4
4
  import { createInterface } from "node:readline";
@@ -1,4 +1,4 @@
1
- import { $t as evaluate, At as declaredProblem, Bt as serversIn, Hn as programsRunBy, Kn as markValue, Mt as envReadsOf, Ot as runScope, Pt as declaredOutputOf, Rt as MCP_FILE, Vn as beforeOf, ar as integrationFor, ct as planNodeSession, en as parseTemplate, er as isToolNode, ft as reportSchemaFor, ir as TOOL_PREFIX, jt as calledWorkflows, nr as timeoutMs, rr as INTEGRATIONS, s as planReason, tn as renderTemplate, ut as sessionDriver, yt as heldTimeout, zt as mcpNotText } from "./src-BsLHKQRc.mjs";
1
+ import { At as runScope, Bt as MCP_FILE, Ht as serversIn, It as declaredOutputOf, Jn as markValue, Mt as declaredProblem, Nt as calledWorkflows, Pt as envReadsOf, Un as beforeOf, Vt as mcpNotText, Wn as programsRunBy, ar as INTEGRATIONS, ct as planNodeSession, ft as reportSchemaFor, ir as timeoutMs, nn as parseTemplate, nr as isToolNode, or as TOOL_PREFIX, rn as renderTemplate, s as planReason, sr as integrationFor, tn as evaluate, ut as sessionDriver, yt as heldTimeout } from "./src-DosUvy4B.mjs";
2
2
  import path from "node:path";
3
3
  import { accessSync, constants, lstatSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
4
4
  import { spawn } from "node:child_process";
@@ -1,11 +1,11 @@
1
- import { Bn as readDocument, Cn as placeFiles, En as runDirOf, Et as processAlive, G as requestPause, Gt as planPost, H as unlinkNodes, In as skillsIn, K as requestStop, Kt as runGh, Ln as WorkflowEditSchema, Nt as nodeSays, On as workflowDirOf, Qn as NodeSchema, Rn as applyEdits, St as runStatus, Un as renderJsonSchema, W as requestContinue, Wn as parseWorkflow, Wt as DISCUSSIONS, Xn as expandEdge, at as followEvents, bt as liveStatus, d as runningRunIds, et as detachResume, f as runningScript, ht as walkSummary, it as detachRun, jn as LESSON_CAP_TOKENS, kn as inside, l as planUpgrade, mt as walkChecks, nn as readCondition, o as limitsReport, ot as explainWorkflowText, p as detectInstaller, pt as checkWorkflowText, q as tellLiveRun, qn as EdgeInputSchema, qt as sendPost, r as capsHere, tt as resumable, u as releaseNotes, v as triggersReport, vn as loadAgents, wn as placeFor, xt as pausedOf, z as linkNodes, zn as newWorkflowText } from "./src-BsLHKQRc.mjs";
2
- import { C as placeOf$1, S as lessonPlaceOf, T as openFixRun, _ as nodeSession, a as registryShown, b as recordNote, c as checkDue, f as readUpdateCache, g as activeTree, h as writeUpdateCache, i as registryOf, l as fetchLatest, m as updateCachePath, o as updateSwitchOff, p as refreshUpdateCache, s as runInstall, u as newerVersion, v as previewPost, w as feedbackActions, x as acceptItem } from "./__build_info__-BGoaUwLd.mjs";
3
- import { n as pendingDecisions, r as builtinProblem, t as answerDecision } from "./decide-DsA6kOT7.mjs";
4
- import { n as newRunId, t as findRun } from "./find-ntyniv2E.mjs";
5
- import { c as openStore, l as storePath, s as isNodeEvent } from "./output-CwqlG1Le.mjs";
1
+ import { An as workflowDirOf, Bn as applyEdits, En as placeFor, Et as processAlive, Ft as nodeSays, G as requestPause, Gn as renderJsonSchema, H as unlinkNodes, Hn as readDocument, Jt as runGh, K as requestStop, Kn as parseWorkflow, Kt as DISCUSSIONS, Nn as LESSON_CAP_TOKENS, On as runDirOf, Qn as expandEdge, Rn as skillsIn, St as runStatus, Tn as placeFiles, Vn as newWorkflowText, W as requestContinue, Yn as EdgeInputSchema, Yt as sendPost, at as followEvents, bn as loadAgents, bt as liveStatus, d as runningRunIds, er as NodeSchema, et as detachResume, f as runningScript, ht as walkSummary, in as readCondition, it as detachRun, jn as inside, kt as nestItems, l as planUpgrade, mt as walkChecks, o as limitsReport, ot as explainWorkflowText, p as detectInstaller, pt as checkWorkflowText, q as tellLiveRun, qt as planPost, r as capsHere, tt as resumable, u as releaseNotes, v as triggersReport, xt as pausedOf, z as linkNodes, zn as WorkflowEditSchema } from "./src-DosUvy4B.mjs";
2
+ import { C as placeOf$1, S as lessonPlaceOf, T as openFixRun, _ as nodeSession, a as registryShown, b as recordNote, c as checkDue, f as readUpdateCache, g as activeTree, h as writeUpdateCache, i as registryOf, l as fetchLatest, m as updateCachePath, o as updateSwitchOff, p as refreshUpdateCache, s as runInstall, u as newerVersion, v as previewPost, w as feedbackActions, x as acceptItem } from "./__build_info__-B83zdwIv.mjs";
3
+ import { n as pendingDecisions, r as builtinProblem, t as answerDecision } from "./decide-BaEOo7sO.mjs";
4
+ import { n as newRunId, t as findRun } from "./find-DDAkEoda.mjs";
5
+ import { c as openStore, l as storePath, s as isNodeEvent } from "./output-D1wMNIly.mjs";
6
6
  import { n as usageReport } from "./report-DK4LGqwF.mjs";
7
- import { a as planClean, i as keyOf, o as stepActs, r as cleanStep, s as stepPrunes, t as applyClean } from "./clean-BPITM-6p.mjs";
8
- import { a as readWorktrees, c as planLine, i as projectHead, l as removeRefusal, n as lostWork, o as labelOf, r as planRemove, s as mergeStateOf, t as applyRemove, u as stateParts } from "./remove-CSpT_nJH.mjs";
7
+ import { a as planClean, i as keyOf, o as stepActs, r as cleanStep, s as stepPrunes, t as applyClean } from "./clean-NtapkN2x.mjs";
8
+ import { a as readWorktrees, c as planLine, i as projectHead, l as removeRefusal, n as lostWork, o as labelOf, r as planRemove, s as mergeStateOf, t as applyRemove, u as stateParts } from "./remove-0L02cre2.mjs";
9
9
  import path from "node:path";
10
10
  import { z } from "zod";
11
11
  import { chmodSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
@@ -1544,7 +1544,7 @@ const readRoutes = (context) => ({
1544
1544
  tree: ({ params }) => {
1545
1545
  const found = runOf(context, params.id);
1546
1546
  if (!found.ok) return found.refusal;
1547
- return ok(activeTree(context.store.events(found.run.id)));
1547
+ return ok(nestItems(activeTree(context.store.events(found.run.id))));
1548
1548
  },
1549
1549
  graph: ({ params }) => {
1550
1550
  const found = runOf(context, params.id);
@@ -7326,13 +7326,16 @@ const createFanOut = (deps) => {
7326
7326
  };
7327
7327
  if (!listed.ok) return failure(listed.error);
7328
7328
  let { list } = listed;
7329
- options.onEvent({
7330
- type: "each.listed",
7331
- node: id,
7332
- round,
7333
- count: list.length,
7334
- list
7335
- });
7329
+ const recordList = () => {
7330
+ options.onEvent({
7331
+ type: "each.listed",
7332
+ node: id,
7333
+ round,
7334
+ count: list.length,
7335
+ list
7336
+ });
7337
+ };
7338
+ recordList();
7336
7339
  if ("maxItems" in forEach && list.length > forEach.maxItems) {
7337
7340
  options.onEvent({
7338
7341
  type: "each.exceeded",
@@ -7350,7 +7353,9 @@ const createFanOut = (deps) => {
7350
7353
  stopsAs: "failed"
7351
7354
  };
7352
7355
  }
7356
+ const narrowed = chosen.length !== list.length;
7353
7357
  list = chosen;
7358
+ if (narrowed) recordList();
7354
7359
  }
7355
7360
  const node = nodeOf(activation);
7356
7361
  const session = node !== void 0 && needsSlot(node);
@@ -7675,6 +7680,27 @@ const resumeOf = (node, sessionId) => {
7675
7680
  if (node.type === "claude.subagent") return void 0;
7676
7681
  return (node.session ?? (node.type === "claude.leader" ? "resume" : "fresh")) === "resume" ? sessionId : void 0;
7677
7682
  };
7683
+ // ../core/src/store/nest-items.ts
7684
+ /** Whether a tree node is an item of a fanned node (`build.2`). */
7685
+ const isItem = (node) => node.template !== void 0 && /\.\d+$/u.test(node.id);
7686
+ /**
7687
+ * Moves each item of a node with `forEach` (`build.2`) under its node, in list
7688
+ * order, from beside it or under its owner, where the events put it.
7689
+ */
7690
+ const nestItems = (roots) => {
7691
+ const all = [];
7692
+ const collect = (node) => {
7693
+ all.push(node);
7694
+ for (const child of node.children) collect(child);
7695
+ };
7696
+ for (const root of roots) collect(root);
7697
+ const items = all.filter((node) => isItem(node));
7698
+ const home = new Map(all.map((node) => [node.id, node]));
7699
+ const isMoved = (node) => items.includes(node) && home.has(node.template ?? "");
7700
+ for (const node of all) node.children = node.children.filter((c) => !isMoved(c));
7701
+ for (const item of items) home.get(item.template ?? "")?.children.push(item);
7702
+ return roots.filter((root) => !isMoved(root));
7703
+ };
7678
7704
  // ../core/src/store/process-age.ts
7679
7705
  /**
7680
7706
  * @file Telling a process from a later one that got its id. A process id comes
@@ -7847,10 +7873,14 @@ const templateOf = (id, declared) => {
7847
7873
  const base = /^(?<base>.+)[-.]\d+$/u.exec(id)?.groups?.["base"];
7848
7874
  return base !== void 0 && declared.has(base) ? base : void 0;
7849
7875
  };
7876
+ const setItemsWaiting = (nodes, of) => {
7877
+ for (const node of nodes) if (node.template === of && isItem(node)) node.state = "waiting";
7878
+ };
7850
7879
  /** Folds a run's events into its ownership tree; roots in declared order. */
7851
7880
  const runTree = (events) => {
7852
7881
  const nodes = /* @__PURE__ */ new Map();
7853
7882
  const declared = /* @__PURE__ */ new Map();
7883
+ const listedRounds = /* @__PURE__ */ new Map();
7854
7884
  for (const event of events) if (event.type === "run.started") for (const info of event.nodes) {
7855
7885
  if (nodes.has(info.id)) continue;
7856
7886
  const node = blank(info.id, info.type, info.parent);
@@ -7911,6 +7941,13 @@ const runTree = (events) => {
7911
7941
  } else if (event.type === "node.skipped") {
7912
7942
  const node = nodes.get(event.id);
7913
7943
  if (node !== void 0) node.state = "skipped";
7944
+ } else if (event.type === "each.listed") {
7945
+ const node = nodes.get(event.node);
7946
+ if (node !== void 0) node.listed = event.count;
7947
+ if (event.round > (listedRounds.get(event.node) ?? 0)) {
7948
+ listedRounds.set(event.node, event.round);
7949
+ setItemsWaiting(nodes.values(), event.node);
7950
+ }
7914
7951
  } else if (event.type === "call.started") {
7915
7952
  const node = nodes.get(event.node);
7916
7953
  if (node !== void 0) node.calledRun = event.run;
@@ -13873,4 +13910,4 @@ const createWorkspace = (options) => {
13873
13910
  close
13874
13911
  };
13875
13912
  };
13876
- export { adoptedCalls as $, isClaudeNode as $n, evaluate as $t, gitOk as A, projectRootOf as An, declaredProblem as At, peerOf as B, readDocument as Bn, serversIn as Bt, workflowTextHash as C, placeFiles as Cn, runTree as Ct, inspectProject as D, shownPath as Dn, stillTheSameProcess as Dt, BRANCH_PREFIX as E, runDirOf as En, processAlive as Et, createCalls as F, writePlainFile as Fn, PROJECT_FILE as Ft, requestPause as G, serializeWorkflow as Gn, planPost as Gt, unlinkNodes as H, programsRunBy as Hn, FEEDBACK_SEVERITIES as Ht, addressOf as I, skillsIn as In, gitRulesOf as It, backfillUsage as J, WorkflowSchema as Jn, publishPost as Jt, requestStop as K, markValue as Kn, runGh as Kt, endLink as L, WorkflowEditSchema as Ln, loadProject as Lt, clearGitLocalEnv as M, estimateTokens as Mn, envReadsOf as Mt, parseInputPairs as N, guardedBase as Nn, nodeSays as Nt, removeWorktree as O, workflowDirOf as On, runScope as Ot, resolveInputs as P, plainPathInside as Pn, declaredOutputOf as Pt, text as Q, NodeSchema as Qn, targetOf as Qt, endLinksOf as R, applyEdits as Rn, MCP_FILE as Rt, readProjectTriggers as S, newProjectId as Sn, runStatus as St, watchingPid as T, projectsHome as Tn, ownProcessStart as Tt, flattenTree as U, renderJsonSchema as Un, FEEDBACK_TARGETS as Ut, tellNode as V, beforeOf as Vn, FEEDBACK_KINDS as Vt, requestContinue as W, parseWorkflow as Wn, DISCUSSIONS as Wt, eventOf as X, expandEdge as Xn, fingerprint as Xt, usageQueries as Y, CheckReportSchema as Yn, createFeedback as Yt, inTransaction as Z, settingsOf as Zn, normalizeTitle as Zt, lateTriggers as _, catalogAgent as _n, MESSAGE_LIMIT as _t, limitsNow as a, socketRoom as an, integrationFor as ar, followEvents as at, triggerStanding as b, hasInRepoFiles as bn, liveStatus as bt, usd as c, maskSecrets as cn, CLAUDE_DRIVERS as cr, planNodeSession as ct, runningRunIds as d, planMoveInto as dn, experimentsOn as dr, parseReport as dt, parseTemplate as en, isToolNode as er, detachResume as et, runningScript as f, linkTools as fn, knownExperiments as fr, reportSchemaFor as ft, parseVersion as g, deleteAgent as gn, startRun as gt, isNewer as h, createAgent as hn, walkSummary as ht, NOT_STARTED as i, socketPath as in, TOOL_PREFIX as ir, detachRun as it, lines as j, LESSON_CAP_TOKENS as jn, calledWorkflows as jt, git as k, inside as kn, scriptContactsOf as kt, planUpgrade as l, planAgentMigration as ln, firstLine as lr, namingNoDriver as lt, compareVersions as m, toolsInUse as mn, walkChecks as mt, resolveBase as n, readCondition as nn, timeoutMs as nr, listKey as nt, limitsReport as o, wakeRun as on, AGENT_TOOL_LAYOUTS as or, explainWorkflowText as ot, detectInstaller as p, toolLinks as pn, checkWorkflowText as pt, tellLiveRun as q, EdgeInputSchema as qn, sendPost as qt, capsHere as r, serveRun as rn, INTEGRATIONS as rr, DETACHED_ENV as rt, planReason as s, maskReplacer as sn, ORK_LAYOUT as sr, explainSession as st, createWorkspace as t, renderTemplate as tn, NodeIdSchema as tr, resumable as tt, releaseNotes as u, applySteps as un, EXPERIMENTS as ur, sessionDriver as ut, triggersReport as v, loadAgents as vn, userMessageText as vt, takeWatchLock as w, placeFor as wn, templateOf as wt, declaredTriggers as x, inRepoPlace as xn, pausedOf as xt, createWatcher as y, PROJECT_MODES as yn, heldTimeout as yt, linkNodes as z, newWorkflowText as zn, mcpNotText as zt };
13913
+ export { adoptedCalls as $, settingsOf as $n, normalizeTitle as $t, gitOk as A, workflowDirOf as An, runScope as At, peerOf as B, applyEdits as Bn, MCP_FILE as Bt, workflowTextHash as C, inRepoPlace as Cn, runTree as Ct, inspectProject as D, projectsHome as Dn, stillTheSameProcess as Dt, BRANCH_PREFIX as E, placeFor as En, processAlive as Et, createCalls as F, guardedBase as Fn, nodeSays as Ft, requestPause as G, renderJsonSchema as Gn, FEEDBACK_TARGETS as Gt, unlinkNodes as H, readDocument as Hn, serversIn as Ht, addressOf as I, plainPathInside as In, declaredOutputOf as It, backfillUsage as J, markValue as Jn, runGh as Jt, requestStop as K, parseWorkflow as Kn, DISCUSSIONS as Kt, endLink as L, writePlainFile as Ln, PROJECT_FILE as Lt, clearGitLocalEnv as M, projectRootOf as Mn, declaredProblem as Mt, parseInputPairs as N, LESSON_CAP_TOKENS as Nn, calledWorkflows as Nt, removeWorktree as O, runDirOf as On, isItem as Ot, resolveInputs as P, estimateTokens as Pn, envReadsOf as Pt, text as Q, expandEdge as Qn, fingerprint as Qt, endLinksOf as R, skillsIn as Rn, gitRulesOf as Rt, readProjectTriggers as S, hasInRepoFiles as Sn, runStatus as St, watchingPid as T, placeFiles as Tn, ownProcessStart as Tt, flattenTree as U, beforeOf as Un, FEEDBACK_KINDS as Ut, tellNode as V, newWorkflowText as Vn, mcpNotText as Vt, requestContinue as W, programsRunBy as Wn, FEEDBACK_SEVERITIES as Wt, eventOf as X, WorkflowSchema as Xn, publishPost as Xt, usageQueries as Y, EdgeInputSchema as Yn, sendPost as Yt, inTransaction as Z, CheckReportSchema as Zn, createFeedback as Zt, lateTriggers as _, createAgent as _n, MESSAGE_LIMIT as _t, limitsNow as a, serveRun as an, INTEGRATIONS as ar, followEvents as at, triggerStanding as b, loadAgents as bn, liveStatus as bt, usd as c, wakeRun as cn, AGENT_TOOL_LAYOUTS as cr, planNodeSession as ct, runningRunIds as d, planAgentMigration as dn, firstLine as dr, parseReport as dt, targetOf as en, NodeSchema as er, detachResume as et, runningScript as f, applySteps as fn, EXPERIMENTS as fr, reportSchemaFor as ft, parseVersion as g, toolsInUse as gn, startRun as gt, isNewer as h, toolLinks as hn, walkSummary as ht, NOT_STARTED as i, readCondition as in, timeoutMs as ir, detachRun as it, lines as j, inside as jn, scriptContactsOf as jt, git as k, shownPath as kn, nestItems as kt, planUpgrade as l, maskReplacer as ln, ORK_LAYOUT as lr, namingNoDriver as lt, compareVersions as m, linkTools as mn, knownExperiments as mr, walkChecks as mt, resolveBase as n, parseTemplate as nn, isToolNode as nr, listKey as nt, limitsReport as o, socketPath as on, TOOL_PREFIX as or, explainWorkflowText as ot, detectInstaller as p, planMoveInto as pn, experimentsOn as pr, checkWorkflowText as pt, tellLiveRun as q, serializeWorkflow as qn, planPost as qt, capsHere as r, renderTemplate as rn, NodeIdSchema as rr, DETACHED_ENV as rt, planReason as s, socketRoom as sn, integrationFor as sr, explainSession as st, createWorkspace as t, evaluate as tn, isClaudeNode as tr, resumable as tt, releaseNotes as u, maskSecrets as un, CLAUDE_DRIVERS as ur, sessionDriver as ut, triggersReport as v, deleteAgent as vn, userMessageText as vt, takeWatchLock as w, newProjectId as wn, templateOf as wt, declaredTriggers as x, PROJECT_MODES as xn, pausedOf as xt, createWatcher as y, catalogAgent as yn, heldTimeout as yt, linkNodes as z, WorkflowEditSchema as zn, loadProject as zt };