@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,78 +1,10 @@
1
- /**
2
- * mcpLiveness.ts — 引擎托管的 MCP 服务器**活性观察**(`wiring_manifest.mcp[].liveness`)的三端共用
3
- * **结构读口** + 三词闭集词表 + 腿级判词(CC-36,0.76.1)。引擎内核自 7.24.3 起铸这一格,服务端的转发层自 7.91.2 起把它送上 wire ——
4
- * 更老的服务端上这一格**恒缺席**(读数 = `indeterminate`,正是缺席语义要兜的那一档,不是故障)。
5
- *
6
- * ── 这一格答的是哪一个问题 ────────────────────────────────────────────────────────────────────
7
- * 「这台服务器**还够得着吗**」。引擎不为它发任何自己的流量 —— 每条记录都是那条腿**已经做过的工作**
8
- * (拨号、re-dial、传输关闭、一次发现传输没了的请求)顺带盖的章,自带盖章时刻 `observedAt`。
9
- * ⇒ 它是**每条腿的一张快照**,不是心跳、不是轮询、更不是「此刻」。
10
- *
11
- * 🔴 **同一行上的三个位各说各的,谁都不许顶替谁、不许互相校验、不许据其一推另一个**:
12
- * · `status`(申报 / 连接时判决)—— 这条腿**拨号那一刻**的判词,引擎**有意冻结**它(服务器中途死了这一格
13
- * 仍读 `connected`);
14
- * · re-dial 回执的 `outcome`(动作判决)—— **一次动作**的判词,过去式;
15
- * · `liveness`(本件)—— 连接层**最后学到的那件事**,自带时戳。
16
- * 最直白的一格:`status: 'failed'` 与 `liveness.state: 'reachable'` **同一行并存是真行** —— 服务器答了
17
- * 握手、答的是协议错(**活着,且配错了**)。判据是「两格都在」,不是「两格一致」。
18
- *
19
- * ── 🔴 四种读数(三个词 + 缺席),缺席**不是**其中任何一个词 ────────────────────────────────────
20
- * · `reachable` —— **一次交换完成了**(连上并列出了,或服务器自己答了 —— MCP 级的拒绝**也是答**,所以
21
- * 它证明够得着,即便那次调用失败);
22
- * · `unreachable` —— 试过,丢在传输或时钟上(拒连 / 重置 / 关闭 / 起不来 / 超时);
23
- * · `unknown` —— **试过,而回来的东西答不了这个问题**(服务器前面那台网关写的 HTTP 状态、非 MCP 载荷、
24
- * 没有结构的抛出值)。它是一句**更强**的断言:引擎看了,看不出来。
25
- * · **缺席 = indeterminate** —— 这一行**没有可用的观察记录**。四个来源在 wire 上**同形**,消费端分不出也
26
- * 不需要分:① 这条腿没走到那台服务器(`status: 'skipped'`);② 那份声明从来没被拨过(`invalid_config`);
27
- * ③ 这是一条老引擎 / 老服务端的帧;④ 上游判形没过、那一格被摘掉了。
28
- * 🔴 **不许据缺席反推「这条腿拨没拨过号」**,也不许把它折进 `unknown`、折成「健康」、折成「关着」。
29
- * 这四句话在本包里是四句不同的话,任何折叠都是「把不知道说成没有 / 说成好着呢」的变体。
30
- *
31
- * ── 为什么是结构读(不靠型面) ─────────────────────────────────────────────────────────────────
32
- * 本包 peer 地板上的 wire 型面里**还没有这一格**(键形是引擎侧先出、型面后出的常态)。所以本件按契约
33
- * **结构读**:从 `unknown` 起按键路径窄化,判据自带(见下),**不抬 peer 地板、不等型面**。安全性不靠型
34
- * 而靠三条:① 三词按**闭集恰等**判,认不得的词一律畸形(词表属主在上游,本包**不放宽**成开集 —— 放宽了
35
- * 就会把一个没人定义过的词当成一句真话往屏上送);② `observedAt` 按**有限数**判;③ 判形没过 ⇒ 这一格
36
- * 摘掉、那一行照读(与上游同判),而摘掉的**理由**留在 {@link McpLivenessCell} 的 `unreadable` 臂上,
37
- * 与「引擎没报」分开。型面出键那天由包侧门逼一次显式处置(见 `run-mcp-liveness-test.mjs` 的上游见证臂)。
38
- *
39
- * ── `errorCode` 只随 `unreachable` ────────────────────────────────────────────────────────────
40
- * 它是那句话的**注脚**(为什么够不着),不是那句话本身。上游的单点铸造保证它**只随 `unreachable`** 出现,
41
- * 理由逐字可查:`unknown` 的全部意思就是「那次失败并没有决定可达性」,把失败类别挂在那个词上等于请消费端
42
- * 拿一份说明不了可达性的证据去决定下一步动作。⇒ 本读口在**非 `unreachable`** 臂上**丢掉这只注脚**
43
- * (整格仍在、`state` 仍读):去掉的恰是上游点名要防的那条误读路,而 `state` 那句话一个字没动。
44
- * 注脚自己形坏(空串 / 非串)同样**只丢它自己不拆整格** —— 代价如实:此时读到的是「够不着,原因没说」,
45
- * **不是**「这条记录坏了」。词按**开集**读(十词闭集的属主在上游,抄一张会把新词吞成缺席)。
46
- */
47
- /**
48
- * 活性词的**三词闭集**(与上游同序:能完成交换 / 完不成 / 答不了)。
49
- *
50
- * 🔴 **它只有三个词**。腿级判词的第四个读数 `indeterminate`(见 {@link McpLegLivenessReading})**不是**
51
- * 本表成员,也绝不许被加进来:本表是**上游的词表**,那第四个读数是**缺席**在本包里的名字。
52
- * 🔴 消费端按本表写的 `switch` 判**恰等**(不 trim、不折大小写、不按前缀猜);上游加词的唯一处置是
53
- * **本表同批加一格 + 补一条读数格**,而不是在消费点放宽判据。
54
- */
55
1
  export declare const MCP_LIVENESS_STATES: readonly ["reachable", "unreachable", "unknown"];
56
- /** {@link MCP_LIVENESS_STATES} 的三个词 —— **由那张表派生**,不另手写一份(两份手写迟早各说一套;本包不依赖上游型面,见文件顶注)。 */
57
2
  export type McpLivenessState = (typeof MCP_LIVENESS_STATES)[number];
58
- /** 一台服务器的**一次**活性观察(读视图;逐键挑,开集键不透传)。 */
59
3
  export interface McpLivenessView {
60
- /** 三词闭集(见 {@link MCP_LIVENESS_STATES});认不得的词不到这里(整格判畸形)。 */
61
4
  state: McpLivenessState;
62
- /** 盖章时刻(epoch 毫秒,有限数)。🔴 它是**那条腿**的观察时刻 —— 不是「此刻」,也不与面板的
63
- * `asOf` 同源,两者**不比**。 */
64
5
  observedAt: number;
65
- /** 够不着的**类别注脚**(开集,上游十词;**只随 `unreachable`** 在场)。缺席 = 原因没说,
66
- * **不是**「这条记录坏了」,更不是第四态。 */
67
6
  errorCode?: string;
68
7
  }
69
- /**
70
- * 一行上这一格的三向读数(**缺席 / 在场读不出 / 一次观察**三句话分开,任何两句都不折)。
71
- * · `absent` —— 键不在场 = 没有可用的观察记录(四源同形,见文件顶注);
72
- * · `unreadable` —— 键**在场**而读不出(整格不是对象 / 词出闭集 / `observedAt` 非有限数)。它与 `absent`
73
- * **不是**一句话:「引擎送了一份我读不懂的」与「引擎没报」对运维是两件事;
74
- * · `observation` —— 读得出的那一次观察。
75
- */
76
8
  export type McpLivenessCell = {
77
9
  kind: 'absent';
78
10
  } | {
@@ -81,99 +13,16 @@ export type McpLivenessCell = {
81
13
  kind: 'observation';
82
14
  liveness: McpLivenessView;
83
15
  };
84
- /**
85
- * 从**一行** MCP 名册条目里读这一格(结构读;单一铸点,别在消费点再写一遍判据)。
86
- *
87
- * 缺席答什么:`{kind:'absent'}` —— 判据是**自有键在不在**(`Object.hasOwn`),不按真值判。原型链上的
88
- * 同名键**永远不会**上 wire,拿它当在场 = 把本进程对象的形状当成引擎说过的话;`null` / `undefined`
89
- * 显式在场是**坏形**(走 `unreadable`),不是缺席形。
90
- * 畸形答什么:`{kind:'unreadable'}` —— 整行不是对象、整格不是对象(含 `null` / 数组 / 串 / 数)、
91
- * `state` 不是三词之一(含空串、近形拼法、大小写变体)、`observedAt` 非有限数(含缺席 / 串 / `NaN`)。
92
- * 🔴 **绝不**折成 `{kind:'absent'}`(会把「送来一份读不懂的」说成「引擎没报」),更**绝不**折成
93
- * `reachable` 或任何一个词(那是把读不出说成好着呢)。
94
- * 为什么不折:这三句话在本包下游各对一种不同的处置 —— 缺席 = 什么都不渲(**不许**渲「一台都够不着」也
95
- * **不许**渲「都好着」);读不出 = 渲「这一格读不出」并让运维去看引擎版本与投影层;观察 = 渲那个词
96
- * + 那个时刻。折任何一对,渲出来的都是一句谁都没说过的话。
97
- *
98
- * ⚠️ 本口**只读这一格**:同行的 `status` / `errorCode` / `delivered` 一个字节都不碰,也不拿它们互相校验
99
- * (三个位各说各的,见文件顶注)。
100
- */
101
16
  export declare function readMcpLiveness(row: unknown): McpLivenessCell;
102
- /**
103
- * 腿级判词能吃的**最小行形**(结构型入参:凡带这两格的行视图都喂得进来,本口刻意不与某一张具体的
104
- * 行视图型耦合 —— 活体腿的名册与面板上那条腿的回放是**同一只读器**的产物,判词也只该有一份)。
105
- */
106
17
  export interface McpLivenessBearingRow {
107
- /** 读得出的那次观察(缺席 = 这一行没有可用观察,或那一格读不出 —— 后者看 {@link livenessUnreadable})。 */
108
18
  liveness?: McpLivenessView;
109
- /** never false:这一行的活性格**在场而读不出**(与整格缺席不是一句话)。 */
110
19
  livenessUnreadable?: true;
111
20
  }
112
- /**
113
- * 一条腿的活性读数:三个词 + `indeterminate`(= 这条腿上**没有任何在场的活性格**)。
114
- *
115
- * 🔴 `indeterminate` **不是**上游词表的成员(词表仍是三词,见 {@link MCP_LIVENESS_STATES})——
116
- * 它是**缺席**在本包里的名字,存在的全部理由就是不让缺席借用那三个词里的任何一个。
117
- */
118
21
  export type McpLegLivenessReading = McpLivenessState | 'indeterminate';
119
- /** 一条腿的活性判词 + 它的两条诚实附注。 */
120
22
  export interface McpEngineLegHealth {
121
- /** 判词(四读数;合成规则见 {@link mcpLivenessRollupOf})。 */
122
23
  reading: McpLegLivenessReading;
123
- /** never false:这条腿上**至少有一行**的活性格在场而读不出(判词为什么退到 `unknown` 的分辨位)。 */
124
24
  unreadableCells?: true;
125
- /**
126
- * **判词那个词自己的**观察时刻(epoch 毫秒)= 带着决定 {@link reading} 那个词的那些行里**最新的**一格。
127
- *
128
- * 🔴 刻意**不是**「这条腿上所有观察里最新的那一格」(异源对抗复审 r1 [medium] 采纳,真病):一行在
129
- * t=1000 观察到 `unreachable`、另一行在 t=900000 观察到 `reachable` 时,跨行取最大会让「至少有一台
130
- * 够不着」这句判词后面跟上一个**属于那次成功观察**的时刻 —— 运维会把一次旧故障读成刚刚又被确认一次。
131
- * ⇒ 时刻与判词**同源**:判词说 `unreachable`,这一格就是最新那次 `unreachable` 的时刻。
132
- * 🔴 在场 iff 有**读得出的观察**决定了判词:`indeterminate` 上永不在场;判词是 `unknown` 而**只**由
133
- * 「在场读不出」的格决定(没有一格读得出)时同样不在场 —— 读不出的格没有可用时刻,编一个就是造读数。
134
- * ⚠️ 它是**那条腿**的观察时刻,不是「此刻」,也与面板的 materialize 时刻不同源、**不比**。
135
- * 别的词那些行的时刻本口不铸(要逐行时刻就读行视图,不要从一个聚合值反推某一行)。
136
- */
137
25
  observedAt?: number;
138
26
  }
139
- /**
140
- * 一条腿的名册 → 活性判词(**唯一铸点**:别在各端的状态行装配里另写一遍这套合成规则)。
141
- *
142
- * 合成规则 = **最坏事实优先**,不是多数票、不是取最新一格:
143
- * ① 任一行 `unreachable` ⇒ `unreachable`(有一台**可证**打不通时说「够得着」,就是把坏消息折成健康);
144
- * ② 否则任一行 `unknown` **或任一行的格读不出**(`livenessUnreadable`,或入参自带一格形坏的 `liveness`)
145
- * ⇒ `unknown`。在**腿**这一层,`unknown` 的意思恰是
146
- * 「有观察在场而答不了这个问题」,而一份读不懂的格**同样答不了** ⇒ 🔴 **读不出的格绝不作可达的证据**
147
- * (否则「一行读不出 + 一行 reachable」会合成一句「这条腿够得着」,而那行读不出的格完全可能本来写着
148
- * `unreachable`)。为什么答不了,由 {@link McpEngineLegHealth.unreadableCells} 分辨;
149
- * ③ 否则任一行 `reachable` ⇒ `reachable`(其余行缺席 = 没观察,不是反证);
150
- * ④ 否则 ⇒ `indeterminate`。
151
- *
152
- * 缺席答什么:`{reading:'indeterminate'}` —— 三种入参落这一档且**刻意同形**:段读不出(`undefined`)、
153
- * 零申报(`[]`,这条腿一台服务器都没申报 ⇒ 没有服务器就没有观察)、每一行的活性格都缺席(老引擎 /
154
- * 都没走到)。要分「一台都没申报」与「有服务器但没报活性」,问名册本身(行数)或在场判词,**不要**
155
- * 让本口替那一问答话。
156
- * 畸形答什么:整个入参不是数组 ⇒ `indeterminate`;行本身不是对象 ⇒ **那一行什么都不贡献**(连「有没有
157
- * 这一格」都没读出来,不替它认领一格);行在而那一格形坏 ⇒ 按上面的 ② 算「读不出」。**永不抛**。
158
- * 为什么不折:`indeterminate` 与三个词之间**没有**默认值可回落 —— 回落到 `reachable` 是谎、回落到
159
- * `unreachable` 是恐慌、回落到 `unknown` 是替引擎认领一次它没做过的观察。
160
- */
161
27
  export declare function mcpLivenessRollupOf(rows: readonly McpLivenessBearingRow[] | undefined): McpEngineLegHealth;
162
- /**
163
- * 活性那一行措辞的**唯一铸点**(三端共用;别在各端的行装配里另写一遍)。
164
- *
165
- * 🔴 四句刻意逐字互异,且**没有一句**把 `indeterminate` 说成「都好着」或「一台都够不着」:
166
- * ① `reachable` —— 上次交换完成了(这条腿的观察,带时刻);
167
- * ② `unreachable` —— 至少一台**可证**够不着;
168
- * ③ `unknown` —— 看过了,答不了(读不出的格同落这一档,附注多一句);
169
- * ③′ `unknown` 且**只**由读不出的格决定(判词无时刻 ∧ `unreadableCells`)—— 另一句:记录在场而**本端读不出**。
170
- * ③ 那句的主语是「回来的东西」(引擎看了、看不出来),③′ 的主语是本端的读器 —— 上游哪天加了第四个词,
171
- * 老客户端落的正是 ③′;把它说成 ③ 等于替引擎认领一次它没做过的「看不出来」。
172
- * ④ `indeterminate` —— **没报**:这条腿上没有可用的观察记录,**不武断咎为引擎版本**(四源同形)。
173
- * 🔴 句子里**不出现**服务器台数与「健康 / 正常」这类词:台数在名册上,而「健康」是本格答不了的问题
174
- * (它只答「还够得着吗」)。
175
- * 🔴 句尾那个时刻**属于句子里那个判词**(见 {@link McpEngineLegHealth.observedAt}):说「至少有一台够不着」
176
- * 时它是最新那次**够不着**的观察时刻,不是这条腿上任何一次观察的最大值 —— 否则一句旧故障的判词会跟上
177
- * 一个属于别的词的新时刻,读起来像刚刚又确认了一次。时刻缺席时句子里就没有时刻,不编「刚刚」。
178
- */
179
28
  export declare function mcpEngineLegHealthDetail(health: McpEngineLegHealth | undefined): string;
@@ -1,80 +1,7 @@
1
- /**
2
- * mcpLiveness.ts — 引擎托管的 MCP 服务器**活性观察**(`wiring_manifest.mcp[].liveness`)的三端共用
3
- * **结构读口** + 三词闭集词表 + 腿级判词(CC-36,0.76.1)。引擎内核自 7.24.3 起铸这一格,服务端的转发层自 7.91.2 起把它送上 wire ——
4
- * 更老的服务端上这一格**恒缺席**(读数 = `indeterminate`,正是缺席语义要兜的那一档,不是故障)。
5
- *
6
- * ── 这一格答的是哪一个问题 ────────────────────────────────────────────────────────────────────
7
- * 「这台服务器**还够得着吗**」。引擎不为它发任何自己的流量 —— 每条记录都是那条腿**已经做过的工作**
8
- * (拨号、re-dial、传输关闭、一次发现传输没了的请求)顺带盖的章,自带盖章时刻 `observedAt`。
9
- * ⇒ 它是**每条腿的一张快照**,不是心跳、不是轮询、更不是「此刻」。
10
- *
11
- * 🔴 **同一行上的三个位各说各的,谁都不许顶替谁、不许互相校验、不许据其一推另一个**:
12
- * · `status`(申报 / 连接时判决)—— 这条腿**拨号那一刻**的判词,引擎**有意冻结**它(服务器中途死了这一格
13
- * 仍读 `connected`);
14
- * · re-dial 回执的 `outcome`(动作判决)—— **一次动作**的判词,过去式;
15
- * · `liveness`(本件)—— 连接层**最后学到的那件事**,自带时戳。
16
- * 最直白的一格:`status: 'failed'` 与 `liveness.state: 'reachable'` **同一行并存是真行** —— 服务器答了
17
- * 握手、答的是协议错(**活着,且配错了**)。判据是「两格都在」,不是「两格一致」。
18
- *
19
- * ── 🔴 四种读数(三个词 + 缺席),缺席**不是**其中任何一个词 ────────────────────────────────────
20
- * · `reachable` —— **一次交换完成了**(连上并列出了,或服务器自己答了 —— MCP 级的拒绝**也是答**,所以
21
- * 它证明够得着,即便那次调用失败);
22
- * · `unreachable` —— 试过,丢在传输或时钟上(拒连 / 重置 / 关闭 / 起不来 / 超时);
23
- * · `unknown` —— **试过,而回来的东西答不了这个问题**(服务器前面那台网关写的 HTTP 状态、非 MCP 载荷、
24
- * 没有结构的抛出值)。它是一句**更强**的断言:引擎看了,看不出来。
25
- * · **缺席 = indeterminate** —— 这一行**没有可用的观察记录**。四个来源在 wire 上**同形**,消费端分不出也
26
- * 不需要分:① 这条腿没走到那台服务器(`status: 'skipped'`);② 那份声明从来没被拨过(`invalid_config`);
27
- * ③ 这是一条老引擎 / 老服务端的帧;④ 上游判形没过、那一格被摘掉了。
28
- * 🔴 **不许据缺席反推「这条腿拨没拨过号」**,也不许把它折进 `unknown`、折成「健康」、折成「关着」。
29
- * 这四句话在本包里是四句不同的话,任何折叠都是「把不知道说成没有 / 说成好着呢」的变体。
30
- *
31
- * ── 为什么是结构读(不靠型面) ─────────────────────────────────────────────────────────────────
32
- * 本包 peer 地板上的 wire 型面里**还没有这一格**(键形是引擎侧先出、型面后出的常态)。所以本件按契约
33
- * **结构读**:从 `unknown` 起按键路径窄化,判据自带(见下),**不抬 peer 地板、不等型面**。安全性不靠型
34
- * 而靠三条:① 三词按**闭集恰等**判,认不得的词一律畸形(词表属主在上游,本包**不放宽**成开集 —— 放宽了
35
- * 就会把一个没人定义过的词当成一句真话往屏上送);② `observedAt` 按**有限数**判;③ 判形没过 ⇒ 这一格
36
- * 摘掉、那一行照读(与上游同判),而摘掉的**理由**留在 {@link McpLivenessCell} 的 `unreadable` 臂上,
37
- * 与「引擎没报」分开。型面出键那天由包侧门逼一次显式处置(见 `run-mcp-liveness-test.mjs` 的上游见证臂)。
38
- *
39
- * ── `errorCode` 只随 `unreachable` ────────────────────────────────────────────────────────────
40
- * 它是那句话的**注脚**(为什么够不着),不是那句话本身。上游的单点铸造保证它**只随 `unreachable`** 出现,
41
- * 理由逐字可查:`unknown` 的全部意思就是「那次失败并没有决定可达性」,把失败类别挂在那个词上等于请消费端
42
- * 拿一份说明不了可达性的证据去决定下一步动作。⇒ 本读口在**非 `unreachable`** 臂上**丢掉这只注脚**
43
- * (整格仍在、`state` 仍读):去掉的恰是上游点名要防的那条误读路,而 `state` 那句话一个字没动。
44
- * 注脚自己形坏(空串 / 非串)同样**只丢它自己不拆整格** —— 代价如实:此时读到的是「够不着,原因没说」,
45
- * **不是**「这条记录坏了」。词按**开集**读(十词闭集的属主在上游,抄一张会把新词吞成缺席)。
46
- */
47
- /**
48
- * 活性词的**三词闭集**(与上游同序:能完成交换 / 完不成 / 答不了)。
49
- *
50
- * 🔴 **它只有三个词**。腿级判词的第四个读数 `indeterminate`(见 {@link McpLegLivenessReading})**不是**
51
- * 本表成员,也绝不许被加进来:本表是**上游的词表**,那第四个读数是**缺席**在本包里的名字。
52
- * 🔴 消费端按本表写的 `switch` 判**恰等**(不 trim、不折大小写、不按前缀猜);上游加词的唯一处置是
53
- * **本表同批加一格 + 补一条读数格**,而不是在消费点放宽判据。
54
- */
55
1
  export const MCP_LIVENESS_STATES = Object.freeze(['reachable', 'unreachable', 'unknown']);
56
- /** 三词闭集的**唯一**判据(恰等;行级读口与腿级判词共用这一只,不各写一遍)。 */
57
2
  const isLivenessState = (v) => typeof v === 'string' && MCP_LIVENESS_STATES.includes(v);
58
3
  const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
59
- /**
60
- * 从**一行** MCP 名册条目里读这一格(结构读;单一铸点,别在消费点再写一遍判据)。
61
- *
62
- * 缺席答什么:`{kind:'absent'}` —— 判据是**自有键在不在**(`Object.hasOwn`),不按真值判。原型链上的
63
- * 同名键**永远不会**上 wire,拿它当在场 = 把本进程对象的形状当成引擎说过的话;`null` / `undefined`
64
- * 显式在场是**坏形**(走 `unreadable`),不是缺席形。
65
- * 畸形答什么:`{kind:'unreadable'}` —— 整行不是对象、整格不是对象(含 `null` / 数组 / 串 / 数)、
66
- * `state` 不是三词之一(含空串、近形拼法、大小写变体)、`observedAt` 非有限数(含缺席 / 串 / `NaN`)。
67
- * 🔴 **绝不**折成 `{kind:'absent'}`(会把「送来一份读不懂的」说成「引擎没报」),更**绝不**折成
68
- * `reachable` 或任何一个词(那是把读不出说成好着呢)。
69
- * 为什么不折:这三句话在本包下游各对一种不同的处置 —— 缺席 = 什么都不渲(**不许**渲「一台都够不着」也
70
- * **不许**渲「都好着」);读不出 = 渲「这一格读不出」并让运维去看引擎版本与投影层;观察 = 渲那个词
71
- * + 那个时刻。折任何一对,渲出来的都是一句谁都没说过的话。
72
- *
73
- * ⚠️ 本口**只读这一格**:同行的 `status` / `errorCode` / `delivered` 一个字节都不碰,也不拿它们互相校验
74
- * (三个位各说各的,见文件顶注)。
75
- */
76
4
  export function readMcpLiveness(row) {
77
- // 整行不是对象:说「引擎没报」就是替引擎发言 —— 我们连有没有这一行都没读出来。
78
5
  if (!isRecord(row))
79
6
  return { kind: 'unreadable' };
80
7
  if (!Object.hasOwn(row, 'liveness'))
@@ -89,34 +16,11 @@ export function readMcpLiveness(row) {
89
16
  if (typeof observedAt !== 'number' || !Number.isFinite(observedAt))
90
17
  return { kind: 'unreadable' };
91
18
  const liveness = { state, observedAt };
92
- // 注脚:只随 unreachable 收,且形坏只丢它自己(见文件顶注最后一段)。
93
19
  if (state === 'unreachable' && typeof cell.errorCode === 'string' && cell.errorCode.length > 0) {
94
20
  liveness.errorCode = cell.errorCode;
95
21
  }
96
22
  return { kind: 'observation', liveness };
97
23
  }
98
- /**
99
- * 一条腿的名册 → 活性判词(**唯一铸点**:别在各端的状态行装配里另写一遍这套合成规则)。
100
- *
101
- * 合成规则 = **最坏事实优先**,不是多数票、不是取最新一格:
102
- * ① 任一行 `unreachable` ⇒ `unreachable`(有一台**可证**打不通时说「够得着」,就是把坏消息折成健康);
103
- * ② 否则任一行 `unknown` **或任一行的格读不出**(`livenessUnreadable`,或入参自带一格形坏的 `liveness`)
104
- * ⇒ `unknown`。在**腿**这一层,`unknown` 的意思恰是
105
- * 「有观察在场而答不了这个问题」,而一份读不懂的格**同样答不了** ⇒ 🔴 **读不出的格绝不作可达的证据**
106
- * (否则「一行读不出 + 一行 reachable」会合成一句「这条腿够得着」,而那行读不出的格完全可能本来写着
107
- * `unreachable`)。为什么答不了,由 {@link McpEngineLegHealth.unreadableCells} 分辨;
108
- * ③ 否则任一行 `reachable` ⇒ `reachable`(其余行缺席 = 没观察,不是反证);
109
- * ④ 否则 ⇒ `indeterminate`。
110
- *
111
- * 缺席答什么:`{reading:'indeterminate'}` —— 三种入参落这一档且**刻意同形**:段读不出(`undefined`)、
112
- * 零申报(`[]`,这条腿一台服务器都没申报 ⇒ 没有服务器就没有观察)、每一行的活性格都缺席(老引擎 /
113
- * 都没走到)。要分「一台都没申报」与「有服务器但没报活性」,问名册本身(行数)或在场判词,**不要**
114
- * 让本口替那一问答话。
115
- * 畸形答什么:整个入参不是数组 ⇒ `indeterminate`;行本身不是对象 ⇒ **那一行什么都不贡献**(连「有没有
116
- * 这一格」都没读出来,不替它认领一格);行在而那一格形坏 ⇒ 按上面的 ② 算「读不出」。**永不抛**。
117
- * 为什么不折:`indeterminate` 与三个词之间**没有**默认值可回落 —— 回落到 `reachable` 是谎、回落到
118
- * `unreachable` 是恐慌、回落到 `unknown` 是替引擎认领一次它没做过的观察。
119
- */
120
24
  export function mcpLivenessRollupOf(rows) {
121
25
  if (!Array.isArray(rows))
122
26
  return { reading: 'indeterminate' };
@@ -124,7 +28,6 @@ export function mcpLivenessRollupOf(rows) {
124
28
  let unknown = false;
125
29
  let reachable = false;
126
30
  let unreadable = false;
127
- // 按**词**分别记最新时刻:判词定下来之后只取那个词自己的(见 McpEngineLegHealth.observedAt 的理由)。
128
31
  const newestByWord = {};
129
32
  for (const row of rows) {
130
33
  if (row === null || typeof row !== 'object')
@@ -132,12 +35,8 @@ export function mcpLivenessRollupOf(rows) {
132
35
  if (row.livenessUnreadable === true)
133
36
  unreadable = true;
134
37
  const lv = row.liveness;
135
- // `undefined` = 这一格不在 = 没有观察(JSON 上根本没有这一键):什么都不贡献,也不算「读不出」。
136
38
  if (lv === undefined)
137
39
  continue;
138
- // 形再核一次(本口是公面,入参可能来自宿主自建管线而不是本包的读器):整格不是对象、词出闭集、
139
- // 时刻非有限数 ⇒ 与 `livenessUnreadable` **同判**(算「在场而读不出」)。🔴 刻意不让它「什么都不贡献」:
140
- // 那样一行读不懂的格会被另一行的 `reachable` 盖过去,合成一句「这条腿够得着」—— 正是本件要防的那一折。
141
40
  if (lv === null || typeof lv !== 'object' || Array.isArray(lv)) {
142
41
  unreadable = true;
143
42
  continue;
@@ -168,7 +67,6 @@ export function mcpLivenessRollupOf(rows) {
168
67
  : reachable
169
68
  ? 'reachable'
170
69
  : 'indeterminate';
171
- // 时刻与判词同源:`indeterminate` 没有时刻;`unknown` 若只由读不出的格决定,那个词一格可读观察都没有 ⇒ 同样没有时刻。
172
70
  const at = reading === 'indeterminate' ? undefined : newestByWord[reading];
173
71
  return {
174
72
  reading,
@@ -176,26 +74,7 @@ export function mcpLivenessRollupOf(rows) {
176
74
  ...(at !== undefined ? { observedAt: at } : {}),
177
75
  };
178
76
  }
179
- /** 观察时刻的呈前写法:ISO(与本包其余时刻面同形)。🔴 **超出 `Date` 可表示区间的有限数原样印数字,
180
- * 绝不抛、也绝不回落到一个编出来的时刻** —— 那一格是引擎给的读数,不是本包的时钟。 */
181
77
  const epochLabel = (ms) => Math.abs(ms) <= 8.64e15 ? new Date(ms).toISOString() : String(ms);
182
- /**
183
- * 活性那一行措辞的**唯一铸点**(三端共用;别在各端的行装配里另写一遍)。
184
- *
185
- * 🔴 四句刻意逐字互异,且**没有一句**把 `indeterminate` 说成「都好着」或「一台都够不着」:
186
- * ① `reachable` —— 上次交换完成了(这条腿的观察,带时刻);
187
- * ② `unreachable` —— 至少一台**可证**够不着;
188
- * ③ `unknown` —— 看过了,答不了(读不出的格同落这一档,附注多一句);
189
- * ③′ `unknown` 且**只**由读不出的格决定(判词无时刻 ∧ `unreadableCells`)—— 另一句:记录在场而**本端读不出**。
190
- * ③ 那句的主语是「回来的东西」(引擎看了、看不出来),③′ 的主语是本端的读器 —— 上游哪天加了第四个词,
191
- * 老客户端落的正是 ③′;把它说成 ③ 等于替引擎认领一次它没做过的「看不出来」。
192
- * ④ `indeterminate` —— **没报**:这条腿上没有可用的观察记录,**不武断咎为引擎版本**(四源同形)。
193
- * 🔴 句子里**不出现**服务器台数与「健康 / 正常」这类词:台数在名册上,而「健康」是本格答不了的问题
194
- * (它只答「还够得着吗」)。
195
- * 🔴 句尾那个时刻**属于句子里那个判词**(见 {@link McpEngineLegHealth.observedAt}):说「至少有一台够不着」
196
- * 时它是最新那次**够不着**的观察时刻,不是这条腿上任何一次观察的最大值 —— 否则一句旧故障的判词会跟上
197
- * 一个属于别的词的新时刻,读起来像刚刚又确认了一次。时刻缺席时句子里就没有时刻,不编「刚刚」。
198
- */
199
78
  export function mcpEngineLegHealthDetail(health) {
200
79
  if (health === undefined)
201
80
  return 'mcp liveness not reported (no liveness observation is available to this client)';
@@ -207,7 +86,6 @@ export function mcpEngineLegHealthDetail(health) {
207
86
  case 'unreachable':
208
87
  return `mcp liveness: at least one server was observed unreachable on this leg${at}${unreadable}`;
209
88
  case 'unknown':
210
- // ③′:时刻缺席 ∧ 有读不出的格 ⇒ 这个 unknown 一格可读观察都没有(时刻与判词同源,见 McpEngineLegHealth.observedAt)。
211
89
  if (health.observedAt === undefined && health.unreadableCells === true) {
212
90
  return 'mcp liveness: liveness records are present on this leg, but this client could not read them';
213
91
  }
@@ -1,139 +1,35 @@
1
- /**
2
- * mcpPanel.ts — `GET /v1/sessions/:id/mcp` 面板体(sdk `McpStatusPanel`)的**防御读视图**
3
- * (CC-03,0.68.2;server 7.77.0 S-297 可选键 `lastLegMcp`;回 A-093 ③)。
4
- *
5
- * ── 为什么在包里(归层)────────────────────────────────────────────────────────────────────
6
- * 面板体是三端都要渲的同一份读面:`servers[]` 是「这台部署此刻按需 materialize 出来的连接状态」,
7
- * `lastLegMcp` 是「这个会话最近一条腿的账本里申报了哪些 MCP」。**两面合法可不同**(部署缺省场景
8
- * 与按请求注入的名册本来就是两张表),契约 G.7 第 4 条禁止消费端拿它们对账后渲「不一致」。
9
- * 这条纪律若各端自己写一遍,迟早有一端写反。⇒ 读法(哪些键、坏形怎么办、缺席说什么)只在这里
10
- * 有一份;端只渲。
11
- *
12
- * ── 缺席语义(逐键)──────────────────────────────────────────────────────────────────────────
13
- * · `lastLegMcp` **整键缺席** = server 的三形同形(新会话 / 最近腿的账本行在保留窗外 / 该腿没推
14
- * `wiring_manifest`)**或**引擎早于 7.77.0;本视图同样不铸该键。「为什么缺席」这一位答不出来,
15
- * 也不猜。
16
- * 🔒 **定谳(0.70.1,三方闭环):这三形永远不会长出缺席原因伴生键**,本读器也不留位。理由 ①
17
- * 后两形在上游是同一条代码路径(走完事件表就是没有那一帧),分不出是保留窗剪的还是压根没推,
18
- * 启发式 = 把猜测穿成事实;② 该读面的属主门那一臂必须与其余缺席**同形**(非属主读别人的会话
19
- * 时本键缺席、面板照常 200,反枚举),一旦带原因键,「不存在的会话答 no_leg、别人的会话不答」
20
- * 就是一个**会话存在性 oracle** —— 可分辨性在这里让位给反枚举。⇒ 缺席只有一句话可说,不编第三句。
21
- * · `lastLegMcp` **在场但形坏**(`runId` / `at` 不是非空串、`mcp` 读不出一行)⇒ 视图不铸该键,
22
- * 改立 {@link McpPanelView.lastLegMcpUnreadable}(never false)。「引擎送了一份我读不懂的」与
23
- * 「引擎没送」对运维是两句话,不折成一个 `undefined`。
24
- * · `degraded`:只在 server 的超时臂铸(sdk openapi 顶注逐字)⇒ 本视图 never false:在场 = 取不到,
25
- * 缺席 = 正常 materialize(`servers: []` 那时是「一台都没配」这句正面事实,不是「不知道」)。
26
- * · `servers[]` 逐行:`name` + `status` 是必需两座(缺一丢该行,坏一行只丢那一行);**非空输入而零行
27
- * 幸存 ⇒ 整个视图 `undefined`**(「我读不出来」不是「我知道是零」,与 `wiring_manifest.mcp`
28
- * 同一条规矩)。`status` 按开集读(sdk 只声明 connected/failed 两词,core 未来加词照渲不丢行)。
29
- * · `error`:server 已脱敏 + 200 字符封顶;本视图仍按 UNTRUSTED-for-display 再过一次
30
- * {@link capForDisplay}(呈前消毒 + 封长),与本包其余远端文本铸点同律。
31
- *
32
- * ── `mcp[]` 条目与 `wiring_manifest` 第三段**同一只读器**─────────────────────────────────────
33
- * `lastLegMcp.mcp[]` 是该腿 `wiring_manifest.mcp[]` 的逐字回放(server S-297),本视图直接调
34
- * {@link projectMcpSection} —— 同一形、同一判据、同一缺席律;三端渲这两处用同一个
35
- * {@link WiringManifestMcpEntryView},不会出现「活体腿一种形、账本回放另一种形」。
36
- */
37
1
  import type { AgentClient } from '@sema-agent/sdk';
38
2
  import { type WiringManifestMcpEntryView } from './adapter/downstream/eventToSdkMessage.js';
39
3
  import { type McpEngineLegHealth } from './mcpLiveness.js';
40
- /** 面板 `servers[]` 一行(sdk `McpServerStatus` 的窄读;开集键不透传,逐键挑)。 */
41
4
  export interface McpPanelServerView {
42
- /** 配置名(引擎产的标识,非用户内容)。 */
43
5
  name: string;
44
- /** `connected` / `failed`(sdk 声明的两词;**按开集读**,认不得的词照渲不丢行)。 */
45
6
  status: string;
46
- /** 服务器自报的名字与版本(仅 connected 时有)。缺席 = 没报。 */
47
7
  serverInfo?: {
48
8
  name: string;
49
9
  version: string;
50
10
  };
51
- /** 挂上来的工具名(仅 connected 时有)。缺席 = 没报,**不是**空表。 */
52
11
  toolNames?: string[];
53
- /** 失败因由(仅 failed 时;server 已脱敏 + 封顶,本视图再消毒一次)。 */
54
12
  error?: string;
55
13
  }
56
- /** `lastLegMcp{runId,at,mcp[]}`(server ≥7.77.0 S-297)的窄读。 */
57
14
  export interface McpPanelLastLegView {
58
- /** 该会话最近一条腿的 runId。 */
59
15
  runId: string;
60
- /** 写账本副本的钟(ISO;**不是** materialize 时刻 `asOf`,两者不比)。 */
61
16
  at: string;
62
- /** 该腿 `wiring_manifest.mcp[]` 逐字 —— 与活体腿的第三段同一只读器、同一形。 */
63
17
  mcp: WiringManifestMcpEntryView[];
64
18
  }
65
- /** `GET /v1/sessions/:id/mcp` 的读视图(缺席语义见文件顶注)。 */
66
19
  export interface McpPanelView {
67
- /** THIS materialize 时刻(ISO)。 */
68
20
  asOf: string;
69
- /** materialization-time 状态,不是 live 健康(壳渲「as of <asOf>」)。空表 = 一台都没配。 */
70
21
  servers: McpPanelServerView[];
71
- /** never false:在场 = materialize 超时/失败,`servers` 空但**不是**「没有 MCP」。 */
72
22
  degraded?: true;
73
- /** 最近一条腿的申报名册(server ≥7.77.0);缺席语义见顶注。🔴 禁与 `servers[]` 对账渲告警。 */
74
23
  lastLegMcp?: McpPanelLastLegView;
75
- /** never false:server 送了 `lastLegMcp` 但本视图读不出来(与整键缺席不是同一句话)。 */
76
24
  lastLegMcpUnreadable?: true;
77
25
  }
78
- /**
79
- * 面板体 → 读视图;**畸形一律 `undefined`**,绝不抛出(必填位 fail-closed,可选位只丢自己)。
80
- *
81
- * 🔴 `lastLegMcp` 只按「键在不在」判在场(`'lastLegMcp' in body`),不按真值判:server 的缺席形
82
- * 是**键不出现**(LL-3),不是 `null`/`undefined` 在场 —— 后两者是坏形,走 `lastLegMcpUnreadable`。
83
- * 🔴 本函数**不比** `servers[]` 与 `lastLegMcp.mcp[]`,视图上也没有任何「一致/不一致」位
84
- * (契约 G.7 第 4 条:两面合法可不同)。
85
- */
86
26
  export declare function projectMcpPanel(body: unknown): McpPanelView | undefined;
87
- /**
88
- * 取面板体并投成读视图(CC-03 补件,0.69.0):`GET /v1/sessions/:id/mcp` 经 sdk `client.sessions.mcp`(自 sdk 0.0.75 在场,
89
- * 与 `runs.subagentOutput` 同一条 transport,鉴权/principal 由 sdk 带 —— 本包**不**裸 fetch,不做第二套鉴权铸点)。
90
- *
91
- * 🔴 返回 `undefined` 的三形**同形**(与 {@link projectMcpPanel} 的缺席律一致):传输失败(网络 / 4xx / 5xx / abort)、
92
- * 体读不出(必填位坏)、`sessionId` 空串(不发请求)。「为什么」不在返回值上 —— 传输失败留一行 `hostLog('debug')`,
93
- * 端要分「未观测 vs 读不出」用 {@link mcpPanelLastLegDetail} 的 `reachable` 位(`view !== undefined` 即 reachable)。
94
- * 🔴 `client` 只钉 `sessions` 一格(`Pick`):端传本包 `makeEngineWireClient` 造的实例即可,测试可喂假客户端。
95
- */
96
27
  export declare function fetchMcpPanel(client: Pick<AgentClient, 'sessions'>, sessionId: string, opts?: {
97
28
  signal?: AbortSignal;
98
29
  }): Promise<McpPanelView | undefined>;
99
- /**
100
- * `lastLegMcp` 那一行措辞的**唯一铸点**(三端共用;别在各端的行装配里另写一遍)。
101
- *
102
- * 🔴 五句刻意逐字互异(黑盒锚;0.69.1 订正:此前写「四句」漏了「面板体读不出」那一句),且**没有一句**提到 `servers[]`:
103
- * ① 在场 —— 名册 + runId + at;
104
- * ② `opts.reachable === false` —— 「未观测」:这次进程没读到面板体;
105
- * ③ 面板读到了但 `lastLegMcp` 整键缺席 —— 「不报」:三形同形 + 老引擎,**不武断咎为版本**;
106
- * ④ 在场但读不懂 —— 「读不出」:与③是两句话。
107
- */
108
30
  export declare function mcpPanelLastLegDetail(view: McpPanelView | undefined, opts: {
109
31
  reachable: boolean;
110
32
  }): string;
111
- /**
112
- * CC-19(0.71.0;cli L-335 归包):**引擎侧 MCP 在场三值**,只从本包的面板视图求(不自拼第二份判据、不发第二次请求)。
113
- * · `'present'`:`servers[]` 非空(这台部署此刻 materialize 出的引擎侧连接有行)/ `lastLegMcp` 在场(最近一条腿申报过名册)/
114
- * `lastLegMcpUnreadable`(引擎送了一份读不懂的 = 有东西)/ `degraded`(materialize 超时,`servers: []` 此时**不等于**没有);
115
- * · `'absent'`:视图读得出 ∧ 以上全不成立 = **正面事实**「引擎侧没有 MCP」;
116
- * · `'unknown'`:`view === undefined`(传输失败 / 体读不出 / 空 sessionId,`fetchMcpPanel` 刻意三形同形)—— 本包**说不出**。
117
- * 🔴 宿主义务:`'unknown'` **不许**渲成 CC 那句「一台 MCP 都没配」(「不知道」不渲成 0);有引擎接线的端在 `'unknown'` 上
118
- * 开面板,让 {@link mcpPanelLastLegDetail} 铸的「未观测」那一句自己说话;CC 逐字那句只在**壳侧零行 ∧ `'absent'`** 时出。
119
- * 🔴 为什么不能拿 `mcpPanelLastLegDetail` 有没有出一行当在场判据:它对**任何**视图都出一句(在场 / 未观测 / 不报 / 读不出),
120
- * 老引擎与新会话同样出「不报」—— 拿行数判在场恒真。在场只能问视图本身的键。
121
- */
122
33
  export type McpEngineLegPresence = 'present' | 'absent' | 'unknown';
123
34
  export declare function mcpEngineLegPresence(view: McpPanelView | undefined): McpEngineLegPresence;
124
- /**
125
- * CC-36(0.76.1):**这条腿的 MCP 活性判词**,只从本包的面板视图求(不自拼第二份判据、不发第二次请求)。
126
- * 合成规则、四个读数与「缺席 ≠ unknown」那几句话的单一铸点在 {@link mcpLivenessRollupOf};本口只做一件事 ——
127
- * 把面板上**带活性格的那一面**交给它。
128
- *
129
- * 🔴 **活性只在「最近那条腿的名册」这一面上**(`lastLegMcp.mcp[]`)。面板自己的 `servers[]` 半场**没有**
130
- * 这一格:那一面是**部署缺省场景**此刻按需物化出来的台账,它的投影是逐键挑的白名单,今天不带活性位 ——
131
- * 所以本口读不到它**不是漏读,是那一面今天没有这句话**。哪天它带上了,处置是同批补一格读数 + 判据,
132
- * 而**不是**拿这一面的词去顶另一面(两面合法可不同,视图上从来没有、也不会有「一致/不一致」位)。
133
- * 🔴 **判词说的是「那条腿」,不是「此刻」**:`observedAt` 属于那条腿的观察时刻,与面板的 `asOf` 不同源、
134
- * **不比**。壳渲这一行必须带腿的时刻,别渲成一个实时健康灯。
135
- * 🔴 `view === undefined`(传输失败 / 体读不出 / 空 sessionId,三形同形)与「面板读到了但没有那条腿的
136
- * 名册」**都答 `indeterminate`**:两者的共同点正是这句话本身 —— 本包**说不出**这条腿的活性。
137
- * 要分辨「这次读没读到面板」问 {@link mcpPanelLastLegDetail} 的 `reachable` 位,**不要**让本口替它答。
138
- */
139
35
  export declare function mcpEngineLegHealthOf(view: McpPanelView | undefined): McpEngineLegHealth;
package/dist/mcpPanel.js CHANGED
@@ -2,11 +2,8 @@ import { hostLog } from './host.js';
2
2
  import { projectMcpSection } from './adapter/downstream/eventToSdkMessage.js';
3
3
  import { capForDisplay } from './fleetTaskDesc.js';
4
4
  import { mcpLivenessRollupOf } from './mcpLiveness.js';
5
- /** `error` 上屏前的封长(server 侧 `slice(200)`,同值)。 */
6
5
  const MCP_PANEL_ERROR_MAX = 200;
7
- /** 名字类词形的封长(与本包其余 detail 铸点同值同理由)。 */
8
6
  const MCP_PANEL_WORD_MAX = 40;
9
- /** `mcpPanelLastLegDetail` 里列出的名字上限(再多就是一行读不完的表,不是一句读数)。 */
10
7
  const MCP_PANEL_NAMES_MAX = 8;
11
8
  const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
12
9
  const nonEmpty = (v) => typeof v === 'string' && v.length > 0;
@@ -37,14 +34,6 @@ function projectLastLeg(raw) {
37
34
  return undefined;
38
35
  return { runId: raw.runId, at: raw.at, mcp };
39
36
  }
40
- /**
41
- * 面板体 → 读视图;**畸形一律 `undefined`**,绝不抛出(必填位 fail-closed,可选位只丢自己)。
42
- *
43
- * 🔴 `lastLegMcp` 只按「键在不在」判在场(`'lastLegMcp' in body`),不按真值判:server 的缺席形
44
- * 是**键不出现**(LL-3),不是 `null`/`undefined` 在场 —— 后两者是坏形,走 `lastLegMcpUnreadable`。
45
- * 🔴 本函数**不比** `servers[]` 与 `lastLegMcp.mcp[]`,视图上也没有任何「一致/不一致」位
46
- * (契约 G.7 第 4 条:两面合法可不同)。
47
- */
48
37
  export function projectMcpPanel(body) {
49
38
  if (!isRecord(body))
50
39
  return undefined;
@@ -72,15 +61,6 @@ export function projectMcpPanel(body) {
72
61
  }
73
62
  return view;
74
63
  }
75
- /**
76
- * 取面板体并投成读视图(CC-03 补件,0.69.0):`GET /v1/sessions/:id/mcp` 经 sdk `client.sessions.mcp`(自 sdk 0.0.75 在场,
77
- * 与 `runs.subagentOutput` 同一条 transport,鉴权/principal 由 sdk 带 —— 本包**不**裸 fetch,不做第二套鉴权铸点)。
78
- *
79
- * 🔴 返回 `undefined` 的三形**同形**(与 {@link projectMcpPanel} 的缺席律一致):传输失败(网络 / 4xx / 5xx / abort)、
80
- * 体读不出(必填位坏)、`sessionId` 空串(不发请求)。「为什么」不在返回值上 —— 传输失败留一行 `hostLog('debug')`,
81
- * 端要分「未观测 vs 读不出」用 {@link mcpPanelLastLegDetail} 的 `reachable` 位(`view !== undefined` 即 reachable)。
82
- * 🔴 `client` 只钉 `sessions` 一格(`Pick`):端传本包 `makeEngineWireClient` 造的实例即可,测试可喂假客户端。
83
- */
84
64
  export async function fetchMcpPanel(client, sessionId, opts) {
85
65
  if (typeof sessionId !== 'string' || sessionId.length === 0)
86
66
  return undefined;
@@ -95,15 +75,6 @@ export async function fetchMcpPanel(client, sessionId, opts) {
95
75
  }
96
76
  return projectMcpPanel(body);
97
77
  }
98
- /**
99
- * `lastLegMcp` 那一行措辞的**唯一铸点**(三端共用;别在各端的行装配里另写一遍)。
100
- *
101
- * 🔴 五句刻意逐字互异(黑盒锚;0.69.1 订正:此前写「四句」漏了「面板体读不出」那一句),且**没有一句**提到 `servers[]`:
102
- * ① 在场 —— 名册 + runId + at;
103
- * ② `opts.reachable === false` —— 「未观测」:这次进程没读到面板体;
104
- * ③ 面板读到了但 `lastLegMcp` 整键缺席 —— 「不报」:三形同形 + 老引擎,**不武断咎为版本**;
105
- * ④ 在场但读不懂 —— 「读不出」:与③是两句话。
106
- */
107
78
  export function mcpPanelLastLegDetail(view, opts) {
108
79
  if (!opts.reachable)
109
80
  return "last leg mcp not observed (this end could not read the session's MCP panel)";
@@ -121,11 +92,6 @@ export function mcpPanelLastLegDetail(view, opts) {
121
92
  }
122
93
  return 'last leg mcp not reported (no leg in the retention window, no manifest on the last leg, or the engine predates it)';
123
94
  }
124
- /**
125
- * **编译期对账钉**(不出公面):sdk 的 `McpStatusPanel` 必须能赋给视图的必填半场 —— 名字在
126
- * sdk ≥8.8.0 上存在(本包 peer 地板),`tsc` 在改名当天报「没有导出成员」。
127
- * 反向刻意不钉(视图比 sdk 形窄:开集键不透传、`degraded` 收成 never-false)。
128
- */
129
95
  const _mcpPanelShapePin = (p) => p;
130
96
  void _mcpPanelShapePin;
131
97
  export function mcpEngineLegPresence(view) {
@@ -141,21 +107,6 @@ export function mcpEngineLegPresence(view) {
141
107
  return 'present';
142
108
  return 'absent';
143
109
  }
144
- /**
145
- * CC-36(0.76.1):**这条腿的 MCP 活性判词**,只从本包的面板视图求(不自拼第二份判据、不发第二次请求)。
146
- * 合成规则、四个读数与「缺席 ≠ unknown」那几句话的单一铸点在 {@link mcpLivenessRollupOf};本口只做一件事 ——
147
- * 把面板上**带活性格的那一面**交给它。
148
- *
149
- * 🔴 **活性只在「最近那条腿的名册」这一面上**(`lastLegMcp.mcp[]`)。面板自己的 `servers[]` 半场**没有**
150
- * 这一格:那一面是**部署缺省场景**此刻按需物化出来的台账,它的投影是逐键挑的白名单,今天不带活性位 ——
151
- * 所以本口读不到它**不是漏读,是那一面今天没有这句话**。哪天它带上了,处置是同批补一格读数 + 判据,
152
- * 而**不是**拿这一面的词去顶另一面(两面合法可不同,视图上从来没有、也不会有「一致/不一致」位)。
153
- * 🔴 **判词说的是「那条腿」,不是「此刻」**:`observedAt` 属于那条腿的观察时刻,与面板的 `asOf` 不同源、
154
- * **不比**。壳渲这一行必须带腿的时刻,别渲成一个实时健康灯。
155
- * 🔴 `view === undefined`(传输失败 / 体读不出 / 空 sessionId,三形同形)与「面板读到了但没有那条腿的
156
- * 名册」**都答 `indeterminate`**:两者的共同点正是这句话本身 —— 本包**说不出**这条腿的活性。
157
- * 要分辨「这次读没读到面板」问 {@link mcpPanelLastLegDetail} 的 `reachable` 位,**不要**让本口替它答。
158
- */
159
110
  export function mcpEngineLegHealthOf(view) {
160
111
  if (view === undefined)
161
112
  return { reading: 'indeterminate' };