@sema-agent/client-core 0.110.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 (176) hide show
  1. package/CHANGELOG.md +169 -0
  2. package/README.md +50 -18
  3. package/dist/abortableSleep.d.ts +7 -0
  4. package/dist/abortableSleep.js +37 -0
  5. package/dist/adapt/arms.js +25 -4
  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 +10 -10
  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/displayUntrusted.d.ts +1 -0
  26. package/dist/displayUntrusted.js +6 -0
  27. package/dist/engineHealthFacts.d.ts +11 -0
  28. package/dist/engineHealthFacts.js +21 -0
  29. package/dist/engineHealthProbeVerdict.d.ts +23 -0
  30. package/dist/engineHealthProbeVerdict.js +115 -0
  31. package/dist/engineNoticeCodes.js +5 -7
  32. package/dist/engineRepoint.d.ts +12 -5
  33. package/dist/engineRepoint.js +44 -19
  34. package/dist/engineRowRef.d.ts +3 -0
  35. package/dist/engineRowRef.js +11 -1
  36. package/dist/engineSwapCrossing.d.ts +57 -0
  37. package/dist/engineSwapCrossing.js +297 -0
  38. package/dist/engineUnavailable.d.ts +44 -0
  39. package/dist/engineUnavailable.js +492 -0
  40. package/dist/eventLeg.js +3 -3
  41. package/dist/generated/sdkFactTables.d.ts +1 -1
  42. package/dist/generated/sdkFactTables.js +1 -0
  43. package/dist/generated/settingsSchemaTables.d.ts +4 -0
  44. package/dist/generated/settingsSchemaTables.js +1 -0
  45. package/dist/hitl/approvalDelivery.d.ts +1 -0
  46. package/dist/hitl/approvalDelivery.js +1 -1
  47. package/dist/hitl/approvalResolution.d.ts +1 -1
  48. package/dist/hitl/approvalResolution.js +2 -1
  49. package/dist/hitl/askGateWire.js +5 -6
  50. package/dist/hitl/decisionRefusal.d.ts +2 -0
  51. package/dist/hitl/decisionRefusal.js +7 -8
  52. package/dist/hitl/decisionRefusalCarrier.d.ts +3 -0
  53. package/dist/hitl/decisionRefusalCarrier.js +348 -0
  54. package/dist/hitl/decisionSend.d.ts +7 -0
  55. package/dist/hitl/decisionSend.js +34 -12
  56. package/dist/hitl/editedApprovalAcceptance.js +1 -1
  57. package/dist/hitl/elicitationRefusal.d.ts +4 -0
  58. package/dist/hitl/elicitationRefusal.js +23 -0
  59. package/dist/hitl/frameRouter.d.ts +2 -2
  60. package/dist/hitl/frameRouter.js +8 -15
  61. package/dist/hitl/gateIdentity.d.ts +5 -0
  62. package/dist/hitl/gateIdentity.js +23 -0
  63. package/dist/hitl/hitlBridge.d.ts +6 -0
  64. package/dist/hitl/hitlBridge.js +10 -4
  65. package/dist/hitl/hitlHostSurface.d.ts +2 -1
  66. package/dist/hitl/hitlHostSurface.js +7 -2
  67. package/dist/hitl/localAllowRedemption.d.ts +67 -0
  68. package/dist/hitl/localAllowRedemption.js +256 -0
  69. package/dist/hitl/parkResolver.js +7 -4
  70. package/dist/hitl/persistedRulesWire.d.ts +16 -0
  71. package/dist/hitl/persistedRulesWire.js +70 -0
  72. package/dist/hitl/planReviewWire.d.ts +3 -0
  73. package/dist/hitl/planReviewWire.js +23 -6
  74. package/dist/hitl/policyDenyCause.d.ts +1 -1
  75. package/dist/hitl/policyDenyCause.js +1 -1
  76. package/dist/hitl/resumeRunningCard.d.ts +1 -0
  77. package/dist/hitl/resumeRunningCard.js +1 -0
  78. package/dist/hitl/screenCardCarriers.d.ts +15 -0
  79. package/dist/hitl/screenCardCarriers.js +41 -0
  80. package/dist/hitl/screenDecisionCards.d.ts +98 -0
  81. package/dist/hitl/screenDecisionCards.js +362 -0
  82. package/dist/hitl/standingRows.d.ts +3 -1
  83. package/dist/hitl/standingRows.js +18 -0
  84. package/dist/hitl/toolApprovalWire.d.ts +30 -8
  85. package/dist/hitl/toolApprovalWire.js +264 -121
  86. package/dist/hooksWireCaps.js +3 -3
  87. package/dist/hostSettingNoticeArm.d.ts +3 -0
  88. package/dist/hostSettingNoticeArm.js +12 -0
  89. package/dist/hostTurnSettings.d.ts +3 -0
  90. package/dist/hostTurnSettings.js +38 -5
  91. package/dist/humanTurnRead.js +11 -1
  92. package/dist/i18n/messages.en.d.ts +129 -0
  93. package/dist/i18n/messages.en.js +135 -7
  94. package/dist/i18n/messages.zh.js +142 -6
  95. package/dist/i18n/translate.d.ts +3 -0
  96. package/dist/i18n/translate.js +78 -10
  97. package/dist/i18n/zh.d.ts +1 -0
  98. package/dist/i18n/zh.js +1 -0
  99. package/dist/index.d.ts +43 -17
  100. package/dist/index.js +30 -12
  101. package/dist/interactiveHalt.js +2 -1
  102. package/dist/interactiveInterrupt.js +20 -2
  103. package/dist/liveModelCatalog.js +2 -2
  104. package/dist/localEngineSeatReading.d.ts +2 -2
  105. package/dist/localEngineSeatReading.js +5 -3
  106. package/dist/localEngineSpawn.d.ts +0 -7
  107. package/dist/localEngineSpawn.js +0 -92
  108. package/dist/localEngineStep.d.ts +2 -2
  109. package/dist/localEngineStep.js +2 -0
  110. package/dist/mcpReconnect.js +3 -3
  111. package/dist/mcpWireCaps.js +1 -1
  112. package/dist/model/engineModelWords.d.ts +3 -0
  113. package/dist/model/engineModelWords.js +13 -0
  114. package/dist/model/subagentModelWord.d.ts +21 -2
  115. package/dist/model/subagentModelWord.js +100 -29
  116. package/dist/modelCapabilityProbe.js +3 -40
  117. package/dist/notifications.d.ts +19 -0
  118. package/dist/notifications.js +114 -12
  119. package/dist/ownKey.d.ts +6 -0
  120. package/dist/ownKey.js +31 -0
  121. package/dist/pendingUserRow.d.ts +4 -0
  122. package/dist/pendingUserRow.js +16 -0
  123. package/dist/permissionsDeclaration.d.ts +1 -0
  124. package/dist/permissionsDeclaration.js +11 -1
  125. package/dist/planReviewCardFacts.d.ts +3 -0
  126. package/dist/planReviewCardFacts.js +52 -2
  127. package/dist/pluginHooksWire.d.ts +9 -1
  128. package/dist/pluginHooksWire.js +40 -6
  129. package/dist/printToolResultFrame.js +4 -2
  130. package/dist/promptBlockedCopy.js +11 -6
  131. package/dist/promptSuggestionBatch.d.ts +7 -0
  132. package/dist/promptSuggestionBatch.js +9 -0
  133. package/dist/promptSuggestionsTail.d.ts +39 -0
  134. package/dist/promptSuggestionsTail.js +116 -0
  135. package/dist/request/taskRequest.js +10 -6
  136. package/dist/requestCoordinate.d.ts +1 -0
  137. package/dist/requestCoordinate.js +13 -0
  138. package/dist/rewindArchiveReading.js +4 -4
  139. package/dist/runCancelContext.d.ts +2 -1
  140. package/dist/runCancelContext.js +1 -0
  141. package/dist/runPermissionModeSwitch.js +2 -2
  142. package/dist/scenarioRefusal.js +11 -13
  143. package/dist/scenarioSkills.js +11 -6
  144. package/dist/seam.d.ts +16 -2
  145. package/dist/seam.js +10 -0
  146. package/dist/seatContract.d.ts +109 -9
  147. package/dist/seatContract.js +218 -15
  148. package/dist/sessionCostReading.d.ts +70 -0
  149. package/dist/sessionCostReading.js +150 -0
  150. package/dist/sessionHooksRoster.d.ts +4 -0
  151. package/dist/sessionHooksRoster.js +158 -0
  152. package/dist/sessionMemoryStatus.js +2 -2
  153. package/dist/sessionReadRedaction.d.ts +7 -0
  154. package/dist/sessionReadRedaction.js +26 -0
  155. package/dist/sessionSyncFileHistory.js +8 -9
  156. package/dist/settingsHooksSalvage.js +2 -1
  157. package/dist/sseIdleTriage.js +2 -1
  158. package/dist/storeDurabilityWord.d.ts +15 -0
  159. package/dist/storeDurabilityWord.js +18 -0
  160. package/dist/storePostureCapability.d.ts +7 -3
  161. package/dist/storePostureCapability.js +69 -39
  162. package/dist/subagent/engineSubagentResume.js +2 -2
  163. package/dist/subagent/engineSubagentTail.js +2 -1
  164. package/dist/subagentContentStore.d.ts +11 -0
  165. package/dist/subagentContentStore.js +28 -2
  166. package/dist/toolResult.d.ts +1 -0
  167. package/dist/toolResult.js +2 -0
  168. package/dist/userAttachmentEnvelope.d.ts +2 -1
  169. package/dist/userAttachmentEnvelope.js +10 -0
  170. package/dist/wireErrorTriage.js +2 -1
  171. package/dist/wireFailureShape.d.ts +4 -0
  172. package/dist/wireFailureShape.js +141 -19
  173. package/dist/wireRefusalCopy.d.ts +6 -5
  174. package/dist/wireRefusalCopy.js +49 -92
  175. package/docs/INTEGRATION-CLIENTS.md +2118 -17
  176. package/package.json +6 -2
@@ -1,9 +1,10 @@
1
1
  import { createGateLedger } from './gateLedger.js';
2
- import { bridgeRunHandleFallbackOf, flushHeldWithInterruptRewrite, isHostProgressFrame, routeFrame, } from './frameRouter.js';
2
+ import { flushHeldWithInterruptRewrite, isHostProgressFrame, routeFrame, } from './frameRouter.js';
3
3
  import { resolvePark, nextHopBudget, stalledTerminal, MAX_GATE_HOPS } from './parkResolver.js';
4
4
  import { createStreamDrainingLegs } from '../streamDrainingLegs.js';
5
5
  import { abortableSleep } from '../abortableSleep.js';
6
6
  import { hostLog } from '../host.js';
7
+ import { sourceGenerationNow } from './screenCardCarriers.js';
7
8
  import { invokeHostCallbackIsolated } from '../hostCallbackGuard.js';
8
9
  import { decideAcceptedNotResolved, readDecideReceipt } from '../decideReceipt.js';
9
10
  import { APPROVAL_EXPIRED } from '../engineErrorCodes.js';
@@ -28,6 +29,7 @@ export async function* bridgeAskUserQuestionGates(source, deps, opts) {
28
29
  deps,
29
30
  taskId,
30
31
  ...(opts?.signal ? { signal: opts.signal } : {}),
32
+ streamGeneration: sourceGenerationNow(deps),
31
33
  };
32
34
  let stream = source;
33
35
  let budget;
@@ -81,16 +83,12 @@ export async function* bridgeAskUserQuestionGates(source, deps, opts) {
81
83
  const drained = drains.legEnded('returned');
82
84
  if (drained !== undefined) {
83
85
  const reopenAfterMs = 'reconnectAfterMs' in drained ? drained.reconnectAfterMs : undefined;
84
- if (taskId.current === undefined) {
85
- const bound = bridgeRunHandleFallbackOf(deps);
86
- if (bound !== undefined && reopenAfterMs !== undefined)
87
- taskId.current = bound;
88
- }
89
86
  if (reopenAfterMs !== undefined && taskId.current !== undefined && !opts?.signal?.aborted) {
90
87
  hostLog('debug', `liveHitlAskWire: runs.events(${taskId.current}) ended on the drain end frame — the engine is going down; reopening in ${reopenAfterMs}ms`);
91
88
  await abortableSleep(reopenAfterMs, opts?.signal ?? new AbortController().signal);
92
89
  if (!opts?.signal?.aborted) {
93
90
  const seq = led.lastSeq();
91
+ ctx.streamGeneration = sourceGenerationNow(deps);
94
92
  stream = deps.runsEvents(taskId.current, {
95
93
  ...(seq !== undefined ? { lastEventId: seq } : {}),
96
94
  ...(opts?.signal ? { signal: opts.signal } : {}),
@@ -169,6 +167,7 @@ export async function* bridgeAskUserQuestionGates(source, deps, opts) {
169
167
  led.forgetRunScopedState();
170
168
  }
171
169
  const seq = handoff !== undefined ? undefined : led.lastSeq();
170
+ ctx.streamGeneration = sourceGenerationNow(deps);
172
171
  stream = deps.runsEvents(taskId.current, {
173
172
  ...(seq !== undefined ? { lastEventId: seq } : {}),
174
173
  ...(opts?.signal ? { signal: opts.signal } : {}),
@@ -19,6 +19,8 @@ export interface RefusalRouteContext {
19
19
  readonly afterRetry?: true;
20
20
  }
21
21
  export declare function notPendingAfterRetry(status: number | undefined, retried: boolean): boolean;
22
+ type RefusalRoute = NonNullable<RefusalRouteContext['route']>;
23
+ export declare const REFUSAL_ROUTES: readonly RefusalRoute[];
22
24
  export interface RefusalDelivery {
23
25
  readonly delivery: 'refused' | 'ambiguous' | 'no_answer';
24
26
  readonly status?: number;
@@ -7,7 +7,7 @@ import { isAlreadyResolvedGateReason, isCodeClassifiedGateFailure } from './park
7
7
  import { decisionConflictOf } from './decisionConflict.js';
8
8
  import { readLivePendingRows } from './livePendingAsk.js';
9
9
  import { guardedRead, ownDataField, readOwnDataValue } from '../ownKey.js';
10
- import { PROTOCOL_ERROR_NAME, THROWN_SLOT_UNREADABLE, isDisplayableWireCode, isSlotCarrier, ownFoldedCodeBitsOf, protocolErrorNameReading, readErrorPresent, readErrorRecord, readRefusalField, readThrownSlot } from '../wireFailureShape.js';
10
+ import { PROTOCOL_ERROR_NAME, THROWN_SLOT_UNREADABLE, isDisplayableWireCode, isSlotCarrier, ownFoldedCodeBitsOf, protocolErrorNameReading, readErrorPresent, readErrorString, readRefusalField, readThrownSlot } from '../wireFailureShape.js';
11
11
  import { attributionRefusalOf, carrierReadOf } from './attributionLadder.js';
12
12
  import { CODE_UNREADABLE, ownReadingSlot } from '../engineWireFor.js';
13
13
  export const ASK_DECIDED_CODE = 'conflict.ask_decided';
@@ -29,7 +29,7 @@ export function notPendingAfterRetry(status, retried) {
29
29
  return retried && (status === 404 || status === 410);
30
30
  }
31
31
  const ROUTE_WORDS = { approval_decide: true, live_respond: true, ask_decide: true, plan_review: true, compact: true };
32
- const REFUSAL_ROUTES = Object.freeze(Object.keys(ROUTE_WORDS));
32
+ export const REFUSAL_ROUTES = Object.freeze(Object.keys(ROUTE_WORDS));
33
33
  const PRIOR_REFUSAL_EVIDENCE = Object.freeze([
34
34
  Object.freeze({
35
35
  errorCode: 'corrupt',
@@ -74,12 +74,11 @@ const codeUnreadable = () => {
74
74
  throw new TypeError('status or errorCode was unreadable when this failure was first read');
75
75
  };
76
76
  function preflightSettledBitsPresent(carrier) {
77
- const detail = guardedRead(() => readErrorRecord(carrier, 'detail'));
78
- if (detail === undefined)
79
- return false;
80
- const bit = (k) => guardedRead(() => readOwnDataValue(detail, k));
81
- const nonEmpty = (v) => typeof v === 'string' && v.length > 0;
82
- return nonEmpty(bit('settledBy')) || nonEmpty(bit('rowStatus'));
77
+ const nonEmpty = (k) => {
78
+ const v = guardedRead(() => readErrorString(carrier, k));
79
+ return typeof v === 'string' && v.length > 0;
80
+ };
81
+ return nonEmpty('settledBy') || nonEmpty('rowStatus');
83
82
  }
84
83
  const RESOLUTION_KINDS = Object.freeze(['decided', 'not_sent', 'unsettled']);
85
84
  const ASK_READINGS = Object.freeze(['settled', 'not_settled', 'unreadable']);
@@ -0,0 +1,3 @@
1
+ import { type DecisionRefusalCarrier } from '../seatContract.js';
2
+ export declare function decisionRefusalCarrierReaderNames(): readonly string[];
3
+ export declare function decisionRefusalCarrierOf(err: {} | null | undefined): DecisionRefusalCarrier | undefined;
@@ -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,6 +1,7 @@
1
1
  import type { AgentClient, ElicitResponse } from '@sema-agent/sdk';
2
2
  import type { UiLanguage } from '../env/uiLanguage.js';
3
3
  import type { ToolPermissionSettledElsewhere } from './approvalResolution.js';
4
+ import { type ToolPermissionAck } from '../seatContract.js';
4
5
  import { type AskGoneDetail } from '../decideReceipt.js';
5
6
  import type { ApprovalDecidedByReading } from '../approvalDecidedByCapability.js';
6
7
  import { type DecisionNoteAudit } from './approvalDecisionNoteAudit.js';
@@ -13,6 +14,10 @@ export declare const HITL_DECISION_NOT_APPLIED_CAUSES: readonly ["gone", "parked
13
14
  export type HitlDecisionNotAppliedCause = (typeof HITL_DECISION_NOT_APPLIED_CAUSES)[number];
14
15
  export declare const HITL_DECISION_UNCONFIRMED_CAUSES: readonly ["transport", "server_error", "local_error", "aborted", "gone_after_retry"];
15
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
+ }
16
21
  export declare const HITL_DECISION_NOT_SENT_CAUSES: readonly ["aborted", "duplicate_in_flight", "invalid_request", "no_verb", "not_an_answer"];
17
22
  export type HitlDecisionNotSentCause = (typeof HITL_DECISION_NOT_SENT_CAUSES)[number];
18
23
  export interface HitlApprovalDecisionRequest {
@@ -118,5 +123,7 @@ export declare function __setHitlDecisionSendTimingForTests(t?: HitlDecisionSend
118
123
  export declare function hitlAskIdempotencyKey(askId: string, verdict: 'approve' | 'deny'): string;
119
124
  export declare function sendHitlDecision(request: HitlDecisionSendRequest, deps: HitlDecisionSendDeps): Promise<HitlDecisionSendOutcome>;
120
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;
121
128
  export declare function hitlDecisionOutcomeContent(outcome: HitlDecisionSendOutcome, lang?: UiLanguage): string | undefined;
122
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 { allowNoteReadingOf, answerPayloadFor, decisionAttributionKeyOf, readApprovalDenySettledBy, readToolApprovalRespondAck, readToolApprovalRespondParking, replayedFirstDecisionOf, settlementAckOf, } 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']);
@@ -164,9 +165,9 @@ async function sendApprovalFamily(respond, approvalId, answer, ctx) {
164
165
  return { ...base, kind: 'not_applied', cause: 'parking', ...(view !== undefined ? { parking: view, ...(hint !== undefined ? { retryAfterMs: hint } : {}) } : {}) };
165
166
  }
166
167
  const parsed = settlementAckOf(readToolApprovalRespondAck(raw));
167
- const replayWord = replayedFirstDecisionOf(parsed);
168
- if (parsed !== undefined && replayWord !== undefined) {
169
- const first = parsed.approvalId === approvalId ? verdictOf(replayWord) : undefined;
168
+ const replay = replayVerdictFrom(raw, parsed, approvalId);
169
+ if (replay.kind === 'replayed') {
170
+ const first = verdictOf(replay.firstDecision);
170
171
  return {
171
172
  ...base,
172
173
  kind: 'settled_elsewhere',
@@ -174,8 +175,8 @@ async function sendApprovalFamily(respond, approvalId, answer, ctx) {
174
175
  ...(first !== undefined && ours !== undefined && first !== ours ? { contrary: true } : {}),
175
176
  };
176
177
  }
177
- if (ownTrue(raw, 'idempotent'))
178
- return { ...base, kind: 'settled_elsewhere' };
178
+ if (replay.kind === 'unreadable')
179
+ return { ...base, kind: 'unconfirmed', cause: 'local_error' };
179
180
  const ack = parsed !== undefined && parsed.approvalId === approvalId ? parsed : undefined;
180
181
  return { ...base, kind: 'applied', ...(ack !== undefined ? { ack } : {}), ...(ctx.noteCapable ? { noteAudit: readDecisionNoteAudit(raw) } : {}) };
181
182
  }
@@ -190,9 +191,6 @@ function bodyFacts(answer, payload, rememberUnsupported) {
190
191
  function answerGateCannotTake(out) {
191
192
  return out.kind === 'not_applied' && (out.cause === 'gone' || out.cause === 'parking' || out.cause === 'lane_disabled');
192
193
  }
193
- function ownTrue(raw, key) {
194
- return typeof raw === 'object' && raw !== null && guardedRead(() => readOwnDataValue(raw, key)) === true;
195
- }
196
194
  async function sendAskFamily(respondForFallback, decideAsk, req, ctx) {
197
195
  const payload = answerPayloadFor(req.answer, 'respond', { approvalDecisionNoteCapable: ctx.noteCapable });
198
196
  if (payload === undefined)
@@ -363,8 +361,8 @@ function snapshotAnswer(raw) {
363
361
  if (kind === 'allow') {
364
362
  const allowSession = guardedRead(() => readOwnDataValue(raw, 'allowSession')) === true;
365
363
  const edited = guardedRead(() => readOwnDataValue(raw, 'updatedInput'));
366
- const noteRaw = guardedRead(() => readOwnDataValue(raw, 'note'));
367
- const note = typeof noteRaw === 'string' && noteRaw.trim() !== '' ? noteRaw : undefined;
364
+ const noteReading = guardedRead(() => allowNoteReadingOf(raw));
365
+ const note = noteReading?.kind === 'text' ? noteReading.text : undefined;
368
366
  if (edited === undefined)
369
367
  return Object.freeze({ kind: 'allow', allowSession, ...(note !== undefined ? { note } : {}) });
370
368
  let copy;
@@ -582,6 +580,30 @@ export function toolPermissionSettledLine(fact, lang) {
582
580
  return undefined;
583
581
  }
584
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
+ }
585
607
  export function hitlDecisionOutcomeContent(outcome, lang) {
586
608
  try {
587
609
  if (typeof outcome !== 'object' || outcome === null)
@@ -594,7 +616,7 @@ export function hitlDecisionOutcomeContent(outcome, lang) {
594
616
  return first === 'deny' || first === 'approve' ? settledElsewhereContraryContent(first, lang) : undefined;
595
617
  }
596
618
  if (kind === 'unconfirmed' && readOwnDataValue(outcome, 'cause') === 'gone_after_retry')
597
- return renderMessage(msg('approval.decision.unconfirmedAfterRetry'), lang);
619
+ return unconfirmedDecisionContent('gone_after_retry', lang);
598
620
  return undefined;
599
621
  }
600
622
  catch {
@@ -22,5 +22,5 @@ export function editedApprovalAcceptanceOf(card) {
22
22
  return read.value === true ? REFUSES : UNKNOWN_MALFORMED;
23
23
  }
24
24
  export function editedApprovalRefusedLine(lang) {
25
- return renderMessage(msg('approval.editRefusal.line'), lang);
25
+ return renderMessage(msg('approval.editRefusal.line', { stem: msg('approval.editRefusal.stem') }), lang);
26
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;