@sema-agent/client-core 0.97.1 → 0.98.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 (281) hide show
  1. package/CHANGELOG.md +408 -0
  2. package/README.md +74 -37
  3. package/dist/adapt/arms.d.ts +1 -0
  4. package/dist/adapt/arms.js +128 -34
  5. package/dist/adapt/ids.d.ts +12 -1
  6. package/dist/adapt/ids.js +59 -8
  7. package/dist/adapt/instanceLedger.d.ts +50 -0
  8. package/dist/adapt/instanceLedger.js +147 -0
  9. package/dist/adapt/textStream.d.ts +1 -0
  10. package/dist/adapt/textStream.js +24 -7
  11. package/dist/adapt/toolCards.d.ts +27 -5
  12. package/dist/adapt/toolCards.js +39 -6
  13. package/dist/adapt/wireShapes.js +6 -2
  14. package/dist/adapt.d.ts +2 -0
  15. package/dist/adapt.js +8 -3
  16. package/dist/adapter/activeRunSelfHeal.d.ts +5 -0
  17. package/dist/adapter/activeRunSelfHeal.js +51 -28
  18. package/dist/adapter/downstream/eventToSdkMessage.d.ts +2 -5
  19. package/dist/adapter/downstream/eventToSdkMessage.js +27 -34
  20. package/dist/adapter/downstream/terminalToSdkResult.js +11 -4
  21. package/dist/adapter/downstream/turnUsageToModelUsage.d.ts +5 -2
  22. package/dist/adapter/downstream/turnUsageToModelUsage.js +2 -0
  23. package/dist/adapter/runStream.js +29 -13
  24. package/dist/adapter/types.d.ts +4 -4
  25. package/dist/agentSession/backgroundView.js +2 -1
  26. package/dist/agentSession/engineAgentRegistryRead.d.ts +2 -2
  27. package/dist/agentSession/engineAgentRegistryRead.js +12 -13
  28. package/dist/agentsWireCaps.d.ts +8 -8
  29. package/dist/agentsWireCaps.js +168 -175
  30. package/dist/approvalDecidedByCapability.d.ts +0 -4
  31. package/dist/approvalDecidedByCapability.js +0 -6
  32. package/dist/approvalsStreamLiveCapability.d.ts +0 -4
  33. package/dist/approvalsStreamLiveCapability.js +0 -6
  34. package/dist/assistantInbox.d.ts +34 -0
  35. package/dist/assistantInbox.js +118 -0
  36. package/dist/centerWiringCapability.js +9 -1
  37. package/dist/clientSlice.d.ts +0 -9
  38. package/dist/clientSlice.js +0 -3
  39. package/dist/cloudConfigWireCaps.d.ts +4 -2
  40. package/dist/cloudConfigWireCaps.js +81 -61
  41. package/dist/compensations.js +1 -1
  42. package/dist/connectorStatus.d.ts +21 -0
  43. package/dist/connectorStatus.js +112 -0
  44. package/dist/controlRouter.d.ts +14 -1
  45. package/dist/controlRouter.js +68 -17
  46. package/dist/coreValuePorts.d.ts +3 -3
  47. package/dist/decideReceipt.d.ts +2 -2
  48. package/dist/decideReceipt.js +5 -2
  49. package/dist/declared/supportFloorDeclared.js +3 -3
  50. package/dist/deviceExecutorManagementCapability.d.ts +0 -4
  51. package/dist/deviceExecutorManagementCapability.js +0 -6
  52. package/dist/deviceRebind.d.ts +49 -1
  53. package/dist/deviceRebind.js +221 -3
  54. package/dist/displayUntrusted.d.ts +1 -0
  55. package/dist/displayUntrusted.js +250 -76
  56. package/dist/engineAgentAbsence.d.ts +1 -1
  57. package/dist/engineAgentPanelStore.d.ts +5 -4
  58. package/dist/engineAgentPanelStore.js +3 -12
  59. package/dist/engineCapReader.d.ts +0 -4
  60. package/dist/engineCapReader.js +1 -5
  61. package/dist/engineCapsCache.d.ts +4 -0
  62. package/dist/engineCapsCache.js +17 -12
  63. package/dist/engineClosedSets.d.ts +1 -0
  64. package/dist/engineClosedSets.js +4 -1
  65. package/dist/engineErrorCodes.d.ts +9 -2
  66. package/dist/engineErrorCodes.js +9 -1
  67. package/dist/engineIdentity.d.ts +1 -0
  68. package/dist/engineIdentity.js +8 -0
  69. package/dist/engineRowRef.d.ts +28 -0
  70. package/dist/engineRowRef.js +111 -0
  71. package/dist/engineSessionMessages.d.ts +67 -0
  72. package/dist/engineSessionMessages.js +364 -0
  73. package/dist/engineToolDirectory.d.ts +0 -9
  74. package/dist/engineToolDirectory.js +1 -94
  75. package/dist/engineUrl.d.ts +18 -0
  76. package/dist/engineUrl.js +52 -0
  77. package/dist/env/uiLanguage.d.ts +9 -0
  78. package/dist/env/uiLanguage.js +35 -0
  79. package/dist/eventLeg.d.ts +92 -0
  80. package/dist/eventLeg.js +285 -0
  81. package/dist/executionLaneCapability.d.ts +0 -4
  82. package/dist/executionLaneCapability.js +3 -16
  83. package/dist/fileHistoryCaptureCapability.d.ts +0 -4
  84. package/dist/fileHistoryCaptureCapability.js +5 -7
  85. package/dist/fleet/fleetLedger.d.ts +0 -3
  86. package/dist/fleet/fleetLedger.js +21 -36
  87. package/dist/fleet/fleetProjection.d.ts +2 -2
  88. package/dist/fleet/fleetProjection.js +10 -8
  89. package/dist/frameBinding.d.ts +5 -0
  90. package/dist/frameBinding.js +23 -0
  91. package/dist/gateFailureCodes.d.ts +2 -0
  92. package/dist/gateFailureCodes.js +15 -0
  93. package/dist/gateOutcome.d.ts +3 -1
  94. package/dist/gateOutcome.js +25 -6
  95. package/dist/gateVocabulary.d.ts +5 -0
  96. package/dist/gateVocabulary.js +64 -2
  97. package/dist/generated/engineAskFaceTables.js +2 -2
  98. package/dist/generated/engineFactTables.d.ts +6 -3
  99. package/dist/generated/engineFactTables.js +22 -4
  100. package/dist/generated/engineNoticeTables.js +9 -0
  101. package/dist/generated/toolNameTables.d.ts +1 -0
  102. package/dist/generated/toolNameTables.js +1 -0
  103. package/dist/hitl/allowRuleShadow.d.ts +6 -1
  104. package/dist/hitl/allowRuleShadow.js +21 -17
  105. package/dist/hitl/approvalCardReading.d.ts +15 -0
  106. package/dist/hitl/approvalCardReading.js +154 -0
  107. package/dist/hitl/approvalCardReasons.d.ts +13 -0
  108. package/dist/hitl/approvalCardReasons.js +120 -0
  109. package/dist/hitl/approvalHolds.d.ts +47 -15
  110. package/dist/hitl/approvalHolds.js +134 -28
  111. package/dist/hitl/approvalResolution.d.ts +51 -26
  112. package/dist/hitl/approvalResolution.js +86 -122
  113. package/dist/hitl/approvalsFeed.js +6 -18
  114. package/dist/hitl/askClassPair.d.ts +2 -0
  115. package/dist/hitl/askClassPair.js +1 -0
  116. package/dist/hitl/askGateWire.d.ts +20 -2
  117. package/dist/hitl/askGateWire.js +49 -1
  118. package/dist/hitl/askParkRowRouting.d.ts +5 -0
  119. package/dist/hitl/askParkRowRouting.js +32 -1
  120. package/dist/hitl/askSettlementLine.d.ts +18 -0
  121. package/dist/hitl/askSettlementLine.js +79 -0
  122. package/dist/hitl/automaticAnswerVerdict.d.ts +1 -1
  123. package/dist/hitl/automaticAnswerVerdict.js +21 -5
  124. package/dist/hitl/crashConverged.d.ts +11 -20
  125. package/dist/hitl/crashConverged.js +56 -0
  126. package/dist/hitl/crashConvergedNotice.d.ts +3 -1
  127. package/dist/hitl/crashConvergedNotice.js +48 -11
  128. package/dist/hitl/decisionConflict.js +3 -10
  129. package/dist/hitl/decisionRefusal.d.ts +40 -1
  130. package/dist/hitl/decisionRefusal.js +199 -42
  131. package/dist/hitl/frameRouter.d.ts +5 -2
  132. package/dist/hitl/frameRouter.js +20 -16
  133. package/dist/hitl/gateLedger.d.ts +2 -0
  134. package/dist/hitl/gateLedger.js +50 -13
  135. package/dist/hitl/hitlBridge.d.ts +1 -2
  136. package/dist/hitl/hitlBridge.js +10 -7
  137. package/dist/hitl/livePendingAsk.d.ts +3 -3
  138. package/dist/hitl/livePendingAsk.js +7 -18
  139. package/dist/hitl/parkResolver.d.ts +2 -24
  140. package/dist/hitl/parkResolver.js +61 -97
  141. package/dist/hitl/persistedRulesWire.d.ts +24 -0
  142. package/dist/hitl/persistedRulesWire.js +122 -2
  143. package/dist/hitl/planReviewWire.d.ts +26 -13
  144. package/dist/hitl/planReviewWire.js +112 -78
  145. package/dist/hitl/refusedToolNameProse.d.ts +0 -1
  146. package/dist/hitl/refusedToolNameProse.js +0 -3
  147. package/dist/hitl/replayedApproval.d.ts +4 -3
  148. package/dist/hitl/replayedApproval.js +7 -4
  149. package/dist/hitl/sessionPolicyDeliverable.js +2 -4
  150. package/dist/hitl/sessionPolicyWire.d.ts +32 -20
  151. package/dist/hitl/sessionPolicyWire.js +162 -52
  152. package/dist/hitl/standingRows.d.ts +20 -2
  153. package/dist/hitl/standingRows.js +69 -8
  154. package/dist/hitl/toolApprovalWire.d.ts +87 -152
  155. package/dist/hitl/toolApprovalWire.js +591 -380
  156. package/dist/hookMatcherVerdict.d.ts +6 -1
  157. package/dist/hookMatcherVerdict.js +14 -7
  158. package/dist/hooksWireCaps.d.ts +2 -2
  159. package/dist/hooksWireCaps.js +59 -55
  160. package/dist/i18n/messages.en.d.ts +121 -0
  161. package/dist/i18n/messages.en.js +119 -0
  162. package/dist/i18n/messages.zh.d.ts +3 -0
  163. package/dist/i18n/messages.zh.js +120 -0
  164. package/dist/i18n/translate.d.ts +25 -0
  165. package/dist/i18n/translate.js +127 -0
  166. package/dist/index.d.ts +53 -20
  167. package/dist/index.js +38 -11
  168. package/dist/inheritEnvCapability.d.ts +31 -0
  169. package/dist/inheritEnvCapability.js +104 -0
  170. package/dist/liveModelCatalog.d.ts +1 -2
  171. package/dist/liveModelCatalog.js +2 -6
  172. package/dist/liveQuestionStore.d.ts +2 -21
  173. package/dist/mcpLiveness.d.ts +2 -1
  174. package/dist/mcpProbeWire.d.ts +6 -1
  175. package/dist/mcpProbeWire.js +1 -1
  176. package/dist/mcpWireCaps.d.ts +13 -2
  177. package/dist/mcpWireCaps.js +48 -0
  178. package/dist/memoryEntriesWire.d.ts +4 -9
  179. package/dist/model/modelSupplyRules.d.ts +0 -2
  180. package/dist/model/modelSupplyRules.js +3 -12
  181. package/dist/model/modelsPolicy.d.ts +0 -5
  182. package/dist/model/modelsPolicy.js +6 -36
  183. package/dist/model/subagentModelWord.d.ts +31 -0
  184. package/dist/model/subagentModelWord.js +261 -0
  185. package/dist/notifications.d.ts +6 -0
  186. package/dist/notifications.js +71 -23
  187. package/dist/outputStyleSeatCapability.d.ts +0 -3
  188. package/dist/outputStyleSeatCapability.js +0 -3
  189. package/dist/ownKey.d.ts +15 -0
  190. package/dist/ownKey.js +60 -3
  191. package/dist/panelReduce.d.ts +15 -9
  192. package/dist/panelReduce.js +680 -549
  193. package/dist/panelStateHolder.d.ts +3 -7
  194. package/dist/panelStateHolder.js +14 -130
  195. package/dist/peerLaneCapability.d.ts +0 -4
  196. package/dist/peerLaneCapability.js +0 -6
  197. package/dist/permissionRulesWriteCapability.d.ts +0 -4
  198. package/dist/permissionRulesWriteCapability.js +0 -6
  199. package/dist/permissionWireCaps.d.ts +2 -2
  200. package/dist/permissionWireCaps.js +2 -0
  201. package/dist/permissionsAllowGrantCapability.d.ts +0 -4
  202. package/dist/permissionsAllowGrantCapability.js +0 -6
  203. package/dist/permissionsDeclaration.d.ts +0 -11
  204. package/dist/permissionsDeclaration.js +60 -53
  205. package/dist/pluginHooksWire.d.ts +1 -1
  206. package/dist/pluginHooksWire.js +3 -6
  207. package/dist/preemptWire.d.ts +44 -0
  208. package/dist/preemptWire.js +83 -0
  209. package/dist/printToolResultFrame.js +15 -4
  210. package/dist/replayBody.d.ts +3 -0
  211. package/dist/replayBody.js +14 -0
  212. package/dist/request/taskRequest.d.ts +0 -1
  213. package/dist/request/taskRequest.js +0 -3
  214. package/dist/resumeRefusalCopy.d.ts +2 -1
  215. package/dist/resumeRefusalCopy.js +38 -2
  216. package/dist/retryStatus.d.ts +8 -0
  217. package/dist/retryStatus.js +106 -1
  218. package/dist/rewindArchiveCapability.d.ts +0 -4
  219. package/dist/rewindArchiveCapability.js +2 -10
  220. package/dist/rewindArchiveReading.d.ts +0 -1
  221. package/dist/rewindArchiveReading.js +0 -3
  222. package/dist/runCancelContext.d.ts +2 -1
  223. package/dist/runCancelContext.js +4 -2
  224. package/dist/runReattachPolicy.d.ts +31 -0
  225. package/dist/runReattachPolicy.js +46 -0
  226. package/dist/runTerminal.d.ts +3 -6
  227. package/dist/runTerminal.js +8 -9
  228. package/dist/sandboxWire.d.ts +3 -1
  229. package/dist/sandboxWire.js +76 -27
  230. package/dist/scenarioWire.js +1 -1
  231. package/dist/seam.d.ts +24 -2
  232. package/dist/seam.js +15 -3
  233. package/dist/seatContract.d.ts +53 -10
  234. package/dist/seatContract.js +132 -81
  235. package/dist/sessionPolicyCapability.d.ts +0 -4
  236. package/dist/sessionPolicyCapability.js +0 -6
  237. package/dist/sessionSyncFileHistoryCapability.d.ts +0 -3
  238. package/dist/sessionSyncFileHistoryCapability.js +0 -3
  239. package/dist/skillToolListsCapability.d.ts +0 -3
  240. package/dist/skillToolListsCapability.js +0 -3
  241. package/dist/sqlEngineCapability.d.ts +0 -4
  242. package/dist/sqlEngineCapability.js +0 -6
  243. package/dist/steerPriorityCapability.d.ts +0 -3
  244. package/dist/steerPriorityCapability.js +0 -3
  245. package/dist/streamDrainingLegs.d.ts +4 -0
  246. package/dist/streamDrainingLegs.js +6 -1
  247. package/dist/subagent/engineCompactWire.d.ts +0 -1
  248. package/dist/subagent/engineCompactWire.js +7 -5
  249. package/dist/subagent/engineTaskHandleWire.js +4 -7
  250. package/dist/subagentContentStore.js +1 -11
  251. package/dist/submitReopen.d.ts +24 -0
  252. package/dist/submitReopen.js +75 -0
  253. package/dist/terminalStatuses.d.ts +3 -0
  254. package/dist/terminalStatuses.js +10 -2
  255. package/dist/toolResult.d.ts +10 -1
  256. package/dist/toolResult.js +34 -6
  257. package/dist/toolRoster.d.ts +0 -2
  258. package/dist/toolRoster.js +0 -2
  259. package/dist/turnFailurePresentation.d.ts +28 -0
  260. package/dist/turnFailurePresentation.js +205 -0
  261. package/dist/userInvokedSkillsCapability.d.ts +0 -3
  262. package/dist/userInvokedSkillsCapability.js +0 -3
  263. package/dist/webSearchBackendCapability.d.ts +0 -4
  264. package/dist/webSearchBackendCapability.js +0 -6
  265. package/dist/wireErrorTriage.js +5 -24
  266. package/dist/wireFailureShape.d.ts +62 -5
  267. package/dist/wireFailureShape.js +105 -5
  268. package/dist/wireRefusalCopy.d.ts +12 -2
  269. package/dist/wireRefusalCopy.js +50 -52
  270. package/dist/workflowsJournalCapability.d.ts +0 -4
  271. package/dist/workflowsJournalCapability.js +0 -6
  272. package/dist/writeProtectionCapability.d.ts +0 -4
  273. package/dist/writeProtectionCapability.js +0 -6
  274. package/docs/INTEGRATION-CLIENTS.md +1253 -46
  275. package/package.json +5 -4
  276. package/dist/attachmentSeatCapability.d.ts +0 -12
  277. package/dist/attachmentSeatCapability.js +0 -23
  278. package/dist/hitl/approvalOutcomeNote.d.ts +0 -10
  279. package/dist/hitl/approvalOutcomeNote.js +0 -29
  280. package/dist/sessionReadRedactionCapability.d.ts +0 -13
  281. package/dist/sessionReadRedactionCapability.js +0 -35
@@ -8,6 +8,7 @@ export const CORE_ENGINE_NOTICE_CODES = Object.freeze([
8
8
  "config.read_face_deployment_clamped",
9
9
  "config.write_face_swapped",
10
10
  "config.write_face_deployment_clamped",
11
+ "config.read_deny_swapped",
11
12
  "config.tool_model_gate_removed",
12
13
  "config.tool_model_gate_unknown_class",
13
14
  "config.tool_model_gate_env_invalid",
@@ -85,10 +86,12 @@ export const CORE_ENGINE_NOTICE_CODES = Object.freeze([
85
86
  "skills.listing_truncated",
86
87
  "agents.listing_truncated",
87
88
  "tool_result.offload_put_failed",
89
+ "tool_result.media_refused",
88
90
  "instructions.source_changed",
89
91
  "session.records_skipped",
90
92
  "memory.layer_locked_legacy",
91
93
  "server.model_unreachable",
94
+ "permission.entry_mode_clamped",
92
95
  ]);
93
96
  export const CORE_NOTICE_AUDIENCE = Object.freeze({
94
97
  "config.autocompact_window_clamped": "operator",
@@ -100,6 +103,7 @@ export const CORE_NOTICE_AUDIENCE = Object.freeze({
100
103
  "config.read_face_deployment_clamped": "operator",
101
104
  "config.write_face_swapped": "operator",
102
105
  "config.write_face_deployment_clamped": "operator",
106
+ "config.read_deny_swapped": "operator",
103
107
  "config.tool_model_gate_removed": "operator",
104
108
  "config.tool_model_gate_unknown_class": "operator",
105
109
  "config.tool_model_gate_env_invalid": "operator",
@@ -177,10 +181,12 @@ export const CORE_NOTICE_AUDIENCE = Object.freeze({
177
181
  "skills.listing_truncated": "operator",
178
182
  "agents.listing_truncated": "operator",
179
183
  "tool_result.offload_put_failed": "operator",
184
+ "tool_result.media_refused": "operator",
180
185
  "instructions.source_changed": "user",
181
186
  "session.records_skipped": "user",
182
187
  "memory.layer_locked_legacy": "operator",
183
188
  "server.model_unreachable": "user",
189
+ "permission.entry_mode_clamped": "user",
184
190
  });
185
191
  export const CORE_MCP_INJECTION_DROP_REASONS = Object.freeze([
186
192
  "malformed_entry",
@@ -198,6 +204,7 @@ export const CORE_NOTICE_MINTER = Object.freeze({
198
204
  "config.read_face_deployment_clamped": "engine",
199
205
  "config.write_face_swapped": "engine",
200
206
  "config.write_face_deployment_clamped": "engine",
207
+ "config.read_deny_swapped": "engine",
201
208
  "config.tool_model_gate_removed": "engine",
202
209
  "config.tool_model_gate_unknown_class": "engine",
203
210
  "config.tool_model_gate_env_invalid": "engine",
@@ -275,10 +282,12 @@ export const CORE_NOTICE_MINTER = Object.freeze({
275
282
  "skills.listing_truncated": "engine",
276
283
  "agents.listing_truncated": "engine",
277
284
  "tool_result.offload_put_failed": "engine",
285
+ "tool_result.media_refused": "engine",
278
286
  "instructions.source_changed": "server",
279
287
  "session.records_skipped": "server",
280
288
  "memory.layer_locked_legacy": "server",
281
289
  "server.model_unreachable": "server",
290
+ "permission.entry_mode_clamped": "server",
282
291
  });
283
292
  export const CORE_USER_INPUT_UNDRAINED_CAUSES = Object.freeze([
284
293
  "leg_end",
@@ -1,2 +1,3 @@
1
1
  export declare const CORE_PROTOCOL_PREFIXES: readonly ["mcp__", "a2a__"];
2
2
  export declare const CORE_SKILL_TOOL_NAME: "Skill";
3
+ export declare const CORE_BOUND_GRANT_ABSENCES: readonly ["not_bindable", "unreadable"];
@@ -1,2 +1,3 @@
1
1
  export const CORE_PROTOCOL_PREFIXES = ["mcp__", "a2a__"];
2
2
  export const CORE_SKILL_TOOL_NAME = "Skill";
3
+ export const CORE_BOUND_GRANT_ABSENCES = ["not_bindable", "unreadable"];
@@ -11,10 +11,15 @@ export interface AllowRuleShadowedWireMember {
11
11
  readonly omitted?: number;
12
12
  }
13
13
  export interface ApprovalAllowRuleShadow {
14
- readonly source: 'allow_rule_shadowed' | 'legacy_shadowed_rule';
14
+ readonly source: 'allow_rule_shadowed';
15
15
  readonly members: readonly ApprovalAllowRuleShadowMember[];
16
16
  readonly unreadable?: true;
17
17
  }
18
+ export declare const RETIRED_SHADOW_EVIDENCE_LABEL: Readonly<{
19
+ readonly frame: "persistedRuleShadowed";
20
+ readonly row: "riskDescriptor.shadowedRule";
21
+ }>;
22
+ export declare function retiredAllowRuleShadowKeyPresent(carrier: object | null | undefined, leg: 'frame' | 'row'): boolean;
18
23
  export declare function readAllowRuleShadowFromWire(carrier: object | null | undefined, leg: 'frame' | 'row'): ApprovalAllowRuleShadow | undefined;
19
24
  export declare function readApprovalAllowRuleShadow(card: object | null | undefined): ApprovalAllowRuleShadow | undefined;
20
25
  export declare function approvalAllowRuleShadowed(card: object | null | undefined): boolean;
@@ -76,20 +76,27 @@ function readNewKeyValue(raw) {
76
76
  return unreadable();
77
77
  return Object.freeze({ source: 'allow_rule_shadowed', members: Object.freeze(members) });
78
78
  }
79
- function readLegacyValue(raw) {
80
- if (typeof raw !== 'string' || raw.trim() === '')
81
- return undefined;
82
- return Object.freeze({
83
- source: 'legacy_shadowed_rule',
84
- members: Object.freeze([freezeMember({ member: 'persisted', known: true, entries: Object.freeze([raw]) })]),
85
- });
86
- }
87
79
  function ownValue(v, key) {
88
80
  return Object.hasOwn(v, key) ? v[key] : undefined;
89
81
  }
90
82
  function keyValue(v, key) {
91
83
  return v[key];
92
84
  }
85
+ const RETIRED_SHADOW_KEY = Object.freeze({ frame: 'persistedRuleShadowed', row: 'shadowedRule' });
86
+ export const RETIRED_SHADOW_EVIDENCE_LABEL = Object.freeze({ frame: 'persistedRuleShadowed', row: 'riskDescriptor.shadowedRule' });
87
+ export function retiredAllowRuleShadowKeyPresent(carrier, leg) {
88
+ try {
89
+ if (typeof carrier !== 'object' || carrier === null)
90
+ return false;
91
+ const host = leg === 'row' ? keyValue(carrier, 'riskDescriptor') : carrier;
92
+ if (typeof host !== 'object' || host === null)
93
+ return false;
94
+ return RETIRED_SHADOW_KEY[leg] in host;
95
+ }
96
+ catch {
97
+ return true;
98
+ }
99
+ }
93
100
  function readMemberAt(arr, i) {
94
101
  const d = Object.getOwnPropertyDescriptor(arr, i);
95
102
  return d !== undefined && 'value' in d ? readMemberRecord(d.value) : freezeMember({ known: false, malformed: true });
@@ -105,10 +112,7 @@ export function readAllowRuleShadowFromWire(carrier, leg) {
105
112
  }
106
113
  if (host === undefined)
107
114
  return undefined;
108
- const fresh = readNewKeyValue(keyValue(host, 'allowRuleShadowed'));
109
- if (fresh !== undefined)
110
- return fresh;
111
- return readLegacyValue(keyValue(host, leg === 'row' ? 'shadowedRule' : 'persistedRuleShadowed'));
115
+ return readNewKeyValue(keyValue(host, 'allowRuleShadowed'));
112
116
  }
113
117
  catch {
114
118
  return unreadable();
@@ -119,7 +123,7 @@ function readStampedValue(raw) {
119
123
  return unreadable();
120
124
  const source = ownValue(raw, 'source');
121
125
  const members = ownValue(raw, 'members');
122
- if ((source !== 'allow_rule_shadowed' && source !== 'legacy_shadowed_rule') || !Array.isArray(members))
126
+ if (source !== 'allow_rule_shadowed' || !Array.isArray(members))
123
127
  return unreadable();
124
128
  const length = members.length;
125
129
  if (typeof length !== 'number' || !Number.isSafeInteger(length))
@@ -159,7 +163,7 @@ const ENTRY_MAX = 4096;
159
163
  const MEMBER_MAX = 64;
160
164
  const ENTRIES_SHOWN = 5;
161
165
  const UNREADABLE_LINE = 'An allow rule matched this call but cannot clear it; which rule could not be read, so this one is confirmed individually.';
162
- function legacySingleEntry(shadow) {
166
+ function singlePersistedEntry(shadow) {
163
167
  if (shadow.unreadable === true || shadow.members.length !== 1)
164
168
  return undefined;
165
169
  const m = shadow.members[0];
@@ -196,9 +200,9 @@ export function allowRuleShadowSentence(card) {
196
200
  try {
197
201
  if (shadow.unreadable === true || shadow.members.length === 0)
198
202
  return UNREADABLE_LINE;
199
- const legacy = legacySingleEntry(shadow);
200
- if (legacy !== undefined) {
201
- return `Your saved permission rule ${legacy} still exists — it just cannot clear this particular call, so this one is confirmed individually.`;
203
+ const single = singlePersistedEntry(shadow);
204
+ if (single !== undefined) {
205
+ return `Your saved permission rule ${single} still exists — it just cannot clear this particular call, so this one is confirmed individually.`;
202
206
  }
203
207
  return `Allow rules matched this call but cannot clear it, so this one is confirmed individually — ${shadow.members.map(memberPhrase).join(' · ')}.`;
204
208
  }
@@ -0,0 +1,15 @@
1
+ import type { ApprovalCardRequest } from './toolApprovalWire.js';
2
+ export declare function readRequiresRealApproval(carrier: object | null | undefined): boolean;
3
+ export interface ApprovalWindowKeys {
4
+ readonly expiresInMs?: number;
5
+ readonly expiresAtMs?: number;
6
+ readonly serverNowMs?: number;
7
+ readonly receivedAtMs?: number;
8
+ }
9
+ export interface ApprovalWindowReadOpts {
10
+ readonly windowIsCurrent?: boolean;
11
+ readonly receivedAtMs?: number;
12
+ readonly unknownShape?: boolean;
13
+ }
14
+ export declare function approvalWindowKeysOf(carrier: object | null | undefined, opts?: ApprovalWindowReadOpts | null): Readonly<ApprovalWindowKeys>;
15
+ export declare function probeCauseRowsOf(card: Pick<ApprovalCardRequest, 'probeCause'> | null | undefined): readonly string[] | undefined;
@@ -0,0 +1,154 @@
1
+ import { displayUntrusted } from '../displayUntrusted.js';
2
+ import { guardedRead, readOwnDataValue } from '../ownKey.js';
3
+ export function readRequiresRealApproval(carrier) {
4
+ if (typeof carrier !== 'object' || carrier === null)
5
+ return false;
6
+ let failed = false;
7
+ let failure;
8
+ try {
9
+ if (carrier.requiresRealApproval === true)
10
+ return true;
11
+ }
12
+ catch (e) {
13
+ failed = true;
14
+ failure = e;
15
+ }
16
+ try {
17
+ const risk = carrier.risk;
18
+ if (typeof risk === 'object' && risk !== null && risk.requiresRealApproval === true)
19
+ return true;
20
+ }
21
+ catch (e) {
22
+ if (!failed)
23
+ failure = e;
24
+ failed = true;
25
+ }
26
+ if (failed)
27
+ throw failure;
28
+ return false;
29
+ }
30
+ const EMPTY = Object.freeze({});
31
+ const UNKNOWN_SHAPE_COHERENCE_TOLERANCE_MS = 1_000;
32
+ function nonNegativeFinite(v) {
33
+ return typeof v === 'number' && Number.isFinite(v) && v >= 0 ? v : undefined;
34
+ }
35
+ export function approvalWindowKeysOf(carrier, opts) {
36
+ if (typeof carrier !== 'object' || carrier === null)
37
+ return EMPTY;
38
+ if (typeof opts !== 'object' || opts === null)
39
+ return EMPTY;
40
+ let current;
41
+ let anchor;
42
+ let unknownShape;
43
+ try {
44
+ current = opts.windowIsCurrent;
45
+ anchor = opts.receivedAtMs;
46
+ unknownShape = opts.unknownShape;
47
+ }
48
+ catch {
49
+ return EMPTY;
50
+ }
51
+ if (current !== true)
52
+ return EMPTY;
53
+ const read = (key) => {
54
+ try {
55
+ return nonNegativeFinite(carrier[key]);
56
+ }
57
+ catch {
58
+ return undefined;
59
+ }
60
+ };
61
+ const inMs = read('expiresInMs');
62
+ const atMs = read('expiresAtMs');
63
+ const nowMs = read('serverNowMs');
64
+ if (unknownShape === true) {
65
+ if (inMs === undefined || atMs === undefined || nowMs === undefined)
66
+ return EMPTY;
67
+ if (atMs <= 0 || nowMs <= 0)
68
+ return EMPTY;
69
+ if (Math.abs(inMs - Math.max(0, atMs - nowMs)) > UNKNOWN_SHAPE_COHERENCE_TOLERANCE_MS)
70
+ return EMPTY;
71
+ }
72
+ const receivedAtMs = nonNegativeFinite(anchor);
73
+ const out = {};
74
+ if (inMs !== undefined)
75
+ out.expiresInMs = inMs;
76
+ if (atMs !== undefined)
77
+ out.expiresAtMs = atMs;
78
+ if (nowMs !== undefined)
79
+ out.serverNowMs = nowMs;
80
+ if ((inMs !== undefined || atMs !== undefined) && receivedAtMs !== undefined)
81
+ out.receivedAtMs = receivedAtMs;
82
+ return Object.freeze(out);
83
+ }
84
+ const PROBE_CAUSE_SHOWN_MAX = 8;
85
+ const PROBE_CAUSE_ENTRY_MAX = 200;
86
+ function own(v, key) {
87
+ if (typeof v !== 'object' || v === null)
88
+ return undefined;
89
+ return guardedRead(() => readOwnDataValue(v, key));
90
+ }
91
+ function readOperands(v) {
92
+ if (typeof v !== 'object' || v === null)
93
+ return undefined;
94
+ const shown = own(v, 'shown');
95
+ const isList = guardedRead(() => Array.isArray(shown));
96
+ if (isList !== true)
97
+ return undefined;
98
+ const length = own(shown, 'length');
99
+ if (typeof length !== 'number' || !Number.isSafeInteger(length) || length < 0)
100
+ return undefined;
101
+ const items = [];
102
+ for (let i = 0; i < length; i++) {
103
+ const item = own(shown, String(i));
104
+ if (typeof item !== 'string')
105
+ return undefined;
106
+ items.push(item);
107
+ }
108
+ const total = own(v, 'total');
109
+ if (typeof total !== 'number' || !Number.isSafeInteger(total) || total < 0 || total < items.length)
110
+ return undefined;
111
+ return { shown: items, total };
112
+ }
113
+ function operandsText(label, o) {
114
+ const shown = o.shown.slice(0, PROBE_CAUSE_SHOWN_MAX).map((p) => displayUntrusted(p, { max: PROBE_CAUSE_ENTRY_MAX }));
115
+ if (shown.length === 0)
116
+ return `${label}: ${String(o.total)} total`;
117
+ const more = o.total - shown.length;
118
+ return more > 0 ? `${label}: ${shown.join(', ')} (+${String(more)} more)` : `${label}: ${shown.join(', ')}`;
119
+ }
120
+ export function probeCauseRowsOf(card) {
121
+ try {
122
+ if (typeof card !== 'object' || card === null)
123
+ return undefined;
124
+ const cause = own(card, 'probeCause');
125
+ if (typeof cause !== 'object' || cause === null)
126
+ return undefined;
127
+ if (guardedRead(() => Array.isArray(cause)) !== false)
128
+ return undefined;
129
+ const code = own(cause, 'code');
130
+ if (typeof code !== 'string' || code === '')
131
+ return undefined;
132
+ const roots = readOperands(own(cause, 'roots'));
133
+ if (roots === undefined)
134
+ return undefined;
135
+ let fd;
136
+ try {
137
+ fd = Object.getOwnPropertyDescriptor(cause, 'further');
138
+ }
139
+ catch {
140
+ return undefined;
141
+ }
142
+ if (fd === undefined || (Object.hasOwn(fd, 'value') && fd.value === undefined))
143
+ return Object.freeze([operandsText('roots', roots)]);
144
+ if (!Object.hasOwn(fd, 'value'))
145
+ return undefined;
146
+ const further = readOperands(fd.value);
147
+ if (further === undefined)
148
+ return undefined;
149
+ return Object.freeze([operandsText('roots', roots), operandsText('further', further)]);
150
+ }
151
+ catch {
152
+ return undefined;
153
+ }
154
+ }
@@ -0,0 +1,13 @@
1
+ import { type DenialLimitFallback } from './toolApprovalWire.js';
2
+ export declare const APPROVAL_CARD_REASON_SOURCES: readonly ["payload_unreadable", "prior_cards", "message", "mandated", "mandate", "origin", "denial_limit", "probe", "allow_rule_shadow", "classifier_no_ruling", "bound_grants", "more"];
3
+ export type ApprovalCardReasonSource = (typeof APPROVAL_CARD_REASON_SOURCES)[number];
4
+ export interface ApprovalCardReasonLine {
5
+ readonly source: ApprovalCardReasonSource;
6
+ readonly text: string;
7
+ }
8
+ export interface ApprovalCardReasonsOptions {
9
+ readonly maxLines?: number;
10
+ }
11
+ export declare const APPROVAL_CARD_REASONS_DEFAULT_MAX_LINES = 4;
12
+ export declare function denialLimitFallbackDetail(v: DenialLimitFallback | null | undefined): string | undefined;
13
+ export declare function approvalCardReasons(card: object | null | undefined, opts?: ApprovalCardReasonsOptions | null): readonly ApprovalCardReasonLine[];
@@ -0,0 +1,120 @@
1
+ import { displayUntrusted } from '../displayUntrusted.js';
2
+ import { approvalMandateDetail, askOriginNoteOf } from '../gateVocabulary.js';
3
+ import { readAskOrigin, readOwnDataValue, guardedRead } from '../ownKey.js';
4
+ import { allowRuleShadowSentence } from './allowRuleShadow.js';
5
+ import { mandatedApprovalDetailOf } from './automaticAnswerVerdict.js';
6
+ import { approvalBoundGrantsDetail, approvalIsMandated, approvalPriorCardsDetail, askProbeReasonDetail, classifierNoRulingDetail, readApprovalBoundGrants, readApprovalClassifierNoRuling, readApprovalMandate, readDenialLimitFallback, } from './toolApprovalWire.js';
7
+ export const APPROVAL_CARD_REASON_SOURCES = Object.freeze([
8
+ 'payload_unreadable',
9
+ 'prior_cards',
10
+ 'message',
11
+ 'mandated',
12
+ 'mandate',
13
+ 'origin',
14
+ 'denial_limit',
15
+ 'probe',
16
+ 'allow_rule_shadow',
17
+ 'classifier_no_ruling',
18
+ 'bound_grants',
19
+ 'more',
20
+ ]);
21
+ export const APPROVAL_CARD_REASONS_DEFAULT_MAX_LINES = 4;
22
+ const MESSAGE_DISPLAY_MAX = 300;
23
+ const PAYLOAD_UNREADABLE_DETAIL = 'This client cannot read the format of this approval card, so only its basic facts are shown — decide from those, or deny it if you are not sure what it will do.';
24
+ function moreDetail(n) {
25
+ return n === 1 ? '1 more reason for this card is not shown.' : `${String(n)} more reasons for this card are not shown.`;
26
+ }
27
+ export function denialLimitFallbackDetail(v) {
28
+ const d = readDenialLimitFallback(v);
29
+ if (d === undefined)
30
+ return undefined;
31
+ const parts = [
32
+ 'auto-deny limit reached — auto mode denied enough calls on its own that the engine now wants a real human decision',
33
+ `${String(d.consecutive)} consecutive / ${String(d.total)} total automatic denials so far`,
34
+ `the limit that tripped: ${displayUntrusted(d.limit, { max: 24 })}`,
35
+ ];
36
+ if (d.autoDenyAfterMs > 0)
37
+ parts.push(`the engine auto-denies it in ${String(Math.round(d.autoDenyAfterMs / 1000))}s if nobody answers`);
38
+ return parts.join('; ');
39
+ }
40
+ function ownData(card, key) {
41
+ return guardedRead(() => readOwnDataValue(card, key));
42
+ }
43
+ function readMaxLines(opts) {
44
+ const raw = typeof opts === 'object' && opts !== null ? guardedRead(() => readOwnDataValue(opts, 'maxLines')) : undefined;
45
+ return typeof raw === 'number' && Number.isSafeInteger(raw) && raw >= 1 ? raw : APPROVAL_CARD_REASONS_DEFAULT_MAX_LINES;
46
+ }
47
+ export function approvalCardReasons(card, opts) {
48
+ if (typeof card !== 'object' || card === null)
49
+ return Object.freeze([]);
50
+ const raw = [];
51
+ const add = (source, read) => {
52
+ let text;
53
+ try {
54
+ text = read();
55
+ }
56
+ catch {
57
+ text = undefined;
58
+ }
59
+ raw.push({ source, text });
60
+ };
61
+ let denialLimitReadable = false;
62
+ try {
63
+ denialLimitReadable = readDenialLimitFallback(ownData(card, 'denialLimitFallback')) !== undefined;
64
+ }
65
+ catch {
66
+ denialLimitReadable = false;
67
+ }
68
+ add('payload_unreadable', () => (ownData(card, 'cardPayloadUnreadable') === true ? PAYLOAD_UNREADABLE_DETAIL : undefined));
69
+ add('prior_cards', () => approvalPriorCardsDetail(card));
70
+ add('message', () => {
71
+ const msg = ownData(card, 'message');
72
+ if (typeof msg !== 'string' || msg.trim() === '')
73
+ return undefined;
74
+ const tool = ownData(card, 'toolName');
75
+ if (typeof tool === 'string' && msg.trim() === `approval required for "${tool}"`)
76
+ return undefined;
77
+ return displayUntrusted(msg, { max: MESSAGE_DISPLAY_MAX });
78
+ });
79
+ add('mandated', () => (approvalIsMandated(card) ? mandatedApprovalDetailOf(card) : undefined));
80
+ add('mandate', () => {
81
+ const word = readApprovalMandate(card);
82
+ return word !== undefined ? approvalMandateDetail(word) : undefined;
83
+ });
84
+ add('origin', () => {
85
+ const origin = readAskOrigin(card);
86
+ if (origin === undefined)
87
+ return undefined;
88
+ if (origin === 'denial_limit_fallback' && denialLimitReadable)
89
+ return undefined;
90
+ return askOriginNoteOf(origin);
91
+ });
92
+ add('denial_limit', () => denialLimitFallbackDetail(ownData(card, 'denialLimitFallback')));
93
+ add('probe', () => askProbeReasonDetail(card));
94
+ add('allow_rule_shadow', () => allowRuleShadowSentence(card));
95
+ add('classifier_no_ruling', () => {
96
+ const word = readApprovalClassifierNoRuling(card);
97
+ return word !== undefined ? classifierNoRulingDetail(word) : undefined;
98
+ });
99
+ add('bound_grants', () => {
100
+ const grants = readApprovalBoundGrants(card);
101
+ return grants !== undefined ? approvalBoundGrantsDetail(grants) : undefined;
102
+ });
103
+ const seen = new Set();
104
+ const lines = [];
105
+ for (const r of raw) {
106
+ if (r.text === undefined)
107
+ continue;
108
+ const text = displayUntrusted(r.text);
109
+ if (text === '' || seen.has(text))
110
+ continue;
111
+ seen.add(text);
112
+ lines.push(Object.freeze({ source: r.source, text }));
113
+ }
114
+ const max = readMaxLines(opts);
115
+ if (lines.length <= max)
116
+ return Object.freeze(lines);
117
+ const kept = lines.slice(0, max - 1);
118
+ kept.push(Object.freeze({ source: 'more', text: moreDetail(lines.length - kept.length) }));
119
+ return Object.freeze(kept);
120
+ }
@@ -1,15 +1,18 @@
1
- import type { ApprovalHolderIdentity, FsApprovalOutcome, ToolApprovalFrameOutcome } from './toolApprovalWire.js';
1
+ import type { ApprovalHolderIdentity } from './toolApprovalWire.js';
2
+ import type { ApprovalResolution, ApprovalResolutionLane } from './approvalResolution.js';
2
3
  export declare const APPROVAL_SETTLED_HOWS: readonly ["answered", "interrupted", "closed_by_engine"];
3
4
  export type ApprovalSettledHow = (typeof APPROVAL_SETTLED_HOWS)[number];
4
5
  export declare const SETTLED_APPROVALS_MAX_ENTRIES = 4096;
5
6
  export interface SettledApprovalEntry {
6
7
  readonly how: ApprovalSettledHow;
7
8
  readonly parked: boolean;
8
- readonly outcome: ToolApprovalFrameOutcome;
9
+ readonly outcome: ApprovalResolution;
9
10
  }
10
11
  export interface DurableDecisionHold {
11
12
  readonly lane: 'durable';
12
- readonly outcome: Promise<FsApprovalOutcome>;
13
+ readonly identity: HoldIdentity;
14
+ phase: 'card' | 'respond';
15
+ readonly outcome: Promise<ApprovalResolution>;
13
16
  presented: boolean;
14
17
  readonly interrupt: () => void;
15
18
  readonly cardSignal: AbortSignal;
@@ -18,7 +21,7 @@ export interface DurableDecisionHold {
18
21
  export interface LiveCardHold {
19
22
  readonly lane: 'live';
20
23
  readonly identity: LiveCardIdentity;
21
- readonly outcome: Promise<ToolApprovalFrameOutcome>;
24
+ readonly outcome: Promise<ApprovalResolution>;
22
25
  phase: 'card' | 'respond';
23
26
  superseded?: {
24
27
  readonly parked: boolean;
@@ -27,17 +30,45 @@ export interface LiveCardHold {
27
30
  readonly interrupt: () => void;
28
31
  trailing?: Promise<boolean>;
29
32
  }
30
- export type ApprovalHold = DurableDecisionHold | LiveCardHold;
31
- export interface LiveCardIdentity {
33
+ export interface HostCardHold {
34
+ readonly lane: 'host';
35
+ readonly identity: HoldIdentity;
36
+ phase: 'card' | 'respond';
37
+ readonly released: Promise<'answered' | 'interrupted' | undefined>;
38
+ }
39
+ export type ApprovalHold = DurableDecisionHold | LiveCardHold | HostCardHold;
40
+ export interface LiveCardIdentity extends HoldIdentity {
32
41
  readonly approvalId: string;
33
- readonly toolCallId?: string;
34
- readonly taskId?: string;
35
- readonly sessionId?: string;
36
42
  }
37
- export declare function liveCardHoldFor(who: ApprovalHolderIdentity): LiveCardHold | undefined;
43
+ export interface HoldIdentity extends ApprovalHolderIdentity {
44
+ readonly askSig?: string;
45
+ }
46
+ export declare function approvalHoldFor(who: HoldIdentity, except?: (h: ApprovalHold) => boolean): ApprovalHold | undefined;
38
47
  export declare function settledForDurableLane(entry: SettledApprovalEntry | undefined): boolean;
39
- export declare function liveCardAnsweredHow(o: ToolApprovalFrameOutcome): 'answered' | 'interrupted' | undefined;
40
- export declare function awaitLiveCardHolder(hold: LiveCardHold, signal: AbortSignal | undefined): Promise<ToolApprovalFrameOutcome | undefined>;
48
+ export declare function liveCardAnsweredHow(r: ApprovalResolution): 'answered' | 'interrupted' | undefined;
49
+ export type ApprovalHolderWait = {
50
+ readonly kind: 'settled';
51
+ readonly how: 'answered' | 'interrupted';
52
+ readonly outcome: ApprovalResolution;
53
+ } | {
54
+ readonly kind: 'free';
55
+ } | {
56
+ readonly kind: 'left';
57
+ };
58
+ export declare function awaitApprovalHolder(hold: ApprovalHold, signal: AbortSignal | undefined, asker: ApprovalResolutionLane): Promise<ApprovalHolderWait>;
59
+ export interface HostApprovalCardHold {
60
+ readonly identity: ApprovalHolderIdentity;
61
+ sending(): void;
62
+ release(settled?: 'answered' | 'interrupted'): void;
63
+ }
64
+ export type ApprovalCardClaim = {
65
+ readonly kind: 'held';
66
+ readonly hold: HostApprovalCardHold;
67
+ } | {
68
+ readonly kind: 'joined';
69
+ readonly outcome: ApprovalResolution;
70
+ };
71
+ export declare function claimApprovalCardFor(who: HoldIdentity, signal: AbortSignal | undefined): Promise<ApprovalCardClaim>;
41
72
  export interface ApprovalDecisionHoldTable {
42
73
  readonly inFlight: Map<string, ApprovalHold>;
43
74
  readonly settled: Map<string, DurableSettledHold>;
@@ -54,8 +85,9 @@ export declare function settledApprovalOf(approvalId: string | undefined): Settl
54
85
  export declare function clearSettledApprovals(): void;
55
86
  export declare function anyApprovalSettled(): boolean;
56
87
  export declare function noteEngineClosedApproval(approvalId: string, parked: boolean): void;
57
- export declare function settledLiveCardOutcome(approvalId: string): ToolApprovalFrameOutcome | undefined;
88
+ export declare function noteHolderSettledApproval(approvalId: string, how: 'answered' | 'interrupted', outcome: ApprovalResolution): void;
89
+ export declare function settledLiveCardOutcome(approvalId: string): ApprovalResolution | undefined;
58
90
  export declare function liveCardHoldOf(key: string): LiveCardHold | undefined;
59
- export declare function holdLiveCard(identity: LiveCardIdentity, callerSignal: AbortSignal | undefined, present: (hold: LiveCardHold) => Promise<ToolApprovalFrameOutcome>): Promise<ToolApprovalFrameOutcome>;
60
- export declare function joinLiveCard(hold: LiveCardHold, signal: AbortSignal | undefined): Promise<ToolApprovalFrameOutcome>;
91
+ export declare function holdLiveCard(identity: LiveCardIdentity, callerSignal: AbortSignal | undefined, present: (hold: LiveCardHold) => Promise<ApprovalResolution>): Promise<ApprovalResolution>;
92
+ export declare function joinLiveCard(hold: LiveCardHold, signal: AbortSignal | undefined): Promise<ApprovalResolution>;
61
93
  export declare function supersedeLiveCard(key: string, parked: boolean): boolean;