@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,11 +1,3 @@
1
- /**
2
- * **谁拒的** —— 判决是这次 deny 的那一**层**(sdk `DeniedBy` / core `DENIED_BY_VALUES`,
3
- * 7.6.0 起八词、**7.9.0 起九词**)。顺序逐字同源。
4
- * 🔴 真闭集(见模块顶注):表外词到不了消费端,所以这张表**没有**逃生口。
5
-
6
- * 🔴 形制:`Object.freeze` 的数组,**不是**只在类型面只读的 `readonly T[]` —— 后者一行 `.splice()`
7
- * 就能改,而公面消费者拿到的正是这个实例(本仓已定谳的病形,同 `RESUME_RETRY_LATER_CODES`)。
8
- */
9
1
  export const GATE_DENIED_BY_WORDS = Object.freeze([
10
2
  'policy',
11
3
  'hook',
@@ -17,66 +9,26 @@ export const GATE_DENIED_BY_WORDS = Object.freeze([
17
9
  'write_protection',
18
10
  'ask_resolution',
19
11
  ]);
20
- /**
21
- * 逐词一句人话。**九句刻意逐字互异**:对用户/运维是九条不同的下一步(改部署策略 / 改 hook /
22
- * 找组织管理员 / 撤自己的常驻规则 / 调 auto 模式 / 退出 plan 模式 / 找合规 / 改写保护表 /
23
- * 看那次审批的结算)。
24
- */
25
12
  const DENIED_BY_SENTENCES = Object.freeze({
26
- /** 部署 ToolPolicy 拒(直接拒,或复查一次已批准的编辑),或审批-编辑链撞了轮次上限。 */
27
13
  policy: "denied by this deployment's permission policy",
28
- /** PreToolUse hook 拒 / 抛 / 从未作答 —— 「没作决定的 hook」的 fail-closed 拦阻也按 hook 层归因。 */
29
14
  hook: 'denied by a PreToolUse hook',
30
- /** 组织策略规则拒。 */
31
15
  org: 'denied by an organization rule',
32
- /** **这个人自己**名下的一条常驻 deny 规则拒(他 settings 的 deny 表导进来的那类行)。
33
- * 它是 `org` 的**个人店同胞**:同属「可以否掉一次人已经给过的批准」的复查层。 */
34
16
  persisted_rule: 'denied by a persisted rule',
35
- /** auto 模式分类器**直接**拒(它的 ASK 侧角色是 `origin: "denial_limit_fallback"`,不是这一格)。 */
36
17
  classifier: 'denied by the auto-mode classifier',
37
- /** plan 模式对写工具的只读拦阻。 */
38
18
  plan_mode: 'denied because plan mode only allows reads',
39
- /** 合规的调用期锁。 */
40
19
  compliance: 'denied by a compliance lock',
41
- /** 一次被批准的编辑被限制链改写到了**没有任何审批覆盖**的写保护路径上。 */
42
20
  write_protection: 'denied because the write landed on a write-protected path',
43
- /** 这次 ask 的**结算本身**就是拒(有人说了不 / 窗到期 / 没人可问……)—— 细节在 `settlement`。 */
44
21
  ask_resolution: 'denied when the approval was resolved',
45
22
  });
46
- /**
47
- * 一个 `deniedBy` 词 → 一句人话。**唯一铸点**(三端共用;端零自拼)。
48
- *
49
- * 🔴 表外词的那一句说的是「**这条门记录本不该长这样**」,不是「有个新词」——理由见模块顶注
50
- * (出集的记录在 server 侧整条不上帧,所以真读到一个表外词意味着记录有缺陷)。原样带上那个
51
- * 词:运维要拿它去问上游。
52
- * 🔴 非串 / 空串同样走兜底 —— 一个读不出的层名不是「没有层」(deny 臂在类型上就必须点名一层)。
53
- * 🔴 **查表用 `Object.hasOwn`,不用 `in` / 裸下标**(异源对抗复审 [medium]):`Object.freeze` 冻的是
54
- * **自有属性**,原型链原样还在 ⇒ 一个来自 wire 的 `constructor` / `toString` / `__proto__` 会命中
55
- * `Object.prototype` 上的成员,措辞口于是返回一个**函数**而不是一句话:呈现调用当场坏掉,而且
56
- * 它绕过了上下两条精心分家的兜底。这是本仓已定谳的病形(wire 键控的表一律用 Map 或自有属性判据)。
57
- */
58
23
  export function gateDeniedByDetail(deniedBy) {
59
24
  if (typeof deniedBy === 'string' && Object.hasOwn(DENIED_BY_SENTENCES, deniedBy)) {
60
25
  return DENIED_BY_SENTENCES[deniedBy];
61
26
  }
62
27
  const word = typeof deniedBy === 'string' && deniedBy.length > 0 ? deniedBy : '(none)';
63
- return `denied, but the layer name ${word} is not one this gate record should be able to carry — engines withhold records that carry an unknown layer, so this one is damaged`;
28
+ return `denied by a layer this build does not know (${word}) — this build does not know this layer name: a newer engine may have added it, or the record may be damaged; this client cannot tell which`;
64
29
  }
65
- /**
66
- * 一只 ask 的**出身** —— 谁问的(sdk `AskOrigin` / core `ASK_ORIGINS`;7.5.x 及以前八词、
67
- * 7.6.0 十词、**7.9.0 起十一词**)。顺序逐字同源。
68
- * 🔴 真开集(见模块顶注):server 只判非空串,新词会带着合法的帧到达。
69
-
70
- * 🔴 形制:`Object.freeze` 的数组,**不是**只在类型面只读的 `readonly T[]` —— 后者一行 `.splice()`
71
- * 就能改,而公面消费者拿到的正是这个实例(本仓已定谳的病形,同 `RESUME_RETRY_LATER_CODES`)。
72
- */
73
30
  export const ASK_ORIGIN_WORDS = Object.freeze([
74
31
  'content_question',
75
- // 🔴 0.67.0 / core 7.14.0 **BREAKING 换词,无 alias**:`unresolvable` → `ancestor_marked`
76
- // (`dist/core/ask-origin.js:1` `ASK_ORIGINS` 真字节;`ask-origin.d.ts:36-38` 是它的定义句)。
77
- // 换的是**词**不是位:同一条 ladder 臂、同一张资格表。旧词按 clean-cut **不留别名** ——
78
- // 一条 pre-7.14 的耐久行带 `"unresolvable"` 时它是**非成员**,投影**省略**那一格(见
79
- // {@link askOriginDetail} 的表外词兜底句;`ASK_ORIGIN_SENTENCES` 里不再有它的一句)。
80
32
  'ancestor_marked',
81
33
  'org_unavailable',
82
34
  'org_rule',
@@ -88,30 +40,6 @@ export const ASK_ORIGIN_WORDS = Object.freeze([
88
40
  'safety_tighten',
89
41
  'policy',
90
42
  ]);
91
- /**
92
- * 逐词一句人话。**十一句刻意逐字互异** —— 尤其是这三对刻意分家的同胞:
93
- * · `org_unavailable` / `rule_store_unavailable`:两个「治理源这次读不出来 ⇒ fail-closed 问人」,
94
- * 一个是**组织**店、一个是**这个人自己**的持久规则店,下一步找的人不同;
95
- * · `shell_gate_tighten` / `safety_tighten`:两条 tighten 分成两个词,正是为了说出**哪一层**
96
- * 引擎逻辑提的问(粗粒度 shellGate 教条 vs 调用的显式事实:egress 标 / 不可逆标 / 写保护);
97
- * · `org_rule` / `ask_rule`:组织的规则 vs 这个人自己的常驻 ask 行。
98
- *
99
- * ── 🔴 0.65.0 三句订正(B-080③;core `dist/core/ask-origin.d.ts` 真字节)───────────────────────
100
- * 三句修前各自漂开了上游的定义,而漂的方向都是「把引擎真正说的事换成一件别的事」:
101
- * · **`ancestor_marked`**(0.67.0 前名 `unresolvable`)修前渲「门拿不定主意」—— core:36-38 逐字是「the call is MARKED by an
102
- * ancestor (an inherited approver-unavailable float, or a durable mandate floated down because
103
- * this task can park it): it must reach the park with no synchronous decision-maker in between」。
104
- * 那不是犹豫,是**祖先盖的标记**+一条硬路径约束;渲成「拿不定主意」会让人去找一个不存在的
105
- * 「让门自己拿主意」的配置。
106
- * · **`shell_gate_tighten`** 修前渲「**每一条** shell 命令都问」—— 过度陈述。core:58-59 逐字是
107
- * 「raised the ask over a tier the COARSE `shellGate` doctrine installed」:问的是**这一档以上**的,
108
- * 不是全部。
109
- * · **`rule_store_unavailable`** 修前渲固定的「规则店读不出来」—— 而这一个词 core 7.9.0 起盖的是
110
- * **两种机制**(store 读失败 **或** tightening lexer 的 `unreadable`:展开里有读不懂的词 / 引号未
111
- * 闭合 / 语法错,core:44-51),core CHANGELOG 7.9.1 逐字交代处置:「a card that hard-codes store
112
- * wording for the origin should read the message」。⇒ 本铸点改成**引擎的 `message` 优先**(见
113
- * {@link askOriginDetail} 的 additive 第二参),表里留的那一句改成两种机制都成立的中性句。
114
- */
115
43
  const ASK_ORIGIN_SENTENCES = Object.freeze({
116
44
  content_question: 'the tool itself asked you a question',
117
45
  ancestor_marked: 'an ancestor marked this call (an inherited approver-unavailable float, or a durable mandate): it must reach the park with no synchronous decision-maker in between',
@@ -125,41 +53,11 @@ const ASK_ORIGIN_SENTENCES = Object.freeze({
125
53
  safety_tighten: 'the gate tightened on this call’s own facts (network egress, irreversibility, or a protected write)',
126
54
  policy: 'this deployment’s permission policy asks about this call',
127
55
  });
128
- /**
129
- * 哪些 `origin` 词的一句人话应当**让位给引擎自己的 `message`**(闭集;0.65.0 新铸)。
130
- *
131
- * 🔴 **不是「有 message 就用 message」**:绝大多数出身词的那一句是本包写的、对每一只同出身的 ask
132
- * 都成立的**定义句**,而引擎的 `message` 是**这一只**调用的拒因/疑因散文 —— 两者不同类,
133
- * 无差别地拿 message 顶掉定义句会把「谁问的」换成「引擎这一次写了什么」。
134
- * 🔴 本集只收**一个词盖了多种机制**的那一类:`rule_store_unavailable` 的两条腿(店读不出来 /
135
- * 这条命令对不上你的规则行)对人的下一步不同,而只有引擎的 message 分得出来。
136
- * 加员 = 上游又把一个词做成了多机制合并词,必须同批带坐标。
137
- */
138
56
  const ORIGIN_PREFERS_ENGINE_MESSAGE = new Set(['rule_store_unavailable']);
139
- /**
140
- * 一个 `origin` 词 → 一句人话。**唯一铸点**(三端共用;端零自拼)。
141
- *
142
- * @param origin 帧/行上的 `origin` 词(开集;非串/空串走兜底)
143
- * @param message 🆕 **0.65.0 additive 第二参**(B-080③):引擎在这只调用上给的散文
144
- * (`PermissionResult.message` / 卡上的同名位)。**只在 {@link ORIGIN_PREFERS_ENGINE_MESSAGE}
145
- * 的词上优先**,其余词一字不读 —— 理由写在那张表的头注。缺席 / 非串 / 空白串 ⇒ 行为与本参
146
- * 出现之前**逐字节相同**(表里那一句中性定义句)。
147
- *
148
- * 🔴 表外词的那一句说的是「**这个词比这一端新**」,不是「坏记录」——理由见模块顶注(server 只判
149
- * 非空串,core 加词当天合法的帧就带着它到达)。原样带上那个词,并明说这次仍然是在问人:
150
- * 读不懂出身**不改变**这只 ask 要人回答这件事。
151
- * 🔴 非串 / 空串:同走兜底但词位渲 `(none)` —— 「没报出身」与「报了一个读不懂的出身」在这一句里
152
- * 不必分家(两者对用户的下一步相同:照常回答这只 ask),但都**不许**被折成十一词里的任何一个。
153
- * 🔴 `message` 是引擎/工具产文,**只渲不回喂模型**(与卡上其余散文位同一条纪律);本铸点
154
- * **不截断不改写**它 —— 显示封顶归端(它才知道自己的行宽)。
155
- */
156
57
  export function askOriginDetail(origin, message) {
157
- // 🔴 自有属性判据,理由与 `gateDeniedByDetail` 逐字相同(冻结不移除原型)。
158
58
  const known = typeof origin === 'string' && Object.hasOwn(ASK_ORIGIN_SENTENCES, origin)
159
59
  ? ASK_ORIGIN_SENTENCES[origin]
160
60
  : undefined;
161
- // 🔴 让位只在**多机制合并词**上发生,且只在 message 真是一句非空散文时:引擎没给 / 给的是坏值
162
- // ⇒ 回落表里那一句中性定义句(绝不渲半句、绝不渲空)。
163
61
  if (typeof origin === 'string' && ORIGIN_PREFERS_ENGINE_MESSAGE.has(origin)) {
164
62
  const spoken = typeof message === 'string' ? message.trim() : '';
165
63
  if (spoken.length > 0)
@@ -170,75 +68,17 @@ export function askOriginDetail(origin, message) {
170
68
  const word = typeof origin === 'string' && origin.length > 0 ? origin : '(none)';
171
69
  return `this call asks; its origin ${word} is a word newer than this client, so answer it as usual`;
172
70
  }
173
- /**
174
- * **编译期对账钉**(不出公面):`DeniedBy` 那张表的成员必须真属于 sdk 的联合,**双向**
175
- * (它在 wire 上是真闭集,型面也闭)。
176
- */
177
71
  const _deniedByWordsPin = GATE_DENIED_BY_WORDS;
178
72
  void _deniedByWordsPin;
179
- /**
180
- * 🔴 **`AskOrigin` 那条型面钉 0.67.0 退役,理由要写清**(如实登记,不是偷偷删):
181
- * 它此前写作 `const _askOriginWordsPin: readonly AskOrigin[] = ASK_ORIGIN_WORDS`,而
182
- * `AskOrigin = SdkAskOrigin` 的型面带 `(string & {})` 逃生口 ⇒ **任何字符串都满足它**,这条钉
183
- * 在 core 7.14.0 把 `unresolvable` 换成 `ancestor_marked` 的当天**一声不响**(亲验:换词后
184
- * `npx tsc --noEmit` 0 红)。一条恒真的钉不是钉,是[gates-fail-in-their-own-ways] 的「无契约表」那一档。
185
- * ⇒ 判据整只移交给 `run-gate-vocabulary-test.mjs` 的 **B 段**:本表对 **core `ask-origin.js` 的
186
- * `ASK_ORIGINS` 真字节**双向等值(词表属主是 core,sdk 只是它的镜像且**今天滞后一代**)。
187
- * 那条对账拿的是运行期真字节,逃生口影响不到它。
188
- */
189
- // ══ 0.67.0 / core 7.14.0 #688 C3 —— 第三张表:`ruleStoreUnreadable` 两词 ═════════════════════
190
- //
191
- // 它不是 `AskOrigin` 的第十二个词,而是**一个 origin 词底下的机制位**:`rule_store_unavailable`
192
- // 这一个词盖了**两种机制**(core `ask-origin.d.ts:98-104` 顶注逐字点名),而对人的下一步**相反**。
193
- // 词表属主 = core `RULE_STORE_UNREADABLE_KINDS`(`ask-origin.d.ts:116`),本包逐词逐序镜像,
194
- // `run-gate-vocabulary-test.mjs` 的 C 段对**实装 core 的真字节**双向等值。
195
- /**
196
- * **规则店读不出来是哪一头**(core `RULE_STORE_UNREADABLE_KINDS`;逐词逐序镜像,7.14.0 起两词)。
197
- * · `store` —— 接上的那个店**读不出来**(读失败 / 超时 / 适配器抛了);
198
- * · `call` —— 店读到了,但**这一次调用**读不出来(收紧 lexer 的 `unreadable`:展开里有读不懂的词 /
199
- * 引号未闭合 / 语法错 —— 引擎自己那句话在 ask 的 `message` 上)。
200
- *
201
- * 🔴 **真闭集**(与 `AskOrigin` 的开集刻意不同):core 在**唯一 stamp 点**把政策自报的值剥掉之后
202
- * 才盖章(7.14.0 合同逐字「A policy's self-declared value is removed at the stamp」)⇒ 表外值
203
- * 结构上到不了消费端。
204
- * 🔴 形制:`Object.freeze` 的数组,理由同上面两张表。
205
- */
206
- // 🔴 0.68.0 / L-245:形制从 `readonly string[]` 改成**字面元组**(理由同 `CLASSIFIER_DENY_CAUSES`:
207
- // 型面交得出成员字面量,端才能派生型而不是再抄一遍两个词)。
208
73
  export const RULE_STORE_UNREADABLE_KINDS = Object.freeze(['store', 'call']);
209
74
  const RULE_STORE_UNREADABLE_SET = new Set(RULE_STORE_UNREADABLE_KINDS);
210
- /** 这个值是不是 {@link RULE_STORE_UNREADABLE_KINDS} 的成员(core `isRuleStoreUnreadable` 的镜像)。
211
- * 🔴 **唯一判据口**:窄读器与端都调它,谁都不许再抄一份字面量(B-025 的根因就是手抄)。
212
- * 🔴 0.68.0 / L-245:改成**型守卫** —— 端用它一判就拿到闭集成员型,下一步喂措辞铸点时不必 cast。 */
213
75
  export function isRuleStoreUnreadableKind(v) {
214
76
  return typeof v === 'string' && RULE_STORE_UNREADABLE_SET.has(v);
215
77
  }
216
- /** 逐词一句人话。**两句刻意逐字互异** —— 两条不同的下一步(去修部署的规则店 / 去改自己那条规则)。
217
- * 🔴 0.68.0 / L-245:表型改 `Record<RuleStoreUnreadableKind, string>` —— core 加第三个机制词那天
218
- * **这张表少一个键 ⇒ 编译期当场红**,逼人同批补那一句话(修前是 `Record<string,…>`,加词一声不响)。 */
219
78
  const RULE_STORE_UNREADABLE_SENTENCES = Object.freeze({
220
79
  store: 'your standing deny/ask rules could not be read at all (the rule store did not answer), so this call asks',
221
80
  call: 'this command could not be read against your standing deny/ask rules (the engine’s own sentence is on this ask), so it asks',
222
81
  });
223
- /**
224
- * 一个 `ruleStoreUnreadable` 词 → 一句人话。**唯一铸点**(三端共用;端零自拼)。
225
- *
226
- * 🔴 **与 {@link askOriginDetail} 并列不互替**:那一句答「谁问的」(出身),本句答「读不出来的是
227
- * **哪一头**」。`rule_store_unavailable` 那只 ask 上两句都该在,渲一句丢一句就等于把人指去
228
- * 错的地方 —— 而这正是 core 把这一位单独铸出来的理由。
229
- * 🔴 **查表用 `Object.hasOwn`**(冻结不移除原型;理由与本文件另两个铸点逐字相同)。
230
- *
231
- * ── 🔴 0.68.0 / L-245:入参从 `unknown` 收窄成**闭集成员型** ─────────────────────────────────
232
- * 修前这里同样留着一句「is **a word newer than this client**」的兜底,而它**结构上走不到**:
233
- * 唯一到达本铸点的路是卡口的窄读器(`toolApprovalWire` 的 `readRuleStoreUnreadable`),那一层已经
234
- * 按闭集把表外值判成了缺席;而这一面在上游是**真闭集**(core 在唯一 stamp 点把政策自报值剥掉之后
235
- * 才盖章)⇒ 一个「比这一端新」的值根本到不了。
236
- * ⚠️ 与**隔壁那一句**({@link askOriginDetail})的处置刻意相反,而两边都是对的:`AskOrigin` 在 wire
237
- * 上是**开集**(server 只判非空串,core 加词当天合法的帧就带着它到达)⇒ 那一句兜底**真的会被
238
- * 走到**,必须留。一套面一条规矩:闭集则收窄 + 编译期围栏,开集则保留兜底。
239
- * 🔴 渲染路径不许抛,所以 never 分支照样交一句话;只是它现在说的是「这个词不在本端的闭集里」
240
- * (一句真话),而不再冒充「上游比我新」。
241
- */
242
82
  export function ruleStoreUnreadableDetail(kind) {
243
83
  const known = Object.hasOwn(RULE_STORE_UNREADABLE_SENTENCES, kind)
244
84
  ? RULE_STORE_UNREADABLE_SENTENCES[kind]
@@ -1,142 +1,15 @@
1
- /**
2
- * REF-CC-156(midband-04,split,2026-08-02):拆自 `hooksWireCaps.ts`——那个文件里约 220 行(占其
3
- * 387 行的 57%)是 `/goal` 命令专属的 Stop-hook 版本判档 + prompt 组装 + 模块级单实例状态,与
4
- * `hooksWireCaps.ts` 其余部分(通用 settings-file hooks 投影 + 治理门)是两个不同的关注点,原文件
5
- * 只在 `hooksForWire()` 尾部合流一次。纯搬迁,行为不变:所有导出名字原样保留(`hooksWireCaps.ts`
6
- * 显式 re-export,外部 import 路径零改动),模块级状态(`wireSessionStopHookPrompt`/
7
- * `wireSessionStopHookCcSemantics`)随代码一起搬到本文件,`docs/refactor/p1-scan/singleton-manifest.json`
8
- * 的两条登记同批把 `file` 改成本文件坐标。
9
- *
10
- * ── 以下为原文件的领域说明(逐字保留)────────────────────────────────────────────────────────
11
- *
12
- * SESSION-SCOPED Stop hook overlay(`/goal`,任务 #75 · C-7,2026-07-26)
13
- * CC 220 的 `/goal <condition>` 会往 `sessionHooksRegistry` 注册一条会话级 Stop×prompt 钩子
14
- * (`t.sessionHooksRegistry.add(sessionId,"Stop","",{type:"prompt",prompt})`),那才是「干到条件满足
15
- * 再停」的机制半边。CC 是单进程,注册进壳内 registry 就够。
16
- *
17
- * 🔴 **sema 是双进程壳,壳侧那条钩子在 live 模式 fire 不到**(实证,不是推测):壳的 Stop 钩子只有
18
- * `src/query/stopHooks.ts handleStopHooks` 一个执行点,调用方是 `src/query.ts` —— 壳自己的 query
19
- * 循环;live 模式 turn 循环在引擎里跑,壳的 query.ts 不参与。upstreamBridge 只 fire SubagentStop 且
20
- * observe-only。所以引擎腿必须走 `settings.hooks` 投影,这个 overlay 就是那条腿。
21
- *
22
- * 🟢 **本 overlay 默认开**(2026-07-26 翻默认;逃生口 `SEMA_GOAL_STOP_HOOK_WIRE=0/false/no/off`)。
23
- *
24
- * 修前默认关,理由是两条**前提**——两条都已被 server 侧行为取证**证伪**([1721],6 条行为
25
- * 用例已进 server 仓;cli 仓另有 scripts/run-goal-stop-hook-live-test.mjs 的真引擎+真模型复验):
26
- * ① 旧论断「SDK 类型 DEFERRED ⇒ 服务端会 400」**是把类型面当成了运行时校验面**,对 server
27
- * 不成立:`parseHooksConfig({Stop:[{hooks:[{type:"prompt",prompt}]}]})` 无 error、真解析;
28
- * prompt 形在 server 的条目白名单里与 command/http/agent **并列**
29
- * (@sema-agent/server hooks/hook-runner `entry.type !== "command" && … !== "prompt" && …`
30
- * 那道 type_not_supported 闸口把 prompt 放行,1.277.1 dist 对应 hook-runner.js:390)。
31
- * 卡着的只是 **SDK / registry-core 的类型**(见下方 cast),与 server 运行时接受与否两件事。
32
- * ② 旧论断「引擎侧 Stop×prompt 是否真 fire 未取证」已取证:**真 fire**(Stop 触发时 prompt
33
- * 载体调用一次,`$ARGUMENTS` 已替换为 payload JSON)、**能拦停**(模型输出
34
- * `{"decision":"block","reason":…}` → `{block: reason}`,core `runner/runtask.js:1663`
35
- * `(spec.hooks ?? deps.hooks)?.stop` 起 stop gate,整条链通)、非决策 JSON 不拦(与 command
36
- * 形 exit-0 非 JSON 同语义)、`stop_hook_active:true` 如实进 payload(模型可自己收手;core
37
- * 另有 STOP_HOOK_BLOCK_CAP=8 连续拦停硬上限兜底,不会无限拦停)。
38
- * ③ 最坏情况**不是** 400,而是**钩子不生效**:部署没组装 prompt 载体(`ctx.hookLlm` 缺席)⇒
39
- * server 记账 `hook_entries_skipped{reason:"llm_carrier_unavailable"}` 并跳过,**非阻断**。
40
- * ⇒ 默认开。等件(不阻断本腿):registry-core hooks 契约建模 prompt 形([1717]① 在飞)、SDK
41
- * `SettingsHookCommand` 放开 prompt 形 —— 到位后把下方 cast 换成直类型即可。
42
- *
43
- * 纪律:
44
- * - 只放 goal 这一条(单值,不是通用会话钩子通道)——通用会话/插件钩子仍按 `hooksWireCaps.ts`
45
- * 模块头所述不投影;
46
- * - 走 `hooksForWire()` 的**同一套治理门**(trust / disableAllHooks / allowManagedHooksOnly):
47
- * overlay 在门之后才合并,策略禁钩子时一并禁掉;
48
- * - `/goal clear` 传 null 收回。
49
- */
50
1
  import { type EnvLike } from './hostEnv.js';
51
2
  import type { WireHooksConfig } from './finalVerifyWire.js';
52
- /** The env ESCAPE HATCH for the engine leg (see the block comment above). */
53
3
  export declare const GOAL_STOP_HOOK_WIRE_ENV = "SEMA_GOAL_STOP_HOOK_WIRE";
54
4
  export declare const CC_STOP_SEMANTICS_MIN_SERVER = "1.279.3";
55
- /**
56
- * 引擎自报版本是否达到 CC Stop 语义线({@link CC_STOP_SEMANTICS_MIN_SERVER})。
57
- *
58
- * 🔴 三条纪律:
59
- * · **数值比较**,不是字典序(`1.9.0` < `1.279.0`,字符串比较会判反);
60
- * · **预发版不算达标**(`1.279.0-rc.1` 里那套可能还在改)——正则只认三段纯数字,带 `-` 的直接落
61
- * null ⇒ false;
62
- * · 读不出/探不到 ⇒ **false**(降级方向恒安全:老形在新引擎上仍能拦,新形在老引擎上一次都拦不住)。
63
- */
64
5
  export declare function ccStopSemanticsFromVersion(version: string | undefined | null): boolean;
65
- /**
66
- * 本会话连着的引擎是否具备 CC Stop 语义?判据 = live 车道的 `/v1/capabilities` 自报 `version`
67
- * (engineCapsCache 的 boot-kick 缓存,与 `/health.version` 同源)。
68
- *
69
- * 🔴 「未判即降级」:caps 探测是构造期 fire-and-forget,`/goal` 真被敲下时通常早已落袋;万一没落袋
70
- * 就按老引擎走(meta 也同步退档)——**宁可少承诺,不可多承诺**。
71
- */
72
6
  export declare function engineCcStopSemantics(env?: EnvLike): boolean;
73
- /**
74
- * Is the `/goal` Stop-hook engine leg armed? **Default ON** since 2026-07-26 — both of the premises
75
- * that kept it opt-in were disproved by server-side behavior evidence ([1721]) and re-verified against
76
- * a real engine + real model (cli scripts/run-goal-stop-hook-live-test.mjs). Set
77
- * `SEMA_GOAL_STOP_HOOK_WIRE` to an {@link envFlagOff} spelling(REF-CC-141 dup-02 单源)to disarm
78
- * (an operator escape hatch, not a default).
79
- */
80
7
  export declare function isGoalStopHookWireArmed(env?: EnvLike): boolean;
81
- /**
82
- * Register (or clear, with `null`) the session-scoped `/goal` Stop prompt hook that rides
83
- * `settings.hooks.Stop` to the engine. Single-valued: a new goal replaces the previous one,
84
- * exactly like CC 220's `Xdr` (remove-then-add). Projection is gated by
85
- * {@link isGoalStopHookWireArmed} — storing is always safe, sending is not (yet).
86
- */
87
8
  export declare function setWireSessionStopHook(prompt: string | null, opts?: {
88
- /**
89
- * 这条目标登记时,引擎是否已判定为 CC 语义档({@link engineCcStopSemantics})?
90
- *
91
- * 🔴 **为什么要在 set 那一刻锁存,而不是在 `hooksForWire()` 里现读**:`/goal` 的 meta
92
- * (对模型讲「会不会拦到条件成立为止」)是在 set 那一刻发出去的,而投影发生在随后每个 turn。
93
- * 两处各读一次的话,caps 探测中途落袋就会造出「meta 承诺拦到底、投出去的却还是老门」的错配 ——
94
- * 判据必须锚在**真正决定结果的那个量**上,而它只有一个:**这条目标登记时的档位**。
95
- * 缺省 false ⇒ 不传就是老引擎档:翻档只能靠证据打开,不能靠默认值。
96
- */
97
9
  ccSemantics?: boolean;
98
10
  }): void;
99
- /** The currently registered `/goal` Stop prompt, or null (registered ≠ projected — see the gate). */
100
11
  export declare function getWireSessionStopHook(): string | null;
101
- /** 当前这条目标登记时锁存的档位(真 = 投裸条件,假 = 投壳自造的门)。 */
102
12
  export declare function getWireSessionStopHookCcSemantics(): boolean;
103
- /**
104
- * 把 `/goal` 的**原始条件**包成一条对引擎 prompt 载体**可执行**的 Stop 门 prompt。
105
- *
106
- * 🔴 适用面(2026-07-26 提货批后):**只用于未达标线的引擎档**(见 {@link CC_STOP_SEMANTICS_MIN_SERVER})。
107
- * 达标档起引擎自己按 CC
108
- * 220 逐字组装(系统提示 + 会话转录 + `wrapCondition`),那一档投的是**裸条件** —— 见
109
- * {@link ccStopSemanticsFromVersion} 与 `hooksForWire()` 的分道(见 {@link goalStopHookMatcher})。
110
- * 本函数保留,是 tolerate-absent 的实体:老引擎上退回它,仍能拦一次;删掉它等于在老引擎上静默失效。
111
- *
112
- * 🔴 为什么必须包(2026-07-26 live 围栏实测,不是设计偏好):CC 单进程的 prompt 钩子执行器
113
- * (`src/utils/hooks/execPromptHook.ts`)会给条件**套一层系统提示**(「You are evaluating a hook…
114
- * 回 `{ok:true}` / `{ok:false,reason}`」)**并把整段会话前置**,所以裸条件在 CC 那边能被真评估。
115
- * 引擎侧的载体两样都没有:
116
- * · 无系统提示、无会话历史;
117
- * · Stop payload 的 `transcript_path` 是**空串**(server basePayload),评估者对本会话是**瞎的**;
118
- * · 判据 schema 也不同 —— core 只认 stdout JSON 的 `decision:"block"`。
119
- * 实测(钉版 server 1.277.1 + core 1.416 + 真模型):裸条件 `the project contains a file named
120
- * DONE.txt` 送过去,载体照样被调用,模型回的是**散文**(「I don't have direct access to your file
121
- * system…」)⇒ `parseHookStdout` 拿不到 decision ⇒ **一次都不拦**。即:不包 = 每次停机白烧一次
122
- * 模型调用、零效果。
123
- *
124
- * 所以这里把条件包成引擎契约里**能落地**的形状。诚实标注它**够不到 CC 的完整语义**:
125
- * · 能做到:每个 turn 的**第一次**停机尝试被拦下,目标原文重新注入给模型,逼它自查后再收尾
126
- * (`stop_hook_active` 为真时门自己收手 ⇒ 不会无限拦停);真正「条件是否成立」的判断交给
127
- * **有会话、有工具的主模型**,而不是让瞎的评估者假装判断;
128
- * · 做不到:CC 那种「拦到条件真成立为止」(需要引擎把 transcript 交给载体)、以及「条件满足后
129
- * 自动清除目标」。这两条是**等件**,meta 文案因此不照抄 CC `Pwo`(见 cmd-goal.tsx)。
130
- *
131
- * 台账仍存**原始条件**({@link getWireSessionStopHook}),所以 `/goal clear` 读回的是用户写的那句。
132
- */
133
13
  export declare function buildGoalStopHookPrompt(condition: string): string;
134
- /**
135
- * `hooksWireCaps.ts` 的 `hooksForWire()` 尾部合流点(REF-CC-156 拆分的接口):治理门跑完之后,
136
- * 调用方传入 `managedOnly`(allowManagedHooksOnly 是否命中),本函数原样返回要 concat 进
137
- * `merged['Stop']` 的那一条 matcher,或 `null`(未登记 / 被 managedOnly 挡 / overlay 未 armed)。
138
- * 非导出到包外(不进 `index.ts` 的公开面)——只是本文件与 `hooksWireCaps.ts` 之间的私有接口。
139
- */
140
14
  export declare function goalStopHookMatcher(managedOnly: boolean): NonNullable<WireHooksConfig[string]>[number] | null;
141
- /** 测试钩:清 `/goal` 锁存(壳里靠进程边界隔离;包内同进程多组断言必须能清)。 */
142
15
  export declare function __resetGoalStopHookForTests(): void;
@@ -1,119 +1,14 @@
1
- /**
2
- * REF-CC-156(midband-04,split,2026-08-02):拆自 `hooksWireCaps.ts`——那个文件里约 220 行(占其
3
- * 387 行的 57%)是 `/goal` 命令专属的 Stop-hook 版本判档 + prompt 组装 + 模块级单实例状态,与
4
- * `hooksWireCaps.ts` 其余部分(通用 settings-file hooks 投影 + 治理门)是两个不同的关注点,原文件
5
- * 只在 `hooksForWire()` 尾部合流一次。纯搬迁,行为不变:所有导出名字原样保留(`hooksWireCaps.ts`
6
- * 显式 re-export,外部 import 路径零改动),模块级状态(`wireSessionStopHookPrompt`/
7
- * `wireSessionStopHookCcSemantics`)随代码一起搬到本文件,`docs/refactor/p1-scan/singleton-manifest.json`
8
- * 的两条登记同批把 `file` 改成本文件坐标。
9
- *
10
- * ── 以下为原文件的领域说明(逐字保留)────────────────────────────────────────────────────────
11
- *
12
- * SESSION-SCOPED Stop hook overlay(`/goal`,任务 #75 · C-7,2026-07-26)
13
- * CC 220 的 `/goal <condition>` 会往 `sessionHooksRegistry` 注册一条会话级 Stop×prompt 钩子
14
- * (`t.sessionHooksRegistry.add(sessionId,"Stop","",{type:"prompt",prompt})`),那才是「干到条件满足
15
- * 再停」的机制半边。CC 是单进程,注册进壳内 registry 就够。
16
- *
17
- * 🔴 **sema 是双进程壳,壳侧那条钩子在 live 模式 fire 不到**(实证,不是推测):壳的 Stop 钩子只有
18
- * `src/query/stopHooks.ts handleStopHooks` 一个执行点,调用方是 `src/query.ts` —— 壳自己的 query
19
- * 循环;live 模式 turn 循环在引擎里跑,壳的 query.ts 不参与。upstreamBridge 只 fire SubagentStop 且
20
- * observe-only。所以引擎腿必须走 `settings.hooks` 投影,这个 overlay 就是那条腿。
21
- *
22
- * 🟢 **本 overlay 默认开**(2026-07-26 翻默认;逃生口 `SEMA_GOAL_STOP_HOOK_WIRE=0/false/no/off`)。
23
- *
24
- * 修前默认关,理由是两条**前提**——两条都已被 server 侧行为取证**证伪**([1721],6 条行为
25
- * 用例已进 server 仓;cli 仓另有 scripts/run-goal-stop-hook-live-test.mjs 的真引擎+真模型复验):
26
- * ① 旧论断「SDK 类型 DEFERRED ⇒ 服务端会 400」**是把类型面当成了运行时校验面**,对 server
27
- * 不成立:`parseHooksConfig({Stop:[{hooks:[{type:"prompt",prompt}]}]})` 无 error、真解析;
28
- * prompt 形在 server 的条目白名单里与 command/http/agent **并列**
29
- * (@sema-agent/server hooks/hook-runner `entry.type !== "command" && … !== "prompt" && …`
30
- * 那道 type_not_supported 闸口把 prompt 放行,1.277.1 dist 对应 hook-runner.js:390)。
31
- * 卡着的只是 **SDK / registry-core 的类型**(见下方 cast),与 server 运行时接受与否两件事。
32
- * ② 旧论断「引擎侧 Stop×prompt 是否真 fire 未取证」已取证:**真 fire**(Stop 触发时 prompt
33
- * 载体调用一次,`$ARGUMENTS` 已替换为 payload JSON)、**能拦停**(模型输出
34
- * `{"decision":"block","reason":…}` → `{block: reason}`,core `runner/runtask.js:1663`
35
- * `(spec.hooks ?? deps.hooks)?.stop` 起 stop gate,整条链通)、非决策 JSON 不拦(与 command
36
- * 形 exit-0 非 JSON 同语义)、`stop_hook_active:true` 如实进 payload(模型可自己收手;core
37
- * 另有 STOP_HOOK_BLOCK_CAP=8 连续拦停硬上限兜底,不会无限拦停)。
38
- * ③ 最坏情况**不是** 400,而是**钩子不生效**:部署没组装 prompt 载体(`ctx.hookLlm` 缺席)⇒
39
- * server 记账 `hook_entries_skipped{reason:"llm_carrier_unavailable"}` 并跳过,**非阻断**。
40
- * ⇒ 默认开。等件(不阻断本腿):registry-core hooks 契约建模 prompt 形([1717]① 在飞)、SDK
41
- * `SettingsHookCommand` 放开 prompt 形 —— 到位后把下方 cast 换成直类型即可。
42
- *
43
- * 纪律:
44
- * - 只放 goal 这一条(单值,不是通用会话钩子通道)——通用会话/插件钩子仍按 `hooksWireCaps.ts`
45
- * 模块头所述不投影;
46
- * - 走 `hooksForWire()` 的**同一套治理门**(trust / disableAllHooks / allowManagedHooksOnly):
47
- * overlay 在门之后才合并,策略禁钩子时一并禁掉;
48
- * - `/goal clear` 传 null 收回。
49
- */
50
1
  import { hostEnv } from './hostEnv.js';
51
2
  import { envFlagOff } from './envFlag.js';
52
3
  import { engineCapString } from './engineCapsCache.js';
53
4
  let wireSessionStopHookPrompt = null;
54
- /**
55
- * CC 语义档的**锁存位**(见 {@link setWireSessionStopHook})。投影形按它分道:
56
- * 真 ⇒ 裸条件(引擎自己包 CC 形);假 ⇒ 壳自造的门 prompt(老引擎唯一能落地的形)。
57
- */
58
5
  let wireSessionStopHookCcSemantics = false;
59
- /** The env ESCAPE HATCH for the engine leg (see the block comment above). */
60
6
  export const GOAL_STOP_HOOK_WIRE_ENV = 'SEMA_GOAL_STOP_HOOK_WIRE';
61
- // ── 引擎档位:CC 220 Stop×prompt 完整语义(达标线 = CC_STOP_SEMANTICS_MIN_SERVER,见下)────────
62
- //
63
- // server 1.279.0 把 CC 220 的 prompt-hook 半场搬进了引擎(dist/hooks/cc-stop-prompt.js +
64
- // branch-transcript.js,源码直读):
65
- // ① Stop×prompt 触发时先取 `sctx.getBranch()`(core 1.419+ 就在 stop gate ctx 里传了它)渲染成
66
- // 会话转录;**证据面为空则整条 prompt 条目被过滤掉、评估者根本不被调用**
67
- // (`hook_entries_skipped{reason:"stop_prompt_no_evidence:<why>"}`)——这正是老引擎那条
68
- // 「白烧一次模型调用、零效果」的反面;
69
- // ② 调用时带 CC 220 **逐字**的系统提示(`ccPromptSystemFor("Stop")` = CC 的 full 档)+ CC 逐字的
70
- // 条件包装(`wrapCondition`);
71
- // ③ 判词 `{ok,reason,impossible}` 在**引擎翻译层**映射:ok ⇒ 放行、impossible ⇒ 记 warn 后**放行**
72
- // (真 fail-open,既不 block 也不产 additionalContext)、其余 ⇒ block(reason 喂回模型)。
73
- //
74
- // ⇒ 到这一档,壳侧唯一正确的动作是把 CC `Xdr` 的**原形(裸条件)**投出去 —— 引擎会自己包。继续投
75
- // 壳自造的门 prompt 只会被再包一层、并与 CC 系统提示要求的判词 schema 打架。
76
- // 🔴 但老引擎**没有这套**(1.278.0 的 hooks/ 目录里既无 cc-stop-prompt 也无 branch-transcript,
77
- // hook-llm 连 `system` 形参都没有):裸条件送过去评估者对本会话是瞎的,回散文 ⇒ 一次都不拦。
78
- // 所以判档失败/探不到时**必须**退回老形,绝不「因为代码里写了 enforced 就真拦」。
79
- //
80
- // 🔴 **为什么达标线钉 1.279.3 而不是 CC 面首次出现的 1.279.0** —— 两道闸,缺一道都不许翻档:
81
- //
82
- // ① **core 下限**(1.279.1 才补上):CC Stop 语义在 1.279.0 就在了,但 1.279.1 才把
83
- // `@sema-agent/core` 的下限提到 `^1.422.0`。core <1.422 上,一条只带 `additionalContext` 的
84
- // Stop 反馈**不结束 + 不计数 + 清零计数** ⇒ block 与 additionalContext 交替时计数呈锯齿
85
- // (`[0,1,0,1,0]`)、`STOP_HOOK_BLOCK_CAP` 永远到不了 ⇒ 无界循环;1.422 起它计入上限且不再清零。
86
- // (注:goal 这条路本身产不出 additionalContext —— CC 判词的 ok/impossible 两支在引擎翻译层都
87
- // 直接 `continue`;但那条通道对 command 形钩子是开着的,而**上限修好的是最坏值,不是这条通道的
88
- // 性质**:它仍然会让那一轮不结束。所以措辞面一步都不许放松,见 cmd-goal 的 meta 四档。)
89
- //
90
- // ② **判词额度**(1.279.3 才补上):1.279.1/1.279.2 的引擎侧 hook 载体把 `max_tokens` 钳死在
91
- // `Math.min(…, 1024)`(dist/hooks/hook-llm.js)。而 CC 的评估者系统提示要求「quote evidence
92
- // from the transcript」,推理档模型的 thinking 还与输出**共用**这份额度 ⇒ 判词被截断(JSON 不
93
- // 闭合)或干脆零 text 块 ⇒ `parseCcVerdict` 拿不到 ⇒ 引擎**丢弃整条判词并 fail-open 放行**。
94
- // 🔴 这条缺口的形状与 ① 不同,但危害更隐蔽:它让 enforced 档对模型讲的那两句承诺在**守卫失效
95
- // 的那些轮里变成空话,而且没有任何人知道**(引擎侧只留一行 `hook_llm_unparsed_verdict` /
96
- // `hook_llm_failed{returned no content}` 记账,壳侧、用户侧、模型侧全都看不到)。
97
- // 1.279.3 起 `maxOutputTokens` 由调用方声明,CC 评估者路声明 `CC_EVALUATOR_MAX_OUTPUT_TOKENS`
98
- // = 4096,并对「无内容」重试一次(**不**重试「有内容但读不懂」)。
99
- //
100
- // ⇒ 达标线钉的是「**承诺能兑现**的那个组合」,不是「能力面在场」的那一版。差一档就翻,等于把用户
101
- // 放到一个「守卫会静默失效」的搭配上,还对着模型把话说满。
102
7
  export const CC_STOP_SEMANTICS_MIN_SERVER = '1.279.3';
103
- /** `x.y.z` → 数值三元组;非法形 ⇒ null(预发标记按「未达标」处理,见下)。 */
104
8
  function parseSemverCore(v) {
105
9
  const m = /^(\d+)\.(\d+)\.(\d+)$/.exec(v.trim());
106
10
  return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : null;
107
11
  }
108
- /**
109
- * 引擎自报版本是否达到 CC Stop 语义线({@link CC_STOP_SEMANTICS_MIN_SERVER})。
110
- *
111
- * 🔴 三条纪律:
112
- * · **数值比较**,不是字典序(`1.9.0` < `1.279.0`,字符串比较会判反);
113
- * · **预发版不算达标**(`1.279.0-rc.1` 里那套可能还在改)——正则只认三段纯数字,带 `-` 的直接落
114
- * null ⇒ false;
115
- * · 读不出/探不到 ⇒ **false**(降级方向恒安全:老形在新引擎上仍能拦,新形在老引擎上一次都拦不住)。
116
- */
117
12
  export function ccStopSemanticsFromVersion(version) {
118
13
  if (typeof version !== 'string' || version.length === 0)
119
14
  return false;
@@ -131,77 +26,25 @@ export function ccStopSemanticsFromVersion(version) {
131
26
  return gotPatch > minPatch;
132
27
  return true;
133
28
  }
134
- /**
135
- * 本会话连着的引擎是否具备 CC Stop 语义?判据 = live 车道的 `/v1/capabilities` 自报 `version`
136
- * (engineCapsCache 的 boot-kick 缓存,与 `/health.version` 同源)。
137
- *
138
- * 🔴 「未判即降级」:caps 探测是构造期 fire-and-forget,`/goal` 真被敲下时通常早已落袋;万一没落袋
139
- * 就按老引擎走(meta 也同步退档)——**宁可少承诺,不可多承诺**。
140
- */
141
29
  export function engineCcStopSemantics(env = hostEnv()) {
142
30
  const base = env.SEMA_LIVE_BASEURL;
143
31
  if (!base)
144
32
  return false;
145
33
  return ccStopSemanticsFromVersion(engineCapString(base, 'version'));
146
34
  }
147
- /**
148
- * Is the `/goal` Stop-hook engine leg armed? **Default ON** since 2026-07-26 — both of the premises
149
- * that kept it opt-in were disproved by server-side behavior evidence ([1721]) and re-verified against
150
- * a real engine + real model (cli scripts/run-goal-stop-hook-live-test.mjs). Set
151
- * `SEMA_GOAL_STOP_HOOK_WIRE` to an {@link envFlagOff} spelling(REF-CC-141 dup-02 单源)to disarm
152
- * (an operator escape hatch, not a default).
153
- */
154
35
  export function isGoalStopHookWireArmed(env = hostEnv()) {
155
36
  return !envFlagOff(env[GOAL_STOP_HOOK_WIRE_ENV]);
156
37
  }
157
- /**
158
- * Register (or clear, with `null`) the session-scoped `/goal` Stop prompt hook that rides
159
- * `settings.hooks.Stop` to the engine. Single-valued: a new goal replaces the previous one,
160
- * exactly like CC 220's `Xdr` (remove-then-add). Projection is gated by
161
- * {@link isGoalStopHookWireArmed} — storing is always safe, sending is not (yet).
162
- */
163
38
  export function setWireSessionStopHook(prompt, opts) {
164
39
  wireSessionStopHookPrompt = prompt && prompt.length > 0 ? prompt : null;
165
40
  wireSessionStopHookCcSemantics = wireSessionStopHookPrompt === null ? false : opts?.ccSemantics === true;
166
41
  }
167
- /** The currently registered `/goal` Stop prompt, or null (registered ≠ projected — see the gate). */
168
42
  export function getWireSessionStopHook() {
169
43
  return wireSessionStopHookPrompt;
170
44
  }
171
- /** 当前这条目标登记时锁存的档位(真 = 投裸条件,假 = 投壳自造的门)。 */
172
45
  export function getWireSessionStopHookCcSemantics() {
173
46
  return wireSessionStopHookCcSemantics;
174
47
  }
175
- /**
176
- * 把 `/goal` 的**原始条件**包成一条对引擎 prompt 载体**可执行**的 Stop 门 prompt。
177
- *
178
- * 🔴 适用面(2026-07-26 提货批后):**只用于未达标线的引擎档**(见 {@link CC_STOP_SEMANTICS_MIN_SERVER})。
179
- * 达标档起引擎自己按 CC
180
- * 220 逐字组装(系统提示 + 会话转录 + `wrapCondition`),那一档投的是**裸条件** —— 见
181
- * {@link ccStopSemanticsFromVersion} 与 `hooksForWire()` 的分道(见 {@link goalStopHookMatcher})。
182
- * 本函数保留,是 tolerate-absent 的实体:老引擎上退回它,仍能拦一次;删掉它等于在老引擎上静默失效。
183
- *
184
- * 🔴 为什么必须包(2026-07-26 live 围栏实测,不是设计偏好):CC 单进程的 prompt 钩子执行器
185
- * (`src/utils/hooks/execPromptHook.ts`)会给条件**套一层系统提示**(「You are evaluating a hook…
186
- * 回 `{ok:true}` / `{ok:false,reason}`」)**并把整段会话前置**,所以裸条件在 CC 那边能被真评估。
187
- * 引擎侧的载体两样都没有:
188
- * · 无系统提示、无会话历史;
189
- * · Stop payload 的 `transcript_path` 是**空串**(server basePayload),评估者对本会话是**瞎的**;
190
- * · 判据 schema 也不同 —— core 只认 stdout JSON 的 `decision:"block"`。
191
- * 实测(钉版 server 1.277.1 + core 1.416 + 真模型):裸条件 `the project contains a file named
192
- * DONE.txt` 送过去,载体照样被调用,模型回的是**散文**(「I don't have direct access to your file
193
- * system…」)⇒ `parseHookStdout` 拿不到 decision ⇒ **一次都不拦**。即:不包 = 每次停机白烧一次
194
- * 模型调用、零效果。
195
- *
196
- * 所以这里把条件包成引擎契约里**能落地**的形状。诚实标注它**够不到 CC 的完整语义**:
197
- * · 能做到:每个 turn 的**第一次**停机尝试被拦下,目标原文重新注入给模型,逼它自查后再收尾
198
- * (`stop_hook_active` 为真时门自己收手 ⇒ 不会无限拦停);真正「条件是否成立」的判断交给
199
- * **有会话、有工具的主模型**,而不是让瞎的评估者假装判断;
200
- * · 做不到:CC 那种「拦到条件真成立为止」(需要引擎把 transcript 交给载体)、以及「条件满足后
201
- * 自动清除目标」。这两条是**等件**,meta 文案因此不照抄 CC `Pwo`(见 cmd-goal.tsx)。
202
- *
203
- * 台账仍存**原始条件**({@link getWireSessionStopHook}),所以 `/goal clear` 读回的是用户写的那句。
204
- */
205
48
  export function buildGoalStopHookPrompt(condition) {
206
49
  const reason = `[session goal] Before you stop: verify that this goal actually holds — ${condition}. ` +
207
50
  `If it does hold, say so plainly and finish. If it does not, keep working toward it and do not ` +
@@ -216,31 +59,11 @@ export function buildGoalStopHookPrompt(condition) {
216
59
  'Otherwise reply with exactly:\n' +
217
60
  JSON.stringify({ decision: 'block', reason }));
218
61
  }
219
- /**
220
- * `hooksWireCaps.ts` 的 `hooksForWire()` 尾部合流点(REF-CC-156 拆分的接口):治理门跑完之后,
221
- * 调用方传入 `managedOnly`(allowManagedHooksOnly 是否命中),本函数原样返回要 concat 进
222
- * `merged['Stop']` 的那一条 matcher,或 `null`(未登记 / 被 managedOnly 挡 / overlay 未 armed)。
223
- * 非导出到包外(不进 `index.ts` 的公开面)——只是本文件与 `hooksWireCaps.ts` 之间的私有接口。
224
- */
225
62
  export function goalStopHookMatcher(managedOnly) {
226
63
  if (wireSessionStopHookPrompt === null || managedOnly || !isGoalStopHookWireArmed())
227
64
  return null;
228
- // 🔴 这个双 cast 是**类型面的最小且诚实的局部处置**,不是「绕过校验」:
229
- // · server **运行时接受** prompt 形(hook-runner 条目白名单与 command/http/agent 并列,
230
- // [1721] 6 条行为用例 + cli 仓 live 围栏双证);
231
- // · 卡着的是 **SDK 类型**:`SettingsHookCommand.type` 仍是字面量 `"command"`
232
- // (@sema-agent/sdk dist/settings.d.ts,prompt 形 v1 标 DEFERRED);
233
- // · **registry-core 建模 prompt 形在 [1717]① 等件中**,SDK 随后放开。
234
- // 到位后这里换成直类型、去掉 cast(唯一改动点,调用面不动)。
235
65
  return {
236
66
  matcher: '',
237
- // 🔴 投影形**按引擎档位分道**(锁存于 set 那一刻,见 setWireSessionStopHook):
238
- // · CC 语义档(server ≥ CC_STOP_SEMANTICS_MIN_SERVER)⇒ **裸条件** —— 与 CC `Xdr` 注册的
239
- // `{type:"prompt",prompt:condition}` 逐字同形;引擎自己套 CC 系统提示 + 会话转录 +
240
- // `wrapCondition`,再包一层只会打架;
241
- // · 老引擎档 ⇒ 包装后的可执行门 prompt(裸条件在老引擎上一次都拦不住 —— 见
242
- // buildGoalStopHookPrompt 的实测说明)。
243
- // 台账两档都存**原始条件**,供 `/goal clear` 读回。
244
67
  hooks: [
245
68
  {
246
69
  type: 'prompt',
@@ -251,7 +74,6 @@ export function goalStopHookMatcher(managedOnly) {
251
74
  ],
252
75
  };
253
76
  }
254
- /** 测试钩:清 `/goal` 锁存(壳里靠进程边界隔离;包内同进程多组断言必须能清)。 */
255
77
  export function __resetGoalStopHookForTests() {
256
78
  wireSessionStopHookPrompt = null;
257
79
  wireSessionStopHookCcSemantics = false;