toolroll 0.9.55 → 0.9.56

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 (200) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +24 -8
  3. package/dist/action-ledger.d.ts +2 -4
  4. package/dist/action-ledger.js +2 -10
  5. package/dist/approval-policy.d.ts +5 -5
  6. package/dist/approval-policy.js +4 -4
  7. package/dist/approval-rules-ui.js +2 -2
  8. package/dist/browser/workspace.js +5 -5
  9. package/dist/browser-workspace.d.ts +12 -12
  10. package/dist/budget-alerts.js +3 -3
  11. package/dist/chat-actions.d.ts +23 -18
  12. package/dist/chat-actions.js +110 -88
  13. package/dist/chat-ask.d.ts +2 -2
  14. package/dist/chat-ask.js +5 -5
  15. package/dist/chat-channel.d.ts +15 -15
  16. package/dist/chat-channel.js +20 -20
  17. package/dist/chat-controls.d.ts +0 -4
  18. package/dist/chat-controls.js +0 -1
  19. package/dist/chat-core.js +1 -1
  20. package/dist/chat-delivery-state.js +2 -2
  21. package/dist/chat-delivery.d.ts +2 -2
  22. package/dist/chat-delivery.js +27 -34
  23. package/dist/chat-flow.js +3 -3
  24. package/dist/chat-messages.d.ts +1 -1
  25. package/dist/chat-messages.js +4 -4
  26. package/dist/chat-migration.d.ts +1 -1
  27. package/dist/chat-migration.js +11 -11
  28. package/dist/chat-rooms.js +3 -3
  29. package/dist/chat-warmth.d.ts +2 -2
  30. package/dist/cli.d.ts +1 -1
  31. package/dist/cli.js +6 -7
  32. package/dist/contracts/chat-actions.d.ts +32 -27
  33. package/dist/contracts/chat-actions.js +29 -11
  34. package/dist/contracts/chat-content.d.ts +1 -1
  35. package/dist/contracts/chat-content.js +1 -1
  36. package/dist/contracts/chat-tables.js +4 -4
  37. package/dist/contracts/console-api.d.ts +6 -6
  38. package/dist/contracts/console-api.js +7 -7
  39. package/dist/contracts/flow-propose.d.ts +3 -3
  40. package/dist/contracts/flow.d.ts +132 -125
  41. package/dist/contracts/flow.js +27 -12
  42. package/dist/contracts/lead-context.d.ts +1 -1
  43. package/dist/contracts/lead-context.js +2 -2
  44. package/dist/contracts/lead-tools.d.ts +20 -18
  45. package/dist/contracts/lead-tools.js +15 -15
  46. package/dist/contracts/stage-output.d.ts +1 -1
  47. package/dist/contracts/stage-output.js +1 -1
  48. package/dist/contracts/store-json.d.ts +23 -22
  49. package/dist/contracts/store-json.js +17 -17
  50. package/dist/contracts/{teammate-turn.d.ts → subagent-turn.d.ts} +5 -5
  51. package/dist/contracts/{teammate-turn.js → subagent-turn.js} +7 -7
  52. package/dist/converse.d.ts +23 -23
  53. package/dist/converse.js +28 -28
  54. package/dist/coordinator-proposals.d.ts +2 -2
  55. package/dist/coordinator-proposals.js +1 -1
  56. package/dist/coordinator.js +1 -1
  57. package/dist/deprecations.d.ts +12 -0
  58. package/dist/deprecations.js +20 -0
  59. package/dist/desktop-update-gate.js +8 -4
  60. package/dist/desktop-update.js +6 -1
  61. package/dist/discord-chat.js +6 -6
  62. package/dist/dispatch.d.ts +1 -1
  63. package/dist/dispatch.js +1 -1
  64. package/dist/envelope.js +0 -1
  65. package/dist/export-ui.js +1 -1
  66. package/dist/export.js +7 -7
  67. package/dist/flow-engine.d.ts +2 -2
  68. package/dist/flow-engine.js +21 -21
  69. package/dist/flow-insights.d.ts +1 -1
  70. package/dist/flow-share.js +13 -8
  71. package/dist/flow-steps.d.ts +5 -5
  72. package/dist/flow-steps.js +19 -19
  73. package/dist/flow-triggers.d.ts +1 -1
  74. package/dist/flow-triggers.js +1 -1
  75. package/dist/flows-cli.js +1 -1
  76. package/dist/flows-ui.js +20 -20
  77. package/dist/flows.js +19 -19
  78. package/dist/guides.js +4 -3
  79. package/dist/invoke.js +1 -1
  80. package/dist/kits-ui.js +5 -5
  81. package/dist/kits.d.ts +12 -12
  82. package/dist/kits.js +31 -31
  83. package/dist/{mate-cli.d.ts → lead-cli.d.ts} +11 -11
  84. package/dist/{mate-cli.js → lead-cli.js} +38 -38
  85. package/dist/lead-commitments.js +4 -4
  86. package/dist/lead-context.d.ts +2 -2
  87. package/dist/lead-context.js +9 -9
  88. package/dist/{mate-contract.d.ts → lead-contract.d.ts} +3 -3
  89. package/dist/{mate-contract.js → lead-contract.js} +7 -6
  90. package/dist/{mate-doors.d.ts → lead-doors.d.ts} +6 -6
  91. package/dist/{mate-doors.js → lead-doors.js} +24 -24
  92. package/dist/lead-follow.d.ts +5 -5
  93. package/dist/lead-follow.js +9 -9
  94. package/dist/lead-people.d.ts +5 -5
  95. package/dist/lead-people.js +14 -14
  96. package/dist/{mate-progress.d.ts → lead-progress.d.ts} +9 -9
  97. package/dist/{mate-progress.js → lead-progress.js} +3 -3
  98. package/dist/{mate-tools.d.ts → lead-tools.d.ts} +19 -19
  99. package/dist/{mate-tools.js → lead-tools.js} +109 -101
  100. package/dist/{mate.d.ts → lead.d.ts} +27 -27
  101. package/dist/{mate.js → lead.js} +102 -102
  102. package/dist/limits-ui.d.ts +1 -1
  103. package/dist/limits-ui.js +1 -1
  104. package/dist/mcp-connect.d.ts +1 -1
  105. package/dist/mcp-connect.js +3 -3
  106. package/dist/mcp-core.js +1 -1
  107. package/dist/memory-pass.d.ts +2 -2
  108. package/dist/memory-pass.js +7 -7
  109. package/dist/notification-rows.d.ts +2 -2
  110. package/dist/operate.d.ts +3 -3
  111. package/dist/operate.js +35 -34
  112. package/dist/policy.d.ts +1 -1
  113. package/dist/principal.d.ts +1 -1
  114. package/dist/principal.js +2 -2
  115. package/dist/project-delete-ui.js +1 -1
  116. package/dist/project-delete.d.ts +1 -1
  117. package/dist/project-delete.js +26 -26
  118. package/dist/project-memory.js +1 -1
  119. package/dist/project-tools.d.ts +1 -1
  120. package/dist/project-tools.js +1 -1
  121. package/dist/recipe-ui.js +1 -1
  122. package/dist/retention.js +4 -4
  123. package/dist/scope.d.ts +2 -2
  124. package/dist/scout-report.d.ts +1 -1
  125. package/dist/scout-report.js +1 -1
  126. package/dist/serve.js +40 -45
  127. package/dist/server/chat.d.ts +4 -4
  128. package/dist/server/chat.js +97 -97
  129. package/dist/server/chrome.js +3 -3
  130. package/dist/server/flows.js +69 -62
  131. package/dist/server/guards.js +3 -3
  132. package/dist/server/http.d.ts +3 -3
  133. package/dist/server/http.js +1 -1
  134. package/dist/server/live.js +6 -6
  135. package/dist/server/people-tokens.js +1 -1
  136. package/dist/server/remote.js +12 -10
  137. package/dist/server/render-chat.d.ts +30 -30
  138. package/dist/server/render-chat.js +33 -33
  139. package/dist/server/render-pages.js +2 -2
  140. package/dist/server/render-settings.d.ts +7 -0
  141. package/dist/server/render-settings.js +3 -0
  142. package/dist/server/route-table.js +9 -7
  143. package/dist/server/runtime.d.ts +13 -13
  144. package/dist/server/settings.js +14 -13
  145. package/dist/server/tasks.js +6 -5
  146. package/dist/setup-guide.d.ts +2 -2
  147. package/dist/slack-chat.d.ts +2 -2
  148. package/dist/slack-chat.js +6 -6
  149. package/dist/spend-ui.d.ts +3 -3
  150. package/dist/spend-ui.js +9 -9
  151. package/dist/spend.d.ts +14 -14
  152. package/dist/spend.js +31 -31
  153. package/dist/store-baseline.d.ts +19 -0
  154. package/dist/store-baseline.js +2873 -0
  155. package/dist/store.d.ts +197 -249
  156. package/dist/store.js +747 -3084
  157. package/dist/subagent-admin.d.ts +53 -0
  158. package/dist/{teammate-admin.js → subagent-admin.js} +37 -37
  159. package/dist/{teammate-desk.d.ts → subagent-desk.d.ts} +22 -23
  160. package/dist/{teammate-desk.js → subagent-desk.js} +26 -35
  161. package/dist/{teammate-memory.d.ts → subagent-memory.d.ts} +17 -17
  162. package/dist/{teammate-memory.js → subagent-memory.js} +41 -41
  163. package/dist/{teammate-question.d.ts → subagent-question.d.ts} +6 -6
  164. package/dist/{teammate-question.js → subagent-question.js} +17 -17
  165. package/dist/{teammate-tools.d.ts → subagent-tools.d.ts} +18 -18
  166. package/dist/{teammate-tools.js → subagent-tools.js} +36 -36
  167. package/dist/{teammate-week.d.ts → subagent-week.d.ts} +10 -10
  168. package/dist/{teammate-week.js → subagent-week.js} +23 -23
  169. package/dist/{teammate-work.d.ts → subagent-work.d.ts} +21 -21
  170. package/dist/{teammate-work.js → subagent-work.js} +50 -50
  171. package/dist/subagents-ui.d.ts +22 -0
  172. package/dist/{teammates-ui.js → subagents-ui.js} +45 -45
  173. package/dist/{teammates.d.ts → subagents.d.ts} +11 -11
  174. package/dist/{teammates.js → subagents.js} +21 -21
  175. package/dist/subscription-chat.d.ts +13 -13
  176. package/dist/subscription-chat.js +19 -19
  177. package/dist/surface.d.ts +19 -2
  178. package/dist/surface.js +7 -31
  179. package/dist/team-cli.d.ts +1 -0
  180. package/dist/team-cli.js +14 -2
  181. package/dist/team-leads.js +13 -13
  182. package/dist/team-runtime.d.ts +2 -2
  183. package/dist/team-runtime.js +8 -8
  184. package/dist/teams-chat.js +6 -6
  185. package/dist/telegram-flow.d.ts +3 -3
  186. package/dist/telegram-flow.js +3 -3
  187. package/dist/{telegram-mate.d.ts → telegram-lead.d.ts} +5 -5
  188. package/dist/{telegram-mate.js → telegram-lead.js} +27 -27
  189. package/dist/telegram-status.js +1 -1
  190. package/dist/telegram-team.d.ts +1 -1
  191. package/dist/telegram-team.js +5 -5
  192. package/dist/telegram.d.ts +1 -1
  193. package/dist/telegram.js +9 -30
  194. package/dist/text-limits.d.ts +18 -18
  195. package/dist/text-limits.js +18 -18
  196. package/dist/toolroll-update.d.ts +8 -0
  197. package/dist/toolroll-update.js +45 -8
  198. package/package.json +1 -2
  199. package/dist/teammate-admin.d.ts +0 -53
  200. package/dist/teammates-ui.d.ts +0 -21
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.9.56 — 2026-10-09
4
+
5
+ - **One lead.** Your assistant in the console, on your phone, in chat and in
6
+ the CLI is the same lead. Teammates are now its subagents, with their
7
+ personalities and rules: "ask Rosa to…", or from a flow step.
8
+ - **Retiring soon.** The central team service and native coding sessions are
9
+ hidden and warn when used; they are removed next release.
10
+ - **Fresh baseline.** New installs start from a baseline schema. Databases
11
+ older than 0.5.0 are asked to update through 0.9.x first.
12
+
3
13
  ## 0.9.55 — 2026-10-09
4
14
 
5
15
  - **One door per route.** Every page's access comes from one table with one
package/README.md CHANGED
@@ -366,7 +366,7 @@ for people splitting those parts across machines.
366
366
  Specialized views remain in **Tools** and **Settings**: the activity ledger, the review cockpit,
367
367
  the fleet,
368
368
  people (invite a second approver), the operating mode (a signed, expiring
369
- envelope that pre-approves your own filings), and **chat** — the mate, one
369
+ envelope that pre-approves your own filings), and **chat** — your lead, one
370
370
  conversation across every project, which only ever proposes.
371
371
 
372
372
  ### In the terminal
@@ -383,7 +383,7 @@ toolroll decide <id> --choose <option> # answer a parked decision
383
383
  toolroll task show retries # attempts, outcome, where the branch is
384
384
 
385
385
  toolroll task add "Why does the login test flake?" --id flaky --report # a scout
386
- toolroll chat --say "what is waiting on me across every project?" # the mate
386
+ toolroll chat --say "what is waiting on me across every project?" # your lead
387
387
  ```
388
388
 
389
389
  Every command takes `--json` and answers with one envelope; every mutation
@@ -808,21 +808,37 @@ contents or command lines, with credential-shaped lines redacted at
808
808
  write. Digits focus one pane, `a` shows them all, `q` leaves. Outside a
809
809
  terminal, or with `--json`, it prints one snapshot and exits.
810
810
 
811
- ## The mate, and the gateway
811
+ ## The lead, its subagents, and the gateway
812
812
 
813
- `/chat` in the console (or `toolroll chat` in the terminal) is one
814
- conversation across every project you serve. The mate reads the fleet
813
+ `/chat` in the console (or `toolroll chat` in the terminal, or your chat app on
814
+ the phone) is one conversation with your lead across every project you serve.
815
+ The console, the terminal, Telegram, Slack, Discord and Teams all talk to the
816
+ same lead with the same tools. The lead reads the fleet
815
817
  and **only proposes**: file a task (or a scout), move one to the front,
816
818
  reserve it for a worker, hold it, rewrite a scope, retry/replace/unlink a
817
819
  terminal dependency, guide a task's next attempt, cancel, or suggest an answer to a parked decision. Every
818
820
  proposal is a card you confirm, with
819
821
  every consequence and the builder's recommendation shown beside the
820
- mate's pick; a scope the mate wrote never seals under an operating mode.
822
+ lead's pick; a scope the lead wrote never seals under an operating mode.
821
823
  Absolute paths, internal digests and account names are redacted; source context includes relative file citations. Direct API use spends
822
824
  against a ceiling you set per conversation. The console keeps a live pulse for every
823
825
  admitted project beside that shared thread, with one-click fleet questions
824
826
  and a direct road to each project's board.
825
827
 
828
+ The lead has **subagents**: named helpers, each with its own personality,
829
+ instructions and rules (what it does on its own, what it asks first, what it
830
+ never does). Say "ask Maya to draft the refund reply" and the lead shows a card
831
+ with exactly what goes to Maya; once you confirm, Maya works it within her rules
832
+ and her answer comes back to you. A flow step can call a subagent by name too.
833
+ They live in **Settings → Lead → Subagents** ([guide](docs/guide/subagents.md)).
834
+ Subagents used to be called AI teammates; each carried over unchanged.
835
+
836
+ The central team service (`toolroll connect`, the central `toolroll lead
837
+ list|create|update|member|transfer`, `toolroll conversation …`, team chat) and
838
+ native coding sessions (`toolroll session …`, the `/code` page) are deprecated:
839
+ they still work for this release, hidden from help and the console, print one warning
840
+ when used, and are removed in the next minor release.
841
+
826
842
  Every task has an **Overview / Ask** switch. **Ask** opens a focused companion
827
843
  to that task without creating another conversation: Toolroll attaches
828
844
  the current task to each new message, keeps the live status beside the thread,
@@ -831,7 +847,7 @@ result inspection. Proposed guidance is inert until you confirm its card, then i
831
847
  reaches the next attempt without interrupting work already running.
832
848
 
833
849
  New work starts the same way: describe the outcome once in ordinary language.
834
- The mate infers a concise title, narrow scope, safe non-goals, and proof
850
+ The lead infers a concise title, narrow scope, safe non-goals, and proof
835
851
  criteria; it asks only when the project or outcome is genuinely ambiguous, or
836
852
  when an irreversible or compatibility tradeoff changes what should be built.
837
853
  Questions are grouped, carry a recommended default, and stop for reversible
@@ -985,7 +1001,7 @@ Everything below ships in 0.4.0:
985
1001
  sessions, invites, and every mode they signed end together, while
986
1002
  history stays attributed forever.
987
1003
  - **Scout tasks** — `task add … --report` (or the "scout" checkbox, or
988
- the mate's `propose_task` with `report: true`) files a task whose
1004
+ the lead's `propose_task` with `report: true`) files a task whose
989
1005
  deliverable is a report, never a branch: once its scope is approved,
990
1006
  a read-only session investigates the goal as a question and hands
991
1007
  back a title, a summary, a document, and up to five follow-ups, each
@@ -16,11 +16,9 @@ export type LedgerEntry = {
16
16
  /** v99: what changed, in a short line (a policy's "before → after"); never a secret, prompt or body. */
17
17
  detail: string | null;
18
18
  };
19
- /** The table as v54 made it: the one earlier shape the v99 rebuild accepts. */
20
- export declare const LEDGER_V54_TABLE: (name: string) => string;
21
- export declare const LEDGER_V54_COLUMNS: readonly ["id", "at", "actor", "repo", "task_id", "run_id", "action", "outcome", "source"];
22
- /** The table as v99 made it: the v110 rebuild accepts this shape and v54's. */
19
+ /** The table as v99 made it (v107 has it): the one earlier shape the v110 rebuild accepts. */
23
20
  export declare const LEDGER_V99_TABLE: (name: string) => string;
21
+ export declare const LEDGER_COLUMNS: readonly ["id", "at", "actor", "repo", "task_id", "run_id", "action", "outcome", "source", "detail"];
24
22
  export declare const LEDGER_TABLE: (name: string) => string;
25
23
  export declare const LEDGER_SCHEMA: string;
26
24
  /** Installed after all table migrations. Work events commit with the work,
@@ -1,16 +1,7 @@
1
1
  /** v99: sign-ins (and refusals, lockouts, sign-outs) and policy changes are their own kinds of event.
2
2
  * v110: commands a person ran on this server with their API token, from the CLI ('api') or their agent ('mcp'). */
3
3
  export const LEDGER_SOURCES = ["work", "request", "access", "sign-in", "policy", "api", "mcp"];
4
- /** The table as v54 made it: the one earlier shape the v99 rebuild accepts. */
5
- export const LEDGER_V54_TABLE = (name) => `CREATE TABLE ${name} (
6
- id INTEGER PRIMARY KEY AUTOINCREMENT,
7
- at TEXT NOT NULL, actor TEXT NOT NULL, repo TEXT,
8
- task_id TEXT, run_id INTEGER,
9
- action TEXT NOT NULL, outcome TEXT NOT NULL,
10
- source TEXT NOT NULL CHECK (source IN ('work','request','access'))
11
- )`;
12
- export const LEDGER_V54_COLUMNS = ["id", "at", "actor", "repo", "task_id", "run_id", "action", "outcome", "source"];
13
- /** The table as v99 made it: the v110 rebuild accepts this shape and v54's. */
4
+ /** The table as v99 made it (v107 has it): the one earlier shape the v110 rebuild accepts. */
14
5
  export const LEDGER_V99_TABLE = (name) => `CREATE TABLE ${name} (
15
6
  id INTEGER PRIMARY KEY AUTOINCREMENT,
16
7
  at TEXT NOT NULL, actor TEXT NOT NULL, repo TEXT,
@@ -19,6 +10,7 @@ export const LEDGER_V99_TABLE = (name) => `CREATE TABLE ${name} (
19
10
  source TEXT NOT NULL CHECK (source IN ('work','request','access','sign-in','policy')),
20
11
  detail TEXT
21
12
  )`;
13
+ export const LEDGER_COLUMNS = ["id", "at", "actor", "repo", "task_id", "run_id", "action", "outcome", "source", "detail"];
22
14
  export const LEDGER_TABLE = (name) => `CREATE TABLE ${name} (
23
15
  id INTEGER PRIMARY KEY AUTOINCREMENT,
24
16
  at TEXT NOT NULL, actor TEXT NOT NULL, repo TEXT,
@@ -5,21 +5,21 @@
5
5
  * - The person who filed a task can't approve it ("not the requester").
6
6
  * - Protected work (the whole project, or tasks that touch protected paths)
7
7
  * needs two different people to approve the same exact scope, and an AI
8
- * teammate or an operating mode can never decide it.
8
+ * subagent or an operating mode can never decide it.
9
9
  *
10
10
  * The store enforces these at the one place every approval is sealed
11
11
  * (`Store.sealScopeApproval`); this module holds the pure parts.
12
12
  */
13
13
  /** Who filed a task, as far as anyone can tell: a person (browser, chat, a
14
14
  * revision), a coordinator acting for the person who made it, an AI
15
- * teammate, or automation that names no person (a schedule, the CLI, a flow
15
+ * subagent, or automation that names no person (a schedule, the CLI, a flow
16
16
  * with no owner). The requester rule binds only a named person. */
17
- export type FilerKind = "person" | "coordinator" | "teammate" | "automation";
17
+ export type FilerKind = "person" | "coordinator" | "subagent" | "automation";
18
18
  export type Filer = {
19
19
  name: string | null;
20
20
  kind: FilerKind;
21
21
  };
22
- /** A filer from a name as the ledger writes it: an AI teammate's ends " (AI)"; a coordinator's starts "coordinator:"; none is automation. */
22
+ /** A filer from a name as the ledger writes it: a subagent's ends " (AI)"; a coordinator's starts "coordinator:"; none is automation. */
23
23
  export declare function filerFor(name: string | null | undefined): Filer;
24
24
  export type ApprovalRules = {
25
25
  notRequester: boolean;
@@ -27,7 +27,7 @@ export type ApprovalRules = {
27
27
  protectedPaths: string[];
28
28
  };
29
29
  export declare const NO_RULES: ApprovalRules;
30
- /** Who is sealing: a person at a ceremony, an operating mode, an AI teammate, or automation. */
30
+ /** Who is sealing: a person at a ceremony, an operating mode, a subagent, or automation. */
31
31
  export type ApproverKind = "person" | "mode" | "ai" | "automation";
32
32
  export type ApprovalGate = {
33
33
  verdict: "seal";
@@ -5,17 +5,17 @@
5
5
  * - The person who filed a task can't approve it ("not the requester").
6
6
  * - Protected work (the whole project, or tasks that touch protected paths)
7
7
  * needs two different people to approve the same exact scope, and an AI
8
- * teammate or an operating mode can never decide it.
8
+ * subagent or an operating mode can never decide it.
9
9
  *
10
10
  * The store enforces these at the one place every approval is sealed
11
11
  * (`Store.sealScopeApproval`); this module holds the pure parts.
12
12
  */
13
- /** A filer from a name as the ledger writes it: an AI teammate's ends " (AI)"; a coordinator's starts "coordinator:"; none is automation. */
13
+ /** A filer from a name as the ledger writes it: a subagent's ends " (AI)"; a coordinator's starts "coordinator:"; none is automation. */
14
14
  export function filerFor(name) {
15
15
  if (name == null || name === "")
16
16
  return { name: null, kind: "automation" };
17
17
  if (name.endsWith(" (AI)"))
18
- return { name, kind: "teammate" };
18
+ return { name, kind: "subagent" };
19
19
  if (name.startsWith("coordinator:"))
20
20
  return { name, kind: "coordinator" };
21
21
  return { name, kind: "person" };
@@ -133,5 +133,5 @@ export function gateWords(gate) {
133
133
  : `Your approval is recorded (${gate.have} of ${gate.need}). This work is protected, so a second person needs to approve it.`;
134
134
  return gate.reason === "requester"
135
135
  ? "You filed this task, and this project needs someone else to approve it."
136
- : "This work is protected: a person has to approve it, not an operating mode, a schedule or an AI teammate.";
136
+ : "This work is protected: a person has to approve it, not an operating mode, a schedule or a subagent.";
137
137
  }
@@ -16,9 +16,9 @@ export function rulesSummary(rules) {
16
16
  if (rules.notRequester)
17
17
  parts.push("The person who filed a task can't approve it.");
18
18
  if (rules.protectProject)
19
- parts.push("All work here is protected: two people approve it, never an AI teammate or an operating mode.");
19
+ parts.push("All work here is protected: two people approve it, never a subagent or an operating mode.");
20
20
  else if (rules.protectedPaths.length > 0)
21
- parts.push(`Work touching ${rules.protectedPaths.join(", ")} is protected: two people approve it, never an AI teammate or an operating mode.`);
21
+ parts.push(`Work touching ${rules.protectedPaths.join(", ")} is protected: two people approve it, never a subagent or an operating mode.`);
22
22
  return parts.length === 0 ? "No approval rules: anyone who can approve on this project can approve its work, including their own." : parts.join(" ");
23
23
  }
24
24
  export function approvalRulesHtml(view, notice) {