@sema-agent/server 7.101.0 → 7.102.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.
Files changed (86) hide show
  1. package/MIGRATION.md +23 -0
  2. package/README.md +1 -1
  3. package/README.zh-CN.md +1 -1
  4. package/USAGE.md +58 -4
  5. package/dist/approval-card.d.ts +35 -2
  6. package/dist/approval-card.js +19 -1
  7. package/dist/background-session-reap.d.ts +55 -0
  8. package/dist/background-session-reap.js +90 -0
  9. package/dist/boot/config-center.d.ts +16 -4
  10. package/dist/boot/config-center.js +44 -15
  11. package/dist/boot/exit-boundary.js +17 -0
  12. package/dist/boot/runner-deps.js +1 -0
  13. package/dist/boot/runtime-caps.js +3 -2
  14. package/dist/boot/session-faces.js +3 -4
  15. package/dist/boot/shutdown.d.ts +2 -1
  16. package/dist/boot/shutdown.js +33 -12
  17. package/dist/boot/stage-07-capability-layer.d.ts +1 -1
  18. package/dist/boot/stage-07-capability-layer.js +6 -4
  19. package/dist/boot/stage-08-reapers.d.ts +1 -1
  20. package/dist/boot/stage-09-leader.d.ts +1 -1
  21. package/dist/boot/stage-10-http-server.d.ts +1 -1
  22. package/dist/boot/stage-10-http-server.js +9 -3
  23. package/dist/capabilities/builtin-tools.d.ts +14 -1
  24. package/dist/capabilities/builtin-tools.js +3 -0
  25. package/dist/capabilities/scenarios.d.ts +1 -1
  26. package/dist/capabilities/scenarios.js +3 -3
  27. package/dist/center-credential-renewer.d.ts +76 -0
  28. package/dist/center-credential-renewer.js +359 -0
  29. package/dist/center-credential.d.ts +76 -22
  30. package/dist/center-credential.js +119 -43
  31. package/dist/config-catalog.js +9 -4
  32. package/dist/config-center/apply-effective.js +5 -12
  33. package/dist/config-center/center-request.d.ts +13 -0
  34. package/dist/config-center/center-request.js +23 -3
  35. package/dist/config-center/facade.d.ts +1 -1
  36. package/dist/config-center/http-client.js +2 -5
  37. package/dist/config-center/read-warnings.d.ts +19 -48
  38. package/dist/config-center/read-warnings.js +7 -49
  39. package/dist/config-center/restart-signal.d.ts +8 -11
  40. package/dist/config-center/types.d.ts +4 -2
  41. package/dist/config-provider.js +1 -48
  42. package/dist/config-types.d.ts +77 -5
  43. package/dist/config-types.js +5 -0
  44. package/dist/config.js +49 -13
  45. package/dist/device-store.d.ts +1 -1
  46. package/dist/fleet/fleet-bus.d.ts +30 -4
  47. package/dist/fleet/fleet-bus.js +20 -4
  48. package/dist/fleet/fleet-reconciler.d.ts +29 -6
  49. package/dist/fleet/fleet-reconciler.js +109 -79
  50. package/dist/fleet-client.d.ts +21 -7
  51. package/dist/fleet-client.js +41 -12
  52. package/dist/fleet-lease.d.ts +1 -1
  53. package/dist/http/approval-sweeps.js +5 -20
  54. package/dist/http/dispatch.js +20 -14
  55. package/dist/http/readiness.d.ts +87 -0
  56. package/dist/http/readiness.js +54 -0
  57. package/dist/http/resume-legs.js +5 -4
  58. package/dist/http/route-table.d.ts +7 -0
  59. package/dist/http/route-table.js +6 -0
  60. package/dist/http/routes/a2a-serve.js +6 -14
  61. package/dist/http/routes/approvals-assistant.js +1 -0
  62. package/dist/http/routes/background.d.ts +80 -0
  63. package/dist/http/routes/background.js +94 -0
  64. package/dist/http/routes/capabilities.js +2 -0
  65. package/dist/http/server.d.ts +21 -8
  66. package/dist/http/server.js +2 -2
  67. package/dist/model-entry-refusal.d.ts +11 -10
  68. package/dist/model-entry-refusal.js +13 -10
  69. package/dist/observability/fail-open.d.ts +6 -2
  70. package/dist/observability/fail-open.js +6 -2
  71. package/dist/parked-decide.d.ts +11 -5
  72. package/dist/parked-decide.js +4 -1
  73. package/dist/parked-revive-surface.d.ts +47 -0
  74. package/dist/parked-revive-surface.js +20 -0
  75. package/dist/plugins/background-shell-support.d.ts +20 -1
  76. package/dist/plugins/background-shell-support.js +26 -0
  77. package/dist/plugins/host-platform.d.ts +11 -1
  78. package/dist/plugins/host-platform.js +11 -0
  79. package/dist/plugins/remote-env-host.d.ts +14 -1
  80. package/dist/plugins/remote-env-host.js +18 -5
  81. package/dist/tool-approval.d.ts +39 -1
  82. package/dist/tool-approval.js +37 -8
  83. package/dist/trace/core-keyset-guard.d.ts +3 -3
  84. package/dist/trace/engine-notice-wire.d.ts +1 -1
  85. package/dist/trace/engine-notice-wire.js +2 -0
  86. package/package.json +3 -3
@@ -1,6 +1,6 @@
1
1
  import { contentKindOf } from "./approval-content-kind.js";
2
2
  import { AsyncLocalStorage } from "node:async_hooks";
3
- import { uuidv7, MAX_RULE_TEXT_CHARS, parseRuleText, pathConfinableWriteToolNames } from "@sema-agent/core";
3
+ import { uuidv7, MAX_RULE_TEXT_CHARS, READ_ROOT_CANDIDATE_DIR_MAX, parseRuleText, pathConfinableWriteToolNames } from "@sema-agent/core";
4
4
  import { precheckCardRuleText } from "./rules-consent.js";
5
5
  import { redactDeep, redactSecrets, redactSecretsWithArms } from "./trace/redact.js";
6
6
  import { hasBidiControls } from "./text-bidi.js";
@@ -8,7 +8,7 @@ import { approvalPayloadFingerprint } from "./plugins/approval-payload-fingerpri
8
8
  import { createLogger } from "./observability/logger.js";
9
9
  import { recordFailOpen } from "./observability/fail-open.js";
10
10
  import { deriveAskId, deriveAskScopedBatchId, deriveBatchId, MAX_DECISION_NOTE_CHARS } from "./approval-ask-machine.js";
11
- import { ApprovalCardEnvelopeSchema, MAX_RULE_OFFERS, buildApprovalCard, buildApprovalCardEnvelope, buildApprovalRequestFrame, buildRevokeFrame, readDenialLimitFallback, readProbeCause, readReadRootCandidate, readRuleEvidence, readRuleOffersAbsence, readRuleOffersAbsenceSeat, readParkRowTrueSeat, RuleOfferRawSchema, backfillLegacyBatchMemberKind, screenUncoveredDetailSeat, } from "./approval-card.js";
11
+ import { ApprovalCardEnvelopeSchema, MAX_RULE_OFFERS, buildApprovalCard, buildApprovalCardEnvelope, buildApprovalRequestFrame, buildRevokeFrame, readDenialLimitFallback, readProbeCause, readReadRootCandidate, readRuleEvidence, readRuleOffersAbsence, readRuleOffersAbsenceSeat, readParkRowTrueSeat, readClosedWordSeat, RuleOfferRawSchema, backfillLegacyBatchMemberKind, screenUncoveredDetailSeat, } from "./approval-card.js";
12
12
  import { POLICY_REFUSAL_DECISION, projectAskTerminalClaimTruth } from "./plugins/approval-ask-store-sql.js";
13
13
  import { settleByPolicy } from "./approval-policy-settlement.js";
14
14
  import { governanceAskMarksFor, runWithGovernanceAskScope } from "./governance-ask-marks.js";
@@ -111,6 +111,8 @@ function respondSettledBy(parsed) {
111
111
  return parsed.settledBy;
112
112
  }
113
113
  export const SETTLED_BY_DENY_ONLY = 'settledBy is only meaningful with decision "deny" — only a person approves an action that EXECUTES, so a self-reported settlement source on an allow is a contradiction the engine refuses; the refusal would arrive too late to undo this door\'s own side effects (a session allow-all grant, a persisted rule, a DECIDED row that replays as a plain approval), so it is refused here, before the decision';
114
+ export const READ_ROOT_GRANT_ALLOW_ONLY = 'readRootGrant is only meaningful with decision "allow" — it is the card\'s "Yes, and add directory" answer (allow this call and add the card\'s readRootCandidate.dir to this run\'s read directories)';
115
+ export const READ_ROOT_GRANT_SHAPE = `readRootGrant must be the card's readRootCandidate.dir sent back byte for byte — a non-empty string of at most ${READ_ROOT_CANDIDATE_DIR_MAX} characters`;
114
116
  export const PERSIST_RULE_SCOPE_REFUSED = "this endpoint does not accept a rule scope — the server mints it from where the approval happened (send neither `scope` nor `persistRule.scope`)";
115
117
  export function parseToolApprovalResponse(body) {
116
118
  if (body === null || typeof body !== "object" || Array.isArray(body))
@@ -161,6 +163,12 @@ export function parseToolApprovalResponse(body) {
161
163
  if (rawSettledBy !== undefined && typeof rawSettledBy !== "string")
162
164
  return { ok: false, error: SETTLED_BY_MUST_BE_STRING };
163
165
  const settledBy = rawSettledBy;
166
+ const rawGrant = body.readRootGrant;
167
+ if (rawGrant !== undefined && d !== "allow")
168
+ return { ok: false, error: READ_ROOT_GRANT_ALLOW_ONLY };
169
+ if (rawGrant !== undefined && (typeof rawGrant !== "string" || rawGrant === "" || rawGrant.length > READ_ROOT_CANDIDATE_DIR_MAX))
170
+ return { ok: false, error: READ_ROOT_GRANT_SHAPE };
171
+ const readRootGrant = rawGrant;
164
172
  return {
165
173
  ok: true,
166
174
  value: d,
@@ -168,6 +176,7 @@ export function parseToolApprovalResponse(body) {
168
176
  ...(persistRule !== undefined ? { persistRule } : {}),
169
177
  ...(note !== undefined ? { note } : {}),
170
178
  ...(rawSettledBy !== undefined ? { settledBy } : {}),
179
+ ...(readRootGrant !== undefined ? { readRootGrant } : {}),
171
180
  };
172
181
  }
173
182
  return { ok: false, error: 'decision must be one of "allow" | "allow_session" | "deny"' };
@@ -938,6 +947,8 @@ export class ToolApprovalCoordinator {
938
947
  const bounded = boundArgs(req.args);
939
948
  let effectiveGovernanceForced = governanceForced;
940
949
  let ruleLaneMaterial = this.buildRuleLaneMaterial(req, origin.owner, governanceForced, origin.sessionId);
950
+ const mandateWord = readClosedWordSeat(req, "mandate");
951
+ const originWord = typeof req.origin === "string" && req.origin.length > 0 ? req.origin : undefined;
941
952
  const frame = {
942
953
  type: "tool_approval",
943
954
  approvalId: id,
@@ -963,7 +974,8 @@ export class ToolApprovalCoordinator {
963
974
  ...(governanceForced ? { governanceForced: true } : {}),
964
975
  ...(req.requiresRealApproval === true ? { requiresRealApproval: true } : {}),
965
976
  ...(req.mandated === true ? { mandated: true } : {}),
966
- ...(typeof req.origin === "string" && req.origin.length > 0 ? { origin: req.origin } : {}),
977
+ ...(mandateWord !== undefined ? { mandate: mandateWord } : {}),
978
+ ...(originWord !== undefined ? { origin: originWord } : {}),
967
979
  ...(typeof req.persistedRuleShadowed === "string" && req.persistedRuleShadowed !== ""
968
980
  ? { persistedRuleShadowed: redactSecrets(req.persistedRuleShadowed).slice(0, MAX_RULE_TEXT_CHARS) }
969
981
  : {}),
@@ -1170,11 +1182,17 @@ export class ToolApprovalCoordinator {
1170
1182
  return unattended === "unavailable" ? unattended : shapeDeny(unattended);
1171
1183
  }
1172
1184
  if (settled.allowed) {
1173
- return settled.updatedInput !== undefined ? { allow: true, updatedInput: settled.updatedInput } : true;
1185
+ if (settled.updatedInput === undefined && settled.readRootGrant === undefined)
1186
+ return true;
1187
+ return {
1188
+ allow: true,
1189
+ ...(settled.updatedInput !== undefined ? { updatedInput: settled.updatedInput } : {}),
1190
+ ...(settled.readRootGrant !== undefined ? { readRootGrant: settled.readRootGrant } : {}),
1191
+ };
1174
1192
  }
1175
1193
  return shapeDeny(false);
1176
1194
  };
1177
- const settle = (allowed, outcome, updatedInput, hostSettledBy, denyReason) => {
1195
+ const settle = (allowed, outcome, updatedInput, hostSettledBy, denyReason, readRootGrant) => {
1178
1196
  if (done)
1179
1197
  return;
1180
1198
  done = true;
@@ -1208,7 +1226,7 @@ export class ToolApprovalCoordinator {
1208
1226
  ...(hostSettledBy !== undefined ? { settledBy: hostSettledBy } : {}),
1209
1227
  settledAtMs: Date.now(),
1210
1228
  });
1211
- resolveAllowed({ allowed, ...(allowed && updatedInput !== undefined ? { updatedInput } : {}) });
1229
+ resolveAllowed({ allowed, ...(allowed && updatedInput !== undefined ? { updatedInput } : {}), ...(allowed && readRootGrant !== undefined ? { readRootGrant } : {}) });
1212
1230
  };
1213
1231
  const broadcastClaimTruth = (read) => {
1214
1232
  if (askId === undefined)
@@ -1483,6 +1501,8 @@ export class ToolApprovalCoordinator {
1483
1501
  ...(effectiveGovernanceForced ? { governanceForced: true } : {}),
1484
1502
  ...(req.requiresRealApproval === true ? { requiresRealApproval: true } : {}),
1485
1503
  ...(req.mandated === true ? { mandated: true } : {}),
1504
+ ...(mandateWord !== undefined ? { mandate: mandateWord } : {}),
1505
+ ...(originWord !== undefined ? { origin: originWord } : {}),
1486
1506
  ...(askId !== undefined && batchId !== undefined ? { askId, batchId } : {}),
1487
1507
  };
1488
1508
  selfEntry = pendingEntry;
@@ -2051,7 +2071,7 @@ export class ToolApprovalCoordinator {
2051
2071
  approvalPayloadFingerprint({ updatedInput: ambiguousConfirmedRow.updatedInput }) === approvalPayloadFingerprint({ updatedInput: parsed.updatedInput });
2052
2072
  const result = this.finishRespond(id, entry, parsed, {
2053
2073
  noteRecorded: noteLanded,
2054
- ...(winnerRow !== undefined ? { settleOutcome: outcomeOfDecidedRow(winnerRow) } : {}),
2074
+ ...(winnerRow !== undefined ? { settleOutcome: outcomeOfDecidedRow(winnerRow), settleOutcomeIsThisRequest: ambiguousConfirmedRow === undefined } : {}),
2055
2075
  ...(ambiguousConfirmedRow !== undefined ? { updatedInputDelivered: payloadIsMine } : {}),
2056
2076
  });
2057
2077
  if (winnerRow !== undefined)
@@ -2077,7 +2097,8 @@ export class ToolApprovalCoordinator {
2077
2097
  }
2078
2098
  const allowed = parsed.value !== "deny";
2079
2099
  const settleArgs = opts?.settleOutcome !== undefined ? settleArgsOfDecided(opts.settleOutcome) : { allowed, updatedInput: parsed.updatedInput, settledBy: respondSettledBy(parsed) };
2080
- entry.settle(settleArgs.allowed, settleArgs.allowed ? "allowed" : "denied", settleArgs.updatedInput, settleArgs.settledBy, settleArgs.allowed ? undefined : parsed.note);
2100
+ const readRootGrant = opts?.settleOutcome === undefined || opts.settleOutcomeIsThisRequest === true ? parsed.readRootGrant : undefined;
2101
+ entry.settle(settleArgs.allowed, settleArgs.allowed ? "allowed" : "denied", settleArgs.updatedInput, settleArgs.settledBy, settleArgs.allowed ? undefined : parsed.note, readRootGrant);
2081
2102
  const updatedInputDelivered = opts?.updatedInputDelivered ?? true;
2082
2103
  const noteRecorded = opts?.noteRecorded ?? false;
2083
2104
  return {
@@ -2107,6 +2128,8 @@ export class ToolApprovalCoordinator {
2107
2128
  ...(e.requiresRealApproval ? { requiresRealApproval: true } : {}),
2108
2129
  ...(e.governanceForced ? { governanceForced: true } : {}),
2109
2130
  ...(e.mandated ? { mandated: true } : {}),
2131
+ ...(e.mandate !== undefined ? { mandate: e.mandate } : {}),
2132
+ ...(e.origin !== undefined ? { origin: e.origin } : {}),
2110
2133
  ...(e.originTaskId !== undefined ? { fromSubagent: true, originTaskId: e.originTaskId } : {}),
2111
2134
  ...(contentKind !== undefined ? { contentKind } : {}),
2112
2135
  frame: e.frame.approvalId === id ? e.frame : { ...e.frame, approvalId: id },
@@ -2114,6 +2137,12 @@ export class ToolApprovalCoordinator {
2114
2137
  }
2115
2138
  return rows;
2116
2139
  }
2140
+ hasLivePendingFrom(originTaskId) {
2141
+ for (const e of this.pending.values())
2142
+ if (e.originTaskId === originTaskId)
2143
+ return true;
2144
+ return false;
2145
+ }
2117
2146
  async pollSuspendedDecisions() {
2118
2147
  const store = this.askStore;
2119
2148
  if (!store)
@@ -43,7 +43,7 @@ type _GuardBgNotifReverse = AssertAllKeysHandled<Exclude<BgNotifProjected | BgNo
43
43
  type RosterProjected = "name" | "agentId" | "sessionId" | "toolUseId" | "owner" | "scope" | "sessionScoped" | "rootSessionId" | "model" | "modelFallback" | "createdAt";
44
44
  type _GuardRoster = AssertAllKeysHandled<Exclude<keyof RosterEntry, RosterProjected>>;
45
45
  type _GuardRosterReverse = AssertAllKeysHandled<Exclude<RosterProjected, keyof RosterEntry>>;
46
- type AskProjected = "toolName" | "toolCallId" | "args" | "message" | "sourceTaskId" | "fromSubagent" | "sourceAgentName" | "delegation" | "ruleOffers" | "ruleOffersAbsence" | "persistedRuleShadowed" | "probeCause" | "ruleEvidence" | "requiresRealApproval" | "denialLimitFallback" | "origin" | "ruleStoreUnreadable" | "readRootCandidate" | "mandated";
46
+ type AskProjected = "toolName" | "toolCallId" | "args" | "message" | "sourceTaskId" | "fromSubagent" | "sourceAgentName" | "delegation" | "ruleOffers" | "ruleOffersAbsence" | "persistedRuleShadowed" | "probeCause" | "ruleEvidence" | "requiresRealApproval" | "denialLimitFallback" | "origin" | "ruleStoreUnreadable" | "readRootCandidate" | "mandated" | "mandate";
47
47
  type AskExcluded = "preview" | "principal" | "riskAxes" | "boundInputHash" | "isDelegatedChild" | "probeReason" | "hasBidiControls" | "previewWithheld" | "execCwd";
48
48
  type _GuardAsk = AssertAllKeysHandled<Exclude<keyof AskRequest, AskProjected | AskExcluded>>;
49
49
  type _GuardAskReverse = AssertAllKeysHandled<Exclude<AskProjected | AskExcluded, keyof AskRequest>>;
@@ -130,7 +130,7 @@ type _GuardPermissionTraceReverse = AssertAllKeysHandled<Exclude<PermissionTrace
130
130
  /** `T` 非 `never` 时收敛到 `never`(空集 ⇒ 残留 `"EMPTY"` ⇒ tsc 红)。 */
131
131
  type AssertNonEmpty<T> = [T] extends [never] ? "EMPTY" : never;
132
132
  type _GuardPermissionTraceNonEmpty = AssertAllKeysHandled<AssertNonEmpty<PermissionTraceKind>>;
133
- type SummaryProjected = "sessionId" | "scope" | "createdAt" | "gateKind" | "severity" | "spentMicroUsd" | "deadline" | "hasBidiControls" | "requiresRealApproval" | "denialLimitFallback" | "origin" | "ruleStoreUnreadable" | "mandated";
133
+ type SummaryProjected = "sessionId" | "scope" | "createdAt" | "gateKind" | "severity" | "spentMicroUsd" | "deadline" | "hasBidiControls" | "requiresRealApproval" | "denialLimitFallback" | "origin" | "ruleStoreUnreadable" | "mandated" | "mandate";
134
134
  type SummaryExcluded = "token" | "toolInput" | "toolName" | "toolCallId" | "preview" | "principal" | "sourceTaskId" | "contentKind" | "restoreMode" | "checkpointId" | "previewWithheld";
135
135
  type _GuardInboxSummary = AssertAllKeysHandled<Exclude<keyof CheckpointSummary, SummaryProjected | SummaryExcluded>>;
136
136
  type _GuardInboxSummaryReverse = AssertAllKeysHandled<Exclude<SummaryProjected | SummaryExcluded, keyof CheckpointSummary>>;
@@ -138,7 +138,7 @@ type ParkArmKeys = keyof Extract<PendingAction, {
138
138
  kind: "tool_approval";
139
139
  }>;
140
140
  type ParkArmQueueProjected = "toolName" | "toolCallId" | "boundInputHash" | "ruleOffers" | "hasBidiControls" | keyof import("../approval-card.js").ParkRowFacts;
141
- type ParkArmQueueExcluded = "kind" | "args" | "batchToolCallIds" | "completedCallIds" | "capabilityId" | "contractId" | "shapeDigest" | "implementationRevision" | "rosterDigest" | "family" | "pathTarget" | "preview" | "previewWithheld" | "execCwd" | "denialLimitFallback" | "origin" | "ruleStoreUnreadable";
141
+ type ParkArmQueueExcluded = "kind" | "args" | "batchToolCallIds" | "completedCallIds" | "capabilityId" | "contractId" | "shapeDigest" | "implementationRevision" | "rosterDigest" | "family" | "pathTarget" | "preview" | "previewWithheld" | "execCwd" | "denialLimitFallback" | "ruleStoreUnreadable";
142
142
  type _GuardParkArmQueue = AssertAllKeysHandled<Exclude<ParkArmKeys, ParkArmQueueProjected | ParkArmQueueExcluded>>;
143
143
  type _GuardParkArmQueueReverse = AssertAllKeysHandled<Exclude<ParkArmQueueProjected | ParkArmQueueExcluded, ParkArmKeys>>;
144
144
  type _NoDoubleBookParkArmQueue = AssertAllKeysHandled<Extract<ParkArmQueueProjected, ParkArmQueueExcluded>>;
@@ -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", "instructions.source_changed"];
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"];
20
20
  export type EngineNoticeWireCode = (typeof ENGINE_NOTICE_WIRE_CODES)[number];
21
21
  /**
22
22
  * S-690 —— **本仓自铸**的通告码与它们的受众(码 / 铸点 / 受众三者的属主都是本仓)。
@@ -23,6 +23,8 @@ export const ENGINE_NOTICE_WIRE_CODES = [
23
23
  "mcp.injection_dropped",
24
24
  "delegation.ask_unresolvable",
25
25
  "task.interrupt_unconsumed",
26
+ "approval.read_root_granted",
27
+ "approval.read_root_grant_rejected",
26
28
  "instructions.source_changed",
27
29
  ];
28
30
  export const SERVER_NOTICE_AUDIENCE = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sema-agent/server",
3
- "version": "7.101.0",
3
+ "version": "7.102.0",
4
4
  "description": "Sema Server — the server/API implementation layer for Sema, wiring core, registry, model providers, and cloud agent execution. Built on @sema-agent/core.",
5
5
  "type": "module",
6
6
  "license": "BUSL-1.1",
@@ -61,8 +61,8 @@
61
61
  "build:binary:run-local:darwin-arm64": "bun build --compile --target=bun-darwin-arm64 src/run-local.ts --outfile dist/run-local-darwin-arm64"
62
62
  },
63
63
  "dependencies": {
64
- "@sema-agent/core": "7.31.1",
65
- "@sema-agent/settings-schema": "6.0.0",
64
+ "@sema-agent/core": "7.32.1",
65
+ "@sema-agent/settings-schema": "6.1.0",
66
66
  "e2b": "^2.28.0",
67
67
  "libsodium-wrappers": "^0.8.4",
68
68
  "mysql2": "^3.22.4",