@krapht/ork 1.0.0-alpha.4 → 1.0.0-alpha.6

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__-1i1IwLg7.mjs → __build_info__-CxH89h1r.mjs} +2 -2
  2. package/dist/bin.mjs +54 -224
  3. package/dist/{clean-B1zPxq6A.mjs → clean-BbrkMQQi.mjs} +1 -1
  4. package/dist/{completion-BY-frez8.mjs → completion-BeS2NCgO.mjs} +5 -5
  5. package/dist/{context-CD5TCD1D.mjs → context-CHV6aTs7.mjs} +3 -3
  6. package/dist/{decide-CBhYcjwI.mjs → decide-Cnt7o3ya.mjs} +3 -3
  7. package/dist/{find-BgZjVKhv.mjs → find-Dy2H5IvT.mjs} +1 -1
  8. package/dist/{format-Creyq4U3.mjs → format-OL0E1AjA.mjs} +223 -17
  9. package/dist/{in-a-run-CsSBQQ2q.mjs → in-a-run-emTc-kZI.mjs} +1 -1
  10. package/dist/{limits-D_HxH0CK.mjs → limits-TxTnWxix.mjs} +1 -1
  11. package/dist/{list-CzzpVEpM.mjs → list-P5CfcoWx.mjs} +1 -1
  12. package/dist/{mcp-DYmQt372.mjs → mcp-qUwFT9yi.mjs} +6 -6
  13. package/dist/{output-CuivUcDa.mjs → output-CjOPL8W0.mjs} +9 -6
  14. package/dist/{pause-W6MzQqg8.mjs → pause-CBSAxtTp.mjs} +4 -4
  15. package/dist/{relay-CsdoZUXJ.mjs → relay-UgK1Cp9a.mjs} +2 -2
  16. package/dist/{remove-DLfDjBdF.mjs → remove-ccycC3vI.mjs} +3 -3
  17. package/dist/{send-Bw2FI_Sv.mjs → send-B39-Xeo7.mjs} +3 -3
  18. package/dist/{src-CrYCkU9J.mjs → src-5-sCA7cY.mjs} +50 -19
  19. package/dist/{src-Bc9yaAiZ.mjs → src-8nec4uoe.mjs} +14 -7
  20. package/dist/{src-BRB5EQyC.mjs → src-DG4dyBqm.mjs} +61 -20
  21. package/dist/{src-CsjumY1t.mjs → src-jyCJE1kd.mjs} +26 -12
  22. package/dist/ui/THIRD_PARTY_LICENSES.txt +594 -0
  23. package/dist/ui/assets/app-C1DAgdU2.js +75 -0
  24. package/dist/ui/assets/app-Dt_tjFj6.css +1 -0
  25. package/dist/ui/assets/{index-UEC5ZLYw.js → index-BZKXPhht.js} +3 -3
  26. package/dist/ui/assets/theme-CdXvqTQ6.js +1 -0
  27. package/dist/ui/index.html +2 -2
  28. package/dist/{ui-wX050aH1.mjs → ui-DmJWLgxL.mjs} +4 -4
  29. package/dist/{usage-C96RDH-G.mjs → usage-Bh1lVioA.mjs} +5 -5
  30. package/dist/{watch-vdRobJil.mjs → watch-C_vcsn_g.mjs} +6 -6
  31. package/dist/{workflows-B28q8zMY.mjs → workflows-lpexsAYt.mjs} +3 -3
  32. package/dist/{worktrees-CKDRkl6b.mjs → worktrees-D4bVVKfY.mjs} +10 -4
  33. package/package.json +1 -1
  34. package/dist/ui/assets/app-BNT0SuIz.css +0 -1
  35. package/dist/ui/assets/app-m9Gfrg_S.js +0 -67
  36. package/dist/ui/assets/theme-3xH5jxKs.js +0 -1
@@ -661,6 +661,7 @@ const HumanGateNodeSchema = z.strictObject({
661
661
  ...base,
662
662
  ...notifyFields,
663
663
  question: z.string(),
664
+ document: z.string().optional(),
664
665
  options: z.array(DecisionOptionSchema).min(2),
665
666
  recommended: z.string().optional(),
666
667
  timeout: DurationSchema.optional(),
@@ -3601,6 +3602,26 @@ const writePlugin = (stack, dir, description) => {
3601
3602
  }
3602
3603
  return dir;
3603
3604
  };
3605
+ // ../core/src/store/mask.ts
3606
+ /**
3607
+ * @file Masks secrets before anything is stored: tokens and keys in common
3608
+ * formats, anywhere in an event's strings. The store and feedback records use
3609
+ * the same patterns; the terminal is not masked (it is the user's own).
3610
+ */
3611
+ const PATTERNS = [
3612
+ /sk-ant-[\w-]{20,}/gu,
3613
+ /\bgh[opsur]_[A-Za-z0-9]{20,}/gu,
3614
+ /\bgithub_pat_\w{20,}/gu,
3615
+ /\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/gu,
3616
+ /\bxox[abprs]-[\w-]{10,}/gu,
3617
+ /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/gu,
3618
+ /(?<=\bbearer\s+)[\w.~+/-]{20,}=*/giu,
3619
+ /(?<=aws_secret_access_key\s*[=:]\s*)\S+/giu
3620
+ ];
3621
+ const MASK = "[masked]";
3622
+ const maskSecrets = (text) => PATTERNS.reduce((out, pattern) => out.replaceAll(pattern, MASK), text);
3623
+ /** A `JSON.stringify` replacer that masks every string. */
3624
+ const maskReplacer = (_key, value) => typeof value === "string" ? maskSecrets(value) : value;
3604
3625
  // ../core/src/control/socket.ts
3605
3626
  /**
3606
3627
  * @file The per-run local socket (`~/.ork/sockets/<run>.sock`): the fast path
@@ -4223,27 +4244,39 @@ const stringify$1 = (value) => {
4223
4244
  if (typeof value === "number" || typeof value === "boolean") return String(value);
4224
4245
  return JSON.stringify(value);
4225
4246
  };
4226
- const renderTemplate = (parts, scope) => parts.map((part) => typeof part === "string" ? part : stringify$1(evaluate(part.expr, scope))).join("");
4227
- // ../core/src/store/mask.ts
4247
+ const isContainer = (value) => value !== null && typeof value === "object";
4248
+ const depthOf = (value) => isContainer(value) ? 1 + Math.max(0, ...Object.values(value).map((item) => depthOf(item))) : 0;
4249
+ /** Keeps a multi-line value inside its list item or `key:` line. */
4250
+ const hang = (text) => text.replaceAll("\n", "\n ");
4251
+ /** A value at most two levels deep as Markdown list items and `key: value`. */
4252
+ const listed$2 = (value) => {
4253
+ if (!isContainer(value)) return stringify$1(value);
4254
+ if (Array.isArray(value)) return value.map((item) => `- ${hang(listed$2(item))}`).join("\n");
4255
+ return Object.entries(value).map(([key, item]) => isContainer(item) ? `${key}:\n ${hang(listed$2(item))}` : `${key}: ${hang(stringify$1(item))}`).join("\n");
4256
+ };
4228
4257
  /**
4229
- * @file Masks secrets before anything is stored: tokens and keys in common
4230
- * formats, anywhere in an event's strings. The store and feedback records use
4231
- * the same patterns; the terminal is not masked (it is the user's own).
4258
+ * A value as a person reads it: Markdown, never a line of raw JSON. `before` is
4259
+ * the text so far: a list or object starts on its own line, after a blank one
4260
+ * when text shares its line.
4232
4261
  */
4233
- const PATTERNS = [
4234
- /sk-ant-[\w-]{20,}/gu,
4235
- /\bgh[opsur]_[A-Za-z0-9]{20,}/gu,
4236
- /\bgithub_pat_\w{20,}/gu,
4237
- /\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/gu,
4238
- /\bxox[abprs]-[\w-]{10,}/gu,
4239
- /-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/gu,
4240
- /(?<=\bbearer\s+)[\w.~+/-]{20,}=*/giu,
4241
- /(?<=aws_secret_access_key\s*[=:]\s*)\S+/giu
4242
- ];
4243
- const MASK = "[masked]";
4244
- const maskSecrets = (text) => PATTERNS.reduce((out, pattern) => out.replaceAll(pattern, MASK), text);
4245
- /** A `JSON.stringify` replacer that masks every string. */
4246
- const maskReplacer = (_key, value) => typeof value === "string" ? maskSecrets(value) : value;
4262
+ const readableText = (value, before) => {
4263
+ if (!isContainer(value)) return stringify$1(value);
4264
+ if (depthOf(value) <= 2) {
4265
+ const list = listed$2(value);
4266
+ return list === "" || before === "" || before.endsWith("\n") ? list : `\n\n${list}`;
4267
+ }
4268
+ const code = JSON.stringify(value, void 0, 2).replaceAll(/^/gmu, " ");
4269
+ return before === "" || before.endsWith("\n\n") ? code : `\n\n${code}`;
4270
+ };
4271
+ /**
4272
+ * Fills a parsed template. `readable` is for text a person reads (a gate's
4273
+ * `question` and `document`); scripts and prompts keep JSON (ADR-047).
4274
+ */
4275
+ const renderTemplate = (parts, scope, { readable = false } = {}) => parts.reduce((text, part) => {
4276
+ if (typeof part === "string") return text + part;
4277
+ const value = evaluate(part.expr, scope);
4278
+ return text + (readable ? readableText(value, text) : stringify$1(value));
4279
+ }, "");
4247
4280
  // ../core/src/feedback/fingerprint.ts
4248
4281
  /**
4249
4282
  * @file Feedback fingerprints: records about the same thing (same target, kind,
@@ -5893,6 +5926,7 @@ const TEMPLATE_FIELDS = [
5893
5926
  "command",
5894
5927
  "cwd",
5895
5928
  "question",
5929
+ "document",
5896
5930
  "workflow",
5897
5931
  "project",
5898
5932
  "ref"
@@ -6491,6 +6525,8 @@ const createOwnership = (hooks) => {
6491
6525
  if (accepted.length > 0) {
6492
6526
  const problem = await hooks.checkpoint();
6493
6527
  if (problem !== null) notes.push(`Your uncommitted work could not be committed (${problem}); the children started from your branch's last commit.`);
6528
+ const released = hooks.releaseClaims().map((r) => `\`${r}\``);
6529
+ if (released.length > 0) notes.push(`Your claims on ${released.join(", ")} were released while your children worked; claim again before you edit.`);
6494
6530
  }
6495
6531
  hooks.lend();
6496
6532
  try {
@@ -6642,6 +6678,11 @@ const nodeContext = (deps, activation, cwd, round) => {
6642
6678
  runChild: deps.runChild,
6643
6679
  isRunning: (other) => deps.running.has(other),
6644
6680
  checkpoint: () => options.workspace?.checkpoint(id) ?? Promise.resolve(null),
6681
+ releaseClaims: () => {
6682
+ const held = context.claims?.held() ?? [];
6683
+ for (const resource of held) context.claims?.release(resource);
6684
+ return held;
6685
+ },
6645
6686
  lend: deps.slots.release,
6646
6687
  reclaim: deps.slots.take
6647
6688
  });
@@ -13140,4 +13181,4 @@ const createWorkspace = (options) => {
13140
13181
  close
13141
13182
  };
13142
13183
  };
13143
- export { text as $, isToolNode as $n, maskReplacer as $t, gitOk as A, projectRootOf as An, runScope as At, linkNodes as B, readDocument as Bn, serversIn as Bt, workflowTextHash as C, placeFiles as Cn, walkChecks as Ct, inspectProject as D, shownPath as Dn, userMessageText as Dt, BRANCH_PREFIX as E, runDirOf as En, MESSAGE_LIMIT as Et, declaredProblem as F, writePlainFile as Fn, PROJECT_FILE as Ft, requestContinue as G, EdgeInputSchema as Gn, planPost as Gt, tellNode as H, parseWorkflow as Hn, FEEDBACK_SEVERITIES as Ht, createCalls as I, skillsIn as In, gitRulesOf as It, tellLiveRun as J, expandEdge as Jn, publishPost as Jt, requestPause as K, WorkflowSchema as Kn, runGh as Kt, addressOf 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, heldTimeout as Ot, resolveInputs as P, plainPathInside as Pn, declaredOutputOf as Pt, inTransaction as Q, isClaudeNode as Qn, targetOf as Qt, endLink as R, applyEdits as Rn, MCP_FILE as Rt, readProjectTriggers as S, newProjectId as Sn, checkWorkflowText as St, watchingPid as T, projectsHome as Tn, startRun as Tt, unlinkNodes as U, serializeWorkflow as Un, FEEDBACK_TARGETS as Ut, peerOf as V, renderJsonSchema as Vn, FEEDBACK_KINDS as Vt, flattenTree as W, markValue as Wn, DISCUSSIONS as Wt, usageQueries as X, NodeSchema as Xn, fingerprint as Xt, backfillUsage as Y, settingsOf as Yn, createFeedback as Yt, eventOf as Z, beforeOf as Zn, normalizeTitle as Zt, lateTriggers as _, catalogAgent as _n, runStatus as _t, limitsNow as a, serveRun as an, integrationFor as ar, DETACHED_ENV as at, triggerStanding as b, hasInRepoFiles as bn, processAlive as bt, usd as c, wakeRun as cn, CLAUDE_DRIVERS as cr, explainWorkflowText as ct, runningRunIds as d, planMoveInto as dn, experimentsOn as dr, namingNoDriver as dt, maskSecrets as en, programsRunBy as er, adoptedCalls as et, runningScript as f, linkTools as fn, knownExperiments as fr, sessionDriver as ft, parseVersion as g, deleteAgent as gn, pausedOf as gt, isNewer as h, createAgent as hn, liveStatus as ht, NOT_STARTED as i, readCondition as in, TOOL_PREFIX as ir, replayLoopAnswers 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, explainSession as lt, compareVersions as m, toolsInUse as mn, reportSchemaFor as mt, resolveBase as n, parseTemplate as nn, timeoutMs as nr, resumable as nt, limitsReport as o, socketPath as on, AGENT_TOOL_LAYOUTS as or, detachRun as ot, detectInstaller as p, toolLinks as pn, parseReport as pt, requestStop as q, CheckReportSchema as qn, sendPost as qt, capsHere as r, renderTemplate as rn, INTEGRATIONS as rr, createReplay as rt, planReason as s, socketRoom as sn, ORK_LAYOUT as sr, followEvents as st, createWorkspace as t, evaluate as tn, NodeIdSchema as tr, detachResume as tt, releaseNotes as u, applySteps as un, EXPERIMENTS as ur, planNodeSession as ut, triggersReport as v, loadAgents as vn, runTree as vt, takeWatchLock as w, placeFor as wn, walkSummary as wt, declaredTriggers as x, inRepoPlace as xn, stillTheSameProcess as xt, createWatcher as y, PROJECT_MODES as yn, ownProcessStart as yt, endLinksOf as z, newWorkflowText as zn, mcpNotText as zt };
13184
+ export { text as $, isToolNode as $n, evaluate as $t, gitOk as A, projectRootOf as An, runScope as At, linkNodes as B, readDocument as Bn, serversIn as Bt, workflowTextHash as C, placeFiles as Cn, walkChecks as Ct, inspectProject as D, shownPath as Dn, userMessageText as Dt, BRANCH_PREFIX as E, runDirOf as En, MESSAGE_LIMIT as Et, declaredProblem as F, writePlainFile as Fn, PROJECT_FILE as Ft, requestContinue as G, EdgeInputSchema as Gn, planPost as Gt, tellNode as H, parseWorkflow as Hn, FEEDBACK_SEVERITIES as Ht, createCalls as I, skillsIn as In, gitRulesOf as It, tellLiveRun as J, expandEdge as Jn, publishPost as Jt, requestPause as K, WorkflowSchema as Kn, runGh as Kt, addressOf 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, heldTimeout as Ot, resolveInputs as P, plainPathInside as Pn, declaredOutputOf as Pt, inTransaction as Q, isClaudeNode as Qn, targetOf as Qt, endLink as R, applyEdits as Rn, MCP_FILE as Rt, readProjectTriggers as S, newProjectId as Sn, checkWorkflowText as St, watchingPid as T, projectsHome as Tn, startRun as Tt, unlinkNodes as U, serializeWorkflow as Un, FEEDBACK_TARGETS as Ut, peerOf as V, renderJsonSchema as Vn, FEEDBACK_KINDS as Vt, flattenTree as W, markValue as Wn, DISCUSSIONS as Wt, usageQueries as X, NodeSchema as Xn, fingerprint as Xt, backfillUsage as Y, settingsOf as Yn, createFeedback as Yt, eventOf as Z, beforeOf as Zn, normalizeTitle as Zt, lateTriggers as _, catalogAgent as _n, runStatus as _t, limitsNow as a, socketRoom as an, integrationFor as ar, DETACHED_ENV as at, triggerStanding as b, hasInRepoFiles as bn, processAlive as bt, usd as c, maskSecrets as cn, CLAUDE_DRIVERS as cr, explainWorkflowText as ct, runningRunIds as d, planMoveInto as dn, experimentsOn as dr, namingNoDriver as dt, parseTemplate as en, programsRunBy as er, adoptedCalls as et, runningScript as f, linkTools as fn, knownExperiments as fr, sessionDriver as ft, parseVersion as g, deleteAgent as gn, pausedOf as gt, isNewer as h, createAgent as hn, liveStatus as ht, NOT_STARTED as i, socketPath as in, TOOL_PREFIX as ir, replayLoopAnswers 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, explainSession as lt, compareVersions as m, toolsInUse as mn, reportSchemaFor as mt, resolveBase as n, readCondition as nn, timeoutMs as nr, resumable as nt, limitsReport as o, wakeRun as on, AGENT_TOOL_LAYOUTS as or, detachRun as ot, detectInstaller as p, toolLinks as pn, parseReport as pt, requestStop as q, CheckReportSchema as qn, sendPost as qt, capsHere as r, serveRun as rn, INTEGRATIONS as rr, createReplay as rt, planReason as s, maskReplacer as sn, ORK_LAYOUT as sr, followEvents as st, createWorkspace as t, renderTemplate as tn, NodeIdSchema as tr, detachResume as tt, releaseNotes as u, applySteps as un, EXPERIMENTS as ur, planNodeSession as ut, triggersReport as v, loadAgents as vn, runTree as vt, takeWatchLock as w, placeFor as wn, walkSummary as wt, declaredTriggers as x, inRepoPlace as xn, stillTheSameProcess as xt, createWatcher as y, PROJECT_MODES as yn, ownProcessStart as yt, endLinksOf as z, newWorkflowText as zn, mcpNotText as zt };
@@ -1,11 +1,11 @@
1
- import { B as linkNodes, Bn as readDocument, Cn as placeFiles, Ct as walkChecks, En as runDirOf, G as requestContinue, Gn as EdgeInputSchema, Gt as planPost, Hn as parseWorkflow, In as skillsIn, J as tellLiveRun, Jn as expandEdge, K as requestPause, Kt as runGh, Ln as WorkflowEditSchema, Nt as nodeSays, On as workflowDirOf, Rn as applyEdits, St as checkWorkflowText, U as unlinkNodes, Vn as renderJsonSchema, Wt as DISCUSSIONS, Xn as NodeSchema, _t as runStatus, bt as processAlive, ct as explainWorkflowText, d as runningRunIds, f as runningScript, gt as pausedOf, ht as liveStatus, in as readCondition, jn as LESSON_CAP_TOKENS, kn as inside, l as planUpgrade, nt as resumable, o as limitsReport, ot as detachRun, p as detectInstaller, q as requestStop, qt as sendPost, r as capsHere, st as followEvents, tt as detachResume, u as releaseNotes, v as triggersReport, vn as loadAgents, vt as runTree, wn as placeFor, wt as walkSummary, zn as newWorkflowText } from "./src-BRB5EQyC.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__-1i1IwLg7.mjs";
3
- import { n as pendingDecisions, r as builtinProblem, t as answerDecision } from "./decide-CBhYcjwI.mjs";
4
- import { n as newRunId, t as findRun } from "./find-BgZjVKhv.mjs";
5
- import { c as openStore, l as storePath, s as nodeOf } from "./output-CuivUcDa.mjs";
1
+ import { B as linkNodes, Bn as readDocument, Cn as placeFiles, Ct as walkChecks, En as runDirOf, G as requestContinue, Gn as EdgeInputSchema, Gt as planPost, Hn as parseWorkflow, In as skillsIn, J as tellLiveRun, Jn as expandEdge, K as requestPause, Kt as runGh, Ln as WorkflowEditSchema, Nt as nodeSays, On as workflowDirOf, Rn as applyEdits, St as checkWorkflowText, U as unlinkNodes, Vn as renderJsonSchema, Wt as DISCUSSIONS, Xn as NodeSchema, _t as runStatus, bt as processAlive, ct as explainWorkflowText, d as runningRunIds, f as runningScript, gt as pausedOf, ht as liveStatus, jn as LESSON_CAP_TOKENS, kn as inside, l as planUpgrade, nn as readCondition, nt as resumable, o as limitsReport, ot as detachRun, p as detectInstaller, q as requestStop, qt as sendPost, r as capsHere, st as followEvents, tt as detachResume, u as releaseNotes, v as triggersReport, vn as loadAgents, vt as runTree, wn as placeFor, wt as walkSummary, zn as newWorkflowText } from "./src-DG4dyBqm.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__-CxH89h1r.mjs";
3
+ import { n as pendingDecisions, r as builtinProblem, t as answerDecision } from "./decide-Cnt7o3ya.mjs";
4
+ import { n as newRunId, t as findRun } from "./find-Dy2H5IvT.mjs";
5
+ import { c as openStore, l as storePath, s as nodeOf } from "./output-CjOPL8W0.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-B1zPxq6A.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-DLfDjBdF.mjs";
7
+ import { a as planClean, i as keyOf, o as stepActs, r as cleanStep, s as stepPrunes, t as applyClean } from "./clean-BbrkMQQi.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-ccycC3vI.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";
@@ -349,7 +349,9 @@ const EventsQuerySchema = z.strictObject({
349
349
  });
350
350
  const DecisionsQuerySchema = z.strictObject({
351
351
  run: z.string().min(1).optional(),
352
- project: z.string().min(1).optional()
352
+ project: z.string().min(1).optional(),
353
+ /** Only runs of this workflow, by name; ANDed with `run` or `project`. */
354
+ workflow: z.string().min(1).optional()
353
355
  });
354
356
  /** An answer: the option, and what the person said with it, if anything. */
355
357
  const AnswerSchema = z.strictObject({
@@ -483,7 +485,8 @@ const STREAMS = {
483
485
  run: "/api/runs/:id/stream",
484
486
  /**
485
487
  * `runs`, `decisions`, `version`, each when it changes; `?project=` keeps
486
- * one. `upgrade`: the upgrade's output, then `end` (contract-update.ts).
488
+ * one, `?workflow=` narrows `decisions` to that workflow's. `upgrade`: the
489
+ * upgrade's output, then `end` (contract-update.ts).
487
490
  */
488
491
  overview: "/api/stream",
489
492
  upgrade: "/api/upgrade/stream"
@@ -1625,10 +1628,17 @@ const readRoutes = (context) => ({
1625
1628
  return ok(query.limit === void 0 ? newest : newest.slice(0, query.limit));
1626
1629
  },
1627
1630
  decisions: ({ query }) => {
1628
- if (query.run === void 0) return ok(pendingDecisions(context.store, query.project === void 0 ? {} : { project: projectRoot(context, query.project) }));
1631
+ const workflow = query.workflow === void 0 ? {} : { workflow: query.workflow };
1632
+ if (query.run === void 0) return ok(pendingDecisions(context.store, {
1633
+ ...workflow,
1634
+ ...query.project === void 0 ? {} : { project: projectRoot(context, query.project) }
1635
+ }));
1629
1636
  const found = runOf(context, query.run);
1630
1637
  if (!found.ok) return found.refusal;
1631
- return ok(pendingDecisions(context.store, { runId: found.run.id }));
1638
+ return ok(pendingDecisions(context.store, {
1639
+ ...workflow,
1640
+ runId: found.run.id
1641
+ }));
1632
1642
  },
1633
1643
  decision: ({ params }) => {
1634
1644
  const found = context.store.decision(params.id);
@@ -2869,6 +2879,7 @@ const runStream = async (context, req, res, url, id, shutdown) => {
2869
2879
  const overviewStream = (context, res, url, shutdown) => {
2870
2880
  const key = url.searchParams.get("project");
2871
2881
  const root = key === null ? void 0 : projectOf(context, key)?.root ?? key;
2882
+ const workflow = url.searchParams.get("workflow");
2872
2883
  const stream = openEventStream(res);
2873
2884
  const last = {
2874
2885
  runs: "",
@@ -2881,7 +2892,10 @@ const overviewStream = (context, res, url, shutdown) => {
2881
2892
  ...filter,
2882
2893
  limit: OVERVIEW_RUNS
2883
2894
  }).map((run) => viewOf$2(context, run));
2884
- const decisions = pendingDecisions(context.store, filter);
2895
+ const decisions = pendingDecisions(context.store, {
2896
+ ...filter,
2897
+ ...workflow === null ? {} : { workflow }
2898
+ });
2885
2899
  for (const [name, value] of [
2886
2900
  ["runs", runs],
2887
2901
  ["decisions", decisions],