@sema-agent/client-core 0.100.0 → 0.102.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/CHANGELOG.md +452 -0
  2. package/README.md +172 -120
  3. package/dist/adapt/arms.js +51 -16
  4. package/dist/adapt/textStream.js +7 -4
  5. package/dist/adapt/toolCards.d.ts +2 -1
  6. package/dist/adapt/toolCards.js +28 -13
  7. package/dist/adapt.d.ts +1 -1
  8. package/dist/adapt.js +8 -2
  9. package/dist/adapter/activeRunSelfHeal.d.ts +24 -2
  10. package/dist/adapter/activeRunSelfHeal.js +108 -6
  11. package/dist/adapter/downstream/eventToSdkMessage.js +38 -79
  12. package/dist/adapter/downstream/terminalToSdkResult.d.ts +60 -1
  13. package/dist/adapter/downstream/terminalToSdkResult.js +209 -39
  14. package/dist/adapter/downstream/wiringManifestView.d.ts +1 -0
  15. package/dist/adapter/downstream/wiringManifestView.js +138 -0
  16. package/dist/adapter/runStream.d.ts +4 -4
  17. package/dist/adapter/runStream.js +158 -43
  18. package/dist/agentsWireCaps.d.ts +2 -7
  19. package/dist/agentsWireCaps.js +1 -2
  20. package/dist/approvalDecidedByCapability.js +2 -2
  21. package/dist/approvalFrameFamilies.d.ts +33 -0
  22. package/dist/approvalFrameFamilies.js +120 -0
  23. package/dist/approvalsStreamLiveCapability.js +2 -2
  24. package/dist/attachmentsWireCaps.js +41 -13
  25. package/dist/callerCwdCapability.js +2 -2
  26. package/dist/centerWiringCapability.js +2 -2
  27. package/dist/clockReading.d.ts +2 -0
  28. package/dist/clockReading.js +4 -0
  29. package/dist/cloudConfigWireCaps.d.ts +19 -5
  30. package/dist/cloudConfigWireCaps.js +193 -56
  31. package/dist/compensations.js +1 -1
  32. package/dist/coreValuePorts.d.ts +12 -2
  33. package/dist/coreValuePorts.js +9 -0
  34. package/dist/decideFailureNote.js +5 -3
  35. package/dist/decideReceipt.js +2 -2
  36. package/dist/deviceExecutorManagementCapability.js +2 -2
  37. package/dist/deviceFlowPolling.js +1 -1
  38. package/dist/disableSkillsWire.d.ts +1 -1
  39. package/dist/disableSkillsWire.js +4 -3
  40. package/dist/displayUntrusted.d.ts +9 -4
  41. package/dist/displayUntrusted.js +834 -104
  42. package/dist/engineCapReader.js +1 -1
  43. package/dist/engineConfigDrift.js +1 -1
  44. package/dist/engineErrorCodes.d.ts +14 -5
  45. package/dist/engineErrorCodes.js +27 -6
  46. package/dist/engineGenerationConvergence.d.ts +39 -0
  47. package/dist/engineGenerationConvergence.js +95 -0
  48. package/dist/engineGenerationPort.d.ts +61 -0
  49. package/dist/engineGenerationPort.js +144 -0
  50. package/dist/engineHealthFacts.d.ts +23 -0
  51. package/dist/engineHealthFacts.js +92 -0
  52. package/dist/engineIdentity.d.ts +4 -0
  53. package/dist/engineIdentity.js +11 -0
  54. package/dist/engineNoticeCodes.d.ts +2 -5
  55. package/dist/engineRowRef.js +4 -0
  56. package/dist/engineSessionMessages.js +2 -2
  57. package/dist/engineToolDirectory.js +2 -2
  58. package/dist/engineWireFor.d.ts +99 -0
  59. package/dist/engineWireFor.js +248 -6
  60. package/dist/engineWireTarget.d.ts +1 -0
  61. package/dist/engineWireTarget.js +8 -0
  62. package/dist/env/uiLanguage.js +1 -1
  63. package/dist/errorSupplementRoles.d.ts +3 -0
  64. package/dist/errorSupplementRoles.js +37 -0
  65. package/dist/executionLaneCapability.js +2 -2
  66. package/dist/fileHistoryCaptureCapability.js +3 -3
  67. package/dist/finalVerifyWire.d.ts +6 -3
  68. package/dist/finalVerifyWire.js +6 -23
  69. package/dist/flagInput.d.ts +4 -0
  70. package/dist/flagInput.js +24 -0
  71. package/dist/fleet/fleetLedger.js +5 -2
  72. package/dist/fleet/fleetProjection.d.ts +1 -0
  73. package/dist/fleet/fleetProjection.js +16 -3
  74. package/dist/gateVocabulary.js +3 -0
  75. package/dist/generated/engineFactTables.d.ts +7 -3
  76. package/dist/generated/engineFactTables.js +52 -0
  77. package/dist/generated/engineNoticeTables.js +12 -0
  78. package/dist/generated/settingsSchemaActiveTiers.d.ts +1 -0
  79. package/dist/generated/settingsSchemaActiveTiers.js +14 -0
  80. package/dist/generated/settingsSchemaCallerTextEcho.d.ts +1 -0
  81. package/dist/generated/settingsSchemaCallerTextEcho.js +8 -0
  82. package/dist/generated/settingsSchemaControlAndBidi.d.ts +1 -0
  83. package/dist/generated/settingsSchemaControlAndBidi.js +8 -0
  84. package/dist/generated/settingsSchemaDefaultModel.d.ts +11 -0
  85. package/dist/generated/settingsSchemaDefaultModel.js +25 -0
  86. package/dist/generated/settingsSchemaFns.d.ts +54 -0
  87. package/dist/generated/settingsSchemaFns.js +26 -1
  88. package/dist/generated/settingsSchemaMcpRequestEntry.d.ts +1 -1
  89. package/dist/generated/settingsSchemaMcpRequestEntry.js +1 -7
  90. package/dist/generated/settingsSchemaSafetyMergeSpec.d.ts +1 -0
  91. package/dist/generated/settingsSchemaSafetyMergeSpec.js +95 -0
  92. package/dist/generated/settingsSchemaSettingsSources.d.ts +1 -0
  93. package/dist/generated/settingsSchemaSettingsSources.js +58 -0
  94. package/dist/generated/settingsSchemaTables.d.ts +2 -0
  95. package/dist/generated/settingsSchemaTables.js +13 -0
  96. package/dist/generated/settingsSchemaUrlPattern.d.ts +1 -0
  97. package/dist/generated/settingsSchemaUrlPattern.js +183 -0
  98. package/dist/headlessPermissionModeWire.d.ts +18 -2
  99. package/dist/headlessPermissionModeWire.js +30 -19
  100. package/dist/hitl/allowRuleShadow.js +7 -5
  101. package/dist/hitl/approvalCardReading.d.ts +3 -0
  102. package/dist/hitl/approvalCardReading.js +17 -0
  103. package/dist/hitl/approvalCompleteParked.js +1 -1
  104. package/dist/hitl/approvalDelivery.d.ts +87 -0
  105. package/dist/hitl/approvalDelivery.js +193 -0
  106. package/dist/hitl/approvalResolution.d.ts +11 -0
  107. package/dist/hitl/approvalResolution.js +50 -11
  108. package/dist/hitl/askClassPair.d.ts +6 -0
  109. package/dist/hitl/askClassPair.js +30 -3
  110. package/dist/hitl/askParkAutoReopenBlock.d.ts +30 -0
  111. package/dist/hitl/askParkAutoReopenBlock.js +117 -0
  112. package/dist/hitl/askParkRowRouting.js +4 -1
  113. package/dist/hitl/attributionLadder.d.ts +42 -3
  114. package/dist/hitl/attributionLadder.js +79 -8
  115. package/dist/hitl/automaticAnswerVerdict.d.ts +6 -1
  116. package/dist/hitl/automaticAnswerVerdict.js +46 -11
  117. package/dist/hitl/crashConverged.js +2 -2
  118. package/dist/hitl/decisionConflict.d.ts +6 -2
  119. package/dist/hitl/decisionConflict.js +24 -9
  120. package/dist/hitl/decisionRefusal.d.ts +20 -10
  121. package/dist/hitl/decisionRefusal.js +99 -54
  122. package/dist/hitl/decisionSend.d.ts +3 -0
  123. package/dist/hitl/decisionSend.js +87 -103
  124. package/dist/hitl/frameRouter.d.ts +1 -0
  125. package/dist/hitl/frameRouter.js +9 -2
  126. package/dist/hitl/hitlBridge.d.ts +18 -6
  127. package/dist/hitl/hitlBridge.js +41 -37
  128. package/dist/hitl/livePendingAsk.js +4 -3
  129. package/dist/hitl/noAllowCause.js +1 -1
  130. package/dist/hitl/parkResolver.js +3 -2
  131. package/dist/hitl/persistedRulesWire.js +1 -0
  132. package/dist/hitl/planReviewWire.d.ts +4 -0
  133. package/dist/hitl/planReviewWire.js +59 -30
  134. package/dist/hitl/resumeRunningCard.d.ts +3 -2
  135. package/dist/hitl/resumeRunningCard.js +17 -11
  136. package/dist/hitl/sessionPolicyDeliverable.d.ts +5 -2
  137. package/dist/hitl/sessionPolicyDeliverable.js +62 -29
  138. package/dist/hitl/sessionPolicyWire.d.ts +13 -3
  139. package/dist/hitl/sessionPolicyWire.js +81 -16
  140. package/dist/hitl/standingRows.js +1 -1
  141. package/dist/hitl/toolApprovalWire.d.ts +9 -10
  142. package/dist/hitl/toolApprovalWire.js +72 -54
  143. package/dist/hookMatcherVerdict.d.ts +2 -0
  144. package/dist/hookMatcherVerdict.js +12 -0
  145. package/dist/hooksCompactTransition.d.ts +19 -0
  146. package/dist/hooksCompactTransition.js +41 -0
  147. package/dist/hooksWireCaps.d.ts +1 -1
  148. package/dist/hooksWireCaps.js +202 -203
  149. package/dist/host.d.ts +1 -14
  150. package/dist/host.js +0 -8
  151. package/dist/hostCallbackGuard.d.ts +1 -0
  152. package/dist/hostCallbackGuard.js +1 -1
  153. package/dist/hostSettingsSource.d.ts +172 -0
  154. package/dist/hostSettingsSource.js +675 -0
  155. package/dist/hostTurnSettings.d.ts +73 -17
  156. package/dist/hostTurnSettings.js +594 -97
  157. package/dist/httpHookPolicy.d.ts +37 -0
  158. package/dist/httpHookPolicy.js +176 -0
  159. package/dist/humanTurn.d.ts +2 -1
  160. package/dist/humanTurn.js +37 -7
  161. package/dist/humanTurnRead.js +4 -3
  162. package/dist/humanTurnSentences.d.ts +10 -0
  163. package/dist/humanTurnSentences.js +74 -0
  164. package/dist/i18n/messages.en.d.ts +222 -2
  165. package/dist/i18n/messages.en.js +225 -5
  166. package/dist/i18n/messages.zh.js +237 -5
  167. package/dist/i18n/translate.js +3 -3
  168. package/dist/index.d.ts +77 -15
  169. package/dist/index.js +50 -13
  170. package/dist/inheritEnvCapability.d.ts +3 -1
  171. package/dist/inheritEnvCapability.js +31 -17
  172. package/dist/inheritEnvWire.d.ts +2 -1
  173. package/dist/inheritEnvWire.js +11 -5
  174. package/dist/interactiveHalt.d.ts +3 -1
  175. package/dist/interactiveHalt.js +2 -0
  176. package/dist/interactiveInterrupt.d.ts +2 -0
  177. package/dist/interactiveInterrupt.js +15 -0
  178. package/dist/interactiveToolsWire.d.ts +4 -2
  179. package/dist/interactiveToolsWire.js +5 -5
  180. package/dist/jsonFaithful.d.ts +20 -0
  181. package/dist/jsonFaithful.js +152 -0
  182. package/dist/limitsWire.d.ts +7 -2
  183. package/dist/limitsWire.js +19 -13
  184. package/dist/liveInitToolFace.d.ts +6 -1
  185. package/dist/liveInitToolFace.js +5 -3
  186. package/dist/liveModelCatalog.d.ts +22 -0
  187. package/dist/liveModelCatalog.js +132 -18
  188. package/dist/mcpPanel.js +1 -1
  189. package/dist/mcpProbeCapability.js +2 -2
  190. package/dist/mcpStatusSupersetKeys.d.ts +24 -0
  191. package/dist/mcpStatusSupersetKeys.js +45 -0
  192. package/dist/mcpToolToggles.js +2 -1
  193. package/dist/mcpWireCaps.d.ts +39 -1
  194. package/dist/mcpWireCaps.js +254 -50
  195. package/dist/memoryComplianceCapability.js +2 -2
  196. package/dist/memoryOriginCapability.js +2 -2
  197. package/dist/model/catalogDefault.d.ts +24 -0
  198. package/dist/model/catalogDefault.js +4 -0
  199. package/dist/model/liveCatalogShape.js +5 -4
  200. package/dist/model/modelsPolicy.js +4 -3
  201. package/dist/model/onboardJudgement.d.ts +1 -0
  202. package/dist/model/onboardJudgement.js +1 -1
  203. package/dist/model/subagentModelWord.js +2 -2
  204. package/dist/modelCapabilityProbe.js +6 -6
  205. package/dist/modelIdentityResolvability.d.ts +10 -1
  206. package/dist/modelIdentityResolvability.js +62 -39
  207. package/dist/modsFace.d.ts +8 -0
  208. package/dist/modsFace.js +59 -0
  209. package/dist/modsKernelIdentity.d.ts +10 -0
  210. package/dist/modsKernelIdentity.js +103 -0
  211. package/dist/modsKernelTransit.d.ts +8 -0
  212. package/dist/modsKernelTransit.js +6 -0
  213. package/dist/notifications.d.ts +30 -12
  214. package/dist/notifications.js +241 -53
  215. package/dist/outputStyleSeatCapability.js +2 -2
  216. package/dist/ownKey.d.ts +12 -0
  217. package/dist/ownKey.js +179 -3
  218. package/dist/panelReduce.js +1 -1
  219. package/dist/peerFrames.d.ts +1 -1
  220. package/dist/peerFrames.js +6 -2
  221. package/dist/peerLaneCapability.js +2 -2
  222. package/dist/permissionModesCapability.js +4 -4
  223. package/dist/permissionRuleIssue.js +2 -0
  224. package/dist/permissionRulesWriteCapability.js +2 -2
  225. package/dist/permissionsAllowGrantCapability.js +2 -2
  226. package/dist/permissionsDeclaration.d.ts +43 -4
  227. package/dist/permissionsDeclaration.js +102 -35
  228. package/dist/pluginHooksWire.d.ts +20 -4
  229. package/dist/pluginHooksWire.js +92 -53
  230. package/dist/prepareRefusal.d.ts +3 -2
  231. package/dist/prepareRefusal.js +27 -9
  232. package/dist/printInitToolFace.js +2 -2
  233. package/dist/printModelStatus.js +1 -1
  234. package/dist/printToolResultFrame.js +1 -1
  235. package/dist/projectMemory.d.ts +32 -0
  236. package/dist/projectMemory.js +70 -0
  237. package/dist/promptBlockedCopy.d.ts +2 -1
  238. package/dist/promptBlockedCopy.js +2 -1
  239. package/dist/promptDelivery.d.ts +23 -3
  240. package/dist/promptDelivery.js +169 -30
  241. package/dist/providerRejection.d.ts +19 -1
  242. package/dist/providerRejection.js +75 -4
  243. package/dist/queuedDelivery.d.ts +48 -0
  244. package/dist/queuedDelivery.js +233 -0
  245. package/dist/reattachWindow.d.ts +94 -0
  246. package/dist/reattachWindow.js +127 -0
  247. package/dist/request/printNotification.d.ts +1 -1
  248. package/dist/request/printNotification.js +6 -2
  249. package/dist/request/submissionIdentity.d.ts +37 -0
  250. package/dist/request/submissionIdentity.js +65 -0
  251. package/dist/request/taskRequest.d.ts +33 -4
  252. package/dist/request/taskRequest.js +341 -156
  253. package/dist/resultFrameKeys.d.ts +1 -0
  254. package/dist/resultFrameKeys.js +4 -1
  255. package/dist/retryStatus.d.ts +8 -0
  256. package/dist/retryStatus.js +57 -9
  257. package/dist/rewindArchiveCapability.js +2 -2
  258. package/dist/rewindEngineAction.d.ts +2 -0
  259. package/dist/rewindEngineAction.js +23 -1
  260. package/dist/rowKind.d.ts +36 -0
  261. package/dist/rowKind.js +97 -0
  262. package/dist/ruleCompileVerdict.d.ts +18 -0
  263. package/dist/ruleCompileVerdict.js +67 -2
  264. package/dist/ruleReadings.d.ts +58 -0
  265. package/dist/ruleReadings.js +132 -0
  266. package/dist/ruleRefusalSentence.d.ts +4 -0
  267. package/dist/ruleRefusalSentence.js +9 -3
  268. package/dist/runCancelContext.d.ts +0 -1
  269. package/dist/runCancelContext.js +1 -2
  270. package/dist/runTerminal.d.ts +5 -0
  271. package/dist/runTerminal.js +52 -17
  272. package/dist/sandboxWire.d.ts +1 -1
  273. package/dist/sandboxWire.js +4 -6
  274. package/dist/scenarioRefusal.js +1 -1
  275. package/dist/scenarioSkills.d.ts +20 -0
  276. package/dist/scenarioSkills.js +72 -0
  277. package/dist/scenarioWire.d.ts +5 -2
  278. package/dist/scenarioWire.js +9 -9
  279. package/dist/sealedKeyCapability.js +2 -2
  280. package/dist/seam.d.ts +2 -0
  281. package/dist/seam.js +3 -3
  282. package/dist/seatContract.d.ts +68 -7
  283. package/dist/seatContract.js +84 -25
  284. package/dist/selfOrchestrationDenial.js +1 -1
  285. package/dist/sessionBackground.d.ts +165 -0
  286. package/dist/sessionBackground.js +781 -0
  287. package/dist/sessionBackgroundHandoff.d.ts +54 -0
  288. package/dist/sessionBackgroundHandoff.js +321 -0
  289. package/dist/sessionMap.js +4 -1
  290. package/dist/sessionPolicyCapability.js +2 -2
  291. package/dist/sessionRulesChildrenReadLive.d.ts +6 -0
  292. package/dist/sessionRulesChildrenReadLive.js +5 -0
  293. package/dist/sessionRulesNamespaceFormsCapability.d.ts +12 -0
  294. package/dist/sessionRulesNamespaceFormsCapability.js +29 -0
  295. package/dist/sessionSyncFileHistoryCapability.js +2 -2
  296. package/dist/settingsCredentialKeyPaths.js +55 -15
  297. package/dist/settingsHooksSalvage.d.ts +1 -0
  298. package/dist/settingsHooksSalvage.js +7 -1
  299. package/dist/settingsLayerAdmission.d.ts +4 -0
  300. package/dist/settingsLayerAdmission.js +16 -0
  301. package/dist/skillToolListsCapability.js +6 -5
  302. package/dist/skillsWireCaps.d.ts +14 -0
  303. package/dist/skillsWireCaps.js +47 -16
  304. package/dist/slashCommandGate.d.ts +24 -0
  305. package/dist/slashCommandGate.js +74 -0
  306. package/dist/slashCommandTable.d.ts +14 -0
  307. package/dist/slashCommandTable.js +99 -0
  308. package/dist/sqlEngineCapability.js +2 -2
  309. package/dist/steerPriorityCapability.js +2 -2
  310. package/dist/storePostureCapability.js +2 -2
  311. package/dist/subagent/agentStateDetail.js +1 -1
  312. package/dist/subagent/engineDelegatedPrompt.d.ts +9 -0
  313. package/dist/subagent/engineDelegatedPrompt.js +38 -7
  314. package/dist/subagent/engineRowStopGate.js +2 -2
  315. package/dist/subagent/engineSubagentResume.js +3 -3
  316. package/dist/subagent/engineTaskHandleWire.d.ts +1 -0
  317. package/dist/subagent/engineTaskHandleWire.js +10 -0
  318. package/dist/submitFailure.d.ts +8 -0
  319. package/dist/submitFailure.js +17 -0
  320. package/dist/supportFloor.d.ts +1 -0
  321. package/dist/supportFloor.js +7 -0
  322. package/dist/terminationIntent.d.ts +55 -0
  323. package/dist/terminationIntent.js +352 -0
  324. package/dist/thinkingLatch.d.ts +69 -0
  325. package/dist/thinkingLatch.js +255 -0
  326. package/dist/thinkingLatchWords.d.ts +7 -0
  327. package/dist/thinkingLatchWords.js +4 -0
  328. package/dist/toolHistoryMismatch.d.ts +8 -0
  329. package/dist/toolHistoryMismatch.js +37 -6
  330. package/dist/toolResult.d.ts +13 -3
  331. package/dist/toolResult.js +159 -32
  332. package/dist/toolResultContent.d.ts +13 -0
  333. package/dist/toolResultContent.js +82 -7
  334. package/dist/toolRoster.d.ts +18 -0
  335. package/dist/toolRoster.js +64 -0
  336. package/dist/turnFailurePresentation.js +27 -90
  337. package/dist/usageLimitAutoResume.d.ts +74 -0
  338. package/dist/usageLimitAutoResume.js +227 -0
  339. package/dist/userAttachmentEnvelope.js +1 -1
  340. package/dist/userAttachmentSeat.js +5 -5
  341. package/dist/userInvokedSkillsCapability.js +2 -2
  342. package/dist/webSearchBackendCapability.js +2 -2
  343. package/dist/wireErrorTriage.js +99 -50
  344. package/dist/wireFailureShape.d.ts +25 -1
  345. package/dist/wireFailureShape.js +92 -5
  346. package/dist/wireRefusalCopy.d.ts +24 -1
  347. package/dist/wireRefusalCopy.js +253 -32
  348. package/dist/wiringFleetDoctor.d.ts +3 -0
  349. package/dist/wiringFleetDoctor.js +21 -0
  350. package/dist/workflow.d.ts +2 -1
  351. package/dist/workflow.js +38 -1
  352. package/dist/workflowClient.d.ts +2 -7
  353. package/dist/workflowsJournalCapability.js +2 -2
  354. package/dist/writeProtectionCapability.js +2 -2
  355. package/docs/INTEGRATION-CLIENTS.md +907 -182
  356. package/package.json +14 -3
  357. package/dist/argvFlagValue.d.ts +0 -8
  358. package/dist/argvFlagValue.js +0 -37
@@ -51,3 +51,10 @@ export function engineSupportFloorEffective(floor) {
51
51
  export function coreVersionTier(version, floor) {
52
52
  return judgeAgainst(version, SUPPORT_FLOOR.core, floor, 'coreVersionTier').tier;
53
53
  }
54
+ export function compareReleaseVersions(a, b) {
55
+ const ta = releaseTriple(a);
56
+ const tb = releaseTriple(b);
57
+ if (ta === undefined || tb === undefined)
58
+ return undefined;
59
+ return compareTriple(ta, tb);
60
+ }
@@ -0,0 +1,55 @@
1
+ import type { UiLanguage } from './env/uiLanguage.js';
2
+ export declare const TERMINATION_INTENT_TTL_MS = 60000;
3
+ export declare const TERMINATION_INTENT_WEAK_SOURCE = "esc-abort";
4
+ export declare const INTERRUPTED_SETTLE_BUDGET_MS = 10000;
5
+ export declare const INTERRUPTED_SETTLE_POLL_MS = 1000;
6
+ export type TerminationIntentSource = string;
7
+ export interface TerminationIntentSnapshot {
8
+ readonly source: TerminationIntentSource;
9
+ readonly at: number;
10
+ readonly abortAt: number | null;
11
+ }
12
+ export interface TerminationIntentLedgerOptions {
13
+ readonly now: () => number;
14
+ readonly ttlMs?: number;
15
+ readonly exemptAbortReasons?: readonly string[];
16
+ }
17
+ export interface TerminationIntentLedger {
18
+ record(taskId: string | null | undefined, source: TerminationIntentSource): number;
19
+ snapshot(taskId: string | null | undefined): TerminationIntentSnapshot | null;
20
+ restoreIf(taskId: string | null | undefined, version: number, snapshot: TerminationIntentSnapshot | null): boolean;
21
+ rollbackIf(taskId: string | null | undefined, version: number, prior: TerminationIntentSource | null): boolean;
22
+ rollback(taskId: string | null | undefined, prior: TerminationIntentSource | null): void;
23
+ wasRecentlyTerminatedByUs(taskId: string | null | undefined): boolean;
24
+ sourceOf(taskId: string | null | undefined): TerminationIntentSource | null;
25
+ armOnAbort(signal: AbortSignal | undefined, taskId: string): void;
26
+ forget(taskId: string | null | undefined): void;
27
+ size(): number;
28
+ }
29
+ export declare function createTerminationIntentLedger(options: TerminationIntentLedgerOptions): TerminationIntentLedger;
30
+ export type InterruptedRunSettleVerdict = {
31
+ readonly kind: 'settled';
32
+ readonly status: string;
33
+ } | {
34
+ readonly kind: 'still-running';
35
+ readonly waitedMs: number;
36
+ } | {
37
+ readonly kind: 'parked';
38
+ readonly status: string;
39
+ } | {
40
+ readonly kind: 'unknown';
41
+ };
42
+ export interface InterruptedRunRow {
43
+ readonly status?: string | null;
44
+ }
45
+ export interface InterruptedRunSettleDeps {
46
+ readonly getRun?: (taskId: string, opts?: {
47
+ signal?: AbortSignal;
48
+ }) => Promise<InterruptedRunRow | null>;
49
+ readonly signal?: AbortSignal;
50
+ readonly budgetMs?: number;
51
+ readonly intervalMs?: number;
52
+ readonly now?: () => number;
53
+ }
54
+ export declare function awaitInterruptedRunSettle(taskId: string, deps: InterruptedRunSettleDeps): Promise<InterruptedRunSettleVerdict>;
55
+ export declare function interruptedRunSettleRow(taskId: string, verdict: InterruptedRunSettleVerdict, lang?: UiLanguage): string | null;
@@ -0,0 +1,352 @@
1
+ import { usableClockMs } from './clockReading.js';
2
+ import { displayUntrusted } from './displayUntrusted.js';
3
+ import { linkedAbortSignal, readSignalAborted, readSignalReason, tryListenAbortOnce, tryUnlistenAbort } from './engineWireFor.js';
4
+ import { msg, renderMessage } from './i18n/translate.js';
5
+ import { abortableSleep } from './abortableSleep.js';
6
+ import { isSdkRunParked, isSdkRunTerminal } from './terminalStatuses.js';
7
+ export const TERMINATION_INTENT_TTL_MS = 60_000;
8
+ export const TERMINATION_INTENT_WEAK_SOURCE = 'esc-abort';
9
+ export const INTERRUPTED_SETTLE_BUDGET_MS = 10_000;
10
+ export const INTERRUPTED_SETTLE_POLL_MS = 1_000;
11
+ const MAX_ROWS = 256;
12
+ const MAX_TRACKED_WRITES = 1024;
13
+ const validId = (taskId) => typeof taskId === 'string' && taskId.length > 0;
14
+ const validSource = (s) => typeof s === 'string' && s.length > 0;
15
+ function readSnapshot(s) {
16
+ try {
17
+ if (typeof s !== 'object' || s === null)
18
+ return null;
19
+ const raw = s;
20
+ const source = raw.source;
21
+ const at = raw.at;
22
+ const abortAt = raw.abortAt;
23
+ if (!validSource(source) || usableClockMs(at) === null)
24
+ return null;
25
+ return { source, at: at, abortAt: typeof abortAt === 'number' && usableClockMs(abortAt) !== null ? abortAt : null };
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ export function createTerminationIntentLedger(options) {
32
+ if (typeof options !== 'object' || options === null || typeof options.now !== 'function') {
33
+ throw new TypeError('createTerminationIntentLedger: options.now must be a function returning milliseconds');
34
+ }
35
+ const readClock = options.now;
36
+ const ttl = typeof options.ttlMs === 'number' && Number.isFinite(options.ttlMs) && options.ttlMs > 0 ? options.ttlMs : TERMINATION_INTENT_TTL_MS;
37
+ const exempt = Object.freeze([...(options.exemptAbortReasons ?? ['background'])]);
38
+ const rows = new Map();
39
+ let nextVersion = 1;
40
+ const priors = new Map();
41
+ const refused = new Set();
42
+ const trackBounded = (m, k, v) => {
43
+ m.set(k, v);
44
+ while (m.size > MAX_TRACKED_WRITES) {
45
+ const oldest = m.keys().next();
46
+ if (oldest.done === true)
47
+ break;
48
+ m.delete(oldest.value);
49
+ }
50
+ };
51
+ const markRefused = (version) => {
52
+ if (typeof version !== 'number')
53
+ return;
54
+ refused.add(version);
55
+ while (refused.size > MAX_TRACKED_WRITES) {
56
+ const oldest = refused.values().next();
57
+ if (oldest.done === true)
58
+ break;
59
+ refused.delete(oldest.value);
60
+ }
61
+ };
62
+ const effectivePrior = (version) => {
63
+ if (!priors.has(version))
64
+ return { known: false, row: null };
65
+ let row = priors.get(version) ?? null;
66
+ for (let hops = 0; row !== null && refused.has(row.version) && priors.has(row.version) && hops < MAX_TRACKED_WRITES; hops += 1)
67
+ row = priors.get(row.version) ?? null;
68
+ return { known: true, row };
69
+ };
70
+ const clock = () => {
71
+ try {
72
+ return usableClockMs(readClock());
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ };
78
+ const isFresh = (now, at) => {
79
+ const age = now - at;
80
+ return age >= 0 && age < ttl;
81
+ };
82
+ const purge = (now) => {
83
+ for (const [taskId, row] of rows) {
84
+ if (isFresh(now, row.at))
85
+ continue;
86
+ if (row.abortAt !== null && isFresh(now, row.abortAt)) {
87
+ rows.set(taskId, { at: row.abortAt, source: TERMINATION_INTENT_WEAK_SOURCE, abortAt: row.abortAt, version: nextVersion++ });
88
+ }
89
+ else {
90
+ rows.delete(taskId);
91
+ }
92
+ }
93
+ };
94
+ const put = (taskId, row) => {
95
+ rows.delete(taskId);
96
+ while (rows.size >= MAX_ROWS) {
97
+ const oldest = rows.keys().next();
98
+ if (oldest.done === true)
99
+ break;
100
+ rows.delete(oldest.value);
101
+ }
102
+ rows.set(taskId, row);
103
+ };
104
+ const record = (taskId, source) => {
105
+ if (!validId(taskId) || !validSource(source))
106
+ return 0;
107
+ const now = clock();
108
+ if (now === null)
109
+ return 0;
110
+ purge(now);
111
+ const prev = rows.get(taskId);
112
+ const abortAt = prev?.abortAt ?? (source === TERMINATION_INTENT_WEAK_SOURCE ? now : null);
113
+ const version = nextVersion++;
114
+ trackBounded(priors, version, prev ?? null);
115
+ put(taskId, { at: now, source, abortAt, version });
116
+ return version;
117
+ };
118
+ const rollback = (taskId, prior) => {
119
+ if (!validId(taskId))
120
+ return;
121
+ const now = clock();
122
+ if (now === null)
123
+ return;
124
+ purge(now);
125
+ if (prior !== null && validSource(prior) && prior !== TERMINATION_INTENT_WEAK_SOURCE) {
126
+ record(taskId, prior);
127
+ return;
128
+ }
129
+ const row = rows.get(taskId);
130
+ const abortAt = row?.abortAt ?? null;
131
+ if (abortAt !== null && isFresh(now, abortAt)) {
132
+ put(taskId, { at: abortAt, source: TERMINATION_INTENT_WEAK_SOURCE, abortAt, version: nextVersion++ });
133
+ return;
134
+ }
135
+ rows.delete(taskId);
136
+ };
137
+ const restoreTo = (taskId, row, target, now) => {
138
+ if (target === null) {
139
+ rollback(taskId, null);
140
+ return;
141
+ }
142
+ const abortAt = target.abortAt === null ? row.abortAt : row.abortAt === null ? target.abortAt : Math.max(target.abortAt, row.abortAt);
143
+ put(taskId, { at: target.at, source: target.source, abortAt, version: target.version ?? nextVersion++ });
144
+ purge(now);
145
+ };
146
+ return {
147
+ record,
148
+ snapshot(taskId) {
149
+ if (!validId(taskId))
150
+ return null;
151
+ const now = clock();
152
+ if (now === null)
153
+ return null;
154
+ purge(now);
155
+ const row = rows.get(taskId);
156
+ return row === undefined ? null : Object.freeze({ source: row.source, at: row.at, abortAt: row.abortAt });
157
+ },
158
+ restoreIf(taskId, version, snapshot) {
159
+ if (!validId(taskId))
160
+ return false;
161
+ const now = clock();
162
+ if (now === null)
163
+ return false;
164
+ purge(now);
165
+ markRefused(version);
166
+ const row = rows.get(taskId);
167
+ if (row === undefined || row.version !== version)
168
+ return false;
169
+ const eff = effectivePrior(version);
170
+ restoreTo(taskId, row, eff.known ? eff.row : readSnapshot(snapshot), now);
171
+ return true;
172
+ },
173
+ rollbackIf(taskId, version, prior) {
174
+ if (!validId(taskId))
175
+ return false;
176
+ const now = clock();
177
+ if (now === null)
178
+ return false;
179
+ purge(now);
180
+ markRefused(version);
181
+ const row = rows.get(taskId);
182
+ if (row === undefined || row.version !== version)
183
+ return false;
184
+ const eff = effectivePrior(version);
185
+ if (eff.known)
186
+ restoreTo(taskId, row, eff.row, now);
187
+ else
188
+ rollback(taskId, prior);
189
+ return true;
190
+ },
191
+ rollback,
192
+ wasRecentlyTerminatedByUs(taskId) {
193
+ if (!validId(taskId))
194
+ return false;
195
+ const now = clock();
196
+ if (now === null)
197
+ return false;
198
+ purge(now);
199
+ return rows.has(taskId);
200
+ },
201
+ sourceOf(taskId) {
202
+ if (!validId(taskId))
203
+ return null;
204
+ const now = clock();
205
+ if (now === null)
206
+ return null;
207
+ purge(now);
208
+ return rows.get(taskId)?.source ?? null;
209
+ },
210
+ armOnAbort(signal, taskId) {
211
+ if (signal === undefined || signal === null || !validId(taskId))
212
+ return;
213
+ const onAbort = () => {
214
+ const read = readSignalReason(signal);
215
+ if (read === null)
216
+ return;
217
+ if (typeof read.reason === 'string' && exempt.includes(read.reason))
218
+ return;
219
+ const now = clock();
220
+ if (now === null)
221
+ return;
222
+ purge(now);
223
+ const existing = rows.get(taskId);
224
+ if (existing !== undefined && existing.source !== TERMINATION_INTENT_WEAK_SOURCE) {
225
+ put(taskId, { ...existing, abortAt: now });
226
+ return;
227
+ }
228
+ put(taskId, { at: now, source: TERMINATION_INTENT_WEAK_SOURCE, abortAt: now, version: nextVersion++ });
229
+ };
230
+ const aborted = readSignalAborted(signal);
231
+ if (aborted === null)
232
+ return;
233
+ if (aborted) {
234
+ onAbort();
235
+ return;
236
+ }
237
+ tryListenAbortOnce(signal, onAbort);
238
+ },
239
+ forget(taskId) {
240
+ if (!validId(taskId))
241
+ return;
242
+ rows.delete(taskId);
243
+ },
244
+ size() {
245
+ const now = clock();
246
+ if (now !== null)
247
+ purge(now);
248
+ return rows.size;
249
+ },
250
+ };
251
+ }
252
+ function readStatus(row) {
253
+ try {
254
+ const s = row?.status;
255
+ return typeof s === 'string' && s.length > 0 ? s : null;
256
+ }
257
+ catch {
258
+ return null;
259
+ }
260
+ }
261
+ const PROBE_STOPPED = Symbol('sema.interruptedSettleProbeStopped');
262
+ const PROBE_FAILED = Symbol('sema.interruptedSettleProbeFailed');
263
+ const positive = (v, fallback) => (typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : fallback);
264
+ export async function awaitInterruptedRunSettle(taskId, deps) {
265
+ const getRun = deps?.getRun;
266
+ if (typeof getRun !== 'function')
267
+ return { kind: 'unknown' };
268
+ if (!validId(taskId))
269
+ return { kind: 'unknown' };
270
+ const budgetMs = positive(deps.budgetMs, INTERRUPTED_SETTLE_BUDGET_MS);
271
+ const intervalMs = positive(deps.intervalMs, INTERRUPTED_SETTLE_POLL_MS);
272
+ const clockNow = typeof deps.now === 'function' ? deps.now : () => performance.now();
273
+ const readNow = () => {
274
+ try {
275
+ const t = clockNow();
276
+ return Number.isFinite(t) ? t : 0;
277
+ }
278
+ catch {
279
+ return 0;
280
+ }
281
+ };
282
+ const started = readNow();
283
+ let sawRunning = false;
284
+ const isAborted = () => deps.signal?.aborted === true;
285
+ const budgetAc = new AbortController();
286
+ let budgetSpent = false;
287
+ let markStopped = () => { };
288
+ const stopped = new Promise((resolve) => {
289
+ markStopped = () => resolve(PROBE_STOPPED);
290
+ });
291
+ const onCallerAbort = () => markStopped();
292
+ const budgetTimer = setTimeout(() => {
293
+ budgetSpent = true;
294
+ budgetAc.abort();
295
+ markStopped();
296
+ }, budgetMs);
297
+ if (deps.signal !== undefined)
298
+ tryListenAbortOnce(deps.signal, onCallerAbort);
299
+ if (isAborted())
300
+ markStopped();
301
+ const linked = linkedAbortSignal(deps.signal, budgetAc.signal);
302
+ const probeSignal = linked.signal;
303
+ try {
304
+ for (;;) {
305
+ if (isAborted())
306
+ return { kind: 'unknown' };
307
+ if (budgetSpent)
308
+ break;
309
+ let probe;
310
+ try {
311
+ probe = Promise.resolve(getRun(taskId, { signal: probeSignal })).then((row) => row, () => PROBE_FAILED);
312
+ }
313
+ catch {
314
+ probe = Promise.resolve(PROBE_FAILED);
315
+ }
316
+ const outcome = await Promise.race([probe, stopped]);
317
+ if (isAborted())
318
+ return { kind: 'unknown' };
319
+ const status = outcome === PROBE_STOPPED || outcome === PROBE_FAILED ? null : readStatus(outcome);
320
+ if (status !== null) {
321
+ if (isSdkRunTerminal(status))
322
+ return { kind: 'settled', status };
323
+ if (isSdkRunParked(status))
324
+ return { kind: 'parked', status };
325
+ if (status === 'running')
326
+ sawRunning = true;
327
+ }
328
+ if (budgetSpent)
329
+ break;
330
+ const left = started + budgetMs - readNow();
331
+ if (left <= 0)
332
+ break;
333
+ await abortableSleep(Math.min(intervalMs, left), probeSignal);
334
+ if (isAborted())
335
+ return { kind: 'unknown' };
336
+ }
337
+ if (isAborted())
338
+ return { kind: 'unknown' };
339
+ return sawRunning ? { kind: 'still-running', waitedMs: Math.max(0, readNow() - started) } : { kind: 'unknown' };
340
+ }
341
+ finally {
342
+ clearTimeout(budgetTimer);
343
+ linked.dispose();
344
+ if (deps.signal !== undefined)
345
+ tryUnlistenAbort(deps.signal, onCallerAbort);
346
+ }
347
+ }
348
+ export function interruptedRunSettleRow(taskId, verdict, lang) {
349
+ if (typeof verdict !== 'object' || verdict === null || verdict.kind !== 'settled')
350
+ return null;
351
+ return renderMessage(msg('session.selfHeal.row.interrupted.settled', { taskId: displayUntrusted(String(taskId), { max: 120 }) }), lang);
352
+ }
@@ -0,0 +1,69 @@
1
+ import type { UiLanguage } from './env/uiLanguage.js';
2
+ import type { EffortLevelsReading } from './liveModelCatalog.js';
3
+ import type { ThinkingTurnProjection } from './request/taskRequest.js';
4
+ import { type LocalSessionRecord, type OkAck, type SeatCapabilityReading } from './seatContract.js';
5
+ import { type ThinkingLatchEvent, type ThinkingLatchRowWord, type ThinkingLatchState } from './thinkingLatchWords.js';
6
+ export type { ThinkingLatchEvent, ThinkingLatchRowWord, ThinkingLatchState } from './thinkingLatchWords.js';
7
+ export interface ThinkingLatchStorePort {
8
+ read(): boolean | undefined;
9
+ write(stored: boolean | undefined): void;
10
+ }
11
+ export interface ThinkingLatchReading {
12
+ readonly state: ThinkingLatchState;
13
+ readonly why?: 'no_port' | 'never_set' | 'unreadable' | 'malformed';
14
+ }
15
+ export type ThinkingLatchWriteOutcome = {
16
+ readonly kind: 'saved';
17
+ readonly previous: ThinkingLatchReading;
18
+ readonly state: ThinkingLatchState;
19
+ } | {
20
+ readonly kind: 'unchanged';
21
+ readonly state: ThinkingLatchState;
22
+ } | {
23
+ readonly kind: 'not_saved';
24
+ readonly why: 'no_port' | 'bad_event';
25
+ readonly previous: ThinkingLatchReading;
26
+ } | {
27
+ readonly kind: 'not_saved';
28
+ readonly why: 'write_failed';
29
+ readonly attempted: ThinkingLatchState;
30
+ readonly now: ThinkingLatchReading;
31
+ };
32
+ export interface ThinkingLatchView {
33
+ readonly state: ThinkingLatchState;
34
+ readonly why?: ThinkingLatchReading['why'];
35
+ readonly conflict?: 'seat_cannot_carry' | 'model_cannot_think';
36
+ }
37
+ export type ThinkingLatchCarrier = {
38
+ readonly kind: 'engine';
39
+ } | {
40
+ readonly kind: 'seat';
41
+ readonly capability: SeatCapabilityReading;
42
+ };
43
+ export type ThinkingLatchSentenceSubject = {
44
+ readonly kind: 'state';
45
+ readonly state: ThinkingLatchState;
46
+ } | {
47
+ readonly kind: 'turn';
48
+ readonly projection: ThinkingTurnProjection;
49
+ } | {
50
+ readonly kind: 'view';
51
+ readonly view: ThinkingLatchView;
52
+ readonly carrier?: ThinkingLatchCarrier;
53
+ readonly model?: string;
54
+ } | {
55
+ readonly kind: 'write';
56
+ readonly outcome: ThinkingLatchWriteOutcome;
57
+ } | {
58
+ readonly kind: 'seat_ack';
59
+ readonly ack: OkAck;
60
+ };
61
+ export declare function readThinkingLatch(port: ThinkingLatchStorePort | undefined): ThinkingLatchReading;
62
+ export declare function writeThinkingLatch(port: ThinkingLatchStorePort | undefined, event: ThinkingLatchEvent): ThinkingLatchWriteOutcome;
63
+ export declare function thinkingLatchView(reading: ThinkingLatchReading, ctx?: {
64
+ readonly carrier?: ThinkingLatchCarrier;
65
+ readonly model?: EffortLevelsReading;
66
+ }): ThinkingLatchView;
67
+ export declare function thinkingLatchSentence(subject: ThinkingLatchSentenceSubject, lang?: UiLanguage): string | undefined;
68
+ export declare function thinkingLatchRowWordOf(reading: ThinkingLatchReading): ThinkingLatchRowWord | undefined;
69
+ export declare function readSeatThinkingLatch(record: LocalSessionRecord | undefined, capability: SeatCapabilityReading): ThinkingLatchReading;