@sema-agent/client-core 0.77.0 → 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 +23 -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 +1 -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 +10 -496
  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 +11 -65
  346. package/dist/subagent/engineTaskHandleWire.js +20 -131
  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 +62 -1
  382. package/package.json +1 -1
@@ -1,23 +1,3 @@
1
- /**
2
- * livePendingAsk — 「悬挂的流内 ask」的三端共用读面与决断口(0.72.14)。
3
- *
4
- * ── 这个模块补的是哪一个缺口 ────────────────────────────────────────────────────────────────
5
- * 流内 ask 在铸造那一刻若没有活着的宿主流可投,引擎把它转成**悬挂**(窗约一小时,不补发、不重算),此后只在
6
- * `GET /v1/approvals` 回体的第二顶层键 `livePending` 里可发现。后台 workflow 的子代恒落这一形:宿主 turn 先结束,
7
- * 子代稍后才撞上审批门 ⇒ 用户面零帧零卡,代理静默卡到窗尽。本模块让端从 {@link startApprovalsFeed} 的快照里
8
- * 读到这些行、出带子代身份的卡、并经**与流内帧腿同一条链**决断。
9
- *
10
- * ── 🔴 四条读法 ────────────────────────────────────────────────────────────────────────────
11
- * ① **键缺席 ≠ 没有悬挂 ask**:老引擎不发这个键 ⇒ `not_reported`;快照上键缺席,计数读 `null`(不知道),绝不铸 `[]` / `0`。
12
- * 🔴 CC-98 同一条纪律的第三态:feed 发的「这次取不到」臂(`kind:'unknown'`)喂进本模块三个口时,
13
- * 计数读 `null`、视图读空、跟踪器**零 delta**(绝不把「取不到」当成「行都消失了」去撤卡)。
14
- * ② **数组名即路由判据**:`livePending` 行的决议口是 `POST /v1/tool-approvals/{approvalId}/respond`(流内审批那个口),
15
- * **不是** durable 行的 decide 口;两数组不混编。幂等键 = `approvalId`(与流内帧同一个 id)。
16
- * ③ **可选旗标 only-if-true**:`fromSubagent` / `governanceForced` / `requiresRealApproval` 缺席绝不编码成 `false`。
17
- * ④ **行上没有工具入参**(引擎刻意不在这个读面开第二道脱敏面)⇒ 卡必须明说「看不到入参」,不许渲一个空命令冒充全貌。
18
- *
19
- * sdk 的 barrel 没有导出这一行的类型 ⇒ 按**结构**窄读(与 `capabilities.executionLane` 同一姿势),多余成员不过境。
20
- */
21
1
  import { isToolApprovalFrame, surfaceToolApprovalFrameAndRespond, } from './toolApprovalWire.js';
22
2
  function nonEmptyString(v) {
23
3
  return typeof v === 'string' && v !== '';
@@ -25,10 +5,6 @@ function nonEmptyString(v) {
25
5
  function nonNegativeFinite(v) {
26
6
  return typeof v === 'number' && Number.isFinite(v) && v >= 0;
27
7
  }
28
- /**
29
- * `GET /v1/approvals` 回体 → `livePending` 段读数。四必填位坏形的行丢弃并计数;同 `approvalId` 重复行留第一条。
30
- * 🔴 CC-98:**非空数组却一行都读不出** ⇒ `malformed`(不是 `present` + 空列表)——分界与理由见函数末那段注。
31
- */
32
8
  export function readLivePendingRows(body) {
33
9
  if (body === null || typeof body !== 'object' || Array.isArray(body))
34
10
  return { kind: 'malformed' };
@@ -67,24 +43,14 @@ export function readLivePendingRows(body) {
67
43
  ...(o.governanceForced === true ? { governanceForced: true } : {}),
68
44
  ...(o.fromSubagent === true ? { fromSubagent: true } : {}),
69
45
  ...(nonEmptyString(o.originTaskId) ? { originTaskId: o.originTaskId } : {}),
70
- // 三道闸:审批帧判别器 ∧ **type 恰是 tool_approval**(判别器也放行 tool_approval_complete —— 完成帧会以空入参出一张可编辑的卡)∧ approvalId 相等
71
46
  ...(isToolApprovalFrame(o.frame) && o.frame.type === 'tool_approval' && o.frame.approvalId === o.approvalId ? { frame: o.frame } : {}),
72
47
  });
73
48
  }
74
- // 🔴 CC-98 **分界**(主会话裁定):**非空数组、却一行都读不出来** ⇒ 判 `malformed`(= 这一眼没看成)。
75
- // 不许答 `present` + 空列表 —— 那是把「取不到」冒充「一条都没有」,与 `list()` 抛是同一个病形,
76
- // 只是换了个入口(端照着它渲「0 条在等你」,而引擎明明报了 N 行)。
77
- // 分界的另一半照旧:**部分**坏行逐条丢 + `present`(与 server 的逐行律同形 —— 读得出来的行是真的,
78
- // 丢掉那几条由 `dropped` 如实交代,不因为一条坏行就把整段作废)。
79
- // 🔴 空数组**不在**本条射程:`[]` 是引擎明说「一条都没有」,恒 `present`(这正是要守住的那一态)。
80
49
  if (raw.length > 0 && rows.length === 0)
81
50
  return { kind: 'malformed' };
82
51
  return { kind: 'present', rows, dropped };
83
52
  }
84
- /** 快照里**出自子代**的悬挂 ask(宿主自己的流内 ask 走流内帧腿,不在这里出卡)。未报 / 没有快照 ⇒ `[]`。 */
85
53
  export function suspendedSubagentAsks(snapshot, filter) {
86
- // CC-98:「这次取不到」⇒ 手上没有行,出不了卡。但这**不是**「一条都没有」——
87
- // 计数口答 `null`、跟踪器零 delta(见下面两处),端别拿本函数的空数组当「没有悬挂 ask」的证据。
88
54
  if (snapshot?.kind === 'unknown')
89
55
  return [];
90
56
  const rows = snapshot?.livePending;
@@ -95,27 +61,17 @@ export function suspendedSubagentAsks(snapshot, filter) {
95
61
  export function countApprovalsAwaitingDecision(snapshot, filter) {
96
62
  if (snapshot === null || snapshot === undefined)
97
63
  return { durable: null, live: null, suspendedSubagent: null };
98
- // 🔴 CC-98:「这次取不到」与「没有快照」同一档 —— 三格全 `null`(不知道),绝不折成 0。
99
- // 底栏 / 页脚据此渲破折号;渲 0 = 告诉用户「没人在等你」,而真相是这一眼没看成。
100
64
  if (snapshot.kind === 'unknown')
101
65
  return { durable: null, live: null, suspendedSubagent: null };
102
66
  const bySession = (rows) => filter?.sessionId === undefined ? [...rows] : rows.filter(r => r.sessionId === filter.sessionId);
103
- // 🔴 CC-98:`pending` 段有读不出来的行(`pendingDropped > 0`)⇒ durable 格答 `null`(不知道确切数)。
104
67
  const durable = (snapshot.pendingDropped ?? 0) > 0 ? null : Array.isArray(snapshot.pending) ? bySession(snapshot.pending).length : null;
105
68
  if (!Array.isArray(snapshot.livePending))
106
69
  return { durable, live: null, suspendedSubagent: null };
107
- // 🔴 CC-98(异源复审 R1 [high] 采修):这一段有**读不出来的行** ⇒ 流内两格答 `null`(不知道确切数)。
108
- // 引擎照旧在报那几行,只是这一拍读不懂 —— 拿读得懂的那几条报精确数 = 「0 条在等你」而其实有人在等
109
- // (与「取不到渲成没有」同一个病形,只是小一号)。durable 段不受影响,它自己读得出来。
110
70
  if ((snapshot.livePendingDropped ?? 0) > 0)
111
71
  return { durable, live: null, suspendedSubagent: null };
112
72
  const live = bySession(snapshot.livePending);
113
73
  return { durable, live: live.length, suspendedSubagent: live.filter(r => r.fromSubagent === true).length };
114
74
  }
115
- /**
116
- * 悬挂行 → 流内帧腿的输入。只带行上**真有**的位:窗三键不带(行上只有绝对死线,没有出帧时刻,凑不出可校偏的窗),
117
- * `args` 不带(行上没有)。`sourceTaskId` = `originTaskId`(卡头子代身份徽章的来源)。
118
- */
119
75
  export function livePendingRowToApprovalFrame(row) {
120
76
  return {
121
77
  type: 'tool_approval',
@@ -127,15 +83,7 @@ export function livePendingRowToApprovalFrame(row) {
127
83
  ...(row.requiresRealApproval === true ? { requiresRealApproval: true } : {}),
128
84
  };
129
85
  }
130
- /**
131
- * 出卡并决断一条悬挂 ask —— **与流内帧腿同一条链**({@link surfaceToolApprovalFrameAndRespond}):同一个卡口、
132
- * 同一个身份键铸口(`approvalId`)、同一套回执 / 拒绝读法。差别只有一处:行上没有入参 ⇒ 卡上明说
133
- * (`argsUnavailable`),且这张卡上收到「编辑后批准」时**整次不发**(结局 `editRefused`;没有原文可编,丢掉改写再批准 =
134
- * 批准了人没看到的原始入参)。
135
- */
136
86
  export function surfaceSuspendedAskAndRespond(row, respond, signal, lane) {
137
- // 0.73.2:行上带 `frame`(server ≥7.87.0)⇒ 全卡,与流内帧腿收到同一只帧时**逐字同一条路**(入参可见、改写可转发、窗三键由 lane 决定);
138
- // 缺席 ⇒ 盲卡形不变。两形的身份键都是行的 `approvalId`(读器已钉 frame.approvalId 与之相等)。
139
87
  if (row.frame !== undefined) {
140
88
  return surfaceToolApprovalFrameAndRespond(row.frame, respond, undefined, signal, lane);
141
89
  }
@@ -144,21 +92,9 @@ export function surfaceSuspendedAskAndRespond(row, respond, signal, lane) {
144
92
  argsUnavailable: true,
145
93
  });
146
94
  }
147
- /** 「认领了但还没在任何一张快照里见过」的条目上界(见 {@link createSuspendedAskTracker} 的账目说明)。 */
148
95
  const TRACKER_UNSEEN_CLAIMS_MAX = 512;
149
- /**
150
- * 快照 → 出卡 / 撤卡的去重账(每个宿主会话一只;不是模块级单例)。同一 `approvalId` 只 `appeared` 一次;
151
- * `livePending` 键缺席按「现在一条都看不到」处理已出的卡(引擎换代后旧卡没有决断口可用)。
152
- *
153
- * 两本账,**都不按条数淘汰活跃条目**(异源对抗复审:无差别的「满了删最旧」会让仍挂着的卡重出、漏撤):
154
- * · `shown` = 从快照出过卡、且仍在列表里的 ask。条目随「从列表消失」离账 ⇒ 大小恒 ≤ 列表长度,不设上界。
155
- * · `claimed` = 被流内帧腿认领 / 已在本端决断的 ask,值 = 是否已在某张快照里见过。见过之后从列表消失 ⇒ 这只 ask
156
- * 的一生结束,离账(同 id 日后再出现是新的一只)。**从未见过**的认领才受上界管(帧先到、快照一直没列到它的那一小段),
157
- * 满了只淘汰这一类里最旧的。
158
- */
159
96
  export function createSuspendedAskTracker(filter) {
160
97
  const shown = new Set();
161
- /** 已出卡的行当时有没有 `frame`(先盲后全 ⇒ upgraded)。 */
162
98
  const shownWithFrame = new Set();
163
99
  const claimed = new Map();
164
100
  const claim = (id) => {
@@ -180,9 +116,6 @@ export function createSuspendedAskTracker(filter) {
180
116
  };
181
117
  return {
182
118
  ingest(snapshot) {
183
- // 🔴 CC-98:「这次取不到」是**零信息**,不是「行都消失了」⇒ 零 delta。
184
- // 走下面那条路的后果:`rows` 空 ⇒ 全部 shown 行进 `gone` ⇒ 屏上还在等人的卡被撤掉,
185
- // 而那只 ask 在引擎上照旧挂着、照旧没人答 —— 「取不到当成没有」最坏的一形。
186
119
  if (snapshot?.kind === 'unknown')
187
120
  return { appeared: [], gone: [], upgraded: [] };
188
121
  const rows = suspendedSubagentAsks(snapshot, filter);
@@ -206,11 +139,6 @@ export function createSuspendedAskTracker(filter) {
206
139
  shownWithFrame.add(r.approvalId);
207
140
  appeared.push(r);
208
141
  }
209
- // 🔴 CC-98(异源复审 R1 [high] 采修):这一张快照里有**读不出来的行**(`livePendingDropped > 0`)⇒
210
- // **禁止缺席对账**:一行「不在列表里」可能只是这一拍读不懂,引擎照旧在报它。据此撤卡 =
211
- // 把一张还在等人的卡撤掉,而 ask 在引擎上照旧挂着没人答(「取不到当成没有」最坏的一形)。
212
- // 新出现的可读行照旧出卡(`appeared`)、补帧照旧升级(`upgraded`)—— 只有「消失」这一句话不许说。
213
- // 账**不清**:那几行还留在 `shown` 里,等下一张**完整**的快照再判 gone(撤卡延后,不是丢掉)。
214
142
  const incomplete = snapshot !== null && snapshot !== undefined && (snapshot.livePendingDropped ?? 0) > 0;
215
143
  const gone = [];
216
144
  if (!incomplete) {
@@ -221,7 +149,6 @@ export function createSuspendedAskTracker(filter) {
221
149
  shownWithFrame.delete(id);
222
150
  gone.push(id);
223
151
  }
224
- // 见过、现在不在列表里的认领 = 这只 ask 已结算 ⇒ 离账
225
152
  for (const [id, seen] of [...claimed])
226
153
  if (seen && !present.has(id))
227
154
  claimed.delete(id);
@@ -239,7 +166,6 @@ export function createSuspendedAskTracker(filter) {
239
166
  noteDecided(approvalId) {
240
167
  if (typeof approvalId !== 'string' || approvalId === '')
241
168
  return;
242
- // 从快照出过卡的 ask 已在列表里见过 ⇒ 认领直接记「见过」,结算后随列表消失离账
243
169
  shownWithFrame.delete(approvalId);
244
170
  const wasShown = shown.delete(approvalId);
245
171
  if (wasShown)
@@ -1,54 +1,5 @@
1
- /**
2
- * hitl/localAllowRule.ts — durable park 腿「不再询问」第三态的**本地落规则判定骨架**
3
- * (#244 F2 上收件,clay 硬排期;源形 = cli `src/sema/localAllowRuleWrite.ts` 的
4
- * `parseLocalAllowRule` + 窄化五步。settings 写入、内存权限态、托管策略读口全部留宿主)。
5
- *
6
- * ── 为什么这半场是三端公共的 ────────────────────────────────────────────────────────────────
7
- * durable park 腿的候选走行上的 `PendingCheckpoint.ruleSuggestions` → 卡入参**只读键**
8
- * `ruleSuggestionsReadOnly`,而 `/decide` 的体(SDK `AskDecisionBody`)是**闭集、无规则位**——
9
- * 兑付口只能是**客户端本地** settings。哪些候选可本地兑付、写下去的 canonical 字节是什么,
10
- * 是纯**形**判定:desktop/web 接到同一份行供给时要的正是同一把窄化(各写各的必漂,而漏一步
11
- * 就是跨会话任意代码放行 —— [3925] P0 解释器族绕过案的教训)。
12
- *
13
- * ── 🔴 五道窄化(本地写入独有;wire 兑付腿没有,那条只搬字节给 server)────────────────────────
14
- * 1. **整工具规则不写**。`Bash` / `Bash(*)` 解析后退化成整工具 allow,比这只 ask 的动词宽得多
15
- * (CC `suppressAlwaysAllowRule` 同理;durable 行上没有这一位过境,按**收紧方向**自守)。
16
- * 2. **规则得是给这只 ask 的那个工具的**(`expectedToolName`)。规则文本是**引擎**铸的,可能用
17
- * 引擎侧 wire 工具名(`file_write(/tmp/x)` 解析得干干净净,写进 settings 后**永远匹配不上**)
18
- * —— 落盘不报错、也不生效的死规则,比拒绝更坏。
19
- * 3. **没有字面锚的规则不写**。`Bash( * )` / `Bash(**)` 等拼法 ruleContent **非空**却与被禁的
20
- * `Bash(*)` 完全等效(宿主匹配器先 trim 再把未转义 `*` 展成 `.*`)。判据锚在「这条规则还有
21
- * 没有约束力」:去掉全部**未转义**通配符后必须还剩字面字符(转义星 `\*` 是字面星号,照留)。
22
- * 5. **解释器/包装器裸前缀不写**(`Bash(bash:*)` / `Bash(sudo:*)` …):过得了窄化③(有字面锚)
23
- * 却等于放行任意命令(`bash -c "任何东西"`)。谓词经 {@link LocalAllowRuleDeps} 注入 ——
24
- * 策略表本体(BARE_SHELL_PREFIXES / dangerousPatterns)留宿主,绝不在包内自建第二份名单。
25
- * 5b. **canonical 危险规则谓词叠加**([3925] P0 跟修):⑤ 只覆盖 shell/wrapper,而
26
- * python/node/npx/eval/exec/ssh 等**解释器族**的规则形同样等于任意代码放行(`python -c`)。
27
- * 同经 deps 注入宿主的 `isDangerous{Bash,PowerShell}Permission`(auto-mode 入口同一把谓词)。
28
- * ⑤ 不撤:它做 basename/.exe 路径归一(`/bin/bash`),canonical 谓词是纯字面形不做归一 ——
29
- * 两把互补,各管一族拼法。
30
- * (④ 托管策略是**可变量**,刻意不在本骨架里 —— 解析必须纯:同一串输入永远同一个结论,否则
31
- * 已上屏的 option value 会反查不到,用户的选择被丢掉。策略由宿主在渲染面与写入面各自查。)
32
- *
33
- * 🔴 **纯函数 / 只看形**:不读 settings、不读宿主状态、不读策略;deps 注入的谓词也必须是
34
- * 纯函数(pattern 表 + 启动期常量),否则「渲档位」与「按 value 反查候选」两处调用会漂。
35
- * 🔴 **错误文案是契约面**:cli 常驻套(localRuleSuggestionsCard,128+ 断言)对拒绝集逐字锚 ——
36
- * 上收前后拒绝集必须逐字相等,改一处文案就是改三端的可观察行为。
37
- * 🔴 UNTRUSTED:`rule` 是 wire 串(core `inlineUntrusted` + server `redactSecrets` 之后)。它只被
38
- * 喂给宿主自己的规则解析器与 settings 写口,不回喂模型、不进工具入参、不当代码执行。
39
- */
40
1
  import type { PermissionRuleValue } from '@sema-agent/agent-types';
41
2
  export type { PermissionRuleValue };
42
- /**
43
- * 宿主注入面(parkOwnership deps 同形:缺一不可的**纯函数**切片,策略表本体留宿主)。
44
- * · `parseRule` / `formatRule`:宿主的规则语法(CC `Tool(content)` 形 + 转义 + legacy 工具名
45
- * 归一)。解析失败**抛**(骨架把它折成 `ok:false`);`formatRule` 的产物 = canonical 字节
46
- * (真正会被写进 settings 的那串,渲染面必须渲它而不是 wire 原文)。
47
- * · `bashRuleContentHasDangerousBarePrefix`:窄化⑤ 的谓词(宿主 BARE_SHELL_PREFIXES 表,
48
- * 含 basename/.exe 路径归一)。
49
- * · `isDangerousBashPermission` / `isDangerousPowerShellPermission`:窄化⑤b 的 canonical 危险
50
- * 规则谓词(宿主 dangerousPatterns 表;谓词自己按 toolName 分派,非 Bash/PowerShell 恒 false)。
51
- */
52
3
  export interface LocalAllowRuleDeps {
53
4
  parseRule(rule: string): PermissionRuleValue;
54
5
  formatRule(value: PermissionRuleValue): string;
@@ -56,12 +7,6 @@ export interface LocalAllowRuleDeps {
56
7
  isDangerousBashPermission(toolName: string, ruleContent: string): boolean;
57
8
  isDangerousPowerShellPermission(toolName: string, ruleContent: string): boolean;
58
9
  }
59
- /**
60
- * 解析结局。`ok:false` = 这条候选**不可本地兑付**(渲染面据此不渲该档)。
61
- * `canonical` = 真正会被写进 settings 的那串字节(`deps.formatRule` 的产物)——
62
- * 🔴 渲染面**必须渲它**而不是 wire 原文:两者在带括号的命令上会差一层转义,渲原文就等于
63
- * 「展示的规则和落地的规则不是同一串」。
64
- */
65
10
  export type LocalAllowRuleParse = {
66
11
  ok: true;
67
12
  value: PermissionRuleValue;
@@ -70,11 +15,4 @@ export type LocalAllowRuleParse = {
70
15
  ok: false;
71
16
  error: string;
72
17
  };
73
- /**
74
- * 规则原文 → 宿主规则空间的 `PermissionRuleValue`,带文件头注的**形**类窄化(①②③⑤⑤b)。
75
- *
76
- * @param expectedToolName 这只 ask 自己的工具名(卡的 `tool.name`)。给了就必须相等 —— 见头注
77
- * 窄化②:引擎侧 wire 工具名(`file_write` 之类)解析得干净但在宿主的规则空间里是死规则。
78
- * **缺省不校**:纵深第二道(写口)不知道也不该猜「这只 ask 是哪个工具」,那是卡面的知识。
79
- */
80
18
  export declare function parseLocalAllowRule(rule: string, expectedToolName: string | undefined, deps: LocalAllowRuleDeps): LocalAllowRuleParse;
@@ -1,12 +1,4 @@
1
- /** 规则空间里 Bash 工具的名字(窄化⑤ 只对这一族适用;⑤b canonical 谓词管 PS 族)。 */
2
1
  const BASH_TOOL_NAME_FOR_RULES = 'Bash';
3
- /**
4
- * 规则原文 → 宿主规则空间的 `PermissionRuleValue`,带文件头注的**形**类窄化(①②③⑤⑤b)。
5
- *
6
- * @param expectedToolName 这只 ask 自己的工具名(卡的 `tool.name`)。给了就必须相等 —— 见头注
7
- * 窄化②:引擎侧 wire 工具名(`file_write` 之类)解析得干净但在宿主的规则空间里是死规则。
8
- * **缺省不校**:纵深第二道(写口)不知道也不该猜「这只 ask 是哪个工具」,那是卡面的知识。
9
- */
10
2
  export function parseLocalAllowRule(rule, expectedToolName, deps) {
11
3
  if (typeof rule !== 'string' || rule === '') {
12
4
  return { ok: false, error: 'rule text is empty' };
@@ -21,30 +13,24 @@ export function parseLocalAllowRule(rule, expectedToolName, deps) {
21
13
  if (typeof value.toolName !== 'string' || value.toolName === '') {
22
14
  return { ok: false, error: 'rule text carries no tool name' };
23
15
  }
24
- // 窄化①:整工具 allow 比这只 ask 的动词宽得多(CC suppressAlwaysAllowRule 同理)。
25
- // `Bash(*)` 也走这里 —— 解析器把它归一成整工具形,所以判据只有一条「有没有 ruleContent」。
26
16
  if (value.ruleContent === undefined || value.ruleContent === '') {
27
17
  return {
28
18
  ok: false,
29
19
  error: 'candidate is a whole-tool allow rule (broader than this ask) — not offered locally',
30
20
  };
31
21
  }
32
- // 窄化②:规则得是给**这只 ask 的那个工具**的(否则是一条落盘不报错、也永远不生效的死规则)。
33
22
  if (expectedToolName !== undefined && value.toolName !== expectedToolName) {
34
23
  return {
35
24
  ok: false,
36
25
  error: `candidate names tool "${value.toolName}" but this ask is for "${expectedToolName}" — a rule for another tool would never match`,
37
26
  };
38
27
  }
39
- // 窄化③:去掉未转义通配符后必须还剩字面字符,否则这条规则与整工具放行等效(见头注 3)。
40
28
  if (!hasLiteralAnchor(value.ruleContent)) {
41
29
  return {
42
30
  ok: false,
43
31
  error: 'candidate is all wildcard (matches every command for this tool) — equivalent to a whole-tool allow, not offered locally',
44
32
  };
45
33
  }
46
- // 窄化⑤:解释器/包装器裸前缀(`bash:*` / `env:*` / `sudo:*` …)——有字面锚但等于任意命令放行。
47
- // 谓词表属主在宿主(bashPermissions 的 BARE_SHELL_PREFIXES),经 deps 注入,绝不自建第二份名单。
48
34
  if (value.toolName === BASH_TOOL_NAME_FOR_RULES &&
49
35
  deps.bashRuleContentHasDangerousBarePrefix(value.ruleContent)) {
50
36
  return {
@@ -52,9 +38,6 @@ export function parseLocalAllowRule(rule, expectedToolName, deps) {
52
38
  error: 'candidate is a bare interpreter/wrapper prefix (bash/sh/env/sudo/…) — persisting it would authorize arbitrary commands, not offered locally',
53
39
  };
54
40
  }
55
- // 窄化⑤b([3925] P0 跟修):canonical 危险规则谓词叠加 —— python/node/npx/eval/exec/ssh 等
56
- // 解释器族的五种规则形同样等于任意代码放行(`python -c`)。谓词自己按 toolName 分派
57
- // (非 Bash/PowerShell 恒 false),纯函数,不破坏本函数「同输入恒同结论」的承重性质。
58
41
  if (deps.isDangerousBashPermission(value.toolName, value.ruleContent) ||
59
42
  deps.isDangerousPowerShellPermission(value.toolName, value.ruleContent)) {
60
43
  return {
@@ -64,32 +47,17 @@ export function parseLocalAllowRule(rule, expectedToolName, deps) {
64
47
  }
65
48
  return { ok: true, value, canonical: deps.formatRule(value) };
66
49
  }
67
- /**
68
- * 规则内容里还有没有**字面**约束(窄化③ 的判据)。
69
- *
70
- * 只剥**未转义**的 `*`:转义星 `\*` 是字面星号(与宿主匹配器 `hasWildcards` 的判据同源),
71
- * 剥掉它会把「命令就叫 `*`」这条有约束力的规则误判成通配。剥完 **trim**,空 ⇒ 这条规则对该工具的
72
- * 任何命令都成立。
73
- *
74
- * 末尾的 `trim()` 是承重的,不是顺手:宿主匹配器自己入口也先 `pattern.trim()`,所以「只剩空白」
75
- * 与「什么都不剩」在匹配语义上是同一件事 —— `Bash(* *)` / `Bash( ** )` 这类「看起来有字符」的
76
- * 拼法因此同样被拦下(cli 常驻套 ①-17 五种拼法全红)。
77
- * ⚠️ 仍是**收紧方向**的近似:带一个字面非空白字符的极宽规则(如 `Bash(*a*)`)有字面锚、会放行。
78
- * 真正按匹配器语义算「这条规则有多宽」要把 per-form 的判定搬过来,记为 follow-up;当前判据不漏
79
- * 「等效于 `Bash(*)`」的那一族,而那一族才是题面。
80
- */
81
50
  function hasLiteralAnchor(ruleContent) {
82
51
  let out = '';
83
52
  for (let i = 0; i < ruleContent.length; i++) {
84
53
  const ch = ruleContent[i];
85
54
  if (ch === '\\' && i + 1 < ruleContent.length) {
86
- // 转义序列整段保留(`\*` 的星号是字面量,`\\` 是字面反斜杠)。
87
55
  out += ruleContent[i + 1];
88
56
  i++;
89
57
  continue;
90
58
  }
91
59
  if (ch === '*')
92
- continue; // 未转义通配符:剥掉
60
+ continue;
93
61
  out += ch;
94
62
  }
95
63
  return out.trim() !== '';
@@ -1,66 +1,10 @@
1
- /**
2
- * parkOwnership.ts — ask park 重开腿的**纯判据**三件(A-028.2,#244 族A 包半场,2026-08-12;
3
- * 源形 = cli `src/sema/askParkReopen.ts` 的发现面判据半场;`approvals.list` 编排与 stderr
4
- * 留宿主 —— 本文件零网络、零渲染,只回答判决)。
5
- *
6
- * ── A-024.1:「队列恰一行」不是归属证明 ────────────────────────────────────────────────────
7
- * `/v1/approvals` 是 **scope 级**单队列:恰一行只说明「此刻没有别的行在排队」,而孤儿 park、
8
- * 行可见性延迟、另一会话独占队列三种形都能让**别人的**行落单。把这一行直接展示并代为决断,
9
- * 是 REF-CC-029(`?? pending[0]`)那个病的换形复发 —— 后果不是渲染错,是**把别人的审批递到
10
- * 这个用户手上并替他按了钮**。
11
- *
12
- * 宿主能拿出的归属硬证据只有两条(缺一不可地互补,不是二选一):
13
- * ① 行的 `taskId` ∈ own-run 台账(`isOwnEngineRun`,只记本进程亲手驱动的 run + fleet 行帧
14
- * 闭包进来的自家子代)⇒ 本宿主起的 run/子代。child 委派行走这条 —— 子代 park 行的
15
- * `sessionId` 是子代自己的 session,天生 ≠ 本会话,只按 ② 判会把发现面拆掉。
16
- * ② 行自带 `sessionId` === 本宿主当前引擎会话 ⇒ 本会话自己的 park。
17
- *
18
- * 🔴 判据是 **fail-CLOSED 的正向证明**:两条腿任一成立才采信,**都不成立就不采信** —— 包括
19
- * 「本会话 id 还没有」「行没带 sessionId」这两种**判不出**的形。把「证明不了」当「是我的」,
20
- * 在一个会替用户按钮的面上正好反了。判不出的代价只是一句诚实的 reopen-failed(用户重发消息
21
- * 即重走本链),而放行的代价是替别人决断,不对等。
22
- */
23
1
  import type { PendingCheckpoint } from '@sema-agent/sdk';
24
2
  import type { AskQuestion } from '../liveQuestionStore.js';
25
- /** 归属判据的两条腿的注入口(缺席走包内既有真源:SessionPort + own-run 台账)。 */
26
3
  export interface ParkOwnershipDeps {
27
- /**
28
- * 多会话宿主的会话键(缺省 = DEFAULT_SESSION_KEY,单会话宿主零参装配)。
29
- * 🔴 传了**非默认键**而没有注入 `isOwnRun` 时,own-run 缺省腿**整条跳过**(复审 [high] 收紧):
30
- * 包内 own-run 台账是**进程级**的(记「本进程驱动过的 run」),在一个跑着 A/B 两个会话的宿主
31
- * 进程里,它答不了「这行是 A 的还是 B 的」—— 拿进程级证据放行会把 A 的审批递到 B 手上。
32
- * 多会话宿主要么注入自己会话粒度的 `isOwnRun`,要么只靠会话腿(fail-closed:少一条腿的代价
33
- * 只是多一次诚实 reopen-failed)。
34
- */
35
4
  sessionKey?: string;
36
- /** 会话腿真源(缺省 = `hostSessionFor(sessionKey).currentSessionId()`;空串按缺席归一,
37
- * 判不出 ≠ 命中)。 */
38
5
  currentSessionId?: () => string | undefined;
39
- /** own-run 台账腿(**并联**:默认会话键下注入腿与包 `isOwnEngineRun` 缺省腿任一命中即 owned
40
- * —— 注入是**补腿不是换腿**,cli 1.0.76 扫码 P1 跟修;非默认键下缺省腿整条跳过,见 sessionKey 注)。
41
- * 🔴 键域 = `rowIdTail(行 taskId)`(fleet 台账登记时就过 rowIdTail,本判据同域取键后才调本口)。
42
- * 🔴 成文局限(复审二轮裁定,不改行为):默认键下的缺省腿是**进程级**证据,不区分同一宿主
43
- * 进程内的会话代际 —— `/clear` 前登记的 run 在新会话语境下仍判 owned。这是单会话宿主的
44
- * 出货语义(owner = 本进程的这一位用户;child 委派行的 sessionId 天生 ≠ 本会话,发现面恰恰
45
- * 依赖跨会话 id 的进程级证据),最坏形 = 用户看到**自己**旧会话的审批卡(卡面标注行归属)。
46
- * 要会话代际粒度就注入自己的 `isOwnRun` —— 台账本体改代际级属 own-run 域独立议题。 */
47
6
  isOwnRun?: (taskIdTail: string) => boolean;
48
7
  }
49
- /**
50
- * 这行 pending 能不能**正向证明**属于本宿主会话(fail-closed;两腿语义见文件头)。
51
- * 腿序:own-run 先问(child 委派行不依赖会话 id),会话腿后问。
52
- */
53
8
  export declare function pendingRowIsOwnedByThisSession(row: PendingCheckpoint, deps?: ParkOwnershipDeps): boolean;
54
- /**
55
- * questions payload 从 pending.input 读 —— **结构判定**收窄到 AskQuestion 必需键(question
56
- * 非 string / questions 非数组 / 空数组 ⇒ null,不 cast 硬塞;缺 header 的行照 CC 形容忍,
57
- * overlay 自兜)。铸空卡 = 假 affordance,拿不到题就诚实返 null。
58
- */
59
9
  export declare function askQuestionsFromPending(pending: PendingCheckpoint): AskQuestion[] | null;
60
- /**
61
- * HitlSafetyError 判型的 duck-check(按 `name`,不按 instanceof —— 宿主 bundle 里存在第二份包
62
- * 实例时 instanceof 会分叉,sseIdleTriage 同款纪律)。安全信号(binding_mismatch 族)契约禁
63
- * 盲重试,重开腿据此把「可重试的瞬时故障」与「必须交还人重决的安全停」分开。
64
- * 入参是任意抛出值,本函数就是窄化动作本身(unknown 出境登记见 typeshape 门 RATCHET 注)。
65
- */
66
10
  export declare function isHitlSafetyErrorLike(e: unknown): boolean;
@@ -2,19 +2,9 @@ import { isOwnEngineRun } from '../subagentContentStore.js';
2
2
  import { rowIdTail } from '../workflow.js';
3
3
  import { hostSessionFor } from '../host.js';
4
4
  import { DEFAULT_SESSION_KEY } from '../sessionSlot.js';
5
- /**
6
- * 这行 pending 能不能**正向证明**属于本宿主会话(fail-closed;两腿语义见文件头)。
7
- * 腿序:own-run 先问(child 委派行不依赖会话 id),会话腿后问。
8
- */
9
5
  export function pendingRowIsOwnedByThisSession(row, deps) {
10
6
  const sessionKey = deps?.sessionKey ?? DEFAULT_SESSION_KEY;
11
- // ① 本宿主亲手驱动的 run / 由它闭包进来的自家子代 —— 不依赖会话 id。
12
- // 进程级缺省腿只在默认会话键下启用(多会话宿主必须注入会话粒度的口,见 deps.sessionKey 注)。
13
7
  const rowTaskId = typeof row.taskId === 'string' ? row.taskId : '';
14
- // 🔴 注入腿与缺省台账腿是**并联**不是顶替(cli 1.0.76 扫码 P1 的包 API 半场,主板 [3925]):
15
- // 此前 `deps?.isOwnRun ?? isOwnEngineRun` 让「端为补一条自己的正向腿」变成「顺手关掉进程内
16
- // 台账腿」——补一条断一条,消费端得记得自 OR 才不踩(cli 复核读口实翻)。并联只多不少地
17
- // 要求正向证明,fail-closed 方向不变;非默认键下缺省腿照旧整条跳过(sessionKey 注)。
18
8
  if (rowTaskId.length > 0) {
19
9
  const tail = rowIdTail(rowTaskId);
20
10
  if (deps?.isOwnRun !== undefined && deps.isOwnRun(tail))
@@ -22,7 +12,6 @@ export function pendingRowIsOwnedByThisSession(row, deps) {
22
12
  if (sessionKey === DEFAULT_SESSION_KEY && isOwnEngineRun(tail))
23
13
  return true;
24
14
  }
25
- // ② 行自带 sessionId === 本会话当前引擎会话。任一侧缺席/空串 = 判不出,不是命中。
26
15
  const currentSessionId = deps?.currentSessionId ?? (() => hostSessionFor(sessionKey)?.currentSessionId());
27
16
  const sessionId = currentSessionId();
28
17
  const rowSessionId = typeof row.sessionId === 'string' ? row.sessionId : '';
@@ -31,11 +20,6 @@ export function pendingRowIsOwnedByThisSession(row, deps) {
31
20
  rowSessionId.length > 0 &&
32
21
  rowSessionId === sessionId);
33
22
  }
34
- /**
35
- * questions payload 从 pending.input 读 —— **结构判定**收窄到 AskQuestion 必需键(question
36
- * 非 string / questions 非数组 / 空数组 ⇒ null,不 cast 硬塞;缺 header 的行照 CC 形容忍,
37
- * overlay 自兜)。铸空卡 = 假 affordance,拿不到题就诚实返 null。
38
- */
39
23
  export function askQuestionsFromPending(pending) {
40
24
  const input = pending.input;
41
25
  if (typeof input !== 'object' || input === null)
@@ -46,12 +30,6 @@ export function askQuestionsFromPending(pending) {
46
30
  const ok = qs.every(q => typeof q === 'object' && q !== null && typeof q.question === 'string');
47
31
  return ok ? qs : null;
48
32
  }
49
- /**
50
- * HitlSafetyError 判型的 duck-check(按 `name`,不按 instanceof —— 宿主 bundle 里存在第二份包
51
- * 实例时 instanceof 会分叉,sseIdleTriage 同款纪律)。安全信号(binding_mismatch 族)契约禁
52
- * 盲重试,重开腿据此把「可重试的瞬时故障」与「必须交还人重决的安全停」分开。
53
- * 入参是任意抛出值,本函数就是窄化动作本身(unknown 出境登记见 typeshape 门 RATCHET 注)。
54
- */
55
33
  export function isHitlSafetyErrorLike(e) {
56
34
  return typeof e === 'object' && e !== null && e.name === 'HitlSafetyError';
57
35
  }
@@ -4,54 +4,17 @@ import { type QuestionAnswer } from '../liveQuestionStore.js';
4
4
  import type { AskAnsweredOutput, GateLedger } from './gateLedger.js';
5
5
  import { type AskGateWireDeps, type GatePark } from './frameRouter.js';
6
6
  import { type DecideReceiptView } from '../decideReceipt.js';
7
- /**
8
- * L-80(2026-09-03,[6215];#357 复发):**连续非进展轮**上限 —— 数的是「壳再附着之后那段流里一个
9
- * host 推进帧都没有」的轮次,**不是** park 次数。修前这里是 `24` 且按每次 park 递增
10
- * (askGateWire `hops++` 无条件),于是一个 turn 里模型对同一失败 Edit 重试 24 次、每次真被门真被决,
11
- * 也会在第 25 次撞成 `gate hop limit (24) exceeded`——一句与真因无关的预算话术。CC 没有这条预算:
12
- * 模型问 N 次就答 N 次。本闸只留作最后防线:连续 N 轮零进展(坐标失配空转 / reopen 类 re-park /
13
- * decide 出站恒断)才收场,收场前再呈一次收场卡、终帧带真因与出路。
14
- */
15
7
  export declare const MAX_GATE_HOPS = 2;
16
- /** 一轮 park 的进展判决(驱动侧按 `isHostProgressFrame` 观察,见 askGateWire)。 */
17
8
  export type HopRound = 'progress' | 'stalled';
18
- /** hop 预算状态:`stalled` = 连续非进展轮数(进展即清零);`total` = 本 turn park 总数(只用于日志)。 */
19
9
  export interface HopBudget {
20
10
  readonly stalled: number;
21
11
  readonly total: number;
22
12
  }
23
- /** 纯函数:上一轮预算 + 本轮判决 ⇒ 新预算(不就地改入参;`undefined` = 本 turn 第一轮)。 */
24
13
  export declare function nextHopBudget(prev: HopBudget | undefined, round: HopRound): HopBudget;
25
- /**
26
- * 硬兜底(对抗复审 r1 [high]①,r6 [high] 收窄):一 turn 内**解析不出身份**的 park 数上限。连续非进展计数靠
27
- * 「解析到的 pending 行身份 + host 推进帧」判进展;解析不到行(tool-less park / approvals 恒空)时身份判不出 ⇒
28
- * 只能靠推进帧,一个每轮先吐一帧文本再原样 park 的病态引擎在那一形下仍可能无限。**只数这一类**:每轮都解析到
29
- * 新 call 且真推进的门(模型重试同一失败调用 N 次)不吃这格 —— CC 没有此闸,问 65 次就答 65 次。
30
- * 命中即收场、终帧如实说「本 turn 有 N 次 park 解析不出身份」。
31
- */
32
14
  export declare const MAX_TOTAL_PARKS = 64;
33
- /**
34
- * REF-CC-033:`GateOutcome` 的 `failed` 分支闭集判别码。来源两处:①本文件自己的
35
- * 「pending 行取不到」早退(`surfaceGateAndDecide` 里 `!pending` 那条);②`HitlBridge` 抛出的
36
- * `HitlSafetyError.code`(hitlBridge.ts 契约:`binding_mismatch|no_pending|wrong_gate|bad_plan_edit`
37
- * ——该属性今天仍是开集 `string`,TYPESHAPE-07/REF-CC-036 候后续车锁死;这里落地前用
38
- * `isGateFailureCode` 按闭集白名单过滤,不认得的值一律降级成 `undefined`,退回文案兜底,不让
39
- * 开集腐蚀这个新判别位)。消费点只认 `'no_pending'` 为「已解决」,其余码(binding_mismatch 等)
40
- * 是真需要重新呈现给人的失败,不能走「继续读流」这条路。
41
- */
42
- /**
43
- * 白名单的**运行期真源**(FIX② 2026-08-07 由三处散落的 `===` 收成一份元组)。
44
- * 🔴 与 `hitlBridge.HitlSafetyError.code` 的联合是**同一个闭集的两半**:下方 `_gateFailureCodePins`
45
- * 双向钉住,任何一边加员而另一边不跟 ⇒ 编译红。此前两边靠人肉同步,而不同步的可观测后果是
46
- * 「新码被 `isGateFailureCode` 降成 undefined 后静默走文案兜底臂」—— 门里长得跟正常一模一样。
47
- */
48
15
  export declare const GATE_FAILURE_CODES: readonly ["no_pending", "binding_mismatch", "wrong_gate", "bad_plan_edit", "bad_plan_mode", "empty_answer"];
49
16
  export type GateFailureCode = (typeof GATE_FAILURE_CODES)[number];
50
- export type GateOutcome =
51
- /** `receipt`(B-070 / L-200,0.65.0):这次 decide 的 **200 回执读数** —— 与 fs 腿的
52
- * `FsApprovalOutcome.receipt` **同形同源**(同形存量清剿:两条决断腿一次改齐)。语义与缺席纪律
53
- * 逐字见 `decideReceipt.ts` 顶注;🔴 它**不是**「门已解决」的证据(200 只是投递受理)。 */
54
- {
17
+ export type GateOutcome = {
55
18
  kind: 'decided';
56
19
  gatedCallId?: string | undefined;
57
20
  answered?: AskAnsweredOutput | undefined;
@@ -69,42 +32,9 @@ export type GateOutcome =
69
32
  retryExhausted?: true;
70
33
  currentPending?: GateCurrentPending | undefined;
71
34
  };
72
- /**
73
- * decide 的 `failed` 原因是不是「这个 gate 早就被解决了」(#110 缺陷② c 的判据)。
74
- *
75
- * REF-CC-033:此前判据**只**锚在文案词(`no pending checkpoint` / `resolved` / `already` 三者
76
- * 任一在场)——server 原文改一个字,整条命中当场失效(FIX-13 / 域词表-01)。现在消费点(见下方
77
- * `isAlreadyResolvedFailure`)优先判 `GateOutcome.code`(闭集判别位,见 `GateFailureCode`);
78
- * 这个函数降级为**文案兜底臂**,只在 outcome 没带 code 的时候才被调用(典型:`FsApprovalOutcome`
79
- * 来自 `toolApprovalWire.ts`,那份类型今天没有 code 字段——C-bridge 卡的文件域,本卡不改)。
80
- * 🔴 方向没变:这条判**错**的后果不对称 —— 误判成「已解决」最多让流多读一轮(hop 预算兜底),
81
- * 误判成「真失败」会把一个已经 completed 的 run 谎报成失败并烧掉整条会话转录。所以宁可宽。
82
- */
83
- /** #114/[C68] 单源化提升:desktop 照抄件(durable 双实现审计 P0-1 修)到货换包导入删抄件。
84
- * [C106] 收编 `not found` 形(2026-08-05):引擎对已批门的 deny 回 `approval not found`
85
- * (desktop 实测——parked 刚批完、decide 未返回的竞态窗内 Stop 走 parked-deny 路),旧词表
86
- * 判不中 ⇒ 按真失败 log-only 放弃 ⇒ runs.cancel 永不发出=Stop 哑弹。按上方「宁可宽」方向收编。 */
87
35
  export declare function isAlreadyResolvedGateReason(reason: unknown): boolean;
88
- /** 把 wire 答案({answers:[{header,selected,note?}]})折回 CC 卡片的 Record<question,string> 形状
89
- * (multiSelect 与对话框同款 ", " lossy join;note → annotations.notes)。 */
90
36
  export declare function toAnsweredOutput(questions: unknown[], answer: QuestionAnswer): AskAnsweredOutput;
91
- /** 外环决断的两种出路(见文件头注)。 */
92
- /** resolvePark 的续流判决:`progress` 位 = 这一轮决断真落地了一次(驱动侧不据此复位计数 —— 复位只看
93
- * 下一段流有没有 host 推进帧);非进展轮携 `reason`(收场文案用)。 */
94
- export type ParkResolution =
95
- /**
96
- * `handoffTaskId`(B-070 / L-200,0.65.0):🔴 **这一轮之后该盯哪条 run**。
97
- *
98
- * sdk README §9.0.0 的 workflow 车道逐字:受理形 200 上的 `taskId` 是「**宿主新铸**的 run id
99
- * (poll 它,**不要盯那张卡**)」。修前重挂腿恒用**原** taskId 重挂 `runs.events` —— 而那条 run
100
- * 已经把续跑交给了另一条,于是旧流上再也不会有推进帧,预算一路烧到 hop 上限,终帧还是一句
101
- * 与真因无关的话。
102
- * 🔴 **缺席 = 没有换挂**(终局形 / 幂等回放形 / 老 server / 这一轮压根没 decide 成功):调用方
103
- * **照旧用原 taskId**;绝不把缺席折成任何别的意思。
104
- * 🔴 **换挂时 `lastEventId` 必须丢掉**:durable seq 是 **per-run** 的,拿旧 run 的序号去续读新
105
- * run 是跨命名空间取数([same-name-different-meaning-crosses-layers])。调用点有断言。
106
- */
107
- {
37
+ export type ParkResolution = {
108
38
  kind: 'reattach';
109
39
  progress: true;
110
40
  presented: boolean;
@@ -124,28 +54,13 @@ export type ParkResolution =
124
54
  export interface ParkResolveCtx {
125
55
  deps: AskGateWireDeps;
126
56
  led: GateLedger;
127
- /** sync leg 捕获的真 run handle(内环 `TaskIdRef` 的当前值)。 */
128
57
  taskId: string;
129
- /** 本 turn park 总数(日志用;**不再**是预算计量,见 {@link MAX_GATE_HOPS})。 */
130
58
  hops: number;
131
- /** 本 turn 内**解析不出身份**的 park 数(驱动侧累计;超过 {@link MAX_TOTAL_PARKS} 即硬兜底收场)。 */
132
59
  unverifiableParks?: number;
133
- /** 连续非进展轮数(驱动侧 {@link nextHopBudget} 算出;超过 {@link MAX_GATE_HOPS} 即收场)。 */
134
60
  stalledRounds?: number;
135
- /** 上一轮非进展的真因 token(收场文案用)。 */
136
61
  lastStallReason?: string | undefined;
137
- /** 上一轮有没有真呈过卡(收场卡只在**没呈过**时才呈 —— 呈过再呈 = 把同一张失效卡再问一遍,F15-e② 禁)。 */
138
62
  lastRoundPresentedCard?: boolean | undefined;
139
63
  signal?: AbortSignal | undefined;
140
64
  }
141
65
  export declare function resolvePark(park: GatePark, ctx: ParkResolveCtx): Promise<ParkResolution>;
142
- /**
143
- * 驱动侧在**预算提交之后**判定触顶时的收场(对抗复审 r4 [high]①:有推进帧的轮次触顶必须等权威身份解析完 ——
144
- * 先呈 B、决 B,提交后仍是同一只 call 才收场;这一轮已经呈过卡,不再呈收场卡)。
145
- */
146
- export declare function stalledTerminal(park: GatePark, ctx: ParkResolveCtx, stalledRounds: number, lastStallReason: string | undefined,
147
- /** 这一轮的决断有没有落地(r5 [medium]③):落地了就**不许**说「could not be answered」「still parked」—— 那是谎报。 */
148
- decidedThisRound: boolean,
149
- /** 这一轮决断落在哪只 call(解析到的行身份):收场排水前先把**它**的扣留帧摘掉(r6 [medium]:两只同族 call 都在
150
- * 扣留、park 帧无可信身份时,决断臂刻意保守不摘,排水会把刚批准的那只当 abort 吐出)。 */
151
- decidedGatedCallId?: string | undefined): ParkResolution;
66
+ export declare function stalledTerminal(park: GatePark, ctx: ParkResolveCtx, stalledRounds: number, lastStallReason: string | undefined, decidedThisRound: boolean, decidedGatedCallId?: string | undefined): ParkResolution;