@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.
- package/CHANGELOG.md +23 -1
- package/README.md +5 -4
- 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 +1 -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 +13 -358
- package/dist/hitl/persistedRulesWire.js +0 -310
- 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 +1 -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 +0 -249
- package/dist/request/taskRequest.js +10 -496
- 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 +11 -65
- package/dist/subagent/engineTaskHandleWire.js +20 -131
- 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 +62 -1
- package/package.json +1 -1
|
@@ -1,134 +1,29 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hitl/resumeRunningCard.ts — **resume 撞上「上一轮还在跑」**时那张三选卡的判定 / 选项集 / 文案
|
|
3
|
-
* (#265 上收件,2026-08-14;源形 = cli `src/sema/resumeRunningArm.ts` 的纯判定半场,编排腿留在端上)。
|
|
4
|
-
*
|
|
5
|
-
* ── 病与改形 ────────────────────────────────────────────────────────────────────────────────
|
|
6
|
-
* resume 时读到一条 `running` 的 run,旧形是**客户端自己**给它打一枪 cancel(动机 = 僵尸烧 token)。
|
|
7
|
-
* 矛盾:resume 时的 running run **不可判**是「用户要的在飞工作」还是「僵尸」—— 而实况里自动 cancel
|
|
8
|
-
* 恰好是错的方向(用户批准之后 run 该继续跑,resume 时 cancel = 把刚救活的 run 又杀了)。血统纪律:
|
|
9
|
-
* **破坏性动作恒不自动**。改形 = 把三条路交回用户:
|
|
10
|
-
* ① `Attach and watch` —— 接管为当前 turn 输出;
|
|
11
|
-
* ② `Cancel it` —— 那个动作降级为**用户按下**的选项;
|
|
12
|
-
* ③ `Leave it running in the background`(**默认焦点**)—— 零动作。
|
|
13
|
-
*
|
|
14
|
-
* ── §3.2a 活性证据的缺席纪律(不可削)──────────────────────────────────────────────────────
|
|
15
|
-
* 判活体的 `msSinceLastActivity`(相对毫秒)在场 ⇒ 卡上渲一行「last activity Ns ago」;
|
|
16
|
-
* **缺席 = 无法证明**(跨副本命中 / 副本重启后),不是「不活」—— 那一行**整行不渲**,绝不折成 0、
|
|
17
|
-
* 绝不写成「已死」。
|
|
18
|
-
*
|
|
19
|
-
* ── §3.2b 无 UI 臂:退役自动 cancel 之后不许留死墙 ──────────────────────────────────────────
|
|
20
|
-
* 「不自动 cancel + 没有卡可选」= 又一堵死墙。所以没有卡的形必须**显式定义臂**:恒不 cancel;
|
|
21
|
-
* 输出**机读三选指路**({@link resumeRunningNoUiGuidance},attach / cancel / 后台留着三条路各给
|
|
22
|
-
* 真实命令或 API 路径);headless 车道走**专码**退出({@link RESUME_RUNNING_NO_UI_EXIT_CODE});
|
|
23
|
-
* 绝不静默挂起、绝不谎报成功。
|
|
24
|
-
*
|
|
25
|
-
* ── 🔴 塌缩纪律 ─────────────────────────────────────────────────────────────────────────────
|
|
26
|
-
* Esc / 空答 / 认不出的自由文本 / 作答看门狗到点 / 呈卡失败 —— 一律收口成 ③(零动作)。
|
|
27
|
-
* 破坏性动作只认**逐字命中**的显式选择({@link resumeChoiceFromLabels})。
|
|
28
|
-
*
|
|
29
|
-
* ── 🔴 假 affordance 禁令(按供给渲)───────────────────────────────────────────────────────
|
|
30
|
-
* 一个按了没用的选项比没有这个选项更坏:durable `runs.events` 动词缺席**或**没有接管消费口 ⇒
|
|
31
|
-
* ① 整个不渲;`runs.cancel` 缺席 ⇒ ② 整个不渲;两条都缺 ⇒ 一张卡都不铸,走 §3.2b 臂。
|
|
32
|
-
*
|
|
33
|
-
* ── 归层 ────────────────────────────────────────────────────────────────────────────────────
|
|
34
|
-
* 本文件 = 纯判定 + 选项集 + 文案,**零 import**。呈卡口/动词切片/判活口/指路 sink/退出码应用口
|
|
35
|
-
* 全部由端在装配点注入;端只剩装配与呈现。
|
|
36
|
-
*/
|
|
37
|
-
/** ① 接管观看。 */
|
|
38
1
|
export declare const RESUME_CHOICE_ATTACH_LABEL = "Attach and watch";
|
|
39
|
-
/** ② 用户显式取消(自动 cancel 那个动作的降级形)。 */
|
|
40
2
|
export declare const RESUME_CHOICE_CANCEL_LABEL = "Cancel it";
|
|
41
|
-
/** ③ 后台留着 —— 🔴 **默认焦点**,所以它必须排在 options[0](见 {@link resumeRunningOptions})。 */
|
|
42
3
|
export declare const RESUME_CHOICE_BACKGROUND_LABEL = "Leave it running in the background";
|
|
43
|
-
/** 卡的 header(答案按 header 归键;本卡只有一问)。与 409 三选卡的入口刻意不同词 —— 同一张卡的
|
|
44
|
-
* 两个入口,题面说的不是一件事。 */
|
|
45
4
|
export declare const RESUME_CHOICE_HEADER = "Earlier run still in flight";
|
|
46
|
-
/** 用户在 resume 变体卡上的决定。 */
|
|
47
5
|
export type ResumeRunningChoice = 'attach' | 'cancel' | 'background';
|
|
48
|
-
/**
|
|
49
|
-
* 呈卡口的回执。🔴 `'unavailable'` 与 `'background'` **绝不合并**:前者 =「问都没问成」
|
|
50
|
-
* (§3.2b 臂的入口:用户还欠一次告知),后者 =「问过了,用户选了什么都不做」(已经告知过)。
|
|
51
|
-
* 合并的代价 = 一次呈现失败被静默当成用户的决定 —— 那正是 §3.2b 要封的死墙。
|
|
52
|
-
*/
|
|
53
6
|
export type ResumeChoiceOutcome = ResumeRunningChoice | 'unavailable';
|
|
54
|
-
/** 铸卡所需的全部材料(纯数据 —— 呈现层按它铸自己的卡/帧)。 */
|
|
55
7
|
export interface ResumeRunningCardInput {
|
|
56
|
-
/** 那条还在跑的 run。 */
|
|
57
8
|
taskId: string;
|
|
58
|
-
/** 引擎报的状态(如实转述,不加工)。 */
|
|
59
9
|
status: string;
|
|
60
|
-
/** ① 可渲吗(= durable events 动词在场 **且** 有接管消费口)。 */
|
|
61
10
|
canAttach: boolean;
|
|
62
|
-
/** ② 可渲吗(= `runs.cancel` 在场)。 */
|
|
63
11
|
canCancel: boolean;
|
|
64
|
-
/** §3.2a 活性证据(null = 引擎没给 ⇒ 无法证明 ⇒ 那一行整行不渲)。 */
|
|
65
12
|
msSinceLastActivity: number | null;
|
|
66
13
|
}
|
|
67
|
-
/** 一个选项(CC AskUserQuestionTool option 形)。 */
|
|
68
14
|
export interface ResumeRunningCardOption {
|
|
69
15
|
label: string;
|
|
70
16
|
description: string;
|
|
71
17
|
}
|
|
72
|
-
/**
|
|
73
|
-
* §3.2a 活性证据行。**缺席 ⇒ null(整行不渲)**;绝不渲 0、绝不渲「已死」。
|
|
74
|
-
* 负数 / 非有限值同样按缺席处理(wire 位 UNTRUSTED,类型说是 number 也要真判)。
|
|
75
|
-
*/
|
|
76
18
|
export declare function resumeRunningLivenessRow(msSinceLastActivity: number | null | undefined): string | null;
|
|
77
|
-
/**
|
|
78
|
-
* 卡的题面。第二行 = 活性证据(§3.2a 缺席时**整行消失**,不留占位、不留「unknown」字样 ——
|
|
79
|
-
* 一行「last activity: unknown」和一行 0 一样是在替引擎回答一个它没回答的问题)。
|
|
80
|
-
*/
|
|
81
19
|
export declare function resumeRunningQuestionText(i: ResumeRunningCardInput): string;
|
|
82
|
-
/**
|
|
83
|
-
* 选项集(同一张卡两个入口,选项集**按入口分形**)。
|
|
84
|
-
*
|
|
85
|
-
* 🔴 **顺序即默认焦点**:卡的渲染面 `focusedIndex` 初值恒 0,而 wire 的 `QuestionFrame` 里
|
|
86
|
-
* **没有**任何「默认焦点」位可传。所以「默认焦点 = ③ 后台留着」在结构上只有一个落法:把 ③ 排在
|
|
87
|
-
* options[0]。谁哪天为了「读起来顺」把 ①②③ 按序号排回去,默认焦点就漂到了 `Attach and watch`
|
|
88
|
-
* —— 一个手滑回车就把一条后台 run 接管到前台。常驻门逐位反钉这个顺序。
|
|
89
|
-
*/
|
|
90
20
|
export declare function resumeRunningOptions(i: ResumeRunningCardInput): ResumeRunningCardOption[];
|
|
91
|
-
/**
|
|
92
|
-
* 答案 → 决定。🔴 只认**逐字命中**的标签;空答(overlay 的 Esc/dismiss 形)、多选、认不出的
|
|
93
|
-
* 自由文本一律回落 ③ —— 破坏性动作只认显式选择(与 409 三选卡同律)。
|
|
94
|
-
*/
|
|
95
21
|
export declare function resumeChoiceFromLabels(selected: readonly string[] | null | undefined): ResumeRunningChoice;
|
|
96
|
-
/**
|
|
97
|
-
* headless 车道撞 resume-running 的**专码**退出码。
|
|
98
|
-
*
|
|
99
|
-
* 为什么非 0:这一趟 resume **没有**把会话交到一个可用状态 —— 那条 run 还占着会话,脚本接下来
|
|
100
|
-
* 提交什么都会撞 409。静默 0 = 谎报成功。
|
|
101
|
-
* 为什么是 75:sysexits.h 的 `EX_TEMPFAIL`(「暂时性失败,请稍后重试」)语义正对 —— run 跑完
|
|
102
|
-
* 或被取消之后同一条命令就能过;与 cli 既用的 0/1/2/129/143 零撞(脚本消费者据此可以把「会话被
|
|
103
|
-
* 在飞 run 占住」与「真失败(1)」「用法错(2)」分臂)。
|
|
104
|
-
*/
|
|
105
22
|
export declare const RESUME_RUNNING_NO_UI_EXIT_CODE = 75;
|
|
106
|
-
/** 机读指路的行首标识 —— 脚本按它 grep;UI 改版不许动它。 */
|
|
107
23
|
export declare const RESUME_RUNNING_GUIDANCE_TAG = "sema: resume-running:";
|
|
108
|
-
/**
|
|
109
|
-
* §3.2b 的**机读三选指路**。三条路各给真实命令或 API 路径,一条都不许省 ——
|
|
110
|
-
* 少写一条 = 那条路在这个车道上被客户端单方面关掉了。
|
|
111
|
-
*
|
|
112
|
-
* 🔴 `attach=` 那一行只有在**真知道 session id** 时才给具体命令:不知道还硬拼一条
|
|
113
|
-
* `sema --resume <sessionId>` 字面量,就是印一条按了没用的命令(假 affordance 的文本形)。
|
|
114
|
-
*/
|
|
115
24
|
export declare function resumeRunningNoUiGuidance(i: {
|
|
116
25
|
taskId: string;
|
|
117
26
|
sessionId?: string | null;
|
|
118
27
|
}): string;
|
|
119
|
-
/**
|
|
120
|
-
* ① 接管之前的**显式披露**。
|
|
121
|
-
*
|
|
122
|
-
* resume 入口没有 `lastEventId` 可用(端今天不持久化引擎事件锚),所以 durable 尾从这条 run 的
|
|
123
|
-
* 第一帧读起 —— 崩溃前已落盘、已被 resume 还原到屏上的那一段会再渲一遍。续听腿那道「无锚 × 已上屏
|
|
124
|
-
* ⇒ 不许从头续读」的门在这一格判不出来(它数的是**本条流**吐过几帧,resume 入口恒 0),所以不能
|
|
125
|
-
* 拿它当安全证明。处置 = 说在前面:静默复读会让用户以为模型把同一段活干了两遍。
|
|
126
|
-
*
|
|
127
|
-
* 🔴 **账目面同源**:同一次重放也会把这条 run 已经执行过的每一个 `turn_end` 再喂一次成本累计器。
|
|
128
|
-
* 客户端这一端证明不了哪一枚已经在恢复出来的总额里(那需要一本按 turn 落盘的账 —— 与缺席的
|
|
129
|
-
* 事件锚是同一件移交残件),所以接管腿声明**不计账**。既然不计,就必须在**同一行**说清楚:
|
|
130
|
-
* 只披露视觉复读、不披露账目缺口,用户拿成本面跟引擎账本对不上时只会怀疑客户端算错了。
|
|
131
|
-
*/
|
|
132
28
|
export declare function resumeAttachReplayDisclosure(taskId: string): string;
|
|
133
|
-
/** ② 打完 cancel 但引擎没确认落地时的如实一行(绝不谎报「已停止」)。 */
|
|
134
29
|
export declare function resumeRunningCancelUnconfirmedRow(taskId: string): string;
|
|
@@ -1,86 +1,22 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hitl/resumeRunningCard.ts — **resume 撞上「上一轮还在跑」**时那张三选卡的判定 / 选项集 / 文案
|
|
3
|
-
* (#265 上收件,2026-08-14;源形 = cli `src/sema/resumeRunningArm.ts` 的纯判定半场,编排腿留在端上)。
|
|
4
|
-
*
|
|
5
|
-
* ── 病与改形 ────────────────────────────────────────────────────────────────────────────────
|
|
6
|
-
* resume 时读到一条 `running` 的 run,旧形是**客户端自己**给它打一枪 cancel(动机 = 僵尸烧 token)。
|
|
7
|
-
* 矛盾:resume 时的 running run **不可判**是「用户要的在飞工作」还是「僵尸」—— 而实况里自动 cancel
|
|
8
|
-
* 恰好是错的方向(用户批准之后 run 该继续跑,resume 时 cancel = 把刚救活的 run 又杀了)。血统纪律:
|
|
9
|
-
* **破坏性动作恒不自动**。改形 = 把三条路交回用户:
|
|
10
|
-
* ① `Attach and watch` —— 接管为当前 turn 输出;
|
|
11
|
-
* ② `Cancel it` —— 那个动作降级为**用户按下**的选项;
|
|
12
|
-
* ③ `Leave it running in the background`(**默认焦点**)—— 零动作。
|
|
13
|
-
*
|
|
14
|
-
* ── §3.2a 活性证据的缺席纪律(不可削)──────────────────────────────────────────────────────
|
|
15
|
-
* 判活体的 `msSinceLastActivity`(相对毫秒)在场 ⇒ 卡上渲一行「last activity Ns ago」;
|
|
16
|
-
* **缺席 = 无法证明**(跨副本命中 / 副本重启后),不是「不活」—— 那一行**整行不渲**,绝不折成 0、
|
|
17
|
-
* 绝不写成「已死」。
|
|
18
|
-
*
|
|
19
|
-
* ── §3.2b 无 UI 臂:退役自动 cancel 之后不许留死墙 ──────────────────────────────────────────
|
|
20
|
-
* 「不自动 cancel + 没有卡可选」= 又一堵死墙。所以没有卡的形必须**显式定义臂**:恒不 cancel;
|
|
21
|
-
* 输出**机读三选指路**({@link resumeRunningNoUiGuidance},attach / cancel / 后台留着三条路各给
|
|
22
|
-
* 真实命令或 API 路径);headless 车道走**专码**退出({@link RESUME_RUNNING_NO_UI_EXIT_CODE});
|
|
23
|
-
* 绝不静默挂起、绝不谎报成功。
|
|
24
|
-
*
|
|
25
|
-
* ── 🔴 塌缩纪律 ─────────────────────────────────────────────────────────────────────────────
|
|
26
|
-
* Esc / 空答 / 认不出的自由文本 / 作答看门狗到点 / 呈卡失败 —— 一律收口成 ③(零动作)。
|
|
27
|
-
* 破坏性动作只认**逐字命中**的显式选择({@link resumeChoiceFromLabels})。
|
|
28
|
-
*
|
|
29
|
-
* ── 🔴 假 affordance 禁令(按供给渲)───────────────────────────────────────────────────────
|
|
30
|
-
* 一个按了没用的选项比没有这个选项更坏:durable `runs.events` 动词缺席**或**没有接管消费口 ⇒
|
|
31
|
-
* ① 整个不渲;`runs.cancel` 缺席 ⇒ ② 整个不渲;两条都缺 ⇒ 一张卡都不铸,走 §3.2b 臂。
|
|
32
|
-
*
|
|
33
|
-
* ── 归层 ────────────────────────────────────────────────────────────────────────────────────
|
|
34
|
-
* 本文件 = 纯判定 + 选项集 + 文案,**零 import**。呈卡口/动词切片/判活口/指路 sink/退出码应用口
|
|
35
|
-
* 全部由端在装配点注入;端只剩装配与呈现。
|
|
36
|
-
*/
|
|
37
|
-
// ── 逐字契约面(答案按 label 原样回声 —— 引擎的 `selected ⊆ options` 围栏,漂一个字节即失灵)──
|
|
38
|
-
/** ① 接管观看。 */
|
|
39
1
|
export const RESUME_CHOICE_ATTACH_LABEL = 'Attach and watch';
|
|
40
|
-
/** ② 用户显式取消(自动 cancel 那个动作的降级形)。 */
|
|
41
2
|
export const RESUME_CHOICE_CANCEL_LABEL = 'Cancel it';
|
|
42
|
-
/** ③ 后台留着 —— 🔴 **默认焦点**,所以它必须排在 options[0](见 {@link resumeRunningOptions})。 */
|
|
43
3
|
export const RESUME_CHOICE_BACKGROUND_LABEL = 'Leave it running in the background';
|
|
44
|
-
/** 卡的 header(答案按 header 归键;本卡只有一问)。与 409 三选卡的入口刻意不同词 —— 同一张卡的
|
|
45
|
-
* 两个入口,题面说的不是一件事。 */
|
|
46
4
|
export const RESUME_CHOICE_HEADER = 'Earlier run still in flight';
|
|
47
|
-
/**
|
|
48
|
-
* §3.2a 活性证据行。**缺席 ⇒ null(整行不渲)**;绝不渲 0、绝不渲「已死」。
|
|
49
|
-
* 负数 / 非有限值同样按缺席处理(wire 位 UNTRUSTED,类型说是 number 也要真判)。
|
|
50
|
-
*/
|
|
51
5
|
export function resumeRunningLivenessRow(msSinceLastActivity) {
|
|
52
6
|
const ms = msSinceLastActivity;
|
|
53
7
|
if (typeof ms !== 'number' || !Number.isFinite(ms) || ms < 0)
|
|
54
8
|
return null;
|
|
55
9
|
return `The engine last recorded activity on it ${String(Math.round(ms / 1000))}s ago.`;
|
|
56
10
|
}
|
|
57
|
-
/**
|
|
58
|
-
* 卡的题面。第二行 = 活性证据(§3.2a 缺席时**整行消失**,不留占位、不留「unknown」字样 ——
|
|
59
|
-
* 一行「last activity: unknown」和一行 0 一样是在替引擎回答一个它没回答的问题)。
|
|
60
|
-
*/
|
|
61
11
|
export function resumeRunningQuestionText(i) {
|
|
62
12
|
const head = `This conversation was resumed while an earlier turn is still executing on the engine ` +
|
|
63
13
|
`(run ${i.taskId}, status ${i.status}). sema did not touch it. What should it do?`;
|
|
64
14
|
const liveness = resumeRunningLivenessRow(i.msSinceLastActivity);
|
|
65
15
|
return liveness === null ? head : `${head}\n${liveness}`;
|
|
66
16
|
}
|
|
67
|
-
/**
|
|
68
|
-
* 选项集(同一张卡两个入口,选项集**按入口分形**)。
|
|
69
|
-
*
|
|
70
|
-
* 🔴 **顺序即默认焦点**:卡的渲染面 `focusedIndex` 初值恒 0,而 wire 的 `QuestionFrame` 里
|
|
71
|
-
* **没有**任何「默认焦点」位可传。所以「默认焦点 = ③ 后台留着」在结构上只有一个落法:把 ③ 排在
|
|
72
|
-
* options[0]。谁哪天为了「读起来顺」把 ①②③ 按序号排回去,默认焦点就漂到了 `Attach and watch`
|
|
73
|
-
* —— 一个手滑回车就把一条后台 run 接管到前台。常驻门逐位反钉这个顺序。
|
|
74
|
-
*/
|
|
75
17
|
export function resumeRunningOptions(i) {
|
|
76
18
|
const options = [
|
|
77
19
|
{
|
|
78
|
-
// 🔴 默认焦点 —— 三条路里唯一零副作用的一条,所以它是手滑回车的落点。
|
|
79
|
-
// 🔴 措辞:这一项**不许**承诺「它会留在某个任务面板里」—— 这张卡的前提恰恰是「那条 run 活得
|
|
80
|
-
// 比上一个客户端进程久」,新进程里没有任何腿会为它建行(③ 的处置本身也是显式零动作)。
|
|
81
|
-
// 默认焦点上的一句假 affordance 是最坏的一格:手滑回车的人拿到一条既看不见、也停不掉、
|
|
82
|
-
// 还占着会话锁的 run。换成两句**可证的**真话:本屏不会列出它;它还占着会话,所以下一条
|
|
83
|
-
// 消息会再撞上它(那时 409 三选卡会带着 steer/cancel 两条真出路出现)。
|
|
84
20
|
label: RESUME_CHOICE_BACKGROUND_LABEL,
|
|
85
21
|
description: 'Leaves the run alone. It keeps executing on the engine, but this screen will not show it and it will not be listed here — your next message runs into it again, and sema asks you then.',
|
|
86
22
|
},
|
|
@@ -88,10 +24,6 @@ export function resumeRunningOptions(i) {
|
|
|
88
24
|
if (i.canAttach) {
|
|
89
25
|
options.push({
|
|
90
26
|
label: RESUME_CHOICE_ATTACH_LABEL,
|
|
91
|
-
// 🔴 第二句是**知情同意**那一半(见 {@link resumeAttachReplayDisclosure}):resume 入口没有
|
|
92
|
-
// 事件锚可用,durable 尾只能从这条 run 的第一帧读起,所以崩溃前已经落盘并被 resume 还原到
|
|
93
|
-
// 屏上的那一段会再出现一次。用户按下之前就得看见这句 —— 一个会做出用户没预料到的事的
|
|
94
|
-
// 选项,和一个按了没用的选项同样是假 affordance。
|
|
95
27
|
description: 'Follows that run from here: sema replays it from the engine ledger and keeps streaming it into this conversation. ' +
|
|
96
28
|
'Anything from that turn already shown above will appear a second time — sema has no resume marker for it.',
|
|
97
29
|
});
|
|
@@ -104,10 +36,6 @@ export function resumeRunningOptions(i) {
|
|
|
104
36
|
}
|
|
105
37
|
return options;
|
|
106
38
|
}
|
|
107
|
-
/**
|
|
108
|
-
* 答案 → 决定。🔴 只认**逐字命中**的标签;空答(overlay 的 Esc/dismiss 形)、多选、认不出的
|
|
109
|
-
* 自由文本一律回落 ③ —— 破坏性动作只认显式选择(与 409 三选卡同律)。
|
|
110
|
-
*/
|
|
111
39
|
export function resumeChoiceFromLabels(selected) {
|
|
112
40
|
if (!Array.isArray(selected) || selected.length !== 1)
|
|
113
41
|
return 'background';
|
|
@@ -118,26 +46,8 @@ export function resumeChoiceFromLabels(selected) {
|
|
|
118
46
|
return 'cancel';
|
|
119
47
|
return 'background';
|
|
120
48
|
}
|
|
121
|
-
// ── §3.2b 无 UI 臂 ───────────────────────────────────────────────────────────────────────────
|
|
122
|
-
/**
|
|
123
|
-
* headless 车道撞 resume-running 的**专码**退出码。
|
|
124
|
-
*
|
|
125
|
-
* 为什么非 0:这一趟 resume **没有**把会话交到一个可用状态 —— 那条 run 还占着会话,脚本接下来
|
|
126
|
-
* 提交什么都会撞 409。静默 0 = 谎报成功。
|
|
127
|
-
* 为什么是 75:sysexits.h 的 `EX_TEMPFAIL`(「暂时性失败,请稍后重试」)语义正对 —— run 跑完
|
|
128
|
-
* 或被取消之后同一条命令就能过;与 cli 既用的 0/1/2/129/143 零撞(脚本消费者据此可以把「会话被
|
|
129
|
-
* 在飞 run 占住」与「真失败(1)」「用法错(2)」分臂)。
|
|
130
|
-
*/
|
|
131
49
|
export const RESUME_RUNNING_NO_UI_EXIT_CODE = 75;
|
|
132
|
-
/** 机读指路的行首标识 —— 脚本按它 grep;UI 改版不许动它。 */
|
|
133
50
|
export const RESUME_RUNNING_GUIDANCE_TAG = 'sema: resume-running:';
|
|
134
|
-
/**
|
|
135
|
-
* §3.2b 的**机读三选指路**。三条路各给真实命令或 API 路径,一条都不许省 ——
|
|
136
|
-
* 少写一条 = 那条路在这个车道上被客户端单方面关掉了。
|
|
137
|
-
*
|
|
138
|
-
* 🔴 `attach=` 那一行只有在**真知道 session id** 时才给具体命令:不知道还硬拼一条
|
|
139
|
-
* `sema --resume <sessionId>` 字面量,就是印一条按了没用的命令(假 affordance 的文本形)。
|
|
140
|
-
*/
|
|
141
51
|
export function resumeRunningNoUiGuidance(i) {
|
|
142
52
|
const sid = typeof i.sessionId === 'string' && i.sessionId.length > 0 ? i.sessionId : null;
|
|
143
53
|
const attach = sid === null ? 'sema --resume (pick this session from the list)' : `sema --resume ${sid}`;
|
|
@@ -146,30 +56,15 @@ export function resumeRunningNoUiGuidance(i) {
|
|
|
146
56
|
`${T} run ${i.taskId} from an earlier turn is still executing on the engine, and this lane has no card to ask you on. sema did NOT cancel it and did NOT attach to it.`,
|
|
147
57
|
`${T} attach=${attach}`,
|
|
148
58
|
`${T} cancel=POST /v1/runs/${i.taskId}/cancel`,
|
|
149
|
-
// 🔴 这条车道连 REPL 都不挂载,更没有任何本地面板可看。给的是引擎侧真读面。
|
|
150
59
|
`${T} background=do nothing — run ${i.taskId} keeps executing on the engine; this client does not list it (read it with GET /v1/runs/${i.taskId})`,
|
|
151
60
|
].join('\n');
|
|
152
61
|
}
|
|
153
|
-
/**
|
|
154
|
-
* ① 接管之前的**显式披露**。
|
|
155
|
-
*
|
|
156
|
-
* resume 入口没有 `lastEventId` 可用(端今天不持久化引擎事件锚),所以 durable 尾从这条 run 的
|
|
157
|
-
* 第一帧读起 —— 崩溃前已落盘、已被 resume 还原到屏上的那一段会再渲一遍。续听腿那道「无锚 × 已上屏
|
|
158
|
-
* ⇒ 不许从头续读」的门在这一格判不出来(它数的是**本条流**吐过几帧,resume 入口恒 0),所以不能
|
|
159
|
-
* 拿它当安全证明。处置 = 说在前面:静默复读会让用户以为模型把同一段活干了两遍。
|
|
160
|
-
*
|
|
161
|
-
* 🔴 **账目面同源**:同一次重放也会把这条 run 已经执行过的每一个 `turn_end` 再喂一次成本累计器。
|
|
162
|
-
* 客户端这一端证明不了哪一枚已经在恢复出来的总额里(那需要一本按 turn 落盘的账 —— 与缺席的
|
|
163
|
-
* 事件锚是同一件移交残件),所以接管腿声明**不计账**。既然不计,就必须在**同一行**说清楚:
|
|
164
|
-
* 只披露视觉复读、不披露账目缺口,用户拿成本面跟引擎账本对不上时只会怀疑客户端算错了。
|
|
165
|
-
*/
|
|
166
62
|
export function resumeAttachReplayDisclosure(taskId) {
|
|
167
63
|
return (`sema: attaching to run ${taskId} — sema is replaying it from the engine's ledger, so anything from that ` +
|
|
168
64
|
`turn already shown above will appear again below. There is no resume marker for a run that outlived its shell. ` +
|
|
169
65
|
`The replayed turns are not billed into this session's cost again either — the engine's own record ` +
|
|
170
66
|
`(GET /v1/runs/${taskId}) is the authority on what that run really spent.`);
|
|
171
67
|
}
|
|
172
|
-
/** ② 打完 cancel 但引擎没确认落地时的如实一行(绝不谎报「已停止」)。 */
|
|
173
68
|
export function resumeRunningCancelUnconfirmedRow(taskId) {
|
|
174
69
|
return (`sema: the cancel for run ${taskId} did not come back confirmed, so that run may still be executing. ` +
|
|
175
70
|
`This screen does not list it — read its real state on the engine (GET /v1/runs/${taskId}) before ` +
|
|
@@ -1,62 +1,5 @@
|
|
|
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 type { SessionPermissionRules, StoredSessionRules } from '@sema-agent/sdk';
|
|
52
2
|
import type { SessionPolicyReading } from '../sessionPolicyCapability.js';
|
|
53
|
-
/**
|
|
54
|
-
* 本面消费的客户端切片(注入缝:宿主给真 facade,测试给假件)。
|
|
55
|
-
* 🔴 两只动词的入参与回体型**逐字取自引擎的 wire 型面**(`SessionPermissionRules` / `StoredSessionRules`),
|
|
56
|
-
* 本包不自铸同名形 —— 这同时是一条编译期见证:真客户端上那一对动词若改了签名,这里当场编译红。
|
|
57
|
-
* 🔴 **声明形不是运行期保证**:传输层只把回体解出来,不做运行期校验。所以拿到 200 之后照样走
|
|
58
|
-
* 结构窄读(承重键是版本号与五只桶),与列举腿对页体的处置同律。
|
|
59
|
-
*/
|
|
60
3
|
export interface SessionPolicyFacade {
|
|
61
4
|
getPolicy(sessionId: string, opts?: {
|
|
62
5
|
signal?: AbortSignal;
|
|
@@ -72,89 +15,40 @@ export interface SessionPolicyFacade {
|
|
|
72
15
|
rules: StoredSessionRules;
|
|
73
16
|
}>;
|
|
74
17
|
}
|
|
75
|
-
/**
|
|
76
|
-
* 规则记录的桶名全集。**派生自上表**,不是另一份手抄件。
|
|
77
|
-
* 🔴 形制:`Object.freeze` 的数组,**不是**只在类型面只读的 `readonly T[]` —— 后者一行 `.splice()` 就能改,
|
|
78
|
-
* 而公面消费者拿到的正是这个实例。
|
|
79
|
-
*/
|
|
80
18
|
export declare const SESSION_POLICY_RULE_FIELDS: readonly (keyof SessionPermissionRules)[];
|
|
81
|
-
|
|
82
|
-
* 本面失败的**处置分类**(不是成因分类)。结构读 `status` + `errorCode`,不 `instanceof`。
|
|
83
|
-
* 🔴 两个 409 是**两种相反的处置**:乐观并发不符(重读重写有意义)与「这条会话没有属主」
|
|
84
|
-
* (重试多少次都一样,记录键根本立不住)。只按状态分会把后者喂进重试腿。
|
|
85
|
-
*/
|
|
86
|
-
export type SessionPolicyFailure =
|
|
87
|
-
/** 这台部署没有会话规则店(整面藏起来)。 */
|
|
88
|
-
{
|
|
19
|
+
export type SessionPolicyFailure = {
|
|
89
20
|
kind: 'face-unavailable';
|
|
90
21
|
message: string;
|
|
91
|
-
}
|
|
92
|
-
/** 放宽方向被拒。**原样上报**,不吞不重试 —— 判据在引擎,本包不复述。 */
|
|
93
|
-
| {
|
|
22
|
+
} | {
|
|
94
23
|
kind: 'loosen-forbidden';
|
|
95
24
|
message: string;
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* 规则店读不出这条记录的存活标记,于是**拒绝**盖一个证明不了的版本号。
|
|
99
|
-
* 🔴 它与放宽被拒**同一个状态码**、不同的机器码 —— 折进放宽那一臂会让人去改自己送的条目,而条目一个字都没错。
|
|
100
|
-
*/
|
|
101
|
-
| {
|
|
25
|
+
} | {
|
|
102
26
|
kind: 'store-corrupt';
|
|
103
27
|
message: string;
|
|
104
|
-
}
|
|
105
|
-
/** 乐观并发键不符:记录在本次读与本次写之间被别人推进过。 */
|
|
106
|
-
| {
|
|
28
|
+
} | {
|
|
107
29
|
kind: 'cas-conflict';
|
|
108
30
|
message: string;
|
|
109
|
-
}
|
|
110
|
-
/** 这条会话没有属主 ⇒ 记录键立不住,引擎拒绝存一条永远读不回来的规则。**不是**可重试的并发冲突。 */
|
|
111
|
-
| {
|
|
31
|
+
} | {
|
|
112
32
|
kind: 'session-ownerless';
|
|
113
33
|
message: string;
|
|
114
|
-
}
|
|
115
|
-
/** 没有这条会话 —— **禁按成因分支**:不存在与不是你的在这条面上同码同串(设计如此,不给存在性预言机)。 */
|
|
116
|
-
| {
|
|
34
|
+
} | {
|
|
117
35
|
kind: 'session-not-found';
|
|
118
36
|
message: string;
|
|
119
|
-
}
|
|
120
|
-
/** 请求体被判形不合法(重发同一份没有意义,改了再发)。 */
|
|
121
|
-
| {
|
|
37
|
+
} | {
|
|
122
38
|
kind: 'request-rejected';
|
|
123
39
|
message: string;
|
|
124
|
-
}
|
|
125
|
-
/** 这次调用带不到可验明的身份。 */
|
|
126
|
-
| {
|
|
40
|
+
} | {
|
|
127
41
|
kind: 'unauthorized';
|
|
128
42
|
message: string;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* 引擎**答了**(带着它的机器码),答的是一个本面没有具名臂的客户端侧拒绝(4xx)。这条口上引擎发出的 4xx
|
|
132
|
-
* 都在落盘**之前**(方向门与并发键都是「拒而不写」),所以这一臂可以说「什么都没写」。
|
|
133
|
-
*/
|
|
134
|
-
| {
|
|
43
|
+
} | {
|
|
135
44
|
kind: 'error';
|
|
136
45
|
message: string;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* 🔴 **引擎的裁决没到手**:裸抛 / 断连 / 超时 / 回体解不开 / 5xx / **没带机器码的 4xx**。
|
|
140
|
-
* 最后一种是出处问题:引擎的错误信封**恒带机器码**(服务端只有一只错误信封写法,兜底站点也按状态补一枚粗码),
|
|
141
|
-
* 所以一个没有码的 405 / 409 / 404 证明不了是引擎在答 —— 反代 / 网关拦下这次写回一页 HTML 就是这个形,
|
|
142
|
-
* 而那时引擎**可能已经落盘**。这一臂**不许**说成「没送到」:传输层在读回体时抛出的那一下可能发生在服务端
|
|
143
|
-
* 已经落盘之后,5xx 同理(提交成功而回程失败)。唯一诚实的话是「不知道,先重读」。
|
|
144
|
-
*/
|
|
145
|
-
| {
|
|
46
|
+
} | {
|
|
146
47
|
kind: 'no-verdict';
|
|
147
48
|
message: string;
|
|
148
49
|
};
|
|
149
|
-
/**
|
|
150
|
-
* 抛出来的东西 → 处置分类。
|
|
151
|
-
* 🔴 **并发冲突按机器码逐字认,不按 409 状态认**:同一个 409 上骑着两个码(并发不符 / 会话无属主),
|
|
152
|
-
* 而后者重试多少次都是同一个答案。没带码的 409 一律落通用臂 —— 猜一个码去重试,代价是无穷重试。
|
|
153
|
-
*/
|
|
154
50
|
export declare function classifySessionPolicyFailure(e: unknown): SessionPolicyFailure;
|
|
155
|
-
/** 读不懂的三种位置。🔴 三者都是「读不懂」,**不是**「空策略」。 */
|
|
156
51
|
export type SessionPolicyMalformedWhy = 'envelope' | 'rev' | 'rule_field';
|
|
157
|
-
/** 一次读的结局。`present` 的 `rules` 恒是**已窄化的副本**(调用方改它不串味到别处)。 */
|
|
158
52
|
export type SessionPolicyReadOutcome = {
|
|
159
53
|
kind: 'present';
|
|
160
54
|
rev: number;
|
|
@@ -167,73 +61,17 @@ export type SessionPolicyReadOutcome = {
|
|
|
167
61
|
kind: 'failed';
|
|
168
62
|
failure: SessionPolicyFailure;
|
|
169
63
|
};
|
|
170
|
-
/**
|
|
171
|
-
* 读这条会话当前的规则记录。
|
|
172
|
-
* 🔴 记录**真的空**(一只桶都没有、版本号 0)是这台引擎对「还没写过策略的会话」的诚实答案,
|
|
173
|
-
* 它与「读不懂」是两个结局;调用方据此知道下一次写该带哪一个版本号。
|
|
174
|
-
*/
|
|
175
64
|
export declare function readSessionPolicy(facade: SessionPolicyFacade, sessionId: string, opts?: {
|
|
176
65
|
signal?: AbortSignal;
|
|
177
66
|
}): Promise<SessionPolicyReadOutcome>;
|
|
178
|
-
/**
|
|
179
|
-
* 「已有 ∪ 新增」。**只加不减**:旧记录的每一只桶、每一条条目都原样留在结果里(在场的空桶保留成空桶),
|
|
180
|
-
* 新增的条目逐字去重后接在后面。两边都没有的桶**不铸**(凭空铸一只空桶 = 凭空加一条限制)。
|
|
181
|
-
* 🔴 条目字节原样搬运:不 trim、不规范化路径、不排序 —— 那些都是引擎的判据,壳再做一遍就是第二份。
|
|
182
|
-
*/
|
|
183
67
|
export declare function tightenedSessionRules(prior: SessionPermissionRules, add: SessionPermissionRules): SessionPermissionRules;
|
|
184
|
-
/** {@link tightenSessionPolicy} 的入参。 */
|
|
185
68
|
export interface SessionPolicyTightenRequest {
|
|
186
69
|
sessionId: string;
|
|
187
|
-
/** 要追加的限制(本编排把它并进已有记录后整份回写)。 */
|
|
188
70
|
add: SessionPermissionRules;
|
|
189
|
-
/**
|
|
190
|
-
* 本次编排对能力位的读数。**必填** —— 缺省读锚在多引擎宿主上会静默换成「随便哪台已装引擎」的答案,
|
|
191
|
-
* 而这一步要决定的是**动不动网络**。由调用方显式给,判官只有这一个。
|
|
192
|
-
*/
|
|
193
71
|
capability: SessionPolicyReading;
|
|
194
72
|
}
|
|
195
|
-
|
|
196
|
-
export type SessionPolicyTightenUnknownWhy =
|
|
197
|
-
/** 这台部署没有会话规则店(读腿就这么答了)。 */
|
|
198
|
-
'face_unavailable'
|
|
199
|
-
/** 没有这条会话(不存在与不是你的同码同串)。 */
|
|
200
|
-
| 'session_not_found'
|
|
201
|
-
/** 这条会话没有属主 ⇒ 记录键立不住。 */
|
|
202
|
-
| 'session_ownerless'
|
|
203
|
-
/** 这次调用带不到可验明的身份。 */
|
|
204
|
-
| 'unauthorized'
|
|
205
|
-
/** 提交体被判形不合法(改了再发)。 */
|
|
206
|
-
| 'request_rejected'
|
|
207
|
-
/** 规则店拒绝盖一个证明不了的版本号(与放宽被拒同状态码不同机器码);送出去的条目没有问题。 */
|
|
208
|
-
| 'store_corrupt'
|
|
209
|
-
/** 当前记录读不懂 ⇒ **不许**当成空记录整份覆盖。 */
|
|
210
|
-
| 'read_unreadable'
|
|
211
|
-
/** 读腿以别的方式失败(读没有副作用,所以这一臂照样意味着什么都没写)。 */
|
|
212
|
-
| 'read_failed'
|
|
213
|
-
/** 写腿被引擎**带码答复**拒绝(引擎的客户端侧 4xx 都在落盘之前发出)⇒ 什么都没写。 */
|
|
214
|
-
| 'write_refused'
|
|
215
|
-
/** 🔴 写腿**没拿到引擎的裁决**(裸抛 / 断连 / 超时 / 回体解不开 / 5xx / 没带机器码的 4xx)⇒ 可能已经生效,绝不说成「没送到」。 */
|
|
216
|
-
| 'write_indeterminate'
|
|
217
|
-
/** 🔴 写回执读不懂:那一次**可能真的落了盘**,所以既不是 `written` 也不是「没写」。 */
|
|
218
|
-
| 'write_receipt_unreadable'
|
|
219
|
-
/**
|
|
220
|
-
* 🔴 写回执读得懂,但它**证明不了这一次提交落了盘**:版本号没有推进、或送出去的桶 / 条目不在回执里。
|
|
221
|
-
* 与上一臂同一处置(可能已生效,先重读);分开一格是因为「回执说的不是这次」与「回执读不懂」要不同的排查方向。
|
|
222
|
-
*/
|
|
223
|
-
| 'write_receipt_mismatch';
|
|
224
|
-
/** 成因闭集的运行期镜像(冻结)。 */
|
|
73
|
+
export type SessionPolicyTightenUnknownWhy = 'face_unavailable' | 'session_not_found' | 'session_ownerless' | 'unauthorized' | 'request_rejected' | 'store_corrupt' | 'read_unreadable' | 'read_failed' | 'write_refused' | 'write_indeterminate' | 'write_receipt_unreadable' | 'write_receipt_mismatch';
|
|
225
74
|
export declare const SESSION_POLICY_TIGHTEN_UNKNOWN_WHY: readonly SessionPolicyTightenUnknownWhy[];
|
|
226
|
-
/**
|
|
227
|
-
* 一次收紧的结局。**判别联合**,五臂互斥:
|
|
228
|
-
* · `written` —— 引擎回了一份读得懂的回执,`rev` 是记录的新版本号(下一次写的并发键)。
|
|
229
|
-
* 🔴 它说的是「记录现在等于原有的加上送来的」,**不是**「这条会话变严了」——方向的判官只有引擎,
|
|
230
|
-
* 而引擎对运维身份不设方向门(见头注);措辞一个字都不承诺方向;
|
|
231
|
-
* · `conflict` —— 重读重写过**一次**之后仍被并发键挡住;`rev` = 本次写所依据的那个版本号
|
|
232
|
-
* (按定义它在被拒的那一刻就已经过期,调用方要么重新走一遍,要么把这件事交给人);
|
|
233
|
-
* · `loosen_forbidden` —— 放宽方向被拒。**不吞不重试**(重试同一份永远同一个答案);
|
|
234
|
-
* · `capability_absent` —— 引擎明说没有这一面、或这份二进制比这一位还老 ⇒ **一个请求都没发**;
|
|
235
|
-
* · `unknown` —— 其余一切。🔴 `unknown` 绝不带 `rev`,也绝不被读成「已写」。
|
|
236
|
-
*/
|
|
237
75
|
export type SessionPolicyTightenOutcome = {
|
|
238
76
|
kind: 'written';
|
|
239
77
|
rev: number;
|
|
@@ -251,25 +89,7 @@ export type SessionPolicyTightenOutcome = {
|
|
|
251
89
|
why: SessionPolicyTightenUnknownWhy;
|
|
252
90
|
message?: string;
|
|
253
91
|
};
|
|
254
|
-
/**
|
|
255
|
-
* 给这条会话**追加**一组限制:读当前记录 → 「已有 ∪ 新增」→ 带当前版本号整份回写。
|
|
256
|
-
*
|
|
257
|
-
* 🔴 **只重读重写一次**(结构上,不靠计数器:本函数里没有循环)。撞上并发键说明有别的写者在同一条
|
|
258
|
-
* 会话上推进了记录;重来一趟是为了把对方刚写进去的限制也一并带上(并集只加不减,所以重来是**收敛**的)。
|
|
259
|
-
* 第二趟仍撞 ⇒ 如实上报 `conflict`:第三趟不比第二趟更有理由成功,而一个自己会无限重试的写腿在争用下
|
|
260
|
-
* 会把一条会话的规则记录变成两个写者的角力场。
|
|
261
|
-
* 🔴 能力位明说没有这一面(或这份二进制比这一位还老)⇒ **一个请求都不发**;从没观测过 ⇒ **照发** ——
|
|
262
|
-
* 「本进程没探过能力面」是本进程的缺陷,不是引擎的否定,把它当否定会让一次用户已经点过的动作凭空落空。
|
|
263
|
-
* 那两条的分家写在 `sessionPolicyFaceAvailable` 的头注里(渲不渲入口 vs 动不动网络是两个问题)。
|
|
264
|
-
*/
|
|
265
92
|
export declare function tightenSessionPolicy(facade: SessionPolicyFacade, req: SessionPolicyTightenRequest, opts?: {
|
|
266
93
|
signal?: AbortSignal;
|
|
267
94
|
}): Promise<SessionPolicyTightenOutcome>;
|
|
268
|
-
/**
|
|
269
|
-
* 一次收紧结局的人话,**唯一措辞真源**。
|
|
270
|
-
* 🔴 三条不许说反:① 放宽被拒那一句要指向「送出去的那组条目里有放宽方向的」,不许说成引擎坏了或没权限;
|
|
271
|
-
* ② 并发那一句要说「记录又被别人动了」并把下一步交出去,不许说成已写;③ 回执读不懂那一句**必须**
|
|
272
|
-
* 说「可能已经生效」——把它说成失败,人会再写一遍,而那一遍会把已经生效的那条当成新增重发。
|
|
273
|
-
* 生效时机只说「下一道工具门」,不承诺打断正在跑的那一步。
|
|
274
|
-
*/
|
|
275
95
|
export declare function sessionPolicyTightenNotice(outcome: SessionPolicyTightenOutcome): string;
|