@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,39 +1,5 @@
1
- /** Test/introspection hook(缺省 = 默认槽,与 0.44.0 逐字同)。 */
2
1
  export declare function isEngineCompactPending(sessionKey?: string): boolean;
3
- /**
4
- * Test hook: reset the cached capability (fresh engine / respawn)。
5
- *
6
- * 🔴 **只清能力面,绝不动 arm 台账**(异源对抗复审第四轮 [medium] 采纳,修回归):本口是**生产口**
7
- * (引擎重启 / respawn 的能力失效),不是「取消用户的 /compact」。一度顺手加的 `pendingCompactKeys.clear()`
8
- * 会让「idle 时 `/compact` 回过 armed → 引擎 respawn → 下一条 run 不再压缩」——用户的命令无声蒸发,
9
- * 而且那是**默认槽**上的行为改变,与本批「单会话宿主逐字节零变化」的声明直接矛盾。
10
- * 要清 arm 走 {@link __resetEngineCompactArmForTests}(测试钩,生产面没有这个动作)。
11
- */
12
2
  export declare function resetManualCompactCapability(): void;
13
- /** 测试钩:清 arm 台账(module 级单例,同进程多组断言必须能清)。生产面**没有**这个动作。 */
14
3
  export declare function __resetEngineCompactArmForTests(): void;
15
- /**
16
- * The /compact command's live half. Mid-turn: fire now. Idle: arm for the next run bind.
17
- * Returns what it did (for the command's display line / tests). No-op ('offline') without a live
18
- * wire; 'unsupported' when the engine's capabilities said manualCompact:false ([488] TOC-local) —
19
- * the client-side projection compaction still runs, but the ENGINE session context does not shrink.
20
- *
21
- * 🔴 design/285 批 3(D7b):本族三处零参 `engineWireTarget()` 全部换成 `engineWireTargetFor(sessionKey)`。
22
- * /compact 打的是**这个会话此刻在飞的那条 run**,不是某一行子代 —— owner 台账里没有它,所以槽键
23
- * 只能由调用方给(多会话宿主每个 REPL 面板一个槽)。缺省 `DEFAULT_SESSION_KEY` ⇒ 与 0.44.0 逐字同。
24
- * 📋 **带反证的驳回半场(异源对抗复审第三轮 [high] 的另一半,如实记)**:复审还要求把快照提前到
25
- * **request(arm)那一拍**,理由是「arm 与 bind 之间槽可能被重绑,意图属于 A 却在 B 上执行」。
26
- * **不采**,反证:arm 那一拍**根本没有 taskId** —— `/compact` 在 idle 下的语义是成文的
27
- * 「**这个槽的下一条 run**」(见本文件头注的 arm-then-fire 段),槽的身份就是 key 本身。
28
- * 槽真被重绑到另一台引擎时,「下一条 run」就在那台引擎上,压它才是意图;把 request 那一刻的
29
- * target 冻下来反而会去压一台**已经不再跑这条会话**的引擎。⇒ 冻结的正确起点是**拿到 taskId 的
30
- * 那一拍**(bind),那之后的每一次延迟与重试都必须用同一份 —— 那正是上面这一条。
31
- * 现状由常驻钉 `B3-P31/R6i` 钉住(arm 之后换槽装配 ⇒ 发射打的是**换后**那台,且带换后的会话)。
32
- * 🔴 **一条动词的槽键必须一以贯之**(异源对抗复审 [high] 采纳):目标、`?session=`、**run id**
33
- * (`activeEngineRunIdFor`)、**能力位**(per-baseUrl 分桶)、**arm 状态**(per-key 分桶)——
34
- * 五件全按同一个 key。只换其中几件就是**半 keyed 形**:那比换锚之前更坏(之前五件一致地错在同一个
35
- * 槽上,一眼可见;半 keyed 是「A 的 run id 发到 B 的服务器」「B 的 arm 被 A 的 bind 吃掉」这类只在
36
- * 多会话下现形的错)。这条正是 plan 决策链本批**豁免**的同一条理由 —— 那边整条链搬不动,这边搬得动。
37
- */
38
4
  export declare function requestEngineCompact(sessionKey?: string): 'fired' | 'armed' | 'offline' | 'unsupported';
39
5
  export declare function onEngineTaskBound(taskId: string, sessionKey?: string): void;
@@ -1,71 +1,12 @@
1
- /**
2
- * ⇄ B6 批搬迁(2026-07-27,设计稿 §3 B6):cli `src/sema/engineCompactWire.ts` 整搬。
3
- *
4
- * 🔴 搬迁差分:
5
- * · `wireConfig()`(六份手抄的**最后一份**,而且这一份已经多长了一行 principal 注释 ——
6
- * 漂移的活样本)→ `engineWireTarget()`;
7
- * · `getActiveEngineTaskId()` → `activeEngineRunId()`(SessionPort);
8
- * · `logForDebugging` → `hostLog('debug', …)`;
9
- * · `setTimeout(...)+t.unref?.()` → `hostTimers()`(**本文件是 TimersPort 的第一个消费者**)。
10
- * 🔴 端没装 TimersPort 的后果**说清楚**:两处延迟发射(404 单次重试 / bind 后 1.5s 发射)
11
- * 会**整个不发生** —— `/compact` 在 idle armed 之后就再也不会真正打到引擎,而命令行显示的
12
- * 还是 'armed'。这不是「少个定时器」,是一条静默失效的功能腿。所以缺 port 时留 debug 日志,
13
- * 并且 `hostPortMisses()` 里能看见(端自检恒应为空)。
14
- *
15
- * ── 以下为原文件的领域说明(逐字保留)────────────────────────────────────────────────────────
16
- *
17
- * engineCompactWire — manual /compact reaches the ENGINE (K-1c), not just the client projection.
18
- *
19
- * Problem (clay dogfood 07-03): in live mode `/compact` ran only the CLIENT-side compaction (the local
20
- * message projection) — the engine session's context was never compacted, so the next turn still paid
21
- * the full window.
22
- *
23
- * Engine contract (service server.ts:1874, core 1.156 `TaskStream.compact()`):
24
- * POST /v1/runs/:id/compact → 202; compaction runs at the next SAFE turn boundary and a
25
- * `compacted{trigger:"manual"}` event rides the run's OWN stream. The verb only applies to a run LIVE
26
- * on the replica — and `/compact` is typed while IDLE, when there is no live run. So the wire is
27
- * arm-then-fire:
28
- * - `/compact` mid-turn (active engine run bound) → fire immediately against that run.
29
- * - `/compact` idle → arm a pending flag; the host's run_started bind (onEngineTaskBound) fires it
30
- * against the NEXT turn's run — the engine compacts at that turn's first safe boundary, exactly
31
- * the semantics CC users expect ("everything before this point is summarized").
32
- *
33
- * SDK 0.0.52 长出 runs.compact verb(SDK 宪法迁移批)—— raw fetch 退役,改走 AgentClient
34
- * (engineWireSdk 工厂;baseUrl/token/principal 纪律与 live wire 同源)。Fire-and-forget + fail-soft
35
- * 语义不变:409/501/网络错都只留 debug 日志,端侧投影压缩仍是可见结果。
36
- * 迁移差分记账:①原 raw POST 无超时 → SDK 缺省 60s 预算(compact 是 202 即回的 arm verb,本地
37
- * 口毫秒级,纯上界改善);②404 单次 2s 延迟重试(早 header bind 跑赢 run-row 持久化)逐字保留。
38
- */
39
1
  import { hostLog, hostTimersFor } from '../host.js';
40
2
  import { makeEngineWireClient } from '../engineWireSdk.js';
41
3
  import { engineWireTargetFor } from '../engineWireTarget.js';
42
4
  import { activeEngineRunIdFor, engineSessionParamFor } from '../engineSessionParam.js';
43
5
  import { DEFAULT_SESSION_KEY } from '../sessionSlot.js';
44
- /**
45
- * 🔴 **arm 状态按会话槽分桶**(design/285 批 3,异源对抗复审 [high] 采纳)。
46
- *
47
- * 修前是一个**进程级布尔**:`/compact` 在 B 会话上 idle-arm 之后,**先 bind 的那条会话**(可能是 A)
48
- * 会把它消费掉 —— B 要的压缩发到了 A 的 run 上(动了一条不相干会话的上下文),而 B 自己永远没压缩。
49
- * 单会话宿主上这两件事是同一件,keyed 化之后才第一次分得开。
50
- */
51
6
  const pendingCompactKeys = new Set();
52
- /** Test/introspection hook(缺省 = 默认槽,与 0.44.0 逐字同)。 */
53
7
  export function isEngineCompactPending(sessionKey = DEFAULT_SESSION_KEY) {
54
8
  return pendingCompactKeys.has(sessionKey);
55
9
  }
56
- /**
57
- * [488] 定谳(2026-07-07 指纹探针,server 1.130.0):TOC 本地引擎(无 TiDB runStore)的
58
- * manual-compact verb 是 BY-DESIGN 501(handler 第一道闸 `!deps.runStore → 501`,capabilities
59
- * 也如实报 `manualCompact:false`)——之前端没消费这个 gate,verb 打过去 501 被 fire-and-forget
60
- * 吞掉,引擎 session 从未压缩=「静默 no-op」的真机理。这里 lazy 探一次 /v1/capabilities 并缓存;
61
- * false ⇒ requestEngineCompact 返回 'unsupported'(不再装作 armed/fired)。探测失败 fail-open
62
- * (null=未知 ⇒ 保持旧行为发 verb,错误面不变)。
63
- */
64
- // 🔴 **判定位与在途探测按 baseUrl 分桶**(design/285 批 3,异源对抗复审 [high] 采纳;与
65
- // `engineCapsCache` / `engineSubagentOutput.capByBase` 同代)。修前是**进程级单值**:keyed 宿主上
66
- // `requestEngineCompact('B')` 会拿**先探到的那台引擎**(可能是 A)的 `manualCompact` 位去决定要不要
67
- // 给 B 发 verb —— 一条动词的槽键必须一以贯之,目标/会话/run id/能力位缺一个都是半 keyed 形。
68
- // ⚠️ 单会话宿主只有一个 baseUrl ⇒ 分桶后与 0.44.0 逐字同(同一个 base 仍是「探一次、缓存住」)。
69
10
  const manualCompactCapableByBase = new Map();
70
11
  const capabilitiesProbeByBase = new Map();
71
12
  function probeManualCompactCapability(sessionKey = DEFAULT_SESSION_KEY) {
@@ -77,9 +18,6 @@ function probeManualCompactCapability(sessionKey = DEFAULT_SESSION_KEY) {
77
18
  return;
78
19
  capabilitiesProbeByBase.set(base, (async () => {
79
20
  try {
80
- // SDK 0.0.52 client.capabilities()(typed Capabilities.manualCompact)。5s 预算经 client
81
- // timeoutMs(对抗复审 MED 原语义:hung engine 不 pin probe promise);非 2xx/网络错/超时 SDK
82
- // 统一抛错 → 与原「non-200 也重试」同归 catch 删记号允许后续重试。
83
21
  const client = makeEngineWireClient({
84
22
  baseUrl: base,
85
23
  ...(cfg.token ? { token: cfg.token } : {}),
@@ -94,39 +32,21 @@ function probeManualCompactCapability(sessionKey = DEFAULT_SESSION_KEY) {
94
32
  if (typeof caps.manualCompact === 'boolean')
95
33
  manualCompactCapableByBase.set(base, caps.manualCompact);
96
34
  else
97
- capabilitiesProbeByBase.delete(base); // shape we don't understand — retry later
35
+ capabilitiesProbeByBase.delete(base);
98
36
  }
99
37
  catch {
100
- capabilitiesProbeByBase.delete(base); // non-2xx/network error/timeout: unknown stays fail-open, next call re-probes
38
+ capabilitiesProbeByBase.delete(base);
101
39
  }
102
40
  })());
103
41
  }
104
- /**
105
- * Test hook: reset the cached capability (fresh engine / respawn)。
106
- *
107
- * 🔴 **只清能力面,绝不动 arm 台账**(异源对抗复审第四轮 [medium] 采纳,修回归):本口是**生产口**
108
- * (引擎重启 / respawn 的能力失效),不是「取消用户的 /compact」。一度顺手加的 `pendingCompactKeys.clear()`
109
- * 会让「idle 时 `/compact` 回过 armed → 引擎 respawn → 下一条 run 不再压缩」——用户的命令无声蒸发,
110
- * 而且那是**默认槽**上的行为改变,与本批「单会话宿主逐字节零变化」的声明直接矛盾。
111
- * 要清 arm 走 {@link __resetEngineCompactArmForTests}(测试钩,生产面没有这个动作)。
112
- */
113
42
  export function resetManualCompactCapability() {
114
43
  manualCompactCapableByBase.clear();
115
44
  capabilitiesProbeByBase.clear();
116
45
  }
117
- /** 测试钩:清 arm 台账(module 级单例,同进程多组断言必须能清)。生产面**没有**这个动作。 */
118
46
  export function __resetEngineCompactArmForTests() {
119
47
  pendingCompactKeys.clear();
120
48
  }
121
- /**
122
- * 延迟发射(`setTimeout` + `unref` 的 port 形)。缺 TimersPort ⇒ **不发射**并留日志 ——
123
- * 静默 drop 会让 `/compact` 看起来 armed 了却永不落地(见文件头)。
124
- */
125
49
  function deferFire(ms, fn, why, sessionKey) {
126
- // 🔴 定时器也按本槽取(异源对抗复审第四轮 [medium] 采纳):零参 `hostTimers()` 读的是**默认槽** ——
127
- // 按接入契约只走 `installHostFor(key, {timers})` 的 keyed-only 宿主在那里恒空 ⇒ 快照有效、arm 已划掉、
128
- // 请求永远不发射。一条动词的槽键必须一以贯之,定时器是第六件。
129
- // (默认槽下 `hostTimersFor(DEFAULT_SESSION_KEY)` ≡ `hostTimers()`,逐字节等价。)
130
50
  const timers = hostTimersFor(sessionKey);
131
51
  if (!timers) {
132
52
  hostLog('debug', `engineCompactWire: no TimersPort — ${why} 不会发射(端漏装 port,/compact 这条腿静默失效)`);
@@ -135,7 +55,6 @@ function deferFire(ms, fn, why, sessionKey) {
135
55
  timers.setTimer(ms, fn);
136
56
  return true;
137
57
  }
138
- /** 按本槽冻一发;`null` = 那一刻没有 wire(与修前的 `!cfg` 早退同语义,只是提前到冻结那一拍)。 */
139
58
  function freezeCompactShot(taskId, sessionKey) {
140
59
  const cfg = engineWireTargetFor(sessionKey);
141
60
  if (!cfg)
@@ -151,9 +70,6 @@ function freezeCompactShot(taskId, sessionKey) {
151
70
  };
152
71
  }
153
72
  async function postCompact(shot, retriesLeft = 1) {
154
- // SDK runs.compact(0.0.52)——POST /v1/runs/:id/compact body {}(无 instructions 时与原 '{}' 逐字
155
- // 同 wire);header 姿势 = Transport buildHeaders(Bearer 仅有 token 时 + x-agent-principal +
156
- // content-type),与原手抄同三头。🔴 三头与 `?session=` 全取**冻结的那一份**,绝不现读。
157
73
  const client = makeEngineWireClient({
158
74
  baseUrl: shot.baseUrl,
159
75
  ...(shot.token ? { token: shot.token } : {}),
@@ -170,9 +86,7 @@ async function postCompact(shot, retriesLeft = 1) {
170
86
  const status = e?.status;
171
87
  if (typeof status === 'number') {
172
88
  hostLog('debug', `engineCompactWire: POST compact ${taskId} → ${status}`);
173
- // 404 = the early header bind outran the run-row persist — one deferred retry covers it.
174
89
  if (status === 404 && retriesLeft > 0) {
175
- // 重试用**同一份**冻结快照:重试窗内换了会话/换了引擎,旧 taskId 也绝不配新凭证。
176
90
  deferFire(2000, () => void postCompact(shot, retriesLeft - 1), '404 单次重试', shot.sessionKey);
177
91
  }
178
92
  return;
@@ -180,39 +94,15 @@ async function postCompact(shot, retriesLeft = 1) {
180
94
  hostLog('debug', `engineCompactWire: compact fire failed (best-effort): ${String(e)}`);
181
95
  }
182
96
  }
183
- /**
184
- * The /compact command's live half. Mid-turn: fire now. Idle: arm for the next run bind.
185
- * Returns what it did (for the command's display line / tests). No-op ('offline') without a live
186
- * wire; 'unsupported' when the engine's capabilities said manualCompact:false ([488] TOC-local) —
187
- * the client-side projection compaction still runs, but the ENGINE session context does not shrink.
188
- *
189
- * 🔴 design/285 批 3(D7b):本族三处零参 `engineWireTarget()` 全部换成 `engineWireTargetFor(sessionKey)`。
190
- * /compact 打的是**这个会话此刻在飞的那条 run**,不是某一行子代 —— owner 台账里没有它,所以槽键
191
- * 只能由调用方给(多会话宿主每个 REPL 面板一个槽)。缺省 `DEFAULT_SESSION_KEY` ⇒ 与 0.44.0 逐字同。
192
- * 📋 **带反证的驳回半场(异源对抗复审第三轮 [high] 的另一半,如实记)**:复审还要求把快照提前到
193
- * **request(arm)那一拍**,理由是「arm 与 bind 之间槽可能被重绑,意图属于 A 却在 B 上执行」。
194
- * **不采**,反证:arm 那一拍**根本没有 taskId** —— `/compact` 在 idle 下的语义是成文的
195
- * 「**这个槽的下一条 run**」(见本文件头注的 arm-then-fire 段),槽的身份就是 key 本身。
196
- * 槽真被重绑到另一台引擎时,「下一条 run」就在那台引擎上,压它才是意图;把 request 那一刻的
197
- * target 冻下来反而会去压一台**已经不再跑这条会话**的引擎。⇒ 冻结的正确起点是**拿到 taskId 的
198
- * 那一拍**(bind),那之后的每一次延迟与重试都必须用同一份 —— 那正是上面这一条。
199
- * 现状由常驻钉 `B3-P31/R6i` 钉住(arm 之后换槽装配 ⇒ 发射打的是**换后**那台,且带换后的会话)。
200
- * 🔴 **一条动词的槽键必须一以贯之**(异源对抗复审 [high] 采纳):目标、`?session=`、**run id**
201
- * (`activeEngineRunIdFor`)、**能力位**(per-baseUrl 分桶)、**arm 状态**(per-key 分桶)——
202
- * 五件全按同一个 key。只换其中几件就是**半 keyed 形**:那比换锚之前更坏(之前五件一致地错在同一个
203
- * 槽上,一眼可见;半 keyed 是「A 的 run id 发到 B 的服务器」「B 的 arm 被 A 的 bind 吃掉」这类只在
204
- * 多会话下现形的错)。这条正是 plan 决策链本批**豁免**的同一条理由 —— 那边整条链搬不动,这边搬得动。
205
- */
206
97
  export function requestEngineCompact(sessionKey = DEFAULT_SESSION_KEY) {
207
98
  const cfg = engineWireTargetFor(sessionKey);
208
99
  if (!cfg)
209
100
  return 'offline';
210
- probeManualCompactCapability(sessionKey); // lazy, cached per baseUrl; first call may still ride the old path (fail-open)
101
+ probeManualCompactCapability(sessionKey);
211
102
  if (manualCompactCapableByBase.get(cfg.baseUrl) === false) {
212
103
  hostLog('debug', 'engineCompactWire: engine capabilities report manualCompact:false — verb suppressed (TOC-local runStore-less engine, [488])');
213
104
  return 'unsupported';
214
105
  }
215
- // 🔴 run id 也按本槽取(异源对抗复审 [high]):写死默认槽 = 把 A 的 run id 发到 B 的服务器上。
216
106
  const taskId = activeEngineRunIdFor(sessionKey);
217
107
  if (taskId) {
218
108
  const shot = freezeCompactShot(taskId, sessionKey);
@@ -223,34 +113,14 @@ export function requestEngineCompact(sessionKey = DEFAULT_SESSION_KEY) {
223
113
  pendingCompactKeys.add(sessionKey);
224
114
  return 'armed';
225
115
  }
226
- /**
227
- * host run_started hook: a new engine run just bound. If a manual compact is pending, fire it —
228
- * the engine compacts at this turn's first safe boundary.
229
- *
230
- * Timing: the bind fires off the X-Task-Id RESPONSE HEADER — the earliest possible signal, which can
231
- * precede the server's run-row persist (a straight POST here raced it to a 404 in the live harness).
232
- * Compaction runs at the next safe TURN BOUNDARY anyway, so a short defer loses nothing; retry once
233
- * more for slow persists. Both shots are best-effort (postCompact never throws).
234
- */
235
116
  const BOUND_FIRE_DELAY_MS = 1500;
236
117
  export function onEngineTaskBound(taskId, sessionKey = DEFAULT_SESSION_KEY) {
237
- probeManualCompactCapability(sessionKey); // warm the capability cache off the first turn bind, before any /compact
238
- // 🔴 只消费**本槽**的 arm(异源对抗复审 [high]):进程级布尔会让先 bind 的那条会话把别人的 arm 吃掉 ——
239
- // B 要的压缩发到 A 的 run 上,而 B 自己永远没压缩。
118
+ probeManualCompactCapability(sessionKey);
240
119
  if (!pendingCompactKeys.has(sessionKey))
241
120
  return;
242
- // 🔴 **在 bind 这一拍冻结**(异源对抗复审 [high]):延迟 1.5s 之后再现读 target/session,就会把
243
- // 这一拍的 taskId 配上那一拍的引擎与会话。
244
- // 🔴 **冻不出快照就不消费这一记 arm**(异源对抗复审第三轮 [high] 的可采半场):那一刻没有 wire
245
- // 时,旧形是「先把 arm 划掉、再发现发不出去」= 用户的 `/compact` 无声蒸发,而命令行早就回过
246
- // 'armed'。改成**冻出来了才划掉**:这一拍发不出就留着,下一次 bind 再兑现(arm-then-fire 的
247
- // 本意就是「下一条 run」,不是「下一条 run 且那一刻恰好有 wire」)。
248
121
  const shot = freezeCompactShot(taskId, sessionKey);
249
122
  if (shot === null)
250
123
  return;
251
- // 🔴 **登记上定时器才划掉 arm**(异源对抗复审第四轮 [medium]):端漏装 TimersPort 时 `deferFire`
252
- // 只留一行日志就返回,先划掉 arm 就等于把用户的 `/compact` 无声吃掉(与上面那条同一个道理,
253
- // 只是这一次挡的是「冻得出快照但排不上队」)。
254
124
  if (deferFire(BOUND_FIRE_DELAY_MS, () => void postCompact(shot), 'bind 后发射', sessionKey)) {
255
125
  pendingCompactKeys.delete(sessionKey);
256
126
  }
@@ -1,44 +1,13 @@
1
- /** 记一个子代行的转录锚(幂等;server <1.278 永不调用 = 台账恒空,取件腿整条静默不动)。 */
2
1
  export declare function recordEngineTranscriptId(taskId: string, transcriptId: string): void;
3
- /** 读面(取件腿 + 测试)。 */
4
2
  export declare function getEngineTranscriptId(taskId: string): string | undefined;
5
- /** 测试钩:清台账 + 在飞记号。 */
6
3
  export declare function __resetEngineDelegatedPromptForTests(): void;
7
- /**
8
- * content → 纯文本。tool_result 型正文返回 undefined —— 那是子代自己跑工具的回填,**不是**委派
9
- * prompt(这条判别就是「别把子代自己的消息当委派 prompt」的落点)。
10
- */
11
4
  export declare function delegatedPromptText(content: unknown): string | undefined;
12
- /**
13
- * 从转录里挑出委派 prompt = **最后一条非 tool_result 的 user 消息**(倒扫)。
14
- * 🔴 倒扫不是随手选的:fork 型子代的转录以**父会话历史**开头,正扫会拿到宿主自己的首轮提示
15
- * (live pty 实测的错答案);全新子会话型只有一条 user 文本消息,倒扫结果与正扫相同。
16
- */
17
5
  export declare function pickDelegatedPrompt(messages: readonly unknown[]): string | undefined;
18
- /** 读面注入点(离线测试用):替身返回转录窗口条目数组。 */
19
6
  type TranscriptWindowReader = (transcriptId: string) => Promise<readonly unknown[] | null>;
20
7
  export declare function __setTranscriptWindowReaderForTests(r: TranscriptWindowReader | null): void;
21
- /** `fetchDelegatedPrompt` 的结果 —— 三态,**端必须分得开**(见下面 outcome 的键注)。 */
22
8
  export interface DelegatedPromptFetch {
23
- /** 挑到的委派 prompt;`undefined` = 没拿到(看 `outcome` 分清是哪种没拿到)。 */
24
9
  prompt?: string;
25
- /**
26
- * · `'hit'` —— 拿到了,端可以落状态。
27
- * · `'skipped'` —— 无转录锚 / 已有在飞 ⇒ 端什么都别做(不是失败)。
28
- * · `'unreadable'` —— 压根没读到(无 wire / 构造失败 / throw)⇒ **记号已撤**,下次可重试。
29
- * · `'absent'` —— 读成功但转录里挑不出委派 user 消息 ⇒ **定论**,记号保留,不再重复打读面。
30
- *
31
- * 🔴 `unreadable` 与 `absent` 分开是复审穷举第 5 条:混成一个会把「一次性取件」变成
32
- * 「每次进查看态都打一发 `GET /v1/sessions/:id`」。
33
- */
34
10
  outcome: 'hit' | 'skipped' | 'unreadable' | 'absent';
35
11
  }
36
- /**
37
- * 取一个后台子代行的**委派 prompt**(判定半场:防抖 + 取锚 + 读转录 + 挑正文)。
38
- * 幂等、fail-soft、绝不 throw。**不碰任何端状态** —— 落状态是端的事(见文件头拆缝说明)。
39
- *
40
- * 端侧用法(壳 `hydrateEngineAgentPrompt` shim):先自己判「这行是不是 local_agent、prompt 是不是
41
- * 已经有了」,是才调本函数;拿到 `outcome==='hit'` 再 `setState`。
42
- */
43
12
  export declare function fetchDelegatedPrompt(taskId: string): Promise<DelegatedPromptFetch>;
44
13
  export {};
@@ -1,78 +1,24 @@
1
- /**
2
- * ⇄ B6 批搬迁(2026-07-27,设计稿 §3 B6 + §2.5 拆缝表):cli `src/sema/engineDelegatedPrompt.ts` 的
3
- * **判定半场** —— 转录锚台账(module 级)+ 委派 prompt 挑选规则 + 转录窗口读面 + 在飞防抖。
4
- *
5
- * 留在 TUI(**执行半场**):`hydrateEngineAgentPrompt` 里对 `AppState.tasks[taskId]` 的
6
- * `isLocalAgentTask` 判别 / `store.setState` 落 `prompt` / 查看态转录补插首条 user 消息 ——
7
- * 那三件读写的是**端的任务状态形状**(`LocalAgentTaskState`),web/桌面各有各的形。
8
- * 壳侧 shim 保留原函数名与签名,内部改成「调本包 `fetchDelegatedPrompt()` → 拿到串再 setState」。
9
- *
10
- * 🔴 **单实例纪律(这条是本文件搬迁的真正理由,不是顺手)**:`transcriptIdByTask` 是 module 级
11
- * Map,**写者 = `fleetLedger` 的行帧/通知帧消费臂**(`recordEngineTranscriptId`),
12
- * **读者 = 取件腿**。fleetLedger 已在本包内 ⇒ 台账若留在壳里就是「包写壳读」两份实例,
13
- * 取件腿恒读空、Prompt 段恒留白,而两边代码看着都对
14
- * ([paired-mechanisms-must-share-premise] 同族失败形)。所以台账必须与写者同包。
15
- *
16
- * ── 以下为原文件的领域说明(逐字保留,它记着两条踩过的坑)────────────────────────────────────
17
- *
18
- * engineDelegatedPrompt — 后台子代**委派 prompt** 的取件腿(server 1.278.0 `transcriptId` 提货)。
19
- *
20
- * ── 缺陷形
21
- * 后台子代行是行帧 lane(fleet stream)投影出来的,行帧上**没有** prompt —— 于是
22
- * `AsyncAgentDetailDialog` 的 `Prompt` 段恒空(row.prompt = '')。前台子代的 prompt 由
23
- * `task_progress` tick 的绑定臂晚绑,后台子代整跑零 tick(tick lane 根本没通道),所以那条腿
24
- * 对它无效。
25
- *
26
- * ── 修法(不发明:server 1.278.0 在 fleet 行上加了 `transcriptId`)
27
- * `transcriptId` = core 铸的**子代 childSessionId**(core subagent.js:`transcriptId: child.sessionId`)。
28
- * 它是**取件锚不是内容** —— 端凭它去 session 读面(`GET /v1/sessions/:id`,SDK
29
- * `sessions.get`)取转录,从里面挑出委派 prompt。
30
- *
31
- * 🔴 取哪一条 —— **最后一条非 tool_result 的 user 消息**,不是第一条(live 一手取证订正):
32
- * `fork` 型子代的 `child.sessionId` 是**父会话的 fork**(core subagent.js:1749
33
- * `forkTranscriptId = child.sessionId ?? forkedId`),转录里先是**父会话的全部历史**,委派
34
- * prompt 追加在 fork 点。所以「第一条 user 消息」拿到的是**宿主自己的首轮提示**——第一版就是
35
- * 这么写的,live pty 实测拉回 6869 字符(委派 prompt 只有 ~330),典型的「看起来很合理的错答案」。
36
- * 反过来,全新子会话型子代的转录里委派 prompt 是唯一一条 user 文本消息 —— 两种形状都满足
37
- * 「最后一条非 tool_result 的 user 消息」,所以倒扫是同时正确的那一条规则。
38
- * (`tool_result` 型 user 条目 = 子代自己跑工具的回填,必须跳过。)
39
- * 窗口取 `tail=N`(转录尾部)+ `blobCap`:委派 prompt 在尾部方向,而 `messages` 整段可以非常大。
40
- * 诚实边界:子代被 steer 过(steerSubagent 注入 user 消息)时倒扫会拿到最新那条指令 —— 已记账,
41
- * wire 上没有「哪条是委派」的标,端不猜。
42
- *
43
- * 诚实边界:拉不到 / 没有 transcriptId / 读面 501/404 ⇒ **什么都不写**,Prompt 段维持留白。
44
- * 绝不用「子代的首条输出」或行描述冒充委派 prompt(那是把一个看起来合理的错答案摆上屏)。
45
- * 一切失败 fail-soft,绝不 throw。
46
- */
47
1
  import { stripSystemReminderBlocks } from '../systemReminderTag.js';
48
2
  import { hostLog } from '../host.js';
49
3
  import { makeEngineWireClient } from '../engineWireSdk.js';
50
4
  import { engineWireTargetFor } from '../engineWireTarget.js';
51
5
  import { resolveOwnerContext } from './engineSubagentResume.js';
52
- /** 只拉转录**尾部**这么多条(委派 prompt 在尾部方向;见文件头的 fork 形状订正)。 */
53
6
  const TAIL_WINDOW = 200;
54
- /** 单条正文的上限:详情页自己还会截到 300 字符,这里只防拉回一个巨型 blob。 */
55
7
  const BLOB_CAP = 8 * 1024;
56
- // ── 转录锚台账(module-level:footer/REPL 谁重挂都不丢;写者=行帧消费臂)───────────────────────
57
8
  const transcriptIdByTask = new Map();
58
- /** 记一个子代行的转录锚(幂等;server <1.278 永不调用 = 台账恒空,取件腿整条静默不动)。 */
59
9
  export function recordEngineTranscriptId(taskId, transcriptId) {
60
10
  if (!taskId || !transcriptId)
61
11
  return;
62
12
  transcriptIdByTask.set(taskId, transcriptId);
63
13
  }
64
- /** 读面(取件腿 + 测试)。 */
65
14
  export function getEngineTranscriptId(taskId) {
66
15
  return transcriptIdByTask.get(taskId);
67
16
  }
68
- /** 测试钩:清台账 + 在飞记号。 */
69
17
  export function __resetEngineDelegatedPromptForTests() {
70
18
  transcriptIdByTask.clear();
71
19
  promptHydrateInFlight.clear();
72
20
  }
73
- /** 每 task 一次在飞防抖;拉不到即撤记号,下次进入查看态可重试(副本重启/瞬态 404)。 */
74
21
  const promptHydrateInFlight = new Set();
75
- /** 一条转录条目的 role(permissive:`role` 或 CC jsonl 形的 `type`)。 */
76
22
  function roleOf(entry) {
77
23
  if (typeof entry !== 'object' || entry === null)
78
24
  return undefined;
@@ -81,7 +27,6 @@ function roleOf(entry) {
81
27
  return e.role;
82
28
  if (typeof e.type === 'string')
83
29
  return e.type;
84
- // CC jsonl 形:{type:'user', message:{role:'user', content}}
85
30
  if (typeof e.message === 'object' && e.message !== null) {
86
31
  const m = e.message;
87
32
  if (typeof m.role === 'string')
@@ -89,7 +34,6 @@ function roleOf(entry) {
89
34
  }
90
35
  return undefined;
91
36
  }
92
- /** 一条转录条目的正文 content(permissive:直挂 或 嵌在 `message` 里)。 */
93
37
  function contentOf(entry) {
94
38
  if (typeof entry !== 'object' || entry === null)
95
39
  return undefined;
@@ -101,13 +45,7 @@ function contentOf(entry) {
101
45
  }
102
46
  return undefined;
103
47
  }
104
- /**
105
- * content → 纯文本。tool_result 型正文返回 undefined —— 那是子代自己跑工具的回填,**不是**委派
106
- * prompt(这条判别就是「别把子代自己的消息当委派 prompt」的落点)。
107
- */
108
48
  export function delegatedPromptText(content) {
109
- // 字符串形也要过信封剥离 —— 这条早退曾经绕过它(自家红测抓到:剥的是数组形,而真转录里
110
- // 两种形都出现)。任何「返回 prompt 正文」的出口都必须经同一道剥离,否则就是半修。
111
49
  if (typeof content === 'string')
112
50
  return stripEnvelopes(content);
113
51
  if (!Array.isArray(content))
@@ -122,31 +60,12 @@ export function delegatedPromptText(content) {
122
60
  continue;
123
61
  const b = block;
124
62
  if (b.type === 'tool_result')
125
- return undefined; // 子代自己的工具回填,不是委派 prompt
63
+ return undefined;
126
64
  if (b.type === 'text' && typeof b.text === 'string')
127
65
  parts.push(b.text);
128
66
  }
129
67
  return stripEnvelopes(parts.join('\n'));
130
68
  }
131
- /**
132
- * 剥掉委派 prompt 外面那两层**运行时信封**,再判空。
133
- *
134
- * 🔴 为什么必须剥(2026-08-01 真机实测):引擎会话里那条 user 消息的前 ~1330 字符是
135
- * `<system-reminder>…技能不可用清单…</system-reminder>` 与 `<fork-boilerplate>…worker fork 交代…
136
- * </fork-boilerplate>` 两层信封,真正的委派 prompt 排在后面。而详情页的 `displayPrompt` 只渲**前 300
137
- * 字符** ⇒ 用户在「Prompt」标题下看到的是一份技能清单,不是他派下去的那句话。
138
- *
139
- * 判空也必须在剥完之后做:只有信封、没有正文的消息应当算**没有委派 prompt**(让取件腿如实留白),
140
- * 而不是把信封当成 prompt 渲出去 —— 后者是「渲了个东西」冒充「渲对了东西」。
141
- *
142
- * 信封是**成对标签**,所以用配对正则整段剥;不配对(被截断等)时保守不动,宁可多渲也不吃掉正文。
143
- */
144
- // 🔴 件⑦([4974],2026-08-22):`system-reminder` 的**开标签带属性**(core ≥5.46 恒带
145
- // `mark="<22 位 base64url>"`),精确形 `<system-reminder>` 整段剥不掉 ⇒ 上面那条 2026-08-01
146
- // 修过的 bug 原样复发(详情页 Prompt 又变回技能清单)。剥壳口径收进包内单一闸口
147
- // `systemReminderTag`(同根因的另一座位是 `classifierVerdictWire`,见该模块头注)。
148
- // `fork-boilerplate` 是 core `agents/subagent.js` 里的**裸**标签(dist 直证),保持精确形 ——
149
- // 没有属性的标签不需要属性容忍,给它加 = 给伪造面白让一寸。
150
69
  const PROMPT_ENVELOPE_EXACT_TAGS = ['fork-boilerplate'];
151
70
  function stripEnvelopes(raw) {
152
71
  let text = stripSystemReminderBlocks(raw);
@@ -155,11 +74,6 @@ function stripEnvelopes(raw) {
155
74
  }
156
75
  return text.trim() || undefined;
157
76
  }
158
- /**
159
- * 从转录里挑出委派 prompt = **最后一条非 tool_result 的 user 消息**(倒扫)。
160
- * 🔴 倒扫不是随手选的:fork 型子代的转录以**父会话历史**开头,正扫会拿到宿主自己的首轮提示
161
- * (live pty 实测的错答案);全新子会话型只有一条 user 文本消息,倒扫结果与正扫相同。
162
- */
163
77
  export function pickDelegatedPrompt(messages) {
164
78
  for (let i = messages.length - 1; i >= 0; i--) {
165
79
  const entry = messages[i];
@@ -178,10 +92,6 @@ export function __setTranscriptWindowReaderForTests(r) {
178
92
  async function readTranscriptWindow(transcriptId, sessionKey) {
179
93
  if (transcriptWindowReader)
180
94
  return transcriptWindowReader(transcriptId);
181
- // 🔴 B6:六份手抄 `wireConfig()` 收成 `engineWireTarget()`(env 读经 hostEnv,本包零 process)。
182
- // 🔴 design/285 批 3(D7b):零参形写死默认槽 —— 转录取件是**按行**的读面(锚 = 这一行登记的
183
- // transcriptId),所以 baseUrl/token/principal 必须按**这一行所属的槽**取,否则 keyed 宿主上
184
- // 会拿 A 槽的凭证去 `GET /v1/sessions/:id` 读 B 槽的转录(404,或更坏:读到同 id 的别人)。
185
95
  const cfg = engineWireTargetFor(sessionKey);
186
96
  if (!cfg)
187
97
  return null;
@@ -192,8 +102,6 @@ async function readTranscriptWindow(transcriptId, sessionKey) {
192
102
  });
193
103
  if (!client)
194
104
  return null;
195
- // 窗口读:`tail=N` = 转录**尾部** N 条(server ≥1.162)。老引擎忽略 query 返回全量 ——
196
- // 倒扫规则对全量同样正确,只是多传了点字节(行为等价)。
197
105
  const rec = await client.sessions.get(transcriptId, {
198
106
  tail: TAIL_WINDOW,
199
107
  blobCap: BLOB_CAP,
@@ -201,13 +109,6 @@ async function readTranscriptWindow(transcriptId, sessionKey) {
201
109
  const msgs = rec.messages;
202
110
  return Array.isArray(msgs) ? msgs : null;
203
111
  }
204
- /**
205
- * 取一个后台子代行的**委派 prompt**(判定半场:防抖 + 取锚 + 读转录 + 挑正文)。
206
- * 幂等、fail-soft、绝不 throw。**不碰任何端状态** —— 落状态是端的事(见文件头拆缝说明)。
207
- *
208
- * 端侧用法(壳 `hydrateEngineAgentPrompt` shim):先自己判「这行是不是 local_agent、prompt 是不是
209
- * 已经有了」,是才调本函数;拿到 `outcome==='hit'` 再 `setState`。
210
- */
211
112
  export async function fetchDelegatedPrompt(taskId) {
212
113
  if (promptHydrateInFlight.has(taskId))
213
114
  return { outcome: 'skipped' };
@@ -217,7 +118,6 @@ export async function fetchDelegatedPrompt(taskId) {
217
118
  promptHydrateInFlight.add(taskId);
218
119
  let msgs = null;
219
120
  try {
220
- // 槽键取自 owner 台账的这一行(缺席 ⇒ DEFAULT_SESSION_KEY ⇒ 与 0.44.0 逐字同)。
221
121
  msgs = await readTranscriptWindow(transcriptId, resolveOwnerContext(taskId).key);
222
122
  }
223
123
  catch (e) {
@@ -232,8 +132,6 @@ export async function fetchDelegatedPrompt(taskId) {
232
132
  hostLog('debug', `[delegated-prompt] ${taskId} transcript ${transcriptId}: ${msgs === null ? 'transcript unreadable (retryable)' : 'no delegated user message (final)'}`);
233
133
  return { outcome: msgs === null ? 'unreadable' : 'absent' };
234
134
  }
235
- // 诊断锚(SEMA_DEBUG 才落盘):字符数 + 头 60 字符 —— 「拿到的到底是委派 prompt 还是
236
- // fork 转录里宿主自己的首轮提示」只有看得见正文头才分得开(第一版倒在这上面)。
237
135
  hostLog('debug', `[delegated-prompt] ${taskId} <- transcript ${transcriptId} (${prompt.length} chars) head=${JSON.stringify(prompt.slice(0, 60))}`);
238
136
  return { prompt, outcome: 'hit' };
239
137
  }
@@ -1,25 +1,5 @@
1
- /** 引擎 bridge 从 `task_progress` tick / fleet 行帧建的行(module-level:footer 重挂不丢归属)。 */
2
1
  export declare const engineOwnedRowIds: Set<string>;
3
- /** fleet 树 enter 时为「面板无行的 fleet 行」stub 出来的纯查看载体行。 */
4
2
  export declare const fleetViewStubRowIds: Set<string>;
5
- /** 这一行的真身在引擎里(本地 abortController 管不到它)。 */
6
3
  export declare function isEngineViewRow(taskId: string): boolean;
7
- /**
8
- * 能力门同步读口(liveClient 构造期已 kick /v1/capabilities 进 engineCapsCache)。
9
- *
10
- * 🔴 design/285 批 3(D7b):零参 `engineWireTarget()` 换成 `engineWireTargetFor(sessionKey)`。
11
- * caps 缓存按 **baseUrl** 分桶,而 keyed 多会话宿主每槽一个 baseUrl —— 写死默认槽 = 用 A 引擎的
12
- * 能力位去判 B 引擎能不能停行。本模块是**零依赖叶**(单实例纪律见头注),不许 import 台账,
13
- * 所以槽键由调用方给;缺省 `DEFAULT_SESSION_KEY` ⇒ 与 0.44.0 逐字同。
14
- */
15
4
  export declare function engineTaskHandlesCapable(sessionKey?: string): boolean;
16
- /**
17
- * 停这一行**必须先拿到引擎回执**吗?
18
- *
19
- * true ⇒ 行的执行者是引擎,端写 `killed` 是一句它没证实过的断言 —— 必须 `POST …/stop` 拿到 200
20
- * 才翻;409 `stop.not_landed` / `stop.not_local` / `stop.parked` 一律保持原状(引擎里
21
- * 可能还在跑),下一拍由行帧/`stopped-by` 归因 settle([1754]③)。
22
- * false ⇒ 行跑在本进程(CC 逐字形态),`abortController.abort()` 就是执行本身,端写 `killed`
23
- * 按构造恒真 ⇒ 同步翻,与 CC 2.1.220 `UPd`(pretty220.js:507299)一字不差。
24
- */
25
5
  export declare function engineRowNeedsStopConfirm(taskId: string, sessionKey?: string): boolean;
@@ -1,63 +1,14 @@
1
- /**
2
- * ⇄ B6 批搬迁(2026-07-27,设计稿 §3 B6):cli `src/sema/engineRowStopGate.ts` 整搬。
3
- * 唯一差分 = `process.env.SEMA_LIVE_BASEURL` → `engineWireTarget()?.baseUrl`
4
- * (本包零 `process`;Node 宿主下 `hostEnv()` 返回的就是 `process.env` 同一对象 ⇒ 取值相同。
5
- * **超集**:非 Node 宿主可用 `installEngineWireTarget()` 显式装,此前那条腿恒 false)。
6
- *
7
- * 🔴 单实例纪律(本文件两个 module 级 Set 都是判据真源):
8
- * `engineOwnedRowIds` 写者 = 引擎 bridge 的 `task_progress` tick / fleet 行帧臂;
9
- * `fleetViewStubRowIds` 写者 = fleet 树 enter 的 stub 造行处;
10
- * 读者 = 批量停/单行停的同步分诊。两份实例 ⇒ 分诊恒判「纯本地行」⇒ 引擎侧行被壳直接写
11
- * `killed` 而引擎里还在跑 = [1754]③ 那类「壳说了一句它没证实过的话」。
12
- *
13
- * ── 以下为原文件的领域说明(逐字保留)────────────────────────────────────────────────────────
14
- *
15
- * engineRowStopGate — 「这一行是引擎侧的吗 / 停它要不要等引擎回执」的**同步**判别叶模块(#98)。
16
- *
17
- * 为什么单独一个叶模块:批量停(`ctrl+x ctrl+k` → `killAllRunningAgentTasks`)必须在**同步**
18
- * 那一拍就把行分成两半 —— 纯本地行照 CC 逐字立刻翻 `killed`(CC 的 markNotified→kill 顺序不容
19
- * 插入一个 await,否则 runner 自己的完成通知会抢在 markNotified 前面发出去),引擎侧行才走
20
- * 「等 200 再翻」。而原先这两个判据分别住在 `engineAgentView`(拉 React/ink/transcript 全图)和
21
- * `engineTaskHandleWire`(拉 SDK),`LocalAgentTask` 静态 import 任一都是循环依赖风险 —— 所以此前
22
- * 只能 `await import(...)`,分类天然异步。把判据本身下沉成零依赖叶(只依赖同样零依赖的
23
- * `engineCapsCache`),两边改成 re-export,判据单一真源不变,调用方拿到同步口。
24
- *
25
- * 🔴 语义与单行 `x`(BackgroundTasksDialog.killEngineAwareAgentTask)必须逐字一致:
26
- * 引擎视图行 ∧ `capabilities.taskHandles` 在场 → 发真停止动词、**只有 200 才翻行**;
27
- * 缺任一(老引擎 / 无 wire / 纯本地 AgentTool 行) → 回落旧行为(本地 abort 即真停,立即翻)。
28
- */
29
1
  import { engineCapTrue } from '../engineCapsCache.js';
30
2
  import { engineWireTargetFor } from '../engineWireTarget.js';
31
3
  import { DEFAULT_SESSION_KEY } from '../sessionSlot.js';
32
- /** 引擎 bridge 从 `task_progress` tick / fleet 行帧建的行(module-level:footer 重挂不丢归属)。 */
33
4
  export const engineOwnedRowIds = new Set();
34
- /** fleet 树 enter 时为「面板无行的 fleet 行」stub 出来的纯查看载体行。 */
35
5
  export const fleetViewStubRowIds = new Set();
36
- /** 这一行的真身在引擎里(本地 abortController 管不到它)。 */
37
6
  export function isEngineViewRow(taskId) {
38
7
  return engineOwnedRowIds.has(taskId) || fleetViewStubRowIds.has(taskId);
39
8
  }
40
- /**
41
- * 能力门同步读口(liveClient 构造期已 kick /v1/capabilities 进 engineCapsCache)。
42
- *
43
- * 🔴 design/285 批 3(D7b):零参 `engineWireTarget()` 换成 `engineWireTargetFor(sessionKey)`。
44
- * caps 缓存按 **baseUrl** 分桶,而 keyed 多会话宿主每槽一个 baseUrl —— 写死默认槽 = 用 A 引擎的
45
- * 能力位去判 B 引擎能不能停行。本模块是**零依赖叶**(单实例纪律见头注),不许 import 台账,
46
- * 所以槽键由调用方给;缺省 `DEFAULT_SESSION_KEY` ⇒ 与 0.44.0 逐字同。
47
- */
48
9
  export function engineTaskHandlesCapable(sessionKey = DEFAULT_SESSION_KEY) {
49
10
  return engineCapTrue(engineWireTargetFor(sessionKey)?.baseUrl, 'taskHandles');
50
11
  }
51
- /**
52
- * 停这一行**必须先拿到引擎回执**吗?
53
- *
54
- * true ⇒ 行的执行者是引擎,端写 `killed` 是一句它没证实过的断言 —— 必须 `POST …/stop` 拿到 200
55
- * 才翻;409 `stop.not_landed` / `stop.not_local` / `stop.parked` 一律保持原状(引擎里
56
- * 可能还在跑),下一拍由行帧/`stopped-by` 归因 settle([1754]③)。
57
- * false ⇒ 行跑在本进程(CC 逐字形态),`abortController.abort()` 就是执行本身,端写 `killed`
58
- * 按构造恒真 ⇒ 同步翻,与 CC 2.1.220 `UPd`(pretty220.js:507299)一字不差。
59
- */
60
12
  export function engineRowNeedsStopConfirm(taskId, sessionKey) {
61
- // `sessionKey` additive(design/285 批 3):keyed 宿主把这一行所属的槽传下来;缺省 = 默认槽。
62
13
  return isEngineViewRow(taskId) && engineTaskHandlesCapable(sessionKey ?? DEFAULT_SESSION_KEY);
63
14
  }
@@ -1,15 +1,8 @@
1
- /** 测试钩:清 caps 缓存。 */
2
1
  export declare function __resetSubagentOutputCapCacheForTests(): void;
3
2
  export interface EngineSubagentReport {
4
- /** 子代最终 assistant 正文(server 对 running 态给状态文本——由 status 区分)。 */
5
3
  content: string;
6
- /** output.status 原样(completed/failed/killed/running…;undefined = wire 未带)。 */
7
4
  status?: string;
8
5
  }
9
- /**
10
- * 拉取一个后台子代的终报正文。null = 读不到(无 wire / caps 缺 / 404 域外或副本重启 / 网错)——
11
- * 调用方回落 bg 事实渲染。绝不 throw。
12
- */
13
6
  export declare function fetchEngineSubagentReport(taskId: string, opts?: {
14
7
  signal?: AbortSignal;
15
8
  }): Promise<EngineSubagentReport | null>;