toolroll 0.9.52 → 0.9.53

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 (146) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +55 -80
  3. package/dist/agentconfig.d.ts +11 -36
  4. package/dist/agentconfig.js +3 -62
  5. package/dist/approval-policy.d.ts +1 -1
  6. package/dist/approval-policy.js +1 -1
  7. package/dist/board.d.ts +3 -19
  8. package/dist/board.js +4 -42
  9. package/dist/browser/workspace.js +18 -18
  10. package/dist/browser-workspace.d.ts +2 -1
  11. package/dist/builder.d.ts +9 -40
  12. package/dist/builder.js +50 -257
  13. package/dist/chat-actions.js +3 -14
  14. package/dist/chat-controls.d.ts +0 -4
  15. package/dist/chat-controls.js +0 -1
  16. package/dist/chat-decide.js +1 -3
  17. package/dist/chat-delivery.d.ts +0 -2
  18. package/dist/chat-delivery.js +0 -1
  19. package/dist/chat-quiet.js +2 -2
  20. package/dist/chat-task-actions.d.ts +1 -1
  21. package/dist/chat-task-actions.js +0 -2
  22. package/dist/claim.d.ts +79 -244
  23. package/dist/claim.js +688 -1023
  24. package/dist/cli.d.ts +2 -0
  25. package/dist/cli.js +10 -2
  26. package/dist/contracts/cli.d.ts +0 -13
  27. package/dist/contracts/cli.js +0 -2
  28. package/dist/contracts/console-api.d.ts +5 -10
  29. package/dist/contracts/console-api.js +4 -10
  30. package/dist/contracts/flow.d.ts +50 -0
  31. package/dist/contracts/flow.js +26 -1
  32. package/dist/contracts/lead-tools.d.ts +0 -13
  33. package/dist/contracts/lead-tools.js +3 -3
  34. package/dist/contracts/store-json.d.ts +1 -25
  35. package/dist/contracts/store-json.js +3 -13
  36. package/dist/converse.d.ts +1 -11
  37. package/dist/converse.js +6 -38
  38. package/dist/coordinator.d.ts +0 -1
  39. package/dist/coordinator.js +3 -5
  40. package/dist/demo.js +16 -26
  41. package/dist/desktop-update-gate.js +0 -1
  42. package/dist/desktop-update.js +1 -3
  43. package/dist/dispatch.d.ts +1 -1
  44. package/dist/dispatch.js +1 -1
  45. package/dist/dispose.d.ts +2 -3
  46. package/dist/dispose.js +17 -92
  47. package/dist/envelope.js +0 -3
  48. package/dist/exec.d.ts +0 -64
  49. package/dist/exec.js +3 -356
  50. package/dist/exhaustion.d.ts +22 -76
  51. package/dist/exhaustion.js +14 -140
  52. package/dist/export.js +4 -4
  53. package/dist/flow-engine.js +1 -1
  54. package/dist/flow-schedule.d.ts +154 -0
  55. package/dist/flow-schedule.js +321 -0
  56. package/dist/flow-share.js +1 -1
  57. package/dist/flow-triggers.d.ts +6 -1
  58. package/dist/flow-triggers.js +65 -10
  59. package/dist/flows-cli.js +8 -4
  60. package/dist/flows-ui.js +2 -0
  61. package/dist/flows.js +1 -1
  62. package/dist/guides.js +9 -29
  63. package/dist/invoke.d.ts +1 -24
  64. package/dist/invoke.js +17 -259
  65. package/dist/lead-status.js +2 -4
  66. package/dist/lead-voice.js +1 -1
  67. package/dist/mate-doors.d.ts +1 -2
  68. package/dist/mate-doors.js +12 -25
  69. package/dist/mate-tools.d.ts +2 -2
  70. package/dist/mate-tools.js +10 -22
  71. package/dist/modes.d.ts +6 -7
  72. package/dist/modes.js +7 -13
  73. package/dist/operate-remote-arguments.js +2 -6
  74. package/dist/operate-remote.js +6 -7
  75. package/dist/operate.d.ts +0 -6
  76. package/dist/operate.js +222 -2247
  77. package/dist/phase-routing.d.ts +13 -23
  78. package/dist/phase-routing.js +13 -35
  79. package/dist/plan-auto.js +2 -2
  80. package/dist/planner-source.js +2 -1
  81. package/dist/policy.d.ts +1 -4
  82. package/dist/policy.js +0 -8
  83. package/dist/process-recovery-eligibility.js +2 -3
  84. package/dist/project-delete.js +3 -15
  85. package/dist/proposal.d.ts +4 -24
  86. package/dist/proposal.js +3 -88
  87. package/dist/provider-auth.d.ts +3 -3
  88. package/dist/provider-auth.js +4 -6
  89. package/dist/provider.d.ts +11 -25
  90. package/dist/provider.js +4 -36
  91. package/dist/push.js +1 -1
  92. package/dist/recipe-ui.js +6 -6
  93. package/dist/recipes.d.ts +3 -3
  94. package/dist/recipes.js +27 -23
  95. package/dist/run-closeout.d.ts +1 -1
  96. package/dist/run-closeout.js +1 -4
  97. package/dist/scope.d.ts +11 -65
  98. package/dist/scope.js +17 -82
  99. package/dist/serve.js +15 -24
  100. package/dist/server/chat.js +7 -30
  101. package/dist/server/flows.js +11 -10
  102. package/dist/server/guards.js +0 -1
  103. package/dist/server/pages-assets.js +1 -1
  104. package/dist/server/pages.js +0 -2
  105. package/dist/server/people-tokens.js +0 -4
  106. package/dist/server/route-table.d.ts +1 -1
  107. package/dist/server/route-table.js +2 -17
  108. package/dist/server/settings.js +1 -8
  109. package/dist/server/shared.d.ts +28 -212
  110. package/dist/server/shared.js +71 -780
  111. package/dist/server/task-views.js +9 -76
  112. package/dist/server/tasks.d.ts +1 -50
  113. package/dist/server/tasks.js +36 -946
  114. package/dist/setup-guide.d.ts +2 -2
  115. package/dist/slack-chat.d.ts +0 -2
  116. package/dist/slack-chat.js +0 -1
  117. package/dist/store.d.ts +105 -1340
  118. package/dist/store.js +706 -4010
  119. package/dist/surface.js +10 -24
  120. package/dist/task-composer.d.ts +1 -1
  121. package/dist/task-composer.js +1 -1
  122. package/dist/task-control.d.ts +3 -10
  123. package/dist/task-control.js +2 -7
  124. package/dist/teammate-desk.js +1 -1
  125. package/dist/teammates-ui.js +1 -1
  126. package/dist/telegram-mate.d.ts +0 -3
  127. package/dist/telegram-mate.js +0 -1
  128. package/dist/templates.d.ts +11 -7
  129. package/dist/templates.js +12 -9
  130. package/dist/toolroll-update.d.ts +10 -0
  131. package/dist/toolroll-update.js +56 -4
  132. package/dist/work-index.js +2 -6
  133. package/dist/workspace-ui.js +1 -1
  134. package/package.json +1 -1
  135. package/scripts/recovery-canary.mjs +3 -3
  136. package/dist/contest.d.ts +0 -318
  137. package/dist/contest.js +0 -753
  138. package/dist/held.d.ts +0 -150
  139. package/dist/held.js +0 -799
  140. package/dist/liveness.d.ts +0 -30
  141. package/dist/liveness.js +0 -42
  142. package/dist/pricing.d.ts +0 -45
  143. package/dist/pricing.js +0 -77
  144. package/dist/routine.d.ts +0 -228
  145. package/dist/routine.js +0 -764
  146. package/dist/supervisor.mjs +0 -297
@@ -43,7 +43,7 @@ import { parseAcceptanceCriteria } from "./scope.js";
43
43
  import { diagnoseTaskDispatch, withDispatchDiagnoses } from "./dispatch.js";
44
44
  import { agentChoicesFor, routeOfTask, INSTALLATION_SCOPE } from "./agentconfig.js";
45
45
  import { isNewModel, modelWords, priceWords, runtimeStates, seenModels } from "./model-catalog.js";
46
- import { agentsSummary, chosenWords, PHASES, postureWords, RISK_CHOICES, riskConsequence, riskTitle, routeProblems, sameSpec, sizeSourceWords, sizeWords, specWords } from "./phase-routing.js";
46
+ import { agentsSummary, chosenWords, PHASES, postureWords, routeProblems, sameSpec, sizeSourceWords, sizeWords, specWords } from "./phase-routing.js";
47
47
  import { TOOL_CATALOG, discoverTools, projectToolsOf, secretsSetFor, toolCommandLine, toolStanding } from "./project-tools.js";
48
48
  import { deciderOf, durationWords, FLOW_KIND_WORDS, FLOW_TEMPLATES, flowFromSteps, stepsFor, withKeptSteps } from "./flows.js";
49
49
  import { parseContract, toModelSchema } from "./contracts/contract.js";
@@ -320,8 +320,8 @@ function scopeStandingOf(store, taskId) {
320
320
  const ROLE_WORD = { plan: "planner", build: "builder", repair: "repair", review: "reviewer" };
321
321
  const ROLE_OF_WORD = { planner: "plan", plan: "plan", builder: "build", build: "build", repair: "repair", reviewer: "review", review: "review" };
322
322
  /**
323
- * THE AGENTS A TASK RUNS UNDER, as chat reads them (v48): the declared
324
- * risk and what it means, the same one-line summary the task page and CLI
323
+ * THE AGENTS A TASK RUNS UNDER, as chat reads them (v48): the task's size,
324
+ * the same one-line summary the task page and CLI
325
325
  * print, each role's exact agent with its reasons, the standing of those
326
326
  * agents (approved / awaiting approval / recommended), and — for a
327
327
  * proposal — only the configured, role-valid choices an operator could
@@ -334,14 +334,11 @@ export function agentsOver(store, taskId, now) {
334
334
  return null;
335
335
  const routed = routeOfTask(store, taskId, ref, now);
336
336
  const scope = store.getScope(taskId);
337
- const risk = ref.riskLevel ?? scope?.riskLevel ?? "routine";
338
- const editable = !store.hasLiveClaim(ref.id, now) && store.activeTournamentTerms(ref.id) === null;
339
- const editableWhy = store.hasLiveClaim(ref.id, now) ? "this task is running — its agents cannot change under a live claim" : store.activeTournamentTerms(ref.id) !== null ? "tournament terms decide the agents while the contest is open" : null;
337
+ const editable = !store.hasLiveClaim(ref.id, now);
338
+ const editableWhy = store.hasLiveClaim(ref.id, now) ? "this task is running — its agents cannot change under a live claim" : null;
340
339
  const base = {
341
340
  task: taskId,
342
- risk: { level: risk, title: riskTitle(risk), consequence: riskConsequence(risk) },
343
341
  size: ref.sizing == null ? null : { size: ref.sizing.size, risky: ref.sizing.risky, reason: ref.sizing.reason, source: sizeSourceWords(ref.sizing.source) },
344
- riskChoices: RISK_CHOICES.map(one => ({ risk: one.risk, title: one.title, consequence: one.consequence })),
345
342
  editable,
346
343
  editableWhy,
347
344
  approval: scope === null ? "none" : scopeStandingOf(store, taskId),
@@ -1536,7 +1533,7 @@ const MATE_TOOL_HANDLERS = {
1536
1533
  },
1537
1534
  },
1538
1535
  get_agents: {
1539
- description: "Read current roles, risk, approval, configured alternatives and the organisation policy (allowed providers, models, tools, permission ceiling; changed only on Settings → Policy) before propose_agents.",
1536
+ description: "Read current roles, size, approval, configured alternatives and the organisation policy (allowed providers, models, tools, permission ceiling; changed only on Settings → Policy) before propose_agents.",
1540
1537
  handle: (ctx, args) => {
1541
1538
  const taskId = taskIdOf(args);
1542
1539
  if (taskId === null)
@@ -1697,8 +1694,6 @@ const MATE_TOOL_HANDLERS = {
1697
1694
  return { ok: false, message: `guidance is plain text up to ${LIMITS.note} characters` };
1698
1695
  if (task.state === "done" || task.state === "cancelled")
1699
1696
  return { ok: false, message: "that task is finished, so guidance has no next attempt to reach" };
1700
- if (ctx.store.openContestFor(ref.id) !== null)
1701
- return { ok: false, message: "agents are racing on that task — wait until the comparison finishes" };
1702
1697
  const id = ctx.draft("steer", { task: taskId, taskTitle: task.title, repoId: ref.repoId, note: args["note"] });
1703
1698
  if (id === null)
1704
1699
  return tooMany();
@@ -1790,14 +1785,13 @@ const MATE_TOOL_HANDLERS = {
1790
1785
  },
1791
1786
  },
1792
1787
  propose_agents: {
1793
- description: "Read get_agents. Change risk, size (small: fast model, no plan; large or risky: strongest agents), configured role model, or clear override; stales approval, refuses running work.",
1788
+ description: "Read get_agents. Change size (small: fast model, no plan; large or risky: strongest agents), configured role model, or clear override; stales approval, refuses running work.",
1794
1789
  handle: (ctx, args) => {
1795
1790
  const taskId = taskIdOf(args);
1796
1791
  const ref = taskId === null ? null : admittedRef(ctx, taskId);
1797
1792
  const task = taskId === null ? null : ctx.store.getTask(taskId);
1798
1793
  if (taskId === null || ref === null || task === null)
1799
1794
  return notFound();
1800
- const risk = args["risk"];
1801
1795
  const roleWord = args["role"];
1802
1796
  const phase = roleWord === undefined ? null : typeof roleWord === "string" ? ROLE_OF_WORD[roleWord] ?? null : null;
1803
1797
  if (roleWord !== undefined && (phase === null || phase === "review"))
@@ -1808,8 +1802,8 @@ const MATE_TOOL_HANDLERS = {
1808
1802
  const risky = args["risky"];
1809
1803
  const sized = ctx.store.refForId(ref.id)?.sizing ?? null;
1810
1804
  const sizeChange = size === undefined && risky === undefined ? null : { size: size ?? sized?.size ?? "medium", risky: risky ?? sized?.risky ?? false };
1811
- if (risk === undefined && phase === null && sizeChange === null)
1812
- return { ok: false, message: "say what changes: a risk, a size, or a role with an agent (or clear: true)" };
1805
+ if (phase === null && sizeChange === null)
1806
+ return { ok: false, message: "say what changes: a size, or a role with an agent (or clear: true)" };
1813
1807
  if (phase !== null && !clear && (agent === null || typeof agent !== "object"))
1814
1808
  return { ok: false, message: "a role change names an agent from get_agents, or clear: true" };
1815
1809
  if (phase === null && (clear || agent !== undefined))
@@ -1818,8 +1812,6 @@ const MATE_TOOL_HANDLERS = {
1818
1812
  return { ok: false, message: "why is plain text ≤400" };
1819
1813
  if (ctx.store.hasLiveClaim(ref.id, ctx.now))
1820
1814
  return { ok: false, message: "a worker is building that task right now — its agents cannot change under it" };
1821
- if (ctx.store.activeTournamentTerms(ref.id) !== null)
1822
- return { ok: false, message: "tournament terms decide this task's agents while the contest is open" };
1823
1815
  const view = agentsOver(ctx.store, taskId, ctx.now);
1824
1816
  if (view === null)
1825
1817
  return notFound();
@@ -1840,19 +1832,16 @@ const MATE_TOOL_HANDLERS = {
1840
1832
  }
1841
1833
  chosen = { provider: match.provider, model: match.model };
1842
1834
  const currentLeg = view["agents"].find(one => one.role === ROLE_WORD[phase]);
1843
- if (currentLeg !== undefined && sameSpec(currentLeg, chosen) && risk === undefined)
1835
+ if (currentLeg !== undefined && sameSpec(currentLeg, chosen))
1844
1836
  return { ok: false, message: `${specWords(chosen)} already runs the ${ROLE_WORD[phase]} role` };
1845
1837
  }
1846
1838
  if (phase !== null && clear && !(current?.routeOverrides ?? []).some(one => one.phase === phase)) {
1847
1839
  return { ok: false, message: `nobody chose a ${ROLE_WORD[phase]} for this task by hand — there is nothing to clear` };
1848
1840
  }
1849
- if (risk !== undefined && phase === null && risk === view["risk"].level)
1850
- return { ok: false, message: `this task is already declared ${riskTitle(risk).toLowerCase()}` };
1851
1841
  const id = ctx.draft("agents", {
1852
1842
  task: taskId,
1853
1843
  taskTitle: task.title,
1854
1844
  repoId: ref.repoId,
1855
- ...(risk === undefined ? {} : { risk, riskConsequence: riskConsequence(risk) }),
1856
1845
  ...(sizeChange === null ? {} : { size: sizeChange.size, risky: sizeChange.risky }),
1857
1846
  ...(phase === null ? {} : { phase, role: ROLE_WORD[phase] }),
1858
1847
  ...(chosen === null ? {} : { provider: chosen.provider, model: chosen.model }),
@@ -1870,7 +1859,6 @@ const MATE_TOOL_HANDLERS = {
1870
1859
  proposal: id,
1871
1860
  kind: "agents",
1872
1861
  task: taskId,
1873
- ...(risk === undefined ? {} : { risk }),
1874
1862
  ...(sizeChange === null ? {} : { size: sizeChange.size, risky: sizeChange.risky }),
1875
1863
  ...(phase === null ? {} : { role: ROLE_WORD[phase], ...(chosen === null ? { clear: true } : { agent: chosen }) }),
1876
1864
  awaiting: view["approval"] === "approved" ? "the operator's confirmation — the current approval will then need renewing" : "the operator's confirmation",
package/dist/modes.d.ts CHANGED
@@ -27,7 +27,8 @@ export type ModeTerms = {
27
27
  /** Explicit opt-in: a verified planner may approve a plan that preserves
28
28
  * the signer's pre-authorized filed contract and execution terms exactly. */
29
29
  planAuto: boolean;
30
- /** Attended mint without the per-mint password — signer only (D8). */
30
+ /** Historical signed field (watched sessions without a per-session
31
+ * password, removed in v115); new modes leave it false and nothing reads it. */
31
32
  quickMint: boolean;
32
33
  /** Historical signed field; new modes leave it false and no worker consumes
33
34
  * it. Automatic review is the project's review switch (review-switch.ts),
@@ -47,15 +48,13 @@ export type ModeTerms = {
47
48
  * "automerge" = the mode's signature substitutes for the per-merge
48
49
  * human authorization, through the grant machinery only (D1/E1). */
49
50
  publication: "notify" | "automerge";
50
- /** Whether this mode AUTHORIZES automatic PAID fallback (a
51
- * subscription->api-key or api-key->api-key switch that spends). v30,
52
- * fallback chains R8: legacy modes default FALSE — a paid substitution
53
- * must be an explicit, freshly-signed grant. A subscription->subscription
54
- * fallback is not "paid" and needs no grant. */
51
+ /** Historical signed term (v30-v114: a grant for automatic paid
52
+ * fallback; fallback chains were removed in v115). Always false on new
53
+ * modes; retained for digest and audit compatibility. */
55
54
  allowPaidFallback: boolean;
56
55
  /** Whether this mode AUTHORIZES the bounded repair loop to draft AND
57
56
  * auto-approve its own repair attempts (v40, evidence-review-v1) — the
58
- * allowPaidFallback precedent, verbatim: legacy modes default FALSE, a
57
+ * same precedent as the old paid-fallback grant: legacy modes default FALSE, a
59
58
  * new authority is never inherited, only freshly signed. Without it, a
60
59
  * short/refuted run with named unresolved criteria still gets exactly
61
60
  * one drafted repair — it simply waits unapproved. */
package/dist/modes.js CHANGED
@@ -24,7 +24,7 @@ export function presetTerms(name, absoluteExpiry) {
24
24
  permissionDefault: "safe",
25
25
  autoApproveFiling: false,
26
26
  planAuto: false,
27
- quickMint: true,
27
+ quickMint: false,
28
28
  reviewAuto: false,
29
29
  reviewRetryAuto: false,
30
30
  perAttemptBudgetMicrousd: null,
@@ -42,7 +42,7 @@ export function presetTerms(name, absoluteExpiry) {
42
42
  permissionDefault: "escalated",
43
43
  autoApproveFiling: true,
44
44
  planAuto: false,
45
- quickMint: true,
45
+ quickMint: false,
46
46
  reviewAuto: false,
47
47
  reviewRetryAuto: false,
48
48
  perAttemptBudgetMicrousd: null,
@@ -108,10 +108,8 @@ export function modeTermsFromJson(json) {
108
108
  measured !== undefined &&
109
109
  runs !== undefined &&
110
110
  (t["publication"] === "notify" || t["publication"] === "automerge") &&
111
- // allowPaidFallback: a legacy mode has NO such field — that MUST read
112
- // as false (R8: a paid substitution is only ever an explicit,
113
- // freshly-signed grant). A present value must be a strict boolean;
114
- // anything else is a bad envelope, null.
111
+ // allowPaidFallback (historical): absent reads as false; a present
112
+ // value must be a strict boolean, anything else is a bad envelope.
115
113
  (t["allowPaidFallback"] === undefined || typeof t["allowPaidFallback"] === "boolean") &&
116
114
  // repairAuto/repairMaxAttempts: the SAME precedent, verbatim (v40). A
117
115
  // legacy mode has NO such fields — that MUST read as false/0, never
@@ -155,11 +153,8 @@ export function modeWords(terms) {
155
153
  terms.autoApproveFiling
156
154
  ? "every scope YOU file — signed-in console or credentialed CLI — is approved the moment you file it; while this mode is active, your signed-in browser session becomes a spend credential for this repository"
157
155
  : "filings still wait for their own approval ceremony",
158
- terms.quickMint
159
- ? "you start watched sessions without re-typing your password — the confirm screen still shows every term"
160
- : "watched sessions keep the per-session password",
161
156
  terms.planAuto
162
- ? "plans for your pre-authorized filings auto-approve only when the goal, exclusions, paths, acceptance criteria, risk, budget, and agent route remain exactly unchanged; provide a goal, paths and acceptance criteria upfront; amendments and unresolved questions still wait for you"
157
+ ? "plans for your pre-authorized filings auto-approve only when the goal, exclusions, paths, acceptance criteria, budget, and agent route remain exactly unchanged; provide a goal, paths and acceptance criteria upfront; amendments and unresolved questions still wait for you"
163
158
  : "planner-generated plans wait for your approval",
164
159
  terms.name === "hands-off"
165
160
  ? "automatic review is on for this project unless you turn it off (`toolroll review off --repo <path>`): each finished build whose check passes (or that finishes, with checks Off) gets one read-only review by the project's review agent; a HIGH finding sends it back once as a revision filed under this mode, a HIGH on that revision comes to you, MEDIUM and LOW findings come to you as suggested follow-ups, and a review that fails or times out never holds the work — it reaches you marked not reviewed"
@@ -178,9 +173,8 @@ export function modeWords(terms) {
178
173
  terms.publication === "automerge"
179
174
  ? "pull requests merge THEMSELVES when CI is seen green on the exact commit — you are told afterwards (requires a merge-capable publication grant)"
180
175
  : "merges wait for you — even where a grant could merge on its own, while this mode is active",
181
- terms.allowPaidFallback
182
- ? "when a subscription is exhausted mid-build, an approved fallback that spends (an API key) may run automatically — spend moves to that account"
183
- : "automatic fallback never switches to a paid API key on its own; a subscription that runs out stops and waits for you",
176
+ ...(terms.allowPaidFallback
177
+ ? ["a historical paid-fallback grant is retained on record but no longer used"] : []),
184
178
  ...(terms.repairAuto
185
179
  ? ["historical automatic repair grants are retained on record but no longer schedule work"] : []),
186
180
  ...(terms.chatApprove
@@ -10,7 +10,7 @@ const args = (positionals = '', values = '', references = {}) => ({
10
10
  * digest. Neither dereferences a conversation, task or proposal. Creation IDs are never looked up. */
11
11
  export const REMOTE_ARGUMENTS = new Map([
12
12
  ...['status', 'ready', 'grants', 'gaps', 'sync', 'runner list', 'coordinator list', 'incident list',
13
- 'routine list', 'intake show', 'intake run', 'template list', 'webhook status', 'review show',
13
+ 'intake show', 'intake run', 'template list', 'webhook status', 'review show',
14
14
  'chat-approval show', 'chat-approval off'].map(row => [row, args()]),
15
15
  ['integrations', args('', 'saved')],
16
16
  // --person and --token-name are names compared inside the reader's own view; --token stays a refused credential.
@@ -31,7 +31,7 @@ export const REMOTE_ARGUMENTS = new Map([
31
31
  ['task next', args('id:task', 'key undo')],
32
32
  ['task steer', args('id:task', 'note')],
33
33
  ['task assign', args('id:task', 'key runner anyone')],
34
- ['task scope', args('id:task', 'key goal not touches budget-usd risk acceptance candidate compare model provider race race-count race-per-usd race-total-usd repair-model')],
34
+ ['task scope', args('id:task', 'key goal not touches budget-usd risk acceptance candidate model provider repair-model')],
35
35
  ['task plan', args('id:task', 'key provider model')],
36
36
  ['task hold', args('id:task', 'key reason until')],
37
37
  ['task unhold', args('id:task', 'key')],
@@ -47,13 +47,9 @@ export const REMOTE_ARGUMENTS = new Map([
47
47
  ['cap list', args()], ['cap add', args('name', 'kind probe expires')],
48
48
  // These objects are installation-scoped at the outer boundary; only an all-project principal reaches them.
49
49
  ['incident resolve', args('incident')],
50
- ['routine show', args('id')],
51
- ['routine add', args('name', 'goal schedule acceptance ceiling budget-usd not touches require')],
52
- ...['refresh', 'pause', 'resume', 'run-now'].map(action => [`routine ${action}`, args('name')]),
53
50
  ['config show', args('phase?')], ['verify show', args()],
54
51
  ['intake preview', args()], ['intake pr-comments', args('', 'limit')],
55
52
  ['template show', args('name')],
56
- ['contest show', args('id')], ['contest exclude', args('contest ordinal')],
57
53
  ...['search', 'impact'].map(action => [`knowledge ${action}`, args('query', 'base')]),
58
54
  ['knowledge refresh', args('', 'base')],
59
55
  // Decision reads and supersession are already project-bound in project-memory.ts. Proposal IDs are
@@ -43,10 +43,9 @@ export const REMOTE_SCOPES = new Map([
43
43
  ["task list", listing],
44
44
  ["runner list", installation], ["coordinator list", installation], ["outbox list", installation], ["incident list", installation], ["incident resolve", installation],
45
45
  ["cap list", repo], ["cap add", repo],
46
- ...["list", "show", "add", "refresh", "pause", "resume", "run-now"].map(action => [`routine ${action}`, installation]),
47
46
  ["config show", installation], ["verify show", repo], ["intake show", installation], ["intake run", installation], ["intake preview", installation],
48
- ["intake pr-comments", installation], ["template list", installation], ["template show", installation], ["contest show", installation],
49
- ["contest exclude", installation], ["webhook status", installation], ["review show", installation],
47
+ ["intake pr-comments", installation], ["template list", installation], ["template show", installation],
48
+ ["webhook status", installation], ["review show", installation],
50
49
  ["chat-approval show", self], ["chat-approval off", self],
51
50
  // The person's own remote actions, or everyone's within their projects for an approver (remote-audit.ts).
52
51
  ["audit", self],
@@ -63,11 +62,11 @@ export const REMOTE_SCOPES = new Map([
63
62
  */
64
63
  export const REMOTE_ALL_PROJECTS_ONLY = new Map([
65
64
  // Settings, connections and acts that belong to the installation as a whole, not to any one project.
66
- ...["integrations", "grants", "sync", "incident resolve", "routine add", "routine refresh", "routine pause", "routine resume", "routine run-now",
67
- "config show", "intake run", "contest exclude", "webhook status"].map(row => [row, "installation-wide"]),
65
+ ...["integrations", "grants", "sync", "incident resolve",
66
+ "config show", "intake run", "webhook status"].map(row => [row, "installation-wide"]),
68
67
  // Cross-project lists and reads a limited person is still refused; scoping them is later work.
69
- ...["runner list", "coordinator list", "outbox list", "incident list", "routine list", "routine show", "intake show", "intake preview",
70
- "intake pr-comments", "template list", "template show", "contest show", "review show"].map(row => [row, "not yet scoped"]),
68
+ ...["runner list", "coordinator list", "outbox list", "incident list", "intake show", "intake preview",
69
+ "intake pr-comments", "template list", "template show", "review show"].map(row => [row, "not yet scoped"]),
71
70
  ]);
72
71
  /** The projects a listing or task reference may disclose: null for someone with access to all of them. */
73
72
  export function remoteLensOf(store, scope, allows) {
package/dist/operate.d.ts CHANGED
@@ -73,10 +73,6 @@ export type OperateOptions = {
73
73
  integrationIo?: Partial<IntegrationIo>;
74
74
  /** Injected by tests: the mate's provider fetch, key environment, and stdin lines. */
75
75
  mateSeams?: MateCliSeams;
76
- /** Injected by tests: a held-session coordinator, so a `tick` exercises
77
- * the attended road exactly as a co-located `up` would (production wires
78
- * one only inside `up`). */
79
- heldCoordinator?: import("./held.js").HeldSessionCoordinator;
80
76
  /** Test seam for the short indexed wait loop. */
81
77
  waitSleep?: (milliseconds: number) => Promise<void>;
82
78
  /** Injected by tests: `onboard`'s home folder, terminal and probes. */
@@ -110,8 +106,6 @@ export declare const TASK_ACTIONS: readonly ["add", "list", "show", "wait", "sta
110
106
  export declare const PUBLISH_ACTIONS: readonly ["setup", "grant", "revoke", "status", "unblock", "rearm", "merge", "refire"];
111
107
  export declare const CONFIG_ACTIONS: readonly ["show", "set", "clear"];
112
108
  export declare const APPROVER_ACTIONS: readonly ["list", "add"];
113
- export declare const ROUTINE_ACTIONS: readonly ["list", "add", "show", "approve", "refresh", "pause", "resume", "run-now"];
114
- export declare const CONTEST_ACTIONS: readonly ["show", "exclude"];
115
109
  export declare const PEOPLE_ACTIONS: readonly ["list", "invite", "projects", "revoke"];
116
110
  export declare const KEYS_ACTIONS: readonly ["status", "set", "clear", "verify", "auth"];
117
111
  /**