@sema-agent/client-core 0.77.1 → 0.78.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/CHANGELOG.md +42 -1
  2. package/README.md +6 -5
  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 +3 -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 +23 -371
  182. package/dist/hitl/persistedRulesWire.js +62 -329
  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 +1 -249
  284. package/dist/request/taskRequest.js +20 -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 +78 -5
  382. package/package.json +3 -3
@@ -1,54 +1,21 @@
1
- /**
2
- * src/fleet/workflowSizeWarning.ts —— workflow **规模告警**的判定(0.73.5)。
3
- *
4
- * 三端 footer / 面板都要回答同一个问题:「这条 workflow 是不是大到该提醒用户了」。判定与 CC 同形
5
- * (三个缺省帽、每 agent 用量估算、guideline 表、两个 env 覆盖、三档文案与宽度阶梯),属于客户端公共逻辑,
6
- * 由本包单源;端只负责读环境、读设置、量宽度与渲染。
7
- *
8
- * 🔴 **入参按 fleet 视图的三态键读**(`FleetWorkflowView`:`totalCount` / `startedCount` / `doneCount` /
9
- * `failedCount` / `tokens` 全是可选位,缺席 = wire 没报 = 不知道)。出参三态:
10
- * · `warn` —— 有**正向证据**证明至少一条轴超帽(别的键缺席不挡它;下界分母算出的上界**不算**证据);
11
- * · `ok` —— 两条轴都判得出,且都在帽内(或 ultracode 压掉了整条告警);
12
- * · `unknown` —— 没有超帽的正向证据,且至少一条轴判不出。**未知的规模不能被当作规模正常**:
13
- * `unknown` 绝不折成 `ok`,`missing` 点名缺了哪几键。
14
- *
15
- * 🔴 **分母口径**(每 agent 用量 `u = tokens / started`):
16
- * · `startedCount` 在场且不小于 `doneCount + failedCount` ⇒ 用引擎真值(含真 0:「一个都还没起」是一条真信息
17
- * ⇒ 用先验);比已完成数还小(帧间竞态)⇒ 这份读数是陈旧的,按下面的下界处置;
18
- * · 缺席 ⇒ 只有 `doneCount` / `failedCount` **两键都在场**才回退成下界,结果标 `startedIsLowerBound`。
19
- * 下界偏小 ⇒ `u` 偏大 ⇒ 算出来的是投影的**上界**(`projectedTokensUpperBound`,不是 `projectedTokens`):
20
- * 上界在帽内 ⇒ 真的在帽内 ⇒ 可以判 `ok`;上界超帽**不是**超帽的证据(同一份读数补上真 `startedCount`
21
- * 可能远在帽内)⇒ 投影轴判不出,`unknown`。想保守一点的端可以自己拿上界去提示,判词不替它撒谎;
22
- * · 下界为 0 ⇒ 每 agent 用量判不出:「0 个完成」不是「一个没起」的证据,先验只在引擎**亲口**报
23
- * `startedCount = 0` 时可用;
24
- * · 只有一键在场 ⇒ 不回退(缺席的那键不读作 0)。
25
- */
26
- /** 缺省 agent 数帽。 */
27
1
  export const WORKFLOW_SIZE_WARNING_AGENT_CAP = 25;
28
- /** 缺省 token 帽(已花 ∨ 投影)。 */
29
2
  export const WORKFLOW_SIZE_WARNING_TOKEN_CAP = 1_500_000;
30
- /** 还没有任何 agent 起跑时的每 agent 用量先验。 */
31
3
  export const WORKFLOW_SIZE_WARNING_TOKENS_PER_AGENT = 70_000;
32
- /** 显式 `workflowSizeGuideline` → agent 数帽。`unrestricted` 与缺省(未配置)**不贡献帽**,故不在表里。 */
33
4
  export const WORKFLOW_SIZE_GUIDELINE_AGENT_CAPS = Object.freeze({
34
5
  small: 5,
35
6
  medium: 15,
36
7
  large: 50,
37
8
  });
38
- /** 两个 env 覆盖各自的名字,按读取优先级排(品牌名在前,兼容名在后)。本包不读 `process.env`,名字单源在这里。 */
39
9
  export const WORKFLOW_SIZE_WARNING_ENV_NAMES = Object.freeze({
40
10
  agents: Object.freeze(['SEMA_CODE_WORKFLOW_SIZE_WARNING_AGENTS', 'CLAUDE_CODE_WORKFLOW_SIZE_WARNING_AGENTS']),
41
11
  tokens: Object.freeze(['SEMA_CODE_WORKFLOW_SIZE_WARNING_TOKENS', 'CLAUDE_CODE_WORKFLOW_SIZE_WARNING_TOKENS']),
42
12
  });
43
- /** 三档文案(宽 → 窄)。 */
44
13
  export const WORKFLOW_SIZE_WARNING_TEXT_LONG = '⚠ Large workflow · /workflows to stop';
45
14
  export const WORKFLOW_SIZE_WARNING_TEXT_SHORT = '⚠ Large workflow';
46
15
  export const WORKFLOW_SIZE_WARNING_TEXT_MIN = '⚠';
47
- /** 有限非负数,否则缺席(坏形按缺席,不猜)。 */
48
16
  function count(v) {
49
17
  return typeof v === 'number' && Number.isFinite(v) && v >= 0 ? v : undefined;
50
18
  }
51
- /** 正有限数,否则缺席。 */
52
19
  function positive(v) {
53
20
  return typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : undefined;
54
21
  }
@@ -57,7 +24,6 @@ function guidelineCap(size) {
57
24
  ? WORKFLOW_SIZE_GUIDELINE_AGENT_CAPS[size]
58
25
  : undefined;
59
26
  }
60
- /** 规模判定。纯函数:每个环境量都由调用方注入。 */
61
27
  export function evaluateWorkflowSize(input) {
62
28
  const agentCap = positive(input.envAgentCap) ?? guidelineCap(input.guidelineSize) ?? WORKFLOW_SIZE_WARNING_AGENT_CAP;
63
29
  const tokenCap = positive(input.envTokenCap) ?? WORKFLOW_SIZE_WARNING_TOKEN_CAP;
@@ -71,7 +37,6 @@ export function evaluateWorkflowSize(input) {
71
37
  };
72
38
  if (input.ultracodeActive === true)
73
39
  return { kind: 'ok', suppressed: true, ...base };
74
- // 分母:真值 / 两键下界 / 判不出。
75
40
  const startedWire = count(input.startedCount);
76
41
  const done = count(input.doneCount);
77
42
  const failed = count(input.failedCount);
@@ -82,12 +47,9 @@ export function evaluateWorkflowSize(input) {
82
47
  started = startedWire;
83
48
  }
84
49
  else if (bound !== undefined) {
85
- // `startedCount` 缺席,或它比已完成数还小(帧间竞态:已完成的 agent 必然起过 ⇒ 这份 started 是陈旧的)。
86
- // 顶上来的 `done + failed` 只是**下界**,不是真值 —— 与缺席同一处置。
87
50
  started = bound;
88
51
  lowerBound = true;
89
52
  }
90
- // 投影:分母是真值 ⇒ 投影;分母是下界(> 0)⇒ 只有上界;其余判不出。
91
53
  let projected;
92
54
  let upperBound;
93
55
  if (scheduled !== undefined && tokens !== undefined && started !== undefined) {
@@ -104,7 +66,6 @@ export function evaluateWorkflowSize(input) {
104
66
  ...(upperBound !== undefined ? { projectedTokensUpperBound: upperBound } : {}),
105
67
  ...(lowerBound && scheduled !== undefined && tokens !== undefined ? { startedIsLowerBound: true } : {}),
106
68
  };
107
- /** 投影轴在帽内的证据:真投影在帽内,或上界在帽内。 */
108
69
  const projectionWithinCap = (projected !== undefined && projected <= tokenCap) || (upperBound !== undefined && upperBound <= tokenCap);
109
70
  const overAgents = scheduled !== undefined && scheduled > agentCap;
110
71
  const overTokens = (tokens !== undefined && tokens > tokenCap) || (projected !== undefined && projected > tokenCap);
@@ -122,11 +83,6 @@ export function evaluateWorkflowSize(input) {
122
83
  return { kind: 'unknown', missing, ...facts };
123
84
  return { kind: 'ok', ...facts };
124
85
  }
125
- /**
126
- * 两个 env 覆盖的读口。`env` 由调用方交(本包不碰 `process.env`)。每组按 {@link WORKFLOW_SIZE_WARNING_ENV_NAMES}
127
- * 的顺序取**第一个在场的名字**;那个名字的值不是正有限数 ⇒ 该键不在场,**不回落**到第二个名字
128
- * (显式写错不该被悄悄换源)。
129
- */
130
86
  export function readWorkflowSizeWarningEnvCaps(env) {
131
87
  const pick = (names) => {
132
88
  if (env === undefined || env === null)
@@ -134,7 +90,7 @@ export function readWorkflowSizeWarningEnvCaps(env) {
134
90
  for (const n of names) {
135
91
  const raw = env[n];
136
92
  if (typeof raw !== 'string')
137
- continue; // 空串也是「在场」:在场的坏值就地止步,不回落
93
+ continue;
138
94
  return positive(Number(raw));
139
95
  }
140
96
  return undefined;
@@ -143,7 +99,6 @@ export function readWorkflowSizeWarningEnvCaps(env) {
143
99
  const t = pick(WORKFLOW_SIZE_WARNING_ENV_NAMES.tokens);
144
100
  return { ...(a !== undefined ? { envAgentCap: a } : {}), ...(t !== undefined ? { envTokenCap: t } : {}) };
145
101
  }
146
- /** 宽度阶梯:挑放得下的最长一档;连字形都放不下 ⇒ `undefined`(整段不渲)。`width` 由调用方注入(与渲染器同一把尺)。 */
147
102
  export function workflowSizeWarningTextForWidth(available, width) {
148
103
  if (available >= width(WORKFLOW_SIZE_WARNING_TEXT_LONG))
149
104
  return WORKFLOW_SIZE_WARNING_TEXT_LONG;
@@ -1,71 +1,23 @@
1
- /** 行帧投影后的最小 agent 行形(fleet-tree 的 FleetTask 是它的超集)。 */
2
1
  export interface FleetAgentRowLike {
3
2
  id: string;
4
- /** fleet 行 label 列 = agent identity(agentName ?? agentType),如 'fork'。 */
5
3
  name?: string;
6
- /** fleet 行描述列 = 任务描述,如 'alpha-probe'(面板行 label 用它)。 */
7
4
  description?: string;
8
5
  status?: string;
9
6
  tokens?: number;
10
- /**
11
- * server 1.278.0 `toolUses` —— 子代**累计**工具调用数。🔴 三态:有键真值(含真 0)/
12
- * 无键 `undefined` = 老引擎不知道。**本层绝不 `?? 0`**(那等于把「不知道」冒充成「跑了 0 个」,
13
- * 而且会把台账里已知的累计值擦回 0)。
14
- *
15
- * ⚠️ **这句话只对本层成立 —— 分层实情**(2026-07-31 更正:原文写成绝对句「绝不在本层 `?? 0`」,
16
- * 读起来像是全包禁令,于是与 `adapt.ts` tick 臂那句 `: 0` 构成一处**包内自相矛盾**;真相是两条
17
- * lane 的供给形不同,判据见 `engineAgentPanelStore.ts` 的 `PANEL_TOOLUSES_LANE_POLICY`):
18
- * · **本 lane(fleet 行帧)**:该键是 server 1.278.0 **新加**的可选位,老引擎真的不发 ⇒
19
- * 缺席 = 不知道 ⇒ 必须传播缺席(键不落)。
20
- * · **tick lane(`task_progress`)**:`usage` 在 core 的事件类型里是**必填**
21
- * (core 2.12.0 `core/types.d.ts:606-610`),两处发帧点无条件构造它
22
- * (`core/runner/runtask.js:1080` / `:2925`),server 白名单整键透传
23
- * (`trace/project.js:118`)⇒ 那条 lane 上「缺席」不是「不知道」,是没有这种帧;那里的
24
- * `: 0` 是对一个**恒发的累计计数**兜底,不是编造一个不知道的值。
25
- * 两条 lane 的可选性差异由 `engineAgentPanelStore.ts` 的编译钉锁住:谁想把两层「统一」成
26
- * 同一种形,先在那里撞红。
27
- */
28
7
  toolUses?: number;
29
- /** server 1.278.0 `transcriptId`(子代 childSessionId)—— 委派 prompt 的取件锚,不是 prompt 本身。 */
30
8
  transcriptId?: string;
31
- /** server 1.288.0 / core 1.429.0([1831]②)—— 子代当前工具的结构化形。缺席=旧端或从未跑过工具。 */
32
9
  currentTool?: {
33
10
  toolName: string;
34
11
  target?: string;
35
12
  };
36
- /** server 1.250 起行带的 launch 真锚(epoch ms)。R4(clay 五报 07-31):此前投影载荷丢弃它,
37
- * 详情页 elapsed 只能锚「壳建行时刻」——遗留行上渲出 1h+ 的假时长。缺席=老引擎,消费端保持现状。 */
38
13
  startedAt?: number;
39
- /** 0.74.0 —— 行的代际号(fleet 视图 `FleetTaskView.cycleSeq` 原样交)。缺席 = 这一行没有代际概念,不是第一代。 */
40
14
  cycleSeq?: number;
41
- /** 0.74.3 CC-70:行帧上的委派卡 id(sdk `FleetTaskRow.parentToolCallId`);身份归一的退路键,在场才投影。 */
42
15
  parentToolCallId?: string;
43
16
  }
44
- /** 行从投影集消失多久之后上报 `absent`(0.72.12 起不再 settle;重连空窗 / snapshot 清表远小于此)。名字沿用(公面导出)。 */
45
17
  export declare const ABSENT_SETTLE_MS = 30000;
46
- /**
47
- * 测试钩:清投影台账 —— **全部 sessionKey**,不是只清 default 桶。
48
- *
49
- * 🔴 回炉定谳(P3 wave2 复审 blocker④):per-session 化那一批一度把它收窄成
50
- * `resetFleetAgentPanelProjectionFor(DEFAULT_SESSION_KEY)`。它的契约是「清投影台账」,不是一个
51
- * 会话语义位 —— 收窄等于给多会话宿主的用例之间留一条跨用例串扰通道(用例 A 先
52
- * `projectFleetAgentRowsFor('sess-b', …)`,用例间调零参 reset,`sess-b` 桶存活 ⇒ 下个用例首次
53
- * 投影同 taskId 时 `prev` 非空且 `settled:true`,`fleet-row`/`end` 被去重门吞掉)。
54
- * 对位实现同形:`fleet/fleetLedger.__resetFleetLedgerRegistryForTests()` = `liveBgViews.clear()`;
55
- * W1 段五个槽位的现成规约也逐个钉的是「reset 清全部键」。
56
- * 要只清一个会话请用 `resetFleetAgentPanelProjectionFor(sessionKey)`。
57
- */
58
18
  export declare function resetFleetAgentPanelProjection(): void;
59
- /** W1 keyed variant(REF-CC-045):只清**这一个会话**的桶。 */
60
19
  export declare function resetFleetAgentPanelProjectionFor(sessionKey: string): void;
61
- /** 台账读面(测试/诊断):当前记着的行数。 */
62
20
  export declare function fleetAgentProjectionSize(): number;
63
- /** W1 keyed variant。 */
64
21
  export declare function fleetAgentProjectionSizeFor(sessionKey: string): number;
65
- /**
66
- * 把一次 fleet 投影(已经过 own 判别 + workflow belt 的 FleetTask[])喂给面板事件流。
67
- * 幂等、无副作用地重复调用安全 —— 每秒被 footer 调用两次就是常态。
68
- */
69
22
  export declare function projectFleetAgentRows(rows: readonly FleetAgentRowLike[], nowMs?: number): void;
70
- /** W1 keyed variant(REF-CC-045):多会话宿主每会话一份台账,互不顶盖。 */
71
23
  export declare function projectFleetAgentRowsFor(sessionKey: string, rows: readonly FleetAgentRowLike[], nowMs?: number): void;
@@ -1,88 +1,17 @@
1
- /**
2
- * ⇄ B1 批搬迁(2026-07-27,多端改造设计稿 §2.4.1-B):cli src/sema/fleetAgentPanelProjection.ts 逐字搬入(唯一 import = 同批搬入的
3
- * engineAgentPanelStore,包内相对路径不变;壳侧改 re-export)。
4
- * 🔴 REF-CC-041/042(P3 wave2,fleet2-03/04):P1 迁移之后本文件不再是「唯一 import」——同批把
5
- * `TERMINAL_STATUSES` 改成 import `./fleet/fleetProjection.js` 的 `TERMINAL_FLEET_TASK_STATUSES`
6
- * (单源,原副本零测试锁着,分叉理由已不成立)、`rowIdTail` 改 import `./workflow.js`(同包另两个
7
- * 消费者 `fleet/fleetLedger.ts` / `fleet/fleetProjection.ts` 早就这么做,只有本文件是例外)。
8
- * ⚠️ 本文件含**两个字面 NUL 字节**(`${ct.toolName}\0${ct.target}` 的 currentTool 判等键分隔符,
9
- * 语义承载位,搬迁时逐字节保留)—— 副作用:BSD `grep`/`file` 把本文件当二进制,`grep` 不加 `-a`
10
- * 会**静默零命中**(不是「没有」,是「没在找」)。改本文件的探针一律 `grep -a`。
11
- */
12
- /**
13
- * src/sema/fleetAgentPanelProjection.ts — fleet 行帧 lane → Background 面板 local_agent 行的**投影闸**
14
- * (2026-07-26「后台 Agent 子代不进 Background 面板」案;零依赖叶模块,mock 钉直测面)。
15
- *
16
- * ══ 为什么需要这条腿(分诊 = B 类,一手取证)═══════════════════════════════════════════════════
17
- * verify/_bgagent-panel-lane-live-pty.mjs 首跑(engine 1.277.4 真机,真 deepseek):两个
18
- * `run_in_background:true` 的 fork 子代**整跑活跃干活**(footer fleet 树 `◯ fork alpha-probe … 47.8k
19
- * tokens`,token 在涨),同一跑里
20
- * task_progress tick 探针 = 0 条 · fleet 行帧探针 = 24 条
21
- * 面板的 local_agent 行此前**只**由 `task_progress` tick 注册(chrome-agentprogress
22
- * useEngineAgentPanelBridge),而后台子代的 tick 从来没有通道到壳(父 turn 秒收口即关 SSE)——
23
- * 于是产品自印的「N background agents launched (↓ to manage)」把用户指向一个**看不到它们**的面板,
24
- * 且 `ctrl+x ctrl+k … stop all agents` 的渲染门(> 1 running local_agent)在真产品里永不成立。
25
- * 帧**到了壳**、只是走了另一条 lane ⇒ 壳侧可修:把行帧 lane 的 agent 事实也投影进 AppState.tasks。
26
- *
27
- * ══ CC 220 对位 ═══════════════════════════════════════════════════════════════════════════════
28
- * CC 2.1.220 `esi`(BackgroundTasksDialog)的 Local agents 分节就是
29
- * Object.values(tasks).filter(isBackgroundTask) → .filter(ge => ge.type === "local_agent" && ge.id !== i)
30
- * → { key:"local-agents", header: zEt({label:"Local agents", size: y.length}) }
31
- * (cc-decoded/pretty220.js:860404 起的 filter 串 + 860812 的分节表)。所以正确的修法是**让这些子代
32
- * 成为 running 的 local_agent 行**,而不是新造分节/新造行形 —— 面板形状一个字都不动。
33
- *
34
- * ══ 本模块的规矩 ═══════════════════════════════════════════════════════════════════════════════
35
- * ① 只发**变化**:同一行 status/tokens 没变就不发事件(footer 每秒 tick 两次,无脑发 = 每秒两次
36
- * setAppState 全树重渲)。
37
- * ② 终态行发一次 `end`(幂等台账),并摘除常驻标 —— 与 bg_notification 合成链同一个 settle 边,
38
- * 两边先到先得,消费端 settle 本身幂等(running 才动)。
39
- * ③ 缺席上报(0.72.12 CC-50 改形):行从投影集里消失且**超过宽限窗**仍没见终态 ⇒ 经**独立缺席口**(`publishEngineAgentPanelAbsence`,0.72.13;不上主通道)
40
- * 上报一条(**不是** `end`、**不** settle)。此前这里「按 completed settle」= 把「引擎不再上报这一行」
41
- * 编成「成功」—— 本包手上没有任何载体说明它完没完成(test [7541] 两条现场腿秒级实测:屏上
42
- * ✔ Completed 的真实来源就是这一格;server [7545]:子行随父 run 离场被 `orphaned` 移除,真终局由
43
- * 后续对账周期补发,结构性晚于这个窗)。真终态帧迟到照发那唯一一次 `end`;行回来照发 `fleet-row`。
44
- * 宽限窗内的重连空窗(snapshot 清表)不上报;lastSeen 恒**先**按本次在场行刷新、再判缺席,所以
45
- * footer 长时间卸载后重挂也不误报。
46
- * ④ 行 id 尾段判(`${runId} ${taskId}` 复合形取尾;真机 1.277.4 上子行 id 是裸 a+16hex,复合形是
47
- * run 发布器双生行的形)——REF-CC-042:与同包 `workflow.rowIdTail` 同一个函数(import,不再
48
- * 就地维护第二份;该函数出过等价性事故,0.1.1 修,见 `workflow.ts` 头注)。
49
- */
50
1
  import { isStaleEngineAgentPanelEnd, publishEngineAgentPanelAbsence, publishEngineAgentPanelEvent } from './engineAgentPanelStore.js';
51
2
  import { __resetPanelRunningHistoryForTests, notePanelRowRunning, panelRowUnknownToConsumer, panelRowEndedIdentity, holdNewbornTerminalRow, peekHeldNewbornTerminalRow, dropHeldNewbornTerminalRow } from './panelRunningHistory.js';
52
3
  import { rowIdTail } from './workflow.js';
53
4
  import { TERMINAL_FLEET_TASK_STATUSES } from './fleet/fleetProjection.js';
54
5
  import { DEFAULT_SESSION_KEY } from './sessionSlot.js';
55
- // L-215+(0.65.0;core [6908]):「非成功终局」的单铸谓词(与 notifications 的同名位同源)。
56
6
  import { isTerminalNotSuccess } from './runTerminal.js';
57
- /** 行从投影集消失多久之后上报 `absent`(0.72.12 起不再 settle;重连空窗 / snapshot 清表远小于此)。名字沿用(公面导出)。 */
58
7
  export const ABSENT_SETTLE_MS = 30_000;
59
- /** REF-CC-045(fleet2-07):settled 条目的回收期 —— settle 后这么久仍未再被投影 ⇒ 台账整条
60
- * delete,给 `fleetAgentProjectionSizeFor()` 一个上界(此前 `seen` 只增不减,长会话里每个
61
- * 跑过的 bg 子代永久占一条)。settle 事件已经发过,消费端 settle 幂等,delete 对外无事件。
62
- *
63
- * 🔴 [2393] notif-F13 / sweep-F7(2026-08-03 全窗复审)**两处纠**(判据换轴 + 范围如实):
64
- * (a) 回收判据从 `lastSeenAt` 换成 **`settledAtMs`**(settle 那一刻的钟)。上一版 ③ 缺席兜底
65
- * 把条目标 `settled:true` 时**保留旧的 lastSeenAt**,紧接着 ④ 在**同一次调用**里用
66
- * `nowMs - lastSeenAt > 120s` 判回收 ⇒ 面板卸载超过 120s 再挂回来时,那条行「刚被 settle
67
- * 就立刻被删」,而 `prev?.settled` 正是「终态 end 只发一次」的**唯一**判据 —— 去重记号随
68
- * 条目一起消失,同 taskId 的迟到终态帧会再发一次 `fleet-row`+`end`。
69
- * 换轴之后「settle 后至少保留一个回收期」成为真的。
70
- * (b) 回收只对**本次投影里已不在场**的条目成立(`!present.has(taskId)`)。仍在场的终态行不删:
71
- * 删了它下一拍 `prev === undefined` 会**重发 end**,每拍一次,比不删坏得多。
72
- * ⇒ 上界的如实表述:**不再被投影的条目会被回收**;仍被持续投影的终态行由投影集自身定界
73
- * (它的大小是引擎/宿主列出来的行数,不是本台账的无界累积)。ledger 里 REF-CC-045 的问题
74
- * 陈述「只增不减」覆盖的正是前半场,后半场此前被说成也已解决,那句话不成立。 */
75
8
  const SETTLED_RETENTION_MS = ABSENT_SETTLE_MS * 4;
76
- /** currentTool 判等键(POST-MERGE 行每秒重发同值,只有键变了才算变化)。 */
77
9
  function currentToolKeyOf(ct) {
78
10
  if (!ct || typeof ct.toolName !== 'string' || ct.toolName.length === 0)
79
11
  return undefined;
80
12
  return `${ct.toolName}\u0000${ct.target ?? ''}`;
81
13
  }
82
- /** REF-CC-045(fleet2-07):per-sessionKey 台账(W1 同款 `Map<sessionKey, Map<...>>` 形)。 */
83
14
  const seen = new Map();
84
- // 0.74.5 CC-86:「发布过 running 而尚未结掉」的行 id 在 `panelRunningHistory.ts`(进程级共享叶;写方 = 本投影的非终态帧,
85
- // 销账方 = 面板漏斗的任何 lane 的 end(通知车道的 end 不经本投影),读方 = 下面的终态分支)。
86
15
  function seenFor(sessionKey) {
87
16
  let m = seen.get(sessionKey);
88
17
  if (!m) {
@@ -91,42 +20,22 @@ function seenFor(sessionKey) {
91
20
  }
92
21
  return m;
93
22
  }
94
- /**
95
- * 测试钩:清投影台账 —— **全部 sessionKey**,不是只清 default 桶。
96
- *
97
- * 🔴 回炉定谳(P3 wave2 复审 blocker④):per-session 化那一批一度把它收窄成
98
- * `resetFleetAgentPanelProjectionFor(DEFAULT_SESSION_KEY)`。它的契约是「清投影台账」,不是一个
99
- * 会话语义位 —— 收窄等于给多会话宿主的用例之间留一条跨用例串扰通道(用例 A 先
100
- * `projectFleetAgentRowsFor('sess-b', …)`,用例间调零参 reset,`sess-b` 桶存活 ⇒ 下个用例首次
101
- * 投影同 taskId 时 `prev` 非空且 `settled:true`,`fleet-row`/`end` 被去重门吞掉)。
102
- * 对位实现同形:`fleet/fleetLedger.__resetFleetLedgerRegistryForTests()` = `liveBgViews.clear()`;
103
- * W1 段五个槽位的现成规约也逐个钉的是「reset 清全部键」。
104
- * 要只清一个会话请用 `resetFleetAgentPanelProjectionFor(sessionKey)`。
105
- */
106
23
  export function resetFleetAgentPanelProjection() {
107
24
  seen.clear();
108
25
  __resetPanelRunningHistoryForTests();
109
26
  }
110
- /** W1 keyed variant(REF-CC-045):只清**这一个会话**的桶。 */
111
27
  export function resetFleetAgentPanelProjectionFor(sessionKey) {
112
28
  seen.delete(sessionKey);
113
29
  }
114
- /** 台账读面(测试/诊断):当前记着的行数。 */
115
30
  export function fleetAgentProjectionSize() {
116
31
  return fleetAgentProjectionSizeFor(DEFAULT_SESSION_KEY);
117
32
  }
118
- /** W1 keyed variant。 */
119
33
  export function fleetAgentProjectionSizeFor(sessionKey) {
120
34
  return seen.get(sessionKey)?.size ?? 0;
121
35
  }
122
- /**
123
- * 把一次 fleet 投影(已经过 own 判别 + workflow belt 的 FleetTask[])喂给面板事件流。
124
- * 幂等、无副作用地重复调用安全 —— 每秒被 footer 调用两次就是常态。
125
- */
126
36
  export function projectFleetAgentRows(rows, nowMs = Date.now()) {
127
37
  projectFleetAgentRowsFor(DEFAULT_SESSION_KEY, rows, nowMs);
128
38
  }
129
- /** W1 keyed variant(REF-CC-045):多会话宿主每会话一份台账,互不顶盖。 */
130
39
  export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
131
40
  const seenMap = seenFor(sessionKey);
132
41
  const present = new Set();
@@ -138,74 +47,40 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
138
47
  continue;
139
48
  present.add(taskId);
140
49
  const status = row.status ?? 'running';
141
- // 0.73.0:三态 —— 帧上真给了非负整数才算数;缺席 / 坏形 ⇒ 沿用已知值(粘性),从没报过就是 undefined。
142
- // 此前 `?? 0`:首帧发布 `totalTokens:0`(面板渲「0 tokens」),已知之后来一帧缺席又发布 0 把用量清零。
143
50
  const wireTokens = typeof row.tokens === 'number' && Number.isInteger(row.tokens) && row.tokens >= 0 ? row.tokens : undefined;
144
- const tokens = wireTokens; // 粘性在下面(拿到 prev 与周期锚之后)补
145
- // 🔴 三态直取:`row.toolUses` 缺席就是 undefined,这里**不许**兜 0(见 FleetAgentRowLike 注)。
51
+ const tokens = wireTokens;
146
52
  const toolUses = typeof row.toolUses === 'number' ? row.toolUses : undefined;
147
53
  const transcriptId = row.transcriptId || undefined;
148
54
  const parentToolCallId = typeof row.parentToolCallId === 'string' && row.parentToolCallId.length > 0 ? row.parentToolCallId : undefined;
149
- // 🔴 形核与周期判据(`isStaleEngineAgentPanelEnd` / `isNewEngineAgentPanelCycle`)**逐字同源**:
150
- // 有限正数才算数。少一个 `Number.isFinite` 就会让 `Infinity` 进台账 —— 那两只判据按缺席看它,
151
- // 而本层按在场看它,同一帧在两处得出相反的「可比不可比」。
152
- // `Infinity` 还会被序列化成 `null` 发给消费端,渲成一个不存在的 launch 时刻。
153
55
  const startedAt = typeof row.startedAt === 'number' && Number.isFinite(row.startedAt) && row.startedAt > 0 ? row.startedAt : undefined;
154
- // 0.74.0:代际号(正整数才算;坏形 / 缺席 ⇒ undefined,绝不补 1)。
155
56
  const cycleSeq = typeof row.cycleSeq === 'number' && Number.isInteger(row.cycleSeq) && row.cycleSeq >= 1 ? row.cycleSeq : undefined;
156
57
  const currentTool = currentToolKeyOf(row.currentTool) !== undefined ? row.currentTool : undefined;
157
58
  const currentToolKey = currentToolKeyOf(row.currentTool);
158
59
  const prev = seenMap.get(taskId);
159
- // 0.74.0(异源对抗复审 R1):行上已是更新的一代,这一帧却是更早的一代 ⇒ 前代迟到帧。整只跳过:不发 fleet-row
160
- // (它会把消费端记的周期身份改写回旧代,让随后的 end{旧代} 过陈旧判据)、不发 end、不动台账(否则台账被标
161
- // settled,新一代的真终态就被去重吞掉)。在场已记 ⇒ 不会因此误报缺席。
162
- // 判据与消费端同一条(`isStaleEngineAgentPanelEnd`:cycleSeq 优先,startedAt 回退)—— 只比 cycleSeq 会让只带
163
- // startedAt 的前代帧漏网(异源对抗复审 R2)。
164
60
  const rowIdentity = { ...(cycleSeq !== undefined ? { cycleSeq } : {}), ...(startedAt !== undefined ? { startedAt } : {}) };
165
61
  const prevIdentity = prev !== undefined
166
62
  ? { ...(prev.cycleSeq !== undefined ? { cycleSeq: prev.cycleSeq } : {}), ...(prev.startedAt !== undefined ? { startedAt: prev.startedAt } : {}) }
167
63
  : undefined;
168
64
  if (prev !== undefined && isStaleEngineAgentPanelEnd(rowIdentity, prevIdentity))
169
65
  continue;
170
- /** 这一帧的周期身份**可证明**比台账上的新(同一条规则反向)。 */
171
66
  const rowNewerCycle = prev !== undefined && isStaleEngineAgentPanelEnd(prevIdentity, rowIdentity);
172
- // 🔴 粘性只在**同一周期**内成立:上一条已 settle(同 id 复活 = 新周期)或 launch 锚换了 ⇒ 不继承上一周期的用量
173
- // (否则新周期首帧没报 tokens 时会把上一周期的数当成当前读数发布;异源对抗复审)。
174
67
  const sameCycle = prev !== undefined &&
175
68
  !prev.settled &&
176
69
  (startedAt === undefined || prev.startedAt === undefined || prev.startedAt === startedAt) &&
177
- // 0.74.0:代际号变了同样是新周期(两条都报了才比;任一条没报 = 这一帧没说)
178
70
  (cycleSeq === undefined || prev.cycleSeq === undefined || prev.cycleSeq === cycleSeq);
179
71
  const knownTokens = tokens !== undefined ? tokens : sameCycle ? prev?.tokens : undefined;
180
- // 本周期已知的 launch 锚:帧上给了用帧上的,没给则同周期沿用。🔴 它随**每一条** fleet-row 发布(不只是变化那一帧)——
181
- // 事件缓冲靠它判「这两条部分帧是不是同一周期」;缺锚的部分帧会让跨周期合并绕过屏障(异源对抗复审 [high])。
182
- // 🔴 身份的沿用与用量的沿用是两回事(异源对抗复审 R3):用量只在**活着的同周期**内粘(`sameCycle` 要求
183
- // !prev.settled);身份只要这一帧**不可证更新**就沿用 —— 同周期重复的终态帧若把记住的 startedAt / cycleSeq
184
- // 抹掉,下一代只带另一半身份时就判不出「更新」,被 settled 吞掉。
185
72
  const carryIdentity = prev !== undefined && !rowNewerCycle;
186
73
  const knownStartedAt = startedAt !== undefined ? startedAt : carryIdentity ? prev.startedAt : undefined;
187
74
  const knownCycleSeq = cycleSeq !== undefined ? cycleSeq : carryIdentity ? prev.cycleSeq : undefined;
188
75
  if (TERMINAL_FLEET_TASK_STATUSES.has(status)) {
189
- // ② 终态一次性 settle(幂等台账;消费端 settle 也幂等)。0.74.0:去重按**周期** —— 已 settle 的是上一代、这一帧是
190
- // 更新的一代(中间没见到 running 帧)⇒ 新周期的终态照发,不被上一代的 settled 吞掉。
191
- // 🔴 0.74.5 CC-86(cli L-415):**首次见到就已终态**的行(prev 缺席)零事件 —— 只在台账记 settled。此前先发 fleet-row
192
- // (交最终用量)再发 end ⇒ 宿主为本会话从没跑过的任务建行随即 settle = 面板幽灵完成行(reattach / resume 后引擎
193
- // fleet 列表里的历史终态行全部上屏)。本会话内起步又结束、面板从没见过 running 的后台任务由通知车道的 end 收尸;
194
- // 复活(prev 已 settled 且这一帧周期更新)不在此列,照发。
195
- // 0.75.0 W2:「首见」= 消费端没有这一行(没发布过 running **也没递达过 end**);通知 end 先到的短命子代 ⇒ 终态行照发(交最终用量,不再第二次 end)。
196
76
  const newbornTerminal = prev === undefined && panelRowUnknownToConsumer(taskId);
197
77
  const settledThisCycle = prev?.settled === true && !rowNewerCycle;
198
- // 结过的行(本进程递达过 end)再来终态帧:同代或判不出代际 = 短命子代的最终用量到了 ⇒ 只发 fleet-row、不再第二次 end;
199
- // 可证更新的一代 = 结过之后复活又结束 ⇒ 照发 fleet-row + end。
200
78
  const endedRec = prev === undefined ? panelRowEndedIdentity(taskId) : undefined;
201
79
  const frameCycle = { ...(cycleSeq !== undefined ? { cycleSeq } : {}), ...(startedAt !== undefined ? { startedAt } : {}) };
202
- // 方向判(异源复审 R3 [high]:只判「不等」会把迟到的前代终态当成新一代 ⇒ 倒写用量 + 第二次 end):
203
- // 帧可证比已结周期**旧** ⇒ 整帧丢(不进台账,不发);可证**新** ⇒ 复活又结束,fleet-row + end;同代 / 判不出 ⇒ 只补用量。
204
80
  if (endedRec !== undefined && isStaleEngineAgentPanelEnd(frameCycle, endedRec))
205
81
  continue;
206
82
  const endedSameCycle = endedRec !== undefined && !isStaleEngineAgentPanelEnd(endedRec, frameCycle);
207
83
  if (newbornTerminal) {
208
- // 反序保护:end 也许下一拍才到 ⇒ 终态行(带用量)缓在历史叶里,end 到漏斗时先放它再放 end;真历史行永远等不到 end,缓着直到被挤掉。
209
84
  holdNewbornTerminalRow(taskId, {
210
85
  kind: 'fleet-row',
211
86
  taskId,
@@ -220,13 +95,8 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
220
95
  });
221
96
  }
222
97
  else if (!settledThisCycle) {
223
- // 终态行也把最后一拍的累计工具数/转录锚带上:详情页在行翻终态后仍要显示真计数与
224
- // 委派 prompt,而终态帧常常是这一行**唯一**带全 usage 的一帧(bg lane 只在活动边界发行帧)。
225
- if (
226
- // 0.74.0:周期身份本身推进(或首帧就带身份)也是变化 —— 消费端要先记下身份才能对 end 判陈旧。
227
- rowNewerCycle ||
228
- (cycleSeq !== undefined && prev?.cycleSeq !== cycleSeq) || // 含首帧(prev 缺席)就带身份的终态
229
- // 最终用量也算(终态帧常是唯一带全 usage 的一帧;消费端不更新非 running 行 ⇒ 必须赶在 end 之前发)
98
+ if (rowNewerCycle ||
99
+ (cycleSeq !== undefined && prev?.cycleSeq !== cycleSeq) ||
230
100
  (tokens !== undefined && prev?.tokens !== tokens) ||
231
101
  (toolUses !== undefined && prev?.toolUses !== toolUses) ||
232
102
  (transcriptId !== undefined && prev?.transcriptId !== transcriptId) ||
@@ -249,11 +119,7 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
249
119
  publishEngineAgentPanelEvent({
250
120
  kind: 'end',
251
121
  taskId,
252
- // L-215② 族扫(0.65.0):与 `notifications.enqueueBgChildNotification` 的 `isError` 位
253
- // **同一个病形**(内联两词 ⇒ core [6908] 的 `blocked` 漏成「成功」)。两处一次改齐,
254
- // 读同一个单铸谓词;只修当格 = 下一次加词又漏一处。
255
122
  isError: isTerminalNotSuccess(status),
256
- // 0.74.0:这条终态属于哪个周期(在场才带)—— 消费端据此挡掉上一周期迟到的 end。
257
123
  ...(knownCycleSeq !== undefined ? { cycleSeq: knownCycleSeq } : {}),
258
124
  ...(knownStartedAt !== undefined ? { startedAt: knownStartedAt } : {}),
259
125
  });
@@ -269,36 +135,18 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
269
135
  currentToolKey: currentToolKey !== undefined ? currentToolKey : prev?.currentToolKey,
270
136
  lastSeenAt: nowMs,
271
137
  settled: true,
272
- // notif-F13:settle 时刻只在**首次** settle 时铸(重复投影的终态行不许一路续命回收期)。
273
138
  settledAtMs: prev?.settled ? prev.settledAtMs : nowMs,
274
139
  absentReportedAtMs: undefined,
275
140
  });
276
141
  continue;
277
142
  }
278
- // 🔴 0.75.1:缓着一条「首见即终态」的行时,后到的 running 帧有**三向**(0.75.0 是无条件作废 ⇒ 同代陈旧快照
279
- // 把终态那条的最终用量顶掉,面板最后显示的是快照里的小数字):
280
- // · **可证同代**(两侧有可比的同一种周期键且相等)= 陈旧快照 —— 与终态分支 `settledThisCycle` 同律:
281
- // 整帧不落地(零事件、台账保持 settled),缓行留着等 end;
282
- // · **可证更新** ⇒ 真复活:照发 running 行,缓着的前代终态行作废(下面那句 drop);
283
- // · **判不出**(任一侧没有可比的周期键)⇒ 维持 0.75.0 的行为(当复活、作废缓行)—— 缺席不制造周期,
284
- // 这一向是**已知并接受**的限制(接入文档的缺口行有记)。
285
- // 「可证更旧」不在这三向里:它在本循环开头就被 `isStaleEngineAgentPanelEnd(rowIdentity, prevIdentity)` 整只跳过了。
286
- // 可比性只由**帧自带的**两键与台账里记着的两键决定(不能用 `knownCycleSeq` / `knownStartedAt` —— 那两位会把
287
- // 缺席沿用成「与台账相等」,把「判不出」误判成「可证同代」)。判据与 `isNewEngineAgentPanelCycle` 的前件同形。
288
143
  const cycleComparable = (cycleSeq !== undefined && prev?.cycleSeq !== undefined) || (startedAt !== undefined && prev?.startedAt !== undefined);
289
- // 🔴 再加一道 `prev.settled` 的窄化:缓行只由**终态**分支铸(铸完台账即 settled),所以「缓着行而台账说它在跑」
290
- // 在本会话的台账里不可达;写出来是为了让这一格永远只对**结过的行**生效 —— 缓行表是进程级、seenMap 是按
291
- // sessionKey 分桶的两个作用域,不写这一句的话,别的会话缓的行会让本会话一条真在跑的行被判成陈旧快照。
292
144
  const staleSnapshotOverHeldRow = prev !== undefined && prev.settled === true && cycleComparable && !rowNewerCycle && peekHeldNewbornTerminalRow(taskId) !== undefined;
293
145
  if (staleSnapshotOverHeldRow)
294
146
  continue;
295
- // ① 只发变化(新行 / status 翻 / token 涨 / 累计工具数涨 / 转录锚首次到)。
296
- // 🔴 后两项的比较是**单向**的:只有「这一帧真给了值且与台账不同」才算变化。帧上**缺席**
297
- // 不算变化(缺席=引擎这帧没说,不是「回到不知道」)——否则新旧引擎混发时台账会在
298
- // 值↔undefined 之间来回抖,每秒白发两次事件。
299
147
  if (!prev ||
300
148
  prev.settled ||
301
- prev.absentReportedAtMs !== undefined || // 行回来了:即使值未变也发一条,消费端据此撤掉 absent 标
149
+ prev.absentReportedAtMs !== undefined ||
302
150
  prev.status !== status ||
303
151
  prev.tokens !== knownTokens ||
304
152
  (toolUses !== undefined && prev.toolUses !== toolUses) ||
@@ -307,15 +155,14 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
307
155
  (startedAt !== undefined && prev.startedAt !== startedAt) ||
308
156
  (cycleSeq !== undefined && prev.cycleSeq !== cycleSeq) ||
309
157
  (currentToolKey !== undefined && prev.currentToolKey !== currentToolKey)) {
310
- notePanelRowRunning(taskId); // CC-86:真发布了这一行在跑才记历史(未变的陈旧快照零事件也零记账,复审 R3)
311
- dropHeldNewbornTerminalRow(taskId); // 复活为 running ⇒ 缓着的旧终态行作废(用量以新一代为准);可证同代的陈旧快照到不了这里(三向判定,见上)
158
+ notePanelRowRunning(taskId);
159
+ dropHeldNewbornTerminalRow(taskId);
312
160
  publishEngineAgentPanelEvent({
313
161
  kind: 'fleet-row',
314
162
  taskId,
315
163
  ...(row.name ? { name: row.name } : {}),
316
164
  ...(row.description ? { description: row.description } : {}),
317
165
  ...(knownTokens !== undefined ? { totalTokens: knownTokens } : {}),
318
- // 🔴 缺席即不落键(消费端据「键在不在」判三态)。
319
166
  ...(toolUses !== undefined ? { toolUses } : {}),
320
167
  ...(transcriptId !== undefined ? { transcriptId } : {}),
321
168
  ...(parentToolCallId !== undefined ? { parentToolCallId } : {}),
@@ -324,7 +171,6 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
324
171
  ...(currentTool !== undefined ? { currentTool } : {}),
325
172
  });
326
173
  }
327
- // 台账对这几位是**粘性**的:缺席帧不擦掉已知值(同上的单向语义)。
328
174
  seenMap.set(taskId, {
329
175
  status,
330
176
  tokens: knownTokens,
@@ -336,30 +182,19 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
336
182
  currentToolKey: currentToolKey !== undefined ? currentToolKey : prev?.currentToolKey,
337
183
  lastSeenAt: nowMs,
338
184
  settled: false,
339
- settledAtMs: undefined, // 又活了 ⇒ 回收钟归零(重新 settle 时重铸)
340
- absentReportedAtMs: undefined, // 在场 ⇒ 缺席周期结束(下次再消失是新周期,会再上报一次)
185
+ settledAtMs: undefined,
186
+ absentReportedAtMs: undefined,
341
187
  });
342
188
  }
343
- // ③ 缺席上报 —— 必须在【本次在场行全部刷完 lastSeen 之后】判,否则 footer 长时间卸载后重挂
344
- // 会把仍在跑的行按「陈旧」误报。🔴 0.72.12 CC-50:这里只发 `absent`,**不** settle、不铸 end ——
345
- // 缺席不是终局,本包不替引擎下这个断言;真终态帧迟到照走 ② 发那唯一一次 end(去重记号不被缺席占用)。
346
189
  for (const [taskId, s] of seenMap) {
347
190
  if (present.has(taskId) || s.settled || s.absentReportedAtMs !== undefined)
348
191
  continue;
349
192
  const absentForMs = nowMs - s.lastSeenAt;
350
193
  if (absentForMs <= ABSENT_SETTLE_MS)
351
194
  continue;
352
- // 🔴 0.72.13:走**独立缺席口**,不上主通道(老消费者的裸 else = sweep 体,会把新 kind 当 sweep;见 store 头注 / DS-07)。
353
195
  publishEngineAgentPanelAbsence({ taskId, lastSeenAtMs: s.lastSeenAt, absentForMs });
354
196
  seenMap.set(taskId, { ...s, absentReportedAtMs: nowMs });
355
197
  }
356
- // ④ REF-CC-045(fleet2-07):settled 条目回收 —— 给台账一个上界(此前只增不减)。settle 已发过
357
- // 事件,delete 对外无事件,消费端 settle 本身幂等。
358
- // [2393] notif-F13/sweep-F7 两处纠(判据见 SETTLED_RETENTION_MS 头注):
359
- // · 锚 `settledAtMs`(settle 那一刻)而不是 `lastSeenAt`(最后一次被投影);
360
- // · 只回收**已不在场**的条目 —— 仍在场的终态行删了会每拍重发 end。
361
- // 0.72.12:已上报 absent 且始终不再在场的条目同样有上界 —— 锚 `absentReportedAtMs`(上报那一刻),
362
- // 回收后迟到的终态帧仍会发恰一次 end(prev 缺席 ⇒ 首次 settle),行回来则按新行重建。
363
198
  for (const [taskId, s] of seenMap) {
364
199
  if (present.has(taskId))
365
200
  continue;
@@ -1,43 +1,4 @@
1
- /**
2
- * ⇄ B1 批搬迁(2026-07-27,多端改造设计稿 §2.4.1-B):cli src/sema/fleetTaskDesc.ts 逐字搬入(零依赖;壳侧改 re-export)。
3
- */
4
- /**
5
- * src/sema/fleetTaskDesc.ts — footer fleet 行「label/描述列」纯投影助手(零依赖,从 fleetClient.ts 提出
6
- * 供单测直取——fleetClient 拖 SDK/appState/notification 重图,无法轻量 bundle;行为与提出前逐字同源)。
7
- */
8
1
  export declare function escapeDisplayControlChars(s: string): string;
9
- /**
10
- * UNTRUSTED-for-display 呈前处理的**共用铸点**:**先转义、后按转义结果封长**。
11
- *
12
- * 🔴 顺序反过来会让承诺的显示预算失守 —— {@link escapeDisplayControlChars} 把每个不可见字符
13
- * 改写成 6 字符的 `\uXXXX`,先按原文截长再转义,会把一段纯控制字符的 `max` 个原始字符送成
14
- * `6 × max` 个显示字符。屏上的列宽预算是按**显示字符**给的,所以封长必须量转义后的那一份。
15
- * 🔴 相反方向的顾虑(「先转义后截会把一枚转义序列拦腰截断」)由下面两条避让解掉,不构成
16
- * 改回先截后转义的理由:
17
- * · 截点落在一枚 `\uXXXX` token 中间 ⇒ 回退到该 token 之前(留半截 `\u00` 比整枚不渲更坏,
18
- * 它看起来像一个完整答案的开头);
19
- * · 截点落在一对合法代理对(如 emoji)中间 ⇒ 回退一位。`DISPLAY_UNSAFE` 只转义**孤**代理项,
20
- * 合法对被放行原样透传,在这里截断等于人为造一枚裸高位代理项留在末尾。
21
- *
22
- * 语义:返回值恒是**已消毒**的串,长度 ≤ `max`(可能因避让短于 `max`)。`max <= 0` ⇒ 空串。
23
- *
24
- * ⇄ 本函数是本包该族的**唯一**实现(0.62.0 起):operator 面的 READ 档位读器、写保护姿态行、
25
- * SQL 姿态行四处此前各写一份,其中三份是先截后转义 —— 同形存量清剿后一律接这一只。
26
- */
27
2
  export declare function capForDisplay(raw: string, max: number): string;
28
- /** collapse a wire label to a single trimmed line (drops embedded newlines/runs). 187 row labels are always
29
- * one short line; the <FleetTree/> column (Math.min(28,…) + wrap="truncate") does the visible ellipsis, so we
30
- * only normalize here — no double-ellipsis, faithful to the 187 render.
31
- * #307:折叠之后再过 {@link escapeDisplayControlChars} —— `\s+` 折叠管不到 C0 非空白段/C1(NEL)/
32
- * 双向控制符/孤代理项,那四族原样透到终端就是「一行」这个结构账被绕过。空/非空判定不变
33
- * (可见转义不产生空白,`|| fallback` 那些调用点的真假面照旧)。 */
34
3
  export declare function collapseLabel(s: string): string;
35
- /** CC row-body fallback(CC 真身锚 2026-07-20 人类剧本帧:`◯ general-purpose t1calc`——row body 从第一帧
36
- * 起就是 Agent 工具的 description)。引擎子行帧不带 `description` 字段,任务描述只在 `name` 里,且有两形
37
- * (07-24 D2 wire 实证,engine 1.271.0 帧 dump):
38
- * ① 出生帧:name = `${agentType}: ${description}` 合成形(如 "fork: t1calc")→ 剥前缀复原;
39
- * ② 后续帧:引擎把 name 重写为【裸任务描述】(如 "t1calc",无前缀)→ 直接按描述投影——
40
- * 修前只认①,②一到描述列即塌空(footer 只剩 `◯ fork`,D2 症状)。
41
- * 防重复列 belt:裸 name 恰为 identity 回声(=agentType 或 =agentName)时不当描述(label 列已渲它)。
42
- * 纯投影非双源;真进度(last tool name)到帧后仍然优先(调用侧 projectDescription 先行)。 */
43
4
  export declare function taskDescFromName(name: string | undefined, agentType: string | undefined, agentName?: string): string;