@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
@@ -2,51 +2,15 @@ import { engineCapTrue } from '../engineCapsCache.js';
2
2
  import { hostLog } from '../host.js';
3
3
  import { observedPermissionRulesWrite, permissionRulesWriteAvailable } from '../permissionRulesWriteCapability.js';
4
4
  import { readToolApprovalRespondAck } from './toolApprovalWire.js';
5
- // ── 能力位 gate ──────────────────────────────────────────────────────────────────────────────
6
- /** 规则车道在不在(四口 501 同源谓词)。未判/缺键/base 缺席 = false = 整面藏。 */
7
5
  export function persistedRulesLaneAvailable(baseUrl) {
8
6
  return engineCapTrue(baseUrl, 'permissionRules');
9
7
  }
10
- /**
11
- * 治理面(list + revoke)在不在。**两段合取**:
12
- * · `permissionRulesRevoke` 在场 = 撤销面路由已铸(缺席 = worker 比撤销面老 ⇒ 藏);
13
- * · `permissionRules` 为真 = 车道真答话(店 + 旋钮)。
14
- * 只查前者会在「7.11.0 且规则店在」的 worker 上渲出一个恒 404 的治理入口。
15
- */
16
8
  export function persistedRulesGovernanceAvailable(baseUrl) {
17
9
  return engineCapTrue(baseUrl, 'permissionRulesRevoke') && engineCapTrue(baseUrl, 'permissionRules');
18
10
  }
19
- /**
20
- * 收紧方向的单步写入口(把某条规则改成 deny/ask)对**这次调用**在不在。
21
- *
22
- * 🔴 只派生自 `capabilities.permissionRulesWrite` 自己的四态读数(`permissionRulesWriteAvailable`),
23
- * **不合取** `permissionRules`、也**不**再读一遍 `engineCapTrue`——那是撤销面(`persistedRulesGovernanceAvailable`)
24
- * 的读法,上游明说两位的读法别混:撤销面那一位是与调用方身份无关的部署级存在性信号,必须合取车道位
25
- * 才是完整判据;写口这一位的值本身**已经**编码了「车道在不在 ∧ 这次调用带不带得到身份」两件事,
26
- * 再合取一次等于给同一件事立第二个判官——车道开着但写口所在的引擎还没起播,或反过来,合取会把
27
- * 其中一种真实的过渡态错判。
28
- * 读的也是**同一份**能力位状态(该四态读器自己的 per-baseUrl 表),不是另开一张表。
29
- *
30
- * 🔴 **显式 `undefined` 不许回落装好的默认读锚**(异源对抗复审 [medium] 采纳,真病):
31
- * `observedPermissionRulesWrite(baseUrl = engineWireTarget()?.baseUrl)` 的默认参数只在参数
32
- * **省略**时生效,而调用方显式传 `undefined` 与省略在 JS 里同判——原样转发会让「这次没有 baseUrl」
33
- * 被悄悄换成**装好的默认引擎**那一份读数,与上面两口(`engineCapTrue` 对 `undefined` 恒 `unprobed`
34
- * ⇒ false,零默认读锚回落)不同律;多引擎宿主上会把「这个会话没配 baseUrl」误读成「随便一个已装
35
- * 引擎的答案」。传空串绕开默认参数(reader 对空串的处置是 `unobserved`,与 `undefined` 的意图一致
36
- * 但不触发默认值语义)。
37
- */
38
11
  export function persistedRulesWriteAvailable(baseUrl) {
39
12
  return permissionRulesWriteAvailable(observedPermissionRulesWrite(baseUrl ?? ''));
40
13
  }
41
- /**
42
- * cc-import redeem 200 体的兑付计数**双代归一读口**(server 7.46 未声明 BREAKING 的消费半场):
43
- * · **新形**(server 7.46+):`result.members[]` 判别联合,member.status ∈ {'persisted','deduped'}
44
- * (refused 不上 200 体 —— server 侧折进 404/503,见头注「404 禁按成因分支」);
45
- * · **旧形**(≤7.45;SDK 7.2.0 `rules.d.ts` 仍此形):`result.persisted[]` / `result.deduped[]` 桶。
46
- * · 纪律与 0.43.0 ruleOffers 窄读器同款:**新键(members)在场就按新键读** —— 即使全 0 也绝不
47
- * 回落旧键;两形都缺 ⇒ `null`(诚实缺席,调用方渲 unknown,绝不渲 0/成功)。
48
- * 入参吃 200 体的 `result` 字段(`unknown`:SDK 声明形已与真 wire 脱节,边界必须结构窄化)。
49
- */
50
14
  export function readCcImportRedeemCounts(result) {
51
15
  const o = (result ?? {});
52
16
  if (Array.isArray(o.members)) {
@@ -77,7 +41,6 @@ function errShape(e) {
77
41
  message: typeof o.message === 'string' && o.message !== '' ? o.message : String(e),
78
42
  };
79
43
  }
80
- /** `Retry-After` 秒数(SDK 把它折进 `retryAfterMs`)。非数/负数 ⇒ 缺席。 */
81
44
  function retryAfterSecOf(e) {
82
45
  const ms = e.retryAfterMs;
83
46
  if (typeof ms !== 'number' || !Number.isFinite(ms) || ms < 0)
@@ -86,14 +49,10 @@ function retryAfterSecOf(e) {
86
49
  }
87
50
  export function classifyRulesFailure(e) {
88
51
  const { status, errorCode, message } = errShape(e);
89
- // 🔴 店缺席只认**机器码**,不认 501 状态码本身(0.77.0 改口):引擎的错误信封恒带机器码,而一个没码的 501
90
- // 谁都能发(反代对陌生动词就回它)—— 凭它藏面、或在写腿说「确知没写」,都是把出处让给了状态码。
91
52
  if (errorCode === 'capability.rule_store_required') {
92
53
  return { kind: 'lane-unavailable', message };
93
54
  }
94
55
  if (status === 404) {
95
- // 🔴 两个 404 是**不同处置**(SDK 头注):route 缺席 = 版本太老(藏面);rule_ticket = 票没了
96
- // (丢票重来)。其余 404 一律按通用错误 —— 绝不按成因猜。
97
56
  if (errorCode === 'not_found.route')
98
57
  return { kind: 'route-missing', message };
99
58
  if (errorCode === 'not_found.rule_ticket')
@@ -118,10 +77,6 @@ export function classifyRulesFailure(e) {
118
77
  return { kind: 'too-many-candidates', message };
119
78
  if (status === 403 && errorCode === 'auth.operator_only')
120
79
  return { kind: 'forbidden', message };
121
- // 🔴 **405 分两格,判据是「码给不给得出出处」**(异源复审 R2 [medium],真病):引擎那一支发的是没有
122
- // 前缀族的裸 `method_not_allowed` —— 见到它才能说「这台 worker 比这个动词老」。而**无码**的 405
123
- // (中间层/网关拦 POST 时常回 HTML 或空体)谁都能发,凭它断言对端版本会让调用方去升级一台其实没问题
124
- // 的 worker、或藏掉一个其实活着的入口。空串码与缺席同判(都给不出出处),不许两者各落一格。
125
80
  if (status === 405) {
126
81
  return errorCode === 'method_not_allowed'
127
82
  ? { kind: 'method-unsupported', message }
@@ -129,86 +84,25 @@ export function classifyRulesFailure(e) {
129
84
  }
130
85
  return { kind: 'error', message };
131
86
  }
132
- // ── 三态规则身份(behavior)────────────────────────────────────────────────────────────────────
133
- /**
134
- * 一条持久规则是哪一态 —— sdk `RuleBehavior` 的**运行期镜像**(引擎侧同一张闭三词表)。
135
- * `allow` = 一次人工批准的常驻形(卡上点的「不再询问」);`deny` / `ask` = 「永不运行」与
136
- * 「每次都问我」的常驻形。**一套文法、一种规范拼法、一族匹配器**服务三态,态是**文本旁边的
137
- * 一格**,永远不是文本的一部分。
138
- * 🔴 门 `run-rules-side-test.mjs` G9a 对 sdk 的联合成员**逐词等值**对账(缺一词红、多一词红)。
139
-
140
- * 🔴 形制:`Object.freeze` 的数组,**不是**只在类型面只读的 `readonly T[]` —— 后者一行 `.splice()`
141
- * 就能改,而公面消费者拿到的正是这个实例(本仓已定谳的病形,同 `RESUME_RETRY_LATER_CODES`)。
142
- */
143
87
  export const PERSISTED_RULE_BEHAVIORS = Object.freeze(['deny', 'ask', 'allow']);
144
88
  const BEHAVIOR_SET = new Set(PERSISTED_RULE_BEHAVIORS);
145
- /** 一行上非空字符串字段的取值(其余一律 `undefined`)。 */
146
89
  function rowStr(row, key) {
147
90
  if (typeof row !== 'object' || row === null || Array.isArray(row))
148
91
  return undefined;
149
92
  const v = row[key];
150
93
  return typeof v === 'string' && v.length > 0 ? v : undefined;
151
94
  }
152
- /**
153
- * 一条**持久规则行**的身份两键(`rule` / `scope`)读不读得出 —— 列举面与单步写口**共用的那一只**
154
- * 行型窄化器(🆕 0.77.0 提名:此前它内联在列举面的翻页循环里,写口回包要判同一件事,再写一遍就是
155
- * 同一份判据的第二个法官)。
156
- *
157
- * 🔴 **只判身份两键,不判展示键**:`rule` / `scope` 是撤销按内容寻址那一对,读不出 ⇒ 这一行既渲不出
158
- * 也撤不掉;而 `tool` / `match` / `command` / `adds` 是展示键,引擎 additive 演进不该把整面打红
159
- * (消费端对展示键自有坏形容忍)。
160
- * 🔴 **`behavior` 刻意不在这道门里**:读不出态的行**照样交出去**(丢行 = 把一条活规则从治理清单里
161
- * 藏起来),呈现走 {@link persistedRuleBehaviorLabel}、撤销侧由
162
- * {@link revokeTargetFromPersistedRule} 自己拒铸 —— 两条纪律分属两个位置,合并会让「看得见但撤不掉」
163
- * 这个**正确**的中间态变得不可表达。
164
- * 🔴 **两处必须同判**:写口 200 体里的那一行与列举面的行在上游是**逐格相同**的一只形;两处各铸一份
165
- * 判据的那天,同一条规则会在治理清单里在场、在写完回填时被判坏(或反过来)。
166
- */
167
95
  function persistedRuleIdentityRowReadable(row) {
168
96
  return rowStr(row, 'rule') !== undefined && rowStr(row, 'scope') !== undefined;
169
97
  }
170
- /**
171
- * 这一行是哪一态。**闭三词**之外(含整键缺席的老 worker 行)一律 `undefined`。
172
- *
173
- * 🔴 **绝不补默认**:缺席是「这台 worker 说不出来」,不是 `allow`。补一个默认会让呈现面
174
- * 对一条 deny 行说 allow,而撤销面据此瞄准另一态。
175
- * 🔴 这里**按闭集读**(与本包其余开集读口刻意不同):这一格是**身份**的一格,不是一个展示词——
176
- * 读不懂的身份必须判「读不出」,而不是原样当成一个能拿去撤销的态。呈现层要原样渲那个词,
177
- * 走 {@link persistedRuleBehaviorLabel}(它是开集的)。
178
- */
179
98
  export function persistedRuleBehaviorOf(rule) {
180
99
  const b = rowStr(rule, 'behavior');
181
100
  return b !== undefined && BEHAVIOR_SET.has(b) ? b : undefined;
182
101
  }
183
- /** 读不出态时呈现面渲的那个词。**逐字锚**(三端共用一句;端零自拼)。 */
184
102
  export const PERSISTED_RULE_BEHAVIOR_UNKNOWN = '(unknown)';
185
- /**
186
- * 治理行上「态」那一列的**唯一措辞铸点**。
187
- * 🔴 三态渲词本身;**表外词原样渲**(开集 —— 引擎加词那天治理面照样看得见那个词,不至于把一条
188
- * 真实的行渲成「读不出」);**整键缺席/坏形**才渲 {@link PERSISTED_RULE_BEHAVIOR_UNKNOWN} ——
189
- * 它不冒充三态里的任何一个,读到它的人知道下一步是升级那台 worker。
190
- */
191
103
  export function persistedRuleBehaviorLabel(rule) {
192
104
  return rowStr(rule, 'behavior') ?? PERSISTED_RULE_BEHAVIOR_UNKNOWN;
193
105
  }
194
- /**
195
- * 一条列举行 → 撤销体(`rules.revoke()` 的入参)。**按内容寻址**,这条面上下没有任何 id。
196
- *
197
- * 🔴 **身份三元组逐字回传**(`behavior` / `rule` / `scope`):拼法等价但不逐字相同的 scope 什么都
198
- * 匹配不上,而且会得到一个笑呵呵的 `no-op`;所以原样送回引擎给的那串字节,别拿解析后的形重铸。
199
- * 🔴 **只带身份三键 + 可选 `principal`**:`source` / `status` 是**派生键**,回传它们会被拒。
200
- * 🔴 **`behavior` 读不出 ⇒ 拒铸(返回 `undefined`)**,这正是本次 BREAKING 的全部理由:猜一态的
201
- * 代价是不可逆地删掉另一态的行且调用方收到 200;拒铸的代价只是治理面少一个按钮。调用方据此
202
- * 藏掉撤销入口(并可用 {@link persistedRuleBehaviorLabel} 告诉用户为什么)。
203
- * 🔴 `rule` / `scope` 任一读不出也拒铸:按 `undefined` 撤销什么都对不上。
204
- * 🔴 **显式给了一个无效 `principal` ≠ 没给**(异源对抗复审 [high]):`principal` **缺席**明确表示
205
- * 「撤**我自己的**」。若把一个显式传进来的空串/非串静默降级成缺席,一次瞄准**别人**的 operator
206
- * 撤销就会转向**调用者自己**的规则桶,并且拿到一个 200 —— 而目标值算空在治理面上是常见形
207
- * (表单空字段、一次没查到的用户名)。⇒ 键**在场但值不合法**时**拒铸整只**,与 `behavior`
208
- * 读不出同一条处置。`opts` 整只不给、或给了但不含这个键,才是「缺席 = 撤我自己的」那个合法意图。
209
- * ⚠️ 合法值**原样送出不 trim**:principal 的规范形归引擎,壳替它 trim 会让两端对「同一个人」的
210
- * 拼法各有一份判据。
211
- */
212
106
  export function revokeTargetFromPersistedRule(rule, opts) {
213
107
  const behavior = persistedRuleBehaviorOf(rule);
214
108
  if (behavior === undefined)
@@ -227,17 +121,6 @@ export function revokeTargetFromPersistedRule(rule, opts) {
227
121
  ...(override.principal !== undefined ? { principal: override.principal } : {}),
228
122
  };
229
123
  }
230
- /**
231
- * 越权域那一格的**唯一判据**(撤销体与单步写体两条腿共用):`principal` 键**缺席** = 「这一条是
232
- * 我自己的」;键**在场但指不了人**(非串 / 空白串)⇒ `ok:false` = **整只拒铸**。
233
- *
234
- * 🔴 **显式给了一个无效名 ≠ 没给**:把它静默降级成缺席,会让一次瞄准**别人**的 operator 操作转向
235
- * **调用者自己**的规则桶并拿到一个 200 —— 在收紧方向上那是「本该给租户加的拒绝,加到了自己头上」,
236
- * 在撤销方向上是「本该收回租户的放行,删了自己的规则」。而目标值算空在治理面上是常见形
237
- * (表单空字段、一次没查到的用户名)。
238
- * ⚠️ 合法值**原样送出不 trim**:principal 的规范形归引擎,壳替它 trim 会让两端对「同一个人」的拼法
239
- * 各有一份判据。
240
- */
241
124
  function readPrincipalOverride(carrier) {
242
125
  if (carrier === null || typeof carrier !== 'object' || !('principal' in carrier))
243
126
  return { ok: true };
@@ -246,26 +129,8 @@ function readPrincipalOverride(carrier) {
246
129
  return { ok: false };
247
130
  return { ok: true, principal: raw };
248
131
  }
249
- /** 一页要多少条。**必须显式给**(对抗复审 [medium] 实撞):server 缺省是 **50**,而页帽
250
- * 按「200/页」算 ⇒ 真实上界只有 1250 条,一位规则多于 1250 的 principal 会恒拿到「翻不完」的
251
- * 失败、整个治理面打不开,而注释还写着 5000。夹取语义在 server(非数/越界夹进 1..200),所以给
252
- * 上限最省往返、也让页帽的算术与现实一致。 */
253
132
  const PAGE_LIMIT = 200;
254
- /** 页数硬帽:server 恒给 nextCursor 的坏形不该让治理面无限翻(PAGE_LIMIT × 25 = 5000 条)。 */
255
133
  const MAX_PAGES = 25;
256
- /**
257
- * 列全一位 principal 名下活着的规则。
258
- *
259
- * 🔴 **翻页要翻完**:`nextCursor` 缺席才是终点 —— 半途停下拿到的是一份不全的清单,而治理视图
260
- * 恰恰最不能拿不全的清单当全量。所以这里 drain 到底,任何一页失败都不交部分结果。
261
- * 🔴 **游标绑 `(rev, principal, scope)`**:两页之间有人加/删了规则 ⇒ 第二页 400
262
- * `request.query_invalid`。处置 = **丢游标从头列一次**(静默重置成「接着上一页」会得到一份既漏行
263
- * 又重行的清单);从头再撞一次 ⇒ 如实报 cursor-stale,由调用方(人按 r 刷新)决定。
264
- * 🔴 **调用方 cursor 不收**(复审 F2 对抗复审 [medium]):类型上剔掉 `cursor` 还不够 —— JS
265
- * 调用方仍能塞进来,而首页的 `...params` 会把它原样送出 ⇒ 「列全」从**中途**开始却报 `ok:true`
266
- * 完整清单(治理面据此藏掉仍然生效的规则)。运行期显式剥除 + 留痕:drain 恒从第一页起,
267
- * 「接着别人的 keyset」证明不了完整性,与本函数的契约(rules 恒完整)结构性冲突。
268
- */
269
134
  export async function listAllPersistedRules(facade, params = {}, opts) {
270
135
  const { cursor: callerCursor, ...cleanParams } = params;
271
136
  if (callerCursor !== undefined) {
@@ -279,8 +144,6 @@ export async function listAllPersistedRules(facade, params = {}, opts) {
279
144
  for (let page = 0; page < MAX_PAGES; page++) {
280
145
  let res;
281
146
  try {
282
- // limit 显式给:①页帽的算术要与真实页大小一致(见 PAGE_LIMIT);②keyset 游标绑的是
283
- // 一份确定的翻页参数,页大小在两页之间变会让「接着上一页」失去意义。调用方可覆盖。
284
147
  res = await facade.list({ limit: PAGE_LIMIT, ...cleanParams, ...(cursor !== undefined ? { cursor } : {}) }, opts);
285
148
  }
286
149
  catch (e) {
@@ -292,13 +155,6 @@ export async function listAllPersistedRules(facade, params = {}, opts) {
292
155
  }
293
156
  return { ok: false, failure };
294
157
  }
295
- // 🔴 页体 fail-closed 窄化(复审 F2 轮二 [high]):SDK 传输层只 JSON.parse,不做运行期
296
- // schema 校验 —— 一个 2xx 的 `{rev:9}`(无 rules 数组)在旧读法下会被认证成「完整的空清单」
297
- // (`ok:true, rules:[]`),治理面据此宣称「没有持久规则」而活规则不可见、无法撤销
298
- // (版本偏斜/后端降级下静默发生)。坏形页 = 判不出,绝不当「读到了空的」:
299
- // · `rules` 必须是数组、`rev` 必须是有限数(SDK `RuleListResult` 两键皆必填);
300
- // · `nextCursor` 只有两种合法形:**缺席**(= 终页)或**非空字符串**(= 还有下一页);
301
- // `''`/null/数字等坏形不许被折成「到头了」—— 猜终点与猜续点同罪。
302
158
  if (typeof res !== 'object' ||
303
159
  res === null ||
304
160
  !Array.isArray(res.rules) ||
@@ -312,9 +168,6 @@ export async function listAllPersistedRules(facade, params = {}, opts) {
312
168
  },
313
169
  };
314
170
  }
315
- // 🔴 跨页 rev 钉(复审 F2 轮三 [high]):游标契约上绑 rev —— 清单变了,续页**该** 400
316
- // cursor-stale。一个 2xx 却换了 rev 的续页 = server 违约或降级形,拼起来是**混合快照**;
317
- // 认证它为完整清单,比 400 那条腿(丢游标重列)更坏 —— 这里不猜不修补,如实 failure。
318
171
  if (rev !== null && res.rev !== rev) {
319
172
  return {
320
173
  ok: false,
@@ -324,14 +177,7 @@ export async function listAllPersistedRules(facade, params = {}, opts) {
324
177
  },
325
178
  };
326
179
  }
327
- // 🔴 行级窄化(同轮):撤销承重的两键(`rule` / `scope`,revoke 的按内容身份对)必须是
328
- // 非空串 —— `rules:[null]` / 缺 scope 的行被展进 `PersistedRule[]`,下游要么渲空白治理项、
329
- // 要么按 undefined 撤销(什么都对不上)。坏行 = 坏页(丢行会把活规则藏起来,正是本函数
330
- // 拒绝的病);其余展示键(tool/match/command/adds)不在此过度收紧 —— server additive 演进
331
- // 不该把整面打红,消费端对展示键自有坏形容忍。
332
180
  for (const r of res.rules) {
333
- // 🔴 与单步写口回包**同一只**窄化器(`persistedRuleIdentityRowReadable`)—— 两处各判一遍的
334
- // 那天,同一条规则会在一面在场、在另一面被判坏。
335
181
  if (!persistedRuleIdentityRowReadable(r)) {
336
182
  return {
337
183
  ok: false,
@@ -370,118 +216,31 @@ export async function listAllPersistedRules(facade, params = {}, opts) {
370
216
  }
371
217
  return { ok: false, failure: { kind: 'cursor-stale', message: 'rule list kept changing under the cursor — try again' } };
372
218
  }
373
- // ── 单步写口(收紧方向;engine ≥7.91.0)────────────────────────────────────────────────────────
374
- /**
375
- * 单步写口**不收**的那一态 —— 放宽方向的单一铸点。
376
- *
377
- * 🔴 `satisfies RuleBehavior` 不是装饰:它把这个字面量钉在**引擎的态词表**上。哪天词表里没有这个词了,
378
- * 本行当场编译不过 —— 而一个手写的排除词在那天会安静地排除一个不存在的东西。
379
- */
380
219
  const DIRECT_WRITE_EXCLUDED_BEHAVIOR = 'allow';
381
- /**
382
- * 单步写口收得下的**态**,运行期表。**由 {@link PERSISTED_RULE_BEHAVIORS} 减去放宽那一词派生**,
383
- * 源码里**没有第二个 behavior 字面量数组**(门对这一条有边界钉)。
384
- *
385
- * 🔴 **为什么必须是派生而不是一张两词表**:态的词表属主只有一个(引擎)。一张手抄的两词表会在词表
386
- * 加员的那天变成一句没人复核过的旧话 —— 新词既进不来,也没有任何一道门会响。派生式让这句话跟着
387
- * 词表走:这里表达的不是「有哪两个词」,而是**「三态里哪些进得了这条口」**。
388
- * 🔴 **放宽方向在类型上就拼不出来**:常驻放行只有两条路(审批卡上的人点头 / 一次显式的 settings 导入),
389
- * 这条口**不是**第三条。一个能拼出来的放宽入参会让调用方以为它是。
390
- * 🔴 形制同兄弟表:`Object.freeze` 的数组,不是只在类型面只读的 `readonly T[]` —— 后者一行 `.splice()`
391
- * 就能改,而公面消费者拿到的正是这个实例。
392
- */
393
220
  export const PERSISTED_RULE_WRITE_BEHAVIORS = Object.freeze(PERSISTED_RULE_BEHAVIORS.filter((b) => b !== DIRECT_WRITE_EXCLUDED_BEHAVIOR));
394
221
  const WRITE_BEHAVIOR_SET = new Set(PERSISTED_RULE_WRITE_BEHAVIORS);
395
- /** 这个值是不是一个写得进去的态。**判据只读上面那张运行期表**(不是第二份词表,也不是一串 `||`)。 */
396
222
  function isPersistedRuleWriteBehavior(v) {
397
223
  return typeof v === 'string' && WRITE_BEHAVIOR_SET.has(v);
398
224
  }
399
- /**
400
- * 写**没落地**的成因闭集。每一词都对着一条真码 / 一条本地判据,**核不到的不铸**。
401
- *
402
- * 前四词是**发出去之前**就定局的(本地拒铸,连一次往返都没有);后六词是引擎的答话。
403
- * 🔴 十词共同的、也是唯一的承诺:**这次调用一个字都没写进店**。所以一个拿不出这句话的证据的成因
404
- * **不许**进这张表 —— 哪怕它看上去像一次拒绝(例:一个来源不明的 405,见
405
- * {@link PERSISTED_RULE_WRITE_UNKNOWN_REASONS} 的 `unattributed_method_refusal`)。「说不清」不在这张表里,它是
406
- * {@link PersistedRuleWriteOutcome} 的另一臂({@link PERSISTED_RULE_WRITE_UNKNOWN_REASONS})。
407
- */
408
225
  export const PERSISTED_RULE_WRITE_REFUSAL_CAUSES = Object.freeze([
409
- /** 本地:态不在 {@link PERSISTED_RULE_WRITE_BEHAVIORS} 里(放宽那一词,或干脆不是一个态)。 */
410
226
  'unwritable_behavior',
411
- /** 本地:`rule` / `scope` 任一不是非空串 —— 按缺席寻址什么都对不上。 */
412
227
  'unreadable_identity',
413
- /** 本地:`principal` 键在场但指不了人(静默改写那一条,见 `readPrincipalOverride`)。 */
414
228
  'unusable_principal',
415
- /** 本地:注入的 facade 上**没有这个动词**(宿主的客户端比这条口老)⇒ 连发都没发出去。 */
416
229
  'client_too_old',
417
- /** 400 `request.field_invalid` —— 字段值被拒(方向 / 规则文本 / scope 的字节),机读细格停在 wire 上。 */
418
230
  'field_refused',
419
- /** 400 `request.body_shape` —— 体读不出形;同一份体重发永远同一个结果。 */
420
231
  'body_shape',
421
- /** 403 `auth.operator_only` —— 替别人写被拒(显式名单;空名单 = 谁都不是)。 */
422
232
  'operator_only',
423
- /** 501 `capability.rule_store_required` —— 这台部署没接规则店 / 旋钮关着。 */
424
233
  'store_absent',
425
- /** 405 **带引擎自己的裸 `method_not_allowed`** —— 路径在、这个动词不在:worker 比这条动词老。 */
426
234
  'lane_too_old',
427
- /** 404 `not_found.route` —— 这条路径整条不在(worker 比规则面本身还老)。 */
428
235
  'route_absent',
429
236
  ]);
430
- /**
431
- * 「**不知道落没落**」的成因闭集。
432
- *
433
- * 🔴 这五词与上面那十词**不可互折**:那些说的是「确知没写」,这五词说的是「**读不出结局**」。
434
- * 把后者渲成前者会让人以为可以干净地重来一遍;渲成 `persisted` 则是谎报一次可能根本没发生的
435
- * 收紧。四词的处置一律是:重试,然后用 {@link listAllPersistedRules} 对账。
436
- *
437
- * 🔴 **「重试」在批准台账上是安全的,而这条安全性在引擎里、不在这里**(异源复审 R2 [high] 提出的
438
- * 「重放会让台账无界增长」,亲读引擎的写腿验真后**改成文、不改代码**):引擎在落任何东西之前**先问
439
- * 「这条身份已经站着吗」**,站着就**一个字都不写**并答 `no-op`。所以一次「说不清」之后**顺序**重发
440
- * 同一份身份三元组,最坏情况是收到 `no_op` —— 批准台账不增长、桶的修订号不推进。
441
- * ⚠️ 真正会让同一条逻辑规则带上两枚因果点的是**并发**:两个写者同时看见「不在」而各落一枚,
442
- * 那是 add-wins 的正解(两枚点、一条规则),两边都会如实收到 `persisted`,没有人被告知「没写」。
443
- * ⚠️ 也正因为这道前问在**引擎**那一侧,本包**不**在重试前自己先列举一遍 —— 那会把引擎已经做了的
444
- * 读再做一次,并且给同一个问题立第二个说话人。「先对账再决定要不要重发」是调用方的策略自由,
445
- * 不是本口的前置条件。
446
- */
447
237
  export const PERSISTED_RULE_WRITE_UNKNOWN_REASONS = Object.freeze([
448
- /** 503 `state.rule_write_failed` —— 引擎**自己说**它判不出终局(店抖动 / 兑付面没交回可判的终局 /
449
- * 写落了而回读它时一条并发撤销已先到,三者在这条口上不可分辨)。 */
450
238
  'indeterminate',
451
- /** 2xx 但体读不出(`status` 不在闭二词里 / `rev` 不是有限数 / 回包那一行的身份两键读不出)。
452
- * 🔴 **绝不**折成 `persisted` —— 一个读不懂的回包证明不了任何事。 */
453
239
  'malformed_result',
454
- /**
455
- * 2xx 形是好的,但回包那一行的**身份三元组与这次发出去的那份对不上**(态 / 文本 / 作用域任一不逐字相同,
456
- * 含整格缺席)。
457
- * 🔴 **这一格不是「同一份判据的第二个法官」,是另一个问题**(异源复审 R1 [high] 采纳):行型窄化器答的是
458
- * 「这一行读得出来吗」(列举面与本口同一只);这里答的是「读出来的这一行**是不是我刚才要写的那条**」——
459
- * 后者的材料(刚发出去的身份)只有写腿手上有,列举面根本问不出这个问题。
460
- * 🔴 为什么非查不可:规则的身份是**三元组**,同文本不同态是两条不同的行。一个缺了态、或回了兄弟态、
461
- * 或回了另一条文本的 200 若被认证成 `persisted`,调用方会对人宣布一条**根本没落地**的收紧,
462
- * 而治理面上那条规则并不在。诚实的答案是「读不出结局」:重试,然后用列举面对账。
463
- * ⚠️ 对一台如实作答的引擎这一格**恒不发生**:写口的 200 体里那一行是它**按同一份身份三元组**从店里
464
- * 找回来的,非规范拼写在更早一道门上就已经被拒(所以 200 ⇒ 发出去的文本就是店里的拼写),
465
- * 作用域判别式串的解析与回写是不动点。所以它响起来只意味着版本偏斜、中间层改写或坏回包。
466
- */
467
240
  'identity_mismatch',
468
- /**
469
- * 405 **而码给不出出处**(缺席 / 空串 / 别的码)—— 看见的是「这个动词被拒了」,而**谁拒的、拒在哪一段
470
- * 不知道**:引擎那一侧的 405 发在路由分派期(请求没进处理腿),但一个中间层 / 网关也能发同一个状态码,
471
- * 而它**可能已经把请求转给引擎**、事后才按自己的策略回 405。
472
- * 🔴 **所以它进「不知道」而不是「确知没写」**(异源复审 R3 [medium] 采纳):后者那一组的承诺是「一个字
473
- * 都没写进店」,而这一形拿不出那句话的证据 —— 一个据此**跳过对账**的调用方会留下一条用户以为没生效
474
- * 的常驻拒绝。处置与本组其余各词相同:重试(台账安全),然后用 {@link listAllPersistedRules} 对账。
475
- * ⚠️ 与 `lane_too_old` 的分别仍然保留、而且是这一格存在的理由:**别据此要求升级 worker、也别据此藏掉
476
- * 入口**(那两个动作要的是能力位或版本证据,不是一个谁都能发的状态码)。要说「这台 worker 比这个
477
- * 动词老」,只有引擎自己的裸码才有资格。
478
- */
479
241
  'unattributed_method_refusal',
480
- /** 抛了,而分类器没能把它归进任何一条「确知没写」的腿(网络 / 超时 / 中间层 / 未来的码)。
481
- * 非幂等动词上「没分出来」的默认必须是「不知道」,不是「没写」。 */
482
242
  'unclassified',
483
243
  ]);
484
- /** 失败分类(单一判官 {@link classifyRulesFailure})→ 写口结局的**全量**映射。 */
485
244
  function writeOutcomeFromFailure(failure) {
486
245
  const message = failure.message;
487
246
  switch (failure.kind) {
@@ -495,43 +254,16 @@ function writeOutcomeFromFailure(failure) {
495
254
  return { status: 'refused', cause: 'store_absent', message };
496
255
  case 'method-unsupported':
497
256
  return { status: 'refused', cause: 'lane_too_old', message };
498
- // 🔴 405 但码给不出出处 ⇒ **不知道**,不是「确知没写」(异源复审 R3 [medium]):一个中间层可能已经把
499
- // 请求转给引擎、事后才按自己的策略回 405。逐条理由见该词的注。
500
257
  case 'method-refused':
501
258
  return { status: 'unknown', why: 'unattributed_method_refusal', message };
502
259
  case 'route-missing':
503
260
  return { status: 'refused', cause: 'route_absent', message };
504
261
  case 'write-indeterminate':
505
262
  return { status: 'unknown', why: 'indeterminate', message };
506
- // 🔴 其余各臂(通用 error,以及票面 / 游标 / 页帽那几条本口结构上到不了的腿)一律「不知道」:
507
- // 这是一个**非幂等**动词,「没分出来」的默认是「读不出结局」,不是「什么都没写」——
508
- // 一个 500 完全可能发生在店写完之后。
509
263
  default:
510
264
  return { status: 'unknown', why: 'unclassified', message };
511
265
  }
512
266
  }
513
- /**
514
- * 单步写一条**收紧**规则(deny/ask)进持久店 —— 撤销面的对偶,无同意仪式往返。
515
- *
516
- * 判据次序照引擎那一侧逐条对位,**只多一道在最前面**:
517
- * ⓪ **口在不在**(注入的 facade 有没有这个动词)—— 与「按能力位 gate、别 trial-by-501」同一条纪律:
518
- * 一次连动词都拼不出来的调用不该先去撞引擎的限流桶;
519
- * ① 体形(身份三键读得出);② 方向(只收收紧);③ scope 读得出形;④ 越权域那一格。
520
- * ②③④ 的**本地**判据刻意比引擎宽:本地只判「这串是不是一个 X」,「这个 X 写得进去吗」永远由引擎答
521
- * (规范拼写、scope 的字节、行自洽都是引擎的判据)—— 壳替它判一遍就是同一件事的第二份真源。
522
- *
523
- * 🔴 **本函数不重试**:一次「说不清」被自动重放,重试预算与节奏就成了本包替调用方做的决定;而对账
524
- * 那一步(用 {@link listAllPersistedRules} 读回来看)只有调用方做得了。
525
- * ⚠️ 手工重试**在批准台账上是安全的**(引擎落地前先问「已经站着吗」,站着就一个字都不写)——
526
- * 逐条理由见 {@link PERSISTED_RULE_WRITE_UNKNOWN_REASONS} 的头注。
527
- * 🔴 **回包那一行走列举面同一只窄化器**,不给同一份判据立第二个法官;读不出 ⇒ `unknown` /
528
- * `malformed_result`,**绝不**当成「写上了」。
529
- * 🔴 **窄化之后还有一道身份对账**(`identity_mismatch`):回包那一行的身份三元组必须与发出去的那份逐字
530
- * 相同。这不是同一份判据的第二个法官 —— 窄化器答「读得出来吗」,对账答「是不是我要的那条」,而后者的
531
- * 材料只有写腿手上有。列举面「态读不出的行照样交出去」的纪律在这里不适用:看得见 ≠ 证明得了。
532
- * ⚠️ 回包行的 `adds[].origin` **不是**「谁写的这条规则」的判据(引擎今天从审批记录的种类派生出处词,
533
- * 而本口落店走的是同一条兑付腿)—— 原样透传,不进本包任何一条判据。
534
- */
535
267
  export async function writePersistedRule(facade, input, opts) {
536
268
  const port = facade?.write;
537
269
  if (typeof port !== 'function') {
@@ -575,15 +307,7 @@ export async function writePersistedRule(facade, input, opts) {
575
307
  }
576
308
  let res;
577
309
  try {
578
- // 🔴 **`port.call(facade, …)` 而不是 `port(…)`**(异源复审 R1 [high],真病):把方法从对象上取下来
579
- // 再裸调,`this` 就没了。本包其余三口走的都是 `facade.list(…)` 这种**方法调用**形,而宿主最自然的
580
- // 装配恰恰是把真 client 的资源对象原样交进来(那是一个类实例,它的每个动词都靠 `this` 拿传输层)——
581
- // 裸调在那种 facade 上当场抛,而写口会把它读成一次「不知道落没落」,重试多少次都一样。
582
- // 绑回接收者让三口同律;注入的是普通对象/箭头函数时,多传一个 thisArg 也无害。
583
310
  res = await port.call(facade, {
584
- // 🔴 只送身份三键 + 可选越权域:派生键(源 / 站位)回送会被拒,而**原样送引擎给的那串字节**
585
- // 是撤销面同一条纪律(拼法等价但不逐字相同的 scope 什么都匹配不上,还会得到一个笑呵呵的
586
- // 「没什么可做」)。
587
311
  behavior,
588
312
  rule,
589
313
  scope,
@@ -593,8 +317,6 @@ export async function writePersistedRule(facade, input, opts) {
593
317
  catch (e) {
594
318
  return writeOutcomeFromFailure(classifyRulesFailure(e));
595
319
  }
596
- // 🔴 2xx 体 fail-closed 窄化:传输层只 JSON.parse,不做运行期 schema 校验。一个读不懂的 200
597
- // 证明不了「写上了」,而把它折成 `persisted` 会让治理面宣布一条**可能根本不存在**的收紧。
598
320
  const status = res?.status;
599
321
  const rev = res?.rev;
600
322
  const row = res?.rule;
@@ -610,12 +332,6 @@ export async function writePersistedRule(facade, input, opts) {
610
332
  message: 'the rule write answered 2xx with a body this client cannot read (status, rev or the written row) — refusing to certify it as a standing rule; re-list the rules to reconcile',
611
333
  };
612
334
  }
613
- // 🔴 **身份对账**(异源复审 R1 [high],真病):上面那道门只问「这一行读得出来吗」(与列举面同一只
614
- // 窄化器、同一个问题);这一道问的是**另一个**问题 ——「读出来的这一行是不是我刚才要写的那条」。
615
- // 规则的身份是**三元组**,同文本不同态是两条不同的行:一个缺了态、回了兄弟态、或回了另一条文本的
616
- // 200 若被认成 `persisted`,调用方会对人宣布一条根本没落地的收紧。
617
- // ⚠️ 列举面**刻意**把态读不出的行照样交出去(丢行 = 藏起一条活规则),那条纪律在这里不适用:
618
- // 「看得见」与「证明得了」是两件事,两个问题各有各的门,不是一份判据的两个法官。
619
335
  const landed = row;
620
336
  if (landed.behavior !== behavior || landed.rule !== rule || landed.scope !== scope) {
621
337
  return {
@@ -625,20 +341,11 @@ export async function writePersistedRule(facade, input, opts) {
625
341
  };
626
342
  }
627
343
  return {
628
- // wire 的 `no-op` 与本包判别联合的 `no_op` 是同一件事的两种拼法;判别位在这里归一**一次**,
629
- // 三端各拼一次的那天会长出两种写法。
630
344
  status: status === 'persisted' ? 'persisted' : 'no_op',
631
345
  rev,
632
346
  rule: row,
633
347
  };
634
348
  }
635
- // ── skipped.reason 分类 ─────────────────────────────────────────────────────────────────────
636
- /**
637
- * `skipped[].reason` 的分类。**只按第一个 `:` 前缀**,且必须容得下**没有前缀**的两种真值形
638
- * (整层 JSON 解不开 / 条目不是串)——SDK 头注逐字:reason 是给人看的散文,不是机读码,
639
- * 全串等值匹配与「裸码」两种读法都会漂。
640
- * 前缀形判据刻意保守(`RuleRejectCode` 形:小写 + 点/下划线),防把散文里的第一个冒号误读成码。
641
- */
642
349
  export function classifySkippedReason(reason) {
643
350
  const text = typeof reason === 'string' ? reason : String(reason);
644
351
  const idx = text.indexOf(':');
@@ -649,22 +356,6 @@ export function classifySkippedReason(reason) {
649
356
  return { text };
650
357
  return { code: head, text };
651
358
  }
652
- /**
653
- * respond 回执上「不再询问到底存上了没」的**结构化读口**。
654
- *
655
- * 🔴 **单一台账**(A-028.14 收口本体):`rulePersisted` / `ruleRefusal` 的结构窄化只有
656
- * {@link readToolApprovalRespondAck} 这一份 —— 本函数不对 wire 原料二次开读,ack 过不了包内
657
- * 结构门(缺 `delivery:'applied'` / `approvalId` / 三词闭集 `decision`)⇒ **`unknown`**:
658
- * 一张连回执身份都不成形的 ack,不配驱动一行「已保存」的用户告知(诚实缺席优先)。
659
- * 收口前 cli 的裸读会把 `{rulePersisted:true}` 这类半形对象读成 `persisted` —— 那正是双份台账
660
- * 各漂各的形,常驻套对这一格有反向钉。
661
- *
662
- * 🔴 `rulePersisted` 缺席 ≠ `false`(未带 persistRule 的回决 / 旧 server ⇒ 字段省略);
663
- * 🔴 规则没存上**从不翻转裁决** —— 200 + `rulePersisted:false` + `ruleRefusal` 是诚实形,
664
- * 宿主只说「这次放行了,但『不再询问』没存上」,绝不渲成整次审批失败。
665
- * 🔴 `rule_lane_unavailable` **四种成因共用一格、两种是本卡局限** ⇒ 禁据一帧判断整台部署的车道
666
- * 在不在(那要看能力位)。
667
- */
668
359
  export function readRulePersistOutcome(ack) {
669
360
  const parsed = readToolApprovalRespondAck(ack);
670
361
  if (parsed === undefined)
@@ -672,7 +363,6 @@ export function readRulePersistOutcome(ack) {
672
363
  if (parsed.rulePersisted === true)
673
364
  return { state: 'persisted' };
674
365
  if (parsed.rulePersisted === false) {
675
- // 空串/非串已在 readToolApprovalRespondAck 降缺席(单一台账),这里只剩「在场即带」。
676
366
  return {
677
367
  state: 'refused',
678
368
  ...(typeof parsed.ruleRefusal === 'string' ? { reason: parsed.ruleRefusal } : {}),