@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,67 +1,13 @@
1
- /**
2
- * ⇄ B2 批搬迁(2026-07-27,多端改造设计稿 §3 B2):cli src/sema/classifierVerdictWire.ts 的
3
- * **判定半场**搬入(帧识别 + 文案),`surfaceClassifierDeny()` 的**执行半场**留宿主
4
- * (它写 Ink `AppState.notifications` 并 lazy `require('../utils/autoModeDenials.js')`——
5
- * 两者都是 TUI/Node 私有面,进不了端无关包)。
6
- * 🔴 本文件零模块级可变状态(只有常量),故不受 B1「写读口必须同实例」纪律约束:壳侧留
7
- * 执行半场、判定走本包,是安全的拆缝(B6 T35/T36/T44 同款「判定半场搬入」姿势)。
8
- * 逐字纪律:CLASSIFIER_DENY_SIGNATURE / NOTICE_REASON_MAX(80)/ 通知行三段格式一字节不改。
9
- */
10
- /** core hooks.js 分类器 deny message 的机器签名(逐字锚;lockstep:core 改文案这里必须跟)。 */
11
1
  export declare const CLASSIFIER_DENY_SIGNATURE = "auto-mode classifier blocked this call";
12
2
  export interface ClassifierDenyVerdict {
13
- /** core 裁决原文(已去 system-reminder 包裹),= render 面 stamp 体。 */
14
3
  message: string;
15
- /** 签名后的 reason 尾巴(`: ` 之后),无则 undefined。 */
16
4
  reason?: string;
17
5
  }
18
- /**
19
- * 结构性识别一张 tool_end 帧是否为分类器 deny 裁决帧。
20
- * 判定 = isError:true ∧ 错误体(去包裹后)以 core 机器签名开头。识别不中 ⇒ undefined(原路)。
21
- */
22
6
  export declare function classifierDenyFromToolEnd(ev: {
23
7
  type?: unknown;
24
8
  isError?: unknown;
25
9
  output?: unknown;
26
10
  }): ClassifierDenyVerdict | undefined;
27
- /**
28
- * {@link classifierDenyDisplay} 的返回上界(字符数,含末尾省略号)。
29
- *
30
- * 🔴 为什么必须有界:入参 `args` 是**模型产出**的工具入参(UNTRUSTED),`Bash.command` 与
31
- * `Write.file_path` 都可以是任意长度的串。呈现面(cli 的 /permissions Recent Denials 是一行、
32
- * `wrap="truncate"`)自己也会截,但**库不许交出一个没有上限的串** —— 端把它塞进别的容器
33
- * (通知行、日志、剪贴板)时那道呈现截断就不在了。
34
- * 🔴 **本上界量的是「交出去的原文长度」,不是端渲出来那一行的最终宽度**(异源对抗复审 R1
35
- * finding③ 采纳的措辞订正):控制符 / 双向符 / 换行的可见化是**展示消毒**,归端
36
- * (cli `cleanUntrustedForDisplay`),而消毒会**变长** —— 200 个 ESC 在这里长度是 200,端把它们
37
- * 逐个转成 `\u001B` 之后是 1200。⇒ **端在自己消毒之后必须再按自己的行宽兜一次底**,别把本常量
38
- * 读成「拿到手就一定不超过 200 个显示格」。
39
- * 🔴 那为什么库不干脆先消毒再截(那样最终宽度就守得住)?因为消毒的字符集只能有**一份**:库里消
40
- * 一遍、端再消一遍,两份字符集必然漂([machine-readable-signal-not-visual-anchor] 同族),而
41
- * 端那一份还要管别的载体(hook 名 / fleet 行标签)。分工是刻意的:库守「原文不无限长」,
42
- * 端守「渲出来那一行不超宽」。
43
- */
44
11
  export declare const CLASSIFIER_DENY_DISPLAY_MAX = 200;
45
- /**
46
- * 一条分类器拒绝行的**显示名**:三端同形的「这一行说的是哪条命令 / 哪个文件」判定。
47
- *
48
- * 为什么在库里(而不是各端自己拼):端要渲的是同一件事(Recent Denials 行 / 通知行 / retry 提示),
49
- * 判据(读哪个入参键、什么算「在场」、上界多少)三端各写一遍必然各错一遍;而这是**纯判定**、零 IO、
50
- * 零展示——正合本包的归层。
51
- *
52
- * 判据(逐条):
53
- * · `Bash` ⇒ `args.command`;`Read`/`Write`/`Edit`/`MultiEdit` ⇒ `args.file_path`;
54
- * `NotebookEdit` ⇒ `args.notebook_path`(见 {@link DISPLAY_ARG_KEY_BY_TOOL});表外工具 ⇒ 工具名;
55
- * · 取到的值**必须是非空串**(trim 后非空)——非串 / 缺席 / 空串 / 纯空白一律回落工具名。
56
- * 🔴 回落**不是**「渲一个空行」:一个空的显示名会让那一行看起来像坏了,而工具名至少是真的;
57
- * · 工具名自身为空 ⇒ `'tool'`(与同文件 {@link classifierDenyNoticeText} 的兜底逐字同款);
58
- * · 结果长度上界 {@link CLASSIFIER_DENY_DISPLAY_MAX}(超出 ⇒ 截到上界、末位换 `…`)。
59
- *
60
- * 🔴 **绝不**在这里做展示消毒(控制符/双向符/换行)——那是端的事,理由见
61
- * {@link CLASSIFIER_DENY_DISPLAY_MAX} 头注。返回值仍然是 **UNTRUSTED-for-display**。
62
- * 🔴 本函数**不**回答 retry 粒度:重试哪一只调用、按什么规则铸,是端侧规则面的事
63
- * (身份锚 = `ClassifierDenyContext.toolCallId`)。
64
- */
65
12
  export declare function classifierDenyDisplay(toolName: string, args: unknown): string;
66
- /** 通知行文案(exported for tests;CC 207 三段 text 化)。 */
67
13
  export declare function classifierDenyNoticeText(toolName: string, reason: string | undefined): string;
@@ -1,43 +1,6 @@
1
- /**
2
- * ⇄ B2 批搬迁(2026-07-27,多端改造设计稿 §3 B2):cli src/sema/classifierVerdictWire.ts 的
3
- * **判定半场**搬入(帧识别 + 文案),`surfaceClassifierDeny()` 的**执行半场**留宿主
4
- * (它写 Ink `AppState.notifications` 并 lazy `require('../utils/autoModeDenials.js')`——
5
- * 两者都是 TUI/Node 私有面,进不了端无关包)。
6
- * 🔴 本文件零模块级可变状态(只有常量),故不受 B1「写读口必须同实例」纪律约束:壳侧留
7
- * 执行半场、判定走本包,是安全的拆缝(B6 T35/T36/T44 同款「判定半场搬入」姿势)。
8
- * 逐字纪律:CLASSIFIER_DENY_SIGNATURE / NOTICE_REASON_MAX(80)/ 通知行三段格式一字节不改。
9
- */
10
- /**
11
- * src/sema/classifierVerdictWire.ts — auto-mode 分类器裁决帧的壳侧消费(分类器批3 壳半场,[907])。
12
- *
13
- * WIRE 形状(gap-check 2026-07-16 实勘,core 1.279 dist 亲核):
14
- * 引擎侧分类器 block(core hooks.js runToolGate)→ decision = deny + decisionReason:"classifier",
15
- * permissionDenied 钩子收 source:"classifier"(server 1.209 只作 metrics 计量,不出独立 deny 帧)——
16
- * 壳能看见的唯一 wire 事实 = `tool_end` 帧:
17
- * { type:'tool_end', isError:true, output: [{type:'text', text:'<system-reminder>\n
18
- * auto-mode classifier blocked this call[: <reason>|: [<category>]]\n</system-reminder>'}] }
19
- * (core hooks.js L138 deny message 逐字 + formatHookFeedback 包 system-reminder;
20
- * agent-loop createErrorToolResult 落 content 数组;runtask toolOutputFrom 原样上 wire。)
21
- * ⇒ 消费面按此签名结构性识别,等价于「deny 帧带 source:'classifier'」的判定(签名字符串是
22
- * core 的机器产文面,非模型作文——模型 echo 不会以该签名做 tool_end 错误体开头)。
23
- *
24
- * 🔴 fail-soft 铁律:识别不中一律静默走原路,绝不伤害事件流。
25
- * 🔴 UNTRUSTED:reason 为分类器(模型)产文,只渲染绝不回喂;通知行截断 ≤80(207 同款)。
26
- */
27
- /**
28
- * 🟢 B8 ALLOW 清单登记(REF-CC-域词表-05,属主=client-core 规范重构轮,到期复议=core 改这句
29
- * deny message 文案时或 2026-Q4 复审以先到者为准):文本匹配 + 非文本结构性合取前置
30
- * (`ev.type==='tool_end' && ev.isError===true`,见 `classifierDenyFromToolEnd`)。同批同表的
31
- * 另两处:`detachWire.ts` `DETACH_DURABLE_OFF_400_ANCHOR`(server 契约话)、
32
- * `subagent/engineTaskHandleWire.ts` `STOP_CONFLICT_CODES`(SDK typed 缺席回落)——三处互指,
33
- * 理由逐条写在各自站点。
34
- */
35
1
  import { unwrapSystemReminder } from './systemReminderTag.js';
36
- /** core hooks.js 分类器 deny message 的机器签名(逐字锚;lockstep:core 改文案这里必须跟)。 */
37
2
  export const CLASSIFIER_DENY_SIGNATURE = 'auto-mode classifier blocked this call';
38
- /** 通知 reason 段截断(CC 207 L696763 同款 80 → 79+…)。 */
39
3
  const NOTICE_REASON_MAX = 80;
40
- /** wire tool_end.output → 文本(string / content 块数组 / {content} 三形;识别用,轻量本地版)。 */
41
4
  function textFromWireOutput(output) {
42
5
  if (typeof output === 'string')
43
6
  return output;
@@ -53,40 +16,18 @@ function textFromWireOutput(output) {
53
16
  .filter((t) => t !== undefined);
54
17
  return texts.length > 0 ? texts.join('\n') : undefined;
55
18
  }
56
- /**
57
- * core 分类器 deny 的**三个**铸点(core 5.52.0 dist 逐字枚举,候选③ [4974]):
58
- * ① `core/hooks.js:606` —— 基础形;
59
- * ② `core/runner/prepare-task.js:3103/3192` —— 继承自祖先层形;
60
- * ③ `core/runner/prepare-task.js:3023` —— 「批准过的编辑」在祖先层被拦形。
61
- * 三者尾巴同形:`: ${reason}` 或 `: [${category}]`(都没有时整条到此为止)。
62
- *
63
- * 🔴 **顺序即语义**:① 是 ② 的**前缀**,短的排在后面 —— 反过来的话 ② 会被 ① 蒙对,而 `tail` 变成
64
- * ` at an inherited ancestor layer: …`,不以 `': '` 开头 ⇒ **reason 整条丢失**(修前实况)。
65
- * 🔴 逐字锚,不做模糊匹配(B8 ALLOW 登记的既有纪律):core 改文案这里必须跟车。
66
- */
67
19
  const CLASSIFIER_DENY_FORMS = [
68
20
  'auto-mode classifier blocked the approved edit at an inherited ancestor layer',
69
21
  'auto-mode classifier blocked this call at an inherited ancestor layer',
70
22
  CLASSIFIER_DENY_SIGNATURE,
71
23
  ];
72
- /**
73
- * 结构性识别一张 tool_end 帧是否为分类器 deny 裁决帧。
74
- * 判定 = isError:true ∧ 错误体(去包裹后)以 core 机器签名开头。识别不中 ⇒ undefined(原路)。
75
- */
76
24
  export function classifierDenyFromToolEnd(ev) {
77
25
  if (!ev || ev.type !== 'tool_end' || ev.isError !== true)
78
26
  return undefined;
79
27
  const raw = textFromWireOutput(ev.output);
80
28
  if (raw === undefined)
81
29
  return undefined;
82
- // 件⑥([4974]):剥壳走**单一闸口** —— core ≥5.46 的开标签恒带 `mark="…"`,而这里原来锚的是
83
- // 裸开标签 ⇒ 恒剥不掉 ⇒ 下面的 startsWith 恒不成立 ⇒ 整条 auto-deny 呈现面静默失效。
84
- // 口径与另一座位(`subagent/engineDelegatedPrompt`)共用一份,见该模块头注。
85
30
  const message = unwrapSystemReminder(raw).trim();
86
- // 🔴 前缀**不是**语法(七审 finding③):命中之后还要看**边界**。core 的铸点尾巴只有两种形 ——
87
- // 到此为止,或紧跟 `': '`(reason / `[category]` 都走这一个分隔)。少了这条,
88
- // `…ancestor layerX` 这类近似串也会被判成分类器裁决,而那条路径会 `markEnded` + 摘 HOLD +
89
- // 写 Recent Denials + 用裁决原文覆盖渲染 —— 任何能产出工具错误正文的工具都能伪造。
90
31
  const form = CLASSIFIER_DENY_FORMS.find((f) => message.startsWith(f) && (message.length === f.length || message.startsWith(': ', f.length)));
91
32
  if (form === undefined)
92
33
  return undefined;
@@ -94,37 +35,7 @@ export function classifierDenyFromToolEnd(ev) {
94
35
  const reason = tail.startsWith(': ') ? tail.slice(2).trim() : undefined;
95
36
  return { message, ...(reason !== undefined && reason.length > 0 ? { reason } : {}) };
96
37
  }
97
- // ── L-69⑨(0.52.0):被拒行的**行文案判定**(三端同形)────────────────────────────────────────
98
- /**
99
- * {@link classifierDenyDisplay} 的返回上界(字符数,含末尾省略号)。
100
- *
101
- * 🔴 为什么必须有界:入参 `args` 是**模型产出**的工具入参(UNTRUSTED),`Bash.command` 与
102
- * `Write.file_path` 都可以是任意长度的串。呈现面(cli 的 /permissions Recent Denials 是一行、
103
- * `wrap="truncate"`)自己也会截,但**库不许交出一个没有上限的串** —— 端把它塞进别的容器
104
- * (通知行、日志、剪贴板)时那道呈现截断就不在了。
105
- * 🔴 **本上界量的是「交出去的原文长度」,不是端渲出来那一行的最终宽度**(异源对抗复审 R1
106
- * finding③ 采纳的措辞订正):控制符 / 双向符 / 换行的可见化是**展示消毒**,归端
107
- * (cli `cleanUntrustedForDisplay`),而消毒会**变长** —— 200 个 ESC 在这里长度是 200,端把它们
108
- * 逐个转成 `\u001B` 之后是 1200。⇒ **端在自己消毒之后必须再按自己的行宽兜一次底**,别把本常量
109
- * 读成「拿到手就一定不超过 200 个显示格」。
110
- * 🔴 那为什么库不干脆先消毒再截(那样最终宽度就守得住)?因为消毒的字符集只能有**一份**:库里消
111
- * 一遍、端再消一遍,两份字符集必然漂([machine-readable-signal-not-visual-anchor] 同族),而
112
- * 端那一份还要管别的载体(hook 名 / fleet 行标签)。分工是刻意的:库守「原文不无限长」,
113
- * 端守「渲出来那一行不超宽」。
114
- */
115
38
  export const CLASSIFIER_DENY_DISPLAY_MAX = 200;
116
- /**
117
- * 每只工具「拿哪个入参当行文案」的表(逐字锚 CC/sema 的工具入参键名,实测直证 sema-cli
118
- * `src/tools/*`:`BashTool` = `command`、`FileReadTool`/`FileWriteTool`/`FileEditTool` = `file_path`、
119
- * `NotebookEditTool` = **`notebook_path`**)。
120
- *
121
- * 🔴 `NotebookEdit` 的键**不是** `file_path`(它是 `notebook_path`)—— 写成 `file_path` 不会报错,
122
- * 只会让这只工具**永远**落回工具名兜底,而那正好和「没实现」长得一模一样(静默无效)。
123
- * 🔴 键名归一按 `toolNameKey`(去空白/下划线/连字符 + 小写),与本仓 `toolNameIsFsWrite` /
124
- * `toolNameIsShellExec` 的归一姿势逐字同款 —— 引擎侧工具名的书写形不由本包决定。
125
- * 🔴 表**外**的工具一律回落工具名:这是一张**识别表**,不是「合法工具只有这些」
126
- * (`engineErrorCodes` 的开集纪律同族)。
127
- */
128
39
  const DISPLAY_ARG_KEY_BY_TOOL = new Map([
129
40
  ['bash', 'command'],
130
41
  ['read', 'file_path'],
@@ -136,30 +47,9 @@ const DISPLAY_ARG_KEY_BY_TOOL = new Map([
136
47
  ['multiedit', 'file_path'],
137
48
  ['notebookedit', 'notebook_path'],
138
49
  ]);
139
- /** 工具名归一(与 `hitl/toolApprovalWire.ts` 的两个谓词逐字同款)。 */
140
50
  function toolNameKey(name) {
141
51
  return name.replace(/[\s_-]+/g, '').toLowerCase();
142
52
  }
143
- /**
144
- * 一条分类器拒绝行的**显示名**:三端同形的「这一行说的是哪条命令 / 哪个文件」判定。
145
- *
146
- * 为什么在库里(而不是各端自己拼):端要渲的是同一件事(Recent Denials 行 / 通知行 / retry 提示),
147
- * 判据(读哪个入参键、什么算「在场」、上界多少)三端各写一遍必然各错一遍;而这是**纯判定**、零 IO、
148
- * 零展示——正合本包的归层。
149
- *
150
- * 判据(逐条):
151
- * · `Bash` ⇒ `args.command`;`Read`/`Write`/`Edit`/`MultiEdit` ⇒ `args.file_path`;
152
- * `NotebookEdit` ⇒ `args.notebook_path`(见 {@link DISPLAY_ARG_KEY_BY_TOOL});表外工具 ⇒ 工具名;
153
- * · 取到的值**必须是非空串**(trim 后非空)——非串 / 缺席 / 空串 / 纯空白一律回落工具名。
154
- * 🔴 回落**不是**「渲一个空行」:一个空的显示名会让那一行看起来像坏了,而工具名至少是真的;
155
- * · 工具名自身为空 ⇒ `'tool'`(与同文件 {@link classifierDenyNoticeText} 的兜底逐字同款);
156
- * · 结果长度上界 {@link CLASSIFIER_DENY_DISPLAY_MAX}(超出 ⇒ 截到上界、末位换 `…`)。
157
- *
158
- * 🔴 **绝不**在这里做展示消毒(控制符/双向符/换行)——那是端的事,理由见
159
- * {@link CLASSIFIER_DENY_DISPLAY_MAX} 头注。返回值仍然是 **UNTRUSTED-for-display**。
160
- * 🔴 本函数**不**回答 retry 粒度:重试哪一只调用、按什么规则铸,是端侧规则面的事
161
- * (身份锚 = `ClassifierDenyContext.toolCallId`)。
162
- */
163
53
  export function classifierDenyDisplay(toolName, args) {
164
54
  const fallback = toolName.length > 0 ? toolName : 'tool';
165
55
  const key = DISPLAY_ARG_KEY_BY_TOOL.get(toolNameKey(toolName));
@@ -172,40 +62,17 @@ export function classifierDenyDisplay(toolName, args) {
172
62
  return bounded(fallback);
173
63
  return bounded(raw);
174
64
  }
175
- /**
176
- * 上界裁剪(超限 ⇒ 截到上界、末位换 `…`;与 {@link classifierDenyNoticeText} 的截法同形)。
177
- *
178
- * 🔴 **本函数守的是「截断不制造畸形」,不是「输出一定 well-formed」**(措辞由异源对抗复审 R2
179
- * finding 订正 —— 上一版写成「绝不交出孤代理项」是**过度声称**)。两件事必须分开:
180
- * · **截断制造的**孤高代理项 = 本函数的责任。`slice` 按 UTF-16 码元切,边界正好落在一个 emoji /
181
- * 星平面字符的**代理对中间**时,交出去的是一个本来不存在的畸形串 —— 那是本层自己弄坏的,
182
- * 必须自己不弄坏(少切一个码元、结果短一格)。
183
- * · **输入里本来就有的**孤代理项(高或低)= **原样透出**,与本文件其余 UNTRUSTED 位一个待遇。
184
- * `JSON.parse('"\ud800"')` 完全合法,所以这种入参是真实存在的;而把它「修好」就是**展示消毒**
185
- * —— 那一份在本包里已有唯一真源:{@link escapeDisplayControlChars}(`fleetTaskDesc.ts`,公面导出),
186
- * 它的头注逐字点名这一族:「孤代理项:上游可能本来就送半只,或被列宽截断劈开」。在这里再消一遍
187
- * = 第二份字符集,正是那条单源纪律要防的事。
188
- * 🔴 因此只回退**末位的高代理项**这一形:那是本函数唯一可能自己造出来的畸形(切的永远是前缀,
189
- * 所以断口只在尾部)。末位是低代理项 ⇒ 要么它的高位还在串里(配对完整),要么它在输入里本来就是
190
- * 孤的(上一条,原样透出)。
191
- * 🔴 组合记号 / 变体选择符 / ZWJ 序列被切开只是「显示成两个字」,仍是合法 Unicode —— 本函数不做
192
- * 字素簇分段(那要一整份 grapheme 表,且属于**渲染**面,与本文件的分工线一致)。
193
- */
194
65
  function bounded(s) {
195
66
  if (s.length <= CLASSIFIER_DENY_DISPLAY_MAX)
196
67
  return s;
197
68
  const keep = CLASSIFIER_DENY_DISPLAY_MAX - 1;
198
69
  let cut = s.slice(0, keep);
199
70
  const last = cut.charCodeAt(cut.length - 1);
200
- // 🔴 只有「末位是高代理项 **且** 原串紧接着的那个码元是低代理项」才是被截断劈开的合法代理对(本层
201
- // 自己造的畸形,少切一格);末位高代理项后面跟的不是低代理项 ⇒ 它在输入里本来就是孤的 ⇒ 原样透出
202
- // (对抗复审 r3 [medium]:无条件回退会静默删掉输入自带的孤高代理项,违反上面的分工线)。
203
71
  const next = s.charCodeAt(keep);
204
72
  if (last >= 0xd800 && last <= 0xdbff && next >= 0xdc00 && next <= 0xdfff)
205
73
  cut = cut.slice(0, -1);
206
74
  return `${cut}\u2026`;
207
75
  }
208
- /** 通知行文案(exported for tests;CC 207 三段 text 化)。 */
209
76
  export function classifierDenyNoticeText(toolName, reason) {
210
77
  let r = reason ?? '';
211
78
  if (r.length > NOTICE_REASON_MAX)
@@ -1,46 +1,9 @@
1
- /**
2
- * ⇄ B2 批搬迁(2026-07-27,多端改造设计稿 §3 B2):cli src/sema/clientContextWireCaps.ts 逐字搬入(零依赖)。
3
- */
4
- /**
5
- * src/sema/clientContextWireCaps.ts — PURE projection: the user's LOCAL identity facts (time zone + optional
6
- * email) → the `TaskRequest.clientContext` object the SERVICE relays to core `TaskSpec.clientContext`.
7
- *
8
- * THE GAP THIS CLOSES (design/112, core/search AI 2026-06-30 — core 1.181): the worker container runs UTC and
9
- * knows neither the user's time zone nor their identity. Without this, core renders the `# Environment` block's
10
- * "today" in CONTAINER time (UTC) — a TOB-fleet user in Asia/Tokyo sees the wrong date, and the model has no
11
- * email to attribute work. core 1.181 added the seam `TaskSpec.clientContext?: { timeZone?, userEmail? }`; the
12
- * CLIENT half is the shell stamping the user's real IANA zone (+ email when known) onto every request, so core
13
- * localizes "today" to the user's zone and ANNOTATES it (e.g. `(Asia/Tokyo)`); absent ⇒ core annotates `(UTC)`.
14
- *
15
- * SECURITY/CONTRACT (core 1.186 hardening, blackboard 2026-06-30):
16
- * - The `locale` field was a DEAD (zero-consumer) field in 1.181 and was DELETED in 1.186 — we NEVER set it
17
- * (only `timeZone` + `userEmail` actually drive rendering). An invalid IANA zone is core's problem to
18
- * validate (1.186: a malformed zone falls back to UTC + `(UTC)` rather than lying); the shell just forwards
19
- * what `Intl` resolved (always a valid zone on a real host).
20
- * - `userEmail` is benign identity metadata, NOT a secret/token (TaskRequest secret discipline still holds —
21
- * no tokens cross here). Sourced from `SEMA_USER_EMAIL` only when the shell actually knows it; absent ⇒ omit.
22
- *
23
- * PURE — no module-scope IO of its OWN beyond the caller-supplied `timeZone` + `env`, so it bundles + unit-tests
24
- * without the heavy settings/Intl graph (the caller passes the cached `getTimeZone()` from utils/intl). Mirrors
25
- * the other *WireCaps projection modules (selfOrchestration/webSearch).
26
- */
27
1
  import { type EnvLike } from './hostEnv.js';
28
- /** The env key the shell reads for the user's email (optional). SEMA_-namespaced. */
29
2
  export declare const USER_EMAIL_ENV: "SEMA_USER_EMAIL";
30
- /** The `clientContext` shape the SDK exposes (core 1.186: ONLY timeZone + userEmail are live fields). */
31
3
  export interface ClientContext {
32
4
  timeZone?: string;
33
5
  userEmail?: string;
34
6
  }
35
- /**
36
- * Build the `{ clientContext }` partial for `toTaskRequest` to spread.
37
- * - `timeZone`: the caller's resolved IANA zone (utils/intl `getTimeZone()` — always a valid zone on a host).
38
- * Omitted only if the host has no resolvable zone (degenerate stripped-ICU) so core annotates `(UTC)`.
39
- * - `userEmail`: trimmed `SEMA_USER_EMAIL`, only when non-empty. Never the empty string (that would read as a
40
- * present-but-blank email to core). Absent env ⇒ omitted.
41
- * Returns `{}` (no `clientContext` key) only when BOTH are absent, so a zone-less + email-less host keeps the
42
- * request shape unchanged (core defaults to UTC annotation).
43
- */
44
7
  export declare function clientContextField(timeZone: string | undefined, env?: EnvLike): {
45
8
  clientContext?: ClientContext;
46
9
  };
@@ -1,41 +1,5 @@
1
- /**
2
- * ⇄ B2 批搬迁(2026-07-27,多端改造设计稿 §3 B2):cli src/sema/clientContextWireCaps.ts 逐字搬入(零依赖)。
3
- */
4
- /**
5
- * src/sema/clientContextWireCaps.ts — PURE projection: the user's LOCAL identity facts (time zone + optional
6
- * email) → the `TaskRequest.clientContext` object the SERVICE relays to core `TaskSpec.clientContext`.
7
- *
8
- * THE GAP THIS CLOSES (design/112, core/search AI 2026-06-30 — core 1.181): the worker container runs UTC and
9
- * knows neither the user's time zone nor their identity. Without this, core renders the `# Environment` block's
10
- * "today" in CONTAINER time (UTC) — a TOB-fleet user in Asia/Tokyo sees the wrong date, and the model has no
11
- * email to attribute work. core 1.181 added the seam `TaskSpec.clientContext?: { timeZone?, userEmail? }`; the
12
- * CLIENT half is the shell stamping the user's real IANA zone (+ email when known) onto every request, so core
13
- * localizes "today" to the user's zone and ANNOTATES it (e.g. `(Asia/Tokyo)`); absent ⇒ core annotates `(UTC)`.
14
- *
15
- * SECURITY/CONTRACT (core 1.186 hardening, blackboard 2026-06-30):
16
- * - The `locale` field was a DEAD (zero-consumer) field in 1.181 and was DELETED in 1.186 — we NEVER set it
17
- * (only `timeZone` + `userEmail` actually drive rendering). An invalid IANA zone is core's problem to
18
- * validate (1.186: a malformed zone falls back to UTC + `(UTC)` rather than lying); the shell just forwards
19
- * what `Intl` resolved (always a valid zone on a real host).
20
- * - `userEmail` is benign identity metadata, NOT a secret/token (TaskRequest secret discipline still holds —
21
- * no tokens cross here). Sourced from `SEMA_USER_EMAIL` only when the shell actually knows it; absent ⇒ omit.
22
- *
23
- * PURE — no module-scope IO of its OWN beyond the caller-supplied `timeZone` + `env`, so it bundles + unit-tests
24
- * without the heavy settings/Intl graph (the caller passes the cached `getTimeZone()` from utils/intl). Mirrors
25
- * the other *WireCaps projection modules (selfOrchestration/webSearch).
26
- */
27
1
  import { hostEnv } from './hostEnv.js';
28
- /** The env key the shell reads for the user's email (optional). SEMA_-namespaced. */
29
2
  export const USER_EMAIL_ENV = 'SEMA_USER_EMAIL';
30
- /**
31
- * Build the `{ clientContext }` partial for `toTaskRequest` to spread.
32
- * - `timeZone`: the caller's resolved IANA zone (utils/intl `getTimeZone()` — always a valid zone on a host).
33
- * Omitted only if the host has no resolvable zone (degenerate stripped-ICU) so core annotates `(UTC)`.
34
- * - `userEmail`: trimmed `SEMA_USER_EMAIL`, only when non-empty. Never the empty string (that would read as a
35
- * present-but-blank email to core). Absent env ⇒ omitted.
36
- * Returns `{}` (no `clientContext` key) only when BOTH are absent, so a zone-less + email-less host keeps the
37
- * request shape unchanged (core defaults to UTC annotation).
38
- */
39
3
  export function clientContextField(timeZone, env = hostEnv()) {
40
4
  const rawEmail = env[USER_EMAIL_ENV];
41
5
  const userEmail = typeof rawEmail === 'string' ? rawEmail.trim() : '';
@@ -1,100 +1,50 @@
1
- /**
2
- * clientSlice.ts — **verb 门面接口定型**(B4,设计稿 §8-1 裁决:「要,但只定接口不定实现」)。
3
- *
4
- * ## 为什么要有这一层
5
- *
6
- * §6.1.4 解包 CC 桌面端量到 **854 条 IPC 通道**(`ns_$_Service_$_method`),其中会话相关的
7
- * `LocalSessions` 一族就有 212 个 verb。那一层客观存在而且很大 —— **不定接口,每端会各长一套**,
8
- * 于是 HITL 权威登记、通知直结这些「必须只有一个落点」的东西会被重写三遍。
9
- *
10
- * ## 但它**只是接口**
11
- *
12
- * 🔴 本文件不导出任何 IPC / HTTP / SDK 实现,一行运行时代码都没有(编译产物只有类型)。
13
- * 依据公理一:CC 的皮肤形状不进 wire ⇒ **IPC 的形状同样不该进 wire**。谁来实现:
14
- * · TUI = 直接把 `@sema-agent/sdk` 的 AgentClient 方法接上;
15
- * · web = BFF 转发(逐请求注入 principal);
16
- * · 桌面 = 主进程 IPC(CC 同款 `ns_$_Service_$_method` 形)。
17
- *
18
- * ## 判据:什么进这个接口
19
- *
20
- * **会话运行时自己会调的 verb 才进**。纯 UI 触发、端各自决定的动作(开面板、切主题、选文件)
21
- * 不进 —— 那些是端的事。今天这张表按 cli 现役会话链路归纳,`additive` 演进(只增不改),
22
- * 与 `CHROME_ARMS` 一样做成可断言的数据出口。
23
- */
24
- /** 一个 verb 的登记项(覆盖率断言用;与 `CHROME_ARMS` 同形)。 */
25
1
  export interface ClientVerbSpec {
26
- /** `ClientSliceLike` 上的方法名。 */
27
2
  verb: string;
28
- /** 缺它会让**已发生的行为丢失**(而不是少个装饰)⇒ required。 */
29
3
  required: boolean;
30
4
  duty: string;
31
5
  }
32
- /**
33
- * 会话运行时需要宿主提供的 verb 集合(**结构型**:实现方不必 implements,形状对上即可)。
34
- *
35
- * 全部返回 Promise —— 三端里有两端是跨进程/跨网络的,同步形会逼 web/桌面造假。
36
- */
37
6
  export interface ClientSliceLike {
38
- /** 发起一个 turn,拿到 wire 帧流(喂给 `adapt()`)。 */
39
7
  streamTask(req: unknown, opts?: {
40
8
  signal?: {
41
9
  readonly aborted: boolean;
42
10
  };
43
11
  }): AsyncIterable<unknown>;
44
- /** 取消在跑的 run(Esc / `-p` 的信号兜底)。 */
45
12
  cancelRun(runId: string): Promise<void>;
46
- /** 工具审批决断。`boundCallId` / `boundInputHash` **必须原样回显**,一个字节不改。 */
47
13
  respondApproval(input: {
48
14
  approvalId: string;
49
15
  decision: 'allow' | 'deny';
50
16
  boundCallId: string;
51
17
  boundInputHash: string;
52
18
  }): Promise<void>;
53
- /** AskUserQuestion 应答。 */
54
19
  respondQuestion(input: {
55
20
  questionId: string;
56
21
  answer: unknown;
57
22
  }): Promise<void>;
58
- /** plan-review 决断(`done{status:"needs_review"}` + gate `plan_review` 的 resume 腿)。 */
59
23
  respondPlanReview(input: {
60
24
  taskId: string;
61
25
  approved: boolean;
62
26
  feedback?: string;
63
27
  }): Promise<void>;
64
- /** 后台子代的实时转录尾巴(查看态)。 */
65
28
  tailSubagent(taskId: string): AsyncIterable<unknown>;
66
- /** 给在跑的子代插话(steer)。 */
67
29
  steerSubagent(input: {
68
30
  taskId: string;
69
31
  text: string;
70
32
  }): Promise<void>;
71
- /** 唤醒已停机的保留子代(design/144 `retainSubagentSessions` 的兑现面)。 */
72
33
  wakeSubagent(input: {
73
34
  taskId: string;
74
35
  message: string;
75
36
  }): Promise<void>;
76
- /** fleet 行帧流(常开;后台子代唯一在场的 lane)。 */
77
37
  streamFleet(): AsyncIterable<unknown>;
78
- /** 列会话(resume 选单)。 */
79
38
  listSessions(input?: {
80
39
  limit?: number;
81
40
  }): Promise<unknown>;
82
- /** 读一个会话的转录(桌面与 TUI 共享 `~/.claude/projects/**` 的先例,§8-11)。 */
83
41
  readSession(sessionId: string): Promise<unknown>;
84
- /** 引擎 caps(壳侧所有 `engineCapTrue` 门的数据源)。 */
85
42
  capabilities(): Promise<unknown>;
86
- /** 健康探测(🔴 语义差见 `probeHealth` 记账:SDK 要求 `status==='ok'`,壳现实现只要 `res.ok`)。 */
87
43
  probeHealth(): Promise<{
88
44
  ok: boolean;
89
45
  version?: string;
90
46
  }>;
91
47
  }
92
- /**
93
- * verb 覆盖率断言出口(§8-1 的另一半)。
94
- *
95
- * 宿主自检遍历本表,对 `required:true` 的逐条断言"我实现了"。不实现 ≠ 报错,是**那个面在该端是哑的**
96
- * —— 与 `CHROME_ARMS` 同一套纪律:把义务做成数据,而不是散落在注释里。
97
- */
98
48
  export declare const CLIENT_VERBS: readonly [{
99
49
  readonly verb: "streamTask";
100
50
  readonly required: true;
@@ -152,18 +102,5 @@ type _MissingFromTable = Exclude<keyof ClientSliceLike, (typeof CLIENT_VERBS)[nu
152
102
  type _ExtraInTable = Exclude<(typeof CLIENT_VERBS)[number]['verb'], keyof ClientSliceLike>;
153
103
  type _MustBeNever<T extends never> = T;
154
104
  export type _VerbTableClosure = [_MustBeNever<_MissingFromTable>, _MustBeNever<_ExtraInTable>];
155
- /**
156
- * 🔴 `probeHealth` 的**行为差记账**(B4,设计稿 §3 B4 第四件明确要求先保旧行为)。
157
- *
158
- * 壳里两处手拼 `/health`(`S/limitsWire.ts:225`、`S/detachWire.ts:82`)判的是 **`res.ok`**
159
- * (HTTP 2xx 即算活);SDK 的 `probeHealth` 额外要求 **`body.status === 'ok'`**。
160
- * 差异面:引擎起来了但自报 degraded(2xx + `status!=='ok'`)时 —— 手拼判**活**,SDK 判**死**。
161
- *
162
- * B4 的处置:**先保旧行为**(不换,两处仍判 `res.ok`),差异记在这里候裁。
163
- * 换的话是行为改动,要按宪法三问单独立项:
164
- * · 谁需要:degraded 引擎上 `--max-*` 版本门与 detach 头版本门本就该保守拒发 ⇒ SDK 语义更对;
165
- * · 谁受害:自报 degraded 但功能其实在线的引擎,`-p` 会少发 detach 头(断连即杀 run)⇒ 真回归;
166
- * · 补偿:换之前先量一次"degraded 但可用"在真部署里出不出现。
167
- */
168
105
  export declare const PROBE_HEALTH_DIVERGENCE: string;
169
106
  export {};
@@ -1,35 +1,3 @@
1
- /**
2
- * clientSlice.ts — **verb 门面接口定型**(B4,设计稿 §8-1 裁决:「要,但只定接口不定实现」)。
3
- *
4
- * ## 为什么要有这一层
5
- *
6
- * §6.1.4 解包 CC 桌面端量到 **854 条 IPC 通道**(`ns_$_Service_$_method`),其中会话相关的
7
- * `LocalSessions` 一族就有 212 个 verb。那一层客观存在而且很大 —— **不定接口,每端会各长一套**,
8
- * 于是 HITL 权威登记、通知直结这些「必须只有一个落点」的东西会被重写三遍。
9
- *
10
- * ## 但它**只是接口**
11
- *
12
- * 🔴 本文件不导出任何 IPC / HTTP / SDK 实现,一行运行时代码都没有(编译产物只有类型)。
13
- * 依据公理一:CC 的皮肤形状不进 wire ⇒ **IPC 的形状同样不该进 wire**。谁来实现:
14
- * · TUI = 直接把 `@sema-agent/sdk` 的 AgentClient 方法接上;
15
- * · web = BFF 转发(逐请求注入 principal);
16
- * · 桌面 = 主进程 IPC(CC 同款 `ns_$_Service_$_method` 形)。
17
- *
18
- * ## 判据:什么进这个接口
19
- *
20
- * **会话运行时自己会调的 verb 才进**。纯 UI 触发、端各自决定的动作(开面板、切主题、选文件)
21
- * 不进 —— 那些是端的事。今天这张表按 cli 现役会话链路归纳,`additive` 演进(只增不改),
22
- * 与 `CHROME_ARMS` 一样做成可断言的数据出口。
23
- */
24
- /**
25
- * verb 覆盖率断言出口(§8-1 的另一半)。
26
- *
27
- * 宿主自检遍历本表,对 `required:true` 的逐条断言"我实现了"。不实现 ≠ 报错,是**那个面在该端是哑的**
28
- * —— 与 `CHROME_ARMS` 同一套纪律:把义务做成数据,而不是散落在注释里。
29
- */
30
- // 🔴 **不要**给这个 const 加 `: readonly ClientVerbSpec[]` 注解 —— 注解会把 `verb` 拓宽成 `string`,
31
- // 下面那道编译期双向闭合门就变成恒真的空转(B4 首写时正是这么写的,加注解后 `Exclude` 恒为 `string`
32
- // ⇒ 门当场红且删表项也红,红得毫无判别力)。用 `as const satisfies` 既约束形状又保住字面量类型。
33
1
  export const CLIENT_VERBS = [
34
2
  { verb: 'streamTask', required: true, duty: '发起 turn 并回 wire 帧流(会话运行时的入口)' },
35
3
  { verb: 'cancelRun', required: true, duty: '取消在跑的 run(不实现 = Esc 只停渲染,引擎照跑)' },
@@ -45,18 +13,5 @@ export const CLIENT_VERBS = [
45
13
  { verb: 'capabilities', required: true, duty: '引擎 caps(所有能力门的数据源;不实现 = 门全判假)' },
46
14
  { verb: 'probeHealth', required: false, duty: '健康探测' },
47
15
  ];
48
- /**
49
- * 🔴 `probeHealth` 的**行为差记账**(B4,设计稿 §3 B4 第四件明确要求先保旧行为)。
50
- *
51
- * 壳里两处手拼 `/health`(`S/limitsWire.ts:225`、`S/detachWire.ts:82`)判的是 **`res.ok`**
52
- * (HTTP 2xx 即算活);SDK 的 `probeHealth` 额外要求 **`body.status === 'ok'`**。
53
- * 差异面:引擎起来了但自报 degraded(2xx + `status!=='ok'`)时 —— 手拼判**活**,SDK 判**死**。
54
- *
55
- * B4 的处置:**先保旧行为**(不换,两处仍判 `res.ok`),差异记在这里候裁。
56
- * 换的话是行为改动,要按宪法三问单独立项:
57
- * · 谁需要:degraded 引擎上 `--max-*` 版本门与 detach 头版本门本就该保守拒发 ⇒ SDK 语义更对;
58
- * · 谁受害:自报 degraded 但功能其实在线的引擎,`-p` 会少发 detach 头(断连即杀 run)⇒ 真回归;
59
- * · 补偿:换之前先量一次"degraded 但可用"在真部署里出不出现。
60
- */
61
16
  export const PROBE_HEALTH_DIVERGENCE = 'probeHealth: SDK 要求 status==="ok",壳侧 limitsWire:225 / detachWire:82 手拼只要 res.ok。' +
62
17
  'B4 保旧行为(res.ok),差异候裁 —— 换成 SDK 语义会让"自报 degraded 但可用"的引擎少发 detach 头。';