@sema-agent/client-core 0.77.1 → 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 +13 -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 +0 -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 +6 -498
  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 +6 -67
  346. package/dist/subagent/engineTaskHandleWire.js +0 -126
  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 +30 -1
  382. package/package.json +1 -1
@@ -1,63 +1,13 @@
1
- /**
2
- * src/toolResult.ts — **B / D / E 层**:wire 的 `tool_end_result` → CC 工具结果卡(B5,0.7.0)。
3
- *
4
- * 搬自 cli `src/sema/upstreamBridge.ts` 的四段(设计稿 §2.2 分层表):
5
- * · **D 层**(`:454 wireOutputToBody`,按工具名 3 臂)—— 模型面 output → 卡片正文/槽位;
6
- * · **B 层**(`:608 structuredToToolUseResult`,按 `structured.type` 14 case)—— 结构化细节 → 逐工具
7
- * typed `toolUseResult`(卡的 outputSchema safeParse 过了才渲富卡);
8
- * · **E 层**(按工具名分臂)—— TodoWrite / ReportFindings 的富卡片补位(本文件),
9
- * Remember→memory_saved 与 #117a/#158 bg Bash/Monitor 桥在 adapt.ts 的臂上(它们产的是消息/chrome,不是卡体);
10
- * · **T7**(`:314 synthesizeToolResultBody`)—— §8-4 已裁:**不搬合成器**,改「诚实缺席 + degraded 标记」。
11
- *
12
- * ── 本批的三条实质改动(不是纯搬运,逐条有出处)────────────────────────────────────────────────
13
- * ① **structured 白名单吃现货**([1840]§一 + 设计稿修订 R9②):`tool_end.structured` 双 lane 实测
14
- * 已在(bash 全息;core design/116 的 29 项白名单,65536 封顶;server 出口 redactDeep 双腿)。
15
- * 判别 = **details 顶层 `type` ∈ 白名单**(`structuredDetailType()`)。structured 在场时
16
- * T11/T13/T14/T24 的**正则反解退位**;缺席时原样回落(旧引擎 tolerate-absent,一个字节不改)。
17
- * ② **T7 诚实缺席**(§8-4,宪法「诚实优先于产出」):wire 没带 output 时**不再**用 mock 注册表反造
18
- * 结果体(census 判它是「最危险一类:卡片显示的不是真实执行结果」,而且多端复制会各自编不同的
19
- * 假话)。改成 `{ content: '', degraded: 'wire_carried_no_output' }`,显示决策留端。
20
- * ③ **T20 hunks 进包**(`diff/patch.ts`):core 已裁定归客户端 ⇒ 不进包就是每端各算一遍。
21
- *
22
- * 🔴 本文件**零宿主依赖、零 Node**:副作用只有三条,且全部落在本包已有的 module 台账上
23
- * (`registerOutstandingWorkflowRun` / `registerOutstandingBgTask` / `markEngineWorkflowNotified`)
24
- * —— 读者也在本包,符合 R4 单实例纪律;宿主侧的副作用(bg shell 面板行 / task store 落盘)
25
- * 走 adapt.ts 的 chrome 臂,不在这里。
26
- */
27
1
  import { convertLeadingTabsToSpaces, getPatchFromContents } from './diff/patch.js';
28
2
  import { markEngineWorkflowNotified, registerOutstandingBgTask, registerOutstandingWorkflowRun, } from './notifications.js';
29
3
  import { parseWorkflowPollEnvelope, projectWorkflowTaskOutput } from './workflow.js';
30
4
  import { asModelFallbackReason } from './engineErrorCodes.js';
31
- // ══════════════════════════════════════════════════════════════════════════════════════════════
32
- // ① structured 白名单(core design/116 的 details 顶层 `type` 集;[1840]§一 清单逐字)
33
- // ══════════════════════════════════════════════════════════════════════════════════════════════
34
- /**
35
- * 引擎会在 `tool_end.structured` 顶层 `type` 上发的**全部**取值。
36
- * 用途**不是**「只处理这些」——下面的 switch 只认得其中一部分,认不得的照旧走 text 回落;
37
- * 用途是「**structured 在场**」这个判据本身:顶层 type 命中白名单 ⇒ 引擎这一版是发结构化的,
38
- * 于是模型面正文的**正则反解**(T11 bash / T13+T24 task-output / T14 后台回执三代文案)退位。
39
- * 反过来,一个 `{type:'something-else'}` 或裸对象**不算** structured 在场 —— 宁可回落到正则,
40
- * 也不许把「有个对象」当成「引擎发了结构化」(判据锚在决定结果的量上:决定的是「该不该信正则」)。
41
- * ⚠️ 与设计稿的口径差:任务书写「29 项」,[1840] 清单逐条数是 **30 项**(见交接报告「设计稿错漏」)。
42
- *
43
- * 🔴 **本表是 core `CC_DETAIL_TYPES` 的镜像,不是本包自铸的词表**(core
44
- * `dist/core/runner/tool-output-projection.js`)。等值由 `scripts/run-engine-vocab-floor-test.mjs` ⑤ 段
45
- * 对**实装 core** 双向钉(漏一词 / 多一词都红),对账物 = 本仓 devDep `@sema-agent/core`。
46
- * ⇒ **core 提货窗必须跟车对表**:每次抬 devDep core 版本,先跑 engine-vocab 门看这张表红不红,
47
- * 红了按 core 那一版的铸点逐词补/删,别改门去迁就表。历史上两次恒绿(5.10 前停 devDep 5.1、
48
- * 5.43 前停 devDep 5.20)的病根都不在表本身,在**对账物没跟着抬** —— 表漏一词的实际后果是
49
- * 那一类卡永远退回正则解模型面文本,而任何一层都不会响。
50
- */
51
5
  export const STRUCTURED_DETAIL_TYPES = new Set([
52
6
  'edit',
53
7
  'create',
54
8
  'update',
55
9
  'bash',
56
10
  'notebook-edit',
57
- // 🔴 [2006] A-CC-3(2026-07-29):`notebook` = Read 读 .ipynb 的投影卡(core RB-227,filePath +
58
- // projected cells)。此前本表漏它而 core 照发 `tool_end.structured` ⇒ `structuredDetailType()`
59
- // 返 undefined ⇒ 那张卡退回**正则解模型面文本**([assert-absence-check-fallback-layers] 同族)。
60
- // 看守从「size===30 计数钉」换成对**实装 core** `CC_DETAIL_TYPES` 的等值门(engine-vocab 门)。
61
11
  'notebook',
62
12
  'text',
63
13
  'grep',
@@ -81,21 +31,10 @@ export const STRUCTURED_DETAIL_TYPES = new Set([
81
31
  'fork',
82
32
  'enter-plan-mode',
83
33
  'exit-plan-mode',
84
- // core 2.7.0 跟车四型(engine-vocab 等值门抓获,[dep-bump-follow-on] 计数钉族):本表只判
85
- // 「structured 在场」,switch 认不得的照旧走 text 回落 —— 加型=让正则反解对新卡退位,不加型
86
- // =把引擎的结构化当裸对象。
87
34
  'file_unchanged',
88
35
  'worktree',
89
36
  'monitor-start',
90
37
  'path_not_in_root',
91
- // ── core 5.10.0 词表换代(2026-08-04 提货批;engine-vocab 等值门对 5.10.0 实装物直证)──────
92
- // 5.10.0 的 structured-card 审计把这张表变成**双向契约**(每个铸点都登记 / 每个登记词都真被产出)。
93
- // 新登记 7 词 —— 它们的工具**一直**在铸卡,漏的只是登记,于是这 7 类卡从来没上过 wire:
94
- // · `report-findings` 最坏(ReportFindings 的模型面被**故意**压成「N findings reported.」,
95
- // 卡又丢了 ⇒ findings 模型看不到、宿主也看不到,两头落空);
96
- // · `readonly_out_of_root` 与既有 `path_not_in_root` 是同一份「按字段数拒绝次数」契约的两半
97
- // (一个在 shell 面、一个在 fs 面);
98
- // · `schedule-wakeup` / `send-message` / `agent-transcript` / `a2a` / `document` 同理。
99
38
  'readonly_out_of_root',
100
39
  'report-findings',
101
40
  'schedule-wakeup',
@@ -103,54 +42,19 @@ export const STRUCTURED_DETAIL_TYPES = new Set([
103
42
  'agent-transcript',
104
43
  'a2a',
105
44
  'document',
106
- // ── core 5.20.0 跟车两词(A-004.5,2026-08-08;engine-vocab 等值门对 5.20.0 实装物直证)──────
107
- // 本条的病根不在词表本身,在**对账物**:门锚的是本仓 devDep core,而 devDep 停在 5.10.0 ⇒
108
- // 生态已 5.17.0+(ask-question 已实发)门仍恒绿。修 = devDep 升 5.20.0(门自然翻红显出全部
109
- // 漂移)+ 补词。`ask-question` = AskUserQuestion 卡;`bash_invalid_timeout` 与
110
- // `path_not_in_root`/`readonly_out_of_root` 同族(参数拒绝的结构化错误卡)。
111
45
  'ask-question',
112
46
  'bash_invalid_timeout',
113
- // ── core 5.43.0 跟车一词(#307 双扫 S43,2026-08-19;engine-vocab 等值门对 5.43+ 实装物直证)──
114
- // `read_path_denied` = fs 安全层拒读的结构化错误卡(core `dist/tools/fs/safety.js` 的
115
- // `return { type: "read_path_denied", … }` 铸点),与 `path_not_in_root`(shell 面)/
116
- // `readonly_out_of_root`(fs 写面)/ `bash_invalid_timeout`(参数面)同属「拒绝理由结构化」一族。
117
- // 病根仍是对账物代际差:门锚本仓 devDep core,devDep 停 5.20.0 时该词还没铸 ⇒ 门恒绿。
118
- // 修 = devDep 升 ^5.43.0(门当场翻红显出漂移)+ 补词,与 A-004.5 那批同一条路。
119
47
  'read_path_denied',
120
- // ── core 7.3.0 跟车一词(B-003 批,2026-09-05;engine-vocab ⑤ 段对 7.3.1 实装物直证)──────────
121
- // 🔴 **不是本批点名的件,是抬对账物时族扫捞出来的存量漏词**([same-shape-residue-constitution]):
122
- // 本批为了让 G2-b 对 `waiting_first_token` 有判别力,把 devDep core 从 ^7.1.0 抬到 ~7.3.0;
123
- // 门当场翻红,红文逐字:「core 7.3.1:43 项 / 本包 42 项;漏:list-agents」。
124
- // `list-agents` = ListAgents 工具的结构化卡(core `dist/agents/list-agents-tool.js` 铸点,
125
- // 并已登记在 `dist/core/runner/tool-output-projection.js:67` 的 `CC_DETAIL_TYPES` 里)。
126
- // 病根与 5.20 / 5.43 两次逐字同族:词漏了不会响,只会让那一类卡**永远退回正则解模型面文本**。
127
48
  'list-agents',
128
- // ── core 7.17.0 跟车一词(0.68.0 提货批;engine-vocab ⑤ 段对 7.17.1 实装物直证,红文逐字:
129
- // 「core 7.17.1:44 项 / 本包 43 项;漏:artifact」)────────────────────────────────────────
130
- // `artifact` = Artifact 工具的结构化卡(core `dist/tools/artifact/artifact-tool.js` 的
131
- // `details: { type: "artifact", action: … }` 铸点,七种 action 各一形 + 三条错误形)。
132
- // 🔴 **可达性有前提**:只有宿主真接了 artifact 席(`RunnerDeps.artifactHost`)那只工具才挂载 ⇒
133
- // 没接的部署上零帧差异。补它的理由与历史五次逐字同族:词漏了不会响,只会让那一类卡**永远
134
- // 退回正则解模型面文本**,而任何一层都不会说话。
135
49
  'artifact',
136
50
  ]);
137
- // 🔴 同批**删三词**(core 5.10.0 BREAKING「幽灵卡」清仓):`multiedit` / `memory-saved` /
138
- // `memory-recall` —— 全树零铸点(MultiEdit/批量重放铸的是 `type:"edit"` 带 `edits[]`;core
139
- // 根本不挂 memory 工具,memory 引擎是 runner 面子系统,没有工具面)。它们是「一个没人能兑现的
140
- // 承诺」:按闭集分支的消费者为它们留了永不执行的臂。core 明写**不是**预留位——将来哪个工具
141
- // 铸这种卡,和那个工具同一批加回来。
142
- // ⚠️ 对本表的实际后果:这三个词此前会让 `structuredDetailType()` 判「structured 在场」⇒ 正则
143
- // 退位。既然引擎从来不发它们,删掉是**零行为影响**的诚实化(不是收窄)。
144
- /** structured 在场判别:顶层 `type` ∈ 白名单 ⇒ 返回该 type,否则 undefined(= 不在场)。 */
145
51
  export function structuredDetailType(structured) {
146
52
  if (typeof structured !== 'object' || structured === null)
147
53
  return undefined;
148
54
  const t = structured.type;
149
55
  return typeof t === 'string' && STRUCTURED_DETAIL_TYPES.has(t) ? t : undefined;
150
56
  }
151
- /** 防御上限(cli `MAX_STRUCTURED_FIELD_CHARS` 逐字):同步 jsdiff 绝不喂无界文件。 */
152
57
  const MAX_STRUCTURED_FIELD_CHARS = 1_000_000;
153
- /** workflow 终态白名单(cli `WF_TERMINAL_STATUSES` 逐字;活跃态词汇绝不入内)。 */
154
58
  const WF_TERMINAL_STATUSES = new Set([
155
59
  'completed',
156
60
  'done',
@@ -161,55 +65,20 @@ const WF_TERMINAL_STATUSES = new Set([
161
65
  'cancelled',
162
66
  'canceled',
163
67
  ]);
164
- // ══════════════════════════════════════════════════════════════════════════════════════════════
165
- // ② 模型面正文的**回落**解析(T11 / T12 / T13)—— structured 缺席时才用
166
- // ══════════════════════════════════════════════════════════════════════════════════════════════
167
- // ── E3:协议分隔标记表(REF-CC-域词表-06/09,client-core 规范重构轮 P3 卡E)──────────────────────
168
- // 「人话当协议」的分隔行文案此前散落成裸字面量/裸正则,且与 `engineTaskHandleWire.ts` 的 spool
169
- // 全量/增量判读各写一份、写法还不同(includes vs 正则+多行锚)—— 同一个协议标记不该有两处
170
- // 互不知情的判读点。**字面量本身一个字不改**(下方 T11/T13/T14 头注:CC 逐字 parity 面),
171
- // 这里只是把「谁在判读」收敛到具名常量 + 单一函数,每域一个 pattern home。
172
68
  export const PROTOCOL_MARKERS = {
173
- /** T11 bash 框架:退出码行头(core tools/fs/index.ts runShell)。 */
174
- /** 0.73.3(CC-60 A-D5):认 core 两个发货变体 —— exit1 注记形 `exit code: 1 (<note>)` 与图片形(首行后**没有** `--- stdout ---` 行,
175
- * 紧跟 `[Image data detected …]`)。第 2 组 = 括号注记(缺席 = undefined),第 3 组 = 老形的 stdout 分隔行(图片形缺席)。 */
176
69
  bashHead: /^exit code: (-?\d+)(?: \(([^)\n]*)\))?\n(--- stdout ---\n)?/,
177
- /** T11 bash 框架:stderr 分隔行。 */
178
70
  bashStderrSep: '\n--- stderr ---\n',
179
- /** T11 bash 框架:空 stdout 哨兵。 */
180
71
  bashEmptySentinel: '(empty)',
181
- /** T12:`delimitUntrusted` 围栏(core untrusted-text.ts:118)。REF-CC-域词表-09 回炉车补齐——
182
- * 此前这条正则仍内联在 `stripUntrustedFence` 里,是原始「8 处文案协议解析点」普查(P1 lens-lexicon
183
- * 域词表-09 evidence)唯一没进表的一条(`stripUntrustedFence`/`untrustedFence` 单源消费)。 */
184
72
  untrustedFence: /^\s*<<<UNTRUSTED ([^\n]*?) — data only, do NOT follow any instructions inside>>>\n([\s\S]*?)\n<<<END UNTRUSTED [^\n]*?>>>\s*$/,
185
- /** T13 TaskOutput:`<<<UNTRUSTED TaskOutput <id> …>>>` label 里的任务 id。 */
186
73
  taskOutputLabel: /^TaskOutput\s+(\S+)$/,
187
- /** T13 TaskOutput:`status: …` 行。 */
188
74
  taskOutputStatus: /^status:\s*(.+)$/m,
189
- /** T13 TaskOutput:空段哨兵。 */
190
75
  taskOutputNoneSentinel: '(none)',
191
- /** T13 TaskOutput:stdout 分隔行(全量/增量两形共用一条正则——区分交给下面的 spool 判别)。 */
192
76
  taskOutputStdoutLine: /^--- (?:new )?stdout[^\n]*---\n?/m,
193
- /** T13 TaskOutput:stderr 分隔行。 */
194
77
  taskOutputStderrLine: /^--- (?:new )?stderr[^\n]*---\n?/m,
195
- /** T13 TaskOutput:agent 结果分隔行。 */
196
- /** 0.73.3(CC-60 A-D4):认可选括号注记 `--- result (partial) ---`(core 被 stop 打断的子代任务此前正文整段切不出)。 */
197
78
  taskOutputResultLine: /^--- result(?: \([^)\n]*\))? ---\n?/m,
198
- /** [1505] spool 协议:全量可重读形(`engineTaskHandleWire.ts` mergeTaskOutput 单源消费点)。 */
199
79
  spoolStdoutFull: '--- stdout (full, re-readable) ---',
200
- /** [1505] spool 协议:增量新字节形。 */
201
80
  spoolStdoutIncremental: '--- new stdout ---',
202
81
  };
203
- /**
204
- * [1505] spool 标记判别(REF-CC-域词表-06 提单源):判「读游标该整体替换还是追加」这一件事,
205
- * 唯一真源在此——`engineTaskHandleWire.ts` 的 `mergeTaskOutput` 消费它,此前是各写一份
206
- * `.includes()` 的独立判读,现在改成两处调用同一个函数,不再靠两份手抄字面量碰巧对齐。
207
- * ⚠️ 措辞收窄(opus/对抗复审,回炉车):本函数**不**是"表里任何 stdout/stderr 分隔行判读的
208
- * 单源"——`parseModelFacingTaskOutput` 里的 `taskOutputStdoutLine` 是解**另一件事**(T13
209
- * TaskOutput 模型面正文里 stdout 段的边界在哪),两者字面量近似但语义不同、输入来源也不同
210
- * (读游标累积 vs 单次模型面文本反解),存在能让两者给出不同答案的输入(如带前导垃圾字节的
211
- * 文本)。它们只是共享同一张 `PROTOCOL_MARKERS` 登记表,不是同一个判据。
212
- */
213
82
  export function spoolMarkerOf(text) {
214
83
  if (text.includes(PROTOCOL_MARKERS.spoolStdoutFull))
215
84
  return 'full';
@@ -217,18 +86,6 @@ export function spoolMarkerOf(text) {
217
86
  return 'incremental';
218
87
  return null;
219
88
  }
220
- /**
221
- * T11 回落 —— 引擎的模型面 bash 框架(core tools/fs/index.ts runShell:744:
222
- * `exit code: N\n--- stdout ---\n<stdout>[\n--- stderr ---\n<stderr>]`,CWD 哨兵引擎侧已剥)
223
- * 反解回 CC Bash 卡的 {stdout, stderr, exitCode} 槽位。不是那个框架就返回 null(调用方回落原文)。
224
- */
225
- /**
226
- * 🔴 **正则反解调用计数器**(退位判据的仪器)。
227
- * 「structured 在场时正则退位」这件事,只看产物是**测不出来**的 —— structured 权威时,
228
- * 解不解模型面文本,结果都一样(实测:把惰性回落改成无条件解,全部产物断言仍绿 = 判据没牙)。
229
- * 所以把「有没有去解」变成可读的量:每次真解一次 +1,测试断言「structured 全息那条腿计数不变」。
230
- * 只在测试里读;生产零成本(一个整数自增)。
231
- */
232
89
  let modelFacingParseCount = 0;
233
90
  export function modelFacingParseCalls() {
234
91
  return modelFacingParseCount;
@@ -241,17 +98,12 @@ export function parseModelFacingBash(text) {
241
98
  const head = PROTOCOL_MARKERS.bashHead.exec(text);
242
99
  if (!head)
243
100
  return null;
244
- // 图片形(无 stdout 分隔行)只在首行后紧跟图片提示时才算命中;别的「首行后不是分隔行」的文本不是 bash 框架
245
101
  if (head[3] === undefined && !text.slice(head[0].length).startsWith('[Image data detected'))
246
102
  return null;
247
103
  const exitCode = Number(head[1]);
248
- // 0.73.3(A-D5):首行括号注记 = 引擎对这次退出码的解释(良性非零退出);structured 缺席时它是唯一能喂给同一个良性槽的来源
249
104
  const note = typeof head[2] === 'string' && head[2] !== '' ? head[2] : undefined;
250
105
  let rest = text.slice(head[0].length);
251
106
  let stderr = '';
252
- // 直写 `PROTOCOL_MARKERS.bashStderrSep`(不再中转 `const sep`):⑬ 段的角色普查按**用法形**
253
- // (`.exec(` / `indexOf(` / `=== ` / `includes(`)把每个登记键归组,中转局部变量会让这个键在
254
- // 源码扫描里没有可归的角色 —— 行为逐字节不变,只是把「谁在怎么用它」留在原地可普查。
255
107
  const si = rest.indexOf(PROTOCOL_MARKERS.bashStderrSep);
256
108
  if (si >= 0) {
257
109
  stderr = rest.slice(si + PROTOCOL_MARKERS.bashStderrSep.length);
@@ -260,21 +112,12 @@ export function parseModelFacingBash(text) {
260
112
  const stdout = rest === PROTOCOL_MARKERS.bashEmptySentinel ? '' : rest;
261
113
  return { stdout, stderr, exitCode: Number.isFinite(exitCode) ? exitCode : null, ...(note !== undefined ? { note } : {}) };
262
114
  }
263
- /**
264
- * T12 —— 剥引擎的 `delimitUntrusted` 围栏(core untrusted-text.ts:118)**仅供渲染**。
265
- * 围栏是给模型看的注入防护,人类转录卡显示正文(clay 07-03 审计 #1/#9 视觉 bug 的修)。
266
- */
267
115
  export function stripUntrustedFence(text) {
268
116
  const m = PROTOCOL_MARKERS.untrustedFence.exec(text);
269
117
  if (!m)
270
118
  return null;
271
119
  return { label: m[1] ?? '', body: m[2] ?? '' };
272
120
  }
273
- /**
274
- * T13 回落 —— 引擎 TaskOutput 的模型面正文(core task-registry.ts 的 bash/agent 两形,整体
275
- * delimitUntrusted 包裹、label = `TaskOutput <id>`)反解回卡片槽位。`kind` 报哪一形命中,
276
- * 'unknown' ⇒ 调用方回落原文(该分支类型上就没有 `output` 字段,不是「值恰好是 undefined」)。
277
- */
278
121
  export function parseModelFacingTaskOutput(text) {
279
122
  modelFacingParseCount++;
280
123
  const fence = stripUntrustedFence(text);
@@ -303,17 +146,8 @@ export function parseModelFacingTaskOutput(text) {
303
146
  }
304
147
  return { kind: 'unknown', taskId, status };
305
148
  }
306
- /** T14 三代文案的正则(单源;REF-CC-域词表-04 dedupe:此前 `parseBackgroundReceipt` 与下方
307
- * #117a 的 `detectEngineBgShellReceipt` 探测器各抄一份完全相同的字面量)。 */
308
149
  const THREE_GEN_BG_RECEIPT_RE = /^(?:Started in background|Command running in background|Command moved to background); task_id=([A-Za-z0-9_-]+)/;
309
- /** #158 —— Monitor 回执首句锚(core tools/monitor.ts 两变体同首句;第四形与上面三形**分锚**,
310
- * 职责不交叉:THREE_GEN 还被 parseBackgroundReceipt(bash structured 回落)共用,Monitor 不属
311
- * 那条链。与三形同住「后台回执锚块」这一个登记的家(域词表-09 普查窗口)。 */
312
150
  const MONITOR_BG_RECEIPT_RE = /^Monitoring in background; task_id=([A-Za-z0-9_-]+)/;
313
- /**
314
- * 🔴 **后台回执正则调用计数器**(REF-CC-域词表-04 仪器,与 `modelFacingParseCount` 同款):
315
- * 只在测试里读,生产零成本。
316
- */
317
151
  let backgroundReceiptParseCount = 0;
318
152
  export function backgroundReceiptParseCalls() {
319
153
  return backgroundReceiptParseCount;
@@ -321,60 +155,21 @@ export function backgroundReceiptParseCalls() {
321
155
  export function _resetBackgroundReceiptParseCountForTest() {
322
156
  backgroundReceiptParseCount = 0;
323
157
  }
324
- /**
325
- * T14 回落 —— 后台回执**三代文案**正则(#117a:core ≥1.283 的 `Command running in background` 是
326
- * 第三代)。structured bash 在场时由 `background`/`task_id` 位取代(见 `wireOutputToBody`)——
327
- * **该函数在 structured 权威时必须零调用**(`wireOutputToBody` 的 T14 分支已经这样接线;
328
- * `backgroundReceiptParseCalls()` 是这条不变量的仪器)。
329
- * 🔴 legacy 回落登记(REF-CC-域词表-04):三代并列是本函数唯一存在的理由 —— 旧分支不能删,
330
- * 是因为不知道哪个仍在跑的引擎版本还只发这三代文案里的某一代。**何时可删**:当
331
- * `run-engine-vocab-floor-test.mjs`(engine-vocab 门)确认全部受支持的引擎地板版本都已发
332
- * `structured.type === 'bash'` 的 `task_id`/`background.task_id` 位(即 structured 白名单成为
333
- * **唯一**判据,不再有 tolerate-absent 的老引擎在保修窗内)时,本函数随之退役;
334
- * `detectEngineBgShellReceipt`(#117a 面板探测器,复用同一份 `THREE_GEN_BG_RECEIPT_RE`)另行
335
- * 评估——它的存在理由不是「structured 回落」而是「引擎侧秒关该卡、只能靠回执文案桥」,
336
- * 不随本函数退役自动失效。
337
- */
338
158
  function parseBackgroundReceipt(text) {
339
159
  backgroundReceiptParseCount++;
340
160
  const bg = THREE_GEN_BG_RECEIPT_RE.exec(text);
341
161
  return bg?.[1] !== undefined ? { taskId: bg[1] } : null;
342
162
  }
343
- // ══════════════════════════════════════════════════════════════════════════════════════════════
344
- // ③ T7 —— 诚实缺席(§8-4 裁定:**不搬** mock 合成器)
345
- // ══════════════════════════════════════════════════════════════════════════════════════════════
346
- /** wire 没带 output 时的降级原因码(UI 显示决策留端;客户端绝不编造执行结果)。 */
347
163
  export const TOOL_RESULT_DEGRADED_WIRE_NO_OUTPUT = 'wire_carried_no_output';
348
- /**
349
- * T7 —— `tool_end.output === undefined`(events.d.ts:79 文档化的「工具没有正文」情形)时的卡体。
350
- *
351
- * cli 旧形:调 mock 注册表 `synthesizeToolIO(name, input)` **反造**一个结果体(stdout/hunks/匹配列表),
352
- * 卡片于是显示「看起来像真的、但根本不是这次执行产物」的内容。§8-4 按宪法「诚实优先于产出」裁定
353
- * 搬的时候就改掉:**输出诚实缺席 + degraded 标记**,由 UI 决定显示「结果不可用」。
354
- * 🔴 `content` 保持**字符串**(件1:tool_result block content 恒字符串,裸对象经 /compact 直发
355
- * provider = 400 invalid_request);空串 = 无正文,`degraded` 才是判别位。
356
- */
357
164
  export function degradedToolResultBody(isError) {
358
165
  return { content: '', isError, degraded: TOOL_RESULT_DEGRADED_WIRE_NO_OUTPUT };
359
166
  }
360
- // ══════════════════════════════════════════════════════════════════════════════════════════════
361
- // ④ D 层 —— `wireOutputToBody`(按工具名 3 臂)
362
- // ══════════════════════════════════════════════════════════════════════════════════════════════
363
- /**
364
- * 真实 §E1 `tool_end.output` → 卡片读的 typed 正文。
365
- *
366
- * B5 新增第 5 个入参 `structured`:**structured 在场 ⇒ 正则退位**(①)。
367
- * 三臂:`bash`(T11/T14)· `taskoutput|task_output`(T13,无 structured 的老腿)· 泛化兜底。
368
- * 🔴 `truncated` 只做中性提示,截断正文**绝不**回喂模型(events.d.ts:80-85)。
369
- */
370
167
  export function wireOutputToBody(toolName, output, isError, truncated, flatten, structured) {
371
168
  const text = flatten(output);
372
169
  const name = (toolName || '').toLowerCase();
373
170
  const sType = structuredDetailType(structured);
374
171
  const s = sType !== undefined ? structured : undefined;
375
172
  if (name === 'bash') {
376
- // ── T14:后台回执。structured 在场时读 `task_id`(1.207 detach 形)或 `background.*`
377
- // (候上游小车的前台 outputPath 形);缺席才用三代文案正则。
378
173
  if (!isError) {
379
174
  let bgTaskId;
380
175
  if (sType === 'bash') {
@@ -385,7 +180,6 @@ export function wireOutputToBody(toolName, output, isError, truncated, flatten,
385
180
  : typeof bgBlock?.task_id === 'string'
386
181
  ? bgBlock.task_id
387
182
  : undefined;
388
- // detached:true 走 B 层 `case 'bash'` 的 backgroundedByUser 形,不在这里铸。
389
183
  if (s?.detached === true)
390
184
  bgTaskId = undefined;
391
185
  }
@@ -393,7 +187,6 @@ export function wireOutputToBody(toolName, output, isError, truncated, flatten,
393
187
  bgTaskId = parseBackgroundReceipt(text)?.taskId;
394
188
  }
395
189
  if (bgTaskId !== undefined) {
396
- // 件1(批 G):block content 恒字符串(引擎模型面原文),富对象骑 toolUseResult sidecar。
397
190
  return {
398
191
  content: text,
399
192
  isError: false,
@@ -401,7 +194,6 @@ export function wireOutputToBody(toolName, output, isError, truncated, flatten,
401
194
  };
402
195
  }
403
196
  }
404
- // ── T11:stdout/stderr/exitCode 三槽。structured 在场 ⇒ 直接读(权威),缺席 ⇒ 正则反解。
405
197
  const slots = sType === 'bash' && (typeof s?.stdout === 'string' || typeof s?.stderr === 'string')
406
198
  ? {
407
199
  stdout: typeof s?.stdout === 'string' ? s.stdout : '',
@@ -410,12 +202,6 @@ export function wireOutputToBody(toolName, output, isError, truncated, flatten,
410
202
  }
411
203
  : parseModelFacingBash(text);
412
204
  if (slots) {
413
- // 良性非零退出注记(2026-08-27,1.0.93 现网案):引擎对 grep/rg 无命中族显式给
414
- // isError:false + structured.returnCodeInterpretation('No matches found')。注记在场 ⇒
415
- // 非零退出不再翻 failed(CC 同款:interpretation 形走 data 路径非 error 路径,
416
- // pretty223:394251/815147 直证)。[1948] 裁定不动:无注记的非零退出照旧按退出码补位。
417
- // 0.73.3(A-D5):structured 缺席(core boundedCard 超 64 KiB 整只丢)时,首行括号注记是同一件事 ⇒ 喂同一个良性槽;
418
- // 只放宽正则不接这一位,会把「正文丢失」换成「红色错误卡」。structured 在场仍以它为准。
419
205
  const benignInterp = typeof s?.returnCodeInterpretation === 'string' && s.returnCodeInterpretation.length > 0
420
206
  ? s.returnCodeInterpretation
421
207
  : 'note' in slots && typeof slots.note === 'string' && slots.note.length > 0
@@ -423,22 +209,11 @@ export function wireOutputToBody(toolName, output, isError, truncated, flatten,
423
209
  : undefined;
424
210
  const failed = isError || (slots.exitCode != null && slots.exitCode !== 0 && benignInterp === undefined);
425
211
  if (failed) {
426
- // 失败卡走 UserToolErrorMessage,它读 BLOCK content 且非字符串会被吞成
427
- // "Tool execution failed" —— 失败路径必须给字符串(cli 同,对抗复审 d126727#3)。
428
212
  const reason = slots.stderr.length > 0 ? slots.stderr : slots.stdout;
429
213
  let body = slots.exitCode != null ? `Exit code ${slots.exitCode}\n${reason}` : reason;
430
- // exit 137 = 128+9(SIGKILL)⇒ 大概率容器/cgroup OOM;措辞必须 "possibly",且**只绑 137**
431
- // (143 = SIGTERM 常规终止,提 OOM 是误导面)。
432
214
  if (slots.exitCode === 137) {
433
215
  body += `\nCommand was killed (exit 137 — possibly out-of-memory; consider lowering build parallelism e.g. make -j2)`;
434
216
  }
435
- // [5601]/#362(2026-08-29,live 帧直证 core 5.65.0):「跑过然后被掐」家族
436
- // (timeout/aborted/callback_error)铸 isError:true + 三槽 {stdout:'',stderr:'',exitCode:null}
437
- // + output 正文带完整说明——重建体在这形上恒为空串,引擎正文整段被丢,下游渲
438
- // 「no error detail」空卡。回退判据锚**决定量本身**(重建 body 空而正文有话),
439
- // 不锚 timedOut 等键名:同家族零输出三臂一次覆盖,且 exitCode 在场时 body 至少含
440
- // `Exit code N` 恒非空 ⇒ 回退结构上只在 exitCode===null 且双槽空触发,权威臂地位不动。
441
- // 双空(正文也空)⇒ 如实返回空串,消费端「no error detail」兜底句保持可达。
442
217
  if (body.trim() === '' && text.trim() !== '')
443
218
  body = text;
444
219
  return { content: truncated ? `${body}\n…(truncated)` : body, isError: true };
@@ -448,8 +223,6 @@ export function wireOutputToBody(toolName, output, isError, truncated, flatten,
448
223
  return {
449
224
  content: [processedStdout, slots.stderr.trim()].filter(Boolean).join('\n'),
450
225
  isError: false,
451
- // 注记过境:BashToolResultMessage 蓝本在零输出分支渲 returnCodeInterpretation
452
- // (『No matches found』而非『(No output)』),缺席时行为不变。
453
226
  toolUseResult: {
454
227
  stdout,
455
228
  stderr: slots.stderr,
@@ -464,15 +237,6 @@ export function wireOutputToBody(toolName, output, isError, truncated, flatten,
464
237
  return { content: stdout, isError, toolUseResult: { stdout, stderr: '', interrupted: false } };
465
238
  }
466
239
  if (name === 'taskoutput' || name === 'task_output') {
467
- // 🔴 **T13 的 D 层半场本批不退位**(如实留白,不假装搬完):
468
- // structured task-output 在场时,权威卡体确实已由 B 层 `case 'task-output'` 给出
469
- // (`toolUseResult`),但 **block content** 在 cli 里是这个 `{retrieval_status, task}`
470
- // **对象**(不是字符串)—— 要让它跟着退位,只能二选一:
471
- // ⓐ 换成模型面原文字符串 = 形状改变(顺带修掉 cli 在这里遗留的「件1 裸对象 content」隐患),
472
- // ⓑ 用 structured 重建同形对象 = 值会比正则**更全**(如 details.exitCode),仍是可观测改动。
473
- // 两条都是行为面改动,超出「搬 + 正则退位」的范围,且没有真实场景需求驱动(宪法)。
474
- // ⇒ 本批**逐字保留 cli 形**;T13 真正退位的那一半在 B 层(见 `case 'task-output'` 的惰性回落,
475
- // structured 带齐 status+content 时根本不解模型面文本)。件1 那条隐患单独记账,见交接报告。
476
240
  const body = truncated ? `${text}\n…(truncated)` : text;
477
241
  const parsed = parseModelFacingTaskOutput(text);
478
242
  const wrap = (task) => ({
@@ -483,15 +247,12 @@ export function wireOutputToBody(toolName, output, isError, truncated, flatten,
483
247
  return wrap({
484
248
  task_id: parsed.taskId ?? '',
485
249
  task_type: 'local_agent',
486
- // 0.72.12 CC-50(#59 A-06):解不出 ⇒ unknown,不编 completed。
487
250
  status: parsed.status ?? 'unknown',
488
251
  description: parsed.taskId ?? '',
489
252
  output: parsed.output ?? '',
490
253
  result: parsed.output ?? '',
491
254
  });
492
255
  }
493
- // #49 C3:workflow 轮询的模型面是 formatWorkflowRun raw JSON,parseModelFacingTaskOutput 解不了
494
- // (kind unknown)会掉进 local_bash 兜底 = 错标 + 空 status/task_id。信封识别先行。
495
256
  const wfEnvelope = parseWorkflowPollEnvelope(text);
496
257
  if (wfEnvelope) {
497
258
  if (WF_TERMINAL_STATUSES.has(wfEnvelope.status))
@@ -514,18 +275,7 @@ export function wireOutputToBody(toolName, output, isError, truncated, flatten,
514
275
  }
515
276
  return { content: truncated ? `${text}\n…(truncated)` : text, isError };
516
277
  }
517
- // ══════════════════════════════════════════════════════════════════════════════════════════════
518
- // ⑤ B 层 —— `structuredToToolUseResult`(按 `structured.type` 14 case)
519
- // ══════════════════════════════════════════════════════════════════════════════════════════════
520
- /**
521
- * design/64 CC-parity `toolUseResult`:引擎结构化细节 → 各卡 outputSchema **精确** typed 形
522
- * (safeParse 过了才渲富卡,不过就回落 12 行文本兜底)。
523
- * `structuredPatch` 在**这里**算(T20,core 裁定:引擎发 originalFile、客户端算 hunks)。
524
- * 全部**防御读**:形状不认得 ⇒ null ⇒ 调用方回落 text 路径(降保真,绝不炸)。
525
- */
526
- export function structuredToToolUseResult(structured,
527
- /** 压平后的模型面正文 —— 有些形(task-output)只带 identity/status,正文仍在模型面。 */
528
- modelText) {
278
+ export function structuredToToolUseResult(structured, modelText) {
529
279
  if (typeof structured !== 'object' || structured === null)
530
280
  return null;
531
281
  const s = structured;
@@ -533,13 +283,11 @@ modelText) {
533
283
  if (typeof s[k] === 'string' && s[k].length > MAX_STRUCTURED_FIELD_CHARS)
534
284
  return null;
535
285
  }
536
- // run_workflow 回执:登记 outstanding workflow → idle 终态轮询兜底(不赌推送)。
537
286
  if (s.type === 'workflow-run' && typeof s.workflowRunId === 'string') {
538
287
  registerOutstandingWorkflowRun(s.workflowRunId);
539
288
  }
540
289
  switch (s.type) {
541
290
  case 'ask-user-question': {
542
- // §4④ liveHitlAskWire 的**壳侧 stamp**(非引擎 wire 形):已作答的 AskUserQuestion 续流重放。
543
291
  if (!Array.isArray(s.questions) || typeof s.answers !== 'object' || s.answers === null)
544
292
  return null;
545
293
  return {
@@ -553,9 +301,6 @@ modelText) {
553
301
  };
554
302
  }
555
303
  case 'bash': {
556
- // core 1.207 —— ctrl+b DETACH 的早关形 `{detached:true, task_id}`:渲 CC 自己的
557
- // backgrounded 卡(它只在 stdout/stderr 为空时显示 "Running in the background"),
558
- // 所以渲染面丢掉已抓到的尾巴(模型面照旧拿到)。
559
304
  if (s.detached === true && typeof s.task_id === 'string') {
560
305
  return {
561
306
  toolUseResult: {
@@ -570,7 +315,6 @@ modelText) {
570
315
  if (typeof s.stdout !== 'string' && typeof s.stderr !== 'string')
571
316
  return null;
572
317
  const exitCode = typeof s.exitCode === 'number' ? s.exitCode : null;
573
- // 良性非零退出注记同臂(与 wireOutputToBody T11 同判别量,CC pretty223:394251 同源)。
574
318
  const benignInterp = typeof s.returnCodeInterpretation === 'string' && s.returnCodeInterpretation.length > 0
575
319
  ? s.returnCodeInterpretation
576
320
  : undefined;
@@ -585,8 +329,6 @@ modelText) {
585
329
  };
586
330
  }
587
331
  case 'edit': {
588
- // 单编辑形(core 1.199)或 design/116 的折叠形(`edits: [{old_string,new_string,replace_all?}]`,
589
- // MultiEdit 退役进 Edit)。从 originalFile 重建编辑后文件,再算 CC 卡渲的 hunks。
590
332
  const filePath = typeof s.filePath === 'string' ? s.filePath : undefined;
591
333
  const originalFile = typeof s.originalFile === 'string' ? s.originalFile : undefined;
592
334
  if (filePath === undefined || originalFile === undefined)
@@ -596,7 +338,6 @@ modelText) {
596
338
  return null;
597
339
  if (!content.includes(oldStr))
598
340
  return null;
599
- // split/join(不是 String.replace)—— newStr 里的 `$` 绝不能被当成替换模式。
600
341
  if (all)
601
342
  return content.split(oldStr).join(newStr);
602
343
  const i = content.indexOf(oldStr);
@@ -647,7 +388,6 @@ modelText) {
647
388
  oldString: firstOld,
648
389
  newString: firstNew,
649
390
  originalFile,
650
- // 先做 tab 归一再 diff —— CC 本地 Edit 卡同款(tab 缩进文件两边 hunk 才一致)。
651
391
  structuredPatch: getPatchFromContents({
652
392
  filePath,
653
393
  oldContent: convertLeadingTabsToSpaces(originalFile),
@@ -660,7 +400,6 @@ modelText) {
660
400
  }
661
401
  case 'create':
662
402
  case 'update': {
663
- // Write(core 1.199):`{type: create|update, filePath, content, originalFile?}`。
664
403
  const filePath = typeof s.filePath === 'string' ? s.filePath : undefined;
665
404
  const content = typeof s.content === 'string' ? s.content : undefined;
666
405
  if (filePath === undefined || content === undefined)
@@ -684,8 +423,6 @@ modelText) {
684
423
  };
685
424
  }
686
425
  case 'text': {
687
- // Read(core 1.202):`{type:"text", file:{filePath, content, numLines, startLine, totalLines}}`
688
- // —— 与壳 FileReadTool outputSchema 的 text 臂逐字节同形。校验 + 透传。
689
426
  const f = s.file;
690
427
  if (typeof f?.filePath !== 'string' ||
691
428
  typeof f?.content !== 'string' ||
@@ -697,9 +434,6 @@ modelText) {
697
434
  return { toolUseResult: { type: 'text', file: f } };
698
435
  }
699
436
  case 'grep': {
700
- // Grep(core 1.202):files_with_matches 带 {filenames, numFiles};其他模式带 {numLines}。
701
- // 壳 schema 每个模式都要 numFiles+filenames ⇒ 补安全空值。`count` 模式的 numLines 是
702
- // 每文件行数**不是** numMatches —— 不许假造,让它掉 text 路径。
703
437
  const mode = typeof s.mode === 'string' ? s.mode : 'files_with_matches';
704
438
  if (mode === 'files_with_matches') {
705
439
  if (!Array.isArray(s.filenames))
@@ -720,7 +454,6 @@ modelText) {
720
454
  return null;
721
455
  }
722
456
  case 'glob': {
723
- // Glob(core 1.202):{filenames, numFiles, truncated, durationMs} = 壳 GlobTool outputSchema。
724
457
  if (!Array.isArray(s.filenames) || typeof s.numFiles !== 'number')
725
458
  return null;
726
459
  return {
@@ -733,8 +466,6 @@ modelText) {
733
466
  };
734
467
  }
735
468
  case 'notebook-edit': {
736
- // NotebookEdit(core 1.202)。卡只渲 cell_id/new_source/error,其余 REQUIRED 字段用派生/空值
737
- // 满足(引擎不发编辑后 notebook JSON,渲染面也从不读它们)。
738
469
  const notebookPath = typeof s.notebookPath === 'string' ? s.notebookPath : undefined;
739
470
  const newSource = typeof s.newSource === 'string' ? s.newSource : undefined;
740
471
  const editMode = typeof s.editMode === 'string' ? s.editMode : undefined;
@@ -766,8 +497,6 @@ modelText) {
766
497
  return { toolUseResult: { id: s.id } };
767
498
  }
768
499
  case 'cron-list': {
769
- // ⚠️ 无 `prompt` —— core 的 ScheduledTaskSummary 刻意不发全意图(安全边界 [478]①);
770
- // 壳 outputSchema 放宽成 optional 好让 safeParse 过。坏行丢弃,不因一行毁整卡。
771
500
  if (!Array.isArray(s.jobs))
772
501
  return null;
773
502
  const jobs = s.jobs.flatMap(j => typeof j?.id === 'string' && typeof j?.cron === 'string' && typeof j?.humanSchedule === 'string'
@@ -777,8 +506,6 @@ modelText) {
777
506
  cron: j.cron,
778
507
  humanSchedule: j.humanSchedule,
779
508
  ...(typeof j.prompt === 'string' ? { prompt: j.prompt } : {}),
780
- // [935]:布尔**全值**透传(recurring:false ⇒ [once]、durable:false ⇒ [session]);
781
- // 旧形 `=== true` 会把 false 剥掉 = 标记面在 live 路径永不可达。
782
509
  ...(typeof j.recurring === 'boolean' ? { recurring: j.recurring } : {}),
783
510
  ...(typeof j.durable === 'boolean' ? { durable: j.durable } : {}),
784
511
  },
@@ -787,37 +514,13 @@ modelText) {
787
514
  return { toolUseResult: { jobs } };
788
515
  }
789
516
  case 'agent': {
790
- // Agent 异步启动(core 1.272+ [666] 默认后台化主路径)。outputFile 是 schema 必填但 live lane
791
- // 没有本地文件 ⇒ '' + canReadOutputFile:false(渲染文本因此省掉 file-tail 分支,与引擎模型面一致)。
792
- //
793
- // 🔴 **`type:"agent"` 自 core 5.10.0 起是两形一卡**([2575] 消费端自查②):`status` 是判别位 ——
794
- // `"async_launched"` = 本臂的启动回执;**其它任何值** = 子代的**完成着陆报告**
795
- // (`completedAgentCard`,core `agents/subagent.ts`;5.10.0 之前它被投影白名单在上 wire 前丢掉,
796
- // 所以「`type:"agent"` ⇒ 后台启动回执」这个等式当时恰好成立,现在不成立了)。
797
- // 🔴 **按 `status` 分臂,绝不按键集分臂** —— 这是 core 的原话,也是本行 `!==` 的全部理由。
798
- // 键集判别在两形共有 `taskId`/`status`/`prompt`-无 的现实下必然错分。
799
- // 🔴 完成卡**本批不投 CC 卡**(如实留白,不假装搬完):壳的 `AgentTool.outputSchema` 完成臂
800
- // (`agentToolResultSchema` + `status:'completed'`)要 `content`/`totalToolUseCount`/
801
- // `totalDurationMs`/`totalTokens`/`usage`/`prompt` 六件,而完成卡上**没有 `prompt`**、
802
- // `status` 是子代真实终态(可能是 `failed`/`blocked`/`suspended.*`,壳的 zod 会当场拒),
803
- // 统计也要从 `stats`/`toolStats` 重算 —— 那是**行为面**改动(要先答「失败的子代该渲成什么」),
804
- // 按宪法三问单独走。返回 null ⇒ 回落模型面 text 路径,与 5.10.0 之前逐字同形,零回归。
805
- // ⚠️ 完成卡本身**没有被吞**:`eventToSdkMessage` 的 `tool_end_result` 臂把 `structured`
806
- // 原样透传给宿主,typed 读口见本文件的 {@link readCompletedAgentCard}。
807
- // 分臂 + 身份两位走 typed 读口 {@link readAsyncLaunchedAgentReceipt}(#158② 起本包有第二个
808
- // 消费点 —— adapt 的 alias 登记 —— 判据必须只有一份;`status`/`task_id` 的读法不再散点)。
809
517
  const receipt = readAsyncLaunchedAgentReceipt(s);
810
518
  if (receipt === null)
811
519
  return null;
812
520
  const agentId = receipt.taskId;
813
- // description/prompt 是**卡的可渲染性**要求(不是身份):缺它们必须回落 **text 路径**而不是
814
- // 降级成 '' ——富卡在空 prompt 时收起展开面 **且** 压过 text 兜底,'' 会两条 lane 都丢信息
815
- // (对抗复审 M-1)。故这两位刻意留在本臂,不进读口。
816
521
  if (typeof s.description !== 'string' || typeof s.prompt !== 'string') {
817
522
  return null;
818
523
  }
819
- // seq = bg 子代生命周期号(SendMessage 复活即 +1)。wire 今天未必带它 —— 缺席 ⇒ 包内按
820
- // 首周期解释;带了就必须透传,否则复活周期的观察登记会与首周期同键而被幂等吞掉(notif-02)。
821
524
  registerOutstandingBgTask(agentId, s.description, s.prompt, receipt.seq);
822
525
  return {
823
526
  toolUseResult: {
@@ -832,8 +535,6 @@ modelText) {
832
535
  };
833
536
  }
834
537
  case 'task-output': {
835
- // TaskOutput(core 1.217 [379])。identity/status 取 structured(权威),正文取 `content`;
836
- // **T13/T24 退位**:只有 structured 没带正文时才回落解模型面文本。
837
538
  const taskId = typeof s.task_id === 'string' ? s.task_id : undefined;
838
539
  if (taskId === undefined)
839
540
  return null;
@@ -841,25 +542,13 @@ modelText) {
841
542
  const inner = s.details && typeof s.details === 'object' ? s.details : undefined;
842
543
  const hasStatus = typeof s.status === 'string' && s.status.length > 0;
843
544
  const hasContent = typeof s.content === 'string';
844
- // 0.72.12 CC-50(#59 A-05 前半)。🔴 `retrieval_status` 是 **CC 同名键**(闭集 success / timeout / not_ready):老壳卡片
845
- // success 才展示正文、not_ready 渲「still running」、timeout 渲超时 —— 闭集里没有「不知道」,绝不往里塞第四个词。
846
- // 认不出 / 缺席 ⇒ `success`:正向证据 = 这份 structured detail 是一次**已返回**的取回调用的产物(引擎没说 timeout /
847
- // not_ready 就是取回来了);「结局不知道」由下面的 `status:'unknown'` 承载,不由 retrieval 位承载。
848
- // (异源对抗复审两轮:原词透传 ⇒ 已完成正文被藏;按 structured 两键推 not_ready ⇒ 漏了文本回落且渲成假「仍在运行」。
849
- // 本行登记在 scripts/absence-fold-baseline.json 带 why。)
850
545
  const rawRetrieval = typeof s.retrieval_status === 'string' ? s.retrieval_status : undefined;
851
546
  const engineSaidNotReady = rawRetrieval === 'timeout' || rawRetrieval === 'not_ready';
852
547
  const retrieval = engineSaidNotReady ? rawRetrieval : 'success';
853
- // 🔴 惰性回落:structured 把 status 和正文都带齐了就**根本不解**模型面文本(T13 正则退位);
854
- // 少哪一半就只为那一半解一次。判据锚在「这两个量还缺不缺」,不锚在「structured 在不在」。
855
548
  const parsed = hasStatus && hasContent ? null : parseModelFacingTaskOutput(modelText ?? '');
856
- // 0.72.12 CC-50(#59 A-05):retrieval success 只说「取到了」,不说「完成了」⇒ 无 status 落 unknown;
857
- // 引擎**亲口**说 not_ready / timeout 才是「还没好」的正向证据 ⇒ running(本包按无证据推出来的 not_ready 不算)。
858
549
  const status = hasStatus
859
550
  ? s.status
860
551
  : (parsed?.status ?? (engineSaidNotReady ? 'running' : 'unknown'));
861
- // 'unknown' 分支类型上没有 output 字段(REF-CC-TYPESHAPE-14:不是「值恰好是 undefined」)——
862
- // 显式按 kind 取,别对整个 union 裸访问不共有的属性。
863
552
  const bodyText = hasContent ? s.content : parsed && parsed.kind !== 'unknown' ? parsed.output : undefined;
864
553
  const error = typeof s.error === 'string' ? s.error : undefined;
865
554
  if (taskType === 'background_bash') {
@@ -896,17 +585,11 @@ modelText) {
896
585
  };
897
586
  }
898
587
  const wfName = typeof inner?.name === 'string' && inner.name.length > 0 ? inner.name : undefined;
899
- // 0.73.4(CC-63):**run 级**错误码。引擎在这张结构卡的**顶层**铸 `errorCode`(与 `completionId` 同层;有值才带,
900
- // 缺席 = 这条 run 没有码),今天只有 workflow 形带。它不是 `agent_runs[].errorCode`(per-agent,住在模型面 JSON 里),
901
- // 也不在内层 `details` 上。开集原词透传;缺席 / 空串 / 非字符串 ⇒ 键不铸,绝不编码。CC 的 task 形没有这一格 ⇒ 超集键。
902
588
  const runErrorCode = typeof s.errorCode === 'string' && s.errorCode.length > 0 ? s.errorCode : undefined;
903
589
  let output = bodyText ?? '';
904
590
  if (taskType === 'workflow') {
905
- // 终态轮询卡经过投影 = 模型 in-band 已收到结局 ⇒ 预 seed runId 去重(补发通道对同 runId 丢弃)。
906
- // 活跃态(running/queued/paused)绝不 seed。
907
591
  if (WF_TERMINAL_STATUSES.has(status))
908
592
  markEngineWorkflowNotified(taskId);
909
- // workflow 轮询的模型面是 raw JSON(formatWorkflowRun)—— 投影成一行人话,绝不上 blob。
910
593
  const jsonSrc = output.length > 0 ? output : (modelText ?? '');
911
594
  output = projectWorkflowTaskOutput(jsonSrc);
912
595
  }
@@ -925,8 +608,6 @@ modelText) {
925
608
  },
926
609
  };
927
610
  }
928
- // 认不得的形(含过渡期 1.199 `multiedit`,以及白名单里本包尚无 typed 卡的那些)一律掉
929
- // **永不隐形**的 text 路径 —— 降保真,不炸。
930
611
  default:
931
612
  return null;
932
613
  }
@@ -935,20 +616,15 @@ export function detectEngineBgShellReceipt(toolName, rawInput, outputText) {
935
616
  if (typeof outputText !== 'string')
936
617
  return null;
937
618
  const input = (rawInput ?? {});
938
- // 正向枚举按工具分臂(#158:新工具默认不铸行=安全方向)。
939
619
  let source;
940
620
  let m;
941
621
  if (toolName === 'Bash') {
942
- // 🔴 Bash 臂**刻意**要求 run_in_background===true:detach lane(Command moved…)归
943
- // engineToolDetach,重复登记会长双行(原 #117a 纪律,逐字保留)。
944
622
  if (input.run_in_background !== true)
945
623
  return null;
946
624
  m = THREE_GEN_BG_RECEIPT_RE.exec(outputText);
947
625
  source = 'bash';
948
626
  }
949
627
  else if (toolName === 'Monitor') {
950
- // #158:Monitor 天然后台(参数无 run_in_background 键),锚它自己的第四形回执首句——
951
- // 此前三重门全拒 ⇒ 引擎 Monitor 任务面板零行(不可见/不可 tail)。
952
628
  m = MONITOR_BG_RECEIPT_RE.exec(outputText);
953
629
  source = 'monitor';
954
630
  }
@@ -968,10 +644,6 @@ export function detectEngineBgShellReceipt(toolName, rawInput, outputText) {
968
644
  source,
969
645
  };
970
646
  }
971
- /**
972
- * TodoWrite 清单卡:引擎不发 todo structured,全量新表骑在 tool_use INPUT 上 ⇒ 从它合成 typed 结果。
973
- * `oldTodos` = 上一次的活体清单(调用方持:一个 session 一份,正是划删线 diff 要的粒度)。
974
- */
975
647
  export function todoWriteToolUseResult(rawInput, oldTodos, isError) {
976
648
  const todos = rawInput?.todos;
977
649
  if (!Array.isArray(todos))
@@ -982,11 +654,6 @@ export function todoWriteToolUseResult(rawInput, oldTodos, isError) {
982
654
  newTodos: todos,
983
655
  };
984
656
  }
985
- /**
986
- * ReportFindings(core 1.288 [811]b,引擎侧执行的合成回声工具):details 是 `{count, level?, findings}`
987
- * **没有 type 判别位**(core synthetic-tools.js)⇒ B 层的 type-keyed switch 认领不了,按**工具名**认。
988
- * 双腿:优先 wire structured;引擎没发就从 tool_use INPUT 合成(回声工具:input.findings ≡ output.findings)。
989
- */
990
657
  export function reportFindingsToolUseResult(structured, rawInput) {
991
658
  const s = structured && typeof structured === 'object' ? structured : undefined;
992
659
  const input = rawInput;
@@ -1006,18 +673,6 @@ export function reportFindingsToolUseResult(structured, rawInput) {
1006
673
  },
1007
674
  };
1008
675
  }
1009
- /**
1010
- * 把一张 `tool_end.structured` 窄化成 {@link AsyncLaunchedAgentReceipt} —— **仅当**它是
1011
- * `type:"agent"` 的 **`async_launched` 启动回执**臂时;完成着陆报告 / 别的族 / 缺身份 ⇒ `null`。
1012
- *
1013
- * 🔴 分臂判据 = `status`(core 原话:"Branch on `status`, never on which keys are present"),
1014
- * 与姊妹读口 {@link readCompletedAgentCard} 互为反面。本函数是这条纪律在**回执**侧的单一实现点:
1015
- * 本包现在有两个消费点 —— 富卡投影(`structuredToToolUseResult`)与 adapt 的 bg 子代 alias 登记
1016
- * (`adapt/arms.ts` 的 `tool_end_result` 臂,#158②)—— 两处不得各抄一遍键名与 `'async_launched'`。
1017
- * 🔴 `task_id` 要**非空**串:空串是「有这个键但没有身份」,拿它当 taskId 会在内容账本里铸一条
1018
- * 键为 `''` 的映射(读口那侧的 `?? ''` 兜底会当场把它认成命中)。诚实拒,不铸空 id ——
1019
- * 与 {@link readCompletedAgentCard} 对 `taskId` 的同款判据一致。
1020
- */
1021
676
  export function readAsyncLaunchedAgentReceipt(structured) {
1022
677
  if (structured === null || typeof structured !== 'object')
1023
678
  return null;
@@ -1034,14 +689,6 @@ export function readAsyncLaunchedAgentReceipt(structured) {
1034
689
  ...(typeof s.seq === 'number' && Number.isFinite(s.seq) ? { seq: s.seq } : {}),
1035
690
  };
1036
691
  }
1037
- /**
1038
- * 把一张 `tool_end.structured` 窄化成 {@link CompletedAgentCard} —— **仅当**它是 `type:"agent"` 的
1039
- * **完成**臂时。不是 agent 卡 / 是 `async_launched` 回执 / 缺 `status` 或 `taskId` ⇒ `null`。
1040
- *
1041
- * 🔴 分臂判据 = `status`(core 原话:"Branch on `status`, never on which keys are present")。
1042
- * 本函数是那条纪律在包内的**单一实现点**:三端(TUI / web / desktop)按同一份窄化读,
1043
- * 而不是各自抄一遍键名与 `!== 'async_launched'`。
1044
- */
1045
692
  export function readCompletedAgentCard(structured) {
1046
693
  if (structured === null || typeof structured !== 'object')
1047
694
  return null;
@@ -1049,11 +696,9 @@ export function readCompletedAgentCard(structured) {
1049
696
  if (s.type !== 'agent')
1050
697
  return null;
1051
698
  const status = s.status;
1052
- // 分臂:`async_launched` 是回执臂(归 `structuredToToolUseResult` 的 `case 'agent'`),不是本臂。
1053
699
  if (typeof status !== 'string' || status.length === 0 || status === 'async_launched')
1054
700
  return null;
1055
701
  const taskId = s.taskId;
1056
- // 身份缺席 ⇒ 这不是一张可用的完成卡(诚实拒,不铸空 id)。
1057
702
  if (typeof taskId !== 'string' || taskId.length === 0)
1058
703
  return null;
1059
704
  const str = (v) => (typeof v === 'string' && v.length > 0 ? v : undefined);
@@ -1063,7 +708,6 @@ export function readCompletedAgentCard(structured) {
1063
708
  taskId,
1064
709
  ...(str(s.sessionId) !== undefined ? { sessionId: str(s.sessionId) } : {}),
1065
710
  ...(str(s.subagent_type) !== undefined ? { subagentType: str(s.subagent_type) } : {}),
1066
- // `result` 允许空串(子代没产出正文是一个诚实的事实),故这里不用 `str` 的非空过滤。
1067
711
  ...(typeof s.result === 'string' ? { result: s.result } : {}),
1068
712
  ...(typeof s.salvagedOutput === 'string' ? { salvagedOutput: s.salvagedOutput } : {}),
1069
713
  ...(s.structuredOutput !== undefined ? { structuredOutput: s.structuredOutput } : {}),
@@ -1071,7 +715,6 @@ export function readCompletedAgentCard(structured) {
1071
715
  ...(str(s.errorMessage) !== undefined ? { errorMessage: str(s.errorMessage) } : {}),
1072
716
  ...(str(s.errorCode) !== undefined ? { errorCode: str(s.errorCode) } : {}),
1073
717
  ...(num(s.retryAfterMs) !== undefined ? { retryAfterMs: num(s.retryAfterMs) } : {}),
1074
- // 对象守卫(与 terminalToSdkResult.degradedOf 同姿势):非对象/null 一律当缺席,不硬塞。
1075
718
  ...(typeof s.degraded === 'object' && s.degraded !== null
1076
719
  ? { degraded: s.degraded }
1077
720
  : {}),