@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,57 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hitl/sessionPolicyWire.ts — **会话策略写端口**:per-session 工具规则(`GET` / `PUT /v1/sessions/:id/policy`)
|
|
3
|
-
* 的三端共用窄读 + 收紧编排(0.77.0 CC-105)。
|
|
4
|
-
*
|
|
5
|
-
* ── 它与常驻规则那一面是**两个面**,不是一个面的两半 ────────────────────────────────────────────
|
|
6
|
-
* 常驻规则面是**跨会话**的治理清单(按内容寻址、可列举、可撤销);本面是**一条会话**上的一份记录:
|
|
7
|
-
* · 作用域 = 这条会话(键还是这条会话的属主,不是调用者;非属主读到的是「没有这条会话」);
|
|
8
|
-
* · 方向 = **只许收紧**,放宽方向由引擎拒(本包不复述那条判据,见下);
|
|
9
|
-
* · 并发 = 记录上盖着一枚单调版本号,写入带上它做乐观并发(不带 = 不做并发校验,本包从不这么发)。
|
|
10
|
-
* 所以它**不住进**常驻规则那只门面;但失败分类与回执读口的**姿势**照它:错误按状态 + 机器码结构读
|
|
11
|
-
* (不 `instanceof`:注入面可能是假件,打包后 `instanceof` 也不该是承重判据),回执只认已过窄化的形。
|
|
12
|
-
*
|
|
13
|
-
* ── 🔴 整份替换,所以「追加一条限制」必须把旧的一起发 ───────────────────────────────────────────
|
|
14
|
-
* 写入口的语义是**整份记录替换**,不是逐字段合并:提交体里省掉的字段等于把那个字段的限制**清空**。
|
|
15
|
-
* 于是「只发新增的那条」在引擎眼里是一次**放宽**,当场被拒。本编排因此是「读 → 已有 ∪ 新增 → 整份回写」:
|
|
16
|
-
* · 并集的**键**就是规则记录自己的那几只桶,键集由引擎型面**派生**(下面的 `RULE_FIELD_PRESENCE`
|
|
17
|
-
* `satisfies` 表)——引擎加一只桶 ⇒ 本文件**编译红**,而不是「静默丢一桶 + 回执说已生效」;
|
|
18
|
-
* · 每只桶内按**逐字去重**并集(旧的在前、新的在后,原样字节,不做规范化)。路径一类的规范拼写归引擎,
|
|
19
|
-
* 壳替它改写会让两端对「同一条限制」各有一份判据;
|
|
20
|
-
* · 🔴 旧记录里**在场的空桶照样保留成空桶**:一只「设了但是空」的白名单与「没设」在语义上是相反的两件事
|
|
21
|
-
* (前者= 什么都不放行,后者 = 不设这类限制),把它丢掉就是一次放宽。
|
|
22
|
-
*
|
|
23
|
-
* ── 🔴 收紧到底怎么判,判官只有一个 ─────────────────────────────────────────────────────────────
|
|
24
|
-
* 「哪些差异算放宽」的判据在引擎侧(逐桶方向各不相同:禁止名单删条目算放宽;白名单加条目、整只白名单
|
|
25
|
-
* 消失算放宽;目录限制解除或多出一个不在原限制之内的目录算放宽)。本包**不铸第二份**:按「已有 ∪ 新增」
|
|
26
|
-
* 写,判定留给引擎,收到放宽拒绝**原样上报、不吞不重试**。
|
|
27
|
-
* ⚠️ 并集写在结构上消不掉**删除方向**的放宽(旧条目一条不少),但消不掉**加宽方向**的:
|
|
28
|
-
* 端把一条放宽方向的条目(例如往白名单或目录限制里加一项)放进 `add`,并集里就真多一项,引擎会判放宽并拒。
|
|
29
|
-
* **本包不预判这件事** —— 出现放宽拒绝时,事实就是「端喂了放宽方向的条目」,措辞据此指路。
|
|
30
|
-
* 🔴 **但那条拒绝只对普通调用方成立**:上游的方向门是**身份门**,不是字段门 —— 被部署判为运维身份的调用方
|
|
31
|
-
* 写入时方向判据**根本不跑**,于是同一份「已有 ∪ 新增」在运维身份上会**被接受**,而其中往白名单 / 目录限制里
|
|
32
|
-
* 加的那一项就是一次真的放宽。所以本编排的 `written` 只承诺一件事:**记录现在等于原有的加上送来的**;
|
|
33
|
-
* 它**不**承诺「这条会话变严了」,措辞也一个字都不这么说(方向的判官只有引擎一个,而它对运维身份不设门)。
|
|
34
|
-
* 端要的若是「无论谁调用都只会更严」,那需要一个不受身份豁免的写模式,而这条 wire 上今天没有。
|
|
35
|
-
*
|
|
36
|
-
* ── 🔴 生效时机 ────────────────────────────────────────────────────────────────────────────────
|
|
37
|
-
* 够新的引擎在**每一道工具门**重读这份记录 ⇒ 一条 run 跑着的时候写下的收紧,**同一条 run 的下一道工具门**
|
|
38
|
-
* 就拒;更早的引擎只在起手读一次,收紧要等下一条 run。本包**不据此做任何判据**(它是引擎版本的函数,
|
|
39
|
-
* 而这条 wire 上没有位回答它),只在措辞里如实说「下一道工具门」并且不承诺「立刻打断正在跑的那一步」。
|
|
40
|
-
*
|
|
41
|
-
* ── 🔴 三种「没读到」不许互折 ──────────────────────────────────────────────────────────────────
|
|
42
|
-
* 窄读三向:**真空**(记录在、一条限制都没有 —— 这台引擎对一条还没写过策略的会话就这么答,版本号为 0)/
|
|
43
|
-
* **读不懂**(信封、版本号、任一只桶的形不对)/ **调用失败**(带 typed 分类)。读不懂**绝不**折成「空策略」——
|
|
44
|
-
* 折了之后并集写会把一份读不懂的旧记录当成空的整份覆盖上去,那是一次**静默的整面放宽**。
|
|
45
|
-
* 同样,写回执读不懂**绝不**答「已写」:那一次很可能真的落了盘,答案是「不知道」,不是「成功」也不是「失败」。
|
|
46
|
-
*
|
|
47
|
-
* ── UNTRUSTED ─────────────────────────────────────────────────────────────────────────────────
|
|
48
|
-
* 规则文本是部署侧/用户侧的内容,只当字节搬运与渲染,绝不当代码用;桶内逐条只判「是不是字符串」,
|
|
49
|
-
* 内容文法归引擎。
|
|
50
|
-
*/
|
|
51
1
|
import { hostLog } from '../host.js';
|
|
52
|
-
// ── 桶名全集(派生,不是手抄)────────────────────────────────────────────────────────────────
|
|
53
|
-
/** 🔴 **唯一**目的是让桶名集合从引擎的型面派生:引擎加一只桶 ⇒ 这里缺键 ⇒ **编译红**;删一只 ⇒ 多键 ⇒ 同样编译红。
|
|
54
|
-
* 值无语义。这条纪律在整份替换的语义下是承重的:一只没被并集带上的桶 = 一次静默放宽。 */
|
|
55
2
|
const RULE_FIELD_PRESENCE = {
|
|
56
3
|
toolAllow: true,
|
|
57
4
|
toolDeny: true,
|
|
@@ -59,13 +6,7 @@ const RULE_FIELD_PRESENCE = {
|
|
|
59
6
|
commandAllow: true,
|
|
60
7
|
commandDeny: true,
|
|
61
8
|
};
|
|
62
|
-
/**
|
|
63
|
-
* 规则记录的桶名全集。**派生自上表**,不是另一份手抄件。
|
|
64
|
-
* 🔴 形制:`Object.freeze` 的数组,**不是**只在类型面只读的 `readonly T[]` —— 后者一行 `.splice()` 就能改,
|
|
65
|
-
* 而公面消费者拿到的正是这个实例。
|
|
66
|
-
*/
|
|
67
9
|
export const SESSION_POLICY_RULE_FIELDS = Object.freeze(Object.keys(RULE_FIELD_PRESENCE));
|
|
68
|
-
/** 一只桶最多认多少条。超过 ⇒ 判**读不懂**,而不是截断:一份被截短的授权记录整份回写就是一次放宽。 */
|
|
69
10
|
const MAX_RULE_ENTRIES = 10_000;
|
|
70
11
|
function errShape(e) {
|
|
71
12
|
const o = (e ?? {});
|
|
@@ -75,15 +16,8 @@ function errShape(e) {
|
|
|
75
16
|
message: typeof o.message === 'string' && o.message !== '' ? o.message : String(e),
|
|
76
17
|
};
|
|
77
18
|
}
|
|
78
|
-
/**
|
|
79
|
-
* 抛出来的东西 → 处置分类。
|
|
80
|
-
* 🔴 **并发冲突按机器码逐字认,不按 409 状态认**:同一个 409 上骑着两个码(并发不符 / 会话无属主),
|
|
81
|
-
* 而后者重试多少次都是同一个答案。没带码的 409 一律落通用臂 —— 猜一个码去重试,代价是无穷重试。
|
|
82
|
-
*/
|
|
83
19
|
export function classifySessionPolicyFailure(e) {
|
|
84
20
|
const { status, errorCode, message } = errShape(e);
|
|
85
|
-
// 🔴 出处先于状态码:没有机器码 ⇒ 证明不了是引擎在答(见 `no-verdict` 的注)。状态码本身在这里不是证据 ——
|
|
86
|
-
// 一页 HTML 405 与引擎的 405 状态码相同、出处相反,前者可能骑在一次已经落盘的写上。
|
|
87
21
|
if (errorCode === undefined || errorCode === '')
|
|
88
22
|
return { kind: 'no-verdict', message };
|
|
89
23
|
if (status === 501 || errorCode === 'capability.session_store_required') {
|
|
@@ -91,8 +25,6 @@ export function classifySessionPolicyFailure(e) {
|
|
|
91
25
|
}
|
|
92
26
|
if (errorCode === 'loosen_forbidden')
|
|
93
27
|
return { kind: 'loosen-forbidden', message };
|
|
94
|
-
// 🔴 与上一行**同一个状态码**、不同的机器码:规则店读不出记录的存活标记而拒盖新版本号。
|
|
95
|
-
// 没有这一行时它会落进通用臂,措辞就会去劝人改自己送的条目 —— 而条目一个字都没错。
|
|
96
28
|
if (errorCode === 'corrupt')
|
|
97
29
|
return { kind: 'store-corrupt', message };
|
|
98
30
|
if (errorCode === 'conflict')
|
|
@@ -107,19 +39,10 @@ export function classifySessionPolicyFailure(e) {
|
|
|
107
39
|
return { kind: 'unauthorized', message };
|
|
108
40
|
if (status === 400 || status === 413 || status === 422)
|
|
109
41
|
return { kind: 'request-rejected', message };
|
|
110
|
-
// 🔴 末两行的分界是**「引擎到底答没答」**,不是「认不认得这个码」:
|
|
111
|
-
// · 没有状态码(一个带码却没状态的对象不是传输层交出来的形)⇒ 引擎的裁决**没到手**;
|
|
112
|
-
// · 5xx ⇒ 引擎答了一句「我这边炸了」,那句话**证明不了**提交没落盘(提交成功而回程失败是同一形)。
|
|
113
|
-
// 这两种都归 `no-verdict`;剩下的(引擎带码答了一个客户端侧拒绝)才允许说「什么都没写」。
|
|
114
42
|
if (status === undefined || status >= 500)
|
|
115
43
|
return { kind: 'no-verdict', message };
|
|
116
44
|
return { kind: 'error', message };
|
|
117
45
|
}
|
|
118
|
-
/**
|
|
119
|
-
* 一只桶的逐条窄读:`length` 恰读一次、每个下标恰读一次(变化的数组读两遍会让一条限制静默消失)。
|
|
120
|
-
* 🔴 **下标必须是数组自己的**(`hasOwn`):稀疏数组的洞在原型被污染时会读出一个别人放进去的值,
|
|
121
|
-
* 而这里读出来的每一条都会被并集**原样写回**去 —— 那就等于把一条 wire 上根本不存在的限制写成真的。
|
|
122
|
-
*/
|
|
123
46
|
function narrowBucket(raw, field) {
|
|
124
47
|
if (!Array.isArray(raw))
|
|
125
48
|
return { ok: false, detail: `rule field "${field}" is not an array` };
|
|
@@ -140,19 +63,10 @@ function narrowBucket(raw, field) {
|
|
|
140
63
|
}
|
|
141
64
|
return { ok: true, list };
|
|
142
65
|
}
|
|
143
|
-
/**
|
|
144
|
-
* `{ rules }` 信封 → 承重键(版本号 + 五只桶)。
|
|
145
|
-
* 🔴 **半坏就是坏**:一只桶好、另一只桶形不对 ⇒ 整份判读不懂。丢掉坏的那只再整份回写 = 把那只桶清空 =
|
|
146
|
-
* 一次放宽,而调用方会看到一个 200。
|
|
147
|
-
*/
|
|
148
66
|
function narrowStoredRecord(body) {
|
|
149
67
|
if (body === null || typeof body !== 'object' || Array.isArray(body)) {
|
|
150
68
|
return { ok: false, why: 'envelope', detail: 'policy response is not an object' };
|
|
151
69
|
}
|
|
152
|
-
// 🔴 承重键**逐个按 own-property 读**(异源对抗复审 R2 [medium],真病):`src[field]` 会沿原型链取值,
|
|
153
|
-
// 于是一次原型污染(或一只被注入的假 facade 交出带继承键的对象)能让 wire 上**没有**的那只桶
|
|
154
|
-
// 出现在读数里 —— 而写口是整份替换,并集会把它当成一条真限制写回去。方向上这不是「多读了一格」,
|
|
155
|
-
// 是**凭空造出一条授权规则**。信封、版本号、五只桶、数组下标一律同律。
|
|
156
70
|
if (!Object.hasOwn(body, 'rules')) {
|
|
157
71
|
return { ok: false, why: 'envelope', detail: 'policy response carries no rules record of its own' };
|
|
158
72
|
}
|
|
@@ -182,11 +96,6 @@ function narrowStoredRecord(body) {
|
|
|
182
96
|
}
|
|
183
97
|
return { ok: true, rev, rules };
|
|
184
98
|
}
|
|
185
|
-
/**
|
|
186
|
-
* 读这条会话当前的规则记录。
|
|
187
|
-
* 🔴 记录**真的空**(一只桶都没有、版本号 0)是这台引擎对「还没写过策略的会话」的诚实答案,
|
|
188
|
-
* 它与「读不懂」是两个结局;调用方据此知道下一次写该带哪一个版本号。
|
|
189
|
-
*/
|
|
190
99
|
export async function readSessionPolicy(facade, sessionId, opts) {
|
|
191
100
|
let body;
|
|
192
101
|
try {
|
|
@@ -200,29 +109,17 @@ export async function readSessionPolicy(facade, sessionId, opts) {
|
|
|
200
109
|
read = narrowStoredRecord(body);
|
|
201
110
|
}
|
|
202
111
|
catch {
|
|
203
|
-
// 抛出的 getter / 被撤销的代理:与「形不对」同一处置,绝不外抛到调用方的编排里。
|
|
204
112
|
read = { ok: false, why: 'envelope', detail: 'policy response could not be read' };
|
|
205
113
|
}
|
|
206
114
|
if (!read.ok)
|
|
207
115
|
return { kind: 'malformed', why: read.why, detail: read.detail };
|
|
208
116
|
return { kind: 'present', rev: read.rev, rules: read.rules };
|
|
209
117
|
}
|
|
210
|
-
// ── 并集(整份替换下的「追加一条限制」)────────────────────────────────────────────────────────
|
|
211
|
-
/**
|
|
212
|
-
* 「已有 ∪ 新增」。**只加不减**:旧记录的每一只桶、每一条条目都原样留在结果里(在场的空桶保留成空桶),
|
|
213
|
-
* 新增的条目逐字去重后接在后面。两边都没有的桶**不铸**(凭空铸一只空桶 = 凭空加一条限制)。
|
|
214
|
-
* 🔴 条目字节原样搬运:不 trim、不规范化路径、不排序 —— 那些都是引擎的判据,壳再做一遍就是第二份。
|
|
215
|
-
*/
|
|
216
118
|
export function tightenedSessionRules(prior, add) {
|
|
217
|
-
// 🔴 两侧都过读腿那**同一只**窄化器(`hasOwn` 桶名 + `hasOwn` 下标 + 逐条是字符串),不信任任何一侧:
|
|
218
|
-
// `hasOwn` 只护得住桶名,桶内若直接 `for…of`,走的是数组迭代器 —— 稀疏数组的洞会沿原型链读出别人放进去的值,
|
|
219
|
-
// 而并集结果是**整份写回去**的(读腿堵住的那条原型污染路径不许在写腿重新打开)。
|
|
220
|
-
// 坏的一侧是调用方的入参 ⇒ 抛具名错误(不是引擎的 request_rejected,不许混进那一臂)。
|
|
221
119
|
const p = narrowRulesInput(prior, 'prior');
|
|
222
120
|
const a = narrowRulesInput(add, 'add');
|
|
223
121
|
const out = {};
|
|
224
122
|
for (const field of SESSION_POLICY_RULE_FIELDS) {
|
|
225
|
-
// 窄化副本是普通对象:读桶仍按自有键(一次原型污染会让每只普通对象都「带着」一只桶)。
|
|
226
123
|
const pl = Object.hasOwn(p, field) ? p[field] : undefined;
|
|
227
124
|
const al = Object.hasOwn(a, field) ? a[field] : undefined;
|
|
228
125
|
if (pl === undefined && al === undefined)
|
|
@@ -245,12 +142,6 @@ export function tightenedSessionRules(prior, add) {
|
|
|
245
142
|
}
|
|
246
143
|
return out;
|
|
247
144
|
}
|
|
248
|
-
/**
|
|
249
|
-
* 调用方交来的一份规则记录 → 已窄化的副本(每只在场桶都是自有的、稠密的、逐条字符串的新数组)。
|
|
250
|
-
* 🔴 与 wire 回体的窄读是**同一只**桶级判据(`narrowBucket`);差别只在处置:回体读不懂是「不知道」,
|
|
251
|
-
* 入参读不懂是调用方的编程错误 ⇒ `TypeError` 点名是哪一侧、哪只桶(不回显条目内容)。
|
|
252
|
-
* 显式 `undefined` 的桶 = 缺席;原型链上的桶不算在场(它们也上不了 wire)。
|
|
253
|
-
*/
|
|
254
145
|
function narrowRulesInput(raw, side) {
|
|
255
146
|
if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
256
147
|
throw new TypeError(`tightenedSessionRules: "${side}" must be a rules record object`);
|
|
@@ -269,14 +160,6 @@ function narrowRulesInput(raw, side) {
|
|
|
269
160
|
}
|
|
270
161
|
return out;
|
|
271
162
|
}
|
|
272
|
-
/**
|
|
273
|
-
* 写回执对提交体的**对账**:回执读得懂之后,还要证明它说的是**这一次**提交。
|
|
274
|
-
* 上游契约:成功回执 = 规范化后的提交体 + 严格大于并发键的新版本号(戳 = max(当前, 高水位) + 1)。
|
|
275
|
-
* 所以:版本号没推进 / 送出去的桶不在回执里 / 送出去的条目不在回执桶里 ⇒ 回执证明不了这次落了盘。
|
|
276
|
-
* 目录桶由引擎做词法规范化(回执条目可以与送出的字节不同),那一只**只核在场**,逐条判据归引擎。
|
|
277
|
-
* 回执桶是提交的超集不算失配(`written` 承诺的是「记录含有原有的加上送来的」,不是逐字相等)。
|
|
278
|
-
* 返回 `null` = 对上了;否则一句可渲染的失配说明。
|
|
279
|
-
*/
|
|
280
163
|
function receiptMismatch(sent, receipt, sentRev, receiptRev) {
|
|
281
164
|
if (receiptRev <= sentRev) {
|
|
282
165
|
return `policy write receipt did not advance the version stamp (sent with ${sentRev}, receipt says ${receiptRev})`;
|
|
@@ -298,7 +181,6 @@ function receiptMismatch(sent, receipt, sentRev, receiptRev) {
|
|
|
298
181
|
}
|
|
299
182
|
return null;
|
|
300
183
|
}
|
|
301
|
-
/** 成因闭集的运行期镜像(冻结)。 */
|
|
302
184
|
export const SESSION_POLICY_TIGHTEN_UNKNOWN_WHY = Object.freeze([
|
|
303
185
|
'face_unavailable',
|
|
304
186
|
'session_not_found',
|
|
@@ -328,12 +210,8 @@ function unknownFrom(failure, leg) {
|
|
|
328
210
|
return { kind: 'unknown', why: 'request_rejected', message };
|
|
329
211
|
case 'store-corrupt':
|
|
330
212
|
return { kind: 'unknown', why: 'store_corrupt', message };
|
|
331
|
-
// 🔴 读腿没有副作用 ⇒ 无论引擎答没答,「什么都没写」都是真的,两种失败合成 read_failed;
|
|
332
|
-
// 写腿必须把两者**分开**:引擎带码答了拒绝 ⇒ 确实没写;裁决没到手(含没码的 4xx)⇒ 可能已经落盘,不许说成没送到。
|
|
333
213
|
case 'no-verdict':
|
|
334
214
|
return { kind: 'unknown', why: leg === 'read' ? 'read_failed' : 'write_indeterminate', message };
|
|
335
|
-
// 下面两条在这条腿上不该出现(调用点已先行分流);真出现了 = 引擎在这条腿上说了另一条腿的话,
|
|
336
|
-
// 照通用臂报,绝不在这里替它改判。
|
|
337
215
|
case 'loosen-forbidden':
|
|
338
216
|
case 'cas-conflict':
|
|
339
217
|
case 'error':
|
|
@@ -345,7 +223,6 @@ async function attemptTighten(facade, req, opts) {
|
|
|
345
223
|
if (read.kind === 'failed')
|
|
346
224
|
return { done: unknownFrom(read.failure, 'read') };
|
|
347
225
|
if (read.kind === 'malformed') {
|
|
348
|
-
// 🔴 读不懂 ⇒ 停手。把它当空记录并集回写,等于用一份「什么限制都没有」的记录整份覆盖真记录。
|
|
349
226
|
return { done: { kind: 'unknown', why: 'read_unreadable', message: read.detail } };
|
|
350
227
|
}
|
|
351
228
|
const rules = tightenedSessionRules(read.rules, req.add);
|
|
@@ -369,32 +246,14 @@ async function attemptTighten(facade, req, opts) {
|
|
|
369
246
|
narrowed = { ok: false, why: 'envelope', detail: 'policy write receipt could not be read' };
|
|
370
247
|
}
|
|
371
248
|
if (!narrowed.ok) {
|
|
372
|
-
// 🔴 这一臂**不是**失败:写很可能落了盘,只是回执说不清。答「不知道」,绝不答「已写」。
|
|
373
249
|
return { done: { kind: 'unknown', why: 'write_receipt_unreadable', message: narrowed.detail } };
|
|
374
250
|
}
|
|
375
|
-
// 🔴 回执只验形就认 `written` 是谎报:一份形好、但版本号没推进或不含送出条目的回执(版本偏斜 / 错误回包 /
|
|
376
|
-
// 中间层缓存)证明不了这次提交落了盘。对账不过 ⇒ 与「回执读不懂」同一处置方向(可能已生效,先重读)。
|
|
377
251
|
const mismatch = receiptMismatch(rules, narrowed.rules, read.rev, narrowed.rev);
|
|
378
252
|
if (mismatch !== null)
|
|
379
253
|
return { done: { kind: 'unknown', why: 'write_receipt_mismatch', message: mismatch } };
|
|
380
254
|
return { done: { kind: 'written', rev: narrowed.rev } };
|
|
381
255
|
}
|
|
382
|
-
/**
|
|
383
|
-
* 给这条会话**追加**一组限制:读当前记录 → 「已有 ∪ 新增」→ 带当前版本号整份回写。
|
|
384
|
-
*
|
|
385
|
-
* 🔴 **只重读重写一次**(结构上,不靠计数器:本函数里没有循环)。撞上并发键说明有别的写者在同一条
|
|
386
|
-
* 会话上推进了记录;重来一趟是为了把对方刚写进去的限制也一并带上(并集只加不减,所以重来是**收敛**的)。
|
|
387
|
-
* 第二趟仍撞 ⇒ 如实上报 `conflict`:第三趟不比第二趟更有理由成功,而一个自己会无限重试的写腿在争用下
|
|
388
|
-
* 会把一条会话的规则记录变成两个写者的角力场。
|
|
389
|
-
* 🔴 能力位明说没有这一面(或这份二进制比这一位还老)⇒ **一个请求都不发**;从没观测过 ⇒ **照发** ——
|
|
390
|
-
* 「本进程没探过能力面」是本进程的缺陷,不是引擎的否定,把它当否定会让一次用户已经点过的动作凭空落空。
|
|
391
|
-
* 那两条的分家写在 `sessionPolicyFaceAvailable` 的头注里(渲不渲入口 vs 动不动网络是两个问题)。
|
|
392
|
-
*/
|
|
393
256
|
export async function tightenSessionPolicy(facade, req, opts) {
|
|
394
|
-
// 入参形先于一切(能力位判据、网络):坏的 `add` 是调用方的编程错误,在任何往返之前抛,不借引擎的 request_rejected。
|
|
395
|
-
// 🔴 入口窄化出的副本就是**发出去的那一份**,两趟(首趟 / CAS 重试)共用;`sessionId` / 能力位同样只读一次 ——
|
|
396
|
-
// 编排里有 await,调用方在 GET 等待期间复用 / 清空表单数组、或访问器第二次给别的值,都不许改动已声明的限制
|
|
397
|
-
// (否则已声明的拒绝会静默消失,而回执对账只能核被改过的提交体)。
|
|
398
257
|
const snapshot = {
|
|
399
258
|
sessionId: req.sessionId,
|
|
400
259
|
add: narrowRulesInput(req.add, 'add'),
|
|
@@ -413,14 +272,6 @@ export async function tightenSessionPolicy(facade, req, opts) {
|
|
|
413
272
|
return second.done;
|
|
414
273
|
return { kind: 'conflict', rev: second.retryAtRev };
|
|
415
274
|
}
|
|
416
|
-
// ── 措辞(唯一真源;端只拼接不另写)────────────────────────────────────────────────────────────
|
|
417
|
-
/**
|
|
418
|
-
* 一次收紧结局的人话,**唯一措辞真源**。
|
|
419
|
-
* 🔴 三条不许说反:① 放宽被拒那一句要指向「送出去的那组条目里有放宽方向的」,不许说成引擎坏了或没权限;
|
|
420
|
-
* ② 并发那一句要说「记录又被别人动了」并把下一步交出去,不许说成已写;③ 回执读不懂那一句**必须**
|
|
421
|
-
* 说「可能已经生效」——把它说成失败,人会再写一遍,而那一遍会把已经生效的那条当成新增重发。
|
|
422
|
-
* 生效时机只说「下一道工具门」,不承诺打断正在跑的那一步。
|
|
423
|
-
*/
|
|
424
275
|
export function sessionPolicyTightenNotice(outcome) {
|
|
425
276
|
switch (outcome.kind) {
|
|
426
277
|
case 'written':
|
|
@@ -1,30 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
* suspendedReopen — durable `suspended` 事件上 server 的**重开侧记键** `reopened` 的三态读口(0.74.3 CC-73;
|
|
3
|
-
* 契约 reopen 族段:`GET /v1/runs/{taskId}/events` 的 `suspended` 事件带 `reopened: <errorCode>`,「缺席 / null =
|
|
4
|
-
* 这次 park 不是重开」;sdk `events.d.ts` `reopened?: string | null`,普通挂起帧不带此键)。
|
|
5
|
-
*
|
|
6
|
-
* ── 🔴 为什么是三态而不是「是 / 不是」两态 ─────────────────────────────────────────────────
|
|
7
|
-
* 契约把「缺席」和「null」判成同一句话,但两者的**说话人不同**:`null` 是新 server 明说「不是重开」;键缺席既可能是
|
|
8
|
-
* 新 server 的普通挂起帧,也可能是根本没有这个键的老 server。把两者折成一个值,消费方就再也分不出「server 说了不是」
|
|
9
|
-
* 与「server 什么都没说」。读口把它们分开带出,消费方按契约把 `unstated` **当作**不是重开即可,但不替 server 说那句话。
|
|
10
|
-
*
|
|
11
|
-
* 码是**开集原词**(词表属主在 server:今天三员 `resume.env_failed` / `resume.tool_unavailable` /
|
|
12
|
-
* `resume.tool_contract_mismatch`,见 `engineErrorCodes.ts` `RESUME_REOPEN_CODES`),本读口不过滤;要文案的消费方拿码去查表。
|
|
13
|
-
*/
|
|
14
|
-
/** `suspended.reopened` 的读数。 */
|
|
15
|
-
export type SuspendedReopenReading =
|
|
16
|
-
/** 键在场且是非空串:这条挂起是一次**重开**,`code` = server 给的 errorCode 原词。 */
|
|
17
|
-
{
|
|
1
|
+
export type SuspendedReopenReading = {
|
|
18
2
|
readonly kind: 'reopened';
|
|
19
3
|
readonly code: string;
|
|
20
|
-
}
|
|
21
|
-
/** 键在场且显式 `null`:server 明说这次 park 不是重开。 */
|
|
22
|
-
| {
|
|
4
|
+
} | {
|
|
23
5
|
readonly kind: 'not_reopened';
|
|
24
|
-
}
|
|
25
|
-
/** 键缺席(或值读不出):server 没说;按契约当作不是重开,但不冒充 `null`。 */
|
|
26
|
-
| {
|
|
6
|
+
} | {
|
|
27
7
|
readonly kind: 'unstated';
|
|
28
8
|
};
|
|
29
|
-
/** 任意事件体 → 三态读数;非对象 / 坏形一律 `unstated`,永不抛。 */
|
|
30
9
|
export declare function suspendedReopenOf(ev: unknown): SuspendedReopenReading;
|
|
@@ -1,19 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* suspendedReopen — durable `suspended` 事件上 server 的**重开侧记键** `reopened` 的三态读口(0.74.3 CC-73;
|
|
3
|
-
* 契约 reopen 族段:`GET /v1/runs/{taskId}/events` 的 `suspended` 事件带 `reopened: <errorCode>`,「缺席 / null =
|
|
4
|
-
* 这次 park 不是重开」;sdk `events.d.ts` `reopened?: string | null`,普通挂起帧不带此键)。
|
|
5
|
-
*
|
|
6
|
-
* ── 🔴 为什么是三态而不是「是 / 不是」两态 ─────────────────────────────────────────────────
|
|
7
|
-
* 契约把「缺席」和「null」判成同一句话,但两者的**说话人不同**:`null` 是新 server 明说「不是重开」;键缺席既可能是
|
|
8
|
-
* 新 server 的普通挂起帧,也可能是根本没有这个键的老 server。把两者折成一个值,消费方就再也分不出「server 说了不是」
|
|
9
|
-
* 与「server 什么都没说」。读口把它们分开带出,消费方按契约把 `unstated` **当作**不是重开即可,但不替 server 说那句话。
|
|
10
|
-
*
|
|
11
|
-
* 码是**开集原词**(词表属主在 server:今天三员 `resume.env_failed` / `resume.tool_unavailable` /
|
|
12
|
-
* `resume.tool_contract_mismatch`,见 `engineErrorCodes.ts` `RESUME_REOPEN_CODES`),本读口不过滤;要文案的消费方拿码去查表。
|
|
13
|
-
*/
|
|
14
1
|
const UNSTATED = Object.freeze({ kind: 'unstated' });
|
|
15
2
|
const NOT_REOPENED = Object.freeze({ kind: 'not_reopened' });
|
|
16
|
-
/** 任意事件体 → 三态读数;非对象 / 坏形一律 `unstated`,永不抛。 */
|
|
17
3
|
export function suspendedReopenOf(ev) {
|
|
18
4
|
if (ev === null || typeof ev !== 'object' || Array.isArray(ev))
|
|
19
5
|
return UNSTATED;
|