@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,78 +1,12 @@
1
- /**
2
- * memoryEntriesWire — 记忆**条目面**三个 200 回体的三端共用**窄读口**(0.76.1 CC-97a):
3
- * ① `GET /v1/memory/export?scope=` 的条目行(`{ scope, exportedAt, entries[] }`);
4
- * ② `POST /v1/memory/erase` 的**抹除证明**回体;
5
- * ③ `POST /v1/memory/origin/entries/:entryId/clear` 的**清标回执**。
6
- *
7
- * 🔴 本件只有**读口**:一个动词都不调、一个请求都不铸(动词半场另票)。入参一律 `unknown` —— 三个回体在
8
- * wire 上要么是开放判别式(引擎原样下发、不投影、不复述),要么 SDK 的声明形里就是 `unknown[]`,
9
- * 所以边界必须**按结构**窄读。
10
- *
11
- * ── 逐行窄读的三条边界(与本包既有行读口同律)────────────────────────────────────────────────
12
- * · **空数组 = 真 0**(引擎明说「一条都没有」);
13
- * · **非空数组却一行都读不出 ⇒ `malformed`**(这一眼没看成),**绝不**答「present + 空列表」——
14
- * 那是把「取不到」冒充「一条都没有」;
15
- * · **半坏 ⇒ `present` + `dropped` 计数**(读得出来的行是真的,丢掉那几条如实交代)。
16
- * 🔴 「读不懂的行」与「没有行」在本件里**永远不共用一句话**。
17
- *
18
- * ── 🔴 「空答不等于本店干净」在代码里的落点 ─────────────────────────────────────────────────
19
- * 导出读口的答案在两条轴上都不完备,而**两条都不是本包能推翻的**:
20
- * · **scope 轴**:引擎 v1 没有 scope 枚举读面,一次答案只覆盖调用方点名的那一个 scope ⇒
21
- * {@link scopeExternalOriginVerdict} 的肯定臂叫 `none_in_this_scope` **并且带着那个 scope 串**,
22
- * 联合里**没有**任何「整店」臂 —— 想把它复述成全店结论,型上就写不出来。
23
- * · **围栏轴**:这条读口**缺省不投带外源标的条目**(整条目扣留 + 只在 n>0 时铸一格计数),调用方须在
24
- * 请求上显式声明认识 origin 键族才放行。回体在两种情形下**形状完全一样** ⇒ 读口光看回体
25
- * **判不出**围栏开没开 ⇒ {@link scopeExternalOriginVerdict} 的第二个形参是**必填**的
26
- * `{ originAware }`:没声明过 ⇒ 空答一律 `unknown`(`why: 'fenced'`),一个字的「干净」都不给。
27
- *
28
- * ── UNTRUSTED ───────────────────────────────────────────────────────────────────────────────
29
- * slug / scope / reason / origin 载体都是引擎侧与用户侧的内容,只渲染绝不当代码用;本件不 trim、不截、
30
- * 不改写任何原文字节。
31
- */
32
- /**
33
- * 一行的**外源标记**读数(三态,刻意不是布尔):
34
- * · `'marked'` 两个**结构**载体之一在场 —— 行顶层 `origin`,或 `frontmatter.origin`
35
- * (`hasOwn` 且值非 `undefined` 即算在场:值的内部形不读,坏形也算带标 —— 在保护轴上
36
- * 「读不出的载体」只许当带标);
37
- * · `'unmarked'` 两个结构载体都不在场,且这一行**没有第三载体**;
38
- * · `'undecidable'` 判不出 —— `frontmatter` 整个读不懂(缺席 / 非对象 / 数组),或**第三载体**
39
- * (`frontmatter.extra` 里的悬置形行)在场。第三载体要引擎侧那只归一化判官才判得了,
40
- * 🔴 本包**不铸第二份**:给同一条判据立第二个判官,两边都会「绿」而结论可以相反。
41
- * `extra` 在场就判不出 = 故意的**过近似**(安全方向),代价是这一行进不了肯定臂。
42
- */
43
1
  export type MemoryEntryOriginMark = 'marked' | 'unmarked' | 'undecidable';
44
- /** 一条读得懂的导出条目行(窄读后的形;键集即全部)。正文与 frontmatter 的内部形**不过境**(要它们的端直接读原回体)。 */
45
2
  export interface MemoryExportEntryRow {
46
- /** 不随改名变的条目身份。 */
47
3
  id: string;
48
- /** 文件名身份(可改名)。 */
49
4
  slug: string;
50
- /** 归属 scope。 */
51
5
  scope: string;
52
- /** CAS 基线。 */
53
6
  rev: string;
54
- /** 这一行的外源标记读数。 */
55
7
  originMark: MemoryEntryOriginMark;
56
8
  }
57
- /** {@link readMemoryExportRows} 判「这一眼没看成」的成因(逐个分开,🔴 不许折成同一句话)。 */
58
- export type MemoryExportUnreadableCause =
59
- /** 回体不是对象(`null` / 数组 / 串 / 数),或读它抛。 */
60
- 'body_unreadable'
61
- /** 对象在场,但 `entries` 键**整个不在** —— 「200 空体」落这里,**不是**「这个 scope 没有条目」。 */
62
- | 'envelope_absent'
63
- /** 信封键在场但形不对:`entries` 非数组或长度读不出,或 `scope` / `exportedAt` 不是非空串(行清单没有它归属的 scope 就判不了 scope 级的话)。 */
64
- | 'envelope_unreadable'
65
- /** `entries` 自报的行数超过本读口一口能吃下的量 ⇒ 判读不出,🔴 **绝不**静默截断成前 N 行。 */
66
- | 'too_many_rows'
67
- /** `entries` 非空却一行都读不出。 */
68
- | 'rows_unreadable';
69
- /**
70
- * `GET /v1/memory/export?scope=` 的 200 体读数。
71
- * `withheldOriginTagged` 三态:`number` = 引擎明说因围栏扣留了这么多条(**肯定**的外源存在证据);
72
- * `'unreadable'` = 这一格在场但读不懂;`null` = 键缺席 —— 引擎**只在扣留数 >0 时**铸这一键,所以缺席
73
- * 读作「这一答没有条目被围栏扣掉」;🔴 但判词口**不靠**这条推论作肯定结论(见 {@link scopeExternalOriginVerdict})。
74
- * `truncated`:键缺席或显式 `false` ⇒ `false`;**其余一律 `true`** —— 完备性轴上读不懂只许 fail-closed。
75
- */
9
+ export type MemoryExportUnreadableCause = 'body_unreadable' | 'envelope_absent' | 'envelope_unreadable' | 'too_many_rows' | 'rows_unreadable';
76
10
  export type MemoryExportReading = {
77
11
  kind: 'malformed';
78
12
  why: MemoryExportUnreadableCause;
@@ -81,62 +15,27 @@ export type MemoryExportReading = {
81
15
  scope: string;
82
16
  exportedAt: string;
83
17
  rows: MemoryExportEntryRow[];
84
- /** 读不出而丢掉的行数(含同 `id` 重复行)。 */
85
18
  dropped: number;
86
19
  withheldOriginTagged: number | 'unreadable' | null;
87
20
  truncated: boolean;
88
- /** 续页游标(非空串才带,否则 `null`);不解析、不自铸。 */
89
21
  nextBefore: string | null;
90
22
  };
91
- /**
92
- * `GET /v1/memory/export?scope=` 的 200 体 → 条目行读数。四把承重键(`id` / `slug` / `scope` / `rev`)
93
- * 任一读不出的行丢弃并计数;同 `id` 的重复行留第一条(后面的计入 `dropped`)。永不抛。
94
- */
95
23
  export declare function readMemoryExportRows(body: unknown): MemoryExportReading;
96
- /**
97
- * {@link scopeExternalOriginVerdict} 的判词。🔴 联合里**没有**任何「整店」臂:肯定的否定话最远只能说到
98
- * **调用方点名的那一个 scope**,而且那个 scope 串必须跟着一起交出去。
99
- */
100
- export type ScopeExternalOriginVerdict =
101
- /** 判不出。`why` 逐条分开,消费端据它决定下一步(补 `originAware` / 翻页 / 重取 / 去问引擎侧判官)。 */
102
- {
24
+ export type ScopeExternalOriginVerdict = {
103
25
  kind: 'unknown';
104
26
  why: 'unreadable' | 'fenced' | 'withheld_unreadable' | 'truncated' | 'rows_dropped' | 'undecidable_rows';
105
- }
106
- /** **肯定有**外源标记条目:`visible` = 这一答里读得出的带标行数,`withheld` = 引擎明说被围栏扣掉的条数(读不出时 `null`)。 */
107
- | {
27
+ } | {
108
28
  kind: 'marked';
109
29
  scope: string;
110
30
  visible: number;
111
31
  withheld: number | null;
112
- }
113
- /** 这**一个** scope 里没有外源标记条目 —— 对别的 scope 一个字都没说(引擎 v1 没有 scope 枚举读面)。 */
114
- | {
32
+ } | {
115
33
  kind: 'none_in_this_scope';
116
34
  scope: string;
117
35
  };
118
- /**
119
- * 「这个 scope 里有没有外源标记的条目」的判据单源。
120
- *
121
- * 🔴 `asked.originAware` **必填**,且只有它为 `true` 时否定臂才够得着:这条读口缺省围栏掉所有带标条目,
122
- * 而回体在「围栏开」与「围栏关」两种情形下**形状一样** —— 读口自己判不出,只有发请求的人知道。
123
- * 没声明 ⇒ 空答一律 `unknown`(`why: 'fenced'`)。这就是「空答绝不读作本店干净」的**代码**落点。
124
- * 判序(肯定证据先行,否定证据要完备):
125
- * ① 回体读不懂 ⇒ `unknown`;
126
- * ② 读得出的带标行 >0,**或**引擎明说扣留了 >0 条 ⇒ `marked`(围栏只扣带标条目,所以那个计数本身就是
127
- * 肯定证据;此时翻页 / 丢行都不影响这句肯定话);
128
- * ③ 扣留计数在场但读不懂 ⇒ `unknown`(可能扣了,也可能没扣);
129
- * ④ 否定臂的三道完备性闸:没声明 `originAware` ⇒ `'fenced'`;`truncated` ⇒ `'truncated'`;
130
- * 有丢行 ⇒ `'rows_dropped'`;有判不出标记的行 ⇒ `'undecidable_rows'`;
131
- * ⑤ 全过 ⇒ `none_in_this_scope`(带 scope 串)。
132
- */
133
36
  export declare function scopeExternalOriginVerdict(reading: MemoryExportReading, asked: {
134
37
  originAware: boolean;
135
38
  }): ScopeExternalOriginVerdict;
136
- /**
137
- * 一条已抹除行的**绑定坐标**(上游的判别式,原样对形):`bound` = 它当时落在哪个 scope 的哪个文件名身份上;
138
- * `unbound` = 它当时没有投影。写成具名型而不是内联匿名形:这一格会被端逐臂分支渲染,匿名形让每个端各自手抄一遍。
139
- */
140
39
  export type MemoryErasedBinding = {
141
40
  state: 'bound';
142
41
  scope: string;
@@ -144,76 +43,32 @@ export type MemoryErasedBinding = {
144
43
  } | {
145
44
  state: 'unbound';
146
45
  };
147
- /** 一条**已抹除**行。`binding` 为 `null` = 这一格读不出 —— 🔴 绝不当 `{state:'unbound'}`(那是一句肯定话)。 */
148
46
  export interface MemoryErasedRow {
149
47
  id: string;
150
48
  rev: string;
151
49
  binding: MemoryErasedBinding | null;
152
50
  }
153
- /**
154
- * 一条 **notFound** 行:判决那一刻没有这条记录,而且这次请求也不能把它算作「抹掉了」。
155
- * `historyUnknown` **四态原样过境**:
156
- * · `true` 引擎如实标「分不清从没存在过还是早已被抹掉」;
157
- * · `false` 位显式为假(上游今日的形里只铸 `true` 或整键省掉,真出现那天照原样带);
158
- * · `null` **键缺席**(上游的铸点纪律 ⇒ 这是一句真判断:链完整,没有洞);
159
- * · `'unreadable'` 位在场**但读不懂**(串 / 数 / `null` …)—— 行不丢(`id` 是承重键),坏的只有这一格。
160
- * 🔴 四态一格都不许折进另一格:把「读不懂」折进「键缺席」,历史判词就会答出一句它没资格答的话。
161
- */
162
51
  export interface MemoryEraseNotFoundRow {
163
52
  id: string;
164
53
  historyUnknown: boolean | null | 'unreadable';
165
54
  }
166
- /** 一条**先前已抹除**行(只窄读身份;这一段只在非空时上 wire)。 */
167
55
  export interface MemoryErasePreviouslyRow {
168
56
  id: string;
169
57
  }
170
- /** 一条**冲突**行(逐 id 的计划期故障;`reason` 是给人看的散文,原样带出)。 */
171
58
  export interface MemoryEraseConflictRow {
172
59
  id: string;
173
60
  reason: string;
174
61
  }
175
- /** {@link readMemoryEraseReceipt} 判「这一眼没看成」的成因。🔴 逐条分开 —— 尤其「200 空体」与「读不懂」不共形。 */
176
- export type MemoryEraseUnreadableCause =
177
- /** 回体不是对象(`null` / 数组 / 串 / 数),或读它抛。 */
178
- 'body_unreadable'
179
- /** 对象在场,但一把信封键都不在 —— **「200 空体」落这里**,🔴 绝不是「抹了 0 条」。 */
180
- | 'envelope_absent'
181
- /** 版本信封缺席:没有它就不知道自己在读哪一版契约。 */
182
- | 'version_absent'
183
- /** 版本信封不是本包认得的那一版 —— 🔴 上游明令「读到更高版本必须拒,绝不重解释」。 */
184
- | 'unsupported_version'
185
- /** 信封键在场但形不对:身份不是非空串,三段不是数组或长度读不出,或三张**闭合**词表里出现了本包不认得的词(新词判读不出,绝不塌进已知臂)。 */
186
- | 'envelope_unreadable'
187
- /** 某一段自报的行数超过本读口一口能吃下的量 ⇒ 判读不出,🔴 **绝不**静默截断。 */
188
- | 'too_many_rows'
189
- /** `erased` 非空却一行都读不出。 */
190
- | 'erased_rows_unreadable'
191
- /** `notFound` 非空却一行都读不出。 */
192
- | 'not_found_rows_unreadable'
193
- /** `conflicts` 非空却一行都读不出。 */
194
- | 'conflict_rows_unreadable'
195
- /** `erasedPreviously` 在场且非空,却一行都读不出(与另外三段同律)。 */
196
- | 'erased_previously_rows_unreadable';
197
- /**
198
- * `POST /v1/memory/erase` 的 200 体读数(引擎原样下发上游的抹除证明,本包按结构窄读)。
199
- * 三张词表(`status` / `evidenceCapability` / `custodyState`)是上游声明的**闭集**:出现本包不认得的词
200
- * ⇒ `malformed`(`envelope_unreadable`),🔴 绝不塌进任何一个已知臂。
201
- * `erasedPreviously` 为 `null` = 键缺席(上游只在非空时铸它)。
202
- */
62
+ export type MemoryEraseUnreadableCause = 'body_unreadable' | 'envelope_absent' | 'version_absent' | 'unsupported_version' | 'envelope_unreadable' | 'too_many_rows' | 'erased_rows_unreadable' | 'not_found_rows_unreadable' | 'conflict_rows_unreadable' | 'erased_previously_rows_unreadable';
203
63
  export type MemoryEraseReceiptReading = {
204
64
  kind: 'malformed';
205
65
  why: MemoryEraseUnreadableCause;
206
66
  } | {
207
67
  kind: 'present';
208
- /** 调用方自铸的幂等身份,原样带出(引擎从不替人铸)。 */
209
68
  requestId: string;
210
- /** `complete` = 每个点名的 id 都有了归宿;`partial` = 还有没落地的(重放会收敛)。 */
211
69
  status: 'complete' | 'partial';
212
- /** `journal` = 证据腿;`none` = 显式降级腿(静默降级是被禁的形,所以这一格恒在场)。 */
213
70
  evidenceCapability: 'journal' | 'none';
214
- /** 证据链在装配那一刻的完整性;`damaged` ⇒ 每条 notFound 行都带 `historyUnknown`。 */
215
71
  custodyState: 'complete' | 'damaged' | 'capability-absent';
216
- /** 被钉住的 id 总数(读不出 ⇒ `null`,绝不折 0)。 */
217
72
  selectedIds: number | null;
218
73
  erased: MemoryErasedRow[];
219
74
  erasedDropped: number;
@@ -224,13 +79,7 @@ export type MemoryEraseReceiptReading = {
224
79
  conflicts: MemoryEraseConflictRow[];
225
80
  conflictsDropped: number;
226
81
  };
227
- /**
228
- * `POST /v1/memory/erase` 的 200 体 → 抹除证明读数。永不抛。
229
- * 🔴 三件必须判成**三回事**:「这一次一条都没抹掉」(`present` 且 `erased` 空)/「200 空体」
230
- * (`malformed` / `envelope_absent`)/「回体读不懂」(`malformed` / `body_unreadable`)。
231
- */
232
82
  export declare function readMemoryEraseReceipt(body: unknown): MemoryEraseReceiptReading;
233
- /** {@link memoryEraseCounts} 的判决体。🔴 `unknown` 与「数出来是 0」是两回事。 */
234
83
  export type MemoryEraseCounts = {
235
84
  kind: 'unknown';
236
85
  why: MemoryEraseUnreadableCause | 'rows_dropped';
@@ -239,64 +88,23 @@ export type MemoryEraseCounts = {
239
88
  erased: number;
240
89
  notFound: number;
241
90
  conflicts: number;
242
- /** 键缺席 ⇒ `null`(上游只在非空时铸这一段),绝不折 0。 */
243
91
  erasedPreviously: number | null;
244
- /** 被钉住的 id 总数;读不出 ⇒ `null`。 */
245
92
  selectedIds: number | null;
246
93
  };
247
- /**
248
- * 「这一次抹了几条」的判据单源。
249
- * 🔴 读不懂 ⇒ `unknown` + 原成因(**绝不**答 0);任何一段有丢行 ⇒ `unknown` / `'rows_dropped'`
250
- * (读得出的行是真的,但这几个**数**已经不是引擎给的那几个了)。
251
- */
252
94
  export declare function memoryEraseCounts(reading: MemoryEraseReceiptReading): MemoryEraseCounts;
253
- /**
254
- * 「这一次是不是一条都没抹掉」的三态判据单源。
255
- * 🔴 `'yes'` **只**由「数得出来、且已抹除段为空」铸得出(典型形 = 已抹除段空、notFound 段非空 ——
256
- * 逐 id 交代了为什么一条都没删)。「200 空体」/「回体读不懂」/「有丢行」一律 `'unknown'`,
257
- * 绝不与 `'yes'` 同形:把取不到冒充「零抹除」,端会据此告诉人「什么都没删」。
258
- */
259
95
  export declare function memoryEraseErasedNothing(reading: MemoryEraseReceiptReading): 'yes' | 'no' | 'unknown';
260
- /**
261
- * 一条 notFound 行的历史判词(两态)。🔴 联合里**没有**「从来没存在过」这一臂:上游明说这份证明
262
- * **不区分**「从没存在过」/「自然删掉了」/「别的请求删的」三义,只有证据链本身分得清。
263
- * `'unknown'` = 行上明标判不清;`'no_row_at_judgment'` = 判决那一刻没有这条记录 ——
264
- * 🔴 它也**不**授权任何人说「这条从来不存在」。
265
- */
266
96
  export declare function eraseNotFoundHistoryVerdict(row: MemoryEraseNotFoundRow): 'no_row_at_judgment' | 'unknown';
267
- /**
268
- * 「同一个 `requestId` 重发这一口安不安全」的判据单源(三态)。
269
- * · `'idempotent'` 证据腿:重发读回被钉住的 id 集,绝不重新解析;
270
- * · `'human_decision'` 降级腿:同一个 `requestId` 是**一次新的请求**(重新解析),重发就是第二次真删 ⇒
271
- * 任何重试都必须是人做的决定,🔴 不许进自动重试策略;
272
- * · `'unknown'` 收执读不出 —— 读不出时**不**当幂等(那是最贵的一种猜)。
273
- */
274
97
  export declare function memoryEraseReplayPosture(reading: MemoryEraseReceiptReading): 'idempotent' | 'human_decision' | 'unknown';
275
- /** {@link readMemoryOriginClearanceReceipt} 判「这一眼没看成」的成因。 */
276
- export type MemoryOriginClearanceUnreadableCause =
277
- /** 回体不是对象,或读它抛。 */
278
- 'body_unreadable'
279
- /** 对象在场,但三把承重键一把都不在(「200 空体」落这里)。 */
280
- | 'envelope_absent'
281
- /** 承重键在场但不是非空串。 */
282
- | 'envelope_unreadable';
283
- /**
284
- * `POST /v1/memory/origin/entries/:entryId/clear` 的 200 体读数(引擎原样下发上游回执)。
285
- * `origin` = **被清掉的那个标**,开放形 ⇒ 原样带出、一个字不窄读(它的判官在引擎侧);
286
- * `originReported` 说这一格在不在 —— 🔴 缺席时 `origin` 是 `undefined`,别把它读成「没有标」。
287
- */
98
+ export type MemoryOriginClearanceUnreadableCause = 'body_unreadable' | 'envelope_absent' | 'envelope_unreadable';
288
99
  export type MemoryOriginClearanceReading = {
289
100
  kind: 'malformed';
290
101
  why: MemoryOriginClearanceUnreadableCause;
291
102
  } | {
292
103
  kind: 'present';
293
104
  entryId: string;
294
- /** 这次清标的账本身份(与部署侧审计行按它 join)。 */
295
105
  clearanceId: string;
296
- /** 清标后条目落在哪个文件名身份上(清标可能连带改名)。 */
297
106
  landedSlug: string;
298
107
  originReported: boolean;
299
108
  origin: unknown;
300
109
  };
301
- /** `POST …/origin/entries/:entryId/clear` 的 200 体 → 清标回执读数。永不抛。 */
302
110
  export declare function readMemoryOriginClearanceReceipt(body: unknown): MemoryOriginClearanceReading;
@@ -1,67 +1,16 @@
1
- /**
2
- * memoryEntriesWire — 记忆**条目面**三个 200 回体的三端共用**窄读口**(0.76.1 CC-97a):
3
- * ① `GET /v1/memory/export?scope=` 的条目行(`{ scope, exportedAt, entries[] }`);
4
- * ② `POST /v1/memory/erase` 的**抹除证明**回体;
5
- * ③ `POST /v1/memory/origin/entries/:entryId/clear` 的**清标回执**。
6
- *
7
- * 🔴 本件只有**读口**:一个动词都不调、一个请求都不铸(动词半场另票)。入参一律 `unknown` —— 三个回体在
8
- * wire 上要么是开放判别式(引擎原样下发、不投影、不复述),要么 SDK 的声明形里就是 `unknown[]`,
9
- * 所以边界必须**按结构**窄读。
10
- *
11
- * ── 逐行窄读的三条边界(与本包既有行读口同律)────────────────────────────────────────────────
12
- * · **空数组 = 真 0**(引擎明说「一条都没有」);
13
- * · **非空数组却一行都读不出 ⇒ `malformed`**(这一眼没看成),**绝不**答「present + 空列表」——
14
- * 那是把「取不到」冒充「一条都没有」;
15
- * · **半坏 ⇒ `present` + `dropped` 计数**(读得出来的行是真的,丢掉那几条如实交代)。
16
- * 🔴 「读不懂的行」与「没有行」在本件里**永远不共用一句话**。
17
- *
18
- * ── 🔴 「空答不等于本店干净」在代码里的落点 ─────────────────────────────────────────────────
19
- * 导出读口的答案在两条轴上都不完备,而**两条都不是本包能推翻的**:
20
- * · **scope 轴**:引擎 v1 没有 scope 枚举读面,一次答案只覆盖调用方点名的那一个 scope ⇒
21
- * {@link scopeExternalOriginVerdict} 的肯定臂叫 `none_in_this_scope` **并且带着那个 scope 串**,
22
- * 联合里**没有**任何「整店」臂 —— 想把它复述成全店结论,型上就写不出来。
23
- * · **围栏轴**:这条读口**缺省不投带外源标的条目**(整条目扣留 + 只在 n>0 时铸一格计数),调用方须在
24
- * 请求上显式声明认识 origin 键族才放行。回体在两种情形下**形状完全一样** ⇒ 读口光看回体
25
- * **判不出**围栏开没开 ⇒ {@link scopeExternalOriginVerdict} 的第二个形参是**必填**的
26
- * `{ originAware }`:没声明过 ⇒ 空答一律 `unknown`(`why: 'fenced'`),一个字的「干净」都不给。
27
- *
28
- * ── UNTRUSTED ───────────────────────────────────────────────────────────────────────────────
29
- * slug / scope / reason / origin 载体都是引擎侧与用户侧的内容,只渲染绝不当代码用;本件不 trim、不截、
30
- * 不改写任何原文字节。
31
- */
32
1
  function nonEmptyString(v) {
33
2
  return typeof v === 'string' && v !== '';
34
3
  }
35
4
  function nonNegativeInt(v) {
36
5
  return typeof v === 'number' && Number.isFinite(v) && v >= 0 && Number.isInteger(v);
37
6
  }
38
- /** 对象(不含 `null` / 数组)。三个读口的每一层都用它,免得某一层悄悄把数组当对象读。 */
39
7
  function plainObject(v) {
40
8
  return v !== null && typeof v === 'object' && !Array.isArray(v);
41
9
  }
42
- /** `hasOwn` 且值非 `undefined`。原型链同名键永远不会被序列化上 wire,读成在场就是凭空造一格。 */
43
10
  function ownPresent(o, k) {
44
11
  return Object.hasOwn(o, k) && o[k] !== undefined;
45
12
  }
46
- /**
47
- * 一段数组能窄读的**行数上限**。超过它 ⇒ 判 `too_many_rows`(读不出),🔴 **绝不**静默截断成前 N 行 ——
48
- * 截断出来的「这一答里没有带标行」正是本件要消灭的那句假话。这个数只表达「本读口一口吃不下这么多」,
49
- * 不是对引擎的任何限额主张;它同时挡住「回体自报一个天文数字长度」把读口挂住那一形。
50
- */
51
13
  const MAX_NARROWED_ROWS = 100_000;
52
- /**
53
- * 把不可信的数组**一次性快照**成定长普通数组。
54
- *
55
- * 🔴 为什么不能直接 `for…of` 原数组(异源对抗复审 R1 [high],已实测复现):
56
- * ① `for…of` 走的是**调用方的** `Symbol.iterator`,它的陷阱抛出会从循环**外**逸出(循环体内的 try 接不到),
57
- * 整只读口就抛了 —— 而本件承诺永不抛;
58
- * ② `length` 会被**反复读**(迭代一次、循环后的「非空全坏」判据再一次):一个首次报 2、之后报 0 的 Proxy
59
- * 能让循环只走第一格(无标行)而末尾判据看到 0 ⇒ 带标的那一行被丢掉、`dropped` 还是 0 ⇒ 判词口一路走到
60
- * `none_in_this_scope`。**把「看不见」渲成「没有」**,正是本件的头号禁形。
61
- * 所以:`length` **只读一次**并验型,再按**固定索引**各读一次;某一格读不出只记 `unreadable`(它在行层计入
62
- * `dropped`,于是判词口的否定臂当场失去资格),不作废整段、也不外抛。
63
- * 返回 `null` = 这一段整个读不出(不是数组 / 长度读不出或不是安全非负整数 / 超过 {@link MAX_NARROWED_ROWS})。
64
- */
65
14
  function snapshotArray(v) {
66
15
  if (!Array.isArray(v))
67
16
  return null;
@@ -88,18 +37,12 @@ function snapshotArray(v) {
88
37
  }
89
38
  return { items, unreadable, tooLarge: false };
90
39
  }
91
- /** 数组的**元素个数**(只用于「被钉住的 id 总数」这类纯计数位):读不出 ⇒ `null`,🔴 绝不折 0。 */
92
40
  function arrayLengthOrNull(v) {
93
41
  const snap = snapshotArray(v);
94
42
  if (snap === null || snap.tooLarge)
95
43
  return null;
96
44
  return snap.items.length + snap.unreadable;
97
45
  }
98
- /**
99
- * 一行的外源标记三态判定。**每个键只读一次**(变化的 getter 不许让两次读看到两个值)。
100
- * 载体顺序与保护方向:结构载体命中即 `'marked'`(最强的肯定);`frontmatter` 读不懂 ⇒ 判不出;
101
- * 第三载体在场 ⇒ 判不出(判官在引擎侧)。
102
- */
103
46
  function originMarkOf(row) {
104
47
  if (ownPresent(row, 'origin'))
105
48
  return 'marked';
@@ -112,10 +55,6 @@ function originMarkOf(row) {
112
55
  return 'undecidable';
113
56
  return 'unmarked';
114
57
  }
115
- /**
116
- * `GET /v1/memory/export?scope=` 的 200 体 → 条目行读数。四把承重键(`id` / `slug` / `scope` / `rev`)
117
- * 任一读不出的行丢弃并计数;同 `id` 的重复行留第一条(后面的计入 `dropped`)。永不抛。
118
- */
119
58
  export function readMemoryExportRows(body) {
120
59
  let o;
121
60
  let rawEntries;
@@ -130,15 +69,11 @@ export function readMemoryExportRows(body) {
130
69
  if (!plainObject(body))
131
70
  return { kind: 'malformed', why: 'body_unreadable' };
132
71
  o = body;
133
- // 🔴 每把键**恰读一次**并就地快照:回体可以是带 getter / Proxy 的对象,读两次就能拿到两个不同的答案。
134
72
  if (!Object.hasOwn(o, 'entries'))
135
73
  return { kind: 'malformed', why: 'envelope_absent' };
136
74
  rawEntries = o.entries;
137
75
  rawScope = o.scope;
138
76
  rawExportedAt = o.exportedAt;
139
- // 🔴 这两格的在场判据与取值也**分开**(与 `historyUnknown` 同一条采修的族扫):键在场而值读不成时,
140
- // 折回「键缺席」会在**完备性轴**上给出更宽松的答案(缺席 = 没扣留 / 缺席 = 这就是全量),而那正是
141
- // 这两格存在的意义 —— 在场读不成必须走各自的 fail-closed 臂。
142
77
  hasWithheld = Object.hasOwn(o, 'withheldOriginTagged');
143
78
  rawWithheld = hasWithheld ? o.withheldOriginTagged : undefined;
144
79
  hasTruncated = Object.hasOwn(o, 'truncated');
@@ -146,13 +81,10 @@ export function readMemoryExportRows(body) {
146
81
  rawNextBefore = o.nextBefore;
147
82
  }
148
83
  catch {
149
- // 读回体的 getter / Proxy 陷阱抛出 = 这一眼没看成(与「不是对象」同一处置);绝不外抛。
150
84
  return { kind: 'malformed', why: 'body_unreadable' };
151
85
  }
152
86
  if (rawEntries === undefined)
153
87
  return { kind: 'malformed', why: 'envelope_absent' };
154
- // 🔴 数组**一次快照**(见 {@link snapshotArray} 头注:`for…of` 的迭代器陷阱会从循环外逸出,反复读的 `length`
155
- // 能让带标行被丢掉而这一答被判成「干净」)。快照本身也在保护里 —— 它读的是不可信对象。
156
88
  let snap;
157
89
  try {
158
90
  snap = snapshotArray(rawEntries);
@@ -169,7 +101,6 @@ export function readMemoryExportRows(body) {
169
101
  }
170
102
  const rows = [];
171
103
  const seen = new Set();
172
- // 读不出的那几格先记进 dropped:它们是**真的丢了行**,判词口的否定臂据此当场失去资格。
173
104
  let dropped = snap.unreadable;
174
105
  for (const item of snap.items) {
175
106
  let row = null;
@@ -194,14 +125,11 @@ export function readMemoryExportRows(body) {
194
125
  row = { id, slug, scope, rev, originMark: originMarkOf(item) };
195
126
  }
196
127
  catch {
197
- // 单行的抛 getter 只丢这一行(与坏形行同一处置),不作废整段。
198
128
  dropped++;
199
129
  continue;
200
130
  }
201
131
  rows.push(row);
202
132
  }
203
- // 🔴 非空数组、却一行都读不出 ⇒ `malformed`:那不是「这个 scope 一条都没有」。空数组不在本条射程。
204
- // 判据锚在**快照**上(`snap.items.length + snap.unreadable`),不再回头读原数组的 length。
205
133
  const seenRows = snap.items.length + snap.unreadable;
206
134
  if (seenRows > 0 && rows.length === 0)
207
135
  return { kind: 'malformed', why: 'rows_unreadable' };
@@ -212,30 +140,11 @@ export function readMemoryExportRows(body) {
212
140
  rows,
213
141
  dropped,
214
142
  withheldOriginTagged: !hasWithheld ? null : nonNegativeInt(rawWithheld) ? rawWithheld : 'unreadable',
215
- // 完备性轴 fail-closed:只有**键缺席**与**显式 `false`** 算「这就是全量」;键在场而值读不成 ⇒ 当成不是全量。
216
143
  truncated: hasTruncated ? rawTruncated !== false : false,
217
144
  nextBefore: nonEmptyString(rawNextBefore) ? rawNextBefore : null,
218
145
  };
219
146
  }
220
- /**
221
- * 「这个 scope 里有没有外源标记的条目」的判据单源。
222
- *
223
- * 🔴 `asked.originAware` **必填**,且只有它为 `true` 时否定臂才够得着:这条读口缺省围栏掉所有带标条目,
224
- * 而回体在「围栏开」与「围栏关」两种情形下**形状一样** —— 读口自己判不出,只有发请求的人知道。
225
- * 没声明 ⇒ 空答一律 `unknown`(`why: 'fenced'`)。这就是「空答绝不读作本店干净」的**代码**落点。
226
- * 判序(肯定证据先行,否定证据要完备):
227
- * ① 回体读不懂 ⇒ `unknown`;
228
- * ② 读得出的带标行 >0,**或**引擎明说扣留了 >0 条 ⇒ `marked`(围栏只扣带标条目,所以那个计数本身就是
229
- * 肯定证据;此时翻页 / 丢行都不影响这句肯定话);
230
- * ③ 扣留计数在场但读不懂 ⇒ `unknown`(可能扣了,也可能没扣);
231
- * ④ 否定臂的三道完备性闸:没声明 `originAware` ⇒ `'fenced'`;`truncated` ⇒ `'truncated'`;
232
- * 有丢行 ⇒ `'rows_dropped'`;有判不出标记的行 ⇒ `'undecidable_rows'`;
233
- * ⑤ 全过 ⇒ `none_in_this_scope`(带 scope 串)。
234
- */
235
147
  export function scopeExternalOriginVerdict(reading, asked) {
236
- // 🔴 入口先核 `asked`(0.77.0;外部验收方 F-A):此前只有「干净答案」那条路才读 `asked.originAware`,JS 宿主漏传第二形参会一路顺跑、
237
- // 第一次遇到干净的店才炸,而那恰是这道围栏存在的理由。防御方向不改(缺席绝不折成「干净」),改的是把裸属性访问的 TypeError
238
- // 换成具名、可解释的错误,并且**每条路**都在入口就问一次 —— 不让「什么时候炸」取决于回体形状。
239
148
  if (asked === null || typeof asked !== 'object' || typeof asked.originAware !== 'boolean') {
240
149
  throw new TypeError('scopeExternalOriginVerdict: second argument { originAware: boolean } is required — this export read withholds origin-tagged ' +
241
150
  'entries unless the request declared originAware=1, and an empty answer without that declaration must never be read as "clean"');
@@ -265,12 +174,7 @@ export function scopeExternalOriginVerdict(reading, asked) {
265
174
  }
266
175
  return { kind: 'none_in_this_scope', scope: reading.scope };
267
176
  }
268
- /** 本包认得的抹除证明版本信封(上游明写「读到更高版本必须拒,绝不重解释」)。 */
269
177
  const MEMORY_ERASE_RECEIPT_VERSION = 1;
270
- /**
271
- * 三张**闭合**词表各自的窄读器 —— 认得的词原样带出,🔴 别的一律 `null`(读不出),绝不塌进已知臂。
272
- * 写成三只小函数而不是三个 `Set` + 断言:词表与返回型在这里是**同一处**声明,加词只能在这一行加。
273
- */
274
178
  function eraseStatusOf(v) {
275
179
  return v === 'complete' || v === 'partial' ? v : null;
276
180
  }
@@ -280,7 +184,6 @@ function eraseEvidenceCapabilityOf(v) {
280
184
  function eraseCustodyStateOf(v) {
281
185
  return v === 'complete' || v === 'damaged' || v === 'capability-absent' ? v : null;
282
186
  }
283
- /** 一行的抹除绑定窄读:两条臂逐字对上才认,别的一律 `null`(读不出,不是 unbound)。 */
284
187
  function erasedBindingOf(v) {
285
188
  if (!plainObject(v))
286
189
  return null;
@@ -295,11 +198,6 @@ function erasedBindingOf(v) {
295
198
  return null;
296
199
  return { state: 'bound', scope, slug };
297
200
  }
298
- /**
299
- * `POST /v1/memory/erase` 的 200 体 → 抹除证明读数。永不抛。
300
- * 🔴 三件必须判成**三回事**:「这一次一条都没抹掉」(`present` 且 `erased` 空)/「200 空体」
301
- * (`malformed` / `envelope_absent`)/「回体读不懂」(`malformed` / `body_unreadable`)。
302
- */
303
201
  export function readMemoryEraseReceipt(body) {
304
202
  let o;
305
203
  let rawV;
@@ -317,7 +215,6 @@ export function readMemoryEraseReceipt(body) {
317
215
  if (!plainObject(body))
318
216
  return { kind: 'malformed', why: 'body_unreadable' };
319
217
  o = body;
320
- // 🔴 每把键恰读一次并快照:后面所有判决都对这一份,变化的 getter 换不掉它。
321
218
  envelopeSeen = ['v', 'requestId', 'status', 'erased', 'notFound'].some((k) => Object.hasOwn(o, k));
322
219
  rawV = Object.hasOwn(o, 'v') ? o.v : undefined;
323
220
  rawRequestId = o.requestId;
@@ -333,7 +230,6 @@ export function readMemoryEraseReceipt(body) {
333
230
  catch {
334
231
  return { kind: 'malformed', why: 'body_unreadable' };
335
232
  }
336
- // 「200 空体」:一把信封键都没有 ⇒ 这不是一份收执。
337
233
  if (!envelopeSeen)
338
234
  return { kind: 'malformed', why: 'envelope_absent' };
339
235
  if (rawV === undefined)
@@ -346,8 +242,6 @@ export function readMemoryEraseReceipt(body) {
346
242
  if (!nonEmptyString(rawRequestId) || status === null || evidenceCapability === null || custodyState === null) {
347
243
  return { kind: 'malformed', why: 'envelope_unreadable' };
348
244
  }
349
- // 🔴 四段各自**一次快照**(理由见 {@link snapshotArray} 头注:迭代器陷阱会从循环外逸出,反复读的 `length`
350
- // 能让半段行被静默丢掉而末尾「非空全坏」判据看不见)。快照与「被钉住的 id 总数」那次长度读都在保护里。
351
245
  let erasedSnap;
352
246
  let notFoundSnap;
353
247
  let conflictsSnap;
@@ -411,13 +305,6 @@ export function readMemoryEraseReceipt(body) {
411
305
  notFoundDropped++;
412
306
  continue;
413
307
  }
414
- // 🔴 四态原样(异源对抗复审 R1 [medium] 采修 —— 修前「在场但不是布尔」与「键缺席」同形答 null,
415
- // 于是一条**读不懂**历史位的行会被历史判词答成 `no_row_at_judgment`,消费端再也看不出这一格没读成):
416
- // 键缺席 ⇒ `null`(上游今日只在链有洞时铸 true,不铸 false ⇒ 缺席是一句真判断)/ 严格布尔 ⇒ 原值 /
417
- // 在场但不是布尔 ⇒ `'unreadable'`(行不丢:`id` 是承重键,坏的只是这一格)。
418
- // 🔴 在场判据与取值**分开各读一次**(异源对抗复审 R2 [medium] 采修):把「键缺席」与「键在场但值是
419
- // `undefined`」合成一个 `raw === undefined` 判据,会让一个**在场却读不成**的历史位落回 `null`(键缺席),
420
- // 历史判词随后答出 `no_row_at_judgment` 那句更强的话。`hasOwn` 不读值 ⇒ 值仍恰读一次。
421
308
  const hasHistory = Object.hasOwn(item, 'historyUnknown');
422
309
  const raw = hasHistory ? item.historyUnknown : undefined;
423
310
  notFoundSeen.add(id);
@@ -480,9 +367,6 @@ export function readMemoryEraseReceipt(body) {
480
367
  erasedPreviouslyDropped++;
481
368
  }
482
369
  }
483
- // 🔴 这一段与另外三段**同律**(异源对抗复审 R1 [medium] 采修 —— 修前这里少了这道闸,
484
- // `erasedPreviously: [null]` 会被发布成 `present` + 空列表 + dropped 1,即「一条先前抹除都没有」,
485
- // 而真相是这一段一行都没读成)。
486
370
  if (previouslySnap.items.length + previouslySnap.unreadable > 0 && rows.length === 0) {
487
371
  return { kind: 'malformed', why: 'erased_previously_rows_unreadable' };
488
372
  }
@@ -505,11 +389,6 @@ export function readMemoryEraseReceipt(body) {
505
389
  conflictsDropped,
506
390
  };
507
391
  }
508
- /**
509
- * 「这一次抹了几条」的判据单源。
510
- * 🔴 读不懂 ⇒ `unknown` + 原成因(**绝不**答 0);任何一段有丢行 ⇒ `unknown` / `'rows_dropped'`
511
- * (读得出的行是真的,但这几个**数**已经不是引擎给的那几个了)。
512
- */
513
392
  export function memoryEraseCounts(reading) {
514
393
  if (reading.kind !== 'present')
515
394
  return { kind: 'unknown', why: reading.why };
@@ -528,41 +407,20 @@ export function memoryEraseCounts(reading) {
528
407
  selectedIds: reading.selectedIds,
529
408
  };
530
409
  }
531
- /**
532
- * 「这一次是不是一条都没抹掉」的三态判据单源。
533
- * 🔴 `'yes'` **只**由「数得出来、且已抹除段为空」铸得出(典型形 = 已抹除段空、notFound 段非空 ——
534
- * 逐 id 交代了为什么一条都没删)。「200 空体」/「回体读不懂」/「有丢行」一律 `'unknown'`,
535
- * 绝不与 `'yes'` 同形:把取不到冒充「零抹除」,端会据此告诉人「什么都没删」。
536
- */
537
410
  export function memoryEraseErasedNothing(reading) {
538
411
  const counts = memoryEraseCounts(reading);
539
412
  if (counts.kind !== 'counted')
540
413
  return 'unknown';
541
414
  return counts.erased === 0 ? 'yes' : 'no';
542
415
  }
543
- /**
544
- * 一条 notFound 行的历史判词(两态)。🔴 联合里**没有**「从来没存在过」这一臂:上游明说这份证明
545
- * **不区分**「从没存在过」/「自然删掉了」/「别的请求删的」三义,只有证据链本身分得清。
546
- * `'unknown'` = 行上明标判不清;`'no_row_at_judgment'` = 判决那一刻没有这条记录 ——
547
- * 🔴 它也**不**授权任何人说「这条从来不存在」。
548
- */
549
416
  export function eraseNotFoundHistoryVerdict(row) {
550
- // 🔴 `'unreadable'` 与 `true` 同处置:这一格没读成就**没有**资格说「判决那刻没有这条记录」那句更强的话。
551
417
  return row.historyUnknown === true || row.historyUnknown === 'unreadable' ? 'unknown' : 'no_row_at_judgment';
552
418
  }
553
- /**
554
- * 「同一个 `requestId` 重发这一口安不安全」的判据单源(三态)。
555
- * · `'idempotent'` 证据腿:重发读回被钉住的 id 集,绝不重新解析;
556
- * · `'human_decision'` 降级腿:同一个 `requestId` 是**一次新的请求**(重新解析),重发就是第二次真删 ⇒
557
- * 任何重试都必须是人做的决定,🔴 不许进自动重试策略;
558
- * · `'unknown'` 收执读不出 —— 读不出时**不**当幂等(那是最贵的一种猜)。
559
- */
560
419
  export function memoryEraseReplayPosture(reading) {
561
420
  if (reading.kind !== 'present')
562
421
  return 'unknown';
563
422
  return reading.evidenceCapability === 'journal' ? 'idempotent' : 'human_decision';
564
423
  }
565
- /** `POST …/origin/entries/:entryId/clear` 的 200 体 → 清标回执读数。永不抛。 */
566
424
  export function readMemoryOriginClearanceReceipt(body) {
567
425
  let o;
568
426
  let rawEntryId;
@@ -580,8 +438,6 @@ export function readMemoryOriginClearanceReceipt(body) {
580
438
  rawEntryId = o.entryId;
581
439
  rawClearanceId = o.clearanceId;
582
440
  rawLandedSlug = o.landedSlug;
583
- // 🔴 `origin` **恰读一次**:先 `hasOwn` 判键在不在(不读值),再取一次值 —— 用「在场判 + 取值」两次读的写法,
584
- // 变化的 getter 能让 `originReported` 说在场而 `origin` 交出 `undefined`。
585
441
  origin = Object.hasOwn(o, 'origin') ? o.origin : undefined;
586
442
  originReported = origin !== undefined;
587
443
  }