@te-river/opencode-team-mode 1.6.1 → 1.7.0
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.
- package/README.md +117 -118
- package/README.zh-CN.md +98 -100
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +89 -79
- package/dist/agents.js.map +1 -1
- package/dist/approval-gate.d.ts +8 -9
- package/dist/approval-gate.d.ts.map +1 -1
- package/dist/approval-gate.js +13 -14
- package/dist/approval-gate.js.map +1 -1
- package/dist/capabilities.d.ts +11 -37
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +11 -141
- package/dist/capabilities.js.map +1 -1
- package/dist/commands.js +1 -1
- package/dist/envprotect/hook.d.ts +12 -31
- package/dist/envprotect/hook.d.ts.map +1 -1
- package/dist/envprotect/hook.js +13 -91
- package/dist/envprotect/hook.js.map +1 -1
- package/dist/envprotect/patterns.d.ts +6 -4
- package/dist/envprotect/patterns.d.ts.map +1 -1
- package/dist/envprotect/patterns.js +6 -4
- package/dist/envprotect/patterns.js.map +1 -1
- package/dist/envprotect.d.ts +1 -1
- package/dist/envprotect.d.ts.map +1 -1
- package/dist/envprotect.js +1 -1
- package/dist/envprotect.js.map +1 -1
- package/dist/host/note.d.ts.map +1 -1
- package/dist/host/note.js +8 -5
- package/dist/host/note.js.map +1 -1
- package/dist/host/v2-browser-gate.d.ts +19 -1
- package/dist/host/v2-browser-gate.d.ts.map +1 -1
- package/dist/host/v2-browser-gate.js +47 -6
- package/dist/host/v2-browser-gate.js.map +1 -1
- package/dist/host/v2-capabilities.d.ts +43 -0
- package/dist/host/v2-capabilities.d.ts.map +1 -1
- package/dist/host/v2-capabilities.js +77 -1
- package/dist/host/v2-capabilities.js.map +1 -1
- package/dist/host/v2-compaction.d.ts +129 -0
- package/dist/host/v2-compaction.d.ts.map +1 -0
- package/dist/host/v2-compaction.js +346 -0
- package/dist/host/v2-compaction.js.map +1 -0
- package/dist/host/v2-default-agent.d.ts +37 -0
- package/dist/host/v2-default-agent.d.ts.map +1 -0
- package/dist/host/v2-default-agent.js +128 -0
- package/dist/host/v2-default-agent.js.map +1 -0
- package/dist/host/v2-events.d.ts +2 -0
- package/dist/host/v2-events.d.ts.map +1 -1
- package/dist/host/v2-events.js +27 -0
- package/dist/host/v2-events.js.map +1 -1
- package/dist/host/v2-guard.d.ts +178 -0
- package/dist/host/v2-guard.d.ts.map +1 -1
- package/dist/host/v2-guard.js +324 -8
- package/dist/host/v2-guard.js.map +1 -1
- package/dist/host/v2-offload.d.ts +1 -1
- package/dist/host/v2-offload.js +2 -2
- package/dist/host/v2-permissions.d.ts +45 -44
- package/dist/host/v2-permissions.d.ts.map +1 -1
- package/dist/host/v2-permissions.js +48 -49
- package/dist/host/v2-permissions.js.map +1 -1
- package/dist/host/v2-probe-chain.d.ts +93 -0
- package/dist/host/v2-probe-chain.d.ts.map +1 -0
- package/dist/host/v2-probe-chain.js +146 -0
- package/dist/host/v2-probe-chain.js.map +1 -0
- package/dist/host/v2-prune.d.ts +157 -0
- package/dist/host/v2-prune.d.ts.map +1 -0
- package/dist/host/v2-prune.js +507 -0
- package/dist/host/v2-prune.js.map +1 -0
- package/dist/host/v2-retry.d.ts +143 -0
- package/dist/host/v2-retry.d.ts.map +1 -0
- package/dist/host/v2-retry.js +315 -0
- package/dist/host/v2-retry.js.map +1 -0
- package/dist/host/v2-scope.d.ts.map +1 -1
- package/dist/host/v2-scope.js +14 -7
- package/dist/host/v2-scope.js.map +1 -1
- package/dist/host/v2-session-client.d.ts +62 -7
- package/dist/host/v2-session-client.d.ts.map +1 -1
- package/dist/host/v2-session-client.js +485 -26
- package/dist/host/v2-session-client.js.map +1 -1
- package/dist/host/v2-session.d.ts +72 -1
- package/dist/host/v2-session.d.ts.map +1 -1
- package/dist/host/v2-session.js +154 -10
- package/dist/host/v2-session.js.map +1 -1
- package/dist/host/v2-tool.d.ts +2 -3
- package/dist/host/v2-tool.d.ts.map +1 -1
- package/dist/host/v2-tool.js +2 -3
- package/dist/host/v2-tool.js.map +1 -1
- package/dist/host/v2-types.d.ts +25 -0
- package/dist/host/v2-types.d.ts.map +1 -1
- package/dist/host/v2.d.ts +14 -12
- package/dist/host/v2.d.ts.map +1 -1
- package/dist/host/v2.js +648 -74
- package/dist/host/v2.js.map +1 -1
- package/dist/identity.d.ts +27 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +34 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +9 -24
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -27
- package/dist/index.js.map +1 -1
- package/dist/prompts/lead.d.ts +1 -1
- package/dist/prompts/lead.d.ts.map +1 -1
- package/dist/prompts/lead.js +44 -27
- package/dist/prompts/lead.js.map +1 -1
- package/dist/prompts/shared.d.ts +2 -2
- package/dist/prompts/shared.d.ts.map +1 -1
- package/dist/prompts/shared.js +74 -57
- package/dist/prompts/shared.js.map +1 -1
- package/dist/prompts/specialists.d.ts +2 -2
- package/dist/prompts/specialists.d.ts.map +1 -1
- package/dist/prompts/specialists.js +53 -83
- package/dist/prompts/specialists.js.map +1 -1
- package/dist/tm/args-schema.d.ts +7 -32
- package/dist/tm/args-schema.d.ts.map +1 -1
- package/dist/tm/args-schema.js +12 -153
- package/dist/tm/args-schema.js.map +1 -1
- package/dist/tm/board.d.ts +10 -9
- package/dist/tm/board.d.ts.map +1 -1
- package/dist/tm/board.js +11 -10
- package/dist/tm/board.js.map +1 -1
- package/dist/tm/config-files.d.ts +81 -0
- package/dist/tm/config-files.d.ts.map +1 -0
- package/dist/tm/config-files.js +209 -0
- package/dist/tm/config-files.js.map +1 -0
- package/dist/tm/config-layers.d.ts +117 -0
- package/dist/tm/config-layers.d.ts.map +1 -0
- package/dist/tm/config-layers.js +320 -0
- package/dist/tm/config-layers.js.map +1 -0
- package/dist/tm/config.d.ts +10 -101
- package/dist/tm/config.d.ts.map +1 -1
- package/dist/tm/config.js +17 -71
- package/dist/tm/config.js.map +1 -1
- package/dist/tm/dispatch.d.ts +154 -22
- package/dist/tm/dispatch.d.ts.map +1 -1
- package/dist/tm/dispatch.js +559 -80
- package/dist/tm/dispatch.js.map +1 -1
- package/dist/tm/egress.d.ts +19 -7
- package/dist/tm/egress.d.ts.map +1 -1
- package/dist/tm/egress.js +21 -9
- package/dist/tm/egress.js.map +1 -1
- package/dist/tm/index.d.ts +23 -20
- package/dist/tm/index.d.ts.map +1 -1
- package/dist/tm/index.js +117 -116
- package/dist/tm/index.js.map +1 -1
- package/dist/tm/ledger.d.ts +9 -2
- package/dist/tm/ledger.d.ts.map +1 -1
- package/dist/tm/ledger.js +4 -1
- package/dist/tm/ledger.js.map +1 -1
- package/dist/tm/perm-ask.d.ts +3 -3
- package/dist/tm/perm-ask.d.ts.map +1 -1
- package/dist/tm/perm-ask.js +3 -3
- package/dist/tm/perm-ask.js.map +1 -1
- package/dist/tm/pipelines.d.ts +12 -11
- package/dist/tm/pipelines.d.ts.map +1 -1
- package/dist/tm/pipelines.js +40 -207
- package/dist/tm/pipelines.js.map +1 -1
- package/dist/tm/preview.d.ts +1 -1
- package/dist/tm/preview.js +3 -3
- package/dist/tm/preview.js.map +1 -1
- package/dist/tm/refs.d.ts +31 -4
- package/dist/tm/refs.d.ts.map +1 -1
- package/dist/tm/refs.js +48 -4
- package/dist/tm/refs.js.map +1 -1
- package/dist/tm/result.d.ts +1 -1
- package/dist/tm/result.d.ts.map +1 -1
- package/dist/tm/result.js +4 -3
- package/dist/tm/result.js.map +1 -1
- package/dist/tm/search.d.ts +2 -2
- package/dist/tm/search.js +7 -7
- package/dist/tm/search.js.map +1 -1
- package/dist/tm/serp-loop.d.ts +19 -7
- package/dist/tm/serp-loop.d.ts.map +1 -1
- package/dist/tm/serp-loop.js +24 -9
- package/dist/tm/serp-loop.js.map +1 -1
- package/dist/tm/stats.d.ts +31 -27
- package/dist/tm/stats.d.ts.map +1 -1
- package/dist/tm/stats.js +170 -58
- package/dist/tm/stats.js.map +1 -1
- package/dist/tm/store.d.ts +18 -5
- package/dist/tm/store.d.ts.map +1 -1
- package/dist/tm/store.js +39 -9
- package/dist/tm/store.js.map +1 -1
- package/dist/tm/tools.d.ts +7 -5
- package/dist/tm/tools.d.ts.map +1 -1
- package/dist/tm/tools.js +10 -41
- package/dist/tm/tools.js.map +1 -1
- package/dist/tm/webfetch.d.ts +1 -1
- package/dist/tm/webfetch.d.ts.map +1 -1
- package/dist/tm/webfetch.js +38 -23
- package/dist/tm/webfetch.js.map +1 -1
- package/dist/types.d.ts +40 -123
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +7 -21
- package/dist/types.js.map +1 -1
- package/docs/installation-v2.md +124 -39
- package/docs/installation.md +9 -0
- package/docs/research/browser-pane.md +5 -0
- package/docs/v2-port-notes.md +500 -315
- package/package.json +1 -1
- package/scripts/gen-v2-config.mjs +246 -94
- package/scripts/lib/fake-ctx.mjs +244 -146
package/dist/host/v2-guard.d.ts
CHANGED
|
@@ -22,6 +22,22 @@
|
|
|
22
22
|
* until `TM_R6_FINE_ASK=on` says otherwise. A guard that fails open because
|
|
23
23
|
* we trusted an unproven hook is the opposite of this product.
|
|
24
24
|
*
|
|
25
|
+
* 3. THE SHELL TIMEOUT CLAMP (issue #6), ported from the retired v1
|
|
26
|
+
* `src/tm/bash-timeout.ts`. The host's shell tool resolves
|
|
27
|
+
* `flags.bashDefaultTimeoutMs ?? 2 * 60 * 1e3`, and a model that passes a
|
|
28
|
+
* timeout at all passes 120000+ for a `Get-ChildItem` — three serialised
|
|
29
|
+
* probes then cost the user six minutes of dead air for a reason no model
|
|
30
|
+
* ever had. v1 clamped it in a composed `tool.execute.before` hook; v2
|
|
31
|
+
* gives the same mutable `input` to `tool.hook("execute.before")`, which is
|
|
32
|
+
* where `applyV2BackgroundForce` already writes, so the protection is not
|
|
33
|
+
* something the cut lost — it is the same lever at the same seam.
|
|
34
|
+
* The discipline is unchanged and load-bearing: it clamps a number the
|
|
35
|
+
* model ALREADY volunteered, never invents one it omitted, applies the
|
|
36
|
+
* probe ceiling only to a command the P3 read-only allowlist accepts,
|
|
37
|
+
* never rewrites the command, never widens what may run, and never throws
|
|
38
|
+
* into the hook — a failure there means the call goes through untouched
|
|
39
|
+
* and the attempt is counted.
|
|
40
|
+
*
|
|
25
41
|
* The hook only ever makes a decision STRICTER (allow -> ask, anything -> deny on
|
|
26
42
|
* a red line). It never loosens what the host or the user's own rules chose.
|
|
27
43
|
*/
|
|
@@ -36,8 +52,48 @@ export interface GuardDecision {
|
|
|
36
52
|
}
|
|
37
53
|
/** The address question, asked of the host's native web path. */
|
|
38
54
|
export declare function webGuard(resources: readonly string[]): GuardDecision | null;
|
|
55
|
+
/**
|
|
56
|
+
* R6's FILE-PATH face. v1 enforced this in a `tool.execute.before` hook factory
|
|
57
|
+
* (`createEnvProtectHook`) that was deleted with the v1 personality; v2 never
|
|
58
|
+
* picked it up, so a Team role could read `.env` through the native `read` tool
|
|
59
|
+
* while the docs claimed R6 covered "the environment or an env file". The same
|
|
60
|
+
* classifier now rides `permission.hook("evaluate")`, whose `resources` carry the
|
|
61
|
+
* concrete path (live: `action:"read"` reaches evaluate with the real path).
|
|
62
|
+
*
|
|
63
|
+
* `isEnvFilePath` is the shared matcher and is already pattern-aware: it strips
|
|
64
|
+
* glob asterisks (so a `*.env` include is caught), cuts URL query tails, and
|
|
65
|
+
* refuses code identifiers like `process.env` — so an ordinary grep pattern
|
|
66
|
+
* (`TODO`) is never mistaken for a path. `.env.example` and friends are
|
|
67
|
+
* checked-in templates and pass (see `ENV_TEMPLATE_SUFFIX`).
|
|
68
|
+
*
|
|
69
|
+
* A RED LINE, not a gate: v2 cannot raise a dialog, so there is no consent path
|
|
70
|
+
* to name — telling the agent to "ask for approval" would be a window that never
|
|
71
|
+
* appears.
|
|
72
|
+
*/
|
|
73
|
+
export declare function pathGuard(action: string, resources: readonly string[], mode: EnvProtectMode): GuardDecision | null;
|
|
39
74
|
/** R6's env face and R2's danger face, per command line. */
|
|
40
75
|
export declare function shellGuard(command: string | undefined, mode: EnvProtectMode): GuardDecision | null;
|
|
76
|
+
/** One running child, as the concurrency refusal renders it. */
|
|
77
|
+
export interface RunningChild {
|
|
78
|
+
sessionID: string;
|
|
79
|
+
agent?: string;
|
|
80
|
+
elapsedMs?: number;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* The concurrency cap (#49 feature 2). `permission.evaluate` fires for
|
|
84
|
+
* `subagent` (measured live: `guard_actions: … subagent=16 …`), so the cap is a
|
|
85
|
+
* HARD gate on the same seam as the env-file / address red lines — not a prompt
|
|
86
|
+
* hint a model can talk itself past.
|
|
87
|
+
*
|
|
88
|
+
* When the caller's OWN running children reach the cap, the next dispatch is
|
|
89
|
+
* denied with a Chinese, actionable refusal that names the running ids and the
|
|
90
|
+
* two ways out (collect with `tm_join`, or stop with `tm_join {cancel:true}`).
|
|
91
|
+
*
|
|
92
|
+
* Pure and total: `cap <= 0` disables it (never denies), an empty running list
|
|
93
|
+
* never denies, and it never throws. Only ever stricter — the caller applies it
|
|
94
|
+
* through the same `rank` floor as every other guard.
|
|
95
|
+
*/
|
|
96
|
+
export declare function concurrencyGuard(action: string, running: readonly RunningChild[], cap: number): GuardDecision | null;
|
|
41
97
|
export interface GuardReport {
|
|
42
98
|
seen: number;
|
|
43
99
|
byAction: Record<string, number>;
|
|
@@ -50,6 +106,31 @@ export interface GuardReport {
|
|
|
50
106
|
/** evaluations skipped because the session belongs to a non-Team agent (#22) —
|
|
51
107
|
* the number that tells the user how much of this floor is not ours to hold */
|
|
52
108
|
foreignSkipped: number;
|
|
109
|
+
/** file-path evaluations the R6 classifier flagged as an env file (read /
|
|
110
|
+
* write / edit / glob / grep) — the evidence that the file-path face is
|
|
111
|
+
* actually live, not just installed */
|
|
112
|
+
envFileDenied: number;
|
|
113
|
+
/** R6's file-path face caught at `execute.before`, where the FULL input is
|
|
114
|
+
* visible — the seam `permission.evaluate` cannot cover for `grep`/`glob`,
|
|
115
|
+
* whose resource is the PATTERN, not the search path (#58). A separate
|
|
116
|
+
* counter from `envFileDenied` on purpose: the two seams fail independently,
|
|
117
|
+
* and one number for both would hide which one went dark. */
|
|
118
|
+
envFileDeniedByInput: number;
|
|
119
|
+
/** `execute.before` file-tool calls the input guard looked at (Team only). */
|
|
120
|
+
envFileInputSeen: number;
|
|
121
|
+
/** …skipped because the session is not ours (#22). */
|
|
122
|
+
envFileInputForeignSkipped: number;
|
|
123
|
+
/** …where the guard itself threw and the call was allowed through. */
|
|
124
|
+
envFileInputThrew: number;
|
|
125
|
+
/** #49 feature 2: `subagent` evaluations the concurrency cap looked at. */
|
|
126
|
+
concurrencySeen: number;
|
|
127
|
+
/** …where the cap fired and the dispatch was denied. */
|
|
128
|
+
concurrencyDenied: number;
|
|
129
|
+
/** The largest number of the caller's running children seen at one evaluation
|
|
130
|
+
* — the peak the cap is measured against, so "we never hit it" is a number. */
|
|
131
|
+
concurrencyRunningMax: number;
|
|
132
|
+
/** …where the running-children read threw and the call was allowed through. */
|
|
133
|
+
concurrencyThrew: number;
|
|
53
134
|
}
|
|
54
135
|
export interface BackgroundForceReport {
|
|
55
136
|
seen: number;
|
|
@@ -80,11 +161,49 @@ export declare function applyV2BackgroundForce(ctx: V2Context, opts?: {
|
|
|
80
161
|
export declare function applyV2PermissionGuards(ctx: V2Context, opts: {
|
|
81
162
|
envProtectMode: EnvProtectMode;
|
|
82
163
|
scope?: TeamScope;
|
|
164
|
+
/** #49 feature 2: the caller's own running children, read from the plugin's
|
|
165
|
+
* ONE children registry. Absent = the cap is not enforced (a host with no
|
|
166
|
+
* registry to read must not be denied on a guess). */
|
|
167
|
+
runningChildren?: (callerSessionID: string) => RunningChild[];
|
|
168
|
+
/** The cap. `<= 0` disables it. Defaults to 0 (off) so a caller that does
|
|
169
|
+
* not opt in keeps the pre-#49 behaviour byte-exactly. */
|
|
170
|
+
maxConcurrent?: number;
|
|
171
|
+
/** Fired once per denial so the personality can write the `v2-concurrency`
|
|
172
|
+
* trajectory line — the guard owns no store. */
|
|
173
|
+
onConcurrencyDenied?: (info: {
|
|
174
|
+
caller: string;
|
|
175
|
+
running: RunningChild[];
|
|
176
|
+
cap: number;
|
|
177
|
+
}) => void;
|
|
83
178
|
}): Promise<{
|
|
84
179
|
registrations: V2Registration[];
|
|
85
180
|
report: GuardReport;
|
|
86
181
|
installed: boolean;
|
|
87
182
|
}>;
|
|
183
|
+
/**
|
|
184
|
+
* R6's file-path face, on the seam that sees the WHOLE input (#58).
|
|
185
|
+
*
|
|
186
|
+
* `pathGuard` rides `permission.evaluate`, whose `resources` for `grep`/`glob`
|
|
187
|
+
* are the pattern — so the red line had a hole exactly the width of those two
|
|
188
|
+
* tools. `execute.before` hands us the raw args the model sent, so the search
|
|
189
|
+
* path (`path` / `include` / `filePath`) is visible there and the same
|
|
190
|
+
* `isEnvFilePath` matcher can answer.
|
|
191
|
+
*
|
|
192
|
+
* A refusal is THROWN, not returned: `execute.before` has no `effect` field, and
|
|
193
|
+
* silently rewriting a path the model chose is the guesswork this product
|
|
194
|
+
* refuses — the model has to see the refusal. Same shape as the browser gate's
|
|
195
|
+
* red line. An internal failure is swallowed and counted (`envFileInputThrew`),
|
|
196
|
+
* never thrown into the host: a guard that cannot decide must not break the call
|
|
197
|
+
* it is inspecting. Team-scoped through the same `scope.decide` gate as every
|
|
198
|
+
* other writer, and the counters land on `v2-surface` / `v2-shutdown`.
|
|
199
|
+
*/
|
|
200
|
+
export declare function applyV2EnvFileInputGuard(ctx: V2Context, opts: {
|
|
201
|
+
envProtectMode: EnvProtectMode;
|
|
202
|
+
scope?: TeamScope;
|
|
203
|
+
report: GuardReport;
|
|
204
|
+
}): Promise<{
|
|
205
|
+
registrations: V2Registration[];
|
|
206
|
+
}>;
|
|
88
207
|
/** Does the config still need the coarse `shell -> ask` escalation? Only while
|
|
89
208
|
* the fine path is switched off; with the classifier in charge, escalating every
|
|
90
209
|
* command would mask it.
|
|
@@ -98,4 +217,63 @@ export declare function applyV2PermissionGuards(ctx: V2Context, opts: {
|
|
|
98
217
|
* An absent hook still forces coarse: no seam, no per-command judgement.
|
|
99
218
|
*/
|
|
100
219
|
export declare function needsCoarseShellAsk(env: NodeJS.ProcessEnv, guardsInstalled: boolean): boolean;
|
|
220
|
+
/** Parse the model-supplied timeout defensively: the host schema wants a positive
|
|
221
|
+
* integer of milliseconds, but an LLM hands us `"120000"`, `120000.0`, or omits
|
|
222
|
+
* it entirely. Anything unreadable means "no timeout was supplied", and a
|
|
223
|
+
* supplied-none is NEVER turned into one by us. */
|
|
224
|
+
export declare function parseShellTimeout(raw: unknown): number | null;
|
|
225
|
+
export type ShellTimeoutVerdict = {
|
|
226
|
+
changed: false;
|
|
227
|
+
via: "none" | "already-short";
|
|
228
|
+
} | {
|
|
229
|
+
changed: true;
|
|
230
|
+
via: "probe" | "max";
|
|
231
|
+
from: number;
|
|
232
|
+
to: number;
|
|
233
|
+
};
|
|
234
|
+
/**
|
|
235
|
+
* Decide the clamped timeout for one shell call. `probeMs` / `maxMs` of 0
|
|
236
|
+
* disable that ceiling. `probeMs` applies ONLY to a command the P3 read-only
|
|
237
|
+
* allowlist already accepts; `maxMs` is the operator's explicit global cap and
|
|
238
|
+
* ships at 0 (off), because silently killing a build is worse than a slow one.
|
|
239
|
+
*/
|
|
240
|
+
export declare function resolveShellTimeout(opts: {
|
|
241
|
+
command: string;
|
|
242
|
+
timeoutMs: number | null;
|
|
243
|
+
probeMs: number;
|
|
244
|
+
maxMs: number;
|
|
245
|
+
readonlyAllowed: readonly string[];
|
|
246
|
+
}): ShellTimeoutVerdict;
|
|
247
|
+
export interface ShellTimeoutReport {
|
|
248
|
+
seen: number;
|
|
249
|
+
clamped: number;
|
|
250
|
+
/** clamps skipped because the session is not one of ours (#22) — a build
|
|
251
|
+
* session's timeout is the host's business, not a plugin's */
|
|
252
|
+
foreignSkipped: number;
|
|
253
|
+
/** attempts that threw (including a classifier throw) and therefore
|
|
254
|
+
* left the call byte-exact — counted so "the clamp is silent" is
|
|
255
|
+
* distinguishable from "the clamp is broken" */
|
|
256
|
+
threw: number;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* The `tool.hook("execute.before")` installation of the clamp. Returns the
|
|
260
|
+
* registrations plus the counters that ride `v2-surface` / `v2-shutdown`.
|
|
261
|
+
* `onClamp` is how the caller writes the trajectory row; a throw inside it is
|
|
262
|
+
* swallowed there, never here.
|
|
263
|
+
*/
|
|
264
|
+
export declare function applyV2ShellTimeoutClamp(ctx: V2Context, opts: {
|
|
265
|
+
probeMs: number;
|
|
266
|
+
maxMs: number;
|
|
267
|
+
readonlyAllowed: readonly string[];
|
|
268
|
+
scope?: TeamScope;
|
|
269
|
+
onClamp?: (info: {
|
|
270
|
+
via: string;
|
|
271
|
+
from: number;
|
|
272
|
+
to: number;
|
|
273
|
+
sessionID?: string;
|
|
274
|
+
}) => void;
|
|
275
|
+
}): Promise<{
|
|
276
|
+
registrations: V2Registration[];
|
|
277
|
+
report: ShellTimeoutReport;
|
|
278
|
+
}>;
|
|
101
279
|
//# sourceMappingURL=v2-guard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v2-guard.d.ts","sourceRoot":"","sources":["../../src/host/v2-guard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"v2-guard.d.ts","sourceRoot":"","sources":["../../src/host/v2-guard.ts"],"names":[],"mappings":"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"}
|
package/dist/host/v2-guard.js
CHANGED
|
@@ -22,11 +22,28 @@
|
|
|
22
22
|
* until `TM_R6_FINE_ASK=on` says otherwise. A guard that fails open because
|
|
23
23
|
* we trusted an unproven hook is the opposite of this product.
|
|
24
24
|
*
|
|
25
|
+
* 3. THE SHELL TIMEOUT CLAMP (issue #6), ported from the retired v1
|
|
26
|
+
* `src/tm/bash-timeout.ts`. The host's shell tool resolves
|
|
27
|
+
* `flags.bashDefaultTimeoutMs ?? 2 * 60 * 1e3`, and a model that passes a
|
|
28
|
+
* timeout at all passes 120000+ for a `Get-ChildItem` — three serialised
|
|
29
|
+
* probes then cost the user six minutes of dead air for a reason no model
|
|
30
|
+
* ever had. v1 clamped it in a composed `tool.execute.before` hook; v2
|
|
31
|
+
* gives the same mutable `input` to `tool.hook("execute.before")`, which is
|
|
32
|
+
* where `applyV2BackgroundForce` already writes, so the protection is not
|
|
33
|
+
* something the cut lost — it is the same lever at the same seam.
|
|
34
|
+
* The discipline is unchanged and load-bearing: it clamps a number the
|
|
35
|
+
* model ALREADY volunteered, never invents one it omitted, applies the
|
|
36
|
+
* probe ceiling only to a command the P3 read-only allowlist accepts,
|
|
37
|
+
* never rewrites the command, never widens what may run, and never throws
|
|
38
|
+
* into the hook — a failure there means the call goes through untouched
|
|
39
|
+
* and the attempt is counted.
|
|
40
|
+
*
|
|
25
41
|
* The hook only ever makes a decision STRICTER (allow -> ask, anything -> deny on
|
|
26
42
|
* a red line). It never loosens what the host or the user's own rules chose.
|
|
27
43
|
*/
|
|
28
44
|
import { R2_DANGER_BASH_ASK_PATTERNS, R6_ENV_BASH_ASK_PATTERNS, commandMatchesAnyAskPattern, isEnvFilePath, } from "../envprotect.js";
|
|
29
45
|
import { classifyHost } from "../tm/egress.js";
|
|
46
|
+
import { classifyReadonlyCommand } from "../tm/guard.js";
|
|
30
47
|
const rank = { allow: 0, ask: 1, deny: 2 };
|
|
31
48
|
/** A resource may be a full URL or a bare host; both have to be answered, since
|
|
32
49
|
* the host's own tool is free to hand us either shape. */
|
|
@@ -75,6 +92,43 @@ export function webGuard(resources) {
|
|
|
75
92
|
}
|
|
76
93
|
return null;
|
|
77
94
|
}
|
|
95
|
+
/** File tools whose path-class resources are scanned for env files. `patch` is
|
|
96
|
+
* deliberately absent: its resource shape has not been observed on a live host,
|
|
97
|
+
* and guessing at a shape is how a guard either misses or misfires. */
|
|
98
|
+
const PATH_GUARD_ACTIONS = new Set(["read", "write", "edit", "glob", "grep"]);
|
|
99
|
+
/**
|
|
100
|
+
* R6's FILE-PATH face. v1 enforced this in a `tool.execute.before` hook factory
|
|
101
|
+
* (`createEnvProtectHook`) that was deleted with the v1 personality; v2 never
|
|
102
|
+
* picked it up, so a Team role could read `.env` through the native `read` tool
|
|
103
|
+
* while the docs claimed R6 covered "the environment or an env file". The same
|
|
104
|
+
* classifier now rides `permission.hook("evaluate")`, whose `resources` carry the
|
|
105
|
+
* concrete path (live: `action:"read"` reaches evaluate with the real path).
|
|
106
|
+
*
|
|
107
|
+
* `isEnvFilePath` is the shared matcher and is already pattern-aware: it strips
|
|
108
|
+
* glob asterisks (so a `*.env` include is caught), cuts URL query tails, and
|
|
109
|
+
* refuses code identifiers like `process.env` — so an ordinary grep pattern
|
|
110
|
+
* (`TODO`) is never mistaken for a path. `.env.example` and friends are
|
|
111
|
+
* checked-in templates and pass (see `ENV_TEMPLATE_SUFFIX`).
|
|
112
|
+
*
|
|
113
|
+
* A RED LINE, not a gate: v2 cannot raise a dialog, so there is no consent path
|
|
114
|
+
* to name — telling the agent to "ask for approval" would be a window that never
|
|
115
|
+
* appears.
|
|
116
|
+
*/
|
|
117
|
+
export function pathGuard(action, resources, mode) {
|
|
118
|
+
if (mode === "off")
|
|
119
|
+
return null;
|
|
120
|
+
if (!PATH_GUARD_ACTIONS.has(action))
|
|
121
|
+
return null;
|
|
122
|
+
for (const raw of resources) {
|
|
123
|
+
const text = String(raw ?? "");
|
|
124
|
+
if (!text)
|
|
125
|
+
continue;
|
|
126
|
+
if (isEnvFilePath(text)) {
|
|
127
|
+
return { effect: "deny", why: "env-file-path", message: "R6 红线:这个路径指向环境文件(.env / shell rc 家族),不授权、不弹窗。" };
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
78
132
|
/** R6's env face and R2's danger face, per command line. */
|
|
79
133
|
export function shellGuard(command, mode) {
|
|
80
134
|
const text = String(command ?? "").trim();
|
|
@@ -88,6 +142,39 @@ export function shellGuard(command, mode) {
|
|
|
88
142
|
}
|
|
89
143
|
return null;
|
|
90
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* The concurrency cap (#49 feature 2). `permission.evaluate` fires for
|
|
147
|
+
* `subagent` (measured live: `guard_actions: … subagent=16 …`), so the cap is a
|
|
148
|
+
* HARD gate on the same seam as the env-file / address red lines — not a prompt
|
|
149
|
+
* hint a model can talk itself past.
|
|
150
|
+
*
|
|
151
|
+
* When the caller's OWN running children reach the cap, the next dispatch is
|
|
152
|
+
* denied with a Chinese, actionable refusal that names the running ids and the
|
|
153
|
+
* two ways out (collect with `tm_join`, or stop with `tm_join {cancel:true}`).
|
|
154
|
+
*
|
|
155
|
+
* Pure and total: `cap <= 0` disables it (never denies), an empty running list
|
|
156
|
+
* never denies, and it never throws. Only ever stricter — the caller applies it
|
|
157
|
+
* through the same `rank` floor as every other guard.
|
|
158
|
+
*/
|
|
159
|
+
export function concurrencyGuard(action, running, cap) {
|
|
160
|
+
if (action !== "subagent")
|
|
161
|
+
return null;
|
|
162
|
+
if (!Number.isFinite(cap) || cap <= 0)
|
|
163
|
+
return null;
|
|
164
|
+
if (running.length < cap)
|
|
165
|
+
return null;
|
|
166
|
+
const list = running
|
|
167
|
+
.map((c) => {
|
|
168
|
+
const secs = typeof c.elapsedMs === "number" && c.elapsedMs >= 0 ? ` 运行中 ${Math.round(c.elapsedMs / 1000)}s` : "";
|
|
169
|
+
return `${c.sessionID}${secs}`;
|
|
170
|
+
})
|
|
171
|
+
.join("、");
|
|
172
|
+
return {
|
|
173
|
+
effect: "deny",
|
|
174
|
+
why: "concurrency-cap",
|
|
175
|
+
message: `本会话已有 ${running.length} 个子代理在跑(上限 ${cap}):${list}。先 tm_join 收取已结算的,或 tm_join {cancel:true} 停掉不需要的,再派新的。`,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
91
178
|
/**
|
|
92
179
|
* Every sub-agent dispatch runs in the background.
|
|
93
180
|
*
|
|
@@ -131,7 +218,7 @@ export async function applyV2BackgroundForce(ctx, opts = {}) {
|
|
|
131
218
|
return { registrations, report };
|
|
132
219
|
}
|
|
133
220
|
export async function applyV2PermissionGuards(ctx, opts) {
|
|
134
|
-
const report = { seen: 0, byAction: {}, strictened: 0, denied: 0, shellMatched: 0, foreignSkipped: 0 };
|
|
221
|
+
const report = { seen: 0, byAction: {}, strictened: 0, denied: 0, shellMatched: 0, foreignSkipped: 0, envFileDenied: 0, envFileDeniedByInput: 0, envFileInputSeen: 0, envFileInputForeignSkipped: 0, envFileInputThrew: 0, concurrencySeen: 0, concurrencyDenied: 0, concurrencyRunningMax: 0, concurrencyThrew: 0 };
|
|
135
222
|
const permission = ctx.permission;
|
|
136
223
|
if (!permission || typeof permission.hook !== "function") {
|
|
137
224
|
return { registrations: [], report, installed: false };
|
|
@@ -154,19 +241,51 @@ export async function applyV2PermissionGuards(ctx, opts) {
|
|
|
154
241
|
? webGuard(resources)
|
|
155
242
|
: action === "shell"
|
|
156
243
|
? shellGuard(resources[0], opts.envProtectMode)
|
|
157
|
-
:
|
|
158
|
-
|
|
244
|
+
: pathGuard(action, resources, opts.envProtectMode);
|
|
245
|
+
// #49 feature 2: the concurrency cap. `permission.evaluate` fires for
|
|
246
|
+
// `subagent` (measured live), so this is a hard gate on the same seam as the
|
|
247
|
+
// red lines. A read that throws is swallowed and counted — a throughput cap
|
|
248
|
+
// that fails OPEN is the honest failure mode, and it never loosens a host
|
|
249
|
+
// decision (the `rank` floor below still applies).
|
|
250
|
+
let concurrency = null;
|
|
251
|
+
if (action === "subagent") {
|
|
252
|
+
report.concurrencySeen++;
|
|
253
|
+
try {
|
|
254
|
+
const caller = String(event?.sessionID ?? "");
|
|
255
|
+
const running = opts.runningChildren ? opts.runningChildren(caller) : [];
|
|
256
|
+
if (running.length > report.concurrencyRunningMax)
|
|
257
|
+
report.concurrencyRunningMax = running.length;
|
|
258
|
+
concurrency = concurrencyGuard(action, running, opts.maxConcurrent ?? 0);
|
|
259
|
+
if (concurrency) {
|
|
260
|
+
report.concurrencyDenied++;
|
|
261
|
+
try {
|
|
262
|
+
opts.onConcurrencyDenied?.({ caller, running, cap: opts.maxConcurrent ?? 0 });
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
/* the trajectory line is an extra, never a reason to fail the call */
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
report.concurrencyThrew++;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// The stricter of the two wins; a null on either side is not a decision.
|
|
274
|
+
const chosen = !decision ? concurrency : !concurrency ? decision : rank[concurrency.effect] > rank[decision.effect] ? concurrency : decision;
|
|
275
|
+
if (!chosen)
|
|
159
276
|
return;
|
|
160
277
|
if (action === "shell")
|
|
161
278
|
report.shellMatched++;
|
|
279
|
+
if (chosen.why === "env-file-path")
|
|
280
|
+
report.envFileDenied++;
|
|
162
281
|
// Only ever stricter. A host that already decided to ask or deny keeps
|
|
163
282
|
// that decision — our classifier is a floor, not an override of the user.
|
|
164
|
-
if (rank[
|
|
283
|
+
if (rank[chosen.effect] <= rank[event.effect ?? "allow"])
|
|
165
284
|
return;
|
|
166
|
-
event.effect =
|
|
167
|
-
if (
|
|
168
|
-
event.message =
|
|
169
|
-
if (
|
|
285
|
+
event.effect = chosen.effect;
|
|
286
|
+
if (chosen.message)
|
|
287
|
+
event.message = chosen.message;
|
|
288
|
+
if (chosen.effect === "deny")
|
|
170
289
|
report.denied++;
|
|
171
290
|
else
|
|
172
291
|
report.strictened++;
|
|
@@ -174,6 +293,98 @@ export async function applyV2PermissionGuards(ctx, opts) {
|
|
|
174
293
|
];
|
|
175
294
|
return { registrations, report, installed: true };
|
|
176
295
|
}
|
|
296
|
+
/**
|
|
297
|
+
* The path-class fields each native file tool can carry in its `execute.before`
|
|
298
|
+
* `input`. This is the seam `permission.evaluate` cannot cover: the host's own
|
|
299
|
+
* docs say `grep`'s resource is "the requested pattern, not the search path",
|
|
300
|
+
* and `glob`'s is the pattern too — so a `grep SECRET in .env` reaches
|
|
301
|
+
* `evaluate` with `resources:["SECRET"]` and the env-file path is never seen
|
|
302
|
+
* (#58, measured on 2.0.24: `read .env` denied, `grep` in `.env` succeeded).
|
|
303
|
+
*
|
|
304
|
+
* `grep`'s `pattern` is deliberately ABSENT: it is a REGEX, not a path, and
|
|
305
|
+
* `isEnvFilePath` on a regex misfires (a search for `\.env` is not a read of
|
|
306
|
+
* `.env`). `glob`'s `pattern` IS a path glob, so it is checked. `include` is
|
|
307
|
+
* the host's own filter field and is checked wherever it appears.
|
|
308
|
+
*/
|
|
309
|
+
const ENV_FILE_INPUT_FIELDS = {
|
|
310
|
+
read: ["filePath", "path"],
|
|
311
|
+
write: ["filePath", "path"],
|
|
312
|
+
edit: ["filePath", "path"],
|
|
313
|
+
glob: ["pattern", "path", "include"],
|
|
314
|
+
grep: ["path", "include"],
|
|
315
|
+
};
|
|
316
|
+
/**
|
|
317
|
+
* R6's file-path face, on the seam that sees the WHOLE input (#58).
|
|
318
|
+
*
|
|
319
|
+
* `pathGuard` rides `permission.evaluate`, whose `resources` for `grep`/`glob`
|
|
320
|
+
* are the pattern — so the red line had a hole exactly the width of those two
|
|
321
|
+
* tools. `execute.before` hands us the raw args the model sent, so the search
|
|
322
|
+
* path (`path` / `include` / `filePath`) is visible there and the same
|
|
323
|
+
* `isEnvFilePath` matcher can answer.
|
|
324
|
+
*
|
|
325
|
+
* A refusal is THROWN, not returned: `execute.before` has no `effect` field, and
|
|
326
|
+
* silently rewriting a path the model chose is the guesswork this product
|
|
327
|
+
* refuses — the model has to see the refusal. Same shape as the browser gate's
|
|
328
|
+
* red line. An internal failure is swallowed and counted (`envFileInputThrew`),
|
|
329
|
+
* never thrown into the host: a guard that cannot decide must not break the call
|
|
330
|
+
* it is inspecting. Team-scoped through the same `scope.decide` gate as every
|
|
331
|
+
* other writer, and the counters land on `v2-surface` / `v2-shutdown`.
|
|
332
|
+
*/
|
|
333
|
+
export async function applyV2EnvFileInputGuard(ctx, opts) {
|
|
334
|
+
const report = opts.report;
|
|
335
|
+
const tool = ctx.tool;
|
|
336
|
+
if (!tool || typeof tool.hook !== "function")
|
|
337
|
+
return { registrations: [] };
|
|
338
|
+
if (opts.envProtectMode === "off")
|
|
339
|
+
return { registrations: [] };
|
|
340
|
+
let registrations;
|
|
341
|
+
try {
|
|
342
|
+
registrations = [
|
|
343
|
+
await tool.hook("execute.before", (event) => {
|
|
344
|
+
let refusal = null;
|
|
345
|
+
try {
|
|
346
|
+
const name = String(event?.tool ?? "");
|
|
347
|
+
const fields = ENV_FILE_INPUT_FIELDS[name];
|
|
348
|
+
if (!fields)
|
|
349
|
+
return;
|
|
350
|
+
report.envFileInputSeen++;
|
|
351
|
+
if (opts.scope && opts.scope.count(opts.scope.decide(event)) !== "ours") {
|
|
352
|
+
report.envFileInputForeignSkipped++;
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
const input = event.input;
|
|
356
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
357
|
+
return;
|
|
358
|
+
for (const field of fields) {
|
|
359
|
+
const value = input[field];
|
|
360
|
+
if (typeof value !== "string" || !value.trim())
|
|
361
|
+
continue;
|
|
362
|
+
if (isEnvFilePath(value)) {
|
|
363
|
+
refusal = `R6 红线:${name} 的 ${field} 指向环境文件(.env / shell rc 家族),不授权、不弹窗。`;
|
|
364
|
+
break;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
catch {
|
|
369
|
+
// A guard that cannot decide must not break the call it is inspecting:
|
|
370
|
+
// leave the args exactly as the model wrote them and count it.
|
|
371
|
+
report.envFileInputThrew++;
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
if (!refusal)
|
|
375
|
+
return;
|
|
376
|
+
report.envFileDeniedByInput++;
|
|
377
|
+
throw new Error(refusal);
|
|
378
|
+
}),
|
|
379
|
+
];
|
|
380
|
+
}
|
|
381
|
+
catch {
|
|
382
|
+
// No hook seam (an older host, or a ctx without `tool.hook`): the input face
|
|
383
|
+
// is simply absent, and the counters say so rather than throwing into boot.
|
|
384
|
+
return { registrations: [] };
|
|
385
|
+
}
|
|
386
|
+
return { registrations };
|
|
387
|
+
}
|
|
177
388
|
/** Does the config still need the coarse `shell -> ask` escalation? Only while
|
|
178
389
|
* the fine path is switched off; with the classifier in charge, escalating every
|
|
179
390
|
* command would mask it.
|
|
@@ -196,4 +407,109 @@ export function needsCoarseShellAsk(env, guardsInstalled) {
|
|
|
196
407
|
return true;
|
|
197
408
|
return false;
|
|
198
409
|
}
|
|
410
|
+
// ---------- 3. the shell timeout clamp (issue #6, ported from v1) ----------
|
|
411
|
+
/** The host's tool id on v2 is `shell`; v1 spelled it `bash`, and a namespaced
|
|
412
|
+
* delivery (`opencode:shell`, `local/shell`) is the same tool. Anything else —
|
|
413
|
+
* including the Code Mode `execute` program that calls shell inside it — is not
|
|
414
|
+
* ours to rewrite. */
|
|
415
|
+
function isShellTool(raw) {
|
|
416
|
+
const text = String(raw ?? "").trim().toLowerCase();
|
|
417
|
+
if (!text)
|
|
418
|
+
return false;
|
|
419
|
+
const last = text.slice(Math.max(text.lastIndexOf(":"), text.lastIndexOf("/")) + 1);
|
|
420
|
+
return last === "shell" || last === "bash";
|
|
421
|
+
}
|
|
422
|
+
/** Parse the model-supplied timeout defensively: the host schema wants a positive
|
|
423
|
+
* integer of milliseconds, but an LLM hands us `"120000"`, `120000.0`, or omits
|
|
424
|
+
* it entirely. Anything unreadable means "no timeout was supplied", and a
|
|
425
|
+
* supplied-none is NEVER turned into one by us. */
|
|
426
|
+
export function parseShellTimeout(raw) {
|
|
427
|
+
if (typeof raw === "number" && Number.isFinite(raw) && raw > 0)
|
|
428
|
+
return Math.trunc(raw);
|
|
429
|
+
if (typeof raw === "string") {
|
|
430
|
+
const n = Number(raw.trim());
|
|
431
|
+
if (Number.isFinite(n) && n > 0)
|
|
432
|
+
return Math.trunc(n);
|
|
433
|
+
}
|
|
434
|
+
return null;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Decide the clamped timeout for one shell call. `probeMs` / `maxMs` of 0
|
|
438
|
+
* disable that ceiling. `probeMs` applies ONLY to a command the P3 read-only
|
|
439
|
+
* allowlist already accepts; `maxMs` is the operator's explicit global cap and
|
|
440
|
+
* ships at 0 (off), because silently killing a build is worse than a slow one.
|
|
441
|
+
*/
|
|
442
|
+
export function resolveShellTimeout(opts) {
|
|
443
|
+
const t = opts.timeoutMs;
|
|
444
|
+
if (t === null)
|
|
445
|
+
return { changed: false, via: "none" };
|
|
446
|
+
const probe = opts.probeMs > 0 && classifyReadonlyCommand(opts.command, opts.readonlyAllowed).ok;
|
|
447
|
+
if (probe && t > opts.probeMs)
|
|
448
|
+
return { changed: true, via: "probe", from: t, to: opts.probeMs };
|
|
449
|
+
if (opts.maxMs > 0 && t > opts.maxMs)
|
|
450
|
+
return { changed: true, via: "max", from: t, to: opts.maxMs };
|
|
451
|
+
if (!probe && opts.maxMs === 0)
|
|
452
|
+
return { changed: false, via: "none" };
|
|
453
|
+
return { changed: false, via: "already-short" };
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* The `tool.hook("execute.before")` installation of the clamp. Returns the
|
|
457
|
+
* registrations plus the counters that ride `v2-surface` / `v2-shutdown`.
|
|
458
|
+
* `onClamp` is how the caller writes the trajectory row; a throw inside it is
|
|
459
|
+
* swallowed there, never here.
|
|
460
|
+
*/
|
|
461
|
+
export async function applyV2ShellTimeoutClamp(ctx, opts) {
|
|
462
|
+
const report = { seen: 0, clamped: 0, foreignSkipped: 0, threw: 0 };
|
|
463
|
+
const tool = ctx.tool;
|
|
464
|
+
if (!tool || typeof tool.hook !== "function")
|
|
465
|
+
return { registrations: [], report };
|
|
466
|
+
let registrations;
|
|
467
|
+
try {
|
|
468
|
+
registrations = [
|
|
469
|
+
await tool.hook("execute.before", (event) => {
|
|
470
|
+
try {
|
|
471
|
+
if (!isShellTool(event?.tool))
|
|
472
|
+
return;
|
|
473
|
+
report.seen++;
|
|
474
|
+
if (opts.scope && opts.scope.count(opts.scope.decide(event)) !== "ours") {
|
|
475
|
+
report.foreignSkipped++;
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
const input = event.input;
|
|
479
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
480
|
+
return;
|
|
481
|
+
const command = typeof input.command === "string" ? input.command : "";
|
|
482
|
+
if (!command)
|
|
483
|
+
return;
|
|
484
|
+
const verdict = resolveShellTimeout({
|
|
485
|
+
command,
|
|
486
|
+
timeoutMs: parseShellTimeout(input.timeout),
|
|
487
|
+
probeMs: opts.probeMs,
|
|
488
|
+
maxMs: opts.maxMs,
|
|
489
|
+
readonlyAllowed: opts.readonlyAllowed,
|
|
490
|
+
});
|
|
491
|
+
if (!verdict.changed)
|
|
492
|
+
return;
|
|
493
|
+
// Only the number the model volunteered. `input.command` is never
|
|
494
|
+
// touched, and nothing is added to the object.
|
|
495
|
+
input.timeout = verdict.to;
|
|
496
|
+
report.clamped++;
|
|
497
|
+
const sessionID = typeof event.sessionID === "string" ? event.sessionID : undefined;
|
|
498
|
+
opts.onClamp?.({ via: verdict.via, from: verdict.from, to: verdict.to, sessionID });
|
|
499
|
+
}
|
|
500
|
+
catch {
|
|
501
|
+
// A clamp that cannot decide must not break the call it is trying to
|
|
502
|
+
// speed up: leave the args exactly as the model wrote them and count it.
|
|
503
|
+
report.threw++;
|
|
504
|
+
}
|
|
505
|
+
}),
|
|
506
|
+
];
|
|
507
|
+
}
|
|
508
|
+
catch {
|
|
509
|
+
// No hook seam (an older host, or a ctx without `tool.hook`): the clamp is
|
|
510
|
+
// simply absent, and the counters say so rather than throwing into boot.
|
|
511
|
+
return { registrations: [], report };
|
|
512
|
+
}
|
|
513
|
+
return { registrations, report };
|
|
514
|
+
}
|
|
199
515
|
//# sourceMappingURL=v2-guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v2-guard.js","sourceRoot":"","sources":["../../src/host/v2-guard.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"v2-guard.js","sourceRoot":"","sources":["../../src/host/v2-guard.ts"],"names":[],"mappings":"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"}
|