@te-river/opencode-team-mode 1.6.0 → 1.6.2

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 (150) hide show
  1. package/README.md +80 -15
  2. package/README.zh-CN.md +67 -18
  3. package/dist/host/note.d.ts +7 -0
  4. package/dist/host/note.d.ts.map +1 -0
  5. package/dist/host/note.js +31 -0
  6. package/dist/host/note.js.map +1 -0
  7. package/dist/host/v1.d.ts +14 -0
  8. package/dist/host/v1.d.ts.map +1 -0
  9. package/dist/host/v1.js +340 -0
  10. package/dist/host/v1.js.map +1 -0
  11. package/dist/host/v2-browser-gate.d.ts +45 -0
  12. package/dist/host/v2-browser-gate.d.ts.map +1 -0
  13. package/dist/host/v2-browser-gate.js +319 -0
  14. package/dist/host/v2-browser-gate.js.map +1 -0
  15. package/dist/host/v2-capabilities.d.ts +78 -0
  16. package/dist/host/v2-capabilities.d.ts.map +1 -0
  17. package/dist/host/v2-capabilities.js +173 -0
  18. package/dist/host/v2-capabilities.js.map +1 -0
  19. package/dist/host/v2-client.d.ts +53 -0
  20. package/dist/host/v2-client.d.ts.map +1 -0
  21. package/dist/host/v2-client.js +193 -0
  22. package/dist/host/v2-client.js.map +1 -0
  23. package/dist/host/v2-events.d.ts +56 -0
  24. package/dist/host/v2-events.d.ts.map +1 -0
  25. package/dist/host/v2-events.js +158 -0
  26. package/dist/host/v2-events.js.map +1 -0
  27. package/dist/host/v2-guard.d.ts +101 -0
  28. package/dist/host/v2-guard.d.ts.map +1 -0
  29. package/dist/host/v2-guard.js +199 -0
  30. package/dist/host/v2-guard.js.map +1 -0
  31. package/dist/host/v2-offload.d.ts +148 -0
  32. package/dist/host/v2-offload.d.ts.map +1 -0
  33. package/dist/host/v2-offload.js +288 -0
  34. package/dist/host/v2-offload.js.map +1 -0
  35. package/dist/host/v2-permissions.d.ts +123 -0
  36. package/dist/host/v2-permissions.d.ts.map +1 -0
  37. package/dist/host/v2-permissions.js +190 -0
  38. package/dist/host/v2-permissions.js.map +1 -0
  39. package/dist/host/v2-probe.d.ts +85 -0
  40. package/dist/host/v2-probe.d.ts.map +1 -0
  41. package/dist/host/v2-probe.js +268 -0
  42. package/dist/host/v2-probe.js.map +1 -0
  43. package/dist/host/v2-scope.d.ts +51 -0
  44. package/dist/host/v2-scope.d.ts.map +1 -0
  45. package/dist/host/v2-scope.js +58 -0
  46. package/dist/host/v2-scope.js.map +1 -0
  47. package/dist/host/v2-session-client.d.ts +105 -0
  48. package/dist/host/v2-session-client.d.ts.map +1 -0
  49. package/dist/host/v2-session-client.js +390 -0
  50. package/dist/host/v2-session-client.js.map +1 -0
  51. package/dist/host/v2-session.d.ts +85 -0
  52. package/dist/host/v2-session.d.ts.map +1 -0
  53. package/dist/host/v2-session.js +171 -0
  54. package/dist/host/v2-session.js.map +1 -0
  55. package/dist/host/v2-subagent.d.ts +157 -0
  56. package/dist/host/v2-subagent.d.ts.map +1 -0
  57. package/dist/host/v2-subagent.js +286 -0
  58. package/dist/host/v2-subagent.js.map +1 -0
  59. package/dist/host/v2-tool.d.ts +67 -0
  60. package/dist/host/v2-tool.d.ts.map +1 -0
  61. package/dist/host/v2-tool.js +209 -0
  62. package/dist/host/v2-tool.js.map +1 -0
  63. package/dist/host/v2-transcript.d.ts +73 -0
  64. package/dist/host/v2-transcript.d.ts.map +1 -0
  65. package/dist/host/v2-transcript.js +151 -0
  66. package/dist/host/v2-transcript.js.map +1 -0
  67. package/dist/host/v2-types.d.ts +229 -0
  68. package/dist/host/v2-types.d.ts.map +1 -0
  69. package/dist/host/v2-types.js +17 -0
  70. package/dist/host/v2-types.js.map +1 -0
  71. package/dist/host/v2.d.ts +42 -0
  72. package/dist/host/v2.d.ts.map +1 -0
  73. package/dist/host/v2.js +853 -0
  74. package/dist/host/v2.js.map +1 -0
  75. package/dist/index.d.ts +23 -17
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.js +29 -366
  78. package/dist/index.js.map +1 -1
  79. package/dist/prompts/lead.d.ts +1 -1
  80. package/dist/prompts/lead.d.ts.map +1 -1
  81. package/dist/prompts/lead.js +456 -426
  82. package/dist/prompts/lead.js.map +1 -1
  83. package/dist/prompts/shared.d.ts +2 -2
  84. package/dist/prompts/shared.d.ts.map +1 -1
  85. package/dist/prompts/shared.js +38 -11
  86. package/dist/prompts/shared.js.map +1 -1
  87. package/dist/prompts/specialists.d.ts +2 -2
  88. package/dist/prompts/specialists.d.ts.map +1 -1
  89. package/dist/prompts/specialists.js +7 -6
  90. package/dist/prompts/specialists.js.map +1 -1
  91. package/dist/task-offload.d.ts +16 -0
  92. package/dist/task-offload.d.ts.map +1 -1
  93. package/dist/task-offload.js +51 -0
  94. package/dist/task-offload.js.map +1 -1
  95. package/dist/tm/browser.d.ts.map +1 -1
  96. package/dist/tm/browser.js +41 -10
  97. package/dist/tm/browser.js.map +1 -1
  98. package/dist/tm/dispatch.d.ts +86 -1
  99. package/dist/tm/dispatch.d.ts.map +1 -1
  100. package/dist/tm/dispatch.js +360 -39
  101. package/dist/tm/dispatch.js.map +1 -1
  102. package/dist/tm/dupe-guard.d.ts +16 -3
  103. package/dist/tm/dupe-guard.d.ts.map +1 -1
  104. package/dist/tm/dupe-guard.js +27 -7
  105. package/dist/tm/dupe-guard.js.map +1 -1
  106. package/dist/tm/index.d.ts +40 -1
  107. package/dist/tm/index.d.ts.map +1 -1
  108. package/dist/tm/index.js +40 -11
  109. package/dist/tm/index.js.map +1 -1
  110. package/dist/tm/ledger.d.ts +114 -0
  111. package/dist/tm/ledger.d.ts.map +1 -0
  112. package/dist/tm/ledger.js +308 -0
  113. package/dist/tm/ledger.js.map +1 -0
  114. package/dist/tm/perm-ask.d.ts +1 -3
  115. package/dist/tm/perm-ask.d.ts.map +1 -1
  116. package/dist/tm/perm-ask.js +10 -1
  117. package/dist/tm/perm-ask.js.map +1 -1
  118. package/dist/tm/preview.d.ts +55 -0
  119. package/dist/tm/preview.d.ts.map +1 -1
  120. package/dist/tm/preview.js +225 -0
  121. package/dist/tm/preview.js.map +1 -1
  122. package/dist/tm/search.d.ts.map +1 -1
  123. package/dist/tm/search.js +40 -10
  124. package/dist/tm/search.js.map +1 -1
  125. package/dist/tm/serp-loop.d.ts +45 -0
  126. package/dist/tm/serp-loop.d.ts.map +1 -0
  127. package/dist/tm/serp-loop.js +80 -0
  128. package/dist/tm/serp-loop.js.map +1 -0
  129. package/dist/tm/stats.d.ts +29 -0
  130. package/dist/tm/stats.d.ts.map +1 -1
  131. package/dist/tm/stats.js +278 -4
  132. package/dist/tm/stats.js.map +1 -1
  133. package/dist/tm/webfetch.d.ts +4 -0
  134. package/dist/tm/webfetch.d.ts.map +1 -1
  135. package/dist/tm/webfetch.js +75 -8
  136. package/dist/tm/webfetch.js.map +1 -1
  137. package/docs/installation-v2.md +445 -0
  138. package/docs/installation.md +12 -0
  139. package/docs/research/agent-data-exchange.md +117 -0
  140. package/docs/research/browser-pane.md +89 -0
  141. package/docs/research/host-http-api.md +132 -0
  142. package/docs/research/host-subagent-injection.md +187 -0
  143. package/docs/research/plugin-loader-contract.md +261 -0
  144. package/docs/research/v2-builtin-tools.md +447 -0
  145. package/docs/v2-port-notes.md +413 -0
  146. package/index.js +7 -0
  147. package/package.json +64 -61
  148. package/scripts/gen-v2-config.mjs +304 -0
  149. package/scripts/lib/config-surgery.cjs +239 -0
  150. package/scripts/lib/fake-ctx.mjs +169 -0
@@ -0,0 +1,340 @@
1
+ /**
2
+ * The v1 personality: everything this plugin does through the OpenCode 1.18.x
3
+ * `server(input, options)` hook object. Moved out of `src/index.ts` verbatim
4
+ * for the v2 port (see docs plan) — no behaviour change is allowed here; a v1
5
+ * host must observe byte-identical hooks, and the ~1700 assertions in
6
+ * test-*.mjs are the oracle that keeps that promise.
7
+ *
8
+ * v1-only by construction: the single composed `tool.execute.before` slot, the
9
+ * permission-event approval gate, the `{"*": "ask"}` bash escalation object,
10
+ * and `tui.showToast` notification.
11
+ */
12
+ import { agents } from "../agents.js";
13
+ import { commands } from "../commands.js";
14
+ import { startBlackboardMaintenance, resolveTtlMs, DEFAULT_TTL_DAYS, } from "../blackboard.js";
15
+ import { createEnvProtectHook, parseExtraDeny, resolveEnvProtectMode, bashAskPatterns, } from "../envprotect.js";
16
+ import { createApprovalGate, resolveAskTimeoutMs, hasPermissionReplyCapability, } from "../approval-gate.js";
17
+ import { createTmTools } from "../tm/index.js";
18
+ import { createBashTimeoutHook } from "../tm/bash-timeout.js";
19
+ import { createCapabilityProbe } from "../capabilities.js";
20
+ import { createTaskOffload } from "../task-offload.js";
21
+ import { coerceToolArgs } from "../tool-coerce.js";
22
+ import { ASK_GRACE_MS, setAskBridgeObserver, setAskWaitMs } from "../tm/perm-ask.js";
23
+ import { applyToolDefinition, applyChatParams, applySessionCompacting, applyCompactionAutoContinue, applyShellEnv, hookSwitches, TASK_HINT_BACKGROUND, } from "../host-hooks.js";
24
+ import { hostBackgroundSubagentsEnabled } from "../tm/dispatch.js";
25
+ import { blackboardNote } from "./note.js";
26
+ export async function createV1Personality(input, options) {
27
+ // ---------- blackboard maintenance (code-level TTL sweeper) ----------
28
+ const directory = typeof input?.directory === "string" && input.directory.length > 0
29
+ ? input.directory
30
+ : process.cwd();
31
+ const ttlMs = resolveTtlMs(options);
32
+ const ttlDays = Math.round(ttlMs / (24 * 60 * 60 * 1000)) || DEFAULT_TTL_DAYS;
33
+ const boardRoot = startBlackboardMaintenance(directory, ttlMs);
34
+ const note = blackboardNote(boardRoot, ttlDays);
35
+ // ---------- R6 env protection (code-level interception) ----------
36
+ // Plugin option envProtect (default false): opt-in env protection.
37
+ // When disabled, R6 hook is not installed at all — no interception,
38
+ // no approval gate, no audit logging for env reads.
39
+ // When enabled, TM_ENV_PROTECT / TM_ENV_PROTECT_EXTRA_DENY still apply.
40
+ const envProtectMode = options?.envProtect
41
+ ? resolveEnvProtectMode(process.env.TM_ENV_PROTECT)
42
+ : "off";
43
+ const envProtectExtra = parseExtraDeny(process.env.TM_ENV_PROTECT_EXTRA_DENY);
44
+ // ---------- unified approval gate (R6 env face + R2 danger face) ----------
45
+ // Layer 2: ONE timer that auto-REJECTS unanswered official-dialog requests
46
+ // after TM_ASK_TIMEOUT_MIN and (Layer 3) fails closed if the SDK reply is
47
+ // broken. Armed ONLY when R6 is not off AND the client exposes a
48
+ // permission-reply path — otherwise there is no live auto-reject and the
49
+ // R6 hook must keep hard-throwing every env read (fail-closed).
50
+ // Attention hook for EVERY official dialog the plugin observes (bash R2/R6
51
+ // asks AND the tm_* ctx.ask web dialogs): the host's `tui.showToast` RPC
52
+ // (verified 1.18.30 route: payload { title?, message, variant, duration })
53
+ // surfaces a toast so a user not staring at the screen still learns a
54
+ // confirmation is waiting. Best-effort — never breaks the gate.
55
+ const notifyAsk = (message) => {
56
+ try {
57
+ const tui = input?.client
58
+ ?.tui;
59
+ if (typeof tui?.showToast === "function") {
60
+ const r = tui.showToast({
61
+ title: "OpenCode TeamMode",
62
+ message,
63
+ variant: "warning",
64
+ duration: 15_000,
65
+ });
66
+ if (r && typeof r.catch === "function") {
67
+ ;
68
+ r.catch(() => { });
69
+ }
70
+ }
71
+ }
72
+ catch {
73
+ /* notification is best-effort */
74
+ }
75
+ };
76
+ const approvalGate = envProtectMode !== "off" && hasPermissionReplyCapability(input?.client)
77
+ ? createApprovalGate({
78
+ client: input?.client,
79
+ timeoutMs: resolveAskTimeoutMs(process.env),
80
+ notify: notifyAsk,
81
+ })
82
+ : null;
83
+ if (approvalGate)
84
+ approvalGate.start();
85
+ // Sessions are only allowed to DEFER expressible env reads to the dialog
86
+ // once the gate registered them as carrying our injected bash ask set
87
+ // (reviewer C1: a global isArmed() deferral let stock build/plan agents
88
+ // run printenv silently). The authoritative source of that fact is the
89
+ // config hook below: it records exactly which agents got the escalated
90
+ // ask object, and a `message.updated`/`chat.message` user prompt routed
91
+ // to one of those agents registers its session (live-proven ordering:
92
+ // the user message event arrives before the session's first
93
+ // tool.execute.before, while permission.asked arrives AFTER it).
94
+ const injectedExecAgents = new Set();
95
+ const envProtectHook = createEnvProtectHook(input?.client, envProtectMode, envProtectExtra, { deferToApproval: (sessionID) => approvalGate?.canDefer(sessionID) ?? false,
96
+ envApproved: (sessionID) => approvalGate?.isEnvApproved(sessionID) ?? false });
97
+ // ---------- JIT layer-2 tools (tm_read / tm_grep / tm_bash / tm_fetch) ----------
98
+ // T0.4-verified static registration: server() hooks gain a `tool` segment.
99
+ // The R6 mode/extra resolved above are passed in so the tm_* pipelines
100
+ // share the SAME interception source as the built-in tools (anti-backdoor:
101
+ // the global hook ALSO aliases tm_* onto read/grep/bash — see envprotect).
102
+ // ---------- host-capability probe (see src/capabilities.ts) ----------
103
+ // The plugin's features degrade quietly when a host surface disappears;
104
+ // this records what is actually present and says so once, at startup,
105
+ // instead of letting an OpenCode upgrade surface as an agent working
106
+ // around something the user never agreed to lose.
107
+ let capabilityProbe = null;
108
+ const tmRuntime = await createTmTools(input, {
109
+ mode: envProtectMode,
110
+ extra: envProtectExtra,
111
+ notify: notifyAsk,
112
+ // The capability probe is built from the tm runtime (it needs the run
113
+ // store to log into), and tm_stats needs the probe back — a declaration
114
+ // before construction breaks the cycle without weakening either side.
115
+ capabilities: () => capabilityProbe?.snapshot() ?? [],
116
+ // A child session we take over (adopted from the host tree, or named to
117
+ // tm_join) is registered the moment it is recognised (the message.updated
118
+ // route below re-confirms it): an exec-role sub-agent whose session were
119
+ // NOT registered would hard-throw its own protected reads instead of
120
+ // opening the dialog.
121
+ onChildSession: (sessionID, agent) => {
122
+ if (approvalGate && injectedExecAgents.has(agent))
123
+ approvalGate.registerExecSession(sessionID);
124
+ },
125
+ });
126
+ // ---------- host-hook switches (TM_TOOL_HINTS / TM_COMPACTION_*) ------
127
+ const hostSwitches = hookSwitches(process.env);
128
+ capabilityProbe = createCapabilityProbe({
129
+ client: input?.client,
130
+ hasShellBridge: typeof input?.$ === "function",
131
+ hasPermissionReply: hasPermissionReplyCapability(input?.client),
132
+ trajectory: (event) => tmRuntime.pipelines.store.appendTrajectory(event),
133
+ notify: notifyAsk,
134
+ });
135
+ // ctx.ask is only observable from inside a tool call — perm-ask reports
136
+ // every lookup it makes, which is how this row ever reaches 已验证.
137
+ // The tool-side backstop for a dialog nobody answers. It is deliberately
138
+ // LONGER than the gate's own auto-reject so the gate stays authoritative when it
139
+ // is armed; when it is not (R6 off, no reply capability) this is the only thing
140
+ // that keeps a governed call from hanging until the user interrupts the turn.
141
+ setAskWaitMs(resolveAskTimeoutMs(process.env) + ASK_GRACE_MS);
142
+ setAskBridgeObserver((present) => capabilityProbe?.observeAskBridge(present));
143
+ // Plan B's other half: keep the host's background-task result injection
144
+ // inside the context budget. Built here because it needs the tm runtime's
145
+ // thresholds and its trajectory writer.
146
+ const taskOffloadHook = createTaskOffload({
147
+ enabled: tmRuntime.config.taskOffload === "on",
148
+ thresholdTokens: tmRuntime.config.offloadThresholdText,
149
+ previewLines: tmRuntime.config.previewLines,
150
+ previewMaxTokens: tmRuntime.config.previewMaxTokens,
151
+ log: (event) => tmRuntime.pipelines.store.appendTrajectory(event),
152
+ });
153
+ // Startup report: one trajectory line always, one toast ONLY when a
154
+ // required surface is gone (a missing 待观察 row is not an alarm).
155
+ capabilityProbe.report();
156
+ // ---------- bash timeout clamp (issue #6, see tm/bash-timeout.ts) ------
157
+ const bashTimeoutHook = createBashTimeoutHook({
158
+ probeMs: tmRuntime.config.bashTimeoutProbeMs,
159
+ maxMs: tmRuntime.config.bashTimeoutMaxMs,
160
+ readonlyAllowed: tmRuntime.config.bashReadonlyAllowed,
161
+ onClamp: (info) => {
162
+ try {
163
+ tmRuntime.pipelines.store.appendTrajectory({
164
+ tool: "bash",
165
+ step_id: "timeout-clamp",
166
+ event: info.via,
167
+ from_ms: info.from,
168
+ to_ms: info.to,
169
+ });
170
+ }
171
+ catch {
172
+ /* observability only */
173
+ }
174
+ },
175
+ });
176
+ return {
177
+ // ---------- v1 config hook: inject agents & commands ----------
178
+ config(cfg) {
179
+ if (!cfg.agent)
180
+ cfg.agent = {};
181
+ // Execution roles carry permission.bash === "allow"; escalate it to a
182
+ // pattern object so the host opens its official confirmation dialog
183
+ // for the R6 env face + R2 danger face (default `*` stays allow). A
184
+ // shallow copy keeps the module-level `agents` object pristine. The
185
+ // R6 env face is only injected while the approval gate can arm: with
186
+ // no arming client the R6 hook hard-throws env reads BEFORE any
187
+ // dialog could be satisfied, so those patterns would be dead popups.
188
+ const bashAsk = bashAskPatterns(envProtectMode, approvalGate !== null);
189
+ for (const [name, def] of Object.entries(agents)) {
190
+ // Respect user-defined overrides: never clobber an existing entry.
191
+ if (cfg.agent[name])
192
+ continue;
193
+ const permission = def.permission
194
+ ? {
195
+ ...def.permission,
196
+ ...(def.permission.bash === "allow" ? { bash: bashAsk } : null),
197
+ }
198
+ : def.permission;
199
+ cfg.agent[name] = {
200
+ ...def,
201
+ permission,
202
+ prompt: name === "team" ? (def.prompt ?? "") + note : def.prompt,
203
+ };
204
+ // deferral-registry seed: agents that ACTUALLY carry our escalated
205
+ // bash ask object (user-overridden agents never get added)
206
+ if (def.permission && def.permission.bash === "allow")
207
+ injectedExecAgents.add(name);
208
+ }
209
+ if (!cfg.command)
210
+ cfg.command = {};
211
+ for (const [name, def] of Object.entries(commands)) {
212
+ if (cfg.command[name])
213
+ continue;
214
+ cfg.command[name] = def;
215
+ }
216
+ // ---------- make Team the default agent (opt-out: defaultAgent:false)
217
+ const promote = options?.defaultAgent !== false;
218
+ if (promote && (!cfg.default_agent || cfg.default_agent === "build")) {
219
+ cfg.default_agent = "team";
220
+ }
221
+ },
222
+ // ---------- R6: block the model's env-var read paths in code ----------
223
+ // ONE hook, two independent jobs (the host calls the single
224
+ // `tool.execute.before` slot per plugin): first clamp a wasteful
225
+ // model-set bash timeout, then run the R6 interception. The clamp
226
+ // runs BEFORE R6 so a blocked call is never also a slow one.
227
+ "tool.execute.before": async (input, output) => {
228
+ capabilityProbe?.observeHook("tool.execute.before");
229
+ // First, and narrowest: a built-in boolean the model sent as a string
230
+ // (the host's schema rejects it — two dead `task {background}` calls
231
+ // proved the trap). Then the timeout clamp, then R6.
232
+ const coerced = coerceToolArgs(input, output);
233
+ if (coerced.length) {
234
+ tmRuntime.pipelines.store.appendTrajectory({
235
+ tool: String(input?.tool ?? "task"),
236
+ step_id: "args-coerce",
237
+ event: "coerced",
238
+ keys: coerced.join(","),
239
+ });
240
+ }
241
+ bashTimeoutHook(input, output);
242
+ await envProtectHook(input, output);
243
+ },
244
+ // ---------- host-hook leverage beyond the tool surface (audit #2) ----
245
+ // Every one of these rides a published hook and mutates ONLY the
246
+ // fields whose shape is verified; each is independently switchable,
247
+ // because this host's d.ts has shipped surfaces the runtime never
248
+ // fires (permission.ask), so adapters must fail soft, not assume.
249
+ // The `observeHook` calls are that "not assume" made observable: a row
250
+ // stays 待观察 until the host actually calls the hook, and tm_stats
251
+ // reports it either way.
252
+ "tool.definition": (input, output) => {
253
+ capabilityProbe?.observeHook("tool.definition");
254
+ applyToolDefinition(input, output, hostSwitches.toolHints, hostBackgroundSubagentsEnabled() ? TASK_HINT_BACKGROUND : undefined);
255
+ },
256
+ "chat.params": (input, output) => {
257
+ capabilityProbe?.observeHook("chat.params");
258
+ applyChatParams(input, output, process.env);
259
+ },
260
+ "experimental.session.compacting": (input, output) => {
261
+ capabilityProbe?.observeHook("session.compacting");
262
+ applySessionCompacting(output, hostSwitches.compactionContext);
263
+ },
264
+ "experimental.compaction.autocontinue": (input, output) => {
265
+ capabilityProbe?.observeHook("compaction.autocontinue");
266
+ applyCompactionAutoContinue(output, process.env);
267
+ },
268
+ "shell.env": (input, output) => {
269
+ capabilityProbe?.observeHook("shell.env");
270
+ applyShellEnv(output, process.env);
271
+ },
272
+ // ---------- unified approval gate: watch the host permission dialog ---
273
+ event: ({ event }) => {
274
+ capabilityProbe?.observeEvent(event?.type ?? "");
275
+ // Async dispatch bookkeeping runs FIRST and independently of R6:
276
+ // session.idle / .error are what tell the lead its children settled.
277
+ tmRuntime.observeDispatchEvent(event);
278
+ if (!approvalGate)
279
+ return;
280
+ // Pre-tool session registration: the live host emits message.updated
281
+ // with the full UserMessage ({ sessionID, role:"user", agent }) when
282
+ // a prompt enters a session — BEFORE any tool.execute.before of that
283
+ // turn, which is exactly when the R6 hook needs to know the session
284
+ // carries our injected ask set (permission.asked only fires AFTER
285
+ // the hook, so it can never be the first-command registration).
286
+ if (event?.type === "message.updated") {
287
+ const info = event.properties?.info;
288
+ if (info &&
289
+ info.role === "user" &&
290
+ typeof info.agent === "string" &&
291
+ typeof info.sessionID === "string") {
292
+ // UserMessage.agent is a REQUIRED string in the host schema
293
+ // (verified in the desktop binary), so a user prompt always names
294
+ // its agent. Deferral stays live only while the CURRENT prompt
295
+ // runs an exec-role agent: a prompt routed to any other agent
296
+ // revokes the registration (stock agents' sessions would never
297
+ // open our dialogs, so a stale registration = silent env reads).
298
+ if (injectedExecAgents.has(info.agent)) {
299
+ approvalGate.registerExecSession(info.sessionID);
300
+ }
301
+ else {
302
+ approvalGate.revokeExecSession(info.sessionID);
303
+ }
304
+ }
305
+ return;
306
+ }
307
+ approvalGate.handleEvent(event);
308
+ },
309
+ // secondary registration channel (official 1.18.x contract; the event
310
+ // route above is the one verified against the live 1.18.29 bus)
311
+ "chat.message": (input, output) => {
312
+ // Plan B: the host's background sub-agent injects the child's FULL
313
+ // reply here. Governance first, and independent of the approval gate —
314
+ // it only ever touches synthetic parts carrying the host's own
315
+ // task envelope (see src/task-offload.ts).
316
+ taskOffloadHook(input, output ?? { message: undefined, parts: undefined });
317
+ if (!approvalGate)
318
+ return;
319
+ if (input &&
320
+ typeof input.sessionID === "string" &&
321
+ typeof input.agent === "string") {
322
+ if (injectedExecAgents.has(input.agent)) {
323
+ approvalGate.registerExecSession(input.sessionID);
324
+ }
325
+ else {
326
+ approvalGate.revokeExecSession(input.sessionID);
327
+ }
328
+ }
329
+ },
330
+ dispose: async () => {
331
+ approvalGate?.dispose();
332
+ // tm_browser owns a browser child process — kill it on teardown and
333
+ // WAIT, or the process can exit with the window still on screen.
334
+ await tmRuntime.dispose();
335
+ },
336
+ // ---------- JIT layer-2: tm_read / tm_grep / tm_bash / tm_fetch ----------
337
+ tool: tmRuntime.tools,
338
+ };
339
+ }
340
+ //# sourceMappingURL=v1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v1.js","sourceRoot":"","sources":["../../src/host/v1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { V2Registration } from "./v2-types.js";
2
+ import type { TeamScope } from "./v2-scope.js";
3
+ /** The four host-vs-tm_browser differences that cost rounds in the user's real task log,
4
+ * said once per session at the result where each one bites. */
5
+ export declare const NATIVE_BROWSER_NOTE: string;
6
+ export interface BrowserGateReport {
7
+ /** browser_* execute.before events we looked at (Team sessions only) */
8
+ seen: number;
9
+ /** of those, how many carried a URL or local path we could classify */
10
+ classified: number;
11
+ /** refusals raised at the door */
12
+ refused: number;
13
+ /** of those refusals, how many the host walked past anyway (layer 2 fired) */
14
+ leaked: number;
15
+ /** sessions that got the one-time native browser_* reading note */
16
+ annotated: number;
17
+ /** refusals that produced no following result within the window — the door held */
18
+ held: number;
19
+ /** refusals raised against a Code Mode program (`execute`), which reaches the same
20
+ * browser through `tools.browser.*` and would otherwise bypass this file entirely */
21
+ codeModeRefused: number;
22
+ /** out-of-scope calls left completely alone, counted rather than invisible */
23
+ foreignSkipped: number;
24
+ /** per-tool refusal counts, so "which verb is the hole" is answerable */
25
+ byTool: Record<string, {
26
+ seen: number;
27
+ refused: number;
28
+ leaked: number;
29
+ }>;
30
+ }
31
+ export interface BrowserGate {
32
+ registrations: V2Registration[];
33
+ report: BrowserGateReport;
34
+ /** The hook bodies are exported through this seam so a test can drive both halves
35
+ * (a host that honours the throw, and one that does not) without a live desktop. */
36
+ fireBefore: (event: unknown) => void;
37
+ fireAfter: (event: unknown) => void;
38
+ }
39
+ export declare function applyV2BrowserGate(ctx: unknown, opts: {
40
+ allowlist: readonly string[];
41
+ scope?: TeamScope;
42
+ env?: Record<string, string | undefined>;
43
+ }): BrowserGate;
44
+ export declare function browserGateSummary(r: BrowserGateReport): string;
45
+ //# sourceMappingURL=v2-browser-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2-browser-gate.d.ts","sourceRoot":"","sources":["../../src/host/v2-browser-gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAyC9C;gEACgE;AAChE,eAAO,MAAM,mBAAmB,QAO8B,CAAA;AAE9D,MAAM,WAAW,iBAAiB;IAChC,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAA;IACZ,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAA;IAClB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,SAAS,EAAE,MAAM,CAAA;IACjB,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAA;IACZ;0FACsF;IACtF,eAAe,EAAE,MAAM,CAAA;IACvB,8EAA8E;IAC9E,cAAc,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC1E;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,cAAc,EAAE,CAAA;IAC/B,MAAM,EAAE,iBAAiB,CAAA;IACzB;yFACqF;IACrF,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACpC,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACpC;AAyED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE;IACJ,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAA;CACzC,GACA,WAAW,CA0Lb;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAI/D"}