@sema-agent/client-core 0.77.1 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -1
- package/README.md +6 -5
- package/dist/abortableSleep.d.ts +0 -28
- package/dist/abortableSleep.js +0 -28
- package/dist/adapt/arms.d.ts +0 -46
- package/dist/adapt/arms.js +9 -544
- package/dist/adapt/ids.d.ts +0 -58
- package/dist/adapt/ids.js +0 -63
- package/dist/adapt/instanceLedger.d.ts +0 -25
- package/dist/adapt/instanceLedger.js +0 -20
- package/dist/adapt/panelTasks.d.ts +0 -69
- package/dist/adapt/panelTasks.js +0 -95
- package/dist/adapt/textSegmentAuthority.d.ts +1 -137
- package/dist/adapt/textSegmentAuthority.js +0 -54
- package/dist/adapt/textStream.d.ts +0 -252
- package/dist/adapt/textStream.js +2 -281
- package/dist/adapt/toolCards.d.ts +0 -46
- package/dist/adapt/toolCards.js +0 -23
- package/dist/adapt/turnFlags.d.ts +0 -54
- package/dist/adapt/turnFlags.js +1 -17
- package/dist/adapt/wireShapes.d.ts +0 -92
- package/dist/adapt/wireShapes.js +0 -83
- package/dist/adapt.d.ts +0 -55
- package/dist/adapt.js +1 -120
- package/dist/adapter/activeRunSelfHeal.d.ts +22 -515
- package/dist/adapter/activeRunSelfHeal.js +10 -625
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +2 -305
- package/dist/adapter/downstream/eventToSdkMessage.js +2 -867
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -314
- package/dist/adapter/downstream/terminalToSdkResult.js +13 -560
- package/dist/adapter/downstream/turnUsageToModelUsage.d.ts +0 -95
- package/dist/adapter/downstream/turnUsageToModelUsage.js +2 -31
- package/dist/adapter/runStream.d.ts +0 -206
- package/dist/adapter/runStream.js +6 -596
- package/dist/adapter/types.d.ts +0 -111
- package/dist/adapter/types.js +0 -29
- package/dist/agentSession/backgroundView.d.ts +0 -106
- package/dist/agentSession/backgroundView.js +3 -49
- package/dist/agentSession/contract.d.ts +0 -98
- package/dist/agentSession/contract.js +0 -12
- package/dist/agentsWireCaps.d.ts +0 -72
- package/dist/agentsWireCaps.js +4 -72
- package/dist/approvalsStreamLiveCapability.d.ts +0 -25
- package/dist/approvalsStreamLiveCapability.js +0 -31
- package/dist/argvFlagValue.d.ts +0 -33
- package/dist/argvFlagValue.js +3 -35
- package/dist/attachmentsWireCaps.d.ts +0 -127
- package/dist/attachmentsWireCaps.js +0 -144
- package/dist/autoModeUnavailable.d.ts +0 -120
- package/dist/autoModeUnavailable.js +0 -144
- package/dist/classifierStatus.d.ts +0 -72
- package/dist/classifierStatus.js +0 -167
- package/dist/classifierVerdictWire.d.ts +0 -54
- package/dist/classifierVerdictWire.js +0 -133
- package/dist/clientContextWireCaps.d.ts +0 -37
- package/dist/clientContextWireCaps.js +0 -36
- package/dist/clientSlice.d.ts +0 -63
- package/dist/clientSlice.js +0 -45
- package/dist/cloudConfigWireCaps.d.ts +0 -86
- package/dist/cloudConfigWireCaps.js +2 -65
- package/dist/compensations.d.ts +0 -52
- package/dist/compensations.js +2 -63
- package/dist/controlRouter.d.ts +2 -208
- package/dist/controlRouter.js +1 -129
- package/dist/coreValuePorts.d.ts +0 -84
- package/dist/coreValuePorts.js +0 -29
- package/dist/decideReceipt.d.ts +0 -110
- package/dist/decideReceipt.js +0 -84
- package/dist/detachWire.d.ts +0 -130
- package/dist/detachWire.js +1 -130
- package/dist/deviceExecutorManagementCapability.d.ts +2 -35
- package/dist/deviceExecutorManagementCapability.js +1 -37
- package/dist/diagnostics.d.ts +0 -8
- package/dist/diagnostics.js +0 -8
- package/dist/diff/patch.d.ts +0 -17
- package/dist/diff/patch.js +0 -19
- package/dist/effectiveFacts.d.ts +0 -40
- package/dist/effectiveFacts.js +0 -22
- package/dist/effortWire.d.ts +0 -11
- package/dist/effortWire.js +0 -12
- package/dist/engineAgentPanelStore.d.ts +0 -169
- package/dist/engineAgentPanelStore.js +13 -293
- package/dist/engineCapReader.d.ts +0 -62
- package/dist/engineCapReader.js +1 -43
- package/dist/engineCapsCache.d.ts +0 -177
- package/dist/engineCapsCache.js +0 -199
- package/dist/engineCapsGenerationGuard.d.ts +0 -2
- package/dist/engineCapsGenerationGuard.js +0 -11
- package/dist/engineErrorCodes.d.ts +1 -316
- package/dist/engineErrorCodes.js +0 -427
- package/dist/engineHttpTools.d.ts +0 -29
- package/dist/engineHttpTools.js +0 -29
- package/dist/engineIdentity.d.ts +0 -83
- package/dist/engineIdentity.js +0 -88
- package/dist/engineInlineTaskStats.d.ts +0 -57
- package/dist/engineInlineTaskStats.js +1 -42
- package/dist/engineNoticeCodes.d.ts +0 -190
- package/dist/engineNoticeCodes.js +0 -182
- package/dist/engineSessionParam.d.ts +0 -30
- package/dist/engineSessionParam.js +0 -52
- package/dist/engineToolLabelStore.d.ts +0 -29
- package/dist/engineToolLabelStore.js +0 -31
- package/dist/engineWireSdk.d.ts +0 -90
- package/dist/engineWireSdk.js +0 -74
- package/dist/engineWireTarget.d.ts +0 -14
- package/dist/engineWireTarget.js +0 -39
- package/dist/env/localeGeo.d.ts +0 -12
- package/dist/env/localeGeo.js +2 -77
- package/dist/env/localeTag.d.ts +0 -34
- package/dist/env/localeTag.js +0 -32
- package/dist/env/uiLanguage.d.ts +0 -13
- package/dist/env/uiLanguage.js +0 -25
- package/dist/envFlag.d.ts +0 -37
- package/dist/envFlag.js +0 -40
- package/dist/executionLaneCapability.d.ts +0 -48
- package/dist/executionLaneCapability.js +0 -54
- package/dist/finalVerifyWire.d.ts +0 -67
- package/dist/finalVerifyWire.js +3 -43
- package/dist/fleet/fleetLedger.d.ts +0 -308
- package/dist/fleet/fleetLedger.js +10 -429
- package/dist/fleet/fleetProjection.d.ts +0 -240
- package/dist/fleet/fleetProjection.js +0 -189
- package/dist/fleet/fleetRowAgentType.d.ts +0 -6
- package/dist/fleet/fleetRowAgentType.js +1 -32
- package/dist/fleet/workflowSizeWarning.d.ts +0 -47
- package/dist/fleet/workflowSizeWarning.js +1 -46
- package/dist/fleetAgentPanelProjection.d.ts +0 -48
- package/dist/fleetAgentPanelProjection.js +8 -173
- package/dist/fleetTaskDesc.d.ts +0 -39
- package/dist/fleetTaskDesc.js +0 -69
- package/dist/forkWireCaps.d.ts +0 -23
- package/dist/forkWireCaps.js +1 -24
- package/dist/gateOutcome.d.ts +0 -140
- package/dist/gateOutcome.js +0 -85
- package/dist/gateVocabulary.d.ts +0 -114
- package/dist/gateVocabulary.js +3 -161
- package/dist/goalStopHook.d.ts +0 -127
- package/dist/goalStopHook.js +0 -178
- package/dist/headlessPermissionModeWire.d.ts +0 -76
- package/dist/headlessPermissionModeWire.js +1 -155
- package/dist/headlessReconnectWire.d.ts +0 -84
- package/dist/headlessReconnectWire.js +13 -67
- package/dist/hitl/approvalDecisionNoteAudit.d.ts +0 -49
- package/dist/hitl/approvalDecisionNoteAudit.js +0 -56
- package/dist/hitl/approvalOutcomeNote.d.ts +0 -2
- package/dist/hitl/approvalOutcomeNote.js +0 -20
- package/dist/hitl/approvalResolution.d.ts +0 -113
- package/dist/hitl/approvalResolution.js +0 -66
- package/dist/hitl/approvalsFeed.d.ts +0 -183
- package/dist/hitl/approvalsFeed.js +12 -243
- package/dist/hitl/armedGateRegistry.d.ts +0 -55
- package/dist/hitl/armedGateRegistry.js +0 -146
- package/dist/hitl/askGateWire.d.ts +0 -86
- package/dist/hitl/askGateWire.js +1 -95
- package/dist/hitl/askParkRowRouting.d.ts +0 -123
- package/dist/hitl/askParkRowRouting.js +1 -89
- package/dist/hitl/crashConverged.d.ts +0 -148
- package/dist/hitl/crashConverged.js +0 -214
- package/dist/hitl/editedRuleTextPrecheck.d.ts +0 -109
- package/dist/hitl/editedRuleTextPrecheck.js +0 -71
- package/dist/hitl/frameRouter.d.ts +0 -134
- package/dist/hitl/frameRouter.js +6 -378
- package/dist/hitl/gateIdentity.d.ts +0 -39
- package/dist/hitl/gateIdentity.js +0 -41
- package/dist/hitl/gateLedger.d.ts +0 -267
- package/dist/hitl/gateLedger.js +0 -121
- package/dist/hitl/hitlBridge.d.ts +7 -431
- package/dist/hitl/hitlBridge.js +7 -476
- package/dist/hitl/hitlHostSurface.d.ts +0 -150
- package/dist/hitl/hitlHostSurface.js +0 -169
- package/dist/hitl/livePendingAsk.d.ts +0 -91
- package/dist/hitl/livePendingAsk.js +0 -74
- package/dist/hitl/localAllowRule.d.ts +0 -62
- package/dist/hitl/localAllowRule.js +1 -33
- package/dist/hitl/parkOwnership.d.ts +0 -56
- package/dist/hitl/parkOwnership.js +0 -22
- package/dist/hitl/parkResolver.d.ts +3 -88
- package/dist/hitl/parkResolver.js +8 -349
- package/dist/hitl/parkRowBirthWait.d.ts +2 -26
- package/dist/hitl/parkRowBirthWait.js +3 -93
- package/dist/hitl/persistedRulesWire.d.ts +23 -371
- package/dist/hitl/persistedRulesWire.js +62 -329
- package/dist/hitl/planReviewWire.d.ts +4 -176
- package/dist/hitl/planReviewWire.js +9 -312
- package/dist/hitl/resumeRunningCard.d.ts +0 -105
- package/dist/hitl/resumeRunningCard.js +0 -105
- package/dist/hitl/sessionPolicyWire.d.ts +11 -191
- package/dist/hitl/sessionPolicyWire.js +0 -149
- package/dist/hitl/suspendedReopen.d.ts +3 -24
- package/dist/hitl/suspendedReopen.js +0 -14
- package/dist/hitl/toolApprovalWire.d.ts +5 -1308
- package/dist/hitl/toolApprovalWire.js +5 -945
- package/dist/hooksWireCaps.d.ts +0 -38
- package/dist/hooksWireCaps.js +0 -190
- package/dist/host.d.ts +0 -105
- package/dist/host.js +0 -33
- package/dist/hostEnv.d.ts +0 -14
- package/dist/hostEnv.js +0 -13
- package/dist/imagesWireCaps.d.ts +0 -21
- package/dist/imagesWireCaps.js +0 -22
- package/dist/index.d.ts +0 -134
- package/dist/index.js +0 -476
- package/dist/interactiveHalt.d.ts +5 -153
- package/dist/interactiveHalt.js +0 -111
- package/dist/interactiveToolsWire.d.ts +0 -62
- package/dist/interactiveToolsWire.js +1 -67
- package/dist/leaderConflict.d.ts +0 -59
- package/dist/leaderConflict.js +0 -48
- package/dist/limitsWire.d.ts +0 -125
- package/dist/limitsWire.js +2 -120
- package/dist/liveInitToolFace.d.ts +0 -77
- package/dist/liveInitToolFace.js +1 -109
- package/dist/liveModelCatalog.d.ts +0 -52
- package/dist/liveModelCatalog.js +0 -48
- package/dist/liveQuestionStore.d.ts +0 -87
- package/dist/liveQuestionStore.js +1 -56
- package/dist/mcpLiveness.d.ts +0 -151
- package/dist/mcpLiveness.js +0 -122
- package/dist/mcpPanel.d.ts +0 -104
- package/dist/mcpPanel.js +0 -49
- package/dist/mcpReconnect.d.ts +0 -58
- package/dist/mcpReconnect.js +0 -69
- package/dist/mcpWireCaps.d.ts +0 -55
- package/dist/mcpWireCaps.js +1 -13
- package/dist/memoryComplianceCapability.d.ts +3 -57
- package/dist/memoryComplianceCapability.js +0 -57
- package/dist/memoryEntriesWire.d.ts +6 -198
- package/dist/memoryEntriesWire.js +0 -144
- package/dist/memoryOriginCapability.d.ts +3 -53
- package/dist/memoryOriginCapability.js +0 -50
- package/dist/memorySpecWire.d.ts +0 -116
- package/dist/memorySpecWire.js +0 -150
- package/dist/model/catalog.d.ts +0 -111
- package/dist/model/catalog.js +0 -87
- package/dist/model/catalogLoader.d.ts +0 -114
- package/dist/model/catalogLoader.js +2 -139
- package/dist/model/modelSupplyRules.d.ts +1 -55
- package/dist/model/modelSupplyRules.js +0 -62
- package/dist/model/providerAuth.d.ts +0 -103
- package/dist/model/providerAuth.js +2 -38
- package/dist/model/providerCatalog.d.ts +0 -45
- package/dist/model/providerCatalog.js +0 -37
- package/dist/model/providerPresets.d.ts +0 -33
- package/dist/model/providerPresets.js +2 -91
- package/dist/model/tierVocabulary.d.ts +0 -31
- package/dist/model/tierVocabulary.js +0 -27
- package/dist/modelBudgetRule.d.ts +0 -39
- package/dist/modelBudgetRule.js +0 -39
- package/dist/modelCapabilityProbe.d.ts +0 -175
- package/dist/modelCapabilityProbe.js +0 -147
- package/dist/modelWireCaps.d.ts +0 -13
- package/dist/modelWireCaps.js +0 -13
- package/dist/notifications.d.ts +0 -233
- package/dist/notifications.js +14 -492
- package/dist/oneShotWireCaps.d.ts +0 -34
- package/dist/oneShotWireCaps.js +0 -35
- package/dist/ownKey.d.ts +0 -33
- package/dist/ownKey.js +0 -33
- package/dist/panelRunningHistory.d.ts +0 -28
- package/dist/panelRunningHistory.js +0 -43
- package/dist/peerFrames.d.ts +0 -71
- package/dist/peerFrames.js +0 -168
- package/dist/peerLaneCapability.d.ts +0 -44
- package/dist/peerLaneCapability.js +0 -52
- package/dist/permissionRuleIssue.d.ts +0 -30
- package/dist/permissionRuleIssue.js +0 -78
- package/dist/permissionRulesWriteCapability.d.ts +0 -46
- package/dist/permissionRulesWriteCapability.js +0 -54
- package/dist/permissionWireCaps.d.ts +0 -37
- package/dist/permissionWireCaps.js +0 -37
- package/dist/postureKnob.d.ts +0 -71
- package/dist/postureKnob.js +0 -86
- package/dist/principalWire.d.ts +0 -17
- package/dist/principalWire.js +0 -17
- package/dist/printToolResultFrame.d.ts +0 -100
- package/dist/printToolResultFrame.js +0 -33
- package/dist/promptProfileWireCaps.d.ts +0 -13
- package/dist/promptProfileWireCaps.js +0 -13
- package/dist/readFacePosture.d.ts +0 -43
- package/dist/readFacePosture.js +0 -46
- package/dist/request/printNotification.d.ts +0 -20
- package/dist/request/printNotification.js +0 -55
- package/dist/request/taskRequest.d.ts +1 -249
- package/dist/request/taskRequest.js +20 -498
- package/dist/resumeRefusalCopy.d.ts +0 -136
- package/dist/resumeRefusalCopy.js +1 -117
- package/dist/retainBackgroundWireCaps.d.ts +0 -48
- package/dist/retainBackgroundWireCaps.js +0 -48
- package/dist/retryStatus.d.ts +2 -221
- package/dist/retryStatus.js +0 -107
- package/dist/rewindWireCaps.d.ts +0 -27
- package/dist/rewindWireCaps.js +0 -24
- package/dist/runCancelContext.d.ts +1 -20
- package/dist/runCancelContext.js +0 -34
- package/dist/runTerminal.d.ts +0 -273
- package/dist/runTerminal.js +0 -177
- package/dist/sandboxWire.d.ts +0 -38
- package/dist/sandboxWire.js +0 -82
- package/dist/scenarioWire.d.ts +0 -60
- package/dist/scenarioWire.js +0 -68
- package/dist/scratchpadWireCaps.d.ts +0 -11
- package/dist/scratchpadWireCaps.js +0 -32
- package/dist/sdkWireTransit.d.ts +0 -38
- package/dist/sdkWireTransit.js +0 -30
- package/dist/seam.d.ts +18 -853
- package/dist/seam.js +0 -52
- package/dist/seatContract.d.ts +0 -555
- package/dist/seatContract.js +5 -304
- package/dist/selfOrchestrationDenial.d.ts +0 -189
- package/dist/selfOrchestrationDenial.js +0 -162
- package/dist/selfOrchestrationWireCaps.d.ts +0 -38
- package/dist/selfOrchestrationWireCaps.js +0 -38
- package/dist/sessionMap.d.ts +0 -60
- package/dist/sessionMap.js +0 -37
- package/dist/sessionMemoryStatus.d.ts +11 -114
- package/dist/sessionMemoryStatus.js +0 -112
- package/dist/sessionModelLatch.d.ts +0 -29
- package/dist/sessionModelLatch.js +0 -40
- package/dist/sessionPolicyCapability.d.ts +3 -53
- package/dist/sessionPolicyCapability.js +0 -52
- package/dist/sessionSlot.d.ts +0 -26
- package/dist/sessionSlot.js +0 -17
- package/dist/skillsWireCaps.d.ts +0 -87
- package/dist/skillsWireCaps.js +0 -38
- package/dist/sqlEngineCapability.d.ts +0 -118
- package/dist/sqlEngineCapability.js +0 -134
- package/dist/sseIdleTriage.d.ts +0 -79
- package/dist/sseIdleTriage.js +1 -80
- package/dist/steering.d.ts +0 -54
- package/dist/steering.js +0 -63
- package/dist/subagent/engineCompactWire.d.ts +0 -34
- package/dist/subagent/engineCompactWire.js +4 -134
- package/dist/subagent/engineDelegatedPrompt.d.ts +0 -31
- package/dist/subagent/engineDelegatedPrompt.js +1 -103
- package/dist/subagent/engineRowStopGate.d.ts +0 -20
- package/dist/subagent/engineRowStopGate.js +0 -49
- package/dist/subagent/engineSubagentOutput.d.ts +0 -7
- package/dist/subagent/engineSubagentOutput.js +1 -51
- package/dist/subagent/engineSubagentResume.d.ts +2 -279
- package/dist/subagent/engineSubagentResume.js +2 -129
- package/dist/subagent/engineSubagentSteer.d.ts +0 -26
- package/dist/subagent/engineSubagentSteer.js +0 -63
- package/dist/subagent/engineSubagentTail.d.ts +0 -38
- package/dist/subagent/engineSubagentTail.js +2 -110
- package/dist/subagent/engineTaskHandleWire.d.ts +6 -67
- package/dist/subagent/engineTaskHandleWire.js +0 -126
- package/dist/subagent/subagentOwnerAbsence.d.ts +0 -2
- package/dist/subagent/subagentOwnerAbsence.js +0 -25
- package/dist/subagentContentStore.d.ts +3 -260
- package/dist/subagentContentStore.js +7 -540
- package/dist/systemReminderTag.d.ts +0 -49
- package/dist/systemReminderTag.js +0 -61
- package/dist/toolResult.d.ts +1 -211
- package/dist/toolResult.js +1 -358
- package/dist/toolRoster.d.ts +0 -140
- package/dist/toolRoster.js +0 -66
- package/dist/typePins.d.ts +0 -46
- package/dist/types/engineState.d.ts +0 -71
- package/dist/types/engineState.js +0 -16
- package/dist/ultracodeWireCaps.d.ts +0 -75
- package/dist/ultracodeWireCaps.js +0 -92
- package/dist/unrefTimer.d.ts +0 -27
- package/dist/webSearchBackendCapability.d.ts +0 -72
- package/dist/webSearchBackendCapability.js +0 -79
- package/dist/webSearchWireCaps.d.ts +0 -37
- package/dist/webSearchWireCaps.js +0 -34
- package/dist/websearch/searchProviderPresets.d.ts +0 -81
- package/dist/websearch/searchProviderPresets.js +0 -27
- package/dist/wireErrorTriage.d.ts +4 -160
- package/dist/wireErrorTriage.js +0 -171
- package/dist/wireRefusalCopy.d.ts +0 -28
- package/dist/wireRefusalCopy.js +0 -28
- package/dist/workflow.d.ts +0 -40
- package/dist/workflow.js +0 -52
- package/dist/workflowClient.d.ts +0 -122
- package/dist/workflowClient.js +8 -360
- package/dist/workflowMonitor.d.ts +2 -72
- package/dist/workflowMonitor.js +0 -26
- package/dist/writeProtectionCapability.d.ts +0 -112
- package/dist/writeProtectionCapability.js +0 -109
- package/docs/INTEGRATION-CLIENTS.md +78 -5
- package/package.json +3 -3
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|