@sema-agent/client-core 0.109.0 → 0.111.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 (236) hide show
  1. package/CHANGELOG.md +342 -0
  2. package/README.md +88 -32
  3. package/dist/abortableSleep.d.ts +7 -0
  4. package/dist/abortableSleep.js +37 -0
  5. package/dist/adapt/arms.js +45 -11
  6. package/dist/adapt/toolCards.d.ts +3 -1
  7. package/dist/adapt/toolCards.js +4 -2
  8. package/dist/adapter/activeRunSelfHeal.d.ts +39 -0
  9. package/dist/adapter/activeRunSelfHeal.js +171 -3
  10. package/dist/adapter/downstream/eventToSdkMessage.js +20 -15
  11. package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -0
  12. package/dist/adapter/downstream/terminalToSdkResult.js +11 -0
  13. package/dist/adapter/runStream.d.ts +5 -0
  14. package/dist/adapter/runStream.js +15 -3
  15. package/dist/attachmentRoute.d.ts +20 -0
  16. package/dist/attachmentRoute.js +39 -0
  17. package/dist/attachmentsWireCaps.js +1 -1
  18. package/dist/builtinOutputStyles.d.ts +12 -0
  19. package/dist/builtinOutputStyles.js +147 -0
  20. package/dist/compactionStatus.d.ts +9 -0
  21. package/dist/compactionStatus.js +29 -5
  22. package/dist/controlRouter.js +2 -1
  23. package/dist/coreValuePorts.d.ts +39 -1
  24. package/dist/coreValuePorts.js +10 -0
  25. package/dist/declared/supportFloorDeclared.js +1 -1
  26. package/dist/displayUntrusted.d.ts +1 -0
  27. package/dist/displayUntrusted.js +138 -14
  28. package/dist/engineErrorCodes.d.ts +3 -0
  29. package/dist/engineErrorCodes.js +3 -0
  30. package/dist/engineHealthFacts.d.ts +20 -0
  31. package/dist/engineHealthFacts.js +42 -1
  32. package/dist/engineHealthProbeVerdict.d.ts +23 -0
  33. package/dist/engineHealthProbeVerdict.js +115 -0
  34. package/dist/engineInlineTaskStats.d.ts +4 -3
  35. package/dist/engineInlineTaskStats.js +18 -2
  36. package/dist/engineNoticeCodes.d.ts +10 -0
  37. package/dist/engineNoticeCodes.js +36 -6
  38. package/dist/engineRepoint.d.ts +147 -0
  39. package/dist/engineRepoint.js +310 -0
  40. package/dist/engineRowRef.d.ts +3 -0
  41. package/dist/engineRowRef.js +13 -1
  42. package/dist/engineSessionMessages.d.ts +2 -1
  43. package/dist/engineSessionMessages.js +5 -0
  44. package/dist/engineSwapCrossing.d.ts +57 -0
  45. package/dist/engineSwapCrossing.js +297 -0
  46. package/dist/engineUnavailable.d.ts +44 -0
  47. package/dist/engineUnavailable.js +492 -0
  48. package/dist/errorSupplementRoles.js +2 -1
  49. package/dist/eventLeg.js +3 -3
  50. package/dist/fleet/fleetProjection.js +3 -2
  51. package/dist/generated/engineFactTables.d.ts +2 -0
  52. package/dist/generated/engineFactTables.js +12 -0
  53. package/dist/generated/sdkFactTables.d.ts +2 -1
  54. package/dist/generated/sdkFactTables.js +5 -0
  55. package/dist/generated/settingsSchemaTables.d.ts +4 -0
  56. package/dist/generated/settingsSchemaTables.js +1 -0
  57. package/dist/hitl/approvalAskers.d.ts +6 -0
  58. package/dist/hitl/approvalAskers.js +30 -0
  59. package/dist/hitl/approvalCardReasons.js +6 -3
  60. package/dist/hitl/approvalDelivery.d.ts +1 -0
  61. package/dist/hitl/approvalDelivery.js +1 -1
  62. package/dist/hitl/approvalRequestFrameReading.d.ts +7 -0
  63. package/dist/hitl/approvalRequestFrameReading.js +11 -0
  64. package/dist/hitl/approvalResolution.d.ts +9 -2
  65. package/dist/hitl/approvalResolution.js +6 -1
  66. package/dist/hitl/askGateWire.js +5 -8
  67. package/dist/hitl/automaticAnswerVerdict.js +2 -2
  68. package/dist/hitl/decisionConflict.js +6 -3
  69. package/dist/hitl/decisionRefusal.d.ts +2 -0
  70. package/dist/hitl/decisionRefusal.js +8 -8
  71. package/dist/hitl/decisionRefusalCarrier.d.ts +3 -0
  72. package/dist/hitl/decisionRefusalCarrier.js +348 -0
  73. package/dist/hitl/decisionSend.d.ts +10 -0
  74. package/dist/hitl/decisionSend.js +57 -17
  75. package/dist/hitl/editedApprovalAcceptance.d.ts +25 -0
  76. package/dist/hitl/editedApprovalAcceptance.js +26 -0
  77. package/dist/hitl/elicitationRefusal.d.ts +4 -0
  78. package/dist/hitl/elicitationRefusal.js +23 -0
  79. package/dist/hitl/frameRouter.d.ts +2 -2
  80. package/dist/hitl/frameRouter.js +12 -33
  81. package/dist/hitl/gateIdentity.d.ts +5 -0
  82. package/dist/hitl/gateIdentity.js +23 -0
  83. package/dist/hitl/gateLedger.d.ts +0 -4
  84. package/dist/hitl/gateLedger.js +0 -19
  85. package/dist/hitl/hitlBridge.d.ts +7 -0
  86. package/dist/hitl/hitlBridge.js +14 -8
  87. package/dist/hitl/hitlHostSurface.d.ts +3 -1
  88. package/dist/hitl/hitlHostSurface.js +14 -4
  89. package/dist/hitl/hostWithdrawal.d.ts +15 -0
  90. package/dist/hitl/hostWithdrawal.js +38 -0
  91. package/dist/hitl/localAllowRedemption.d.ts +67 -0
  92. package/dist/hitl/localAllowRedemption.js +256 -0
  93. package/dist/hitl/parkResolver.js +32 -13
  94. package/dist/hitl/persistedRulesWire.d.ts +16 -0
  95. package/dist/hitl/persistedRulesWire.js +72 -2
  96. package/dist/hitl/planReviewWire.d.ts +3 -0
  97. package/dist/hitl/planReviewWire.js +37 -10
  98. package/dist/hitl/policyDenyCause.d.ts +1 -1
  99. package/dist/hitl/policyDenyCause.js +1 -1
  100. package/dist/hitl/resumeRunningCard.d.ts +1 -0
  101. package/dist/hitl/resumeRunningCard.js +1 -0
  102. package/dist/hitl/screenCardCarriers.d.ts +15 -0
  103. package/dist/hitl/screenCardCarriers.js +41 -0
  104. package/dist/hitl/screenDecisionCards.d.ts +98 -0
  105. package/dist/hitl/screenDecisionCards.js +362 -0
  106. package/dist/hitl/sessionPolicyWire.js +6 -4
  107. package/dist/hitl/standingRows.d.ts +4 -1
  108. package/dist/hitl/standingRows.js +33 -1
  109. package/dist/hitl/toolApprovalWire.d.ts +64 -15
  110. package/dist/hitl/toolApprovalWire.js +470 -125
  111. package/dist/hooksWireCaps.js +31 -1
  112. package/dist/hostSettingNoticeArm.d.ts +3 -0
  113. package/dist/hostSettingNoticeArm.js +12 -0
  114. package/dist/hostTurnSettings.d.ts +13 -4
  115. package/dist/hostTurnSettings.js +150 -10
  116. package/dist/humanTurnRead.js +11 -1
  117. package/dist/i18n/messages.en.d.ts +212 -0
  118. package/dist/i18n/messages.en.js +217 -5
  119. package/dist/i18n/messages.zh.js +235 -5
  120. package/dist/i18n/translate.d.ts +3 -0
  121. package/dist/i18n/translate.js +78 -10
  122. package/dist/i18n/zh.d.ts +1 -0
  123. package/dist/i18n/zh.js +1 -0
  124. package/dist/index.d.ts +56 -16
  125. package/dist/index.js +40 -12
  126. package/dist/inheritEnvCapability.js +2 -0
  127. package/dist/inputAuthor.d.ts +16 -0
  128. package/dist/inputAuthor.js +44 -0
  129. package/dist/interactiveHalt.js +2 -1
  130. package/dist/interactiveInterrupt.js +20 -2
  131. package/dist/interruptRefusalNote.d.ts +2 -0
  132. package/dist/interruptRefusalNote.js +17 -0
  133. package/dist/liveModelCatalog.d.ts +2 -0
  134. package/dist/liveModelCatalog.js +23 -9
  135. package/dist/liveQuestionStore.d.ts +4 -1
  136. package/dist/liveQuestionStore.js +12 -3
  137. package/dist/localEngineSeatReading.d.ts +2 -2
  138. package/dist/localEngineSeatReading.js +5 -3
  139. package/dist/localEngineSpawn.d.ts +0 -7
  140. package/dist/localEngineSpawn.js +0 -92
  141. package/dist/localEngineStep.d.ts +2 -2
  142. package/dist/localEngineStep.js +2 -0
  143. package/dist/mcpEngineLeg.d.ts +3 -0
  144. package/dist/mcpEngineLeg.js +38 -1
  145. package/dist/mcpPanel.js +2 -0
  146. package/dist/mcpReconnect.d.ts +9 -1
  147. package/dist/mcpReconnect.js +124 -19
  148. package/dist/mcpWireCaps.js +1 -1
  149. package/dist/model/engineModelWords.d.ts +3 -0
  150. package/dist/model/engineModelWords.js +13 -0
  151. package/dist/model/subagentModelWord.d.ts +21 -2
  152. package/dist/model/subagentModelWord.js +100 -29
  153. package/dist/modelCapabilityProbe.js +7 -43
  154. package/dist/modsFace.d.ts +8 -1
  155. package/dist/modsFace.js +27 -0
  156. package/dist/notifications.d.ts +36 -6
  157. package/dist/notifications.js +170 -20
  158. package/dist/ownKey.d.ts +6 -5
  159. package/dist/ownKey.js +31 -7
  160. package/dist/peerFrames.d.ts +40 -2
  161. package/dist/peerFrames.js +158 -3
  162. package/dist/pendingUserRow.d.ts +4 -0
  163. package/dist/pendingUserRow.js +16 -0
  164. package/dist/permissionsDeclaration.d.ts +1 -0
  165. package/dist/permissionsDeclaration.js +11 -1
  166. package/dist/planReviewCardFacts.d.ts +3 -0
  167. package/dist/planReviewCardFacts.js +52 -2
  168. package/dist/pluginHooksWire.d.ts +10 -1
  169. package/dist/pluginHooksWire.js +96 -7
  170. package/dist/printToolResultFrame.js +4 -2
  171. package/dist/promptBlockedCopy.js +11 -6
  172. package/dist/promptSuggestionBatch.d.ts +7 -0
  173. package/dist/promptSuggestionBatch.js +9 -0
  174. package/dist/promptSuggestionsTail.d.ts +39 -0
  175. package/dist/promptSuggestionsTail.js +116 -0
  176. package/dist/replayBody.js +10 -2
  177. package/dist/request/taskRequest.d.ts +5 -0
  178. package/dist/request/taskRequest.js +142 -21
  179. package/dist/requestCoordinate.d.ts +1 -0
  180. package/dist/requestCoordinate.js +13 -0
  181. package/dist/resumeRefusalCopy.d.ts +1 -3
  182. package/dist/resumeRefusalCopy.js +2 -1
  183. package/dist/retryStatus.d.ts +2 -2
  184. package/dist/retryStatus.js +2 -0
  185. package/dist/rewindArchiveReading.js +4 -4
  186. package/dist/runCancelContext.d.ts +2 -1
  187. package/dist/runCancelContext.js +1 -0
  188. package/dist/runPermissionModeSwitch.js +2 -2
  189. package/dist/scenarioRefusal.js +11 -13
  190. package/dist/scenarioSkills.js +11 -6
  191. package/dist/seam.d.ts +27 -2
  192. package/dist/seam.js +17 -1
  193. package/dist/seatContract.d.ts +189 -12
  194. package/dist/seatContract.js +401 -9
  195. package/dist/sessionBackground.js +2 -1
  196. package/dist/sessionBackgroundHandoff.js +2 -1
  197. package/dist/sessionCostReading.d.ts +70 -0
  198. package/dist/sessionCostReading.js +150 -0
  199. package/dist/sessionEngine.d.ts +2 -0
  200. package/dist/sessionEngine.js +111 -0
  201. package/dist/sessionHooksRoster.d.ts +4 -0
  202. package/dist/sessionHooksRoster.js +158 -0
  203. package/dist/sessionMemoryStatus.d.ts +2 -1
  204. package/dist/sessionMemoryStatus.js +2 -2
  205. package/dist/sessionReadRedaction.d.ts +7 -0
  206. package/dist/sessionReadRedaction.js +26 -0
  207. package/dist/sessionSyncFileHistory.d.ts +4 -0
  208. package/dist/sessionSyncFileHistory.js +27 -0
  209. package/dist/settingsHooksSalvage.js +2 -1
  210. package/dist/sseIdleTriage.d.ts +13 -1
  211. package/dist/sseIdleTriage.js +25 -6
  212. package/dist/storeDurabilityWord.d.ts +15 -0
  213. package/dist/storeDurabilityWord.js +18 -0
  214. package/dist/storePostureCapability.d.ts +7 -3
  215. package/dist/storePostureCapability.js +69 -39
  216. package/dist/subagent/engineSubagentResume.js +2 -2
  217. package/dist/subagent/engineSubagentTail.js +8 -1
  218. package/dist/subagentContentStore.d.ts +11 -0
  219. package/dist/subagentContentStore.js +28 -2
  220. package/dist/terminalStatuses.d.ts +1 -0
  221. package/dist/terminalStatuses.js +4 -1
  222. package/dist/toolResult.d.ts +1 -0
  223. package/dist/toolResult.js +2 -0
  224. package/dist/turnFailurePresentation.js +9 -2
  225. package/dist/typePins.d.ts +11 -0
  226. package/dist/usageAnalytics.d.ts +17 -0
  227. package/dist/usageAnalytics.js +44 -2
  228. package/dist/userAttachmentEnvelope.d.ts +2 -1
  229. package/dist/userAttachmentEnvelope.js +10 -0
  230. package/dist/wireErrorTriage.js +2 -1
  231. package/dist/wireFailureShape.d.ts +6 -5
  232. package/dist/wireFailureShape.js +150 -38
  233. package/dist/wireRefusalCopy.d.ts +16 -5
  234. package/dist/wireRefusalCopy.js +119 -86
  235. package/docs/INTEGRATION-CLIENTS.md +4228 -21
  236. package/package.json +7 -3
@@ -0,0 +1,348 @@
1
+ import { isSecretKeyName } from '../seatContract.js';
2
+ import { placeThrownExtraOnCopy, wireFailureCoreOf, wireFailureTextsOf } from '../wireFailureShape.js';
3
+ import { decideFailureNote } from '../decideFailureNote.js';
4
+ import { REFUSAL_ROUTES, classifyDecisionRefusal, decisionRefusalAskReading, decisionRefusalSaysAskGone, mintDecisionRefusalReading, readDecisionRefusalReading, } from './decisionRefusal.js';
5
+ import { decisionConflictOf } from './decisionConflict.js';
6
+ import { resumeReopenFromError } from './suspendedReopen.js';
7
+ import { askGoneFromError, decideParkMovedFromError, decideRefusalFromError, decideRequiresBindingFromError } from '../decideReceipt.js';
8
+ import { corruptStoredRowWhere, resumeRetryLaterFromError, scenarioDenyFromError } from '../wireErrorTriage.js';
9
+ import { checkpointUnsupportedVersionFromError, parkedResumeStartupFromError, refusedParkFromError, requireExistingSessionRefusalFromError, resumeContextUnavailableFromError, resumePolicyBlockFromError, resumeRefusalFromError, } from '../resumeRefusalCopy.js';
10
+ import { admissionWallRefusalFromError, autonomyLaneRefusalFromError, bodyShapeRefusalFromError, cancelConflictFromError, denyAttributionRefusalFromError, envCredentialRefusalFromError, fieldLimitRefusalFromError, fleetLeaseUnavailableFromError, hostPostureRefusalFromError, quotaExhaustedFromError, runConcurrencyCapFromError, sessionArchiveStampedFromError, sessionDeleteConflictFromError, sessionIdRetiredFromError, settingsHooksRefusalFromError, toolDeclarationRefusalFromError, unreadRequestMembersFromError, unsupportedRuleRefusalFromError, usageWindowExhaustedFromError, userAttachmentRefusalFromError, userInvokedSkillRefusalFromError, } from '../wireRefusalCopy.js';
11
+ import { scenarioRefusalFromError } from '../scenarioRefusal.js';
12
+ import { inheritEnvRefusalFromError } from '../inheritEnvWire.js';
13
+ const DECISION_WORDS = { approve: true, deny: true };
14
+ const DECISIONS = Object.freeze([undefined, ...Object.keys(DECISION_WORDS)]);
15
+ const CONTEXTS = Object.freeze([undefined, ...REFUSAL_ROUTES.map((route) => Object.freeze({ route }))]);
16
+ const READERS = Object.freeze({
17
+ classifyDecisionRefusal: (e) => CONTEXTS.map((c) => classifyDecisionRefusal(e, c)),
18
+ readDecisionRefusalReading: (e) => CONTEXTS.map((c) => readDecisionRefusalReading(e, c)),
19
+ mintDecisionRefusalReading: (e) => [mintDecisionRefusalReading(e, undefined, true), mintDecisionRefusalReading(e, undefined, false)],
20
+ decisionRefusalAskReading: (e) => decisionRefusalAskReading(e),
21
+ decisionRefusalSaysAskGone: (e) => decisionRefusalSaysAskGone(e),
22
+ decideFailureNote: (e) => DECISIONS.map((d) => decideFailureNote(e, d)),
23
+ decisionConflictOf: (e) => decisionConflictOf(e),
24
+ corruptStoredRowWhere: (e) => corruptStoredRowWhere(e),
25
+ wireFailureCoreOf: (e) => wireFailureCoreOf(e),
26
+ wireFailureTextsOf: (e) => wireFailureTextsOf(e).reason,
27
+ admissionWallRefusalFromError: (e) => admissionWallRefusalFromError(e),
28
+ askGoneFromError: (e) => askGoneFromError(e),
29
+ autonomyLaneRefusalFromError: (e) => autonomyLaneRefusalFromError(e),
30
+ bodyShapeRefusalFromError: (e) => bodyShapeRefusalFromError(e),
31
+ cancelConflictFromError: (e) => cancelConflictFromError(e),
32
+ checkpointUnsupportedVersionFromError: (e) => checkpointUnsupportedVersionFromError(e),
33
+ decideParkMovedFromError: (e) => decideParkMovedFromError(e),
34
+ decideRefusalFromError: (e) => decideRefusalFromError(e),
35
+ decideRequiresBindingFromError: (e) => decideRequiresBindingFromError(e),
36
+ denyAttributionRefusalFromError: (e) => [denyAttributionRefusalFromError(e, true), denyAttributionRefusalFromError(e, false)],
37
+ envCredentialRefusalFromError: (e) => envCredentialRefusalFromError(e),
38
+ fieldLimitRefusalFromError: (e) => fieldLimitRefusalFromError(e),
39
+ fleetLeaseUnavailableFromError: (e) => fleetLeaseUnavailableFromError(e),
40
+ hostPostureRefusalFromError: (e) => hostPostureRefusalFromError(e, undefined),
41
+ inheritEnvRefusalFromError: (e) => inheritEnvRefusalFromError(e, undefined),
42
+ parkedResumeStartupFromError: (e) => DECISIONS.map((d) => parkedResumeStartupFromError(e, d)),
43
+ quotaExhaustedFromError: (e) => quotaExhaustedFromError(e),
44
+ refusedParkFromError: (e) => refusedParkFromError(e),
45
+ requireExistingSessionRefusalFromError: (e) => requireExistingSessionRefusalFromError(e),
46
+ resumeContextUnavailableFromError: (e) => resumeContextUnavailableFromError(e),
47
+ resumePolicyBlockFromError: (e) => resumePolicyBlockFromError(e),
48
+ resumeRefusalFromError: (e) => resumeRefusalFromError(e),
49
+ resumeReopenFromError: (e) => resumeReopenFromError(e),
50
+ resumeRetryLaterFromError: (e) => resumeRetryLaterFromError(e),
51
+ runConcurrencyCapFromError: (e) => runConcurrencyCapFromError(e),
52
+ scenarioDenyFromError: (e) => scenarioDenyFromError(e),
53
+ scenarioRefusalFromError: (e) => scenarioRefusalFromError(e),
54
+ sessionArchiveStampedFromError: (e) => sessionArchiveStampedFromError(e),
55
+ sessionDeleteConflictFromError: (e) => sessionDeleteConflictFromError(e),
56
+ sessionIdRetiredFromError: (e) => sessionIdRetiredFromError(e),
57
+ settingsHooksRefusalFromError: (e) => settingsHooksRefusalFromError(e),
58
+ toolDeclarationRefusalFromError: (e) => toolDeclarationRefusalFromError(e),
59
+ unreadRequestMembersFromError: (e) => unreadRequestMembersFromError(e),
60
+ unsupportedRuleRefusalFromError: (e) => unsupportedRuleRefusalFromError(e),
61
+ usageWindowExhaustedFromError: (e) => usageWindowExhaustedFromError(e),
62
+ userAttachmentRefusalFromError: (e) => userAttachmentRefusalFromError(e),
63
+ userInvokedSkillRefusalFromError: (e) => userInvokedSkillRefusalFromError(e),
64
+ });
65
+ export function decisionRefusalCarrierReaderNames() {
66
+ return Object.freeze(Object.keys(READERS));
67
+ }
68
+ const COPY_DEPTH_MAX = 16;
69
+ const COPY_NODES_MAX = 4096;
70
+ const COPY_KEYS_MAX = 1024;
71
+ const SKIP = Symbol('carrier-skip');
72
+ function ownDataDescriptor(o, k) {
73
+ try {
74
+ const d = Reflect.getOwnPropertyDescriptor(o, k);
75
+ return d !== undefined && Object.hasOwn(d, 'value') ? { value: d.value } : undefined;
76
+ }
77
+ catch {
78
+ return undefined;
79
+ }
80
+ }
81
+ function copyOf(v, depth, run) {
82
+ if (v === null || v === undefined || typeof v === 'string' || typeof v === 'boolean' || typeof v === 'number')
83
+ return v;
84
+ if (typeof v !== 'object' && typeof v !== 'function')
85
+ return SKIP;
86
+ const o = v;
87
+ if (depth > COPY_DEPTH_MAX || run.nodes >= COPY_NODES_MAX || run.path.has(o))
88
+ return SKIP;
89
+ run.nodes += 1;
90
+ run.path.add(o);
91
+ try {
92
+ let isArray;
93
+ try {
94
+ isArray = Array.isArray(o);
95
+ }
96
+ catch {
97
+ return SKIP;
98
+ }
99
+ if (isArray) {
100
+ const len = ownDataDescriptor(o, 'length')?.value;
101
+ if (typeof len !== 'number' || !Number.isInteger(len) || len < 0 || len > COPY_KEYS_MAX)
102
+ return SKIP;
103
+ const out = new Array(len);
104
+ for (let i = 0; i < len; i += 1) {
105
+ const d = ownDataDescriptor(o, String(i));
106
+ if (d === undefined)
107
+ continue;
108
+ const c = copyOf(d.value, depth + 1, run);
109
+ if (c !== SKIP)
110
+ out[i] = c;
111
+ }
112
+ return out;
113
+ }
114
+ let keys;
115
+ try {
116
+ keys = Reflect.ownKeys(o);
117
+ }
118
+ catch {
119
+ return SKIP;
120
+ }
121
+ const out = {};
122
+ let taken = 0;
123
+ for (let i = 0; i < keys.length; i += 1) {
124
+ const k = keys[i];
125
+ if (typeof k !== 'string')
126
+ continue;
127
+ if (taken >= COPY_KEYS_MAX)
128
+ break;
129
+ const d = ownDataDescriptor(o, k);
130
+ if (d === undefined)
131
+ continue;
132
+ const c = copyOf(d.value, depth + 1, run);
133
+ if (c === SKIP)
134
+ continue;
135
+ Object.defineProperty(out, k, { value: c, writable: true, enumerable: true, configurable: true });
136
+ taken += 1;
137
+ }
138
+ placeThrownExtraOnCopy(o, out, (bag) => {
139
+ const c = copyOf(bag, depth + 1, run);
140
+ return c === SKIP ? undefined : c;
141
+ });
142
+ return out;
143
+ }
144
+ finally {
145
+ run.path.delete(o);
146
+ }
147
+ }
148
+ const newWatch = (node) => ({ node, touched: new Set(), kids: new Map(), enumerated: false, whole: false });
149
+ function viewOf(w, watches) {
150
+ if (w.view !== undefined)
151
+ return w.view;
152
+ const kid = (k, v) => {
153
+ if (typeof v !== 'object' || v === null)
154
+ return v;
155
+ let c = w.kids.get(k);
156
+ if (c === undefined || c.node !== v) {
157
+ c = newWatch(v);
158
+ w.kids.set(k, c);
159
+ }
160
+ return viewOf(c, watches);
161
+ };
162
+ const view = new Proxy(w.node, {
163
+ getOwnPropertyDescriptor(t, k) {
164
+ const d = Reflect.getOwnPropertyDescriptor(t, k);
165
+ if (typeof k !== 'string')
166
+ return d;
167
+ w.touched.add(k);
168
+ return d !== undefined && Object.hasOwn(d, 'value') ? { ...d, value: kid(k, d.value) } : d;
169
+ },
170
+ get(t, k, receiver) {
171
+ if (typeof k !== 'string')
172
+ return Reflect.get(t, k, receiver);
173
+ w.touched.add(k);
174
+ return Object.hasOwn(t, k) ? kid(k, t[k]) : Reflect.get(t, k, receiver);
175
+ },
176
+ has(t, k) {
177
+ if (typeof k === 'string')
178
+ w.touched.add(k);
179
+ return Reflect.has(t, k);
180
+ },
181
+ ownKeys(t) {
182
+ w.enumerated = true;
183
+ return Reflect.ownKeys(t);
184
+ },
185
+ });
186
+ w.view = view;
187
+ watches.set(view, w);
188
+ return view;
189
+ }
190
+ function ownKeysReading(o) {
191
+ try {
192
+ return { kind: 'listed', keys: Reflect.ownKeys(o) };
193
+ }
194
+ catch {
195
+ return { kind: 'unreadable' };
196
+ }
197
+ }
198
+ function consumeOutput(out, watches, seen, depth) {
199
+ if ((typeof out !== 'object' && typeof out !== 'function') || out === null || depth > COPY_DEPTH_MAX || seen.has(out))
200
+ return;
201
+ const w = watches.get(out);
202
+ if (w !== undefined) {
203
+ w.whole = true;
204
+ return;
205
+ }
206
+ seen.add(out);
207
+ const listed = ownKeysReading(out);
208
+ if (listed.kind === 'unreadable')
209
+ return;
210
+ for (let i = 0; i < listed.keys.length; i += 1) {
211
+ const k = listed.keys[i];
212
+ if (typeof k !== 'string')
213
+ continue;
214
+ const d = ownDataDescriptor(out, k);
215
+ if (d !== undefined)
216
+ consumeOutput(d.value, watches, seen, depth + 1);
217
+ }
218
+ }
219
+ function wholeOf(v) {
220
+ if (typeof v !== 'object' || v === null)
221
+ return v;
222
+ if (Array.isArray(v)) {
223
+ const out = new Array(v.length);
224
+ for (let i = 0; i < v.length; i += 1)
225
+ if (Object.hasOwn(v, i))
226
+ out[i] = wholeOf(v[i]);
227
+ return out;
228
+ }
229
+ const out = {};
230
+ const names = Object.keys(v);
231
+ for (let i = 0; i < names.length; i += 1) {
232
+ const k = names[i];
233
+ if (isSecretKeyName(k))
234
+ continue;
235
+ Object.defineProperty(out, k, { value: wholeOf(v[k]), writable: true, enumerable: true, configurable: true });
236
+ }
237
+ return out;
238
+ }
239
+ function carried(w, k, v) {
240
+ if (typeof v !== 'object' || v === null)
241
+ return v;
242
+ if (w.whole)
243
+ return wholeOf(v);
244
+ const c = w.kids.get(k);
245
+ if (c !== undefined && c.node === v)
246
+ return pruned(c);
247
+ return Array.isArray(v) ? [] : {};
248
+ }
249
+ function pruned(w) {
250
+ if (w.whole)
251
+ return wholeOf(w.node);
252
+ const src = w.node;
253
+ if (Array.isArray(src)) {
254
+ const out = new Array(src.length);
255
+ for (let i = 0; i < src.length; i += 1) {
256
+ const k = String(i);
257
+ if (!Object.hasOwn(src, k))
258
+ continue;
259
+ if (w.touched.has(k))
260
+ out[i] = carried(w, k, src[k]);
261
+ else if (w.enumerated)
262
+ out[i] = null;
263
+ }
264
+ return out;
265
+ }
266
+ const out = {};
267
+ const names = Object.keys(src);
268
+ for (let i = 0; i < names.length; i += 1) {
269
+ const k = names[i];
270
+ if (isSecretKeyName(k))
271
+ continue;
272
+ const value = w.touched.has(k) ? carried(w, k, src[k]) : w.enumerated ? null : SKIP;
273
+ if (value !== SKIP)
274
+ Object.defineProperty(out, k, { value, writable: true, enumerable: true, configurable: true });
275
+ }
276
+ return out;
277
+ }
278
+ function deepFreeze(v) {
279
+ if (typeof v === 'object' && v !== null && !Object.isFrozen(v)) {
280
+ Object.freeze(v);
281
+ const names = Object.keys(v);
282
+ for (let i = 0; i < names.length; i += 1)
283
+ deepFreeze(v[names[i]]);
284
+ }
285
+ return v;
286
+ }
287
+ function sameReading(a, b, depth) {
288
+ if (Object.is(a, b))
289
+ return true;
290
+ if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null || depth > COPY_DEPTH_MAX * 2)
291
+ return false;
292
+ if (Array.isArray(a) !== Array.isArray(b))
293
+ return false;
294
+ const ka = Object.keys(a);
295
+ const kb = Object.keys(b);
296
+ if (ka.length !== kb.length)
297
+ return false;
298
+ for (let i = 0; i < ka.length; i += 1) {
299
+ const k = ka[i];
300
+ if (k !== kb[i] || !sameReading(a[k], b[k], depth + 1))
301
+ return false;
302
+ }
303
+ return true;
304
+ }
305
+ function readAll(e) {
306
+ return Object.values(READERS).map((read) => {
307
+ try {
308
+ return read(e);
309
+ }
310
+ catch {
311
+ return Symbol('reader-threw');
312
+ }
313
+ });
314
+ }
315
+ export function decisionRefusalCarrierOf(err) {
316
+ try {
317
+ if ((typeof err !== 'object' && typeof err !== 'function') || err === null)
318
+ return undefined;
319
+ const copy = copyOf(err, 0, { nodes: 0, path: new Set() });
320
+ if (typeof copy !== 'object' || copy === null || Array.isArray(copy))
321
+ return undefined;
322
+ const root = newWatch(copy);
323
+ const watches = new WeakMap();
324
+ const view = viewOf(root, watches);
325
+ const readers = Object.values(READERS);
326
+ for (let i = 0; i < readers.length; i += 1) {
327
+ const read = readers[i];
328
+ let out;
329
+ try {
330
+ out = read(view);
331
+ }
332
+ catch {
333
+ return undefined;
334
+ }
335
+ consumeOutput(out, watches, new Set(), 0);
336
+ }
337
+ const carrier = deepFreeze(pruned(root));
338
+ const original = readAll(err);
339
+ const fromCarrier = readAll(carrier);
340
+ for (let i = 0; i < original.length; i += 1)
341
+ if (!sameReading(original[i], fromCarrier[i], 0))
342
+ return undefined;
343
+ return carrier;
344
+ }
345
+ catch {
346
+ return undefined;
347
+ }
348
+ }
@@ -1,5 +1,7 @@
1
1
  import type { AgentClient, ElicitResponse } from '@sema-agent/sdk';
2
2
  import type { UiLanguage } from '../env/uiLanguage.js';
3
+ import type { ToolPermissionSettledElsewhere } from './approvalResolution.js';
4
+ import { type ToolPermissionAck } from '../seatContract.js';
3
5
  import { type AskGoneDetail } from '../decideReceipt.js';
4
6
  import type { ApprovalDecidedByReading } from '../approvalDecidedByCapability.js';
5
7
  import { type DecisionNoteAudit } from './approvalDecisionNoteAudit.js';
@@ -12,6 +14,10 @@ export declare const HITL_DECISION_NOT_APPLIED_CAUSES: readonly ["gone", "parked
12
14
  export type HitlDecisionNotAppliedCause = (typeof HITL_DECISION_NOT_APPLIED_CAUSES)[number];
13
15
  export declare const HITL_DECISION_UNCONFIRMED_CAUSES: readonly ["transport", "server_error", "local_error", "aborted", "gone_after_retry"];
14
16
  export type HitlDecisionUnconfirmedCause = (typeof HITL_DECISION_UNCONFIRMED_CAUSES)[number];
17
+ export type ToolPermissionUnconfirmedCause = HitlDecisionUnconfirmedCause | 'registry_unreadable';
18
+ export interface ToolPermissionUnconfirmed {
19
+ readonly cause: ToolPermissionUnconfirmedCause;
20
+ }
15
21
  export declare const HITL_DECISION_NOT_SENT_CAUSES: readonly ["aborted", "duplicate_in_flight", "invalid_request", "no_verb", "not_an_answer"];
16
22
  export type HitlDecisionNotSentCause = (typeof HITL_DECISION_NOT_SENT_CAUSES)[number];
17
23
  export interface HitlApprovalDecisionRequest {
@@ -64,6 +70,7 @@ interface HitlDecisionOutcomeBase {
64
70
  readonly attempts: number;
65
71
  readonly fallback?: 'approval';
66
72
  readonly noteDropped?: true;
73
+ readonly allowNoteDropped?: true;
67
74
  readonly rememberDropped?: true;
68
75
  readonly allowSessionCarried?: true;
69
76
  readonly attributionDropped?: true;
@@ -115,5 +122,8 @@ export interface HitlDecisionSendTiming {
115
122
  export declare function __setHitlDecisionSendTimingForTests(t?: HitlDecisionSendTiming): void;
116
123
  export declare function hitlAskIdempotencyKey(askId: string, verdict: 'approve' | 'deny'): string;
117
124
  export declare function sendHitlDecision(request: HitlDecisionSendRequest, deps: HitlDecisionSendDeps): Promise<HitlDecisionSendOutcome>;
125
+ export declare function toolPermissionSettledLine(fact: ToolPermissionSettledElsewhere | null | undefined, lang?: UiLanguage): string | undefined;
126
+ export declare function toolPermissionUnconfirmedLine(ack: ToolPermissionAck | null | undefined, lang?: UiLanguage): string | undefined;
127
+ export declare function toolPermissionUnconfirmedOf(thrown: {} | null | undefined, signal?: AbortSignal): ToolPermissionUnconfirmed | undefined;
118
128
  export declare function hitlDecisionOutcomeContent(outcome: HitlDecisionSendOutcome, lang?: UiLanguage): string | undefined;
119
129
  export {};
@@ -1,6 +1,7 @@
1
1
  import { settleWithinDeadline } from '../abortableSleep.js';
2
2
  import { hostLog } from '../host.js';
3
3
  import { invokeHostCallbackIsolated } from '../hostCallbackGuard.js';
4
+ import { readToolPermissionAckState } from '../seatContract.js';
4
5
  import { msg, renderMessage } from '../i18n/translate.js';
5
6
  import { askGoneFromError } from '../decideReceipt.js';
6
7
  import { appendOwnElement, guardedRead, readOwnDataNonEmptyString, readOwnDataValue } from '../ownKey.js';
@@ -14,7 +15,7 @@ import { ASK_DECIDED_CODE, classifyDeliveredDecisionRefusal, decisionRefusalClos
14
15
  import { sessionAllowEligible } from './sessionAllowRoute.js';
15
16
  import { addDecisionOpKeys, closeDecisionOp, decisionLedgerKeysOf, decisionOpsWithKey, openDecisionOp } from './decisionLedger.js';
16
17
  import { hostHoldIsActive, takeHostHoldLedgerOp, tryHoldApprovalNow } from './approvalHolds.js';
17
- import { answerPayloadFor, decisionAttributionKeyOf, isToolApprovalRespondReplayed, readApprovalDenySettledBy, readToolApprovalRespondAck, readToolApprovalRespondParking, } from './toolApprovalWire.js';
18
+ import { allowNoteReadingOf, answerPayloadFor, decisionAttributionKeyOf, readApprovalDenySettledBy, readToolApprovalRespondAck, readToolApprovalRespondParking, replayVerdictFrom, settlementAckOf, } from './toolApprovalWire.js';
18
19
  export const HITL_DECISION_FAMILIES = Object.freeze(['approval', 'ask', 'elicitation']);
19
20
  export const HITL_DECISION_NOT_APPLIED_CAUSES = Object.freeze(['gone', 'parked', 'parking', 'lane_disabled', 'refused', 'idempotency_crossed']);
20
21
  export const HITL_DECISION_UNCONFIRMED_CAUSES = Object.freeze(['transport', 'server_error', 'local_error', 'aborted', 'gone_after_retry']);
@@ -163,9 +164,10 @@ async function sendApprovalFamily(respond, approvalId, answer, ctx) {
163
164
  const hint = view !== undefined ? ownReadingSlot(view, 'retryAfterMs') : undefined;
164
165
  return { ...base, kind: 'not_applied', cause: 'parking', ...(view !== undefined ? { parking: view, ...(hint !== undefined ? { retryAfterMs: hint } : {}) } : {}) };
165
166
  }
166
- const parsed = readToolApprovalRespondAck(raw);
167
- if (parsed !== undefined && isToolApprovalRespondReplayed(parsed)) {
168
- const first = parsed.approvalId === approvalId ? verdictOf(parsed.decision) : undefined;
167
+ const parsed = settlementAckOf(readToolApprovalRespondAck(raw));
168
+ const replay = replayVerdictFrom(raw, parsed, approvalId);
169
+ if (replay.kind === 'replayed') {
170
+ const first = verdictOf(replay.firstDecision);
169
171
  return {
170
172
  ...base,
171
173
  kind: 'settled_elsewhere',
@@ -173,8 +175,8 @@ async function sendApprovalFamily(respond, approvalId, answer, ctx) {
173
175
  ...(first !== undefined && ours !== undefined && first !== ours ? { contrary: true } : {}),
174
176
  };
175
177
  }
176
- if (ownTrue(raw, 'idempotent'))
177
- return { ...base, kind: 'settled_elsewhere' };
178
+ if (replay.kind === 'unreadable')
179
+ return { ...base, kind: 'unconfirmed', cause: 'local_error' };
178
180
  const ack = parsed !== undefined && parsed.approvalId === approvalId ? parsed : undefined;
179
181
  return { ...base, kind: 'applied', ...(ack !== undefined ? { ack } : {}), ...(ctx.noteCapable ? { noteAudit: readDecisionNoteAudit(raw) } : {}) };
180
182
  }
@@ -183,14 +185,12 @@ function bodyFacts(answer, payload, rememberUnsupported) {
183
185
  return {
184
186
  ...(reason !== undefined && reason.trim() !== '' && payload.note === undefined ? { noteDropped: true } : {}),
185
187
  ...(rememberUnsupported && answer.kind === 'allow' && answer.allowSession === true ? { rememberDropped: true } : {}),
188
+ ...(answer.kind === 'allow' && allowNoteReadingOf(answer).kind === 'text' ? { allowNoteDropped: true } : {}),
186
189
  };
187
190
  }
188
191
  function answerGateCannotTake(out) {
189
192
  return out.kind === 'not_applied' && (out.cause === 'gone' || out.cause === 'parking' || out.cause === 'lane_disabled');
190
193
  }
191
- function ownTrue(raw, key) {
192
- return typeof raw === 'object' && raw !== null && guardedRead(() => readOwnDataValue(raw, key)) === true;
193
- }
194
194
  async function sendAskFamily(respondForFallback, decideAsk, req, ctx) {
195
195
  const payload = answerPayloadFor(req.answer, 'respond', { approvalDecisionNoteCapable: ctx.noteCapable });
196
196
  if (payload === undefined)
@@ -361,8 +361,10 @@ function snapshotAnswer(raw) {
361
361
  if (kind === 'allow') {
362
362
  const allowSession = guardedRead(() => readOwnDataValue(raw, 'allowSession')) === true;
363
363
  const edited = guardedRead(() => readOwnDataValue(raw, 'updatedInput'));
364
+ const noteReading = guardedRead(() => allowNoteReadingOf(raw));
365
+ const note = noteReading?.kind === 'text' ? noteReading.text : undefined;
364
366
  if (edited === undefined)
365
- return Object.freeze({ kind: 'allow', allowSession });
367
+ return Object.freeze({ kind: 'allow', allowSession, ...(note !== undefined ? { note } : {}) });
366
368
  let copy;
367
369
  try {
368
370
  const text = JSON.stringify(edited);
@@ -373,7 +375,7 @@ function snapshotAnswer(raw) {
373
375
  catch {
374
376
  return undefined;
375
377
  }
376
- return Object.freeze({ kind: 'allow', allowSession, updatedInput: copy });
378
+ return Object.freeze({ kind: 'allow', allowSession, ...(note !== undefined ? { note } : {}), updatedInput: copy });
377
379
  }
378
380
  if (kind === 'deny') {
379
381
  const reason = guardedRead(() => readOwnDataValue(raw, 'reason'));
@@ -560,6 +562,48 @@ export async function sendHitlDecision(request, deps) {
560
562
  ownHold.release(out.kind === 'applied' || out.kind === 'settled_elsewhere' ? 'answered' : undefined);
561
563
  return Object.freeze(out);
562
564
  }
565
+ function settledElsewhereContraryContent(first, lang) {
566
+ return first === 'deny'
567
+ ? renderMessage(msg('approval.decision.settledElsewhereContrary.deniedFirst'), lang)
568
+ : renderMessage(msg('approval.decision.settledElsewhereContrary.approvedFirst'), lang);
569
+ }
570
+ export function toolPermissionSettledLine(fact, lang) {
571
+ try {
572
+ if (typeof fact !== 'object' || fact === null)
573
+ return undefined;
574
+ if (readOwnDataValue(fact, 'contrary') !== true)
575
+ return undefined;
576
+ const first = readOwnDataValue(fact, 'firstDecision');
577
+ return first === 'allow' || first === 'deny' ? settledElsewhereContraryContent(first, lang) : undefined;
578
+ }
579
+ catch {
580
+ return undefined;
581
+ }
582
+ }
583
+ function unconfirmedDecisionContent(cause, lang) {
584
+ return cause === 'gone_after_retry' ? renderMessage(msg('approval.decision.unconfirmedAfterRetry'), lang) : renderMessage(msg('approval.decideAck.unconfirmed'), lang);
585
+ }
586
+ export function toolPermissionUnconfirmedLine(ack, lang) {
587
+ try {
588
+ const state = readToolPermissionAckState(ack);
589
+ return state !== undefined && state.kind === 'unconfirmed' ? unconfirmedDecisionContent(state.cause, lang) : undefined;
590
+ }
591
+ catch {
592
+ return undefined;
593
+ }
594
+ }
595
+ export function toolPermissionUnconfirmedOf(thrown, signal) {
596
+ try {
597
+ const out = outcomeOfThrown(thrown, 'approval', undefined, signal, newSendTally(), false);
598
+ if (out.kind !== 'unconfirmed')
599
+ return undefined;
600
+ const cause = HITL_DECISION_UNCONFIRMED_CAUSES.find((w) => w === out.cause);
601
+ return cause === undefined ? undefined : Object.freeze({ cause });
602
+ }
603
+ catch {
604
+ return Object.freeze({ cause: 'local_error' });
605
+ }
606
+ }
563
607
  export function hitlDecisionOutcomeContent(outcome, lang) {
564
608
  try {
565
609
  if (typeof outcome !== 'object' || outcome === null)
@@ -569,14 +613,10 @@ export function hitlDecisionOutcomeContent(outcome, lang) {
569
613
  if (readOwnDataValue(outcome, 'contrary') !== true)
570
614
  return undefined;
571
615
  const first = readOwnDataValue(outcome, 'firstDecision');
572
- if (first === 'deny')
573
- return renderMessage(msg('approval.decision.settledElsewhereContrary.deniedFirst'), lang);
574
- if (first === 'approve')
575
- return renderMessage(msg('approval.decision.settledElsewhereContrary.approvedFirst'), lang);
576
- return undefined;
616
+ return first === 'deny' || first === 'approve' ? settledElsewhereContraryContent(first, lang) : undefined;
577
617
  }
578
618
  if (kind === 'unconfirmed' && readOwnDataValue(outcome, 'cause') === 'gone_after_retry')
579
- return renderMessage(msg('approval.decision.unconfirmedAfterRetry'), lang);
619
+ return unconfirmedDecisionContent('gone_after_retry', lang);
580
620
  return undefined;
581
621
  }
582
622
  catch {
@@ -0,0 +1,25 @@
1
+ import type { UiLanguage } from '../env/uiLanguage.js';
2
+ export declare const EDITED_APPROVAL_STATES: readonly ["accepts", "refuses", "unknown"];
3
+ export type EditedApprovalState = (typeof EDITED_APPROVAL_STATES)[number];
4
+ export declare const EDITED_APPROVAL_BASES: Readonly<{
5
+ accepts: readonly ["args_available"];
6
+ refuses: readonly ["args_unavailable"];
7
+ unknown: readonly ["card_unreadable", "slot_unreadable", "slot_malformed"];
8
+ }>;
9
+ interface EditedApprovalAccepts {
10
+ readonly state: 'accepts';
11
+ readonly basis: (typeof EDITED_APPROVAL_BASES.accepts)[number];
12
+ }
13
+ interface EditedApprovalRefuses {
14
+ readonly state: 'refuses';
15
+ readonly basis: (typeof EDITED_APPROVAL_BASES.refuses)[number];
16
+ readonly askStaysPending: true;
17
+ }
18
+ interface EditedApprovalUnknown {
19
+ readonly state: 'unknown';
20
+ readonly basis: (typeof EDITED_APPROVAL_BASES.unknown)[number];
21
+ }
22
+ export type EditedApprovalAcceptance = EditedApprovalAccepts | EditedApprovalRefuses | EditedApprovalUnknown;
23
+ export declare function editedApprovalAcceptanceOf(card: {} | null | undefined): EditedApprovalAcceptance;
24
+ export declare function editedApprovalRefusedLine(lang?: UiLanguage): string;
25
+ export {};
@@ -0,0 +1,26 @@
1
+ import { msg, renderMessage } from '../i18n/translate.js';
2
+ import { slotReadOf } from '../wireFailureShape.js';
3
+ export const EDITED_APPROVAL_STATES = Object.freeze(['accepts', 'refuses', 'unknown']);
4
+ export const EDITED_APPROVAL_BASES = Object.freeze({
5
+ accepts: Object.freeze(['args_available']),
6
+ refuses: Object.freeze(['args_unavailable']),
7
+ unknown: Object.freeze(['card_unreadable', 'slot_unreadable', 'slot_malformed']),
8
+ });
9
+ const ACCEPTS = Object.freeze({ state: 'accepts', basis: 'args_available' });
10
+ const REFUSES = Object.freeze({ state: 'refuses', basis: 'args_unavailable', askStaysPending: true });
11
+ const UNKNOWN_CARD = Object.freeze({ state: 'unknown', basis: 'card_unreadable' });
12
+ const UNKNOWN_SLOT = Object.freeze({ state: 'unknown', basis: 'slot_unreadable' });
13
+ const UNKNOWN_MALFORMED = Object.freeze({ state: 'unknown', basis: 'slot_malformed' });
14
+ export function editedApprovalAcceptanceOf(card) {
15
+ if (typeof card !== 'object' || card === null)
16
+ return UNKNOWN_CARD;
17
+ const read = slotReadOf(card, 'argsUnavailable');
18
+ if (read.presence === 'unreadable')
19
+ return UNKNOWN_SLOT;
20
+ if (read.presence === 'absent' || read.value === undefined)
21
+ return ACCEPTS;
22
+ return read.value === true ? REFUSES : UNKNOWN_MALFORMED;
23
+ }
24
+ export function editedApprovalRefusedLine(lang) {
25
+ return renderMessage(msg('approval.editRefusal.line', { stem: msg('approval.editRefusal.stem') }), lang);
26
+ }
@@ -0,0 +1,4 @@
1
+ import type { EventLegElicitationFrame } from '../eventLeg.js';
2
+ import type { UiLanguage } from '../env/uiLanguage.js';
3
+ import type { HitlDecisionSendOutcome } from './decisionSend.js';
4
+ export declare function elicitationRefusedLine(frame: EventLegElicitationFrame, outcome: HitlDecisionSendOutcome, lang?: UiLanguage): string | undefined;
@@ -0,0 +1,23 @@
1
+ import { capForDisplay } from '../fleetTaskDesc.js';
2
+ import { msg, renderMessage } from '../i18n/translate.js';
3
+ import { guardedRead, readOwnDataNonEmptyString, readOwnDataValue } from '../ownKey.js';
4
+ const SERVER_NAME_SHOWN_MAX = 40;
5
+ export function elicitationRefusedLine(frame, outcome, lang) {
6
+ try {
7
+ if (typeof frame !== 'object' || frame === null || typeof outcome !== 'object' || outcome === null)
8
+ return undefined;
9
+ if (guardedRead(() => readOwnDataValue(frame, 'type')) !== 'elicitation')
10
+ return undefined;
11
+ if (guardedRead(() => readOwnDataValue(outcome, 'family')) !== 'elicitation')
12
+ return undefined;
13
+ if (guardedRead(() => readOwnDataValue(outcome, 'kind')) !== 'applied')
14
+ return undefined;
15
+ const name = guardedRead(() => readOwnDataNonEmptyString(frame, 'mcpServerName'));
16
+ return name === undefined
17
+ ? renderMessage(msg('mcp.elicitation.refused.unnamed'), lang)
18
+ : renderMessage(msg('mcp.elicitation.refused.named', { server: capForDisplay(name, SERVER_NAME_SHOWN_MAX) }), lang);
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ }
@@ -38,9 +38,8 @@ export interface AskGateWireDeps {
38
38
  onToolApprovalOutcome?: (frame: ToolApprovalFrame, resolution: ApprovalResolution) => void | Promise<void>;
39
39
  onDecideOperation?: DecideOperationObserver;
40
40
  onReplayedApproval?: (frame: ToolApprovalFrame, disposition: ReplayedApprovalDisposition) => void | Promise<void>;
41
+ engineGeneration?: () => number;
41
42
  }
42
- export declare function setBridgeRunHandleFallback(deps: object, read: () => string | undefined): void;
43
- export declare function bridgeRunHandleFallbackOf(deps: object): string | undefined;
44
43
  type GateKind = 'ask' | 'fs';
45
44
  export interface GatePark {
46
45
  gate: GateKind;
@@ -73,6 +72,7 @@ export interface FrameRouterCtx {
73
72
  deps: AskGateWireDeps;
74
73
  taskId: TaskIdRef;
75
74
  signal?: AbortSignal | undefined;
75
+ streamGeneration?: number | undefined;
76
76
  }
77
77
  export declare function isAskTool(toolName: string | undefined): boolean;
78
78
  export declare function questionCardVerdict(carrier: object | null | undefined): boolean | undefined;