@sema-agent/core 7.34.0 → 7.35.1
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/CHANGELOG.md +156 -3
- package/dist/brain/errors.d.ts +23 -1
- package/dist/brain/errors.js +19 -2
- package/dist/brain/status-sink.d.ts +7 -1
- package/dist/brain/stream-shared.d.ts +3 -1
- package/dist/brain/stream-shared.js +16 -4
- package/dist/core/ask-origin.d.ts +34 -6
- package/dist/core/ask-origin.js +24 -23
- package/dist/core/ask-question.js +2 -1
- package/dist/core/checkpoint-store.d.ts +4 -0
- package/dist/core/gate-fold.js +2 -2
- package/dist/core/gate-lanes.js +5 -4
- package/dist/core/governance-codes.d.ts +17 -1
- package/dist/core/governance-codes.js +11 -1
- package/dist/core/hooks.d.ts +3 -0
- package/dist/core/message-utils.d.ts +2 -1
- package/dist/core/message-utils.js +2 -1
- package/dist/core/mode-policy.d.ts +3 -0
- package/dist/core/mode-policy.js +5 -0
- package/dist/core/permission-rule-model.d.ts +4 -0
- package/dist/core/permission-rule-model.js +4 -0
- package/dist/core/permission-rules.js +21 -1
- package/dist/core/persisted-rule-arms.d.ts +4 -1
- package/dist/core/persisted-rule-arms.js +4 -0
- package/dist/core/retired-keys.js +1 -1
- package/dist/core/runner/active-skill-scope.js +5 -4
- package/dist/core/runner/assemble-result.js +2 -2
- package/dist/core/runner/contracts.d.ts +26 -4
- package/dist/core/runner/denial-limit-arms.d.ts +6 -1
- package/dist/core/runner/denial-limit-arms.js +4 -4
- package/dist/core/runner/file-history-request.d.ts +26 -0
- package/dist/core/runner/file-history-request.js +90 -0
- package/dist/core/runner/permission-rule-lanes.d.ts +2 -1
- package/dist/core/runner/permission-rule-lanes.js +14 -11
- package/dist/core/runner/prepare-ask-lane.d.ts +1 -1
- package/dist/core/runner/prepare-ask-lane.js +2 -2
- package/dist/core/runner/prepare-file-history.d.ts +9 -3
- package/dist/core/runner/prepare-file-history.js +4 -90
- package/dist/core/runner/prepare-gate-stations.d.ts +4 -3
- package/dist/core/runner/prepare-gate-stations.js +15 -11
- package/dist/core/runner/prepare-inherited-gate.d.ts +8 -1
- package/dist/core/runner/prepare-inherited-gate.js +10 -4
- package/dist/core/runner/prepare-park-ask.d.ts +4 -2
- package/dist/core/runner/prepare-park-ask.js +5 -4
- package/dist/core/runner/prepare-policy-chain.d.ts +3 -2
- package/dist/core/runner/prepare-policy-chain.js +171 -175
- package/dist/core/runner/prepare-task.d.ts +3 -1
- package/dist/core/runner/prepare-task.js +9 -5
- package/dist/core/runner/run-brain-sinks.js +3 -1
- package/dist/core/runner/run-leg.js +5 -3
- package/dist/core/runner/run-notification-lane.d.ts +5 -0
- package/dist/core/runner/run-notification-lane.js +3 -2
- package/dist/core/runner/runtask.d.ts +3 -1
- package/dist/core/runner/runtask.js +20 -16
- package/dist/core/runner/session-mode-seats.d.ts +48 -0
- package/dist/core/runner/session-mode-seats.js +73 -0
- package/dist/core/runner/session-rule-policy.js +3 -2
- package/dist/core/secret-env.d.ts +30 -58
- package/dist/core/secret-env.js +149 -586
- package/dist/core/sensitive-path-policy.js +2 -1
- package/dist/core/store-contracts/checkpoint-store-contract.js +2 -1
- package/dist/core/tool-policy.d.ts +31 -6
- package/dist/core/tool-policy.js +35 -16
- package/dist/core/tool-registry.d.ts +36 -0
- package/dist/core/tool-registry.js +22 -1
- package/dist/core/tool-roster.d.ts +17 -2
- package/dist/core/tool-roster.js +11 -1
- package/dist/core/trace.d.ts +11 -0
- package/dist/engine/execution-env/node-execution-env.d.ts +3 -1
- package/dist/engine/execution-env/node-execution-env.js +5 -2
- package/dist/engine/harness/agent-harness.js +2 -1
- package/dist/engine/lsp/node-lsp-manager.js +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/stores/file/index.d.ts +5 -3
- package/dist/stores/file/session-store.d.ts +8 -2
- package/dist/stores/file/session-store.js +5 -5
- package/dist/tools/fs/file-read-check.d.ts +2 -1
- package/dist/tools/fs/file-read-check.js +15 -7
- package/dist/tools/fs/shell-read-check.d.ts +10 -2
- package/dist/tools/fs/shell-read-check.js +12 -8
- package/package.json +1 -1
- package/test/export-surface.snapshot.json +15 -1
- package/wire-changes/core@7.35.0.json +584 -0
- package/wire-changes/core@7.35.1.json +59 -0
|
@@ -66,7 +66,7 @@ export interface PrepareInheritedGateInput {
|
|
|
66
66
|
/** borrowed-readonly — the trusted spawn-side channel: `inheritedGate` (the LIVE half of the chain fold), `ownOrgAdmissionRef`
|
|
67
67
|
* (the same-session continuation's freeze), `delegationProvenance` (the F-012 stamp), and the identity / peer / notification
|
|
68
68
|
* seats the ctx enrichment forwards. Never mutated. */
|
|
69
|
-
internals: Pick<RunInternals, "inheritedGate" | "ownOrgAdmissionRef" | "delegationProvenance" | "memoryCaptureAncestors" | "parentTaskId" | "parentSessionId" | "rootSessionId" | "placementRoot" | "explicitAgentName" | "peerSelfRef" | "peerInboundChainRef" | "onTaskNotification" | "onSubagentSpawn" | "insideFork" | "questionFaceStripped"> | undefined;
|
|
69
|
+
internals: Pick<RunInternals, "inheritedGate" | "sessionModeSeats" | "ownOrgAdmissionRef" | "delegationProvenance" | "memoryCaptureAncestors" | "parentTaskId" | "parentSessionId" | "rootSessionId" | "placementRoot" | "explicitAgentName" | "peerSelfRef" | "peerInboundChainRef" | "onTaskNotification" | "onSubagentSpawn" | "insideFork" | "questionFaceStripped"> | undefined;
|
|
70
70
|
/** borrowed-readonly — the resume leg, or undefined on a fresh one: `seed.inheritedGate` is the CHECKPOINT half of the chain
|
|
71
71
|
* fold (the trust floor the live half may only tighten), `seed.readFace` the hands-less re-park's carried section. */
|
|
72
72
|
resume: Pick<PrepareResume, "seed" | "outcome"> | undefined;
|
|
@@ -197,6 +197,13 @@ export interface PrepareInheritedGateResult {
|
|
|
197
197
|
* seat, or the checkpoint's recorded word), folded against the arming facts the caps phase binds later. Every mode
|
|
198
198
|
* consumer reads `current` at its own call; the steer verb writes it. */
|
|
199
199
|
permissionMode: PermissionModeController;
|
|
200
|
+
/** owned — the leg's commit of its mode seats, called by the driver once prepare succeeded (never on a failed one):
|
|
201
|
+
* makes this leg its SESSION's current leg and holds the leg's own engine ceiling until `legSignal` aborts, so each
|
|
202
|
+
* move of that ceiling re-judges this leg. */
|
|
203
|
+
commitModeSeats: (legSignal: AbortSignal) => void;
|
|
204
|
+
/** owned — the leg has STOPPED (the run leg's teardown, after its loop settled): from here its children read the
|
|
205
|
+
* session's current leg. Idempotent; a leg that never reaches it keeps answering its children itself. */
|
|
206
|
+
endModeCeiling: () => void;
|
|
200
207
|
/** owned — the seed ∩ live admitted org scopes (one side absent ⇒ the other; both absent ⇒ undefined). */
|
|
201
208
|
inheritedAdmittedOrgScopes: readonly string[] | undefined;
|
|
202
209
|
/** owned — the prior own org verdict: checkpoint ∩ same-session ref (either alone stands; neither ⇒ undefined). */
|
|
@@ -7,6 +7,7 @@ import { StubExecutionEnv } from "../stub-env.js";
|
|
|
7
7
|
import { askApproverIdentity, durableMandateSourceOf } from "../tool-policy.js";
|
|
8
8
|
import { deliverEngineNotice } from "../types.js";
|
|
9
9
|
import { PermissionModeController, modeRequestAfterResume } from "../mode-policy.js";
|
|
10
|
+
import { SessionModeSeats } from "./session-mode-seats.js";
|
|
10
11
|
import { migrateLegacyModeSeed } from "../checkpoint-store.js";
|
|
11
12
|
import { attachRebuiltDenialTrackers, createDenialLimitStop } from "./denial-limit-arms.js";
|
|
12
13
|
import { asThrownError } from "../thrown-value.js";
|
|
@@ -56,6 +57,11 @@ export function prepareInheritedGate(input) {
|
|
|
56
57
|
};
|
|
57
58
|
const permissionMode = new PermissionModeController(modeRequestAfterResume(permissionModeSeat, modeSeed, resume?.outcome), ceiling, { onFold: announceModeFold, ...(modeSeed.prePlanMode !== undefined ? { prePlanMode: modeSeed.prePlanMode } : {}) });
|
|
58
59
|
announceModeFold(permissionMode.receipt());
|
|
60
|
+
const { ceiling: legModeCeiling, commit: commitLegModeCeiling, end: endModeCeiling } = (internals?.sessionModeSeats ?? new SessionModeSeats()).legCeiling(sessionId, permissionMode);
|
|
61
|
+
const commitModeSeats = (legSignal) => {
|
|
62
|
+
commitLegModeCeiling();
|
|
63
|
+
parentSeat?.hold?.(permissionMode, legSignal);
|
|
64
|
+
};
|
|
59
65
|
const liveAdmittedOrg = liveInheritedGate?.admittedOrgScopes;
|
|
60
66
|
const seedAdmittedOrg = seedInheritedGate?.admittedOrgScopes;
|
|
61
67
|
const inheritedAdmittedOrgScopes = liveAdmittedOrg === undefined ? seedAdmittedOrg : seedAdmittedOrg === undefined ? liveAdmittedOrg : liveAdmittedOrg.filter((s) => seedAdmittedOrg.includes(s));
|
|
@@ -156,7 +162,7 @@ export function prepareInheritedGate(input) {
|
|
|
156
162
|
...(durableMandate ? { durableMandate: true } : {}),
|
|
157
163
|
...(contentMandate ? { contentMandate: true } : {}),
|
|
158
164
|
...(autoModeDecider !== undefined
|
|
159
|
-
? { autoMode: { decider: autoModeDecider, ...(autoModeDenialTracking !== undefined ? { denialTracking: autoModeDenialTracking } : {}), ...(autoModeArming !== undefined ? { arming: autoModeArming } : {}) } }
|
|
165
|
+
? { autoMode: { decider: autoModeDecider, ...(autoModeDenialTracking !== undefined ? { denialTracking: autoModeDenialTracking } : {}), ...(autoModeArming !== undefined ? { arming: autoModeArming } : {}), liveMode: legModeCeiling } }
|
|
160
166
|
: {}),
|
|
161
167
|
},
|
|
162
168
|
]
|
|
@@ -172,7 +178,7 @@ export function prepareInheritedGate(input) {
|
|
|
172
178
|
...(durableMandate ? { durableMandate: true } : {}),
|
|
173
179
|
...(contentMandate ? { contentMandate: true } : {}),
|
|
174
180
|
...(autoModeDecider !== undefined
|
|
175
|
-
? { autoMode: { decider: autoModeDecider, ...(autoModeDenialTracking !== undefined ? { denialTracking: autoModeDenialTracking } : {}), ...(autoModeArming !== undefined ? { arming: autoModeArming } : {}) } }
|
|
181
|
+
? { autoMode: { decider: autoModeDecider, ...(autoModeDenialTracking !== undefined ? { denialTracking: autoModeDenialTracking } : {}), ...(autoModeArming !== undefined ? { arming: autoModeArming } : {}), liveMode: legModeCeiling } }
|
|
176
182
|
: {}),
|
|
177
183
|
},
|
|
178
184
|
]
|
|
@@ -182,7 +188,7 @@ export function prepareInheritedGate(input) {
|
|
|
182
188
|
...(ancestorRules.length > 0 ? { ancestorRules } : {}),
|
|
183
189
|
...(effectiveShellGate !== undefined ? { shellGate: effectiveShellGate } : {}),
|
|
184
190
|
permissionMode: permissionMode.current,
|
|
185
|
-
permissionModeCeiling:
|
|
191
|
+
permissionModeCeiling: legModeCeiling,
|
|
186
192
|
...(parentConstraints.length > 0 ? { parentConstraints } : {}),
|
|
187
193
|
admittedOrgScopes: memoryAdmittedOrgScopesRef.current,
|
|
188
194
|
...(orgGovernedProvenance ? { orgAdmissionGoverned: true } : {}),
|
|
@@ -295,5 +301,5 @@ export function prepareInheritedGate(input) {
|
|
|
295
301
|
...(spec.enablePlanMode === true ? { enterPlanMode } : {}),
|
|
296
302
|
};
|
|
297
303
|
};
|
|
298
|
-
return { liveInheritedGate, seedInheritedGate, inheritedAncestorRules, inheritedShellGate, inheritedParentConstraints, permissionMode, inheritedAdmittedOrgScopes, priorOwnOrgVerdict, orgGovernedProvenance, effectiveShellGate, ownSessionRulesRef, ancestorSessionRulesRef, ancestorRulesNow, memoryAdmittedOrgScopesRef, ownOrgVerdictRef, orgAdmissionCheckpointState, faceCheckpointSection, faceCheckpointState, writeFaceCheckpointSection, f012CheckpointState, frozenOnAsk, hookEnvSource, notifyOwnHookCrash, frozenOnQuestion, parentSpecSeat, provenanceForChildrenRef, delegationSettlementRef, inheritedGateForChildren, carrierReadFace, carrierWriteFace, fullShellReachable, gateStopRef, stopForDenialLimit, enrichSpecToolCtx };
|
|
304
|
+
return { liveInheritedGate, seedInheritedGate, inheritedAncestorRules, inheritedShellGate, inheritedParentConstraints, permissionMode, commitModeSeats, endModeCeiling, inheritedAdmittedOrgScopes, priorOwnOrgVerdict, orgGovernedProvenance, effectiveShellGate, ownSessionRulesRef, ancestorSessionRulesRef, ancestorRulesNow, memoryAdmittedOrgScopesRef, ownOrgVerdictRef, orgAdmissionCheckpointState, faceCheckpointSection, faceCheckpointState, writeFaceCheckpointSection, f012CheckpointState, frozenOnAsk, hookEnvSource, notifyOwnHookCrash, frozenOnQuestion, parentSpecSeat, provenanceForChildrenRef, delegationSettlementRef, inheritedGateForChildren, carrierReadFace, carrierWriteFace, fullShellReachable, gateStopRef, stopForDenialLimit, enrichSpecToolCtx };
|
|
299
305
|
}
|
|
@@ -29,7 +29,7 @@ import type { RunnerDeps, RuntimeCaps, ShellGateDoctrine, TaskSpec } from "../ty
|
|
|
29
29
|
import type { CwdRef } from "../../tools/fs/fs-shared.js";
|
|
30
30
|
import type { AdvertisedWritableDirs } from "./advertised-writable-dirs.js";
|
|
31
31
|
import { type ContentAskBinding } from "./content-ask-bindings.js";
|
|
32
|
-
import type { AskLane, ParkAsk, Prepared, SuspendSaga } from "./contracts.js";
|
|
32
|
+
import type { AskLane, IrreversibilityTier, ParkAsk, Prepared, SuspendSaga } from "./contracts.js";
|
|
33
33
|
import type { createRuleOffersOf } from "./permission-rule-lanes.js";
|
|
34
34
|
import { type ToolRosterDeltaSeat } from "../tool-roster.js";
|
|
35
35
|
export interface PrepareParkAskInput {
|
|
@@ -112,8 +112,10 @@ export interface PrepareParkAskInput {
|
|
|
112
112
|
/** borrowed-mutable — the run-scoped remote-lifecycle failure log. Writer here: a refused `suspendVM` (`push`). */
|
|
113
113
|
remoteEnvFailures: Prepared["remoteEnvFailures"];
|
|
114
114
|
/** borrowed-readonly — the shell-seat provenance set: the shell-running tools whose tier is the engine's shell seat's, not a
|
|
115
|
-
* deployment mark (the risk descriptor's `shellGated` is the
|
|
115
|
+
* deployment mark (the risk descriptor's `shellGated` is the membership of the name the call's tier is read under). */
|
|
116
116
|
shellGatedTools: ReadonlySet<string>;
|
|
117
|
+
/** borrowed-readonly — the per-tool tier, read only for the name the call's tier seat is read under (as at the gate). */
|
|
118
|
+
irreversibilityTier: IrreversibilityTier;
|
|
117
119
|
/** borrowed-readonly — the operator's shell floor (`"always"`), persisted on a shell-gated descriptor; undefined = no floor. */
|
|
118
120
|
effectiveShellGate: ShellGateDoctrine | undefined;
|
|
119
121
|
/** borrowed-readonly — the EFFECTIVE durable-approval opt-in (the caller's, or the synthesized mandate scope): picks the
|
|
@@ -15,7 +15,7 @@ import { checkpointScopeOf } from "./checkpoint-scope.js";
|
|
|
15
15
|
import { CONTENT_ASK_BINDING_CAP } from "./content-ask-bindings.js";
|
|
16
16
|
import { DEFAULT_UNATTENDED_APPROVAL_TTL_MS, publishCommittedSuspend, sanitizedTtlMs } from "./park-commit.js";
|
|
17
17
|
import { remoteEnvFailureNote } from "./remote-env-retry.js";
|
|
18
|
-
import { callFaceSeat, parkedToolIdentity, parkedToolFace } from "../tool-roster.js";
|
|
18
|
+
import { callFaceSeat, firstNamed, parkedToolIdentity, parkedToolFace, ruleNamesOf } from "../tool-roster.js";
|
|
19
19
|
class ParkRefusal extends Error {
|
|
20
20
|
constructor(message, options) {
|
|
21
21
|
super(message, options);
|
|
@@ -26,7 +26,7 @@ const wordlessDemand = (toolName) => {
|
|
|
26
26
|
throw new Error(`a real-approval demand for "${toolName}" reached the park with no origin word — the origin stamp precedes every park`);
|
|
27
27
|
};
|
|
28
28
|
export function prepareParkAsk(input) {
|
|
29
|
-
const { askLane, saga, spec, deps, sessionId, checkpointStore, toolRosterDeltas, parkLaneArmed, contentAskRoutable, liveQuestionFace, mountedQuestionTool, contentAskBindings, lateStrandedAnswers, discloseStrandedAnswers, onAsk, runtimeCaps, inheritedUnavailableAsks, basePolicyForResumeEdit, budgetSnapshot, handsCwdRef, advertisedWritableDirs, offloadStore, ownedEnv, incompleteSuspendAdapter, session, sessions, suspendChainBase, maxSuspends, remoteEnvFailures, shellGatedTools, effectiveShellGate, durableApproval, priorLedger, liveSpendRef, resourceTotal, faceCheckpointState, f012CheckpointState, orgAdmissionCheckpointState, ruleOffersOf, now, humanReviewRef, abortController, harness, pausedRef } = input;
|
|
29
|
+
const { askLane, saga, spec, deps, sessionId, checkpointStore, toolRosterDeltas, parkLaneArmed, contentAskRoutable, liveQuestionFace, mountedQuestionTool, contentAskBindings, lateStrandedAnswers, discloseStrandedAnswers, onAsk, runtimeCaps, inheritedUnavailableAsks, basePolicyForResumeEdit, budgetSnapshot, handsCwdRef, advertisedWritableDirs, offloadStore, ownedEnv, incompleteSuspendAdapter, session, sessions, suspendChainBase, maxSuspends, remoteEnvFailures, shellGatedTools, irreversibilityTier, effectiveShellGate, durableApproval, priorLedger, liveSpendRef, resourceTotal, faceCheckpointState, f012CheckpointState, orgAdmissionCheckpointState, ruleOffersOf, now, humanReviewRef, abortController, harness, pausedRef } = input;
|
|
30
30
|
if (askLane === undefined || saga === undefined)
|
|
31
31
|
return { parkAsk: undefined };
|
|
32
32
|
const { composedCallSignal, approvalPreviewOf } = askLane;
|
|
@@ -234,6 +234,7 @@ export function prepareParkAsk(input) {
|
|
|
234
234
|
remoteHandle = parkOnlyHandle(parkOnlyRemoteEnv);
|
|
235
235
|
}
|
|
236
236
|
token = mintCheckpointToken();
|
|
237
|
+
const tierSeat = firstNamed(irreversibilityTier, ruleNamesOf(req));
|
|
237
238
|
const riskDescriptor = buildRiskDescriptor({
|
|
238
239
|
toolName: req.toolName,
|
|
239
240
|
args: parkedArgs,
|
|
@@ -241,7 +242,7 @@ export function prepareParkAsk(input) {
|
|
|
241
242
|
...(shadowedRule !== undefined ? { shadowedRule } : {}),
|
|
242
243
|
...(probeReason !== undefined ? { probeReason } : {}),
|
|
243
244
|
...(probeCause !== undefined ? { probeCause } : {}),
|
|
244
|
-
shellGated: shellGatedTools.has(
|
|
245
|
+
shellGated: tierSeat !== undefined && shellGatedTools.has(tierSeat.name),
|
|
245
246
|
...(effectiveShellGate !== undefined ? { shellGateDoctrine: effectiveShellGate } : {}),
|
|
246
247
|
});
|
|
247
248
|
gate =
|
|
@@ -316,7 +317,7 @@ export function prepareParkAsk(input) {
|
|
|
316
317
|
...(rowRealApproval !== undefined ? { requiresRealApproval: true } : {}),
|
|
317
318
|
...askMandateMember(clearanceFacts),
|
|
318
319
|
...askCarryRowMembers(carry),
|
|
319
|
-
...ruleOffersOf(req
|
|
320
|
+
...ruleOffersOf(req, parkedArgs, clearanceFacts),
|
|
320
321
|
boundInputHash: boundInputHashOf(parkedArgs),
|
|
321
322
|
batchToolCallIds,
|
|
322
323
|
completedCallIds,
|
|
@@ -35,6 +35,7 @@ import type { InheritedGate, IrreversibilityTier, PrepareResume, RunInternals, S
|
|
|
35
35
|
import { type Arbitration } from "../ask-origin.js";
|
|
36
36
|
import { type ModeGateSeats, type PermissionModeController } from "../mode-policy.js";
|
|
37
37
|
import { createRuleOffersOf, type PermissionRuleLanes } from "./permission-rule-lanes.js";
|
|
38
|
+
import type { ToolCallLike } from "../tool-registry.js";
|
|
38
39
|
export interface PreparePolicyChainInput {
|
|
39
40
|
/** borrowed-readonly — the REBOUND spec. Read: `sessionId` / `principal` (the session-rule read and the lanes' identity),
|
|
40
41
|
* `hooks` (spec over deps), `durableApproval` / `checkpointStore` (the mandate-park facility test and the sandbox arming's park prerequisites), `taskId` (the late-ask observer's detail).
|
|
@@ -199,7 +200,7 @@ export interface PreparePolicyChainResult {
|
|
|
199
200
|
isDelegatedChild?: true;
|
|
200
201
|
};
|
|
201
202
|
/** owned — the engine-judged risk axes for an ask, from the same resolved sources the safety tightens use. */
|
|
202
|
-
riskAxesOf: (
|
|
203
|
+
riskAxesOf: (call: Pick<ToolCallLike, "toolName" | "face">) => {
|
|
203
204
|
riskAxes?: {
|
|
204
205
|
irreversible?: boolean;
|
|
205
206
|
egress?: boolean;
|
|
@@ -214,7 +215,7 @@ export interface PreparePolicyChainResult {
|
|
|
214
215
|
/** owned — whether the sandbox-admission mode armed (declared isolation with its park prerequisites). */
|
|
215
216
|
sandboxAdmissionArmed: boolean;
|
|
216
217
|
/** owned — the NOT-CONTAINED classification: a call the declared sandbox does not contain. */
|
|
217
|
-
sandboxBoundaryCapable: (
|
|
218
|
+
sandboxBoundaryCapable: (call: Pick<ToolCallLike, "toolName" | "face">) => boolean;
|
|
218
219
|
/** owned — the admission disclosure's trace emitter (the gate station emits it once the fold settles). */
|
|
219
220
|
emitSandboxAdmitted: (info: {
|
|
220
221
|
toolCallId: string;
|