@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,173 +1,25 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* interactiveHalt — 交互 **Esc** 的停止判定层(#363 件③,0.47.0;三端公共判定上收)。
|
|
3
|
-
*
|
|
4
|
-
* ── 收的是哪一件事 ────────────────────────────────────────────────────────────────────────
|
|
5
|
-
* 「用户按 Esc ⇒ 先发 **turn 级 halt**;升级成 **run 级 cancel** 恰有**三格**:
|
|
6
|
-
* ① 引擎自己回了升级闭集里的 **409**(它在说「这里没有在飞 turn 可切,run 级停止请用 cancel」);
|
|
7
|
-
* ② 这一发**连判决都没拿到**(传输失败/超时/未武装)**且**屏上确实挂着审批卡(`parked`);
|
|
8
|
-
* ③ 这一发连判决都没拿到 **且** 这条 run 武装了 **detach**(断连不再收 run,0.62.0 新格)。
|
|
9
|
-
* 其余一律不升级。」—— 这条判定 TUI / desktop / web **三端都要**(三端都会 Esc、都会撞
|
|
10
|
-
* 同一个 parked 格),此前整条住在 cli 壳里(`src/sema/seamQuery.ts` 的 `bestEffortInteractiveHalt`
|
|
11
|
-
* + `src/sema/interruptWire.ts` 的 `needsRunLevelStop`)。本模块把**判据**搬进来;
|
|
12
|
-
* **发射**(裸 fetch / SDK verb)、台账、留痕、UI 反馈仍归各端。
|
|
13
|
-
* ⚠️ 别把①漏掉(异源复审 [medium] 采纳的原文歧义):只写「拿不到判决且 parked 才升级」的话,
|
|
14
|
-
* 端会漏接**引擎明确指路**那一格 —— parked run 的会话锁不放,下一条消息照样撞「Session busy」。
|
|
15
|
-
*
|
|
16
|
-
* ── 两个动词各自唯一能做到的格(**cancel 绝不删**,本模块存在的前提)──────────────────────
|
|
17
|
-
* · `interrupt`(turn 级,bare 形 = core `stream.halt()`「切 + 停」)—— 需要一条**活的、在飞的
|
|
18
|
-
* turn**。这是 Esc 的正题:切掉这一轮,run 在边界上终局、同 session 下一 submit 照常续。
|
|
19
|
-
* · `cancel`(run 级)—— 显式整 run 终局手势,而且它是**唯一**能把一条停在审批门上的
|
|
20
|
-
* `suspended`/`needs_review` run 就地终态化、把会话锁放开的动词(server [868] 起的语义)。
|
|
21
|
-
* ⇒ 无条件把 cancel 换成 interrupt = 审批卡挂着按 Esc 的主场景当场回归成「Session busy」病;
|
|
22
|
-
* 无条件补 cancel = 同一条 run 上别的在飞工具(后台 bash 等)被连坐拆掉(#324 的病形)。
|
|
23
|
-
* 本判定就是这两条之间那道**不对称**的闸。
|
|
24
|
-
*
|
|
25
|
-
* ── 🔴 不对称是刻意的(方向安全,两条代价不等价)────────────────────────────────────────
|
|
26
|
-
* 判**不**升级的代价 = 用户退回既有的「Session busy」卡,自己再选一次(**可恢复**);
|
|
27
|
-
* 判**错**升级的代价 = 拆掉一条其实还活着的 run,连坐它身上所有在飞工具(**不可恢复**)。
|
|
28
|
-
* ⇒ 闸往严的一侧设,宁可少升一次;凡「证不出来」一律落**不升级**侧。
|
|
29
|
-
*
|
|
30
|
-
* ── 判据锚在哪 ────────────────────────────────────────────────────────────────────────────
|
|
31
|
-
* · 升级的**第一判据 = 引擎自己的机器码**({@link RUN_LEVEL_STOP_ERROR_CODES} × 409),
|
|
32
|
-
* 不是壳对 UI 状态的猜测([anchor-on-the-deciding-quantity]);
|
|
33
|
-
* · 只有当**引擎连判决都没给**(传输失败/超时/根本没武装)时,才轮到壳自己独立知道的那个
|
|
34
|
-
* 事实(`parked` = 这一拍屏上确实挂着审批卡 ⇒ 那条 run 停在 pending 决断上 ⇒ 本来就没有
|
|
35
|
-
* 在飞 turn 可切 ⇒ 补 cancel 不构成连坐)。
|
|
36
|
-
*
|
|
37
|
-
* 🔴 **纯判定**:零 IO、零 import、零 module 级状态,同一入参恒同一出参。
|
|
38
|
-
*/
|
|
39
|
-
/**
|
|
40
|
-
* server 在 interrupt 腿上表达「**这条 run 已经 parked、没有在飞 turn 可切**」的 409 机器码
|
|
41
|
-
* (engine 7.52.0 `dist/http/routes/runs.js` 真字节,`sendNoLiveTurn` 的 `isParkedRunStatus` 分支)。
|
|
42
|
-
* · `interrupt.nothing_in_flight` —— run 停在 pending 决断上。**审批卡挂着按 Esc 的主场景就是
|
|
43
|
-
* 这一格**,server 的原话直接指路 steer/cancel。
|
|
44
|
-
*
|
|
45
|
-
* 🔴 **闭集只收这一员**,另外两个 409 都刻意在外:
|
|
46
|
-
* · `interrupt.not_held` —— **不收**。语义是「**本副本**手上没有可切的 live turn face」,而 server
|
|
47
|
-
* 自己的两条原话把它拆得很清楚:一条是「run is live on **another replica**」,另一条是
|
|
48
|
-
* verify/cascade 车道不暴露 live stream。**两条都不证明「全局没有在飞 turn」** —— 尤其第一条,
|
|
49
|
-
* 那条 run 正在别的副本上跑得好好的。对它升级 = 把 **turn 级** Esc 放大成**整 run 终止**。
|
|
50
|
-
* server 提示「run-level stop 可用 cancel」是在告诉你**有这个动词**,不等于用户授权了 run 级停止。
|
|
51
|
-
* · `steering.not_running` —— 不收。run 已终局,没有任何东西要停,补一发 cancel 是纯噪声。
|
|
52
|
-
* ⇒ 只有「引擎结构化地证明了 run 已 parked」这一格才允许升级。等上游给出 owner/parked 判别位
|
|
53
|
-
* (或跨副本路由)之后,`not_held` 才谈得上有安全的处置。
|
|
54
|
-
*
|
|
55
|
-
* 🔴 **为什么是 `Object.freeze` 的数组而不是 `ReadonlySet`**(异源复审 [high] 采纳,真病):
|
|
56
|
-
* `ReadonlySet<string>` 只在**类型面**只读 —— 运行期它就是一只普通 `Set`,而判定查的是**同一个
|
|
57
|
-
* 实例**。任何 JS 消费者(或本包将来某处的一行手滑)`.add('interrupt.not_held')` 之后,同一份入参
|
|
58
|
-
* 就会从 `none` 变成 `escalate-cancel`,把一条**还活着**的 run 不可恢复地拆掉 —— 这正是本模块整段
|
|
59
|
-
* 头注在防的那个方向,却被自己的导出形留了后门;而「纯判定、零 module 级可变态」那句承诺也当场
|
|
60
|
-
* 变成假话。冻结数组在**运行期**真的改不动(ESM 恒 strict:`push`/下标赋值直接抛),于是「公开
|
|
61
|
-
* 面」与「判定源」可以安全地是同一个物,不必铸第二份(两份才会漂)。
|
|
62
|
-
* ⚠️ 判据形随之从 `.has()` 改成 `.includes()` —— 与同仓 `parkResolver.GATE_FAILURE_CODES` 的
|
|
63
|
-
* `as const` 数组 + `includes` 逐字同姿势。闭集只有一员,查找成本不是这里的量。
|
|
64
|
-
*/
|
|
65
1
|
export declare const RUN_LEVEL_STOP_ERROR_CODES: readonly string[];
|
|
66
|
-
|
|
67
|
-
* 一发 bare interrupt 的归一结局(端把自己的发射结果折成这个形喂进来;**绝不是**异常)。
|
|
68
|
-
* 形与 cli `src/sema/interruptWire.ts` 的 `InterruptOutcome` 逐字同形 —— 壳换装时直接对接。
|
|
69
|
-
*/
|
|
70
|
-
export type InteractiveHaltInterruptOutcome =
|
|
71
|
-
/** 2xx:切 + 停受理。`turnCut` = 这一发有没有真切到一轮(重复调用第二次诚实 `false`;
|
|
72
|
-
* 读不出 ⇒ `undefined`,**不硬造 false**)。本判定不读它 —— 受理即受理。 */
|
|
73
|
-
{
|
|
2
|
+
export type InteractiveHaltInterruptOutcome = {
|
|
74
3
|
kind: 'halted';
|
|
75
4
|
turnCut?: boolean | undefined;
|
|
76
|
-
}
|
|
77
|
-
/** 非 2xx:引擎**给了判决**。带机器码与状态码,升级闸只认这一类。 */
|
|
78
|
-
| {
|
|
5
|
+
} | {
|
|
79
6
|
kind: 'refused';
|
|
80
7
|
errorCode?: string | undefined;
|
|
81
8
|
status: number;
|
|
82
|
-
}
|
|
83
|
-
/** 没武装(mock 车道 / live client 还没建)⇒ 一枪没打,**没有判决**。 */
|
|
84
|
-
| {
|
|
9
|
+
} | {
|
|
85
10
|
kind: 'unarmed';
|
|
86
|
-
}
|
|
87
|
-
/** 传输层失败(超时、连接断)⇒ 一样是**没拿到服务端判决**。 */
|
|
88
|
-
| {
|
|
11
|
+
} | {
|
|
89
12
|
kind: 'transport';
|
|
90
13
|
detail?: string | undefined;
|
|
91
14
|
};
|
|
92
|
-
/** 本判定的入参。 */
|
|
93
15
|
export interface InteractiveHaltInput {
|
|
94
|
-
/**
|
|
95
|
-
* **这一拍屏上是否挂着审批卡**(壳自己独立知道的事实:cli = `focusedInputDialog === 'tool-permission'`)。
|
|
96
|
-
* 🔴 它只在「interrupt 连判决都没拿到」那一格起作用 —— 见 {@link planInteractiveHalt} 的分支表。
|
|
97
|
-
* 🔴 缺席 / 非 `true` 一律按**非 parked** 处理(fail-closed:证不出 parked 就不给升级资格)。
|
|
98
|
-
*/
|
|
99
16
|
readonly parked?: boolean | undefined;
|
|
100
|
-
/**
|
|
101
|
-
* **这条 run 武装了 detach 吗**(壳自己独立知道的第二个事实:出站时给了「断连不收 run」的那一位)。
|
|
102
|
-
*
|
|
103
|
-
* 🔴 为什么它会改变判决(0.62.0 新格):撕 SSE 的**后果**因它而变。老形态下交互车道零 detach ——
|
|
104
|
-
* 撕流 = server 按断连语义当场把那条 run 收尾,所以「interrupt 那一发没落地」还有一层兜底
|
|
105
|
-
* (用户按 Esc、壳撕流,run 也就停了)。detach 武装之后,撕流只断开**观看**,run 会一路跑到
|
|
106
|
-
* turn 结束:此时 interrupt 自身失败(传输失败/超时/未武装)= 用户按下的 Esc **一点效果都没有**,
|
|
107
|
-
* 而屏上没有任何东西会告诉他这件事。这一格就是那层兜底消失后留下的洞。
|
|
108
|
-
* 🔴 它**只在「连判决都没拿到」那一格**被读 —— 与 {@link InteractiveHaltInput.parked} 同一条纪律:
|
|
109
|
-
* 引擎给了判决时判决说了算,壳自己知道的事实不许骑到引擎的结构化答复上。
|
|
110
|
-
* 🔴 **缺席 / 非 `true` 一律按未武装处理**(fail-closed,与 `parked` 同尺):证不出 detach 就不给
|
|
111
|
-
* 升级资格。⇒ 不传这个键的宿主行为与上一版**逐格相同**(门里有全格穷举的零差断言)。
|
|
112
|
-
*/
|
|
113
17
|
readonly detachArmed?: boolean | undefined;
|
|
114
|
-
/**
|
|
115
|
-
* 首发 interrupt 的结局。**缺席 = 这一发还没打** ⇒ 本函数判 `interrupt`(首发恒行,无条件)。
|
|
116
|
-
* 在场 ⇒ 本函数回答的是「接着还要不要升级」。
|
|
117
|
-
*/
|
|
118
18
|
readonly interruptOutcome?: InteractiveHaltInterruptOutcome | undefined;
|
|
119
19
|
}
|
|
120
|
-
|
|
121
|
-
* 判决的**机读因由**(闭集;人话文案归端,别拿它当展示串 —— [machine-readable-signal-not-visual-anchor])。
|
|
122
|
-
*/
|
|
123
|
-
export type InteractiveHaltReason =
|
|
124
|
-
/** 还没发过 interrupt ⇒ 首发恒行(这一步不看 `parked`,不看任何东西)。 */
|
|
125
|
-
'first-shot'
|
|
126
|
-
/** 202 受理:这一轮已被切掉,run 在边界上终局 ⇒ 无事可做。 */
|
|
127
|
-
| 'halted'
|
|
128
|
-
/** 引擎**自己**回了升级闭集里的 409 码 ⇒ 它在说「run 级停止请用 cancel」。 */
|
|
129
|
-
| 'engine-says-run-level'
|
|
130
|
-
/** 连判决都没拿到(传输失败/超时/未武装),但壳自证屏上挂着审批卡 ⇒ 这一格本来就没有在飞 turn。 */
|
|
131
|
-
| 'no-verdict-on-parked-card'
|
|
132
|
-
/** 连判决都没拿到、也没有审批卡,但这条 run 武装了 detach ⇒ 撕流不会收它,不升级 = Esc 零效果。 */
|
|
133
|
-
| 'no-verdict-detach-armed'
|
|
134
|
-
/** 连判决都没拿到、且两个壳侧事实都不成立 ⇒ 那里真可能有在飞工具,凭一次超时拆整条 run 正是要消除的病。 */
|
|
135
|
-
| 'no-verdict-not-parked'
|
|
136
|
-
/** 引擎给了判决,但不在升级闭集里(404 / 400 / 非 409 / `steering.not_running` / 码读不出)。 */
|
|
137
|
-
| 'refused-no-escalation'
|
|
138
|
-
/** 入参不是本模块认得的任何一种结局形 ⇒ fail-closed 不升级(宿主传了新形/坏形)。 */
|
|
139
|
-
| 'unknown-outcome';
|
|
140
|
-
/** 判决值:做什么 + 为什么(机读)。 */
|
|
20
|
+
export type InteractiveHaltReason = 'first-shot' | 'halted' | 'engine-says-run-level' | 'no-verdict-on-parked-card' | 'no-verdict-detach-armed' | 'no-verdict-not-parked' | 'refused-no-escalation' | 'unknown-outcome';
|
|
141
21
|
export interface InteractiveHaltPlan {
|
|
142
22
|
readonly action: 'interrupt' | 'escalate-cancel' | 'none';
|
|
143
23
|
readonly reason: InteractiveHaltReason;
|
|
144
24
|
}
|
|
145
|
-
/**
|
|
146
|
-
* Esc 停止弧的**唯一判定口**。
|
|
147
|
-
*
|
|
148
|
-
* ── 分支表(逐条 = 一条行为承诺)──────────────────────────────────────────────────────────
|
|
149
|
-
* | `interruptOutcome` | `parked` | `detachArmed` | 判决 | reason |
|
|
150
|
-
* |--------------------------------------------|----------|---------------|-------------------|--------|
|
|
151
|
-
* | 缺席(还没打) | 任意 | 任意 | `interrupt` | `first-shot` |
|
|
152
|
-
* | `halted` | 任意 | 任意 | `none` | `halted` |
|
|
153
|
-
* | `refused` + 409 + 升级闭集码 | 任意 | 任意 | `escalate-cancel` | `engine-says-run-level` |
|
|
154
|
-
* | `refused`(其余:非 409 / 码不在闭集 / 码缺席)| 任意 | 任意 | `none` | `refused-no-escalation` |
|
|
155
|
-
* | `transport` / `unarmed` | `true` | 任意 | `escalate-cancel` | `no-verdict-on-parked-card` |
|
|
156
|
-
* | `transport` / `unarmed` | 其余 | `true` | `escalate-cancel` | `no-verdict-detach-armed` |
|
|
157
|
-
* | `transport` / `unarmed` | 其余 | 其余 | `none` | `no-verdict-not-parked` |
|
|
158
|
-
* | 认不得的形 | 任意 | 任意 | `none` | `unknown-outcome` |
|
|
159
|
-
*
|
|
160
|
-
* 🔴 **`parked` 与 `detachArmed` 只在「没有判决」那两格被读**:引擎给了判决时,判决说了算 ——
|
|
161
|
-
* 壳的 UI 状态不许覆盖引擎的结构化答复(反过来也一样:引擎说 parked 时,`parked=false` 不阻止升级)。
|
|
162
|
-
* 🔴 **两个壳侧事实的先后是刻意的**:`parked` 先判,所以老宿主(只传 `parked`)的 reason 逐字不变;
|
|
163
|
-
* 两者同时为 `true` 时报 `no-verdict-on-parked-card` —— 那一格的处置与文案本来就成立,新键不改口。
|
|
164
|
-
* 🔴 **`detachArmed` 缺席 = 老语义零差**:不传这个键时整张表与上一版逐格相同(门里有全格穷举断言)。
|
|
165
|
-
* 🔴 **首发无条件**:`first-shot` 那一格刻意不看 `parked`。审批卡挂着时首发 interrupt 会吃一个
|
|
166
|
-
* 409,那正是升级闸要的**判决**;为了省一次往返而直接跳到 cancel,等于把判据从引擎搬回壳里猜。
|
|
167
|
-
* 🔴 **顺序契约(端必读,不是本函数能保证的那半)**:这一发必须排在「撕 SSE」**之前**。
|
|
168
|
-
* · **未武装 detach** 的车道上,先撕流 = server 按断连语义当场收尾那条 run,随后落地的 interrupt
|
|
169
|
-
* 只会拿到 409 `steering.not_running`(真机实测:同步撕流形每一轮都是它)。
|
|
170
|
-
* · **武装了 detach** 的车道上,撕流只断开观看、run 照跑 —— 顺序不再影响 interrupt 拿到什么,
|
|
171
|
-
* 但它让「interrupt 没落地」变成一个**没有兜底**的结局,那正是 `detachArmed` 这一格要接的洞。
|
|
172
|
-
*/
|
|
173
25
|
export declare function planInteractiveHalt(input: InteractiveHaltInput): InteractiveHaltPlan;
|
package/dist/interactiveHalt.js
CHANGED
|
@@ -1,80 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* interactiveHalt — 交互 **Esc** 的停止判定层(#363 件③,0.47.0;三端公共判定上收)。
|
|
3
|
-
*
|
|
4
|
-
* ── 收的是哪一件事 ────────────────────────────────────────────────────────────────────────
|
|
5
|
-
* 「用户按 Esc ⇒ 先发 **turn 级 halt**;升级成 **run 级 cancel** 恰有**三格**:
|
|
6
|
-
* ① 引擎自己回了升级闭集里的 **409**(它在说「这里没有在飞 turn 可切,run 级停止请用 cancel」);
|
|
7
|
-
* ② 这一发**连判决都没拿到**(传输失败/超时/未武装)**且**屏上确实挂着审批卡(`parked`);
|
|
8
|
-
* ③ 这一发连判决都没拿到 **且** 这条 run 武装了 **detach**(断连不再收 run,0.62.0 新格)。
|
|
9
|
-
* 其余一律不升级。」—— 这条判定 TUI / desktop / web **三端都要**(三端都会 Esc、都会撞
|
|
10
|
-
* 同一个 parked 格),此前整条住在 cli 壳里(`src/sema/seamQuery.ts` 的 `bestEffortInteractiveHalt`
|
|
11
|
-
* + `src/sema/interruptWire.ts` 的 `needsRunLevelStop`)。本模块把**判据**搬进来;
|
|
12
|
-
* **发射**(裸 fetch / SDK verb)、台账、留痕、UI 反馈仍归各端。
|
|
13
|
-
* ⚠️ 别把①漏掉(异源复审 [medium] 采纳的原文歧义):只写「拿不到判决且 parked 才升级」的话,
|
|
14
|
-
* 端会漏接**引擎明确指路**那一格 —— parked run 的会话锁不放,下一条消息照样撞「Session busy」。
|
|
15
|
-
*
|
|
16
|
-
* ── 两个动词各自唯一能做到的格(**cancel 绝不删**,本模块存在的前提)──────────────────────
|
|
17
|
-
* · `interrupt`(turn 级,bare 形 = core `stream.halt()`「切 + 停」)—— 需要一条**活的、在飞的
|
|
18
|
-
* turn**。这是 Esc 的正题:切掉这一轮,run 在边界上终局、同 session 下一 submit 照常续。
|
|
19
|
-
* · `cancel`(run 级)—— 显式整 run 终局手势,而且它是**唯一**能把一条停在审批门上的
|
|
20
|
-
* `suspended`/`needs_review` run 就地终态化、把会话锁放开的动词(server [868] 起的语义)。
|
|
21
|
-
* ⇒ 无条件把 cancel 换成 interrupt = 审批卡挂着按 Esc 的主场景当场回归成「Session busy」病;
|
|
22
|
-
* 无条件补 cancel = 同一条 run 上别的在飞工具(后台 bash 等)被连坐拆掉(#324 的病形)。
|
|
23
|
-
* 本判定就是这两条之间那道**不对称**的闸。
|
|
24
|
-
*
|
|
25
|
-
* ── 🔴 不对称是刻意的(方向安全,两条代价不等价)────────────────────────────────────────
|
|
26
|
-
* 判**不**升级的代价 = 用户退回既有的「Session busy」卡,自己再选一次(**可恢复**);
|
|
27
|
-
* 判**错**升级的代价 = 拆掉一条其实还活着的 run,连坐它身上所有在飞工具(**不可恢复**)。
|
|
28
|
-
* ⇒ 闸往严的一侧设,宁可少升一次;凡「证不出来」一律落**不升级**侧。
|
|
29
|
-
*
|
|
30
|
-
* ── 判据锚在哪 ────────────────────────────────────────────────────────────────────────────
|
|
31
|
-
* · 升级的**第一判据 = 引擎自己的机器码**({@link RUN_LEVEL_STOP_ERROR_CODES} × 409),
|
|
32
|
-
* 不是壳对 UI 状态的猜测([anchor-on-the-deciding-quantity]);
|
|
33
|
-
* · 只有当**引擎连判决都没给**(传输失败/超时/根本没武装)时,才轮到壳自己独立知道的那个
|
|
34
|
-
* 事实(`parked` = 这一拍屏上确实挂着审批卡 ⇒ 那条 run 停在 pending 决断上 ⇒ 本来就没有
|
|
35
|
-
* 在飞 turn 可切 ⇒ 补 cancel 不构成连坐)。
|
|
36
|
-
*
|
|
37
|
-
* 🔴 **纯判定**:零 IO、零 import、零 module 级状态,同一入参恒同一出参。
|
|
38
|
-
*/
|
|
39
|
-
/**
|
|
40
|
-
* server 在 interrupt 腿上表达「**这条 run 已经 parked、没有在飞 turn 可切**」的 409 机器码
|
|
41
|
-
* (engine 7.52.0 `dist/http/routes/runs.js` 真字节,`sendNoLiveTurn` 的 `isParkedRunStatus` 分支)。
|
|
42
|
-
* · `interrupt.nothing_in_flight` —— run 停在 pending 决断上。**审批卡挂着按 Esc 的主场景就是
|
|
43
|
-
* 这一格**,server 的原话直接指路 steer/cancel。
|
|
44
|
-
*
|
|
45
|
-
* 🔴 **闭集只收这一员**,另外两个 409 都刻意在外:
|
|
46
|
-
* · `interrupt.not_held` —— **不收**。语义是「**本副本**手上没有可切的 live turn face」,而 server
|
|
47
|
-
* 自己的两条原话把它拆得很清楚:一条是「run is live on **another replica**」,另一条是
|
|
48
|
-
* verify/cascade 车道不暴露 live stream。**两条都不证明「全局没有在飞 turn」** —— 尤其第一条,
|
|
49
|
-
* 那条 run 正在别的副本上跑得好好的。对它升级 = 把 **turn 级** Esc 放大成**整 run 终止**。
|
|
50
|
-
* server 提示「run-level stop 可用 cancel」是在告诉你**有这个动词**,不等于用户授权了 run 级停止。
|
|
51
|
-
* · `steering.not_running` —— 不收。run 已终局,没有任何东西要停,补一发 cancel 是纯噪声。
|
|
52
|
-
* ⇒ 只有「引擎结构化地证明了 run 已 parked」这一格才允许升级。等上游给出 owner/parked 判别位
|
|
53
|
-
* (或跨副本路由)之后,`not_held` 才谈得上有安全的处置。
|
|
54
|
-
*
|
|
55
|
-
* 🔴 **为什么是 `Object.freeze` 的数组而不是 `ReadonlySet`**(异源复审 [high] 采纳,真病):
|
|
56
|
-
* `ReadonlySet<string>` 只在**类型面**只读 —— 运行期它就是一只普通 `Set`,而判定查的是**同一个
|
|
57
|
-
* 实例**。任何 JS 消费者(或本包将来某处的一行手滑)`.add('interrupt.not_held')` 之后,同一份入参
|
|
58
|
-
* 就会从 `none` 变成 `escalate-cancel`,把一条**还活着**的 run 不可恢复地拆掉 —— 这正是本模块整段
|
|
59
|
-
* 头注在防的那个方向,却被自己的导出形留了后门;而「纯判定、零 module 级可变态」那句承诺也当场
|
|
60
|
-
* 变成假话。冻结数组在**运行期**真的改不动(ESM 恒 strict:`push`/下标赋值直接抛),于是「公开
|
|
61
|
-
* 面」与「判定源」可以安全地是同一个物,不必铸第二份(两份才会漂)。
|
|
62
|
-
* ⚠️ 判据形随之从 `.has()` 改成 `.includes()` —— 与同仓 `parkResolver.GATE_FAILURE_CODES` 的
|
|
63
|
-
* `as const` 数组 + `includes` 逐字同姿势。闭集只有一员,查找成本不是这里的量。
|
|
64
|
-
*/
|
|
65
1
|
export const RUN_LEVEL_STOP_ERROR_CODES = Object.freeze([
|
|
66
2
|
'interrupt.nothing_in_flight',
|
|
67
3
|
]);
|
|
68
|
-
/** 升级闭集的码在 wire 上**只以 409 出现**(engine 7.52.0 `sendNoLiveTurn` 两分支逐字)。 */
|
|
69
4
|
const RUN_LEVEL_STOP_STATUS = 409;
|
|
70
|
-
/**
|
|
71
|
-
* 这一发 interrupt 的结局是不是在说「**改用 run 级停止**」。
|
|
72
|
-
*
|
|
73
|
-
* 判据 = **码闭集({@link RUN_LEVEL_STOP_ERROR_CODES})与 409 状态的合取**,两个条件都必要:
|
|
74
|
-
* · 只认码不认状态 ⇒ 一只 5xx(引擎内部错、代理改写体、老版本复用同名码)只要正文里带上那个码,
|
|
75
|
-
* 就能把我们骗去打一发 **run 级 cancel** —— 那是**破坏性**动作,而它当时其实没有任何判决依据。
|
|
76
|
-
* · 只认 409 不认码 ⇒ `steering.not_running`(run 已终局)也会被升级,对着一条已经结束的 run 补枪。
|
|
77
|
-
*/
|
|
78
5
|
function enginePointsToRunLevelStop(outcome) {
|
|
79
6
|
const o = outcome;
|
|
80
7
|
return (o?.kind === 'refused' &&
|
|
@@ -82,43 +9,10 @@ function enginePointsToRunLevelStop(outcome) {
|
|
|
82
9
|
typeof o.errorCode === 'string' &&
|
|
83
10
|
RUN_LEVEL_STOP_ERROR_CODES.includes(o.errorCode));
|
|
84
11
|
}
|
|
85
|
-
/**
|
|
86
|
-
* Esc 停止弧的**唯一判定口**。
|
|
87
|
-
*
|
|
88
|
-
* ── 分支表(逐条 = 一条行为承诺)──────────────────────────────────────────────────────────
|
|
89
|
-
* | `interruptOutcome` | `parked` | `detachArmed` | 判决 | reason |
|
|
90
|
-
* |--------------------------------------------|----------|---------------|-------------------|--------|
|
|
91
|
-
* | 缺席(还没打) | 任意 | 任意 | `interrupt` | `first-shot` |
|
|
92
|
-
* | `halted` | 任意 | 任意 | `none` | `halted` |
|
|
93
|
-
* | `refused` + 409 + 升级闭集码 | 任意 | 任意 | `escalate-cancel` | `engine-says-run-level` |
|
|
94
|
-
* | `refused`(其余:非 409 / 码不在闭集 / 码缺席)| 任意 | 任意 | `none` | `refused-no-escalation` |
|
|
95
|
-
* | `transport` / `unarmed` | `true` | 任意 | `escalate-cancel` | `no-verdict-on-parked-card` |
|
|
96
|
-
* | `transport` / `unarmed` | 其余 | `true` | `escalate-cancel` | `no-verdict-detach-armed` |
|
|
97
|
-
* | `transport` / `unarmed` | 其余 | 其余 | `none` | `no-verdict-not-parked` |
|
|
98
|
-
* | 认不得的形 | 任意 | 任意 | `none` | `unknown-outcome` |
|
|
99
|
-
*
|
|
100
|
-
* 🔴 **`parked` 与 `detachArmed` 只在「没有判决」那两格被读**:引擎给了判决时,判决说了算 ——
|
|
101
|
-
* 壳的 UI 状态不许覆盖引擎的结构化答复(反过来也一样:引擎说 parked 时,`parked=false` 不阻止升级)。
|
|
102
|
-
* 🔴 **两个壳侧事实的先后是刻意的**:`parked` 先判,所以老宿主(只传 `parked`)的 reason 逐字不变;
|
|
103
|
-
* 两者同时为 `true` 时报 `no-verdict-on-parked-card` —— 那一格的处置与文案本来就成立,新键不改口。
|
|
104
|
-
* 🔴 **`detachArmed` 缺席 = 老语义零差**:不传这个键时整张表与上一版逐格相同(门里有全格穷举断言)。
|
|
105
|
-
* 🔴 **首发无条件**:`first-shot` 那一格刻意不看 `parked`。审批卡挂着时首发 interrupt 会吃一个
|
|
106
|
-
* 409,那正是升级闸要的**判决**;为了省一次往返而直接跳到 cancel,等于把判据从引擎搬回壳里猜。
|
|
107
|
-
* 🔴 **顺序契约(端必读,不是本函数能保证的那半)**:这一发必须排在「撕 SSE」**之前**。
|
|
108
|
-
* · **未武装 detach** 的车道上,先撕流 = server 按断连语义当场收尾那条 run,随后落地的 interrupt
|
|
109
|
-
* 只会拿到 409 `steering.not_running`(真机实测:同步撕流形每一轮都是它)。
|
|
110
|
-
* · **武装了 detach** 的车道上,撕流只断开观看、run 照跑 —— 顺序不再影响 interrupt 拿到什么,
|
|
111
|
-
* 但它让「interrupt 没落地」变成一个**没有兜底**的结局,那正是 `detachArmed` 这一格要接的洞。
|
|
112
|
-
*/
|
|
113
12
|
export function planInteractiveHalt(input) {
|
|
114
13
|
const outcome = input.interruptOutcome;
|
|
115
|
-
// 首发恒行:一发都还没打的时候,没有任何东西需要判。
|
|
116
|
-
// 🔴 `null` 与 `undefined` **同判「还没打」**(两种缺席形;宿主用哪一种写「没有结局」都算数)——
|
|
117
|
-
// 而不是落 fail-closed 的 `unknown-outcome`:那会让 Esc 一发都不打(interrupt 是**非破坏性**
|
|
118
|
-
// 动词,把它扣下来比多打一发更坏)。fail-closed 守的是**升级**那一侧,不是首发。
|
|
119
14
|
if (outcome === undefined || outcome === null)
|
|
120
15
|
return { action: 'interrupt', reason: 'first-shot' };
|
|
121
|
-
// 防御读:wire/宿主形在运行期不存在类型(M0/M1),`kind` 可能是新词、可能压根不是对象。
|
|
122
16
|
const kind = outcome.kind;
|
|
123
17
|
if (kind === 'halted')
|
|
124
18
|
return { action: 'none', reason: 'halted' };
|
|
@@ -128,16 +22,11 @@ export function planInteractiveHalt(input) {
|
|
|
128
22
|
: { action: 'none', reason: 'refused-no-escalation' };
|
|
129
23
|
}
|
|
130
24
|
if (kind === 'transport' || kind === 'unarmed') {
|
|
131
|
-
// 没拿到判决。只有壳能**独立证明**的两个事实之一成立才升级(理由见顶注的不对称段)。
|
|
132
|
-
// 🔴 `parked` 先判:老宿主只传它,先判保证那一格的 reason 逐字不漂。
|
|
133
25
|
if (input.parked === true)
|
|
134
26
|
return { action: 'escalate-cancel', reason: 'no-verdict-on-parked-card' };
|
|
135
|
-
// 🔴 detach 武装 ⇒ 撕流不再收 run,不升级 = 用户按下的 Esc 一点效果都没有。
|
|
136
|
-
// 严格 `=== true`(与 parked 同尺):证不出来就不给升级资格。
|
|
137
27
|
if (input.detachArmed === true)
|
|
138
28
|
return { action: 'escalate-cancel', reason: 'no-verdict-detach-armed' };
|
|
139
29
|
return { action: 'none', reason: 'no-verdict-not-parked' };
|
|
140
30
|
}
|
|
141
|
-
// 宿主传了本模块认不得的形(新 kind / 坏对象)。fail-closed:不对一个读不懂的结局动手。
|
|
142
31
|
return { action: 'none', reason: 'unknown-outcome' };
|
|
143
32
|
}
|
|
@@ -1,74 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* src/sema/interactiveToolsWire.ts — headless `-p` 的 TaskRequest.interactiveTools:false stamp
|
|
3
|
-
* ([909]B 件3,采 [911]② core 正解,2026-07-16)。
|
|
4
|
-
*
|
|
5
|
-
* WHY:core 1.296 起 TaskSpec 有 `interactiveTools?: boolean` 三态旋钮(dist/core/types.d.ts:241);
|
|
6
|
-
* prepare-task.js 两处消费:
|
|
7
|
-
* :635 plan 门 `spec.enablePlanMode === true && spec.interactiveTools !== false`
|
|
8
|
-
* :974 AskUserQuestion roster `interactiveTools === true || (interactiveTools !== false &&
|
|
9
|
-
* (onQuestion !== undefined || durableQuestionFace))`
|
|
10
|
-
* ⇒ `-p` 无人值守姿势 stamp `false`,AskUserQuestion/plan 门从 roster【源头】全灭(模型压根看不到
|
|
11
|
-
* 该工具)= [909]A3(headless EnterPlanMode→park 弃 86% 预算)类事故的根治,比 [884]A1 的
|
|
12
|
-
* park→error 终帧防御纵深更靠前(现在根本不 park)。
|
|
13
|
-
*
|
|
14
|
-
* 🆕 **core 5.10.0 把这一 stamp 的作用域从「本 run」扩到「本 run 及其全部委派子代」**
|
|
15
|
-
* ([2575] 消费端自查④,委托继承收窄五座之②):此前子代 roster 是「**恒无** AskUserQuestion」,
|
|
16
|
-
* 5.10.0 起改成「**父面允许才有**」——`onQuestion` 在 prepare 期解析一次并**原样**传给子代
|
|
17
|
-
* (父子共用同一个函数对象)。对本模块是**净收益且零改动**:`-p` stamp `false` 之后,硬 headless
|
|
18
|
-
* 父的子代**压根不挂** AskUserQuestion,而不是挂了再靠子代自己的判断兜。同族一并单向收紧的还有
|
|
19
|
-
* `handsReadOnly`(只读父 ⇒ 子代无写手)与 `oneShot`(true 向传播)。
|
|
20
|
-
* 🔴 给下一棒的判据纪律:因此**别再用闭包身份判「谁在问」** —— 父子是同一个 `onQuestion` 函数对象,
|
|
21
|
-
* 闭包身份在 5.10.0 上不再有判别力;判身要读 `AskQuestionRequest.sourceTaskId` / `principal`
|
|
22
|
-
* (本包 hitl 面已是这个姿势,见 `hitl/toolApprovalWire.ts` 的 `sourceTaskId` 位)。
|
|
23
|
-
*
|
|
24
|
-
* 语义(headlessPermissionModeWire 同点同型 wire):
|
|
25
|
-
* · 仅 headless `-p` 车道(本模块只被 seamQueryEngine.ask import;交互 REPL 一根毛不动);
|
|
26
|
-
* · 显式交互意图恒赢:CLI 无 --interactive-tools 类旗(gap-check 2026-07-16:上游 CC 2.1.207
|
|
27
|
-
* 与本壳 argv 面均无,不发明);既有旗里唯一表达「我要交互门」的是 `--permission-mode plan`
|
|
28
|
-
* (plan 流程本身要 plan-review 交互)——该旗在场时不 stamp(维持引擎缺省判据);
|
|
29
|
-
* · SEMA_HEADLESS_INTERACTIVE_TOOLS 部署旋钮(settings env 车道,拼写集 = envFlagOn/envFlagOff、
|
|
30
|
-
* REF-CC-141 dup-02 单源):真值拼写 = 不 stamp(回引擎缺省判据),假值拼写 = 显式 stamp false
|
|
31
|
-
* (与缺省同效,显式垫);非法值一次性 warn + 回缺省;
|
|
32
|
-
* 🔴 [2393] sweep-F9(2026-08-03 全窗复审)**记一笔默认翻面**:dup-02 单源化把真值拼写集从
|
|
33
|
-
* `{true,1}` 扩到 `{true,1,yes,on}`(假值集同批扩到 `{false,0,no,off,none}`)。收编**前**
|
|
34
|
-
* `SEMA_HEADLESS_INTERACTIVE_TOOLS=yes` 落进 warn 分支 ⇒ `{interactiveTools:false}` = **显式 OFF**;
|
|
35
|
-
* 收编**后**它命中真值拼写 ⇒ `{}` = **不 stamp = 由引擎缺省决定**。方向说得通(用户写 yes 就是
|
|
36
|
-
* 要交互工具),但这是 headless `-p` 车道上一次真实的默认翻面,不能只活在拼写集的 diff 里。
|
|
37
|
-
* · 缺省(env 缺席/空串)= stamp false(无人值守正解);
|
|
38
|
-
* · 旧 server 白名单 fail-soft:server resolveSpec 逐字段白名单拼 TaskSpec,未知 body 字段静默
|
|
39
|
-
* 忽略(limits wire 同款勘察结论)——本字段发了白发不炸。gap-check 实拆 server 1.210.0 dist:
|
|
40
|
-
* resolveSpec(main.js:1233-)【不】读 body.interactiveTools ⇒ 需 server 半场补一行白名单,
|
|
41
|
-
* 壳先备(协作板记账)。
|
|
42
|
-
*/
|
|
43
1
|
import { type EnvLike } from './hostEnv.js';
|
|
44
|
-
/** 部署旋钮 env 键名(settings.json env 块 → 1a-envseed → process.env 同车道)。 */
|
|
45
2
|
export declare const HEADLESS_INTERACTIVE_TOOLS_ENV = "SEMA_HEADLESS_INTERACTIVE_TOOLS";
|
|
46
3
|
export type InteractiveToolsResolution = {
|
|
47
|
-
/** 直接展开进 TaskRequest 的字段({} = 不 stamp)。 */
|
|
48
4
|
fields: {
|
|
49
5
|
interactiveTools?: false;
|
|
50
6
|
};
|
|
51
7
|
source: 'default' | 'env' | 'plan-flag';
|
|
52
|
-
/** 非法 env 值的告警文案(调用层一次性打 stderr)。 */
|
|
53
8
|
warning?: string;
|
|
54
9
|
};
|
|
55
|
-
/**
|
|
56
|
-
* argv 里是否显式要了 plan 交互意图(`--permission-mode plan` / `--permission-mode=plan`;
|
|
57
|
-
* 后出现者赢,commander 同语义;`--` 之后不是 flag)。
|
|
58
|
-
*
|
|
59
|
-
* REF-CC-143(dup-10)收编,2026-08-01:这个函数原本自带一份与 headlessPermissionModeWire.
|
|
60
|
-
* permissionModeFromArgv 逐字重复的 argv 扫描循环(两个 headless 旋钮读的是同一个 `--permission-mode`
|
|
61
|
-
* flag,必须是同一份读法)。dup-10 证明过等价性:`permissionModeFromArgv` 的
|
|
62
|
-
* `--dangerously-skip-permissions` 分支只在没有显式 `--permission-mode` 时才返回
|
|
63
|
-
* `'bypassPermissions'`,那个值永远不等于 `'plan'`,所以对任意 argv 恒有
|
|
64
|
-
* `planModeExplicitlyRequested(argv) === (permissionModeFromArgv(argv) === 'plan')`——折成薄壳,
|
|
65
|
-
* 循环整个消失,而不只是「提取逻辑」被共享。
|
|
66
|
-
*/
|
|
67
10
|
export declare function planModeExplicitlyRequested(argv: readonly string[]): boolean;
|
|
68
|
-
/**
|
|
69
|
-
* 解析 headless `-p` 的 interactiveTools stamp。纯函数除告警 latch。
|
|
70
|
-
* 调用方(seamQueryEngine.ask)live-gated:mock/pty 车道永不经过这里。
|
|
71
|
-
*/
|
|
72
11
|
export declare function resolveHeadlessInteractiveTools(argv: readonly string[], env?: EnvLike): InteractiveToolsResolution;
|
|
73
|
-
/** 测试钩子:重置一次性告警 latch。 */
|
|
74
12
|
export declare function _resetInteractiveToolsWireForTest(): void;
|
|
@@ -1,83 +1,19 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* src/sema/interactiveToolsWire.ts — headless `-p` 的 TaskRequest.interactiveTools:false stamp
|
|
3
|
-
* ([909]B 件3,采 [911]② core 正解,2026-07-16)。
|
|
4
|
-
*
|
|
5
|
-
* WHY:core 1.296 起 TaskSpec 有 `interactiveTools?: boolean` 三态旋钮(dist/core/types.d.ts:241);
|
|
6
|
-
* prepare-task.js 两处消费:
|
|
7
|
-
* :635 plan 门 `spec.enablePlanMode === true && spec.interactiveTools !== false`
|
|
8
|
-
* :974 AskUserQuestion roster `interactiveTools === true || (interactiveTools !== false &&
|
|
9
|
-
* (onQuestion !== undefined || durableQuestionFace))`
|
|
10
|
-
* ⇒ `-p` 无人值守姿势 stamp `false`,AskUserQuestion/plan 门从 roster【源头】全灭(模型压根看不到
|
|
11
|
-
* 该工具)= [909]A3(headless EnterPlanMode→park 弃 86% 预算)类事故的根治,比 [884]A1 的
|
|
12
|
-
* park→error 终帧防御纵深更靠前(现在根本不 park)。
|
|
13
|
-
*
|
|
14
|
-
* 🆕 **core 5.10.0 把这一 stamp 的作用域从「本 run」扩到「本 run 及其全部委派子代」**
|
|
15
|
-
* ([2575] 消费端自查④,委托继承收窄五座之②):此前子代 roster 是「**恒无** AskUserQuestion」,
|
|
16
|
-
* 5.10.0 起改成「**父面允许才有**」——`onQuestion` 在 prepare 期解析一次并**原样**传给子代
|
|
17
|
-
* (父子共用同一个函数对象)。对本模块是**净收益且零改动**:`-p` stamp `false` 之后,硬 headless
|
|
18
|
-
* 父的子代**压根不挂** AskUserQuestion,而不是挂了再靠子代自己的判断兜。同族一并单向收紧的还有
|
|
19
|
-
* `handsReadOnly`(只读父 ⇒ 子代无写手)与 `oneShot`(true 向传播)。
|
|
20
|
-
* 🔴 给下一棒的判据纪律:因此**别再用闭包身份判「谁在问」** —— 父子是同一个 `onQuestion` 函数对象,
|
|
21
|
-
* 闭包身份在 5.10.0 上不再有判别力;判身要读 `AskQuestionRequest.sourceTaskId` / `principal`
|
|
22
|
-
* (本包 hitl 面已是这个姿势,见 `hitl/toolApprovalWire.ts` 的 `sourceTaskId` 位)。
|
|
23
|
-
*
|
|
24
|
-
* 语义(headlessPermissionModeWire 同点同型 wire):
|
|
25
|
-
* · 仅 headless `-p` 车道(本模块只被 seamQueryEngine.ask import;交互 REPL 一根毛不动);
|
|
26
|
-
* · 显式交互意图恒赢:CLI 无 --interactive-tools 类旗(gap-check 2026-07-16:上游 CC 2.1.207
|
|
27
|
-
* 与本壳 argv 面均无,不发明);既有旗里唯一表达「我要交互门」的是 `--permission-mode plan`
|
|
28
|
-
* (plan 流程本身要 plan-review 交互)——该旗在场时不 stamp(维持引擎缺省判据);
|
|
29
|
-
* · SEMA_HEADLESS_INTERACTIVE_TOOLS 部署旋钮(settings env 车道,拼写集 = envFlagOn/envFlagOff、
|
|
30
|
-
* REF-CC-141 dup-02 单源):真值拼写 = 不 stamp(回引擎缺省判据),假值拼写 = 显式 stamp false
|
|
31
|
-
* (与缺省同效,显式垫);非法值一次性 warn + 回缺省;
|
|
32
|
-
* 🔴 [2393] sweep-F9(2026-08-03 全窗复审)**记一笔默认翻面**:dup-02 单源化把真值拼写集从
|
|
33
|
-
* `{true,1}` 扩到 `{true,1,yes,on}`(假值集同批扩到 `{false,0,no,off,none}`)。收编**前**
|
|
34
|
-
* `SEMA_HEADLESS_INTERACTIVE_TOOLS=yes` 落进 warn 分支 ⇒ `{interactiveTools:false}` = **显式 OFF**;
|
|
35
|
-
* 收编**后**它命中真值拼写 ⇒ `{}` = **不 stamp = 由引擎缺省决定**。方向说得通(用户写 yes 就是
|
|
36
|
-
* 要交互工具),但这是 headless `-p` 车道上一次真实的默认翻面,不能只活在拼写集的 diff 里。
|
|
37
|
-
* · 缺省(env 缺席/空串)= stamp false(无人值守正解);
|
|
38
|
-
* · 旧 server 白名单 fail-soft:server resolveSpec 逐字段白名单拼 TaskSpec,未知 body 字段静默
|
|
39
|
-
* 忽略(limits wire 同款勘察结论)——本字段发了白发不炸。gap-check 实拆 server 1.210.0 dist:
|
|
40
|
-
* resolveSpec(main.js:1233-)【不】读 body.interactiveTools ⇒ 需 server 半场补一行白名单,
|
|
41
|
-
* 壳先备(协作板记账)。
|
|
42
|
-
*/
|
|
43
1
|
import { hostEnv } from './hostEnv.js';
|
|
44
2
|
import { envFlagOff, envFlagOn } from './envFlag.js';
|
|
45
3
|
import { permissionModeFromArgv } from './headlessPermissionModeWire.js';
|
|
46
|
-
/** 部署旋钮 env 键名(settings.json env 块 → 1a-envseed → process.env 同车道)。 */
|
|
47
4
|
export const HEADLESS_INTERACTIVE_TOOLS_ENV = 'SEMA_HEADLESS_INTERACTIVE_TOOLS';
|
|
48
|
-
/**
|
|
49
|
-
* argv 里是否显式要了 plan 交互意图(`--permission-mode plan` / `--permission-mode=plan`;
|
|
50
|
-
* 后出现者赢,commander 同语义;`--` 之后不是 flag)。
|
|
51
|
-
*
|
|
52
|
-
* REF-CC-143(dup-10)收编,2026-08-01:这个函数原本自带一份与 headlessPermissionModeWire.
|
|
53
|
-
* permissionModeFromArgv 逐字重复的 argv 扫描循环(两个 headless 旋钮读的是同一个 `--permission-mode`
|
|
54
|
-
* flag,必须是同一份读法)。dup-10 证明过等价性:`permissionModeFromArgv` 的
|
|
55
|
-
* `--dangerously-skip-permissions` 分支只在没有显式 `--permission-mode` 时才返回
|
|
56
|
-
* `'bypassPermissions'`,那个值永远不等于 `'plan'`,所以对任意 argv 恒有
|
|
57
|
-
* `planModeExplicitlyRequested(argv) === (permissionModeFromArgv(argv) === 'plan')`——折成薄壳,
|
|
58
|
-
* 循环整个消失,而不只是「提取逻辑」被共享。
|
|
59
|
-
*/
|
|
60
5
|
export function planModeExplicitlyRequested(argv) {
|
|
61
6
|
return permissionModeFromArgv(argv) === 'plan';
|
|
62
7
|
}
|
|
63
|
-
// 一次性告警 latch(-p 是 one-shot 进程;测试钩子可重置)
|
|
64
8
|
let warnedInvalidEnv = false;
|
|
65
|
-
/**
|
|
66
|
-
* 解析 headless `-p` 的 interactiveTools stamp。纯函数除告警 latch。
|
|
67
|
-
* 调用方(seamQueryEngine.ask)live-gated:mock/pty 车道永不经过这里。
|
|
68
|
-
*/
|
|
69
9
|
export function resolveHeadlessInteractiveTools(argv, env = hostEnv()) {
|
|
70
|
-
// 1) 显式交互意图恒赢:--permission-mode plan ⇒ 不 stamp(plan 流程要 plan-review 门)。
|
|
71
10
|
if (planModeExplicitlyRequested(argv)) {
|
|
72
11
|
return { fields: {}, source: 'plan-flag' };
|
|
73
12
|
}
|
|
74
|
-
// 2) 部署旋钮。拼写集 = envFlagOn/envFlagOff(REF-CC-141 dup-02 单源)—— 修前本处是四份重复
|
|
75
|
-
// 实现里唯一不 lowercase 的一份(`raw==='true'||raw==='1'`),`SEMA_HEADLESS_INTERACTIVE_
|
|
76
|
-
// TOOLS=False` 会落进下面的「不是布尔值」warn 分支,现改为大小写不敏感 + 拼写集与其它九处同源。
|
|
77
13
|
const raw = env[HEADLESS_INTERACTIVE_TOOLS_ENV]?.trim();
|
|
78
14
|
if (raw !== undefined && raw !== '') {
|
|
79
15
|
if (envFlagOn(raw))
|
|
80
|
-
return { fields: {}, source: 'env' };
|
|
16
|
+
return { fields: {}, source: 'env' };
|
|
81
17
|
if (envFlagOff(raw))
|
|
82
18
|
return { fields: { interactiveTools: false }, source: 'env' };
|
|
83
19
|
const resolution = {
|
|
@@ -90,10 +26,8 @@ export function resolveHeadlessInteractiveTools(argv, env = hostEnv()) {
|
|
|
90
26
|
}
|
|
91
27
|
return resolution;
|
|
92
28
|
}
|
|
93
|
-
// 3) 缺省:无人值守 stamp false(AskUserQuestion/plan 门 roster 源头全灭)。
|
|
94
29
|
return { fields: { interactiveTools: false }, source: 'default' };
|
|
95
30
|
}
|
|
96
|
-
/** 测试钩子:重置一次性告警 latch。 */
|
|
97
31
|
export function _resetInteractiveToolsWireForTest() {
|
|
98
32
|
warnedInvalidEnv = false;
|
|
99
33
|
}
|
package/dist/leaderConflict.d.ts
CHANGED
|
@@ -1,68 +1,22 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* leaderConflict — leader run 终局 `needs_human` + `result.conflict` 的**三端共用读面**(0.72.10;server ≥7.83.0 C-R63 ④;
|
|
3
|
-
* 契约 §15;sdk `LeaderRecord.result` 声明为 `unknown`,本读器是它在客户端的唯一形)。
|
|
4
|
-
*
|
|
5
|
-
* ── 这一口答的是哪件事 ────────────────────────────────────────────────────────────────────
|
|
6
|
-
* 7.83.0 起 worker 分支合不上时,leader run **不再**起任何模型去解冲突,而是把冲突**列给用户**:`status:"needs_human"` +
|
|
7
|
-
* `result.conflict { baseSha, files[], filesTruncated?, workers[], rejHead? }` + `result.salvaged[]`(全部 worker 各一份补丁,尽力而为)。
|
|
8
|
-
* 壳只有「列出来 + 把补丁落盘」两件事;缺席语义 / 坏形判别 / 措辞三端各写一遍必各错一遍 ⇒ 归包。
|
|
9
|
-
*
|
|
10
|
-
* ── 🔴 五条契约读法(§15 逐字)──────────────────────────────────────────────────────────────
|
|
11
|
-
* ① **缺席不可分**:`result` 无 `conflict` 键 = 这一趟没有冲突,**或**对面是老 server(<7.83.0,那时冲突走别的终局)。
|
|
12
|
-
* 两者 wire 上不可区分 ⇒ 读数 `none`,措辞把两种可能都摆出来,不替 server 断言其中一种。
|
|
13
|
-
* ② **在场但读不懂 ≠ 缺席**:`conflict` 在场但必填座缺 / 形坏 ⇒ `unreadable`。它和 `none` 是两个词 —— server 明明报了冲突,
|
|
14
|
-
* 壳若因读不懂而渲成「没冲突」,用户会把一棵带冲突标记的树当干净树用。
|
|
15
|
-
* ③ **`filesTruncated` 只在清单被截断时在场且恒 `true`;缺席 = 这就是全部**。在场却不是 `true` ⇒ unreadable,不编「全部」也不编「截断」。
|
|
16
|
-
* ④ **`workers[].applied` 是布尔事实**:`false` = 这只 worker 的补丁没进树(冲突者本人,或排在它后面没轮到的)。`salvaged[].patch`
|
|
17
|
-
* 是**工件**(给落盘口),原样透传、不消毒、不截断;`rejHead` 是**屏上诊断片段**(server 已脱敏 ≤2 KiB),呈前按 UNTRUSTED-for-display
|
|
18
|
-
* 再过一次(转义控制符 + 封长)。两者在 server 侧走同一只脱敏口,客户端只按用途分「落盘 / 上屏」,不再加第二套判据。
|
|
19
|
-
* ⑤ **`needs_human` 是「等人」不是「失败」**:契约明令不许据它自动重试一条 leader run。措辞单源 {@link leaderConflictDetail},
|
|
20
|
-
* 句子里不出现重试;壳零自拼句子。
|
|
21
|
-
*
|
|
22
|
-
* ── 防御读纪律(与 `mcpReconnect` / `sessionMemoryStatus` 同律)─────────────────────────────
|
|
23
|
-
* · 永不抛:载体非对象 / 敌意 getter ⇒ `undefined`(记录本身不成形);`status` 缺席或非串 ⇒ `undefined`;
|
|
24
|
-
* · `status` 按**开集**透传(契约闭集四词,但客户端不替 server 断言闭集 —— 新词照带,壳 switch 必带 default);
|
|
25
|
-
* · 多余成员不过境,数组是新拷贝(壳改视图不回写 wire 体)。
|
|
26
|
-
*/
|
|
27
|
-
/** 契约 §15 `GET /v1/leader/:id` 的 `status` 四词(仅作词表;读器按开集透传)。 */
|
|
28
1
|
export declare const LEADER_RUN_STATUSES: readonly string[];
|
|
29
|
-
/** `rejHead` 上屏封长(显示字符;server 侧已 ≤2 KiB,这里是呈前的第二道,与工件字节无关)。 */
|
|
30
2
|
export declare const LEADER_REJ_HEAD_DISPLAY_MAX = 2048;
|
|
31
|
-
/** `conflict.workers[]` 一行:全部 completed worker;`applied:false` = 这只的补丁没进树。 */
|
|
32
3
|
export interface LeaderConflictWorkerView {
|
|
33
4
|
workerId: string;
|
|
34
5
|
branch: string;
|
|
35
6
|
applied: boolean;
|
|
36
7
|
}
|
|
37
|
-
/** `result.conflict` 段(契约 §15 表)。`filesTruncated` 只在为 `true` 时在场;`rejHead` 已按 UNTRUSTED-for-display 处理。 */
|
|
38
8
|
export interface LeaderConflictSectionView {
|
|
39
|
-
/** 用户侧的合并基点 = 这一趟的 durable base。 */
|
|
40
9
|
baseSha: string;
|
|
41
|
-
/** 有冲突标记 / `.rej` 的路径(只有路径,不含内容);可为空数组。 */
|
|
42
10
|
files: string[];
|
|
43
|
-
/** 在场恒 `true` = 清单被截断(缺的一条是未证明缺席);缺席 = 这就是全部。 */
|
|
44
11
|
filesTruncated?: true;
|
|
45
12
|
workers: LeaderConflictWorkerView[];
|
|
46
|
-
/** `.rej` 头,给人看冲突长什么样;已转义控制符并封长 ≤ {@link LEADER_REJ_HEAD_DISPLAY_MAX}。 */
|
|
47
13
|
rejHead?: string;
|
|
48
14
|
}
|
|
49
|
-
/** `result.salvaged[]` 一行:一只 worker 的补丁(工件,原样;给落盘口,不上屏)。 */
|
|
50
15
|
export interface LeaderSalvagedPatchView {
|
|
51
16
|
workerId: string;
|
|
52
17
|
sessionId: string;
|
|
53
18
|
patch: string;
|
|
54
19
|
}
|
|
55
|
-
/**
|
|
56
|
-
* 三形:
|
|
57
|
-
* · `none` —— `result` 无 `conflict` 键(未冲突 或 老 server,不可分);
|
|
58
|
-
* · `unreadable` —— `conflict` 在场但读不出(必填座缺 / 形坏);
|
|
59
|
-
* · `conflict` —— 读出来了。
|
|
60
|
-
* 三形都带 `status`(开集原样)与 `salvaged`(非冲突终局也可含未完成 worker 的补丁;缺席 = 空数组)+ `salvagedIncomplete?`。
|
|
61
|
-
*
|
|
62
|
-
* 🔴 `salvagedIncomplete`(异源对抗复审采纳):`salvaged` **在场但读不全**(不是数组 / 非空却全是坏行 / 好坏混合)⇒ 在场恒 `true`,
|
|
63
|
-
* 好行照常保留。它和「没有补丁」是两件事 —— 契约 §15 明说集成沙箱在 run 结束时销毁、分支不承诺可 fetch,`salvaged[]` 是冲突终局下
|
|
64
|
-
* 的**唯一补偿**;把一张读不出的表渲成「没有补丁」会让用户放弃去找原始结果。缺席 / `[]` / 全好 ⇒ 键不在场。
|
|
65
|
-
*/
|
|
66
20
|
export type LeaderConflictView = {
|
|
67
21
|
kind: 'none';
|
|
68
22
|
status: string;
|
|
@@ -80,18 +34,5 @@ export type LeaderConflictView = {
|
|
|
80
34
|
salvaged: LeaderSalvagedPatchView[];
|
|
81
35
|
salvagedIncomplete?: true;
|
|
82
36
|
};
|
|
83
|
-
/**
|
|
84
|
-
* 把 `GET /v1/leader/:id` 的记录(sdk `LeaderRecord`,`result` 为 `unknown`)投成 {@link LeaderConflictView}。
|
|
85
|
-
* 永不抛;记录本身不成形(非对象 / `status` 缺席或非串 / 敌意 getter)⇒ `undefined`。
|
|
86
|
-
*/
|
|
87
37
|
export declare function projectLeaderConflict(record: unknown): LeaderConflictView | undefined;
|
|
88
|
-
/**
|
|
89
|
-
* 一句措辞的**唯一铸点**(三端共用;壳零自拼)。
|
|
90
|
-
* · `conflict`:等人 + 基点短 sha + 冲突文件数(截断则明说)+ 哪几支进了树 / 没进 + 打捞补丁句;
|
|
91
|
-
* · `none`:只说「没有报告冲突详情」,🔴 **明说这不证明已经合并**(异源对抗复审采纳:`running` 与未进合并的 `failed` 也走这句,
|
|
92
|
-
* 缺席只证明没有冲突报告,不证明执行过合并 —— 说成「已无冲突合并」会让用户以为工作已合入而不去恢复);
|
|
93
|
-
* · `unreadable`:server 报了冲突但读不出,让用户去 server 侧看。
|
|
94
|
-
* 三句都带同一条打捞补丁句(有数带数 / 零则如实说没有 / 读不全则说材料存在但读不出,绝不说「没有」)。
|
|
95
|
-
* 🔴 句子里不出现重试(契约:`needs_human` 在等人)。`rejHead` / `patch` 一个字节都不进句子。
|
|
96
|
-
*/
|
|
97
38
|
export declare function leaderConflictDetail(view: LeaderConflictView): string;
|