@sema-agent/client-core 0.77.0 → 0.77.2

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 (382) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/README.md +5 -4
  3. package/dist/abortableSleep.d.ts +0 -28
  4. package/dist/abortableSleep.js +0 -28
  5. package/dist/adapt/arms.d.ts +0 -46
  6. package/dist/adapt/arms.js +9 -544
  7. package/dist/adapt/ids.d.ts +0 -58
  8. package/dist/adapt/ids.js +0 -63
  9. package/dist/adapt/instanceLedger.d.ts +0 -25
  10. package/dist/adapt/instanceLedger.js +0 -20
  11. package/dist/adapt/panelTasks.d.ts +0 -69
  12. package/dist/adapt/panelTasks.js +0 -95
  13. package/dist/adapt/textSegmentAuthority.d.ts +1 -137
  14. package/dist/adapt/textSegmentAuthority.js +0 -54
  15. package/dist/adapt/textStream.d.ts +0 -252
  16. package/dist/adapt/textStream.js +2 -281
  17. package/dist/adapt/toolCards.d.ts +0 -46
  18. package/dist/adapt/toolCards.js +0 -23
  19. package/dist/adapt/turnFlags.d.ts +0 -54
  20. package/dist/adapt/turnFlags.js +1 -17
  21. package/dist/adapt/wireShapes.d.ts +0 -92
  22. package/dist/adapt/wireShapes.js +0 -83
  23. package/dist/adapt.d.ts +0 -55
  24. package/dist/adapt.js +1 -120
  25. package/dist/adapter/activeRunSelfHeal.d.ts +22 -515
  26. package/dist/adapter/activeRunSelfHeal.js +10 -625
  27. package/dist/adapter/downstream/eventToSdkMessage.d.ts +2 -305
  28. package/dist/adapter/downstream/eventToSdkMessage.js +2 -867
  29. package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -314
  30. package/dist/adapter/downstream/terminalToSdkResult.js +13 -560
  31. package/dist/adapter/downstream/turnUsageToModelUsage.d.ts +0 -95
  32. package/dist/adapter/downstream/turnUsageToModelUsage.js +2 -31
  33. package/dist/adapter/runStream.d.ts +0 -206
  34. package/dist/adapter/runStream.js +6 -596
  35. package/dist/adapter/types.d.ts +0 -111
  36. package/dist/adapter/types.js +0 -29
  37. package/dist/agentSession/backgroundView.d.ts +0 -106
  38. package/dist/agentSession/backgroundView.js +3 -49
  39. package/dist/agentSession/contract.d.ts +0 -98
  40. package/dist/agentSession/contract.js +0 -12
  41. package/dist/agentsWireCaps.d.ts +0 -72
  42. package/dist/agentsWireCaps.js +4 -72
  43. package/dist/approvalsStreamLiveCapability.d.ts +0 -25
  44. package/dist/approvalsStreamLiveCapability.js +0 -31
  45. package/dist/argvFlagValue.d.ts +0 -33
  46. package/dist/argvFlagValue.js +3 -35
  47. package/dist/attachmentsWireCaps.d.ts +0 -127
  48. package/dist/attachmentsWireCaps.js +0 -144
  49. package/dist/autoModeUnavailable.d.ts +0 -120
  50. package/dist/autoModeUnavailable.js +0 -144
  51. package/dist/classifierStatus.d.ts +0 -72
  52. package/dist/classifierStatus.js +0 -167
  53. package/dist/classifierVerdictWire.d.ts +0 -54
  54. package/dist/classifierVerdictWire.js +0 -133
  55. package/dist/clientContextWireCaps.d.ts +0 -37
  56. package/dist/clientContextWireCaps.js +0 -36
  57. package/dist/clientSlice.d.ts +0 -63
  58. package/dist/clientSlice.js +0 -45
  59. package/dist/cloudConfigWireCaps.d.ts +0 -86
  60. package/dist/cloudConfigWireCaps.js +2 -65
  61. package/dist/compensations.d.ts +0 -52
  62. package/dist/compensations.js +2 -63
  63. package/dist/controlRouter.d.ts +2 -208
  64. package/dist/controlRouter.js +1 -129
  65. package/dist/coreValuePorts.d.ts +0 -84
  66. package/dist/coreValuePorts.js +0 -29
  67. package/dist/decideReceipt.d.ts +0 -110
  68. package/dist/decideReceipt.js +0 -84
  69. package/dist/detachWire.d.ts +0 -130
  70. package/dist/detachWire.js +1 -130
  71. package/dist/deviceExecutorManagementCapability.d.ts +2 -35
  72. package/dist/deviceExecutorManagementCapability.js +1 -37
  73. package/dist/diagnostics.d.ts +0 -8
  74. package/dist/diagnostics.js +0 -8
  75. package/dist/diff/patch.d.ts +0 -17
  76. package/dist/diff/patch.js +0 -19
  77. package/dist/effectiveFacts.d.ts +0 -40
  78. package/dist/effectiveFacts.js +0 -22
  79. package/dist/effortWire.d.ts +0 -11
  80. package/dist/effortWire.js +0 -12
  81. package/dist/engineAgentPanelStore.d.ts +0 -169
  82. package/dist/engineAgentPanelStore.js +13 -293
  83. package/dist/engineCapReader.d.ts +0 -62
  84. package/dist/engineCapReader.js +1 -43
  85. package/dist/engineCapsCache.d.ts +0 -177
  86. package/dist/engineCapsCache.js +0 -199
  87. package/dist/engineCapsGenerationGuard.d.ts +0 -2
  88. package/dist/engineCapsGenerationGuard.js +0 -11
  89. package/dist/engineErrorCodes.d.ts +1 -316
  90. package/dist/engineErrorCodes.js +0 -427
  91. package/dist/engineHttpTools.d.ts +0 -29
  92. package/dist/engineHttpTools.js +0 -29
  93. package/dist/engineIdentity.d.ts +0 -83
  94. package/dist/engineIdentity.js +0 -88
  95. package/dist/engineInlineTaskStats.d.ts +0 -57
  96. package/dist/engineInlineTaskStats.js +1 -42
  97. package/dist/engineNoticeCodes.d.ts +0 -190
  98. package/dist/engineNoticeCodes.js +0 -182
  99. package/dist/engineSessionParam.d.ts +0 -30
  100. package/dist/engineSessionParam.js +0 -52
  101. package/dist/engineToolLabelStore.d.ts +0 -29
  102. package/dist/engineToolLabelStore.js +0 -31
  103. package/dist/engineWireSdk.d.ts +0 -90
  104. package/dist/engineWireSdk.js +0 -74
  105. package/dist/engineWireTarget.d.ts +0 -14
  106. package/dist/engineWireTarget.js +0 -39
  107. package/dist/env/localeGeo.d.ts +0 -12
  108. package/dist/env/localeGeo.js +2 -77
  109. package/dist/env/localeTag.d.ts +0 -34
  110. package/dist/env/localeTag.js +0 -32
  111. package/dist/env/uiLanguage.d.ts +0 -13
  112. package/dist/env/uiLanguage.js +0 -25
  113. package/dist/envFlag.d.ts +0 -37
  114. package/dist/envFlag.js +0 -40
  115. package/dist/executionLaneCapability.d.ts +0 -48
  116. package/dist/executionLaneCapability.js +0 -54
  117. package/dist/finalVerifyWire.d.ts +0 -67
  118. package/dist/finalVerifyWire.js +3 -43
  119. package/dist/fleet/fleetLedger.d.ts +0 -308
  120. package/dist/fleet/fleetLedger.js +10 -429
  121. package/dist/fleet/fleetProjection.d.ts +0 -240
  122. package/dist/fleet/fleetProjection.js +0 -189
  123. package/dist/fleet/fleetRowAgentType.d.ts +0 -6
  124. package/dist/fleet/fleetRowAgentType.js +1 -32
  125. package/dist/fleet/workflowSizeWarning.d.ts +0 -47
  126. package/dist/fleet/workflowSizeWarning.js +1 -46
  127. package/dist/fleetAgentPanelProjection.d.ts +0 -48
  128. package/dist/fleetAgentPanelProjection.js +8 -173
  129. package/dist/fleetTaskDesc.d.ts +0 -39
  130. package/dist/fleetTaskDesc.js +0 -69
  131. package/dist/forkWireCaps.d.ts +0 -23
  132. package/dist/forkWireCaps.js +1 -24
  133. package/dist/gateOutcome.d.ts +0 -140
  134. package/dist/gateOutcome.js +0 -85
  135. package/dist/gateVocabulary.d.ts +0 -114
  136. package/dist/gateVocabulary.js +1 -161
  137. package/dist/goalStopHook.d.ts +0 -127
  138. package/dist/goalStopHook.js +0 -178
  139. package/dist/headlessPermissionModeWire.d.ts +0 -76
  140. package/dist/headlessPermissionModeWire.js +1 -155
  141. package/dist/headlessReconnectWire.d.ts +0 -84
  142. package/dist/headlessReconnectWire.js +13 -67
  143. package/dist/hitl/approvalDecisionNoteAudit.d.ts +0 -49
  144. package/dist/hitl/approvalDecisionNoteAudit.js +0 -56
  145. package/dist/hitl/approvalOutcomeNote.d.ts +0 -2
  146. package/dist/hitl/approvalOutcomeNote.js +0 -20
  147. package/dist/hitl/approvalResolution.d.ts +0 -113
  148. package/dist/hitl/approvalResolution.js +0 -66
  149. package/dist/hitl/approvalsFeed.d.ts +0 -183
  150. package/dist/hitl/approvalsFeed.js +12 -243
  151. package/dist/hitl/armedGateRegistry.d.ts +0 -55
  152. package/dist/hitl/armedGateRegistry.js +0 -146
  153. package/dist/hitl/askGateWire.d.ts +0 -86
  154. package/dist/hitl/askGateWire.js +1 -95
  155. package/dist/hitl/askParkRowRouting.d.ts +0 -123
  156. package/dist/hitl/askParkRowRouting.js +1 -89
  157. package/dist/hitl/crashConverged.d.ts +0 -148
  158. package/dist/hitl/crashConverged.js +0 -214
  159. package/dist/hitl/editedRuleTextPrecheck.d.ts +0 -109
  160. package/dist/hitl/editedRuleTextPrecheck.js +0 -71
  161. package/dist/hitl/frameRouter.d.ts +0 -134
  162. package/dist/hitl/frameRouter.js +6 -378
  163. package/dist/hitl/gateIdentity.d.ts +0 -39
  164. package/dist/hitl/gateIdentity.js +0 -41
  165. package/dist/hitl/gateLedger.d.ts +0 -267
  166. package/dist/hitl/gateLedger.js +0 -121
  167. package/dist/hitl/hitlBridge.d.ts +7 -431
  168. package/dist/hitl/hitlBridge.js +7 -476
  169. package/dist/hitl/hitlHostSurface.d.ts +0 -150
  170. package/dist/hitl/hitlHostSurface.js +0 -169
  171. package/dist/hitl/livePendingAsk.d.ts +0 -91
  172. package/dist/hitl/livePendingAsk.js +0 -74
  173. package/dist/hitl/localAllowRule.d.ts +0 -62
  174. package/dist/hitl/localAllowRule.js +1 -33
  175. package/dist/hitl/parkOwnership.d.ts +0 -56
  176. package/dist/hitl/parkOwnership.js +0 -22
  177. package/dist/hitl/parkResolver.d.ts +3 -88
  178. package/dist/hitl/parkResolver.js +8 -349
  179. package/dist/hitl/parkRowBirthWait.d.ts +2 -26
  180. package/dist/hitl/parkRowBirthWait.js +3 -93
  181. package/dist/hitl/persistedRulesWire.d.ts +13 -358
  182. package/dist/hitl/persistedRulesWire.js +0 -310
  183. package/dist/hitl/planReviewWire.d.ts +4 -176
  184. package/dist/hitl/planReviewWire.js +9 -312
  185. package/dist/hitl/resumeRunningCard.d.ts +0 -105
  186. package/dist/hitl/resumeRunningCard.js +0 -105
  187. package/dist/hitl/sessionPolicyWire.d.ts +11 -191
  188. package/dist/hitl/sessionPolicyWire.js +0 -149
  189. package/dist/hitl/suspendedReopen.d.ts +3 -24
  190. package/dist/hitl/suspendedReopen.js +0 -14
  191. package/dist/hitl/toolApprovalWire.d.ts +5 -1308
  192. package/dist/hitl/toolApprovalWire.js +5 -945
  193. package/dist/hooksWireCaps.d.ts +0 -38
  194. package/dist/hooksWireCaps.js +0 -190
  195. package/dist/host.d.ts +0 -105
  196. package/dist/host.js +0 -33
  197. package/dist/hostEnv.d.ts +0 -14
  198. package/dist/hostEnv.js +0 -13
  199. package/dist/imagesWireCaps.d.ts +0 -21
  200. package/dist/imagesWireCaps.js +0 -22
  201. package/dist/index.d.ts +0 -134
  202. package/dist/index.js +0 -476
  203. package/dist/interactiveHalt.d.ts +5 -153
  204. package/dist/interactiveHalt.js +0 -111
  205. package/dist/interactiveToolsWire.d.ts +0 -62
  206. package/dist/interactiveToolsWire.js +1 -67
  207. package/dist/leaderConflict.d.ts +0 -59
  208. package/dist/leaderConflict.js +0 -48
  209. package/dist/limitsWire.d.ts +0 -125
  210. package/dist/limitsWire.js +2 -120
  211. package/dist/liveInitToolFace.d.ts +0 -77
  212. package/dist/liveInitToolFace.js +1 -109
  213. package/dist/liveModelCatalog.d.ts +0 -52
  214. package/dist/liveModelCatalog.js +0 -48
  215. package/dist/liveQuestionStore.d.ts +0 -87
  216. package/dist/liveQuestionStore.js +1 -56
  217. package/dist/mcpLiveness.d.ts +0 -151
  218. package/dist/mcpLiveness.js +0 -122
  219. package/dist/mcpPanel.d.ts +0 -104
  220. package/dist/mcpPanel.js +0 -49
  221. package/dist/mcpReconnect.d.ts +0 -58
  222. package/dist/mcpReconnect.js +1 -69
  223. package/dist/mcpWireCaps.d.ts +0 -55
  224. package/dist/mcpWireCaps.js +1 -13
  225. package/dist/memoryComplianceCapability.d.ts +3 -57
  226. package/dist/memoryComplianceCapability.js +0 -57
  227. package/dist/memoryEntriesWire.d.ts +6 -198
  228. package/dist/memoryEntriesWire.js +0 -144
  229. package/dist/memoryOriginCapability.d.ts +3 -53
  230. package/dist/memoryOriginCapability.js +0 -50
  231. package/dist/memorySpecWire.d.ts +0 -116
  232. package/dist/memorySpecWire.js +0 -150
  233. package/dist/model/catalog.d.ts +0 -111
  234. package/dist/model/catalog.js +0 -87
  235. package/dist/model/catalogLoader.d.ts +0 -114
  236. package/dist/model/catalogLoader.js +2 -139
  237. package/dist/model/modelSupplyRules.d.ts +1 -55
  238. package/dist/model/modelSupplyRules.js +0 -62
  239. package/dist/model/providerAuth.d.ts +0 -103
  240. package/dist/model/providerAuth.js +2 -38
  241. package/dist/model/providerCatalog.d.ts +0 -45
  242. package/dist/model/providerCatalog.js +0 -37
  243. package/dist/model/providerPresets.d.ts +0 -33
  244. package/dist/model/providerPresets.js +2 -91
  245. package/dist/model/tierVocabulary.d.ts +0 -31
  246. package/dist/model/tierVocabulary.js +0 -27
  247. package/dist/modelBudgetRule.d.ts +0 -39
  248. package/dist/modelBudgetRule.js +0 -39
  249. package/dist/modelCapabilityProbe.d.ts +0 -175
  250. package/dist/modelCapabilityProbe.js +0 -147
  251. package/dist/modelWireCaps.d.ts +0 -13
  252. package/dist/modelWireCaps.js +0 -13
  253. package/dist/notifications.d.ts +0 -233
  254. package/dist/notifications.js +14 -492
  255. package/dist/oneShotWireCaps.d.ts +0 -34
  256. package/dist/oneShotWireCaps.js +0 -35
  257. package/dist/ownKey.d.ts +0 -33
  258. package/dist/ownKey.js +0 -33
  259. package/dist/panelRunningHistory.d.ts +0 -28
  260. package/dist/panelRunningHistory.js +0 -43
  261. package/dist/peerFrames.d.ts +0 -71
  262. package/dist/peerFrames.js +0 -168
  263. package/dist/peerLaneCapability.d.ts +0 -44
  264. package/dist/peerLaneCapability.js +0 -52
  265. package/dist/permissionRuleIssue.d.ts +0 -30
  266. package/dist/permissionRuleIssue.js +0 -78
  267. package/dist/permissionRulesWriteCapability.d.ts +0 -46
  268. package/dist/permissionRulesWriteCapability.js +0 -54
  269. package/dist/permissionWireCaps.d.ts +0 -37
  270. package/dist/permissionWireCaps.js +0 -37
  271. package/dist/postureKnob.d.ts +0 -71
  272. package/dist/postureKnob.js +0 -86
  273. package/dist/principalWire.d.ts +0 -17
  274. package/dist/principalWire.js +0 -17
  275. package/dist/printToolResultFrame.d.ts +0 -100
  276. package/dist/printToolResultFrame.js +0 -33
  277. package/dist/promptProfileWireCaps.d.ts +0 -13
  278. package/dist/promptProfileWireCaps.js +0 -13
  279. package/dist/readFacePosture.d.ts +0 -43
  280. package/dist/readFacePosture.js +0 -46
  281. package/dist/request/printNotification.d.ts +0 -20
  282. package/dist/request/printNotification.js +0 -55
  283. package/dist/request/taskRequest.d.ts +0 -249
  284. package/dist/request/taskRequest.js +10 -496
  285. package/dist/resumeRefusalCopy.d.ts +0 -136
  286. package/dist/resumeRefusalCopy.js +1 -117
  287. package/dist/retainBackgroundWireCaps.d.ts +0 -48
  288. package/dist/retainBackgroundWireCaps.js +0 -48
  289. package/dist/retryStatus.d.ts +2 -221
  290. package/dist/retryStatus.js +0 -107
  291. package/dist/rewindWireCaps.d.ts +0 -27
  292. package/dist/rewindWireCaps.js +0 -24
  293. package/dist/runCancelContext.d.ts +1 -20
  294. package/dist/runCancelContext.js +0 -34
  295. package/dist/runTerminal.d.ts +0 -273
  296. package/dist/runTerminal.js +0 -177
  297. package/dist/sandboxWire.d.ts +0 -38
  298. package/dist/sandboxWire.js +0 -82
  299. package/dist/scenarioWire.d.ts +0 -60
  300. package/dist/scenarioWire.js +0 -68
  301. package/dist/scratchpadWireCaps.d.ts +0 -11
  302. package/dist/scratchpadWireCaps.js +0 -32
  303. package/dist/sdkWireTransit.d.ts +0 -38
  304. package/dist/sdkWireTransit.js +0 -30
  305. package/dist/seam.d.ts +18 -853
  306. package/dist/seam.js +0 -52
  307. package/dist/seatContract.d.ts +0 -555
  308. package/dist/seatContract.js +5 -304
  309. package/dist/selfOrchestrationDenial.d.ts +0 -189
  310. package/dist/selfOrchestrationDenial.js +0 -162
  311. package/dist/selfOrchestrationWireCaps.d.ts +0 -38
  312. package/dist/selfOrchestrationWireCaps.js +0 -38
  313. package/dist/sessionMap.d.ts +0 -60
  314. package/dist/sessionMap.js +0 -37
  315. package/dist/sessionMemoryStatus.d.ts +11 -114
  316. package/dist/sessionMemoryStatus.js +0 -112
  317. package/dist/sessionModelLatch.d.ts +0 -29
  318. package/dist/sessionModelLatch.js +0 -40
  319. package/dist/sessionPolicyCapability.d.ts +3 -53
  320. package/dist/sessionPolicyCapability.js +0 -52
  321. package/dist/sessionSlot.d.ts +0 -26
  322. package/dist/sessionSlot.js +0 -17
  323. package/dist/skillsWireCaps.d.ts +0 -87
  324. package/dist/skillsWireCaps.js +0 -38
  325. package/dist/sqlEngineCapability.d.ts +0 -118
  326. package/dist/sqlEngineCapability.js +0 -134
  327. package/dist/sseIdleTriage.d.ts +0 -79
  328. package/dist/sseIdleTriage.js +1 -80
  329. package/dist/steering.d.ts +0 -54
  330. package/dist/steering.js +0 -63
  331. package/dist/subagent/engineCompactWire.d.ts +0 -34
  332. package/dist/subagent/engineCompactWire.js +4 -134
  333. package/dist/subagent/engineDelegatedPrompt.d.ts +0 -31
  334. package/dist/subagent/engineDelegatedPrompt.js +1 -103
  335. package/dist/subagent/engineRowStopGate.d.ts +0 -20
  336. package/dist/subagent/engineRowStopGate.js +0 -49
  337. package/dist/subagent/engineSubagentOutput.d.ts +0 -7
  338. package/dist/subagent/engineSubagentOutput.js +1 -51
  339. package/dist/subagent/engineSubagentResume.d.ts +2 -279
  340. package/dist/subagent/engineSubagentResume.js +2 -129
  341. package/dist/subagent/engineSubagentSteer.d.ts +0 -26
  342. package/dist/subagent/engineSubagentSteer.js +0 -63
  343. package/dist/subagent/engineSubagentTail.d.ts +0 -38
  344. package/dist/subagent/engineSubagentTail.js +2 -110
  345. package/dist/subagent/engineTaskHandleWire.d.ts +11 -65
  346. package/dist/subagent/engineTaskHandleWire.js +20 -131
  347. package/dist/subagent/subagentOwnerAbsence.d.ts +0 -2
  348. package/dist/subagent/subagentOwnerAbsence.js +0 -25
  349. package/dist/subagentContentStore.d.ts +3 -260
  350. package/dist/subagentContentStore.js +7 -540
  351. package/dist/systemReminderTag.d.ts +0 -49
  352. package/dist/systemReminderTag.js +0 -61
  353. package/dist/toolResult.d.ts +1 -211
  354. package/dist/toolResult.js +1 -358
  355. package/dist/toolRoster.d.ts +0 -140
  356. package/dist/toolRoster.js +0 -66
  357. package/dist/typePins.d.ts +0 -46
  358. package/dist/types/engineState.d.ts +0 -71
  359. package/dist/types/engineState.js +0 -16
  360. package/dist/ultracodeWireCaps.d.ts +0 -75
  361. package/dist/ultracodeWireCaps.js +0 -92
  362. package/dist/unrefTimer.d.ts +0 -27
  363. package/dist/webSearchBackendCapability.d.ts +0 -72
  364. package/dist/webSearchBackendCapability.js +0 -79
  365. package/dist/webSearchWireCaps.d.ts +0 -37
  366. package/dist/webSearchWireCaps.js +0 -34
  367. package/dist/websearch/searchProviderPresets.d.ts +0 -81
  368. package/dist/websearch/searchProviderPresets.js +0 -27
  369. package/dist/wireErrorTriage.d.ts +4 -160
  370. package/dist/wireErrorTriage.js +0 -171
  371. package/dist/wireRefusalCopy.d.ts +0 -28
  372. package/dist/wireRefusalCopy.js +0 -28
  373. package/dist/workflow.d.ts +0 -40
  374. package/dist/workflow.js +0 -52
  375. package/dist/workflowClient.d.ts +0 -122
  376. package/dist/workflowClient.js +8 -360
  377. package/dist/workflowMonitor.d.ts +2 -72
  378. package/dist/workflowMonitor.js +0 -26
  379. package/dist/writeProtectionCapability.d.ts +0 -112
  380. package/dist/writeProtectionCapability.js +0 -109
  381. package/docs/INTEGRATION-CLIENTS.md +62 -1
  382. package/package.json +1 -1
@@ -1,94 +1,11 @@
1
- /**
2
- * src/engineIdentity.ts — 引擎**代际锚**读器(`/health` 的 `pid` / `instanceId` / `startedAt`)
3
- * 三端共用件(0.63.0;engine ≥7.67.0 / sdk 8.8.0 / S-179)。
4
- *
5
- * ── 为什么这一面值得一个模块 ─────────────────────────────────────────────────────────────────
6
- * `/health` 是一台 worker **唯一免凭证**的门,心跳恒绿。于是「另一个宿主把这台共用引擎重启了」
7
- * 此前只能靠某个**带凭证**的请求先撞上 401 才被发现 —— 而那条路会把一次重启误读成网络故障
8
- * (处置完全相反:一个要重新握手,一个要重试)。engine 7.67.0 起 `/health` 无条件带上
9
- * `startedAt`(这个**进程**自己的起点,epoch ms,模块加载时按 `process.uptime()` 铸一次),
10
- * 换代因此可以被当成**一等事实**读出来,而不是等一次失败。
11
- *
12
- * ── 归层:本模块只读与比,不做状态机 ────────────────────────────────────────────────────────
13
- * 「读出换代之后要做什么」(丢连接、重握手、提示用户)是**宿主的状态机**,壳有自己的那一只闸。
14
- * 本包给的是两件纯物:一只窄读器 {@link engineIdentityOf} 与一族纯比较
15
- * ({@link engineIdentityVerdict} / {@link engineIdentityChanged} / {@link engineIdentityChangedBy})。
16
- * 三端共用同一套判据,才不会一端把「判不出」当「没换」、另一端把它当「换了」。
17
- *
18
- * ── 🔴 三态,不是布尔 ───────────────────────────────────────────────────────────────────────
19
- * 一个布尔把「没换」与「判不出」压进同一个 `false`,而这两件事的下一步相反(前者继续用,后者
20
- * 要么再探一次要么按最坏情况握手)。所以真源是三态判词;布尔口保留是因为大多数调用点只关心
21
- * 「有没有**正面观察到**换代」,它的 `true` 是一句断言、`false` **不是**
22
- * ([honest-absence-not-fabricated-zero])。
23
- *
24
- * ── 🔴 三只锚并列,不是「startedAt 说了算」───────────────────────────────────────────────────
25
- * `instanceId` 答「是不是同一条命」,`startedAt` 还答「从什么时候起」——上游声明里逐字写着两者
26
- * **刻意不合并**。所以判据是:**任一**在两侧都在场的锚不同 ⇒ 换代。只看 startedAt 会把
27
- * 「startedAt 相同而 instanceId 不同」这类真实的坏读数判成「同一条命」。优先序
28
- * ({@link ENGINE_IDENTITY_ANCHORS})只决定**判词报哪一只**,不决定看不看别的。
29
- */
30
- /** 一台 worker 的代际锚读数。三格**并列**,各自独立在场/缺席。 */
31
1
  export interface EngineIdentityView {
32
- /** 这台 worker 的进程号(server 无条件发)。 */
33
2
  pid?: number;
34
- /** 这条命的实例 id(答「是不是同一条命」)。 */
35
3
  instanceId?: string;
36
- /** 这个进程的起点,epoch ms(server ≥7.67.0 无条件发;答「从什么时候起」)。
37
- * 🔴 缺席 = **这台 worker 说不出来**(<7.67.0),**绝不是**「它没重启过」。 */
38
4
  startedAt?: number;
39
5
  }
40
- /**
41
- * 代际锚的**优先序**。序:`startedAt`(最具体:同一条命还答得出从何时起)→ `instanceId`
42
- * (同一条命吗)→ `pid`(端口上还是那个进程吗)。
43
- *
44
- * 🔴 **顺序**只决定 {@link engineIdentityChangedBy} 报哪一只;但**成员集合是承重的** ——
45
- * 比较器**遍历的正是这张表**,少一只锚就等于那只锚不再参与判定(异源对抗复审 R2 [medium] 实撞:
46
- * 移掉 `instanceId` 之后,两份 `instanceId` 不同、别的锚相同的合法读数从 `changed` 翻成 `same`,
47
- * 宿主据此漏掉一次重握手)。
48
- * 🔴 因此它是 `Object.freeze` 的数组,**不是**只在类型面只读的 `readonly T[]`:后者一行
49
- * `.splice()` 就能改,而公面消费者拿到的正是这个实例。这是本仓**已定谳的病形**
50
- * (`RESUME_RETRY_LATER_CODES` / `RUN_LEVEL_STOP_ERROR_CODES` 两次同款处置)。
51
- * 运行期反钉在 `run-engine-identity-test.mjs` 的 Bz 段(试改 + 试改后判词没漂,两半都断言)。
52
- */
53
6
  export declare const ENGINE_IDENTITY_ANCHORS: readonly (keyof EngineIdentityView)[];
54
- /**
55
- * `/health` 200 体 → 代际锚读数;**畸形一律缺席**,绝不抛出。
56
- *
57
- * 🔴 **逐格独立**:一只锚形坏只丢那一格(三只锚是三条独立的证据,一只坏不该把另两只藏起来)。
58
- * 🔴 **恒返回一只读数对象**(读不出任何一格时是 `{}`),不返回 `undefined` —— 调用方读的是
59
- * 「哪几只锚这次答得出来」,而不是「这次有没有响应」(后者是它自己的探测腿知道的事)。
60
- * ⚠️ 只取三只锚;`/health` 上其余的键(`version` / `configHash` / `dataRoot` / 降级位…)各有
61
- * 自己的读面,不在这里搭便车 —— 一个「顺手多带两个键」的读数会变成第二份 health 台账。
62
- */
63
7
  export declare function engineIdentityOf(health: unknown): EngineIdentityView;
64
- /** 换代判词。`unknown` = 两侧**没有一只锚可比**(诚实缺席,绝不折成 `same`)。 */
65
8
  export type EngineIdentityVerdict = 'changed' | 'same' | 'unknown';
66
- /**
67
- * 两份读数说的是不是**同一条命**。
68
- *
69
- * 判据(与 {@link engineIdentityChangedBy} 同一套,只是那一只多报一个名字):
70
- * · **任一**在两侧都在场的锚**不同** ⇒ `changed`;
71
- * · 至少一只锚可比、且没有一只不同 ⇒ `same`;
72
- * · **一只可比的锚都没有** ⇒ `unknown`。
73
- *
74
- * 🔴 **锚交集为空 ⇒ `unknown` 而不是 `same`**:老 worker 只报 `pid`、新 worker 只报 `startedAt`
75
- * 时,「没发现不同」是因为**没得比**,不是因为它没换。把这一格读成 `same` 正是本模块要根治的
76
- * 那类静默病。
77
- * 🔴 单侧在场的锚**不是反证**:一侧有 `startedAt` 另一侧没有,只说明其中一台答不出这只锚;
78
- * 只要另有一只锚可比且相同,判词照给 `same`。
79
- */
80
9
  export declare function engineIdentityVerdict(a: unknown, b: unknown): EngineIdentityVerdict;
81
- /**
82
- * 换代是**哪一只锚**看出来的(优先序最高的那一只不同的锚)。没换 / 判不出 ⇒ `undefined`。
83
- * 给的是一句人可读的诊断线索(「端口上换了个进程」vs「同一个进程报了另一条命」),
84
- * **不是**裁决位 —— 裁决位是 {@link engineIdentityVerdict}。
85
- */
86
10
  export declare function engineIdentityChangedBy(a: unknown, b: unknown): keyof EngineIdentityView | undefined;
87
- /**
88
- * **正面观察到换代了吗**。
89
- * 🔴 `true` 是一句断言(某只可比的锚确实变了);`false` **不是** —— 它同时覆盖「没换」与
90
- * 「判不出」。要分清这两件事,读 {@link engineIdentityVerdict}(那是本族的真源)。
91
- * 这个方向是刻意的:据 `true` 做的事(重新握手)在误判时代价可控,据 `false` 做的事
92
- * (继续用这条连接)在误判时会一直对着一台已经换掉的引擎说话。
93
- */
94
11
  export declare function engineIdentityChanged(a: unknown, b: unknown): boolean;
@@ -1,63 +1,11 @@
1
- /**
2
- * src/engineIdentity.ts — 引擎**代际锚**读器(`/health` 的 `pid` / `instanceId` / `startedAt`)
3
- * 三端共用件(0.63.0;engine ≥7.67.0 / sdk 8.8.0 / S-179)。
4
- *
5
- * ── 为什么这一面值得一个模块 ─────────────────────────────────────────────────────────────────
6
- * `/health` 是一台 worker **唯一免凭证**的门,心跳恒绿。于是「另一个宿主把这台共用引擎重启了」
7
- * 此前只能靠某个**带凭证**的请求先撞上 401 才被发现 —— 而那条路会把一次重启误读成网络故障
8
- * (处置完全相反:一个要重新握手,一个要重试)。engine 7.67.0 起 `/health` 无条件带上
9
- * `startedAt`(这个**进程**自己的起点,epoch ms,模块加载时按 `process.uptime()` 铸一次),
10
- * 换代因此可以被当成**一等事实**读出来,而不是等一次失败。
11
- *
12
- * ── 归层:本模块只读与比,不做状态机 ────────────────────────────────────────────────────────
13
- * 「读出换代之后要做什么」(丢连接、重握手、提示用户)是**宿主的状态机**,壳有自己的那一只闸。
14
- * 本包给的是两件纯物:一只窄读器 {@link engineIdentityOf} 与一族纯比较
15
- * ({@link engineIdentityVerdict} / {@link engineIdentityChanged} / {@link engineIdentityChangedBy})。
16
- * 三端共用同一套判据,才不会一端把「判不出」当「没换」、另一端把它当「换了」。
17
- *
18
- * ── 🔴 三态,不是布尔 ───────────────────────────────────────────────────────────────────────
19
- * 一个布尔把「没换」与「判不出」压进同一个 `false`,而这两件事的下一步相反(前者继续用,后者
20
- * 要么再探一次要么按最坏情况握手)。所以真源是三态判词;布尔口保留是因为大多数调用点只关心
21
- * 「有没有**正面观察到**换代」,它的 `true` 是一句断言、`false` **不是**
22
- * ([honest-absence-not-fabricated-zero])。
23
- *
24
- * ── 🔴 三只锚并列,不是「startedAt 说了算」───────────────────────────────────────────────────
25
- * `instanceId` 答「是不是同一条命」,`startedAt` 还答「从什么时候起」——上游声明里逐字写着两者
26
- * **刻意不合并**。所以判据是:**任一**在两侧都在场的锚不同 ⇒ 换代。只看 startedAt 会把
27
- * 「startedAt 相同而 instanceId 不同」这类真实的坏读数判成「同一条命」。优先序
28
- * ({@link ENGINE_IDENTITY_ANCHORS})只决定**判词报哪一只**,不决定看不看别的。
29
- */
30
- /**
31
- * 代际锚的**优先序**。序:`startedAt`(最具体:同一条命还答得出从何时起)→ `instanceId`
32
- * (同一条命吗)→ `pid`(端口上还是那个进程吗)。
33
- *
34
- * 🔴 **顺序**只决定 {@link engineIdentityChangedBy} 报哪一只;但**成员集合是承重的** ——
35
- * 比较器**遍历的正是这张表**,少一只锚就等于那只锚不再参与判定(异源对抗复审 R2 [medium] 实撞:
36
- * 移掉 `instanceId` 之后,两份 `instanceId` 不同、别的锚相同的合法读数从 `changed` 翻成 `same`,
37
- * 宿主据此漏掉一次重握手)。
38
- * 🔴 因此它是 `Object.freeze` 的数组,**不是**只在类型面只读的 `readonly T[]`:后者一行
39
- * `.splice()` 就能改,而公面消费者拿到的正是这个实例。这是本仓**已定谳的病形**
40
- * (`RESUME_RETRY_LATER_CODES` / `RUN_LEVEL_STOP_ERROR_CODES` 两次同款处置)。
41
- * 运行期反钉在 `run-engine-identity-test.mjs` 的 Bz 段(试改 + 试改后判词没漂,两半都断言)。
42
- */
43
1
  export const ENGINE_IDENTITY_ANCHORS = Object.freeze([
44
2
  'startedAt',
45
3
  'instanceId',
46
4
  'pid',
47
5
  ]);
48
- /** 正的有限数(epoch 时刻 / 进程号都不可能是 0、负数、NaN、Infinity)。 */
49
6
  function posNum(v) {
50
7
  return typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : undefined;
51
8
  }
52
- /**
53
- * `/health` 200 体 → 代际锚读数;**畸形一律缺席**,绝不抛出。
54
- *
55
- * 🔴 **逐格独立**:一只锚形坏只丢那一格(三只锚是三条独立的证据,一只坏不该把另两只藏起来)。
56
- * 🔴 **恒返回一只读数对象**(读不出任何一格时是 `{}`),不返回 `undefined` —— 调用方读的是
57
- * 「哪几只锚这次答得出来」,而不是「这次有没有响应」(后者是它自己的探测腿知道的事)。
58
- * ⚠️ 只取三只锚;`/health` 上其余的键(`version` / `configHash` / `dataRoot` / 降级位…)各有
59
- * 自己的读面,不在这里搭便车 —— 一个「顺手多带两个键」的读数会变成第二份 health 台账。
60
- */
61
9
  export function engineIdentityOf(health) {
62
10
  if (typeof health !== 'object' || health === null || Array.isArray(health))
63
11
  return {};
@@ -71,33 +19,9 @@ export function engineIdentityOf(health) {
71
19
  ...(startedAt !== undefined ? { startedAt } : {}),
72
20
  };
73
21
  }
74
- /**
75
- * 比较前的**统一归一**:一律过 {@link engineIdentityOf}。
76
- *
77
- * 🔴 **不能只做「是不是对象」的强转**(异源对抗复审 [medium]):公开入口吃 `unknown`,强转会把
78
- * **坏锚**(`null` / `0` / 空串 / 非有限数)当成「可比的证据」—— 两侧同为 `{pid:null}` 于是判
79
- * `same`,而经窄读器之后两边都是空读数、正确判词是 `unknown`。后果不是渲染错一行,是宿主据此
80
- * **跳过**本该做的重探或重握手。
81
- * ⚠️ 对一份**已经窄读过**的视图,本函数是幂等的(合法锚原样通过),所以调用方递原始 `/health` 体
82
- * 还是递视图,判词一致 —— 门里有一条钉。
83
- */
84
22
  function viewOf(x) {
85
23
  return engineIdentityOf(x);
86
24
  }
87
- /**
88
- * 两份读数说的是不是**同一条命**。
89
- *
90
- * 判据(与 {@link engineIdentityChangedBy} 同一套,只是那一只多报一个名字):
91
- * · **任一**在两侧都在场的锚**不同** ⇒ `changed`;
92
- * · 至少一只锚可比、且没有一只不同 ⇒ `same`;
93
- * · **一只可比的锚都没有** ⇒ `unknown`。
94
- *
95
- * 🔴 **锚交集为空 ⇒ `unknown` 而不是 `same`**:老 worker 只报 `pid`、新 worker 只报 `startedAt`
96
- * 时,「没发现不同」是因为**没得比**,不是因为它没换。把这一格读成 `same` 正是本模块要根治的
97
- * 那类静默病。
98
- * 🔴 单侧在场的锚**不是反证**:一侧有 `startedAt` 另一侧没有,只说明其中一台答不出这只锚;
99
- * 只要另有一只锚可比且相同,判词照给 `same`。
100
- */
101
25
  export function engineIdentityVerdict(a, b) {
102
26
  const x = viewOf(a);
103
27
  const y = viewOf(b);
@@ -113,11 +37,6 @@ export function engineIdentityVerdict(a, b) {
113
37
  }
114
38
  return comparable > 0 ? 'same' : 'unknown';
115
39
  }
116
- /**
117
- * 换代是**哪一只锚**看出来的(优先序最高的那一只不同的锚)。没换 / 判不出 ⇒ `undefined`。
118
- * 给的是一句人可读的诊断线索(「端口上换了个进程」vs「同一个进程报了另一条命」),
119
- * **不是**裁决位 —— 裁决位是 {@link engineIdentityVerdict}。
120
- */
121
40
  export function engineIdentityChangedBy(a, b) {
122
41
  const x = viewOf(a);
123
42
  const y = viewOf(b);
@@ -131,13 +50,6 @@ export function engineIdentityChangedBy(a, b) {
131
50
  }
132
51
  return undefined;
133
52
  }
134
- /**
135
- * **正面观察到换代了吗**。
136
- * 🔴 `true` 是一句断言(某只可比的锚确实变了);`false` **不是** —— 它同时覆盖「没换」与
137
- * 「判不出」。要分清这两件事,读 {@link engineIdentityVerdict}(那是本族的真源)。
138
- * 这个方向是刻意的:据 `true` 做的事(重新握手)在误判时代价可控,据 `false` 做的事
139
- * (继续用这条连接)在误判时会一直对着一台已经换掉的引擎说话。
140
- */
141
53
  export function engineIdentityChanged(a, b) {
142
54
  return engineIdentityVerdict(a, b) === 'changed';
143
55
  }
@@ -1,72 +1,15 @@
1
- /**
2
- * ⇄ B1 批搬迁(2026-07-27,多端改造设计稿 §2.4.1-B):cli src/sema/engineInlineTaskStats.ts 逐字搬入(零依赖;壳侧改 re-export)。
3
- * 🔴 单实例语义:写方 = bridge 的 task_progress tick,读方 = 行内 group 行的 useSyncExternalStore。
4
- */
5
- /**
6
- * engineInlineTaskStats — dep-free side-channel store bridging ENGINE-side subagent progress
7
- * (`task_progress` ticks) to the INLINE transcript group row ("Running N agents…" / AgentProgressLine).
8
- *
9
- * WHY (clay dogfood 2026-07-03): in engine mode the shell AgentTool's call() never runs, so the inline
10
- * group row's per-agent stats (tool uses / tokens) and status line — both computed from LOCAL
11
- * ProgressMessages (overrides/agent.tsx calculateAgentStats / extractLastToolInfo) — stay frozen at
12
- * `0 tool uses` / `Initializing…` for the whole run and after completion. The engine's `task_progress`
13
- * ticks DO carry the rollup ({toolUses, totalTokens, durationMs}) and the bridge already binds each
14
- * tick to its delegating tool_use card (bindTaskCard, P1② explicit parentToolCallId) — but only fed
15
- * the FOOTER panel store. This store is the inline twin: keyed by the delegating tool_use id (cardId),
16
- * latest cumulative tick per card, frozen on the card's close (tool_end) / turn-end sweep so the
17
- * finished group row keeps the final values.
18
- *
19
- * Same pattern as engineAgentPanelStore (module-level, no React/AppState deps on the write side); the
20
- * read side is a useSyncExternalStore hook inside the sema-owned AgentProgressLine override — a
21
- * subscription, NOT a render-time map read, because the memoized transcript tree won't re-render on
22
- * ticks by itself. Local (non-engine) AgentTool runs never write here, so the local path is untouched
23
- * (fallback only consulted when the card id has an entry).
24
- */
25
- /**
26
- * TYPESHAPE-13:inline task tick 的形状(生产侧 `seam.ts` ChromeEvent 的 `inline_task_stats`/
27
- * `op:'tick'` 臂内嵌套 `stats` 字段 ↔ 本文件消费侧 `publishEngineInlineTaskTick` 的 `tick` 形参)
28
- * 跨模块内联写了两份逐字相同的形状,抽成具名类型两处共用——漏改一处(比如只给 seam.ts 加
29
- * `currentToolName?`)时,两侧编译仍全绿但字段会被静默丢弃,B4 命名 DU 豁免只护直接成员形状,
30
- * 不护这种嵌套字段。
31
- *
32
- * 定义在 `seam.ts`(本包基础词表模块)、这里反向 import——本文件是零依赖的 dep-free store,
33
- * seam.ts 反过来依赖它会把层级倒过来。
34
- */
35
1
  import type { InlineTaskTick } from './seam.js';
36
2
  export interface EngineInlineTaskStats {
37
- /** Cumulative tool uses off the latest tick (frozen at settle). */
38
3
  toolUses: number;
39
- /** Cumulative tokens off the latest tick (frozen at settle). */
40
4
  totalTokens: number;
41
- /** Cumulative run duration off the latest tick — feeds the "Working…" status line. */
42
5
  durationMs: number;
43
- /** core 1.262.0 [558]B (service 1.154.0 wire) — the child's most recent tool intent as ONE human
44
- * line ("Bash npm test"), service-redacted. Replaces the generic "Working…" status line while the
45
- * card is live; absent on old engines ⇒ the status line is unchanged. */
46
6
  currentAction?: string;
47
- /** The card closed (tool_end or turn-end sweep): values above are final. */
48
7
  done: boolean;
49
8
  isError: boolean;
50
9
  }
51
- /** Bridge write side — latest cumulative tick for the card. No-op once the card settled (frozen finals). */
52
10
  export declare function publishEngineInlineTaskTick(cardId: string, tick: InlineTaskTick): void;
53
- /** Bridge write side — the delegating card closed: freeze the finals. Idempotent. */
54
11
  export declare function settleEngineInlineTaskStats(cardId: string, isError: boolean): void;
55
- /** Turn-end / abort sweep twin — settle every card still live (a subagent never emits a terminal tick). */
56
12
  export declare function settleAllEngineInlineTaskStats(): void;
57
- /** Read side — reference-stable snapshot per card (object replaced only on update). */
58
13
  export declare function getEngineInlineTaskStats(cardId: string): EngineInlineTaskStats | undefined;
59
- /**
60
- * Read side, id-less — the SOLE live (un-settled) card's stats, or undefined when 0 or ≥2 are live.
61
- *
62
- * WHY (#64 B 面 pty 实测,2026-07-11): the SINGLE-card in-flight render path
63
- * (overrides/agent.tsx renderToolUseProgressMessage, zero local progressMessages in engine mode)
64
- * has NO toolUseID in scope — the CC Tool-interface method signature doesn't carry it, and the
65
- * call-site wrapper (AssistantToolUseMessage.tsx) is CC-verbatim. Attribution without an id is only
66
- * safe when it is unambiguous, so this returns the stats ONLY when exactly one live card exists
67
- * (the adversarial-review posture of bindTaskCard: better honest-generic than bound wrong; with ≥2
68
- * live engine subagents the row keeps today's Initializing…). Reference-stable (returns the same
69
- * per-card snapshot object the keyed getter hands out).
70
- */
71
14
  export declare function getSoleLiveEngineInlineTaskStats(): EngineInlineTaskStats | undefined;
72
15
  export declare function subscribeEngineInlineTaskStats(fn: () => void): () => void;
@@ -1,27 +1,3 @@
1
- /**
2
- * ⇄ B1 批搬迁(2026-07-27,多端改造设计稿 §2.4.1-B):cli src/sema/engineInlineTaskStats.ts 逐字搬入(零依赖;壳侧改 re-export)。
3
- * 🔴 单实例语义:写方 = bridge 的 task_progress tick,读方 = 行内 group 行的 useSyncExternalStore。
4
- */
5
- /**
6
- * engineInlineTaskStats — dep-free side-channel store bridging ENGINE-side subagent progress
7
- * (`task_progress` ticks) to the INLINE transcript group row ("Running N agents…" / AgentProgressLine).
8
- *
9
- * WHY (clay dogfood 2026-07-03): in engine mode the shell AgentTool's call() never runs, so the inline
10
- * group row's per-agent stats (tool uses / tokens) and status line — both computed from LOCAL
11
- * ProgressMessages (overrides/agent.tsx calculateAgentStats / extractLastToolInfo) — stay frozen at
12
- * `0 tool uses` / `Initializing…` for the whole run and after completion. The engine's `task_progress`
13
- * ticks DO carry the rollup ({toolUses, totalTokens, durationMs}) and the bridge already binds each
14
- * tick to its delegating tool_use card (bindTaskCard, P1② explicit parentToolCallId) — but only fed
15
- * the FOOTER panel store. This store is the inline twin: keyed by the delegating tool_use id (cardId),
16
- * latest cumulative tick per card, frozen on the card's close (tool_end) / turn-end sweep so the
17
- * finished group row keeps the final values.
18
- *
19
- * Same pattern as engineAgentPanelStore (module-level, no React/AppState deps on the write side); the
20
- * read side is a useSyncExternalStore hook inside the sema-owned AgentProgressLine override — a
21
- * subscription, NOT a render-time map read, because the memoized transcript tree won't re-render on
22
- * ticks by itself. Local (non-engine) AgentTool runs never write here, so the local path is untouched
23
- * (fallback only consulted when the card id has an entry).
24
- */
25
1
  const statsByCardId = new Map();
26
2
  const listeners = new Set();
27
3
  function emit() {
@@ -30,11 +6,9 @@ function emit() {
30
6
  fn();
31
7
  }
32
8
  catch {
33
- // a consumer render error must never disturb the bridge's stream drain
34
9
  }
35
10
  }
36
11
  }
37
- /** Bridge write side — latest cumulative tick for the card. No-op once the card settled (frozen finals). */
38
12
  export function publishEngineInlineTaskTick(cardId, tick) {
39
13
  const prev = statsByCardId.get(cardId);
40
14
  if (prev?.done)
@@ -42,7 +16,6 @@ export function publishEngineInlineTaskTick(cardId, tick) {
42
16
  statsByCardId.set(cardId, { ...tick, done: false, isError: false });
43
17
  emit();
44
18
  }
45
- /** Bridge write side — the delegating card closed: freeze the finals. Idempotent. */
46
19
  export function settleEngineInlineTaskStats(cardId, isError) {
47
20
  const prev = statsByCardId.get(cardId);
48
21
  if (!prev || prev.done)
@@ -50,7 +23,6 @@ export function settleEngineInlineTaskStats(cardId, isError) {
50
23
  statsByCardId.set(cardId, { ...prev, done: true, isError });
51
24
  emit();
52
25
  }
53
- /** Turn-end / abort sweep twin — settle every card still live (a subagent never emits a terminal tick). */
54
26
  export function settleAllEngineInlineTaskStats() {
55
27
  let changed = false;
56
28
  for (const [cardId, s] of statsByCardId) {
@@ -62,29 +34,16 @@ export function settleAllEngineInlineTaskStats() {
62
34
  if (changed)
63
35
  emit();
64
36
  }
65
- /** Read side — reference-stable snapshot per card (object replaced only on update). */
66
37
  export function getEngineInlineTaskStats(cardId) {
67
38
  return statsByCardId.get(cardId);
68
39
  }
69
- /**
70
- * Read side, id-less — the SOLE live (un-settled) card's stats, or undefined when 0 or ≥2 are live.
71
- *
72
- * WHY (#64 B 面 pty 实测,2026-07-11): the SINGLE-card in-flight render path
73
- * (overrides/agent.tsx renderToolUseProgressMessage, zero local progressMessages in engine mode)
74
- * has NO toolUseID in scope — the CC Tool-interface method signature doesn't carry it, and the
75
- * call-site wrapper (AssistantToolUseMessage.tsx) is CC-verbatim. Attribution without an id is only
76
- * safe when it is unambiguous, so this returns the stats ONLY when exactly one live card exists
77
- * (the adversarial-review posture of bindTaskCard: better honest-generic than bound wrong; with ≥2
78
- * live engine subagents the row keeps today's Initializing…). Reference-stable (returns the same
79
- * per-card snapshot object the keyed getter hands out).
80
- */
81
40
  export function getSoleLiveEngineInlineTaskStats() {
82
41
  let sole;
83
42
  for (const s of statsByCardId.values()) {
84
43
  if (s.done)
85
44
  continue;
86
45
  if (sole !== undefined)
87
- return undefined; // ≥2 live — ambiguous, stay honest
46
+ return undefined;
88
47
  sole = s;
89
48
  }
90
49
  return sole;
@@ -1,242 +1,52 @@
1
- /**
2
- * src/engineNoticeCodes.ts — `engine_notice` 的**码册**与 **audience 表**(0.63.0;L-167;core 7.9.x)。
3
- *
4
- * -- 「渲不渲」的判据不在这一端 --------------------------------------------------------------
5
- * 一条引擎通告该不该占用户的注意力,正确判据**不是**「这一端的渲染表有没有那一格」(那会随各端的
6
- * 施工进度晃),而是**上游有没有把这个码铸进它的成文码册**:
7
- * · 码册**内**的码 = 引擎作为治理事实铸出来的,即使这一端还没有专属文案也该让人看见(通用行);
8
- * · 码册**外**的码 = 转发进同一个水槽的宿主/适配器噪声,呈现面 fail-closed(只落 debug)。
9
- * audience 回答另一问:这条事实**说给谁听**。一条 operator 行推给终端用户是噪音;一条 user 行只落
10
- * operator 日志,就是把该告诉他的事瞒下了。两值而已(`user` / `operator`)—— 上游刻意不设第三值:
11
- * 「这条通告能不能路由到某个会话」不是 audience,而是 `sessionId` 在不在场(**逐次发射**的事实)。
12
- *
13
- * -- 为什么是镜像而不是 import ---------------------------------------------------------------
14
- * `@sema-agent/core` 不是本包消费者的依赖(它既不是 peer 也不是 runtime dep),而本包的 `.d.ts`
15
- * 一旦引用它,装了本包却没装 core 的下游会当场编译不过。这与本包 `toolResult.ts` / `retryStatus.ts` /
16
- * `skillsWireCaps.ts` 三处的处置同形:**按 wire 事实镜像,把代价交给门**——
17
- * `run-engine-notice-catalog-test.mjs` 对**实装 devDep core** 的两份产物逐码逐行双向对账,
18
- * core 一动这里就先红。上游自己也是这么设计的:它导出码册的理由逐字写着「a downstream table with a
19
- * row missing … is a mechanically detectable disagreement rather than an argument」。
20
- *
21
- * -- 提货记账(码册加员 / audience 换档)-------------------------------------------------------
22
- * · **core 7.10.0 +2**:`delegation.ask_unresolvable`(audience **user** —— 委派链上那只 ask 判不出
23
- * 归属、没有人可问,这件事的收件人是发起这次委派的**用户**)/ `config.read_face_swapped`
24
- * (audience **operator** —— READ 容纳面被换过档,是部署事实)。四十八码 ⇒ **五十码**。
25
- * · **core 7.17.0 +1**(0.68.0 提货批,同样由本门 A1 段当天红抓出:「上游 52 / 本包 51」):
26
- * `config.artifact_host_invalid`(audience **operator** —— 宿主接了 artifact 席但它的
27
- * `capabilities()` 声明不过席上的不变量、或 `onMount` 抛了 ⇒ 那只工具没挂上。上游逐字:
28
- * 「an absent seat is silent; a broken one must not look the same」)。五十一码 ⇒ **五十二码**。
29
- * · **core ≤7.16.0 +1**(0.67.0 提货批,由本门的 A1 段当天红抓出 —— 不是人眼发现的):
30
- * `task.interrupt_unconsumed`(audience **user**;位置在 `task.late_approval` 与
31
- * `memory.capture_opted_out` 之间,`governance-codes.js:146` / `NOTICE_AUDIENCE_TABLE:165` 真字节)。
32
- * ⚠️ 它**不在** core 7.14.0 / 7.15.0 / 7.16.0 任何一份 `docs/wire-consumption` 逐键表里 ——
33
- * 如实登记为**合同外加员**,处置随本门的双向对账走。五十码 ⇒ **五十一码**。
34
- * · **core 7.14.0 audience 换档(value-domain BREAKING)**:`memory.consolidation_withheld`
35
- * **user → operator**(`NOTICE_AUDIENCE_TABLE:169` 真字节)。合同逐字的理由:这条通告**没有
36
- * `sessionId`**(一次固化跑在任何会话之外)⇒ 一个按会话路由 `user` 行的消费方**必须停止**在那里
37
- * 等它;面向读者的那一半骑在回执上(`withheldFromCleanArm` / `withheldNeverSent`)。
38
- * 🔴 三端落点:凡按 audience 分发的面(TUI 通告行 / web 通知中心 / 桌面 toast),这条码从此**只**
39
- * 进运维面 —— 端不改代码也会跟着走(分发读的就是本表),但**通告文案面**若为它写过「告诉用户」
40
- * 的专属行,那一行要跟着挪。
41
- * · **7.16.0 的两个 memory 布局码不进本册**:`memory.layout_migrated` /
42
- * `memory.layout_unowned_root_content` 在 core 里属 `NON_GOVERNANCE_MEMORY_CODES`
43
- * (`governance-codes.js:11-27` 真字节),**不在** `ENGINE_NOTICE_CODES` / `NOTICE_AUDIENCE` 上。
44
- * 本包对非治理码的既有路由**不变**:码册外 ⇒ 呈现面 fail-closed(只落 debug)。把它们抄进本册
45
- * 会让 A1/A2 双向对账当天红 —— 那正是这张表是**抄件**而不是意见的意思。
46
- *
47
- * -- 🔴 单铸律:本模块**不抄**任何一句 core 的措辞 -------------------------------------------
48
- * `mcp.injection_dropped` 上游立了 `settlement.single_mint` 契约:**宿主只供事实**(哪个会话 /
49
- * 哪个 server 名 / 四个原因里的哪一个 / 可选哪个字段坏),**core composes** 码字、audience 行与
50
- * 句子。第二份措辞就是第二个会漂的源。⇒ 本模块只给码册、audience 与**事实窄读器**
51
- * ({@link readMcpInjectionDrop});转录直接用引擎给的 `message`。门里有一条反向钉:core 那四句
52
- * 出现在本包源码或产物里 => 当场红。
53
- */
54
- /** 一条通告是**说给谁听**的。两值,刻意不设第三值(见模块顶注)。 */
55
1
  export type NoticeAudience = 'user' | 'operator';
56
- /**
57
- * 引擎**成文码册**的逐字镜像(core `ENGINE_NOTICE_CODES`,**7.23.0 = 六十七码**(7.22.0 六十六 + 7.23.0 一枚 `config.write_protection_unresolved`(#869 / C-R61 ②,operator;governance-codes.js 元组紧跟兄弟码 `config.write_protection_target_view_absent`:那一枚是「没有 target 视图」,这一枚是「有视图但解析不出这次写的目标」,`detail {reason, cause, sessionId, runId}`,`reason` 两词 `unresolved-symlink` / `unresolvable-target`,去重每 leg 每 reason 是引擎侧);7.22.0 六十六 = 7.20.1 六十五 + 7.22.0 一枚 `mcp.server_redialed`(#857,operator;governance-codes.js 元组紧跟 `mcp.revocation_probe_failed`);7.20.0 六十四 + 7.20.1 一枚 `config.write_protection_target_view_absent`;7.19.0 五十九 + 7.20.0 五枚:`config.task_root_not_canonical` / `config.execution_env_capability_invalid` / `config.forward_sink_failed` / `memory.restore_withheld` / `agents.listing_truncated`,均 operator);顺序同源)。
58
- * 🔴 这是一份**抄件**,不是本包的意见 —— 改它必须同 commit 附 core 坐标,且门会先红。
59
- * ⚠️ `EngineNotice.code` 的型面在上游**故意留 `string`**(宿主把自己的通告转发进同一个水槽是
60
- * 被支持的形),所以本表是**判据**不是型 —— 别拿它去窄化那个字段。
61
-
62
- * 🔴 形制:`Object.freeze` 的数组,**不是**只在类型面只读的 `readonly T[]` —— 后者一行 `.splice()`
63
- * 就能改,而公面消费者拿到的正是这个实例(本仓已定谳的病形,同 `RESUME_RETRY_LATER_CODES`)。
64
- */
65
2
  export declare const ENGINE_NOTICE_CODES: readonly string[];
66
- /**
67
- * 这个码在不在上游码册里。
68
- * 🔴 **认原始值**:呈现层的消毒器会把一整类字符换成别的字符,拿清洗值来查表等于让
69
- * `memory\nsession_polluted` 这种脏码冒充册内码。消毒只进文案,不进判据。
70
- */
71
3
  export declare function engineNoticeInCatalog(code: unknown): boolean;
72
- /**
73
- * 逐码的 audience 行(core `NOTICE_AUDIENCE_TABLE` 逐行镜像;与 {@link ENGINE_NOTICE_CODES}
74
- * **逐键 lockstep** —— 上游用编译期 `satisfies` 钉住这一点,本包用门钉住)。
75
- */
76
4
  export declare const ENGINE_NOTICE_AUDIENCE: Readonly<Record<string, NoticeAudience>>;
77
- /**
78
- * 这个码是说给谁听的。**表外码一律保守判 `operator`** —— 把一个读不懂的码推给终端用户是最坏的
79
- * 猜法(他既看不懂也无从下手),而漏给运维看一条只是让他晚一点知道。
80
- */
81
5
  export declare function noticeAudienceOf(code: unknown): NoticeAudience;
82
- /**
83
- * `mcp.injection_dropped` 的四个掉落原因(core `MCP_INJECTION_DROP_REASONS` 逐词镜像)。
84
- * 消费端要自己的措辞时**键在这个词上**,绝不对 `message` 做等值匹配(那是给人读的散文)。
85
-
86
- * 🔴 形制:`Object.freeze` 的数组,**不是**只在类型面只读的 `readonly T[]` —— 后者一行 `.splice()`
87
- * 就能改,而公面消费者拿到的正是这个实例(本仓已定谳的病形,同 `RESUME_RETRY_LATER_CODES`)。
88
- */
89
6
  export declare const MCP_INJECTION_DROP_REASONS: readonly string[];
90
- /** `mcp.injection_dropped` 通告 `detail` 上的事实(宿主在掉落点知道的那几件)。 */
91
7
  export interface McpInjectionDropFactsView {
92
- /** 这条通告投给哪个会话。**必填** —— user audience 的通告没有会话就无处投递。 */
93
8
  sessionId: string;
94
- /** 用户自己写的那个 server 名(引擎的 message 里逐字引了它)。 */
95
9
  server: string;
96
- /** 四个原因之一。 */
97
10
  reason: string;
98
- /** 只有 `malformed_entry` 带:宿主发现哪个键坏了,用户据此知道该改哪儿。 */
99
11
  field?: string;
100
12
  }
101
- /**
102
- * `mcp.injection_dropped` 通告 → 事实;不成形 => `undefined`,绝不抛出。
103
- *
104
- * 🔴 **只认自己那一个码**:一条别的通告即使 `detail` 长得像,也不给读(读器按码分家,才不会在
105
- * 上游给另一个码加同名键的那天悄悄改判)。
106
- * 🔴 `sessionId` / `server` / `reason` 三格缺一 => 整只缺席。core 在**铸点**对同样三格直接抛
107
- * `TypeError`(「一条没有会话的 user 通告投不到任何地方」);本包在**读点**判缺席而不抛 ——
108
- * 读点抛只会把一条读不懂的通告升级成一次崩。
109
- * 🔴 `reason` **按闭集读**:它是消费端分支的键,读不懂的词不许被当成一个能拿去分支的原因。
110
- * (要渲一句话时,用引擎给的 `message`,见模块顶注的单铸律。)
111
- */
112
13
  export declare function readMcpInjectionDrop(notice: unknown): McpInjectionDropFactsView | undefined;
113
- /**
114
- * `delegation.ask_unresolvable` 的三个成因(core `ASK_UNRESOLVABLE_CAUSES` 逐词镜像,
115
- * `dist/core/ask-unresolvable-notice.d.ts:31`)。
116
- *
117
- * 🔴 **0.68.0 BREAKING(core #709 ②)**:这一位**取代**了 7.16.0 及以前那条通告 `detail` 上的
118
- * `settlementKind`(core `gate-exit.ts` 的一处铸点;`settlementKind` 在 7.17.x 的 core 与 sdk
119
- * 真字节上**零命中**,本包按 clean-cut 不留双读,登记在 `run-retired-vocabulary-census-test.mjs`)。
120
- * 两者不是改名:`settlementKind` 只说得出「结算是怎么落的」,而 in-fold 拒绝那一臂**根本没有
121
- * 结算**骑在帧上(`mandate_unreconstructible`)—— 旧位在那一形上恒缺席。
122
- *
123
- * 三词各答「为什么这只 ask 判不出来」(上游逐字):
124
- * · `approver_unavailable` —— 被问到的审批席(本 run 自己的,或委派子代身上那张冻结的祖先席)
125
- * 对路由问题答了 `unavailable`,而其后**没有**耐久 park 接下这次调用;
126
- * · `no_approver_wired` —— 这条 run 根本没接审批席(或问答面),或者席位就是拒绝姿态串
127
- * (headless 自动拒);
128
- * · `mandate_unreconstructible` —— 继承来的耐久审批 mandate 绑住了这只 ask,而**这条腿没有 park
129
- * 设施**去兑现它,于是委派子代就地拒绝(in-fold 拒,帧上不带 settlement)。
130
- *
131
- * 🔴 形制:`Object.freeze` 的数组(同 `MCP_INJECTION_DROP_REASONS` 的已定谳病形)。
132
- */
133
14
  export declare const ASK_UNRESOLVABLE_CAUSES: readonly string[];
134
- /** `delegation.ask_unresolvable` 通告 `detail` 上的事实(引擎在拒绝出口知道的那几件)。 */
135
15
  export interface AskUnresolvableFactsView {
136
- /** 这条通告投给哪个会话。**必填** —— user audience 的通告没有会话就无处投递(上游在铸点抛)。 */
137
16
  sessionId: string;
138
- /** 这只 ask 是为哪个工具问的(引擎的 message 里逐字引了它)。 */
139
17
  toolName: string;
140
- /** 被拒的那次调用 id —— 与带着同一次拒绝的 `tool_end` 帧对得上的关联键。 */
141
18
  toolCallId: string;
142
- /** 三词之一({@link ASK_UNRESOLVABLE_CAUSES})。 */
143
19
  cause: string;
144
- /**
145
- * 这条 run 上**有没有**武装过耐久审批 park 车道。
146
- * `true` = park 有过它那一次机会而没接下(它拒了或失败了);`false` = 压根没有 park 车道(常见形)。
147
- * 🔴 **读不出 ⇒ 键不铸**(不折 `false`):「没有 park 车道」与「不知道有没有」的下一步不同 ——
148
- * 前者该去接一个 checkpoint 店,后者该去问引擎为什么没说。
149
- */
150
20
  parkLaneExisted?: boolean;
151
21
  }
152
- /**
153
- * `delegation.ask_unresolvable` 通告 → 事实;不成形 ⇒ `undefined`,绝不抛出。
154
- *
155
- * 🔴 `cause` **按闭集读**:它是消费端分支的键(三条恢复路不同 —— 接一个耐久店 / 接一个审批席 /
156
- * 别在无 park 设施的腿上继承 mandate)。读不懂的词 ⇒ **整只缺席**,而不是交一个分不了支的串。
157
- */
158
22
  export declare function readAskUnresolvable(notice: unknown): AskUnresolvableFactsView | undefined;
159
- /**
160
- * 一条腿上的耐久审批 **mandate 从哪儿来**(core `DURABLE_MANDATE_SOURCES` 逐词镜像,
161
- * `dist/core/tool-policy.d.ts:1403`)。两词的**恢复动作不同**,这正是上游把它铸上通告的理由:
162
- * · `force_durable_gate` —— per-principal 的控制面权利,与席位无关 ⇒ 要么给这套部署接一个
163
- * checkpoint 店,要么撤掉这批 principal 的这项权利;
164
- * · `durable_approval` —— 任务自己的 opt-in 且**没有**活审批席 ⇒ 给任务一个活席位,或者不要
165
- * 再传 `durableApproval`。
166
- *
167
- * 🔴 形制同上(冻结数组)。
168
- */
169
23
  export declare const DURABLE_MANDATE_SOURCES: readonly string[];
170
- /** `config.durable_gate_unavailable` 通告 `detail` 上的事实。 */
171
24
  export interface DurableGateUnavailableFactsView {
172
- /** 这条通告投给哪个会话(user audience ⇒ 必填)。 */
173
25
  sessionId: string;
174
- /** 哪一条 run。 */
175
26
  runId: string;
176
- /** 这条腿服务的 principal;上游只在有值时铸 ⇒ 读不出即缺席。 */
177
27
  principal?: string;
178
- /**
179
- * **哪一个 mandate 没被兑现**({@link DURABLE_MANDATE_SOURCES} 之一)。
180
- * 🔴 读不懂的词 ⇒ **整只缺席**(它是恢复动作的分支键;猜错会把人指去撤一项他根本没开的权利)。
181
- */
182
28
  source: string;
183
- /**
184
- * **为什么没有 park 设施**:上游今天两词 `no_deployment_store`(这套部署一个店都没接)/
185
- * `task_store_disabled`(`TaskSpec.checkpointStore: "disabled"`,这一次 run 自己关掉的)。
186
- * 🔴 **开集透传**:core 今天**不导出**这两个词的闭集(它在铸点是一个三元表达式,
187
- * `prepare-wiring-manifest.js:90`)⇒ 抄一份就是本包自铸词表,加员那天还是本包先错。
188
- * 非空串即原样带回,词表属主在 core;要分支的消费端自己按已知词判,别拿它当穷举。
189
- */
190
29
  cause: string;
191
- /** 这条腿的权限 ask **会不会**由一个活席位当场答(`false` ⇒ fail-closed 拒)。读不出 ⇒ 键不铸。 */
192
30
  liveApprover?: boolean;
193
- /** `AskUserQuestion` **会不会**由一个活问答面当场答。读不出 ⇒ 键不铸。 */
194
31
  liveQuestionFace?: boolean;
195
32
  }
196
- /**
197
- * `config.durable_gate_unavailable` 通告 → 事实;不成形 ⇒ `undefined`,绝不抛出。
198
- *
199
- * 🔴 **两个布尔位缺席不折 `false`**:core 在铸点把它们写成必填,但「这一格读不出」与
200
- * 「这一格是 false」对用户的下一步不同(前者是「引擎没说」,后者是「没有人会答你这条 ask」)。
201
- */
202
33
  export declare function readDurableGateUnavailable(notice: unknown): DurableGateUnavailableFactsView | undefined;
203
- /** `skills.listing_truncated` 通告 `detail` 上的事实(core `skill-listing-budget.js` 铸点逐格)。 */
204
34
  export interface SkillsListingTruncatedFactsView {
205
- /** 清单实际拿到的字节预算 = 在场预算(core 7.20.0 起 8 KiB 结构天花板退役,声明比例即实际;0.70.0 那版曾并列一个
206
- * `requestedBudgetBytes?` 与派生 `laneClamped?`,随该 detail 键在 7.20.0 删除而**整只退役**——不留恒 false 的位)。 */
207
35
  budgetBytes: number;
208
- /** 每条描述的字符帽(含省略号)。读不出 ⇒ 键不铸。 */
209
36
  descMaxChars?: number;
210
- /** 这一帧清单上的技能总数(初始清单 = 全名册;drift 帧 = 新宣告的那一批)。 */
211
37
  total: number;
212
- /** 带完整描述上了清单的条数(= total − nameOnly − dropped;引擎铸点算好,本包照带不重算)。 */
213
38
  kept: number;
214
- /** 只列名的技能名(按引擎顺序)。 */
215
39
  nameOnly: readonly string[];
216
- /** 整条没进清单的技能名(病态形;Skill 工具仍服务它们)。 */
217
40
  dropped: readonly string[];
218
- /** 投给哪个会话。读不出 ⇒ 键不铸(operator 通告不要求会话)。 */
219
41
  sessionId?: string;
220
42
  }
221
- /**
222
- * `skills.listing_truncated` 通告 → 事实;不成形 ⇒ `undefined`,绝不抛出。
223
- *
224
- * 🔴 必填 = `budgetBytes` / `total` / `kept` / `nameOnly` / `dropped`(引擎铸点恒带的五格);任一读不出 ⇒ 整只缺席。
225
- * 🔴 `nameOnly` / `dropped` 里混进非串 ⇒ 整只缺席(名单是渲染键,半张坏名单比没有更坏)。
226
- * 🔴 `kept` 照带不重算:引擎已在铸点算过;本包再算一遍 = 第二份公式,上游改口那天两边各走各的。
227
- */
228
43
  export declare function readSkillsListingTruncated(notice: unknown): SkillsListingTruncatedFactsView | undefined;
229
- /** `McpReconnectResult.outcome` 三词(core `src/core/mcp.ts` 逐字);无处置表 —— 成员资格就是全部意义。 */
230
44
  export declare const MCP_REDIAL_OUTCOMES: readonly string[];
231
- /** {@link readMcpServerRedialed} 的读数(core `engine-notice.d.ts` 的 `detail` 逐字同形)。 */
232
45
  export interface McpServerRedialedFactsView {
233
46
  server: string;
234
47
  outcome: string;
235
- /** 重拨相对于此前挂载**多**了几个命名空间化工具(计数)。 */
236
48
  added: number;
237
- /** 同上,**少**了几个。失败重拨 ⇒ 该 server 的工具全部撤走,这一格就是撤走的数目。 */
238
49
  removed: number;
239
- /** 非 `reconnected` 时的因由(已中性化、封长);渲染用,不分支。 */
240
50
  reason?: string;
241
51
  sessionId: string;
242
52
  runId: string;