@sema-agent/server 7.142.0 → 7.144.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/MIGRATION.md +608 -0
- package/USAGE.md +63 -36
- package/dist/adoption/plan.js +22 -0
- package/dist/approval-ask-audit-store.d.ts +7 -5
- package/dist/approval-ask-audit-store.js +12 -6
- package/dist/approval-ask-machine.d.ts +15 -7
- package/dist/approval-ask-machine.js +10 -4
- package/dist/approval-card.d.ts +155 -39
- package/dist/approval-card.js +111 -31
- package/dist/approval-queue-kind.d.ts +27 -0
- package/dist/approval-queue-kind.js +6 -0
- package/dist/approval-reconciler.d.ts +8 -8
- package/dist/approval-reconciler.js +3 -3
- package/dist/audit.js +4 -2
- package/dist/boot/budget-tracing.d.ts +1 -1
- package/dist/boot/execution-env.js +1 -1
- package/dist/boot/governance-seams.d.ts +26 -41
- package/dist/boot/governance-seams.js +61 -28
- package/dist/boot/late-binds.d.ts +7 -4
- package/dist/boot/late-binds.js +3 -1
- package/dist/boot/leader.js +2 -4
- package/dist/boot/memory-consolidation.d.ts +0 -8
- package/dist/boot/memory-consolidation.js +3 -3
- package/dist/boot/reapers.js +5 -4
- package/dist/boot/resolve-spec.d.ts +1 -1
- package/dist/boot/resolve-spec.js +8 -8
- package/dist/boot/runner-deps.d.ts +14 -6
- package/dist/boot/runner-deps.js +6 -17
- package/dist/boot/shutdown.d.ts +9 -0
- package/dist/boot/shutdown.js +18 -2
- package/dist/boot/stage-01-config.js +2 -0
- package/dist/boot/stage-02-web-admin-pull.js +3 -0
- package/dist/boot/stage-03-store-backend.d.ts +4 -1
- package/dist/boot/stage-03-store-backend.js +1 -2
- package/dist/boot/stage-04-stores.d.ts +5 -2
- package/dist/boot/stage-04-stores.js +3 -5
- package/dist/boot/stage-05-execution-env.d.ts +5 -2
- package/dist/boot/stage-06-runners.d.ts +5 -2
- package/dist/boot/stage-06-runners.js +1 -3
- package/dist/boot/stage-07-capability-layer.d.ts +5 -2
- package/dist/boot/stage-07-capability-layer.js +6 -2
- package/dist/boot/stage-08-reapers.d.ts +5 -2
- package/dist/boot/stage-09-leader.d.ts +5 -2
- package/dist/boot/stage-10-http-server.d.ts +5 -2
- package/dist/boot/stage-10-http-server.js +4 -1
- package/dist/boot/stores.d.ts +5 -2
- package/dist/boot/stores.js +7 -7
- package/dist/boot/web-admin.d.ts +5 -1
- package/dist/boot/web-admin.js +31 -19
- package/dist/capabilities/hands-lane.d.ts +9 -39
- package/dist/capabilities/hands-lane.js +8 -13
- package/dist/capabilities/mcp-probe.d.ts +3 -2
- package/dist/capabilities/scenarios.d.ts +23 -17
- package/dist/capabilities/scenarios.js +2 -2
- package/dist/capabilities/skills.d.ts +1 -17
- package/dist/capabilities/skills.js +0 -8
- package/dist/capability-facts.d.ts +8 -8
- package/dist/capability-facts.js +4 -4
- package/dist/card-void.d.ts +6 -9
- package/dist/config-catalog.js +1 -1
- package/dist/config-d-migration.d.ts +2 -0
- package/dist/config-dir-trust.js +58 -29
- package/dist/config-invariants.d.ts +7 -1
- package/dist/config-invariants.js +7 -0
- package/dist/config-provider.d.ts +10 -0
- package/dist/config-provider.js +15 -4
- package/dist/config-root-migration.d.ts +13 -0
- package/dist/config-root-migration.js +99 -0
- package/dist/config-types.d.ts +5 -5
- package/dist/config.d.ts +4 -3
- package/dist/config.js +1 -1
- package/dist/delegated-session-owner.d.ts +35 -151
- package/dist/delegated-session-owner.js +1 -83
- package/dist/device-ws-protocol.d.ts +1 -0
- package/dist/device-ws-protocol.js +2 -1
- package/dist/entry-mode-clamp-notice.d.ts +1 -1
- package/dist/env-model-table-gate.d.ts +53 -0
- package/dist/env-model-table-gate.js +53 -0
- package/dist/execution-placement.d.ts +7 -4
- package/dist/fleet/fleet-bus.d.ts +28 -52
- package/dist/fleet/fleet-bus.js +35 -100
- package/dist/fleet/fleet-reconciler.d.ts +4 -4
- package/dist/fleet/fleet-reconciler.js +1 -1
- package/dist/fleet/subagent-tail-bus.d.ts +14 -11
- package/dist/fleet/subagent-tail-bus.js +15 -28
- package/dist/hooks/classic-stations.d.ts +3 -1
- package/dist/hooks/classic-stations.js +2 -0
- package/dist/hooks/hook-runner.js +28 -7
- package/dist/host-decision.d.ts +54 -20
- package/dist/host-decision.js +42 -14
- package/dist/http/admission.d.ts +1 -1
- package/dist/http/admission.js +7 -3
- package/dist/http/approval-sweeps.js +11 -8
- package/dist/http/caller-trust.d.ts +1 -1
- package/dist/http/durable-run-leg.js +2 -2
- package/dist/http/engine-refusal.d.ts +16 -0
- package/dist/http/engine-refusal.js +17 -0
- package/dist/http/memory-compliance-failure-reply.d.ts +1 -3
- package/dist/http/memory-compliance-failure-reply.js +4 -6
- package/dist/http/owner-access.d.ts +11 -0
- package/dist/http/owner-access.js +13 -0
- package/dist/http/principal-gate.d.ts +1 -1
- package/dist/http/refusal-body.d.ts +7 -3
- package/dist/http/refusal-body.js +1 -0
- package/dist/http/resume-legs.d.ts +21 -7
- package/dist/http/resume-legs.js +82 -53
- package/dist/http/resume-restatement.d.ts +39 -0
- package/dist/http/resume-restatement.js +25 -0
- package/dist/http/route-ctx.d.ts +35 -10
- package/dist/http/route-ctx.js +1 -1
- package/dist/http/routes/approvals-assistant.d.ts +9 -1
- package/dist/http/routes/approvals-assistant.js +143 -31
- package/dist/http/routes/capabilities.js +11 -2
- package/dist/http/routes/memory-policy.d.ts +2 -2
- package/dist/http/routes/memory-policy.js +1 -1
- package/dist/http/routes/notify-wake.js +23 -25
- package/dist/http/routes/rules.js +48 -13
- package/dist/http/routes/runs.js +9 -8
- package/dist/http/routes/session-memory-sync.d.ts +34 -6
- package/dist/http/routes/session-memory-sync.js +27 -10
- package/dist/http/routes/session-sync.js +13 -20
- package/dist/http/routes/sessions.d.ts +2 -2
- package/dist/http/routes/sessions.js +22 -23
- package/dist/http/routes/tasks.js +27 -49
- package/dist/http/server.d.ts +13 -7
- package/dist/http/server.js +2 -2
- package/dist/http/stored-body-replay.js +15 -4
- package/dist/http/wire-types.d.ts +17 -7
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/lane-home-probe.d.ts +15 -0
- package/dist/lane-home-probe.js +4 -0
- package/dist/leader/leader.js +5 -2
- package/dist/leader/wire.d.ts +7 -1
- package/dist/leader/wire.js +6 -5
- package/dist/leg-facts.d.ts +37 -0
- package/dist/leg-facts.js +15 -0
- package/dist/memory-bundle-engine.d.ts +1 -4
- package/dist/memory-bundle-engine.js +2 -2
- package/dist/memory-operator-faces.d.ts +30 -66
- package/dist/memory-operator-faces.js +17 -88
- package/dist/memory-scope-stores.d.ts +38 -40
- package/dist/memory-scope-stores.js +51 -36
- package/dist/memory-scope.d.ts +0 -9
- package/dist/memory-scope.js +0 -9
- package/dist/memory-sync-client.js +14 -3
- package/dist/memory-sync.d.ts +20 -4
- package/dist/memory-sync.js +23 -4
- package/dist/model-plane-face.d.ts +13 -7
- package/dist/model-plane-face.js +2 -1
- package/dist/observability/corrupt-read-seat.d.ts +5 -9
- package/dist/observability/corrupt-read-seat.js +1 -2
- package/dist/observability/fail-open.d.ts +30 -10
- package/dist/observability/fail-open.js +27 -10
- package/dist/observability/run-terminal.d.ts +1 -1
- package/dist/observability/run-terminal.js +6 -2
- package/dist/orchestration/workflow-completion-inbox.d.ts +5 -19
- package/dist/orchestration/workflow-completion-inbox.js +0 -12
- package/dist/orchestration/workflow-notify-journal.d.ts +3 -2
- package/dist/orchestration/workflow-park-decision.d.ts +8 -3
- package/dist/orchestration/workflow-park-decision.js +5 -3
- package/dist/org-delivery-gate.d.ts +11 -0
- package/dist/org-delivery-gate.js +19 -1
- package/dist/parked-decide.d.ts +13 -9
- package/dist/parked-decide.js +7 -7
- package/dist/parked-revive-surface.d.ts +6 -7
- package/dist/parked-revive-surface.js +1 -1
- package/dist/peer-inbound-face.d.ts +122 -0
- package/dist/peer-inbound-face.js +123 -0
- package/dist/permission-rule-list.d.ts +13 -9
- package/dist/permission-rule-list.js +7 -3
- package/dist/plugins/approval-ask-store-file.js +18 -6
- package/dist/plugins/approval-ask-store-memory.js +8 -6
- package/dist/plugins/approval-ask-store-sql.d.ts +28 -13
- package/dist/plugins/approval-ask-store-sql.js +30 -11
- package/dist/plugins/caching-session-store.d.ts +0 -3
- package/dist/plugins/caching-session-store.js +0 -3
- package/dist/plugins/checkpoint-store-sql.d.ts +45 -38
- package/dist/plugins/checkpoint-store-sql.js +108 -45
- package/dist/plugins/file-history-store-sql.d.ts +24 -18
- package/dist/plugins/file-history-store-sql.js +24 -19
- package/dist/plugins/file-run-store.d.ts +29 -0
- package/dist/plugins/file-run-store.js +97 -8
- package/dist/plugins/fork-routing-session-store.d.ts +8 -1
- package/dist/plugins/fork-routing-session-store.js +6 -0
- package/dist/plugins/imported-layer-root-retirement.d.ts +82 -0
- package/dist/plugins/imported-layer-root-retirement.js +96 -0
- package/dist/plugins/local-checkpoint-store.d.ts +6 -8
- package/dist/plugins/local-checkpoint-store.js +5 -4
- package/dist/plugins/local-session-store.d.ts +69 -30
- package/dist/plugins/local-session-store.js +133 -57
- package/dist/plugins/local-session-window.d.ts +4 -2
- package/dist/plugins/mailbox-recipient-lifecycle.d.ts +9 -31
- package/dist/plugins/mailbox-recipient-lifecycle.js +4 -0
- package/dist/plugins/mailbox-store-sql.d.ts +12 -8
- package/dist/plugins/mailbox-store-sql.js +76 -7
- package/dist/plugins/memory-sync-store-pg.d.ts +15 -0
- package/dist/plugins/memory-sync-store-pg.js +21 -0
- package/dist/plugins/memory-sync-store-tidb.d.ts +2 -0
- package/dist/plugins/memory-sync-store-tidb.js +13 -1
- package/dist/plugins/one-time-migrations.d.ts +44 -14
- package/dist/plugins/one-time-migrations.js +118 -15
- package/dist/plugins/org-delivery-quota-store.d.ts +1 -1
- package/dist/plugins/org-delivery-quota-store.js +2 -12
- package/dist/plugins/park-commit-watch.d.ts +1 -1
- package/dist/plugins/permission-rule-store-file.d.ts +10 -1
- package/dist/plugins/permission-rule-store-file.js +15 -2
- package/dist/plugins/permission-rule-store-sql.d.ts +31 -1
- package/dist/plugins/permission-rule-store-sql.js +35 -2
- package/dist/plugins/pg-session-storage.d.ts +1 -9
- package/dist/plugins/pg-session-storage.js +2 -19
- package/dist/plugins/remote-env-device.d.ts +8 -11
- package/dist/plugins/remote-env-device.js +6 -3
- package/dist/plugins/remote-env-host.d.ts +8 -4
- package/dist/plugins/remote-env-host.js +7 -9
- package/dist/plugins/remote-env-k8s.d.ts +37 -24
- package/dist/plugins/remote-env-k8s.js +50 -17
- package/dist/plugins/remote-shell.js +12 -2
- package/dist/plugins/retention-store-sql.d.ts +2 -2
- package/dist/plugins/sandbox-read-floor.d.ts +5 -7
- package/dist/plugins/sandbox-read-floor.js +2 -7
- package/dist/plugins/schema-consistency.d.ts +5 -1
- package/dist/plugins/session-fork.d.ts +1 -1
- package/dist/plugins/session-ownership.d.ts +9 -0
- package/dist/plugins/session-ownership.js +6 -0
- package/dist/plugins/session-store.d.ts +13 -16
- package/dist/plugins/session-store.js +9 -10
- package/dist/plugins/sql-errors.d.ts +10 -1
- package/dist/plugins/sql-errors.js +13 -0
- package/dist/plugins/sql-json-column.d.ts +24 -2
- package/dist/plugins/sql-json-column.js +38 -3
- package/dist/plugins/store-backend.d.ts +23 -28
- package/dist/plugins/store-backend.js +12 -3
- package/dist/plugins/store-contracts.d.ts +29 -5
- package/dist/plugins/store-contracts.js +4 -1
- package/dist/plugins/task-attachment-store.d.ts +2 -2
- package/dist/plugins/task-attachment-store.js +37 -52
- package/dist/plugins/tidb-session-store.d.ts +2 -14
- package/dist/plugins/tidb-session-store.js +2 -20
- package/dist/plugins/tool-result-store-sql.d.ts +9 -8
- package/dist/plugins/tool-result-store-sql.js +23 -2
- package/dist/plugins/wiring-section-codec.d.ts +32 -0
- package/dist/plugins/wiring-section-codec.js +55 -0
- package/dist/plugins/workspace-fill.d.ts +1 -1
- package/dist/rule-entry-list.d.ts +3 -2
- package/dist/rule-entry-list.js +5 -1
- package/dist/rules-consent.d.ts +28 -5
- package/dist/rules-consent.js +40 -28
- package/dist/run-local.js +11 -6
- package/dist/runs.d.ts +12 -8
- package/dist/runs.js +10 -7
- package/dist/runtime-governance.d.ts +1 -1
- package/dist/security.d.ts +0 -4
- package/dist/server-secret-env.d.ts +4 -0
- package/dist/session-error-wire.d.ts +34 -23
- package/dist/session-error-wire.js +8 -3
- package/dist/session-incarnation.d.ts +3 -3
- package/dist/session-notify-door.d.ts +106 -0
- package/dist/session-notify-door.js +97 -0
- package/dist/session-sync.d.ts +9 -14
- package/dist/session-sync.js +5 -5
- package/dist/session-workspace.d.ts +3 -13
- package/dist/session-workspace.js +0 -9
- package/dist/standing-answer-grant.d.ts +5 -0
- package/dist/standing-answer-grant.js +10 -0
- package/dist/stores-sql/session-policy-store-sql.d.ts +4 -2
- package/dist/stores-sql/session-policy-store-sql.js +3 -13
- package/dist/task-mcp.d.ts +1 -1
- package/dist/task-settings.d.ts +11 -8
- package/dist/task-settings.js +31 -11
- package/dist/tool-approval.d.ts +55 -35
- package/dist/tool-approval.js +112 -74
- package/dist/trace/core-keyset-guard.d.ts +12 -9
- package/dist/trace/engine-notice-wire.d.ts +1 -1
- package/dist/trace/engine-notice-wire.js +4 -2
- package/dist/trace/exit-seat.d.ts +7 -1
- package/dist/trace/exit-seat.js +1 -0
- package/dist/trace/ledger-sink.d.ts +2 -2
- package/dist/trace/ledger-sink.js +12 -4
- package/dist/trace/model-segment.d.ts +74 -25
- package/dist/trace/model-segment.js +141 -32
- package/dist/trace/project.d.ts +15 -6
- package/dist/trace/project.js +12 -4
- package/dist/trace/redact.d.ts +72 -9
- package/dist/trace/redact.js +1509 -471
- package/dist/trace/self-minted-wire.d.ts +598 -47
- package/dist/trace/self-minted-wire.js +190 -20
- package/dist/trace/wire-projection-faces.d.ts +1 -1
- package/dist/trace/wire-projection-faces.js +1 -1
- package/dist/verifier-pause-card.d.ts +33 -5
- package/dist/verifier-pause-card.js +15 -10
- package/dist/web-admin-client/apply-effective.d.ts +12 -16
- package/dist/web-admin-client/apply-effective.js +90 -10
- package/dist/workspace-space.d.ts +19 -3
- package/dist/workspace-space.js +8 -4
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +3 -1
- package/package.json +3 -2
- package/wire-changes/server@7.143.0.json +1167 -0
- package/wire-changes/server@7.144.0.json +291 -0
- package/dist/session-records-skipped-notice.d.ts +0 -21
- package/dist/session-records-skipped-notice.js +0 -27
package/dist/tool-approval.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readApprovalCard } from "./approval-content-kind.js";
|
|
2
|
-
import { heldAskOf,
|
|
2
|
+
import { heldAskOf, liveHostSource, readDecider, retiredDecisionKeyFacts, POLICY_CANNOT_ALLOW_PERSON_ASK } from "./host-decision.js";
|
|
3
3
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
4
|
import { uuidv7, classifyAsk, foldArbitrationRow, policyCannotAnswer, screenAskClassMembers, MAX_RULE_TEXT_CHARS, READ_ROOT_CANDIDATE_DIR_MAX, parseRuleText, pathConfinableWriteToolNames } from "@sema-agent/core";
|
|
5
5
|
import { precheckCardRuleText } from "./rules-consent.js";
|
|
@@ -12,14 +12,14 @@ import { createLogger } from "./observability/logger.js";
|
|
|
12
12
|
import { errorKindOf } from "./observability/err-text.js";
|
|
13
13
|
import { recordFailOpen } from "./observability/fail-open.js";
|
|
14
14
|
import { ownerOfCheckpointScope } from "./security.js";
|
|
15
|
-
import { deriveAskId, deriveAskScopedBatchId, deriveBatchId, MAX_DECISION_NOTE_CHARS, noteLandedOnRow, noteRecordedReceipt } from "./approval-ask-machine.js";
|
|
16
|
-
import { currentParkArm, MAX_RULE_OFFERS, buildApprovalCard, buildApprovalCardEnvelope, buildApprovalRequestFrame, buildReplayFrame, buildRevokeFrame, readDenialLimitFallback, readProbeCause, readProbeReason, readReadRootCandidate, readStoredCardEnvelope, readRuleEvidence, readAllowRuleShadowed, readRuleOffersAbsence, readRuleOffersAbsenceSeat, readParkRowTrueSeat, readAskClassPair, readClosedWordSeat, buildApprovalCompleteFrame, readRuleOfferList, } from "./approval-card.js";
|
|
15
|
+
import { deriveAskId, deriveAskScopedBatchId, deriveBatchId, MAX_DECISION_NOTE_CHARS, noteLandedOnRow, noteRecordedReceipt, readBoundInputHash } from "./approval-ask-machine.js";
|
|
16
|
+
import { askDemandsAPerson, storedPersonDemandRecord, currentParkArm, MAX_RULE_OFFERS, buildApprovalCard, buildApprovalCardEnvelope, adoptStoredLiveFacts, buildApprovalRequestFrame, buildReplayFrame, buildRevokeFrame, readDenialLimitFallback, readProbeCause, readProbeReason, readReadRootCandidate, readStoredCardEnvelope, readRuleEvidence, readAllowRuleShadowed, readRuleOffersAbsence, readRuleOffersAbsenceSeat, readParkRowTrueSeat, readAskClassPair, readAskReasons, readClosedWordSeat, buildApprovalCompleteFrame, readRuleOfferList, } from "./approval-card.js";
|
|
17
17
|
import { askOwnerAdmits, askRowCarriesOwner, POLICY_REFUSAL_DECISION, projectAskTerminalClaimTruth } from "./plugins/approval-ask-store-sql.js";
|
|
18
18
|
import { APPROVAL_ENDING_CAUSES, SETTLE_OUTCOME, askRowEndingCause, askRowParkTrigger } from "./approval-deny-reasons.js";
|
|
19
19
|
import { settleByPolicy } from "./approval-policy-settlement.js";
|
|
20
20
|
import { governanceAskMarksFor, runWithGovernanceAskScope } from "./governance-ask-marks.js";
|
|
21
21
|
import { governanceOriginOf } from "./runtime-governance.js";
|
|
22
|
-
import { grantBindingOf } from "./standing-answer-grant.js";
|
|
22
|
+
import { agreedGrantBinding, grantBindingOf } from "./standing-answer-grant.js";
|
|
23
23
|
import { operatorAsk } from "./operator-ask.js";
|
|
24
24
|
import { APPROVAL_EXEMPTED_EVENT } from "./plugins/approval-exemption-store.js";
|
|
25
25
|
import { refusalBody } from "./http/refusal-body.js";
|
|
@@ -47,7 +47,7 @@ export function approvalDecidePath(sessionId) {
|
|
|
47
47
|
return `/v1/approvals/${encodeURIComponent(sessionId)}/decide`;
|
|
48
48
|
}
|
|
49
49
|
function parkSessionOf(row) {
|
|
50
|
-
return row.
|
|
50
|
+
return row.sourceSessionId === row.sessionId && row.sessionId !== row.taskId ? row.sessionId : undefined;
|
|
51
51
|
}
|
|
52
52
|
function ruleMaterialCarriesCredentialShape(command) {
|
|
53
53
|
return redactSecretsWithArms(command, { observe: false }).arms.has("full");
|
|
@@ -119,7 +119,7 @@ function askStandingAnswerFacts(req, governanceForced, deploymentListAsks) {
|
|
|
119
119
|
const deploymentListQuestion = carriesDeploymentListQuestion(deploymentListAsks, classes);
|
|
120
120
|
return {
|
|
121
121
|
governanceForced,
|
|
122
|
-
requiresRealApproval: req
|
|
122
|
+
requiresRealApproval: askDemandsAPerson(req, undefined),
|
|
123
123
|
mandated: req.mandated === true,
|
|
124
124
|
grantBinding: grantBindingOf(req),
|
|
125
125
|
classes,
|
|
@@ -136,7 +136,7 @@ export function carriesDeploymentListQuestion(deploymentListAsks, classes) {
|
|
|
136
136
|
export function policyAskStandingAnswerFacts(req, ask, deploymentListQuestion) {
|
|
137
137
|
return {
|
|
138
138
|
governanceForced: false,
|
|
139
|
-
requiresRealApproval: ask
|
|
139
|
+
requiresRealApproval: askDemandsAPerson(ask, undefined),
|
|
140
140
|
mandated: ask.mandated === true,
|
|
141
141
|
grantBinding: grantBindingOf(req),
|
|
142
142
|
classes: [...classifyAsk(ask, noGateFacts({ toolCallId: req.toolCallId, toolName: req.toolName })).classes],
|
|
@@ -190,6 +190,29 @@ function pendingEntryStandingAnswerFacts(entry) {
|
|
|
190
190
|
deploymentListQuestion: entry.deploymentListQuestion === true,
|
|
191
191
|
};
|
|
192
192
|
}
|
|
193
|
+
function projectDecisionFacts(facts, frame, card) {
|
|
194
|
+
const rememberRefused = standingAnswerHome(facts) === "none";
|
|
195
|
+
if (frame !== undefined) {
|
|
196
|
+
if (facts.requiresRealApproval)
|
|
197
|
+
frame.requiresRealApproval = true;
|
|
198
|
+
else
|
|
199
|
+
delete frame.requiresRealApproval;
|
|
200
|
+
if (rememberRefused)
|
|
201
|
+
frame.rememberRefused = true;
|
|
202
|
+
else
|
|
203
|
+
delete frame.rememberRefused;
|
|
204
|
+
}
|
|
205
|
+
if (card === undefined)
|
|
206
|
+
return undefined;
|
|
207
|
+
let out = card;
|
|
208
|
+
if (out.risk.requiresRealApproval !== facts.requiresRealApproval)
|
|
209
|
+
out = { ...out, risk: { ...out.risk, requiresRealApproval: facts.requiresRealApproval } };
|
|
210
|
+
if ((out.rememberRefused === true) !== rememberRefused) {
|
|
211
|
+
const { rememberRefused: _stale, ...rest } = out;
|
|
212
|
+
out = rememberRefused ? { ...rest, rememberRefused: true } : rest;
|
|
213
|
+
}
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
193
216
|
function mandatedFromSeat(seat) {
|
|
194
217
|
switch (seat.state) {
|
|
195
218
|
case "word":
|
|
@@ -223,10 +246,11 @@ function livePendingRowOf(e) {
|
|
|
223
246
|
...(e.sessionId !== undefined ? { sessionId: e.sessionId } : {}),
|
|
224
247
|
...(e.requiresRealApproval ? { requiresRealApproval: true } : {}),
|
|
225
248
|
...(e.governanceForced ? { governanceForced: true } : {}),
|
|
226
|
-
...(
|
|
249
|
+
...(listFrame.mandated === true ? { mandated: true } : {}),
|
|
227
250
|
...(standingAnswerHome(pendingEntryStandingAnswerFacts(e)) === "none" ? { rememberRefused: true } : {}),
|
|
228
|
-
...(
|
|
229
|
-
...(
|
|
251
|
+
...(listFrame.mandate !== undefined ? { mandate: listFrame.mandate } : {}),
|
|
252
|
+
...(listFrame.origin !== undefined ? { origin: listFrame.origin } : {}),
|
|
253
|
+
...(listFrame.type === "approval_request" && listFrame.liveFactsUnknown === true ? { liveFactsUnknown: true } : {}),
|
|
230
254
|
...(e.originTaskId !== undefined ? { fromSubagent: true, originTaskId: e.originTaskId } : {}),
|
|
231
255
|
...(approvalCard !== undefined ? { approvalCard } : {}),
|
|
232
256
|
frame: listFrame,
|
|
@@ -294,17 +318,17 @@ function parseToolApprovalFields(body, retired) {
|
|
|
294
318
|
}
|
|
295
319
|
if (retired !== undefined)
|
|
296
320
|
return { ok: false, error: retired.error };
|
|
297
|
-
const
|
|
298
|
-
let
|
|
299
|
-
switch (
|
|
321
|
+
const deciderReading = readDecider(body, false);
|
|
322
|
+
let decider;
|
|
323
|
+
switch (deciderReading.kind) {
|
|
300
324
|
case "outside_closed_set":
|
|
301
|
-
return { ok: false, error:
|
|
325
|
+
return { ok: false, error: deciderReading.message };
|
|
302
326
|
case "accepted":
|
|
303
|
-
|
|
327
|
+
decider = deciderReading.decider;
|
|
304
328
|
break;
|
|
305
329
|
default: {
|
|
306
|
-
const unreachable =
|
|
307
|
-
throw new Error(`unhandled
|
|
330
|
+
const unreachable = deciderReading;
|
|
331
|
+
throw new Error(`unhandled decider reading: ${JSON.stringify(unreachable)}`);
|
|
308
332
|
}
|
|
309
333
|
}
|
|
310
334
|
const rawGrant = body.readRootGrant;
|
|
@@ -319,7 +343,7 @@ function parseToolApprovalFields(body, retired) {
|
|
|
319
343
|
...(d !== "deny" && u !== undefined ? { updatedInput: u } : {}),
|
|
320
344
|
...(persistRule !== undefined ? { persistRule } : {}),
|
|
321
345
|
...(note !== undefined ? { note } : {}),
|
|
322
|
-
|
|
346
|
+
decider,
|
|
323
347
|
...(readRootGrant !== undefined ? { readRootGrant } : {}),
|
|
324
348
|
};
|
|
325
349
|
}
|
|
@@ -357,12 +381,6 @@ function boundArgs(args) {
|
|
|
357
381
|
}
|
|
358
382
|
return { args: redacted, omitted: false, hasBidi };
|
|
359
383
|
}
|
|
360
|
-
function readBoundInputHash(req) {
|
|
361
|
-
if (req === null || typeof req !== "object")
|
|
362
|
-
return null;
|
|
363
|
-
const v = Reflect.get(req, "boundInputHash");
|
|
364
|
-
return typeof v === "string" && v.length > 0 ? v : null;
|
|
365
|
-
}
|
|
366
384
|
export function resolveStreamApprovalGate(input) {
|
|
367
385
|
if (!input.toolApprovalEnabled)
|
|
368
386
|
return { active: false, reason: "no_tool_approval" };
|
|
@@ -492,7 +510,7 @@ function replayTerminalAskRow(row) {
|
|
|
492
510
|
}
|
|
493
511
|
export function outcomeOfDecidedRow(row) {
|
|
494
512
|
const allow = row.decision === "approve";
|
|
495
|
-
const source = row.settledBy !== null ? { settledBy: row.settledBy } : {};
|
|
513
|
+
const source = row.settledBy !== null ? { settledBy: row.settledBy, ...(row.decidedVia !== null ? { decidedVia: row.decidedVia } : {}) } : {};
|
|
496
514
|
const edit = allow && row.updatedInput !== undefined ? { updatedInput: row.updatedInput } : {};
|
|
497
515
|
return row.settledBy === null && !("updatedInput" in edit) ? allow : { allow, ...edit, ...source };
|
|
498
516
|
}
|
|
@@ -502,7 +520,7 @@ function settleArgsOfDecided(outcome) {
|
|
|
502
520
|
return {
|
|
503
521
|
allowed: outcome.allow,
|
|
504
522
|
...(outcome.updatedInput !== undefined ? { updatedInput: outcome.updatedInput } : {}),
|
|
505
|
-
...(outcome.settledBy !== undefined ? { settledBy: outcome.settledBy } : {}),
|
|
523
|
+
...(outcome.settledBy !== undefined ? { source: { settledBy: outcome.settledBy, ...(outcome.decidedVia !== undefined ? { decidedVia: outcome.decidedVia } : {}) } } : {}),
|
|
506
524
|
};
|
|
507
525
|
}
|
|
508
526
|
function verdictOfDecided(args) {
|
|
@@ -510,7 +528,7 @@ function verdictOfDecided(args) {
|
|
|
510
528
|
by: "human",
|
|
511
529
|
allowed: args.allowed,
|
|
512
530
|
...(args.updatedInput !== undefined ? { updatedInput: args.updatedInput } : {}),
|
|
513
|
-
...(args.
|
|
531
|
+
...(args.source !== undefined ? { hostSource: args.source } : {}),
|
|
514
532
|
};
|
|
515
533
|
}
|
|
516
534
|
function settleArgsOf(outcome) {
|
|
@@ -633,8 +651,8 @@ export class ToolApprovalCoordinator {
|
|
|
633
651
|
get unattendedRoutesToPark() {
|
|
634
652
|
return this.unattendedPolicy !== "deny";
|
|
635
653
|
}
|
|
636
|
-
batchIdFor(askId,
|
|
637
|
-
return this.unattendedRoutesToPark ? deriveBatchId(
|
|
654
|
+
batchIdFor(askId, sourceSessionId, runId, legKey) {
|
|
655
|
+
return this.unattendedRoutesToPark ? deriveBatchId(sourceSessionId, runId, legKey) : deriveAskScopedBatchId(askId);
|
|
638
656
|
}
|
|
639
657
|
unattendedAskOutcome(site) {
|
|
640
658
|
const facts = {
|
|
@@ -1024,7 +1042,7 @@ export class ToolApprovalCoordinator {
|
|
|
1024
1042
|
async sessionGrantUncontestedByRow(origin, req) {
|
|
1025
1043
|
if (!this.askStore)
|
|
1026
1044
|
return true;
|
|
1027
|
-
const call = { taskId: origin.taskId, legKey: origin.legKey, toolCallId: req.toolCallId,
|
|
1045
|
+
const call = { taskId: origin.taskId, legKey: origin.legKey, toolCallId: req.toolCallId, sourceSessionId: req.sourceSessionId ?? origin.taskId };
|
|
1028
1046
|
try {
|
|
1029
1047
|
const rows = await this.withStoreDeadline(this.askStore.listByCall(call), "listByCall(session-grant-provenance)", DURABLE_CONVERGE_READ_TIMEOUT_MS);
|
|
1030
1048
|
return rows.length === 0;
|
|
@@ -1330,6 +1348,7 @@ export class ToolApprovalCoordinator {
|
|
|
1330
1348
|
const cardWord = readApprovalCard(req.approvalCard);
|
|
1331
1349
|
const originWord = typeof req.origin === "string" && req.origin.length > 0 ? req.origin : undefined;
|
|
1332
1350
|
const askClassPair = readAskClassPair(req);
|
|
1351
|
+
const askReasonsOfReq = readAskReasons(req);
|
|
1333
1352
|
const requester = extensionRequesterOf(req.requestedBy, "tool_approval");
|
|
1334
1353
|
const frame = {
|
|
1335
1354
|
type: "tool_approval",
|
|
@@ -1338,7 +1357,7 @@ export class ToolApprovalCoordinator {
|
|
|
1338
1357
|
...(typeof req.toolCallId === "string" && req.toolCallId !== "" ? { toolCallId: req.toolCallId } : {}),
|
|
1339
1358
|
...(child
|
|
1340
1359
|
? {
|
|
1341
|
-
|
|
1360
|
+
sourceSessionId: req.sourceSessionId,
|
|
1342
1361
|
fromSubagent: true,
|
|
1343
1362
|
...(typeof req.sourceAgentName === "string" ? { sourceAgentName: redactSecrets(req.sourceAgentName) } : {}),
|
|
1344
1363
|
...(req.delegation
|
|
@@ -1352,9 +1371,10 @@ export class ToolApprovalCoordinator {
|
|
|
1352
1371
|
: {}),
|
|
1353
1372
|
}
|
|
1354
1373
|
: {}),
|
|
1374
|
+
...(typeof req.agentId === "string" && req.agentId !== "" ? { agentId: req.agentId } : {}),
|
|
1355
1375
|
message: typeof req.message === "string" ? redactDeep(req.message) : "",
|
|
1376
|
+
...(askReasonsOfReq !== undefined ? { askReasons: askReasonsOfReq } : {}),
|
|
1356
1377
|
...(governanceForced ? { governanceForced: true } : {}),
|
|
1357
|
-
...(req.requiresRealApproval === true ? { requiresRealApproval: true } : {}),
|
|
1358
1378
|
...(req.mandated === true ? { mandated: true } : {}),
|
|
1359
1379
|
...(standingAnswerHome(askStandingAnswerFacts(req, governanceForced, deploymentListAsks)) === "none" ? { rememberRefused: true } : {}),
|
|
1360
1380
|
...(typeof req.boundGrantDigest === "string" ? { boundGrantDigest: req.boundGrantDigest, ...(req.boundGrants !== undefined ? { boundGrants: req.boundGrants } : {}) } : {}),
|
|
@@ -1381,9 +1401,11 @@ export class ToolApprovalCoordinator {
|
|
|
1381
1401
|
const expiresAtMs = Math.ceil(Date.now() + effectiveWindowMs);
|
|
1382
1402
|
let askId;
|
|
1383
1403
|
let batchId;
|
|
1384
|
-
const card = this.askStore ? buildApprovalCard(frame, req, req
|
|
1404
|
+
const card = this.askStore ? buildApprovalCard(frame, req, askDemandsAPerson(req, undefined)) : undefined;
|
|
1385
1405
|
let cardForFrame = card;
|
|
1386
1406
|
let persistedExpiresAtMs = expiresAtMs;
|
|
1407
|
+
let factsOfRecord;
|
|
1408
|
+
let recordCard;
|
|
1387
1409
|
let entryExecutionLane = origin.executionLane;
|
|
1388
1410
|
let lateEnsuredRow;
|
|
1389
1411
|
let lateTerminalRow;
|
|
@@ -1412,16 +1434,16 @@ export class ToolApprovalCoordinator {
|
|
|
1412
1434
|
: replayed;
|
|
1413
1435
|
};
|
|
1414
1436
|
if (this.askStore && card) {
|
|
1415
|
-
const
|
|
1437
|
+
const sourceSessionId = req.sourceSessionId ?? origin.taskId;
|
|
1416
1438
|
const runId = origin.taskId;
|
|
1417
1439
|
const legKey = origin.legKey;
|
|
1418
|
-
askId = deriveAskId(
|
|
1419
|
-
batchId = this.batchIdFor(askId,
|
|
1440
|
+
askId = deriveAskId(sourceSessionId, runId, legKey, req);
|
|
1441
|
+
batchId = this.batchIdFor(askId, sourceSessionId, runId, legKey);
|
|
1420
1442
|
try {
|
|
1421
1443
|
const existingOrCreated = await this.withStoreDeadline(this.askStore.ensureAsk({
|
|
1422
1444
|
askId,
|
|
1423
1445
|
taskId: origin.taskId,
|
|
1424
|
-
|
|
1446
|
+
sourceSessionId,
|
|
1425
1447
|
sessionId: origin.sessionId ?? origin.taskId,
|
|
1426
1448
|
owner: origin.owner,
|
|
1427
1449
|
executionLane: origin.executionLane,
|
|
@@ -1429,7 +1451,7 @@ export class ToolApprovalCoordinator {
|
|
|
1429
1451
|
toolCallId: req.toolCallId,
|
|
1430
1452
|
legKey,
|
|
1431
1453
|
parentToolCallId: req.delegation?.parentToolCallId ?? null,
|
|
1432
|
-
cardJson: buildApprovalCardEnvelope(askId, card),
|
|
1454
|
+
cardJson: buildApprovalCardEnvelope(askId, card, frame),
|
|
1433
1455
|
boundInputHash: readBoundInputHash(req),
|
|
1434
1456
|
...durableRuleMaterial(ruleLaneMaterial),
|
|
1435
1457
|
schemaVersion: 1,
|
|
@@ -1463,6 +1485,10 @@ export class ToolApprovalCoordinator {
|
|
|
1463
1485
|
persistedExpiresAtMs = existingOrCreated.row.expiresAtMs;
|
|
1464
1486
|
entryExecutionLane = existingOrCreated.row.executionLane;
|
|
1465
1487
|
cardForFrame = persistedEnvelope.card;
|
|
1488
|
+
recordCard = persistedEnvelope.card;
|
|
1489
|
+
factsOfRecord = existingOrCreated.inserted ? undefined : persistedEnvelope.liveFacts;
|
|
1490
|
+
if (factsOfRecord !== undefined)
|
|
1491
|
+
adoptStoredLiveFacts(frame, factsOfRecord);
|
|
1466
1492
|
if (cardForFrame.governanceForced === true)
|
|
1467
1493
|
frame.governanceForced = true;
|
|
1468
1494
|
else
|
|
@@ -1508,6 +1534,8 @@ export class ToolApprovalCoordinator {
|
|
|
1508
1534
|
confirmedRowExists = confirmedRow !== null;
|
|
1509
1535
|
if (confirmedRow !== null)
|
|
1510
1536
|
batchId = confirmedRow.batchId;
|
|
1537
|
+
if (confirmedRow !== null)
|
|
1538
|
+
recordCard = storedPersonDemandRecord(confirmedRow.cardJson);
|
|
1511
1539
|
indeterminate = false;
|
|
1512
1540
|
break;
|
|
1513
1541
|
}
|
|
@@ -1560,7 +1588,7 @@ export class ToolApprovalCoordinator {
|
|
|
1560
1588
|
if (hostSettled !== undefined || (denyReasonSettled !== undefined && denyReasonSettled !== "")) {
|
|
1561
1589
|
return {
|
|
1562
1590
|
allow: false,
|
|
1563
|
-
...
|
|
1591
|
+
...hostSettled,
|
|
1564
1592
|
...(denyReasonSettled !== undefined && denyReasonSettled !== "" ? { reason: denyReasonSettled } : {}),
|
|
1565
1593
|
};
|
|
1566
1594
|
}
|
|
@@ -1577,7 +1605,7 @@ export class ToolApprovalCoordinator {
|
|
|
1577
1605
|
return {
|
|
1578
1606
|
allow: true,
|
|
1579
1607
|
...(settled.updatedInput !== undefined ? { updatedInput: settled.updatedInput } : {}),
|
|
1580
|
-
...
|
|
1608
|
+
...hostSettled,
|
|
1581
1609
|
...(settled.readRootGrant !== undefined ? { readRootGrant: settled.readRootGrant } : {}),
|
|
1582
1610
|
};
|
|
1583
1611
|
}
|
|
@@ -1589,10 +1617,10 @@ export class ToolApprovalCoordinator {
|
|
|
1589
1617
|
done = true;
|
|
1590
1618
|
const allowed = verdict.by === "human" && verdict.allowed;
|
|
1591
1619
|
const outcome = verdict.by === "system" ? SETTLE_OUTCOME.EXPIRED : verdict.allowed ? SETTLE_OUTCOME.ALLOWED : SETTLE_OUTCOME.DENIED;
|
|
1592
|
-
const
|
|
1620
|
+
const hostSource = verdict.hostSource;
|
|
1593
1621
|
const updatedInput = verdict.by === "human" ? verdict.updatedInput : undefined;
|
|
1594
1622
|
const readRootGrant = verdict.by === "human" ? verdict.readRootGrant : undefined;
|
|
1595
|
-
hostSettled =
|
|
1623
|
+
hostSettled = hostSource;
|
|
1596
1624
|
denyReasonSettled = verdict.by === "human" && !verdict.allowed ? verdict.denyReason : undefined;
|
|
1597
1625
|
if (timer)
|
|
1598
1626
|
clearTimeout(timer);
|
|
@@ -1626,7 +1654,7 @@ export class ToolApprovalCoordinator {
|
|
|
1626
1654
|
const common = {
|
|
1627
1655
|
approvalId: wireApprovalId,
|
|
1628
1656
|
...(windowRouteUnavailable ? { parkRouted: true } : {}),
|
|
1629
|
-
...(
|
|
1657
|
+
...(hostSource !== undefined ? { settledBy: hostSource.settledBy } : {}),
|
|
1630
1658
|
settledAtMs: Date.now(),
|
|
1631
1659
|
};
|
|
1632
1660
|
return verdict.by === "system"
|
|
@@ -1638,7 +1666,7 @@ export class ToolApprovalCoordinator {
|
|
|
1638
1666
|
approvalId: wireApprovalId,
|
|
1639
1667
|
taskId: origin.taskId,
|
|
1640
1668
|
carrierLeg,
|
|
1641
|
-
executingSessionId: req.
|
|
1669
|
+
executingSessionId: req.sourceSessionId,
|
|
1642
1670
|
toolCallId: req.toolCallId,
|
|
1643
1671
|
settleRecord,
|
|
1644
1672
|
});
|
|
@@ -1792,7 +1820,7 @@ export class ToolApprovalCoordinator {
|
|
|
1792
1820
|
if (done)
|
|
1793
1821
|
return;
|
|
1794
1822
|
windowRouteUnavailable = true;
|
|
1795
|
-
settle({ by: "system", cause, ...(hostSettledBy !== undefined ? { hostSettledBy } : {}) });
|
|
1823
|
+
settle({ by: "system", cause, ...(hostSettledBy !== undefined ? { hostSource: { settledBy: hostSettledBy } } : {}) });
|
|
1796
1824
|
};
|
|
1797
1825
|
const windowExpired = (hostSelfReport, cause) => {
|
|
1798
1826
|
void (async () => {
|
|
@@ -1901,23 +1929,18 @@ export class ToolApprovalCoordinator {
|
|
|
1901
1929
|
}
|
|
1902
1930
|
const entryClasses = askClassPair?.classes;
|
|
1903
1931
|
const entryDeploymentListQuestion = carriesDeploymentListQuestion(deploymentListAsks, entryClasses);
|
|
1904
|
-
const
|
|
1905
|
-
const
|
|
1932
|
+
const legGrantBinding = grantBindingOf(req);
|
|
1933
|
+
const entryGrantBinding = factsOfRecord === undefined ? legGrantBinding : agreedGrantBinding(legGrantBinding, grantBindingOf(factsOfRecord));
|
|
1934
|
+
const entryMandated = req.mandated === true || factsOfRecord?.mandated === true;
|
|
1935
|
+
const entryDemandsAPerson = askDemandsAPerson(req, recordCard) || [...(askId !== undefined ? (this.pendingByAskId.get(askId) ?? []) : [])].some((s) => s.requiresRealApproval === true);
|
|
1936
|
+
cardForFrame = projectDecisionFacts(pendingEntryStandingAnswerFacts({
|
|
1906
1937
|
...(effectiveGovernanceForced ? { governanceForced: true } : {}),
|
|
1907
|
-
...(
|
|
1908
|
-
...(
|
|
1938
|
+
...(entryDemandsAPerson ? { requiresRealApproval: true } : {}),
|
|
1939
|
+
...(entryMandated ? { mandated: true } : {}),
|
|
1909
1940
|
grantBinding: entryGrantBinding,
|
|
1910
1941
|
classes: entryClasses,
|
|
1911
1942
|
...(entryDeploymentListQuestion ? { deploymentListQuestion: true } : {}),
|
|
1912
|
-
})
|
|
1913
|
-
if (rememberRefused)
|
|
1914
|
-
frame.rememberRefused = true;
|
|
1915
|
-
else
|
|
1916
|
-
delete frame.rememberRefused;
|
|
1917
|
-
if (cardForFrame !== undefined && (cardForFrame.rememberRefused === true) !== rememberRefused) {
|
|
1918
|
-
const { rememberRefused: _stale, ...cardRest } = cardForFrame;
|
|
1919
|
-
cardForFrame = rememberRefused ? { ...cardRest, rememberRefused: true } : cardRest;
|
|
1920
|
-
}
|
|
1943
|
+
}), frame, cardForFrame);
|
|
1921
1944
|
const cardFrame = askId !== undefined && cardForFrame !== undefined
|
|
1922
1945
|
? buildApprovalRequestFrame({ askId, taskId: origin.taskId, approvalId: wireApprovalId, card: cardForFrame, expiresAtMs: persistedExpiresAtMs, nowMs: Date.now(), live: frame })
|
|
1923
1946
|
: undefined;
|
|
@@ -1928,7 +1951,7 @@ export class ToolApprovalCoordinator {
|
|
|
1928
1951
|
owner: origin.owner,
|
|
1929
1952
|
...(primary ? { ctxTaskId: primary.taskId, originCtx: primary } : {}),
|
|
1930
1953
|
...(reachability === "unreached" ? { suspended: true } : {}),
|
|
1931
|
-
...(child ? { originTaskId: req.
|
|
1954
|
+
...(child ? { originTaskId: req.sourceSessionId } : primary ? { targetCtxs: new Set(aliveCtxs), onTargetGone } : {}),
|
|
1932
1955
|
...(origin.sessionId ? { sessionId: origin.sessionId } : {}),
|
|
1933
1956
|
frame,
|
|
1934
1957
|
...(cardFrame !== undefined ? { cardFrame } : {}),
|
|
@@ -1943,10 +1966,8 @@ export class ToolApprovalCoordinator {
|
|
|
1943
1966
|
executionLane: entryExecutionLane,
|
|
1944
1967
|
...(ruleLaneMaterial !== undefined ? { ruleLane: ruleLaneMaterial } : {}),
|
|
1945
1968
|
...(effectiveGovernanceForced ? { governanceForced: true } : {}),
|
|
1946
|
-
...(
|
|
1947
|
-
...(
|
|
1948
|
-
...(mandateWord !== undefined ? { mandate: mandateWord } : {}),
|
|
1949
|
-
...(originWord !== undefined ? { origin: originWord } : {}),
|
|
1969
|
+
...(entryDemandsAPerson ? { requiresRealApproval: true } : {}),
|
|
1970
|
+
...(entryMandated ? { mandated: true } : {}),
|
|
1950
1971
|
...(askId !== undefined && batchId !== undefined ? { askId, batchId } : {}),
|
|
1951
1972
|
};
|
|
1952
1973
|
selfEntry = pendingEntry;
|
|
@@ -1959,11 +1980,21 @@ export class ToolApprovalCoordinator {
|
|
|
1959
1980
|
this.pendingByAskId.set(askId, siblings);
|
|
1960
1981
|
}
|
|
1961
1982
|
siblings.add(pendingEntry);
|
|
1983
|
+
if (entryDemandsAPerson) {
|
|
1984
|
+
for (const s of siblings) {
|
|
1985
|
+
if (s.requiresRealApproval === true)
|
|
1986
|
+
continue;
|
|
1987
|
+
s.requiresRealApproval = true;
|
|
1988
|
+
const card = projectDecisionFacts(pendingEntryStandingAnswerFacts(s), s.frame, s.cardFrame?.card);
|
|
1989
|
+
if (s.cardFrame !== undefined && card !== undefined && card !== s.cardFrame.card)
|
|
1990
|
+
s.cardFrame = { ...s.cardFrame, card };
|
|
1991
|
+
}
|
|
1992
|
+
}
|
|
1962
1993
|
}
|
|
1963
1994
|
this.askAudit?.recordAsk({
|
|
1964
1995
|
approvalId: wireApprovalId,
|
|
1965
1996
|
taskId: origin.taskId,
|
|
1966
|
-
...(req.
|
|
1997
|
+
...(req.sourceSessionId !== undefined ? { sourceSessionId: req.sourceSessionId } : {}),
|
|
1967
1998
|
...(origin.sessionId !== undefined ? { sessionId: origin.sessionId } : {}),
|
|
1968
1999
|
owner: origin.owner,
|
|
1969
2000
|
toolName: req.toolName,
|
|
@@ -2123,7 +2154,7 @@ export class ToolApprovalCoordinator {
|
|
|
2123
2154
|
const preRule = this.precheckEditedRuleBeforeDecision(entry, judgedOwner, parsed);
|
|
2124
2155
|
if (preRule !== undefined)
|
|
2125
2156
|
return preRule;
|
|
2126
|
-
if (parsed.value !== "deny" && policyCannotAnswer(heldAskOf(entry.requiresRealApproval === true), parsed.decidedBy)) {
|
|
2157
|
+
if (parsed.value !== "deny" && policyCannotAnswer(heldAskOf(entry.requiresRealApproval === true), parsed.decider.decidedBy)) {
|
|
2127
2158
|
return { status: 400, body: refusalBody({ errorCode: "request.body_shape", message: POLICY_CANNOT_ALLOW_PERSON_ASK }) };
|
|
2128
2159
|
}
|
|
2129
2160
|
const ruleEligibility = { eligible: true };
|
|
@@ -2486,7 +2517,7 @@ export class ToolApprovalCoordinator {
|
|
|
2486
2517
|
gateBoundInputHash: row.gateBoundInputHash,
|
|
2487
2518
|
decision,
|
|
2488
2519
|
...(parsed.note !== undefined ? { note: parsed.note } : {}),
|
|
2489
|
-
|
|
2520
|
+
decider: parsed.decider,
|
|
2490
2521
|
...(parsed.updatedInput !== undefined && parsed.value !== "deny" ? { updatedInput: parsed.updatedInput } : {}),
|
|
2491
2522
|
...(principal !== undefined ? { principal } : {}),
|
|
2492
2523
|
...(httpReq !== undefined ? { httpReq } : {}),
|
|
@@ -2729,7 +2760,7 @@ export class ToolApprovalCoordinator {
|
|
|
2729
2760
|
decision: parsed.value === "deny" ? "deny" : "approve",
|
|
2730
2761
|
...(parsed.note !== undefined ? { decisionNote: parsed.note } : {}),
|
|
2731
2762
|
...(parsed.value !== "deny" && parsed.updatedInput !== undefined ? { updatedInput: parsed.updatedInput } : {}),
|
|
2732
|
-
...(
|
|
2763
|
+
...liveHostSource(parsed.decider),
|
|
2733
2764
|
}), "decideAsk", DURABLE_CALL_TIMEOUT_MS, (late) => {
|
|
2734
2765
|
if (late.ok)
|
|
2735
2766
|
this.notifyExternalDecision(askId, outcomeOfDecidedRow(late.row));
|
|
@@ -2809,13 +2840,13 @@ export class ToolApprovalCoordinator {
|
|
|
2809
2840
|
this.allowAllSessions.add(sessionAllowKey(judgedOwner, entry.sessionId, sessionAllowCategory(entry.toolName), entry.grantBinding));
|
|
2810
2841
|
}
|
|
2811
2842
|
const allowed = parsed.value !== "deny";
|
|
2812
|
-
const settleArgs = opts?.settleOutcome !== undefined ? settleArgsOfDecided(opts.settleOutcome) : { allowed, updatedInput: parsed.updatedInput,
|
|
2843
|
+
const settleArgs = opts?.settleOutcome !== undefined ? settleArgsOfDecided(opts.settleOutcome) : { allowed, updatedInput: parsed.updatedInput, source: liveHostSource(parsed.decider) };
|
|
2813
2844
|
const readRootGrant = opts?.settleOutcome === undefined || opts.settleOutcomeIsThisRequest === true ? parsed.readRootGrant : undefined;
|
|
2814
2845
|
entry.settle({
|
|
2815
2846
|
by: "human",
|
|
2816
2847
|
allowed: settleArgs.allowed,
|
|
2817
2848
|
updatedInput: settleArgs.updatedInput,
|
|
2818
|
-
...(settleArgs.
|
|
2849
|
+
...(settleArgs.source !== undefined ? { hostSource: settleArgs.source } : {}),
|
|
2819
2850
|
...(!settleArgs.allowed && parsed.note !== undefined ? { denyReason: parsed.note } : {}),
|
|
2820
2851
|
...(readRootGrant !== undefined ? { readRootGrant } : {}),
|
|
2821
2852
|
});
|
|
@@ -2870,7 +2901,8 @@ export class ToolApprovalCoordinator {
|
|
|
2870
2901
|
const registrationId = uuidv7();
|
|
2871
2902
|
const facts = {
|
|
2872
2903
|
...(card.governanceForced === true ? { governanceForced: true } : {}),
|
|
2873
|
-
...(card
|
|
2904
|
+
...(askDemandsAPerson(undefined, card) ? { requiresRealApproval: true } : {}),
|
|
2905
|
+
...(replayFrame.mandated === true ? { mandated: true } : {}),
|
|
2874
2906
|
grantBinding: { kind: "unreadable" },
|
|
2875
2907
|
...(card.classes !== undefined ? { classes: card.classes } : {}),
|
|
2876
2908
|
};
|
|
@@ -2905,7 +2937,7 @@ export class ToolApprovalCoordinator {
|
|
|
2905
2937
|
owner: row.owner,
|
|
2906
2938
|
executionLane: row.executionLane,
|
|
2907
2939
|
...(row.sessionId !== row.taskId ? { sessionId: row.sessionId } : {}),
|
|
2908
|
-
...(card.fromSubagent === true ? { originTaskId: row.
|
|
2940
|
+
...(card.fromSubagent === true ? { originTaskId: row.sourceSessionId } : {}),
|
|
2909
2941
|
toolName: card.toolName,
|
|
2910
2942
|
...facts,
|
|
2911
2943
|
approvalId: row.askId,
|
|
@@ -2962,10 +2994,16 @@ export class ToolApprovalCoordinator {
|
|
|
2962
2994
|
}
|
|
2963
2995
|
return rows;
|
|
2964
2996
|
}
|
|
2965
|
-
|
|
2966
|
-
|
|
2967
|
-
|
|
2997
|
+
hasLivePendingFromLeg(names) {
|
|
2998
|
+
if (names.length === 0)
|
|
2999
|
+
return false;
|
|
3000
|
+
for (const e of this.pending.values()) {
|
|
3001
|
+
if (e.adopted === true)
|
|
3002
|
+
continue;
|
|
3003
|
+
const { agentId, sourceSessionId } = e.frame;
|
|
3004
|
+
if ((agentId !== undefined && names.includes(agentId)) || (sourceSessionId !== undefined && names.includes(sourceSessionId)))
|
|
2968
3005
|
return true;
|
|
3006
|
+
}
|
|
2969
3007
|
return false;
|
|
2970
3008
|
}
|
|
2971
3009
|
async pollSuspendedDecisions() {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
* ⑨⑩([ref],2026-08-31)把两个最大的 wire 面也纳入:TaskSpec 按「server 有无写点」记 Wired/Unwired,
|
|
18
18
|
* TaskResult 按「转发/摘除」记 Forwarded/Stripped —— 谁改 resolve-spec.ts / runs.ts 的发射点谁同步本文件。
|
|
19
19
|
*/
|
|
20
|
-
import type { TaskNotificationPayload, SemaProvenance, BackgroundChildEvent, RosterEntry, AskRequest, CheckpointSummary, PendingAction, TaskEvent, TraceEvent, MailboxMessage, MailboxAppendMessage, TaskSpec, TaskResult, SideQueryResult, WiringManifest, PermissionModeReceipt, GateOutcome, GateDisposition, Settlement, PausedCause, TerminalCause, CheckpointGate, CheckpointToken, VerificationResult, CascadeRunResult, WorkflowRun, ReadRootGrantCandidate, McpReconnectResult, McpServerStatus, NodeLspManagerOptions, RunnerDeps, SessionMemoryStatus, PromptManifestIdentity, PromptIdentityLayers, PromptManifestSelectors, PromptManifestSection, PromptChainLink, SupersededOverlay, ToolDisclosureManifest } from "@sema-agent/core";
|
|
20
|
+
import type { TaskNotificationPayload, SemaProvenance, BackgroundChildEvent, RosterEntry, AskRequest, CheckpointSummary, PendingAction, TaskEvent, TraceEvent, MailboxMessage, MailboxAppendMessage, TaskSpec, TaskResult, SideQueryResult, WiringManifest, PermissionModeReceipt, GateOutcome, GateDisposition, Settlement, PausedCause, TerminalCause, CheckpointGate, CheckpointToken, VerificationResult, CascadeRunResult, WorkflowRun, ReadRootGrantCandidate, McpReconnectResult, McpServerStatus, NodeLspManagerOptions, RunnerDeps, SessionMemoryStatus, DeploymentSessionMemoryStatus, PromptManifestIdentity, PromptIdentityLayers, PromptManifestSelectors, PromptManifestSection, PromptChainLink, SupersededOverlay, ToolDisclosureManifest } from "@sema-agent/core";
|
|
21
21
|
import type { ToolApprovalFrame } from "../tool-approval.js";
|
|
22
22
|
import type { TableCoreKeys } from "./projection-table.js";
|
|
23
23
|
import type { PauseSeat } from "../terminal.js";
|
|
@@ -45,7 +45,7 @@ type _GuardBgNotifReverse = AssertAllKeysHandled<Exclude<BgNotifProjected | BgNo
|
|
|
45
45
|
type RosterProjected = "name" | "agentId" | "sessionId" | "toolUseId" | "owner" | "scope" | "sessionScoped" | "rootSessionId" | "model" | "modelFallback" | "createdAt";
|
|
46
46
|
type _GuardRoster = AssertAllKeysHandled<Exclude<keyof RosterEntry, RosterProjected>>;
|
|
47
47
|
type _GuardRosterReverse = AssertAllKeysHandled<Exclude<RosterProjected, keyof RosterEntry>>;
|
|
48
|
-
type AskProjected = "toolName" | "toolCallId" | "args" | "message" | "
|
|
48
|
+
type AskProjected = "toolName" | "toolCallId" | "args" | "message" | "sourceSessionId" | "agentId" | "askReasons" | "fromSubagent" | "sourceAgentName" | "delegation" | "ruleOffers" | "ruleOffersAbsence" | "allowRuleShadowed" | "probeCause" | "probeReason" | "ruleEvidence" | "requiresRealApproval" | "denialLimitFallback" | "origin" | "readRootCandidate" | "mandated" | "mandate" | "askClass" | "classes" | "boundGrantDigest" | "boundGrants" | "classifierNoRuling" | "approvalCard" | "boundGrantAbsence" | "requestedBy";
|
|
49
49
|
type AskExcluded = "preview" | "principal" | "riskAxes" | "boundInputHash" | "isDelegatedChild" | "hasBidiControls" | "previewWithheld" | "execCwd" | "authoredBy" | "editRewritten";
|
|
50
50
|
type _GuardAsk = AssertAllKeysHandled<Exclude<keyof AskRequest, AskProjected | AskExcluded>>;
|
|
51
51
|
type _GuardAskReverse = AssertAllKeysHandled<Exclude<AskProjected | AskExcluded, keyof AskRequest>>;
|
|
@@ -217,8 +217,8 @@ type _GuardPromptManifestKeysReverse = AssertAllKeysHandled<{
|
|
|
217
217
|
type _GuardPromptManifestKeysNonEmpty = AssertAllKeysHandled<{
|
|
218
218
|
[L in keyof ManifestCore]: [ManifestDeclared<ManifestFaces, L>] extends [never] ? L : never;
|
|
219
219
|
}[keyof ManifestCore]>;
|
|
220
|
-
type SummaryProjected = "sessionId" | "scope" | "createdAt" | "gateKind" | "severity" | "spentMicroUsd" | "deadline" | "hasBidiControls" | "requiresRealApproval" | "denialLimitFallback" | "origin" | "mandated" | "mandate" | "boundGrantDigest" | "boundGrants" | "classifierNoRuling" | "boundGrantAbsence" | "checkpointId";
|
|
221
|
-
type SummaryExcluded = "token" | "toolInput" | "toolName" | "toolCallId" | "preview" | "principal" | "
|
|
220
|
+
type SummaryProjected = "sessionId" | "scope" | "createdAt" | "gateKind" | "severity" | "spentMicroUsd" | "deadline" | "hasBidiControls" | "requiresRealApproval" | "denialLimitFallback" | "origin" | "mandated" | "mandate" | "boundGrantDigest" | "boundGrants" | "classifierNoRuling" | "boundGrantAbsence" | "checkpointId" | "rowVerdict";
|
|
221
|
+
type SummaryExcluded = "token" | "toolInput" | "toolName" | "toolCallId" | "preview" | "principal" | "sourceSessionId" | "agentId" | "approvalCard" | "restoreMode" | "previewWithheld" | "authoredBy" | "runOrigin" | "requestedByCallId";
|
|
222
222
|
type _GuardInboxSummary = AssertAllKeysHandled<Exclude<keyof CheckpointSummary, SummaryProjected | SummaryExcluded>>;
|
|
223
223
|
type _GuardInboxSummaryReverse = AssertAllKeysHandled<Exclude<SummaryProjected | SummaryExcluded, keyof CheckpointSummary>>;
|
|
224
224
|
type ParkArmKeys = keyof Extract<PendingAction, {
|
|
@@ -234,7 +234,7 @@ type TaskSpecWired = "objective" | "principal" | "images" | "sessionId" | "requi
|
|
|
234
234
|
export type TaskSpecUnwired = "actor" | "roles" | "lspManager" | "tracer" | "readFace" | "interactiveQuestionFallback" | "alwaysLoadTools" | "restoreGatedTools" | "deferSelfResolve" | "basePolicyForResumeEdit" | "lspDiagnostics" | "streamingToolExecution" | "toolResultThresholdChars" | "peerPresence" | "modelRole" | "enableBlockedReport" | "promptForm" | "advisorModel" | "runOrigin" | "planFile" | "classifyAllShell";
|
|
235
235
|
type _GuardTaskSpec = AssertAllKeysHandled<Exclude<keyof TaskSpec, TaskSpecWired | TaskSpecUnwired>>;
|
|
236
236
|
type _GuardTaskSpecReverse = AssertAllKeysHandled<Exclude<TaskSpecWired | TaskSpecUnwired, keyof TaskSpec>>;
|
|
237
|
-
type TaskResultForwarded = "taskId" | "runId" | "sessionId" | "terminal" | "model" | "effectiveReasoning" | "result" | "salvagedOutput" | "remoteEnvFailures" | "apiFailure" | "retryAfterMs" | "degraded" | "structuredOutput" | "rewindNotes" | "haltedOnUserRejection" | "haltedByUser" | "strandedHumanAnswers" | "pendingApproval" | "approvalWaitedMs" | "effectiveReadFace" | "effectiveReadDenyPatterns" | "effectiveWriteFace" | "effectiveMemoryScopes" | "stats" | "editedFiles" | "responseModel" | "compaction" | "resultEntryIds";
|
|
237
|
+
type TaskResultForwarded = "taskId" | "runId" | "sessionId" | "terminal" | "model" | "effectiveReasoning" | "result" | "salvagedOutput" | "remoteEnvFailures" | "apiFailure" | "retryAfterMs" | "degraded" | "structuredOutput" | "rewindNotes" | "haltedOnUserRejection" | "haltedByUser" | "strandedHumanAnswers" | "pendingApproval" | "approvalWaitedMs" | "effectiveReadFace" | "effectiveReadDenyPatterns" | "effectiveWriteFace" | "effectiveMemoryScopes" | "stats" | "editedFiles" | "responseModel" | "compaction" | "resultEntryIds" | "placementRoot";
|
|
238
238
|
type TaskResultStripped = never;
|
|
239
239
|
type _GuardTaskResult = AssertAllKeysHandled<Exclude<keyof TaskResult, TaskResultForwarded | TaskResultStripped>>;
|
|
240
240
|
type _GuardTaskResultReverse = AssertAllKeysHandled<Exclude<TaskResultForwarded | TaskResultStripped, keyof TaskResult>>;
|
|
@@ -245,7 +245,7 @@ type _GuardPausedCauseReverse = AssertAllKeysHandled<Exclude<PausedCauseForwarde
|
|
|
245
245
|
type NonPausedTerminalKeys = Exclude<TerminalCause, {
|
|
246
246
|
kind: "paused";
|
|
247
247
|
}> extends infer C ? (C extends object ? keyof C : never) : never;
|
|
248
|
-
type TerminalArmForwarded = "kind" | "code" | "message" | "nestedPause" | "detail" | "reason";
|
|
248
|
+
type TerminalArmForwarded = "kind" | "code" | "message" | "nestedPause" | "detail" | "reason" | "unstartedRow";
|
|
249
249
|
type TerminalArmStripped = never;
|
|
250
250
|
type _GuardTerminalArm = AssertAllKeysHandled<Exclude<NonPausedTerminalKeys, TerminalArmForwarded | TerminalArmStripped>>;
|
|
251
251
|
type _GuardTerminalArmReverse = AssertAllKeysHandled<Exclude<TerminalArmForwarded | TerminalArmStripped, NonPausedTerminalKeys>>;
|
|
@@ -433,10 +433,12 @@ type _CoverWordsCheck = AssertAllKeysHandled<Exclude<CoveringWords<{
|
|
|
433
433
|
}, _CoverProbeWords>> | Exclude<"text[]" | "tree", CoveringWords<readonly string[] | undefined, _CoverProbeWords>> | Extract<"verbatim" | "text[]", CoveringWords<{
|
|
434
434
|
note: string;
|
|
435
435
|
}[], _CoverProbeWords>>>;
|
|
436
|
+
type SessionMemoryStatusSourceKey = keyof SessionMemoryStatus | keyof DeploymentSessionMemoryStatus;
|
|
436
437
|
type SessionMemoryStatusProjected = "captureOptedOut" | "committedCount" | "foldedCount" | "optOutSource" | "lastCaptureAt";
|
|
437
|
-
type SessionMemoryStatusExcluded = "writeHome";
|
|
438
|
-
type _GuardSessionMemoryStatus = AssertAllKeysHandled<Exclude<
|
|
439
|
-
type _GuardSessionMemoryStatusReverse = AssertAllKeysHandled<Exclude<SessionMemoryStatusProjected | SessionMemoryStatusExcluded,
|
|
438
|
+
type SessionMemoryStatusExcluded = "writeHome" | "planes";
|
|
439
|
+
type _GuardSessionMemoryStatus = AssertAllKeysHandled<Exclude<SessionMemoryStatusSourceKey, SessionMemoryStatusProjected | SessionMemoryStatusExcluded>>;
|
|
440
|
+
type _GuardSessionMemoryStatusReverse = AssertAllKeysHandled<Exclude<SessionMemoryStatusProjected | SessionMemoryStatusExcluded, SessionMemoryStatusSourceKey>>;
|
|
441
|
+
type _GuardSessionMemoryStatusDeploymentReverse = AssertAllKeysHandled<Exclude<SessionMemoryStatusProjected, keyof DeploymentSessionMemoryStatus>>;
|
|
440
442
|
type SideQueryResultForwarded = "text" | "toolCalls" | "model" | "servedModel" | "degraded" | "responseModel" | "usage" | "usageMissing" | "stopReason" | "errorMessage" | "errorCode" | "errorKind" | "inputTooLongRuledOut" | "account";
|
|
441
443
|
type SideQueryResultStripped = never;
|
|
442
444
|
type _GuardSideQueryResult = AssertAllKeysHandled<Exclude<keyof SideQueryResult, SideQueryResultForwarded | SideQueryResultStripped>>;
|
|
@@ -525,6 +527,7 @@ export type CoreKeysetGuards = [
|
|
|
525
527
|
_GuardTerminalArmReverse,
|
|
526
528
|
_GuardSessionMemoryStatus,
|
|
527
529
|
_GuardSessionMemoryStatusReverse,
|
|
530
|
+
_GuardSessionMemoryStatusDeploymentReverse,
|
|
528
531
|
_GuardNotificationReverse,
|
|
529
532
|
_GuardProvenance,
|
|
530
533
|
_GuardProvenanceReverse,
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* 同文件 G1 e2e 的全码扇出夹具、以及契约文档附录 D.3 那张表(含**小节标题里的码数** —— 那道门本批
|
|
17
17
|
* 刚立,立完就在下一次加码时自己咬住了)。
|
|
18
18
|
*/
|
|
19
|
-
export declare const ENGINE_NOTICE_WIRE_CODES: readonly ["memory.session_polluted", "memory.harvest_quarantined", "memory.delegation_static_mark_waived", "memory.hold_opened", "memory.hold_released", "memory.hold_disposed", "task.turn_interrupted", "steering.parked_input_blocked", "task.user_steer_undrained", "task.user_followup_undrained", "memory.capture_opted_out", "memory.capture_optout_unpersisted", "task.halt_unconsumed", "task.late_approval", "config.durable_gate_unavailable", "peer.inbound_disposition", "peer.held_settled", "peer.idle_subscription", "classifier.denial_limit", "mcp.injection_dropped", "delegation.ask_unresolvable", "task.interrupt_unconsumed", "approval.read_root_granted", "approval.read_root_grant_rejected", "instructions.source_changed", "session.
|
|
19
|
+
export declare const ENGINE_NOTICE_WIRE_CODES: readonly ["memory.session_polluted", "memory.harvest_quarantined", "memory.delegation_static_mark_waived", "memory.hold_opened", "memory.hold_released", "memory.hold_disposed", "task.turn_interrupted", "steering.parked_input_blocked", "task.user_steer_undrained", "task.user_followup_undrained", "memory.capture_opted_out", "memory.capture_optout_unpersisted", "task.halt_unconsumed", "task.late_approval", "config.durable_gate_unavailable", "peer.inbound_disposition", "peer.held_settled", "peer.idle_subscription", "classifier.denial_limit", "mcp.injection_dropped", "delegation.ask_unresolvable", "task.interrupt_unconsumed", "approval.read_root_granted", "approval.read_root_grant_rejected", "instructions.source_changed", "session.lineage_rerooted", "server.model_unreachable", "permission.entry_mode_clamped", "classifier.unavailable", "config.permission_mode_unavailable", "permission.ask_released_by_mode", "permission.read_deny_unapplied", "permission.rule_store_unavailable", "permission.rule_row_dropped", "permission.allowed_tool_not_granted", "task.tool_turn_incomplete", "route.finish_reason_unknown", "route.stream_end_ignored", "route.credential_origin_mismatch", "mods.registration_refused", "config.session_rules_earlier_grammar", "advisor.not_attached", "inherit_env.names_withheld", "model.capability_downgraded", "context.media_removed", "mcp.authorization_required", "classifier.seat_rate_limited", "context.tool_schema_removed"];
|
|
20
20
|
export type EngineNoticeWireCode = (typeof ENGINE_NOTICE_WIRE_CODES)[number];
|
|
21
21
|
/** 白名单谓词(单点):路由与门都读这一个,不许第二处手抄码串。 */
|
|
22
22
|
export declare function isEngineNoticeWireCode(code: string): code is EngineNoticeWireCode;
|
|
@@ -28,7 +28,7 @@ export const ENGINE_NOTICE_WIRE_CODES = [
|
|
|
28
28
|
"approval.read_root_granted",
|
|
29
29
|
"approval.read_root_grant_rejected",
|
|
30
30
|
"instructions.source_changed",
|
|
31
|
-
"session.
|
|
31
|
+
"session.lineage_rerooted",
|
|
32
32
|
"server.model_unreachable",
|
|
33
33
|
"permission.entry_mode_clamped",
|
|
34
34
|
"classifier.unavailable",
|
|
@@ -47,8 +47,10 @@ export const ENGINE_NOTICE_WIRE_CODES = [
|
|
|
47
47
|
"advisor.not_attached",
|
|
48
48
|
"inherit_env.names_withheld",
|
|
49
49
|
"model.capability_downgraded",
|
|
50
|
-
"context.
|
|
50
|
+
"context.media_removed",
|
|
51
51
|
"mcp.authorization_required",
|
|
52
|
+
"classifier.seat_rate_limited",
|
|
53
|
+
"context.tool_schema_removed",
|
|
52
54
|
];
|
|
53
55
|
const WIRE_CODES = new Set(ENGINE_NOTICE_WIRE_CODES);
|
|
54
56
|
export function isEngineNoticeWireCode(code) {
|