@sema-agent/client-core 0.77.1 → 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 +13 -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 +0 -69
- package/dist/mcpWireCaps.d.ts +0 -55
- package/dist/mcpWireCaps.js +1 -13
- package/dist/memoryComplianceCapability.d.ts +3 -57
- package/dist/memoryComplianceCapability.js +0 -57
- package/dist/memoryEntriesWire.d.ts +6 -198
- package/dist/memoryEntriesWire.js +0 -144
- package/dist/memoryOriginCapability.d.ts +3 -53
- package/dist/memoryOriginCapability.js +0 -50
- package/dist/memorySpecWire.d.ts +0 -116
- package/dist/memorySpecWire.js +0 -150
- package/dist/model/catalog.d.ts +0 -111
- package/dist/model/catalog.js +0 -87
- package/dist/model/catalogLoader.d.ts +0 -114
- package/dist/model/catalogLoader.js +2 -139
- package/dist/model/modelSupplyRules.d.ts +1 -55
- package/dist/model/modelSupplyRules.js +0 -62
- package/dist/model/providerAuth.d.ts +0 -103
- package/dist/model/providerAuth.js +2 -38
- package/dist/model/providerCatalog.d.ts +0 -45
- package/dist/model/providerCatalog.js +0 -37
- package/dist/model/providerPresets.d.ts +0 -33
- package/dist/model/providerPresets.js +2 -91
- package/dist/model/tierVocabulary.d.ts +0 -31
- package/dist/model/tierVocabulary.js +0 -27
- package/dist/modelBudgetRule.d.ts +0 -39
- package/dist/modelBudgetRule.js +0 -39
- package/dist/modelCapabilityProbe.d.ts +0 -175
- package/dist/modelCapabilityProbe.js +0 -147
- package/dist/modelWireCaps.d.ts +0 -13
- package/dist/modelWireCaps.js +0 -13
- package/dist/notifications.d.ts +0 -233
- package/dist/notifications.js +14 -492
- package/dist/oneShotWireCaps.d.ts +0 -34
- package/dist/oneShotWireCaps.js +0 -35
- package/dist/ownKey.d.ts +0 -33
- package/dist/ownKey.js +0 -33
- package/dist/panelRunningHistory.d.ts +0 -28
- package/dist/panelRunningHistory.js +0 -43
- package/dist/peerFrames.d.ts +0 -71
- package/dist/peerFrames.js +0 -168
- package/dist/peerLaneCapability.d.ts +0 -44
- package/dist/peerLaneCapability.js +0 -52
- package/dist/permissionRuleIssue.d.ts +0 -30
- package/dist/permissionRuleIssue.js +0 -78
- package/dist/permissionRulesWriteCapability.d.ts +0 -46
- package/dist/permissionRulesWriteCapability.js +0 -54
- package/dist/permissionWireCaps.d.ts +0 -37
- package/dist/permissionWireCaps.js +0 -37
- package/dist/postureKnob.d.ts +0 -71
- package/dist/postureKnob.js +0 -86
- package/dist/principalWire.d.ts +0 -17
- package/dist/principalWire.js +0 -17
- package/dist/printToolResultFrame.d.ts +0 -100
- package/dist/printToolResultFrame.js +0 -33
- package/dist/promptProfileWireCaps.d.ts +0 -13
- package/dist/promptProfileWireCaps.js +0 -13
- package/dist/readFacePosture.d.ts +0 -43
- package/dist/readFacePosture.js +0 -46
- package/dist/request/printNotification.d.ts +0 -20
- package/dist/request/printNotification.js +0 -55
- package/dist/request/taskRequest.d.ts +0 -249
- package/dist/request/taskRequest.js +6 -498
- package/dist/resumeRefusalCopy.d.ts +0 -136
- package/dist/resumeRefusalCopy.js +1 -117
- package/dist/retainBackgroundWireCaps.d.ts +0 -48
- package/dist/retainBackgroundWireCaps.js +0 -48
- package/dist/retryStatus.d.ts +2 -221
- package/dist/retryStatus.js +0 -107
- package/dist/rewindWireCaps.d.ts +0 -27
- package/dist/rewindWireCaps.js +0 -24
- package/dist/runCancelContext.d.ts +1 -20
- package/dist/runCancelContext.js +0 -34
- package/dist/runTerminal.d.ts +0 -273
- package/dist/runTerminal.js +0 -177
- package/dist/sandboxWire.d.ts +0 -38
- package/dist/sandboxWire.js +0 -82
- package/dist/scenarioWire.d.ts +0 -60
- package/dist/scenarioWire.js +0 -68
- package/dist/scratchpadWireCaps.d.ts +0 -11
- package/dist/scratchpadWireCaps.js +0 -32
- package/dist/sdkWireTransit.d.ts +0 -38
- package/dist/sdkWireTransit.js +0 -30
- package/dist/seam.d.ts +18 -853
- package/dist/seam.js +0 -52
- package/dist/seatContract.d.ts +0 -555
- package/dist/seatContract.js +5 -304
- package/dist/selfOrchestrationDenial.d.ts +0 -189
- package/dist/selfOrchestrationDenial.js +0 -162
- package/dist/selfOrchestrationWireCaps.d.ts +0 -38
- package/dist/selfOrchestrationWireCaps.js +0 -38
- package/dist/sessionMap.d.ts +0 -60
- package/dist/sessionMap.js +0 -37
- package/dist/sessionMemoryStatus.d.ts +11 -114
- package/dist/sessionMemoryStatus.js +0 -112
- package/dist/sessionModelLatch.d.ts +0 -29
- package/dist/sessionModelLatch.js +0 -40
- package/dist/sessionPolicyCapability.d.ts +3 -53
- package/dist/sessionPolicyCapability.js +0 -52
- package/dist/sessionSlot.d.ts +0 -26
- package/dist/sessionSlot.js +0 -17
- package/dist/skillsWireCaps.d.ts +0 -87
- package/dist/skillsWireCaps.js +0 -38
- package/dist/sqlEngineCapability.d.ts +0 -118
- package/dist/sqlEngineCapability.js +0 -134
- package/dist/sseIdleTriage.d.ts +0 -79
- package/dist/sseIdleTriage.js +1 -80
- package/dist/steering.d.ts +0 -54
- package/dist/steering.js +0 -63
- package/dist/subagent/engineCompactWire.d.ts +0 -34
- package/dist/subagent/engineCompactWire.js +4 -134
- package/dist/subagent/engineDelegatedPrompt.d.ts +0 -31
- package/dist/subagent/engineDelegatedPrompt.js +1 -103
- package/dist/subagent/engineRowStopGate.d.ts +0 -20
- package/dist/subagent/engineRowStopGate.js +0 -49
- package/dist/subagent/engineSubagentOutput.d.ts +0 -7
- package/dist/subagent/engineSubagentOutput.js +1 -51
- package/dist/subagent/engineSubagentResume.d.ts +2 -279
- package/dist/subagent/engineSubagentResume.js +2 -129
- package/dist/subagent/engineSubagentSteer.d.ts +0 -26
- package/dist/subagent/engineSubagentSteer.js +0 -63
- package/dist/subagent/engineSubagentTail.d.ts +0 -38
- package/dist/subagent/engineSubagentTail.js +2 -110
- package/dist/subagent/engineTaskHandleWire.d.ts +6 -67
- package/dist/subagent/engineTaskHandleWire.js +0 -126
- package/dist/subagent/subagentOwnerAbsence.d.ts +0 -2
- package/dist/subagent/subagentOwnerAbsence.js +0 -25
- package/dist/subagentContentStore.d.ts +3 -260
- package/dist/subagentContentStore.js +7 -540
- package/dist/systemReminderTag.d.ts +0 -49
- package/dist/systemReminderTag.js +0 -61
- package/dist/toolResult.d.ts +1 -211
- package/dist/toolResult.js +1 -358
- package/dist/toolRoster.d.ts +0 -140
- package/dist/toolRoster.js +0 -66
- package/dist/typePins.d.ts +0 -46
- package/dist/types/engineState.d.ts +0 -71
- package/dist/types/engineState.js +0 -16
- package/dist/ultracodeWireCaps.d.ts +0 -75
- package/dist/ultracodeWireCaps.js +0 -92
- package/dist/unrefTimer.d.ts +0 -27
- package/dist/webSearchBackendCapability.d.ts +0 -72
- package/dist/webSearchBackendCapability.js +0 -79
- package/dist/webSearchWireCaps.d.ts +0 -37
- package/dist/webSearchWireCaps.js +0 -34
- package/dist/websearch/searchProviderPresets.d.ts +0 -81
- package/dist/websearch/searchProviderPresets.js +0 -27
- package/dist/wireErrorTriage.d.ts +4 -160
- package/dist/wireErrorTriage.js +0 -171
- package/dist/wireRefusalCopy.d.ts +0 -28
- package/dist/wireRefusalCopy.js +0 -28
- package/dist/workflow.d.ts +0 -40
- package/dist/workflow.js +0 -52
- package/dist/workflowClient.d.ts +0 -122
- package/dist/workflowClient.js +8 -360
- package/dist/workflowMonitor.d.ts +2 -72
- package/dist/workflowMonitor.js +0 -26
- package/dist/writeProtectionCapability.d.ts +0 -112
- package/dist/writeProtectionCapability.js +0 -109
- package/docs/INTEGRATION-CLIENTS.md +30 -1
- package/package.json +1 -1
|
@@ -1,77 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* armedGateRegistry.ts — per-session 呈现台账:哪些决断卡在**这个宿主进程的哪个会话**里真的
|
|
3
|
-
* 呈现过(A-028.3,#244 族A 包半场,2026-08-12;源形 = cli `src/sema/armedGateRegistry.ts`,
|
|
4
|
-
* 上收时由模块级单 Set 改为 sessionSlot per-session 键,支持多会话宿主。二段(#244 F1 换装批,
|
|
5
|
-
* 2026-08-14):壳侧剩余两位 —— **arm 事件源**(呈现回执)与 **plan_review 呈现分代** —— 一并
|
|
6
|
-
* 上收,壳侧台账本体退役)。
|
|
7
|
-
*
|
|
8
|
-
* ── 为什么需要它 ────────────────────────────────────────────────────────────────────────────
|
|
9
|
-
* 409 自愈重开臂(`adapter/activeRunSelfHeal.ts` 的分诊消费方)此前对每一张 pending 卡都说
|
|
10
|
-
* 「that card was closed without being answered, so sema reopened it」。但已定谳的机理链
|
|
11
|
-
* (plan approve → outcome enqueue 成新提交 → 引擎已推进到**新** gate → 该提交撞 409 →
|
|
12
|
-
* 重开腿铸出全新 pending 卡)里,那张卡是**首见**的 —— 从未被 arm 过,更谈不上 closed/
|
|
13
|
-
* reopened。文案对首见卡编造历史 = 对用户下一个证不出的断言。重开机制本身是设计内的
|
|
14
|
-
* surfacing 路径(承重,不动);本台账只供「说了什么」分形:firstSight 判据 = 这张卡的身份键
|
|
15
|
-
* 有没有在本进程本会话呈现过。
|
|
16
|
-
*
|
|
17
|
-
* ── 键的词汇(单源 = `gateIdentity.ts`,别自造字面)────────────────────────────────────────
|
|
18
|
-
* · tool 审批卡:durable 腿 = `approvalCallKey(gatedCallId, taskId)`;live 帧腿 =
|
|
19
|
-
* `liveFrameCallKey(approvalId)`(帧上无 gatedCallId,与 pending 行的 callId 天然对不上 ——
|
|
20
|
-
* 漏配的代价只是把「重开」说成「呈上」,首见文案零历史断言,诚实方向安全)。
|
|
21
|
-
* · AskUserQuestion overlay:`askGateQuestionId(callKey)` 铸帧 id,本台账经
|
|
22
|
-
* {@link registerArmedGateFromQuestionId} 剥前缀取键(= callKey,与卡键同域)。
|
|
23
|
-
* · plan_review:`planReviewQuestionId(taskId)` 整串作键(保留前缀,与 taskId 直接作 ask 键
|
|
24
|
-
* 永不撞域);重开腿铸 `…#reopen-*`,归一化剥尾 —— 首呈与重开落同一键。
|
|
25
|
-
* 🔴 A-024.4(#250,#244 F1 起分代在包;2026-08-19 随 `ActiveRunPendingGate` 现值订正 ——
|
|
26
|
-
* 原句「wire 上没有 gate 实例位,[3664] pendingGate 只有 kind/decidePath」已过期):
|
|
27
|
-
* `ActiveRunPendingGate`(见 `adapter/runStream.ts`)今天已长到四位(kind/decidePath/
|
|
28
|
-
* governanceForced/**checkpointId**,#285 件2,0.36.0)—— `governanceForced` 是纯归因布尔,
|
|
29
|
-
* 不是身份;`checkpointId` 才是这材料上第一个够得上「实例位」气味的东西,但它自己的头注
|
|
30
|
-
* 明文划了界:**不是跨调用的稳定去重键**(同 session 可并存多条 pending checkpoint、server
|
|
31
|
-
* 选行是无序 `LIMIT 1`,同一情形连续两次 409 可能报出不同 id,也可能 id 不变而
|
|
32
|
-
* `activeTaskId` 已换),且缺席是「未诞生 / 校验未过 / 整只读取失败」三成因合流,读不出
|
|
33
|
-
* 「这不是同一道门」。⇒ 它不能安全替掉本节的按呈现代数分代 —— `pendingGateIsProvablyDifferent`
|
|
34
|
-
* 那种单向谓词(「id 变了 ⇒ 确实不同」)本节用不上:分代要答的是「这是不是同一张**卡**」的
|
|
35
|
-
* 双向问题,checkpointId 只背书单向的那半。plan 键因此仍按**呈现代数**分代(见
|
|
36
|
-
* {@link planReviewArmedKeyFor} / {@link notePlanReviewAnsweredFor}):0 代键与 canonical
|
|
37
|
-
* 字节同形,≥1 代接 `#g<N>` 尾;决断性作答推代(消费当代门),下一只门读回首见。
|
|
38
|
-
*
|
|
39
|
-
* ── 登记点(「没呈现就不算 arm」)───────────────────────────────────────────────────────────
|
|
40
|
-
* ① 宿主呈现面:overlay 收到可渲染 question 帧时 / 卡口真把卡 enqueue 进渲染队列时,宿主调
|
|
41
|
-
* {@link registerArmedGateFromQuestionId} / {@link registerArmedGate}(auto-allow/deny/
|
|
42
|
-
* 失败臂不登记)。包的 publish 点**不**代登记 —— publish 无 overlay 时是 no-op,代登记 =
|
|
43
|
-
* 把「发过帧」谎报成「呈现过」。
|
|
44
|
-
* ② 重开腿:先读(firstSight 判决)后写。🔴 回执模式(`planReviewWire` 的
|
|
45
|
-
* `presentationReceiptMs`,#250 件1 语义)下重开腿**零登记**:登记时点 = 宿主呈现面的真
|
|
46
|
-
* 入队点(即 ① 的调用),零回执还登记 = 下次谎称复见。
|
|
47
|
-
* ③ 消费点:plan_review 的**决断性**作答(approve/reject)经 {@link notePlanReviewAnswered}
|
|
48
|
-
* 族推代(当代键同时清掉,`clearArmedGate` 的旧语义在 0 代保持逐字兼容);dismissal
|
|
49
|
-
* (Esc/空答)不推代 —— 门没被消费,下次重开要照实说「reopened」。ask 族键粒度是
|
|
50
|
-
* callId(每 gate 唯一),无此问题,不消费。
|
|
51
|
-
*
|
|
52
|
-
* ── arm 事件源(#250 件1「呈现回执」;#244 F1 上收)────────────────────────────────────────
|
|
53
|
-
* `registerArmedGate` 是「卡真呈现了」的唯一汇聚点,所以重开腿的回执 = 等它的**调用事件**
|
|
54
|
-
* ({@link waitForGateArmed})。事件按每次调用发(不是集合成员测试)—— 复见重开的第二次呈现
|
|
55
|
-
* 同样要有回执;集合本身 arm 一次恒真,当不了事件源。{@link onGateArmed} 是**无窗**订阅位
|
|
56
|
-
* (#269 tool 门臂问的是「这条链的整个寿命里这张卡到底呈现过没有」,带窗回执答不了它)。
|
|
57
|
-
* 尝试级回执:{@link registerArmedGateFromQuestionId} 对**原始帧 id**(带 `#reopen-*` 尾)在
|
|
58
|
-
* 归一键之外事件级加发一枪(不入 Set)—— 同 gate 两次在飞重开时,一次真入队只唤对应那次尝试。
|
|
59
|
-
* 🔴 承重前提(server [3664]③):local 部署形 attach 重连恒零卡帧补发 —— 回执必须宿主进程内闭环。
|
|
60
|
-
*
|
|
61
|
-
* per-session 语义:sessionSlot 注册表(desktop session-host 多引擎会话互不串账);零参 API =
|
|
62
|
-
* DEFAULT_SESSION_KEY 兼容层,单会话宿主(cli)装配一行不动。callId 全局唯一,跨 /clear 不撞键。
|
|
63
|
-
*/
|
|
64
1
|
import { createSessionSlot, DEFAULT_SESSION_KEY } from '../sessionSlot.js';
|
|
65
2
|
import { armedKeyFromQuestionId, PLAN_REVIEW_QUESTION_ID_PREFIX, planReviewQuestionId, REOPEN_ID_TAIL } from './gateIdentity.js';
|
|
66
|
-
// 🔴 模块级单例(singleton-manifest 登记):per-session 键 → 已呈现身份键集。
|
|
67
3
|
const armedGatesByKey = createSessionSlot();
|
|
68
|
-
// 🔴 同为模块级单例:per-session 键 → 监听器集(两份实例 ⇒ 登记面与等待面各持一半,回执恒 miss)。
|
|
69
4
|
const armedListenersByKey = createSessionSlot();
|
|
70
|
-
// ── plan_review 呈现分代(A-024.4;#244 F1 上收,语义照壳现实现)──────────────────────────────
|
|
71
|
-
/** per-session:taskId → 已消费的 plan 门数(= 当前代数;0 代键保持与 canonical 字节同形)。 */
|
|
72
5
|
const planReviewGenByKey = createSessionSlot();
|
|
73
|
-
/** per-session:已记过账的 plan 问答卡 id(答卡两条通路 —— overlay answerAndRelease 与 responder
|
|
74
|
-
* —— 会对同一张卡各报一次,按完整 questionId 去重,恰推一代)。 */
|
|
75
6
|
const notedPlanReviewIdsByKey = createSessionSlot();
|
|
76
7
|
function setFor(sessionKey) {
|
|
77
8
|
let s = armedGatesByKey.get(sessionKey);
|
|
@@ -105,62 +36,42 @@ function notedIdsFor(sessionKey) {
|
|
|
105
36
|
}
|
|
106
37
|
return s;
|
|
107
38
|
}
|
|
108
|
-
/** 事件级发一枪(不动 Set)。监听器抛错不许炸登记面 —— 回执面是诊断/判决辅助面。 */
|
|
109
39
|
function emitGateArmedEventFor(sessionKey, key) {
|
|
110
40
|
for (const listener of [...listenersFor(sessionKey)]) {
|
|
111
41
|
try {
|
|
112
42
|
listener(key);
|
|
113
43
|
}
|
|
114
44
|
catch {
|
|
115
|
-
/* 绝不反噬呈现链 */
|
|
116
45
|
}
|
|
117
46
|
}
|
|
118
47
|
}
|
|
119
|
-
/** 登记一个已呈现的决断卡身份键(空/非法输入静默忽略 —— 登记面绝不炸渲染链)。
|
|
120
|
-
* 每次调用都发事件(复见重开的第二次呈现也要有回执;Set 成员级当不了事件源)。 */
|
|
121
48
|
export function registerArmedGate(key) {
|
|
122
49
|
registerArmedGateFor(DEFAULT_SESSION_KEY, key);
|
|
123
50
|
}
|
|
124
|
-
/** W1 带 key 变体(多会话宿主每会话一键,互不串账)。 */
|
|
125
51
|
export function registerArmedGateFor(sessionKey, key) {
|
|
126
52
|
if (typeof key !== 'string' || key.length === 0)
|
|
127
53
|
return;
|
|
128
54
|
setFor(sessionKey).add(key);
|
|
129
55
|
emitGateArmedEventFor(sessionKey, key);
|
|
130
56
|
}
|
|
131
|
-
/** 该身份键的卡在本进程本会话呈现过吗?(false = 首见;文案分形的唯一判据) */
|
|
132
57
|
export function wasGateArmed(key) {
|
|
133
58
|
return wasGateArmedFor(DEFAULT_SESSION_KEY, key);
|
|
134
59
|
}
|
|
135
|
-
/** W1 带 key 变体。 */
|
|
136
60
|
export function wasGateArmedFor(sessionKey, key) {
|
|
137
61
|
if (typeof key !== 'string' || key.length === 0)
|
|
138
62
|
return false;
|
|
139
63
|
return armedGatesByKey.get(sessionKey)?.has(key) === true;
|
|
140
64
|
}
|
|
141
|
-
/** 消费一个身份键(plan 族的决断消费请优先走 {@link notePlanReviewAnswered} 族 —— 它同时推代;
|
|
142
|
-
* 本口保留给「只清账不推代」的宿主场景与 0.30.0 存量消费方,语义不变)。 */
|
|
143
65
|
export function clearArmedGate(key) {
|
|
144
66
|
clearArmedGateFor(DEFAULT_SESSION_KEY, key);
|
|
145
67
|
}
|
|
146
|
-
/** W1 带 key 变体。 */
|
|
147
68
|
function clearArmedGateFor(sessionKey, key) {
|
|
148
69
|
if (typeof key === 'string' && key.length > 0)
|
|
149
70
|
armedGatesByKey.get(sessionKey)?.delete(key);
|
|
150
71
|
}
|
|
151
|
-
/**
|
|
152
|
-
* 订阅 arm 事件(#269 上收):返回退订钩,调用方**必须**在自己的生命周期末调它(监听器挂在
|
|
153
|
-
* 模块级长存表上,漏退 = 闭包泄漏)。
|
|
154
|
-
*
|
|
155
|
-
* 🔴 为什么不复用 {@link waitForGateArmed}:那是**带窗**的一次性回执(超时即 resolve false),
|
|
156
|
-
* 它答的是「看门狗窗内呈现了没有」;#269 的 tool 门臂另外要问一个**无窗**的事实 ——「这条链的
|
|
157
|
-
* 整个寿命里,这张卡到底有没有呈现过」。用带窗的那只当事实源,会在「迟到卡」(窗后才入队)上
|
|
158
|
-
* 给出 false ⇒ 把一次真呈现误判成「行从未出生」⇒ 回环再铸一张卡,同一个待决项两张可按的卡。
|
|
159
|
-
*/
|
|
160
72
|
export function onGateArmed(listener) {
|
|
161
73
|
return onGateArmedFor(DEFAULT_SESSION_KEY, listener);
|
|
162
74
|
}
|
|
163
|
-
/** W1 带 key 变体。 */
|
|
164
75
|
function onGateArmedFor(sessionKey, listener) {
|
|
165
76
|
const listeners = listenersFor(sessionKey);
|
|
166
77
|
listeners.add(listener);
|
|
@@ -168,34 +79,17 @@ function onGateArmedFor(sessionKey, listener) {
|
|
|
168
79
|
listeners.delete(listener);
|
|
169
80
|
};
|
|
170
81
|
}
|
|
171
|
-
/**
|
|
172
|
-
* 呈现回执的缺省看门狗窗(#250 件1;重开臂共用单源,免得每臂各持一个会漂的数)。要盖住的最慢
|
|
173
|
-
* 真实成功路:tool 门臂整链重跑一次(attempt→2s 退避→attempt,各含一跳 approvals.list)与
|
|
174
|
-
* question 臂 overlay 的 PermissionRequest hooks 窗。
|
|
175
|
-
*/
|
|
176
82
|
const GATE_ARMED_WAIT_MS = 5000;
|
|
177
83
|
let gateArmedWaitOverrideMs = null;
|
|
178
|
-
/** 测试用:缩短回执看门狗(null 复位)。 */
|
|
179
84
|
export function _setGateArmedWaitMsForTest(ms) {
|
|
180
85
|
gateArmedWaitOverrideMs = ms;
|
|
181
86
|
}
|
|
182
|
-
/** 回执看门狗现值(重开臂的缺省等待窗)。 */
|
|
183
87
|
export function gateArmedWaitMs() {
|
|
184
88
|
return gateArmedWaitOverrideMs ?? GATE_ARMED_WAIT_MS;
|
|
185
89
|
}
|
|
186
|
-
/**
|
|
187
|
-
* 等「这几个键里任意一个被 arm」的**事件**(#250 件1 呈现回执)。resolve true = 回执到手;
|
|
188
|
-
* false = 超时(呈现链没走到真入队 —— hook 自动应答/去重丢帧/enqueue 失败/处理器僵死)。
|
|
189
|
-
*
|
|
190
|
-
* 🔴 timer **不 unref**(包 `abortableSleep` 同判据):调用方(重开臂)正 await 本 promise 收
|
|
191
|
-
* verdict —— 回执窗里这只 timer 可能是事件循环里唯一的活,unref 会让 `-p` 车道进程在 await
|
|
192
|
-
* 中途直接退出,诚实的 reopen-failed 行一并蒸发。代价上限 = 一次 timeoutMs 的进程存活延长,
|
|
193
|
-
* 换判决必达。(浏览器宿主无 unref 概念,裸 setTimeout 两端行为一致 —— portability 零分支。)
|
|
194
|
-
*/
|
|
195
90
|
export function waitForGateArmed(keys, timeoutMs) {
|
|
196
91
|
return waitForGateArmedFor(DEFAULT_SESSION_KEY, keys, timeoutMs);
|
|
197
92
|
}
|
|
198
|
-
/** W1 带 key 变体。 */
|
|
199
93
|
export function waitForGateArmedFor(sessionKey, keys, timeoutMs) {
|
|
200
94
|
const wanted = new Set(keys.filter((k) => typeof k === 'string' && k.length > 0));
|
|
201
95
|
if (wanted.size === 0)
|
|
@@ -216,11 +110,6 @@ export function waitForGateArmedFor(sessionKey, keys, timeoutMs) {
|
|
|
216
110
|
}, timeoutMs);
|
|
217
111
|
});
|
|
218
112
|
}
|
|
219
|
-
/**
|
|
220
|
-
* question 帧 id → 台账键(登记口用):基础归一(剥 ask 前缀/剥重开尾)= `gateIdentity.
|
|
221
|
-
* armedKeyFromQuestionId`;plan_review 形在其上叠**呈现代数**(A-024.4)—— 登记与查询都落在
|
|
222
|
-
* **当代**键上。不认识的形原样入册(未来新 id 形至多多占一个键,不误伤既有词汇)。
|
|
223
|
-
*/
|
|
224
113
|
function armedKeyForQuestionIdFor(sessionKey, questionId) {
|
|
225
114
|
const base = armedKeyFromQuestionId(questionId);
|
|
226
115
|
if (base.startsWith(PLAN_REVIEW_QUESTION_ID_PREFIX)) {
|
|
@@ -228,25 +117,12 @@ function armedKeyForQuestionIdFor(sessionKey, questionId) {
|
|
|
228
117
|
}
|
|
229
118
|
return base;
|
|
230
119
|
}
|
|
231
|
-
/** 宿主呈现面登记口:收到可渲染 question 帧即记(键归一见 gateIdentity;坏形静默忽略 ——
|
|
232
|
-
* id 是 wire/合成位,入参按边界收 unknown,本函数就是窄化动作本身)。
|
|
233
|
-
*
|
|
234
|
-
* 尝试级回执(#250 复审 轮二 [medium]):原始帧 id 自带 `#reopen-*` 尝试序号,是现成的
|
|
235
|
-
* attempt token —— 归一键之外**事件级**再发一枪原始 id(不入 Set,台账词汇保持归一键)。
|
|
236
|
-
* 重开臂锚它,同 gate 两次在飞重开时一次真入队只唤对应那次尝试,不再同键互唤。 */
|
|
237
120
|
export function registerArmedGateFromQuestionId(questionId) {
|
|
238
121
|
registerArmedGateFromQuestionIdFor(DEFAULT_SESSION_KEY, questionId);
|
|
239
122
|
}
|
|
240
|
-
/** W1 带 key 变体。 */
|
|
241
123
|
function registerArmedGateFromQuestionIdFor(sessionKey, questionId) {
|
|
242
124
|
if (typeof questionId !== 'string' || questionId.length === 0)
|
|
243
125
|
return;
|
|
244
|
-
// 🔴 canonical 复用的去重记号过期(复审 #244 F1 轮一 [medium]):arm 臂对同 run 每只 plan gate
|
|
245
|
-
// 都复用 `plan-review:<taskId>` 这个 canonical id —— 决断记账按完整 questionId 去重,若记号不随
|
|
246
|
-
// 卡换代过期,第二只 canonical 卡的决断会撞上第一只留下的记号 ⇒ 不推代 ⇒ 第三只门的重开又谎报
|
|
247
|
-
// 「被关过」。**新 canonical 卡的呈现**就是「上一张同 id 卡已消解、这是新实例」的宿主侧可见时刻,
|
|
248
|
-
// 在此把旧记号过期;reopen 尾 id 进程内唯一,记号永不相撞,不用过期。方向:同一张卡「两路各报
|
|
249
|
-
// 一次」之间夹进一次同 id 重呈会双推代 —— 误差落首见话术(零历史断言),诚实安全侧。
|
|
250
126
|
if (questionId.startsWith(PLAN_REVIEW_QUESTION_ID_PREFIX) && !questionId.includes(REOPEN_ID_TAIL)) {
|
|
251
127
|
notedPlanReviewIdsByKey.get(sessionKey)?.delete(questionId);
|
|
252
128
|
}
|
|
@@ -255,37 +131,17 @@ function registerArmedGateFromQuestionIdFor(sessionKey, questionId) {
|
|
|
255
131
|
if (questionId !== normalized)
|
|
256
132
|
emitGateArmedEventFor(sessionKey, questionId);
|
|
257
133
|
}
|
|
258
|
-
/**
|
|
259
|
-
* plan_review 的台账键(当代)。0 代 = `planReviewQuestionId(taskId)`(canonical 原形 ——
|
|
260
|
-
* overlay 对**原卡**(done 帧首扎)的登记落进同一键);≥1 代 = 同形 + `#g<N>` 尾。
|
|
261
|
-
*/
|
|
262
134
|
export function planReviewArmedKey(taskId) {
|
|
263
135
|
return planReviewArmedKeyFor(DEFAULT_SESSION_KEY, taskId);
|
|
264
136
|
}
|
|
265
|
-
/** W1 带 key 变体。 */
|
|
266
137
|
export function planReviewArmedKeyFor(sessionKey, taskId) {
|
|
267
138
|
const gen = planReviewGenByKey.get(sessionKey)?.get(taskId) ?? 0;
|
|
268
139
|
const canonical = planReviewQuestionId(taskId);
|
|
269
140
|
return gen > 0 ? `${canonical}#g${String(gen)}` : canonical;
|
|
270
141
|
}
|
|
271
|
-
/**
|
|
272
|
-
* 记「一张 plan 问答卡被答掉了」⇒ 当代门已被消费,同 run 的**下一只** plan 门是新实例,落新键。
|
|
273
|
-
*
|
|
274
|
-
* ── 为什么锚在「答卡」而不是「决断送达」(局限成文,A-024.4)────────────────────────────────
|
|
275
|
-
* wire 上没有 gate 实例位,宿主能看见的最晚可靠时刻是作答(送达成败在 responder 返回之后才
|
|
276
|
-
* 揭晓)。所以按「答卡」推代。方向代价:决断若终败(重试后仍没送达),门 1 其实还 pending,
|
|
277
|
-
* 下一次重开会判成首见 ——「呈上了一张卡」零历史断言,诚实方向安全;反向(不推代)才会编造
|
|
278
|
-
* 「被关过」。当代键同时从台账清掉(`clearArmedGate` 的 0.30.0 语义在 0 代逐字保持:决断递交后
|
|
279
|
-
* `wasGateArmed(canonical)` 读回 false)。
|
|
280
|
-
*
|
|
281
|
-
* 🔴 决断性门控请走 {@link notePlanReviewAnsweredIfDecisive}(`planReviewWire`):Esc/空答是
|
|
282
|
-
* dismissal 不是决断 —— 那时推代会把「被关过」翻成「首见」,恰是 A-024.4 在最常见路径(Esc
|
|
283
|
-
* 关卡)上要保住的区分。本口只做记账,不做分类。
|
|
284
|
-
*/
|
|
285
142
|
export function notePlanReviewAnswered(questionId) {
|
|
286
143
|
notePlanReviewAnsweredFor(DEFAULT_SESSION_KEY, questionId);
|
|
287
144
|
}
|
|
288
|
-
/** W1 带 key 变体。 */
|
|
289
145
|
export function notePlanReviewAnsweredFor(sessionKey, questionId) {
|
|
290
146
|
if (typeof questionId !== 'string' || !questionId.startsWith(PLAN_REVIEW_QUESTION_ID_PREFIX))
|
|
291
147
|
return;
|
|
@@ -298,12 +154,10 @@ export function notePlanReviewAnsweredFor(sessionKey, questionId) {
|
|
|
298
154
|
const taskId = cut >= 0 ? base.slice(0, cut) : base;
|
|
299
155
|
if (taskId.length === 0)
|
|
300
156
|
return;
|
|
301
|
-
// 当代键先清(0 代 = canonical,保持 0.30.0 clear-on-decide 的读面语义)再推代。
|
|
302
157
|
clearArmedGateFor(sessionKey, planReviewArmedKeyFor(sessionKey, taskId));
|
|
303
158
|
const gens = genMapFor(sessionKey);
|
|
304
159
|
gens.set(taskId, (gens.get(taskId) ?? 0) + 1);
|
|
305
160
|
}
|
|
306
|
-
/** 测试用:清全部会话的台账(含监听器/代数/答卡记账 —— 半清会让跨用例判决互相污染)。 */
|
|
307
161
|
export function _resetArmedGateRegistryForTest() {
|
|
308
162
|
armedGatesByKey.clear();
|
|
309
163
|
armedListenersByKey.clear();
|
|
@@ -1,75 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ⇄ B7 批搬迁(2026-07-27,设计稿 §3 B7):cli `src/sema/liveHitlAskWire.ts`(658 行)**整条进包**
|
|
3
|
-
* (设计稿表 §2.5:`S/liveHitlAskWire.ts | 659 | utils/debug · utils/messages(dyn) | B7`)。
|
|
4
|
-
*
|
|
5
|
-
* 🔴 搬迁差分(逐条,零行为变化;每条都在 pure 门 B7 段有断言):
|
|
6
|
-
* 1. `logForDebugging(x)` / `logForDebugging(x,{level:'error'})` → `hostLog('debug'|'error', x)`
|
|
7
|
-
* —— 本包零 `utils/debug`(portability 门盯着)。
|
|
8
|
-
* 2. `require('../utils/messages.js').REJECT_MESSAGE` 的 lazy require + 内联字面量兜底
|
|
9
|
-
* → 直接用常量 `HITL_REJECT_MESSAGE`(**逐字**同一串)。lazy require 存在的理由是「wire 模块
|
|
10
|
-
* 别拉 React/ink 图」,在包里没有那张图 ⇒ 理由消失,只留常量。
|
|
11
|
-
* 🔴 常量锁(0.11.10 换锚):CC 原文在 pure 门 B7 段有**包内冻结字面量**(无条件,不依赖外部树);
|
|
12
|
-
* 壳树在场时再加一条**全树扫描**——壳里每一处 `REJECT_MESSAGE` 声明都必须逐字节等于它。
|
|
13
|
-
* 3. `getAppStateStoreRef()` 直写 `AppState.notifications` → `HitlHostSurface` 口
|
|
14
|
-
* (`showNotice` / `clearNoticeIfCurrent`)—— `AppState` 是**端的状态形状**。
|
|
15
|
-
* 同理 `surfaceClassifierDeny`(footer 通知 + /permissions Recent Denials 记账,两者都是壳资产)
|
|
16
|
-
* 也走这个口。判定半场(`classifierDenyFromToolEnd`)B2 就已在包内。
|
|
17
|
-
* 4. `liveToolApprovalWire` 的引用 → 包内 `./toolApprovalWire.js`(同批拆搬)。
|
|
18
|
-
* 5. `liveQuestionStore` → 包内同名模块(B1 已搬,**同一个 module 台账**)。
|
|
19
|
-
*
|
|
20
|
-
* 🔴 单实例纪律:本文件自身无 module 级台账,但它**读**两个包内台账
|
|
21
|
-
* (`liveQuestionStore` 的 responder 表 / `toolApprovalWire` 的卡口)。壳侧本地副本与 npm 包
|
|
22
|
-
* 同时进 bundle ⇒ overlay responder 注册在一份、`publishQuestionFrame` 发到另一份 = 对话框
|
|
23
|
-
* 弹出来但没人收答(静默挂死)。
|
|
24
|
-
*
|
|
25
|
-
* ── REF-CC-032(2026-08-02,P3 A 族压轴卡 askgate-split;设计输入 = P1 lens-giant-split SPLIT-12)──
|
|
26
|
-
*
|
|
27
|
-
* 本文件从 369 行的单函数塌成**驱动 + 公开面**。三刀落在同目录三个新文件,分工与各自头注一致:
|
|
28
|
-
* ① `gateLedger.ts` —— 8 个集合 + 3 个记账标量收成一个台账对象并给出动词。拆分的真约束就是
|
|
29
|
-
* 「同一个容器有内环、外环两个写者」(`heldAskEnds` / `deniedCalls` / `resolvedAnswers` /
|
|
30
|
-
* `endedCalls` 四个各自都有两处写点),收口后容器只剩一个写者。
|
|
31
|
-
* ② `frameRouter.ts` —— 内环帧路由:一帧进、一个 `FrameAction` 出。tool_end 的 5 条分支是
|
|
32
|
-
* **有序**的(分类器 deny 的结构性签名必须先于 fs HOLD/REJECT 判),注册表化后顺序写成数据
|
|
33
|
-
* 并配一条加载期断言钉死。共享词汇(`AskGateWireDeps` / `isAskTool` / 两个 CC 逐字常量 /
|
|
34
|
-
* park 形状谓词)也落在那里 —— 它是内外环都够得着的最低模块。
|
|
35
|
-
* ③ `parkResolver.ts` —— 外环 park 决断:`reattach` 还是 `failsoft`,两条 hostLog 与 hop 预算
|
|
36
|
-
* 全在那里。
|
|
37
|
-
* 本文件只剩:双层驱动循环(内环读流吐帧、外环决断后换流)+ 对外 re-export。**公开面一个名字
|
|
38
|
-
* 都没动**(`export *` 经本文件出去的四个值 + 四个类型全部原位可达)。
|
|
39
|
-
*
|
|
40
|
-
* ── 以下为原文件的领域说明(逐字保留)────────────────────────────────────────────────────────
|
|
41
|
-
*
|
|
42
|
-
* liveHitlAskWire — §4④ AskUserQuestion 的 suspended↔overlay 桥(engine 1.163 HITL 语义,2026-07-12)。
|
|
43
|
-
*
|
|
44
|
-
* WIRE 全链(engine 1.163.0 × SDK 0.0.44,askq-wire-probe 逐字实证 2026-07-12):
|
|
45
|
-
* 1. 模型调 AskUserQuestion → 引擎 DURABLE_APPROVAL park:sync leg(POST /v1/tasks/stream)上先发
|
|
46
|
-
* `tool_start`(args 带完整 questions payload)、再发被 park 毒化的 `tool_end isError:true
|
|
47
|
-
* output:"Operation aborted"`(同 turn 其它并发工具也一并 abort,模型 resume 后自己重发),
|
|
48
|
-
* 终帧 `done` `status:"suspended"` + `checkpointGate:{kind:"human",toolName:"AskUserQuestion"}`,流结束。
|
|
49
|
-
* 🔴 1.61 时代的 `event: question` 帧已蒸发(SDK 0.0.44 连 questions 资源都没了)——
|
|
50
|
-
* demuxQuestionFrames→overlay 旧链收不到任何东西,turn 尾裸渲 `⎿ Error: Operation aborted`。
|
|
51
|
-
* 2. 本模块(liveClient 流管道内层)拦下这个 park:HOLD 毒化 tool_end(不渲)、吞 suspended done、
|
|
52
|
-
* 从 `GET /v1/approvals` 拿 pending 行(input=questions + boundCallId/boundInputHash 绑定)、
|
|
53
|
-
* 合成 QuestionFrame 借既有 AskUserQuestion overlay(planReviewWire 同款 local-responder 姿势,
|
|
54
|
-
* CC 原生对话框,零新 UI)、等用户作答。
|
|
55
|
-
* 3. 决断走 T23 HitlBridge(答案 ride `ApprovalDecision.answer`,D-1 绑定 verbatim 回显;拒答 =
|
|
56
|
-
* 一次 **TOOL 级 deny** 应答,把这只 ask 结算掉 —— server `ASSISTANT-WIRE-CONTRACT.md` §4a。
|
|
57
|
-
* 🔴 **0.42.0 撤稿**:原文写的是「拒答=cancel-by-deny,contract/04 §2.4」;§4a 逐字反对把
|
|
58
|
-
* deny 读成 run kill,逐条撤稿见 `hitlBridge.decideTool` 头注)。decide 是 SYNC 驱动的:引擎跑到下一个 park 或终态才返
|
|
59
|
-
* (实测 4-5s+),返回体 `{status}` 即下一状态。
|
|
60
|
-
* 4. 续流:attach `GET /v1/runs/:taskId/events`(durable leg;实证 durable log 从 park 点才开始,
|
|
61
|
-
* 无挂起前重放)。重放的 tool_start/tool_end 按 toolCallId 去重;被 gate 的 call 在重放里带来
|
|
62
|
-
* `tool_end isError:false` = 卡片正常收口(HOLD 的毒化帧被丢弃)。模型再次提问时 durable 流发
|
|
63
|
-
* `suspended` arm(带 gate)后流结束 → 同一循环再走一遍,`lastEventId` 续传防重放。
|
|
64
|
-
*
|
|
65
|
-
* 🔴 fail-soft 铁律:桥内任何一步失败(overlay 未挂载/print 模式、pending 蒸发、decide 409/404、
|
|
66
|
-
* turn 中断)都回退到「flush HOLD 的毒化帧 + 原样吐 suspended 终帧」= 今天的诚实红,绝不更糟。
|
|
67
|
-
* 🔴 路由面([816] 壳侧承诺① 放宽,2026-07-14):AskUserQuestion gate 走问答 overlay(原路);
|
|
68
|
-
* fs 写权限 gate(Write/Edit/NotebookEdit,或一等 kind==='tool_approval')走 liveToolApprovalWire
|
|
69
|
-
* 的 CC 三选卡(vendored PermissionRequest);其余 human/irreversible gate 保持现状透传。
|
|
70
|
-
* 🔴 UNTRUSTED:questions 为模型作文(service 已 redact),只渲染绝不回喂;答案由 core 围栏
|
|
71
|
-
* (`selected ⊆ options`,off-list 进 note)。
|
|
72
|
-
*/
|
|
73
1
|
import type { AgentEvent } from '@sema-agent/sdk';
|
|
74
2
|
import { type AskGateWireDeps } from './frameRouter.js';
|
|
75
3
|
export { HITL_REJECT_MESSAGE, ENGINE_ABORT_TOOL_RESULT } from './frameRouter.js';
|
|
@@ -80,20 +8,6 @@ export { SEMA_COLLATERAL_ABORT_KEY } from './gateLedger.js';
|
|
|
80
8
|
export { toAnsweredOutput, isAlreadyResolvedGateReason, GATE_FAILURE_CODES, nextHopBudget, MAX_GATE_HOPS, MAX_TOTAL_PARKS } from './parkResolver.js';
|
|
81
9
|
export type { HopBudget, HopRound } from './parkResolver.js';
|
|
82
10
|
export type { GateOutcome, GateFailureCode } from './parkResolver.js';
|
|
83
|
-
/**
|
|
84
|
-
* 包一层 AgentEvent 流:把 AskUserQuestion 的 suspended park 变成「对话框 → decide → 续流」闭环。
|
|
85
|
-
* 其它事件原样透传;非 AskUserQuestion 的 gate 保持现状。fail-soft:任何桥内失败回退为
|
|
86
|
-
* 「flush 毒化 tool_end + 原样终帧」(= 修复前行为)。
|
|
87
|
-
*
|
|
88
|
-
* 双层循环(REF-CC-032 后只剩驱动骨架):
|
|
89
|
-
* · 内环 `for await` 读流 —— 每帧先记 seq、再判扣留帧放行、再交 `routeFrame` 定处置;
|
|
90
|
-
* `park` 动作 break 出内环。
|
|
91
|
-
* · 外环 `while` —— `resolvePark` 决断:`reattach` 就换一条 `runs.events` 流接着读
|
|
92
|
-
* (hop 预算在 resolver 内按 `hops` 判),`failsoft` 就吐完 events 收场。
|
|
93
|
-
*
|
|
94
|
-
* @param source 上游 AgentEvent 流(tasks.stream 或 runs.events,已过 demuxQuestionFrames)。
|
|
95
|
-
* @param opts.taskId runs.events 消费时已知的 run handle(sync leg 从 suspended done 捕获)。
|
|
96
|
-
*/
|
|
97
11
|
export declare function bridgeAskUserQuestionGates(source: AsyncGenerator<AgentEvent>, deps: AskGateWireDeps, opts?: {
|
|
98
12
|
signal?: AbortSignal;
|
|
99
13
|
taskId?: string;
|
package/dist/hitl/askGateWire.js
CHANGED
|
@@ -1,48 +1,10 @@
|
|
|
1
1
|
import { createGateLedger } from './gateLedger.js';
|
|
2
2
|
import { flushHeldWithInterruptRewrite, isHostProgressFrame, routeFrame, } from './frameRouter.js';
|
|
3
3
|
import { resolvePark, nextHopBudget, stalledTerminal, MAX_GATE_HOPS } from './parkResolver.js';
|
|
4
|
-
// ── 宿主面口(搬迁差分 3)────────────────────────────────────────────────────────────────────
|
|
5
|
-
//
|
|
6
|
-
// 壳里这三件都是 `getAppStateStoreRef()` 直写 `AppState` + `require('../utils/autoModeDenials.js')`。
|
|
7
|
-
// `AppState.notifications` 与 Recent Denials 面板都是**端的状态形状**(web/桌面各有各的通知系统),
|
|
8
|
-
// 所以做成口。🔴 缺席 = 那一行 warn 不上屏 —— 壳原文在无 provider(print/headless)时**本来就是
|
|
9
|
-
// 静默**(`if (!store) return`),所以缺席语义与原文一致;但**漏装**与「真的没屏」看起来一样,
|
|
10
|
-
// 于是计 miss(`hitlHostSurfaceMisses()` 宿主自检恒应为 0)。
|
|
11
|
-
// REF-CC-023(2026-08-02,P3 wave2 卡C-bridge):口本体(`HitlHostSurface` 接口 / install·misses·for
|
|
12
|
-
// 读写口 / `surfaceForCurrentSession`)与 cancel-by-deny 有界观察(`observeCancelByDeny`)
|
|
13
|
-
// 已整条搬进 `./hitlHostSurface.js` —— `toolApprovalWire.ts` 的中断-deny 臂也要用同一份观察器,
|
|
14
|
-
// 而 `toolApprovalWire.ts` 是本文件的上游 import,反向 import 会成环;单源到一个两边都能到达的
|
|
15
|
-
// 独立模块解环。REF-CC-032 之后这两处的消费点在 `frameRouter.ts` / `parkResolver.ts`。
|
|
16
|
-
// ── 公开面(REF-CC-032 三刀后原位 re-export;`index.ts` 的 `export *` 经本文件出去)──────────
|
|
17
|
-
//
|
|
18
|
-
// 🔴 名字与语义一个都没动:值四个(`HITL_REJECT_MESSAGE` / `ENGINE_ABORT_TOOL_RESULT` /
|
|
19
|
-
// `toAnsweredOutput` / 下方 `bridgeAskUserQuestionGates`)、类型四个。定义搬去了实现所在的
|
|
20
|
-
// 那一刀,本文件是它们对外的**唯一门牌**——下游 import 路径不变,public-export 基线不变。
|
|
21
4
|
export { HITL_REJECT_MESSAGE, ENGINE_ABORT_TOOL_RESULT } from './frameRouter.js';
|
|
22
|
-
// 件 B(#323 症状②,2026-08-25):CC 中断形的**单一真源**导出(与 SEMA_COLLATERAL_ABORT_KEY 同款
|
|
23
|
-
// 理由 —— 三端各自手抄同一句 CC 文案 = 漂移温床)。壳/web/desktop 认这个常量。
|
|
24
5
|
export { HITL_INTERRUPT_MESSAGE_FOR_TOOL_USE } from './frameRouter.js';
|
|
25
|
-
// #324 / [4907]:连坐 abort 机读位的**单一真源**导出([C93] `toolEndOutputText` 同款理由 ——
|
|
26
|
-
// 三端各自手抄键名 = 漂移温床)。壳/web/desktop 认这个常量,不认文案。
|
|
27
6
|
export { SEMA_COLLATERAL_ABORT_KEY } from './gateLedger.js';
|
|
28
|
-
// 🔴 `HoldOrigin` 随 #324 换锚删除(2026-08-22):出身不再在入表当拍冻结成两值枚举,改在
|
|
29
|
-
// `flushHeld` 当拍按已登记的 gate 主角身份求值 —— 那个枚举没有对外语义了。干净切:它只在
|
|
30
|
-
// 未发布的 0.40.0 窗里存在过,零已发布消费者([clean-cut-no-legacy-compat])。
|
|
31
7
|
export { toAnsweredOutput, isAlreadyResolvedGateReason, GATE_FAILURE_CODES, nextHopBudget, MAX_GATE_HOPS, MAX_TOTAL_PARKS } from './parkResolver.js';
|
|
32
|
-
/**
|
|
33
|
-
* 包一层 AgentEvent 流:把 AskUserQuestion 的 suspended park 变成「对话框 → decide → 续流」闭环。
|
|
34
|
-
* 其它事件原样透传;非 AskUserQuestion 的 gate 保持现状。fail-soft:任何桥内失败回退为
|
|
35
|
-
* 「flush 毒化 tool_end + 原样终帧」(= 修复前行为)。
|
|
36
|
-
*
|
|
37
|
-
* 双层循环(REF-CC-032 后只剩驱动骨架):
|
|
38
|
-
* · 内环 `for await` 读流 —— 每帧先记 seq、再判扣留帧放行、再交 `routeFrame` 定处置;
|
|
39
|
-
* `park` 动作 break 出内环。
|
|
40
|
-
* · 外环 `while` —— `resolvePark` 决断:`reattach` 就换一条 `runs.events` 流接着读
|
|
41
|
-
* (hop 预算在 resolver 内按 `hops` 判),`failsoft` 就吐完 events 收场。
|
|
42
|
-
*
|
|
43
|
-
* @param source 上游 AgentEvent 流(tasks.stream 或 runs.events,已过 demuxQuestionFrames)。
|
|
44
|
-
* @param opts.taskId runs.events 消费时已知的 run handle(sync leg 从 suspended done 捕获)。
|
|
45
|
-
*/
|
|
46
8
|
export async function* bridgeAskUserQuestionGates(source, deps, opts) {
|
|
47
9
|
const led = createGateLedger();
|
|
48
10
|
const taskId = { current: opts?.taskId };
|
|
@@ -53,39 +15,19 @@ export async function* bridgeAskUserQuestionGates(source, deps, opts) {
|
|
|
53
15
|
...(opts?.signal ? { signal: opts.signal } : {}),
|
|
54
16
|
};
|
|
55
17
|
let stream = source;
|
|
56
|
-
// ── L-80 hop 预算(2026-09-03):数「连续非进展轮」,不数 park 次数 ─────────────────────────────
|
|
57
|
-
// 一轮的进展 = 上一次 reattach 打开的那段流里出现过 host 推进帧(`isHostProgressFrame`:
|
|
58
|
-
// text/reasoning/tool_start 且非孙代)。真 park 的帧序 tool_end→message_committed→turn_end→
|
|
59
|
-
// done{suspended} 一个推进帧都不带([2084]① 收窄过的集合),所以「引擎 revive 后立刻原样 re-park」
|
|
60
|
-
// (坐标失配 / reopen 类)天然判非进展;「模型重试同一失败 Edit 每次真被门」每轮都有推进帧 ⇒
|
|
61
|
-
// 判进展、不限次(CC 同款:问 N 次答 N 次)。首段是 sync leg,自带 gated tool_start ⇒ 恒判进展。
|
|
62
18
|
let budget;
|
|
63
19
|
let progressedSinceReattach = false;
|
|
64
20
|
let lastStallReason;
|
|
65
21
|
let lastRoundPresentedCard = false;
|
|
66
|
-
// 对抗复审 r1 [high]①:进展**同时**要求 park 身份推进 —— 同一个 gatedCallId 原样回来,哪怕中间吐了一帧文本
|
|
67
|
-
// (「retrying…」)也不算进展;新 toolCallId(模型重试/下一只门)+ 推进帧才算。tool-less park 无身份,只看帧
|
|
68
|
-
// + MAX_TOTAL_PARKS 硬兜底。
|
|
69
22
|
let lastResolvedGatedCallId;
|
|
70
|
-
/** 上一轮有没有真决断落地(progress:true)。有 ⇒ 这一轮的「首读空」是取件失败不是空转,推进帧照算进展
|
|
71
|
-
* (F15-f:门1 决完引擎真推进了,门2 首击读空);没有(从没解析到过行)⇒ no_pending 一票否决(L12)。 */
|
|
72
23
|
let lastRoundDecided = false;
|
|
73
|
-
/** 本 turn 内解析不出身份的 park 数(MAX_TOTAL_PARKS 只数这一类,r6 [high]:真推进的新门不吃硬兜底)。 */
|
|
74
24
|
let unverifiableParks = 0;
|
|
75
25
|
while (true) {
|
|
76
|
-
/** park 请求:遇 AskUserQuestion / 工具审批 gate 时置位后 break 内环。 */
|
|
77
26
|
let park = null;
|
|
78
27
|
for await (const ev of stream) {
|
|
79
28
|
led.noteSeq(ev);
|
|
80
29
|
if (isHostProgressFrame(ev))
|
|
81
30
|
progressedSinceReattach = true;
|
|
82
|
-
// HOLD 只护 park 窗口:host lane 的模型推进帧一到就放行扣留帧(触发集的来龙去脉见
|
|
83
|
-
// `frameRouter.isHostProgressFrame` 上方长注)。
|
|
84
|
-
// 件 B(异源复审 finding 采纳):这个中途出口**也**要走中断感知的那一个。病形 = 用户按了
|
|
85
|
-
// Esc(signal 已 aborted)之后,源流里还有一条**已缓冲**的推进帧到达 ⇒ 扣留帧从这里放行,
|
|
86
|
-
// 绕开收口出口的改写 ⇒ 用户照旧看到红 `Error: Operation aborted`。
|
|
87
|
-
// 🔴 这里**没有终帧**可读,所以只有宿主腿(signal)能命中;引擎还在推进而 signal 没 abort 的
|
|
88
|
-
// 正常情形下,判据两腿全不命中 ⇒ 与本件之前逐字节相同。
|
|
89
31
|
if (led.heldCount() > 0 && isHostProgressFrame(ev)) {
|
|
90
32
|
yield* flushHeldWithInterruptRewrite(led, { signal: opts?.signal });
|
|
91
33
|
}
|
|
@@ -105,35 +47,20 @@ export async function* bridgeAskUserQuestionGates(source, deps, opts) {
|
|
|
105
47
|
park = {
|
|
106
48
|
gate: action.gate,
|
|
107
49
|
...(action.pendingDone !== undefined ? { pendingDone: action.pendingDone } : {}),
|
|
108
|
-
// [4914] 请托①到货件:park 的待批 call 身份(server ≥7.41.0)——缺席是常态,见 GatePark 头注。
|
|
109
50
|
...(action.gatedCallId !== undefined ? { gatedCallId: action.gatedCallId } : {}),
|
|
110
51
|
};
|
|
111
52
|
break;
|
|
112
53
|
}
|
|
113
54
|
if (!park) {
|
|
114
|
-
// 源流走完没终帧(disconnect/abort)——flush 后结束,与现状一致。
|
|
115
|
-
// 件 B(#323 症状②):没有终帧 ⇒ 出口证据只剩宿主腿(`signal.aborted` = 用户按了 Esc);
|
|
116
|
-
// 缺席时包装恒走原路,与本行修前逐字节相同。
|
|
117
55
|
yield* flushHeldWithInterruptRewrite(led, { signal: opts?.signal });
|
|
118
56
|
return;
|
|
119
57
|
}
|
|
120
|
-
// 进展判决分两半(对抗复审 r2 [high]①):
|
|
121
|
-
// · **帧**半场在 resolve 之前判:上一段流里有推进帧 ⇒ 先按进展记(同因计数复位、预算清零);
|
|
122
|
-
// · **身份**半场在 resolve 之后追认:这一轮真解析到的 pending 行(`resolution.gatedCallId`)与上一轮
|
|
123
|
-
// **同一只 call** ⇒ 把这一轮追改成非进展(哪怕中间吐了一帧文本)。durable `suspended` 帧常不带
|
|
124
|
-
// toolCallId,所以身份只认解析到的行,帧上缺席不算「变了」,也**不覆盖**上一次已知身份。
|
|
125
|
-
// 帧半场先判是为了不让触顶晚一拍(cap 用的是**本轮之前**的连续非进展数)。
|
|
126
|
-
// 帧半场(resolve 前):只看上一段流有没有 host 推进帧。有 ⇒ 同因账先复位(下一只门的首击要从 1 数起,
|
|
127
|
-
// F15-f),预算**不在这里提交**;触顶输入 = 上一轮累计(有帧时沿用,没帧时 +1)—— 帧上的 park 身份
|
|
128
|
-
// **不参与**预判(对抗复审 r3 [high]①:重放帧可能仍携旧 call A,而 rescan 真解析到的是新 call B)。
|
|
129
58
|
const framesProgressed = progressedSinceReattach;
|
|
130
59
|
const prevStalled = budget?.stalled ?? 0;
|
|
131
60
|
if (framesProgressed) {
|
|
132
61
|
led.resetAlreadyResolvedGate();
|
|
133
62
|
lastStallReason = undefined;
|
|
134
63
|
}
|
|
135
|
-
// 触顶(对抗复审 r4 [high]①):有推进帧时**不在解析前**触顶 —— 先解析、先呈、先决,提交预算后仍是同一只
|
|
136
|
-
// call 才收场(见下);没有推进帧时上一轮累计 +1 已足够判定,在 resolvePark 内按 stalledRounds 收场。
|
|
137
64
|
const ctxBase = {
|
|
138
65
|
deps,
|
|
139
66
|
led,
|
|
@@ -153,9 +80,6 @@ export async function* bridgeAskUserQuestionGates(source, deps, opts) {
|
|
|
153
80
|
yield out;
|
|
154
81
|
return;
|
|
155
82
|
}
|
|
156
|
-
// 身份半场(resolve 后,权威):只认这一轮真解析到的 pending 行(`resolution.gatedCallId` **不**回填帧上身份,
|
|
157
|
-
// 对抗复审 r4 [high]②)。同一只 call 原样回来 ⇒ 非进展(哪怕有推进帧);没解析到行(no_pending / 传输败)
|
|
158
|
-
// 的轮次 `progress:false` 一票否决。预算在这里一次提交;提交后超上限 ⇒ 立即收场(这一轮已呈过卡,不再呈)。
|
|
159
83
|
const resolvedId = resolution.gatedCallId;
|
|
160
84
|
if (resolvedId === undefined)
|
|
161
85
|
unverifiableParks++;
|
|
@@ -181,27 +105,9 @@ export async function* bridgeAskUserQuestionGates(source, deps, opts) {
|
|
|
181
105
|
}
|
|
182
106
|
if (resolvedId !== undefined)
|
|
183
107
|
lastResolvedGatedCallId = resolvedId;
|
|
184
|
-
// r5 [high]①:豁免只授予**新 call** 上落地的决断(与上一轮身份不同)—— 同一只 call 原样回来再决一次不授予,
|
|
185
|
-
// 否则「可见并决 / 暂不可见」交替可无限;而 F15-f 那形(门1 首次决完、门2 首击读空)仍能拿到豁免。
|
|
186
108
|
lastRoundDecided = resolution.progress === true && !sameCall;
|
|
187
|
-
lastRoundPresentedCard = resolution.presented;
|
|
109
|
+
lastRoundPresentedCard = resolution.presented;
|
|
188
110
|
progressedSinceReattach = false;
|
|
189
|
-
// ── B-070 / L-200(0.65.0):**换挂** —— 这一轮的 decide 200 说了「受理了,续跑在另一条 run 上」──
|
|
190
|
-
// sdk README §9.0.0 逐字:workflow 车道的受理形回执带的是**宿主新铸**的 run id(「poll 它,
|
|
191
|
-
// 不要盯那张卡」)。修前这里恒用原 `taskId.current` 重挂 ⇒ 旧 run 上再也不会有推进帧,
|
|
192
|
-
// 预算一路烧到 hop 上限、终帧是一句与真因无关的话。判据在 `readDecideReceipt`(两件合取)
|
|
193
|
-
// 与 `resolvePark`(还要与当前 taskId 不同)里,这里只执行。
|
|
194
|
-
// 🔴 **换挂必须同时丢掉 `lastEventId`**:durable seq 是 **per-run** 的序号,拿旧 run 的序号去
|
|
195
|
-
// 续读新 run 是跨命名空间取数([same-name-different-meaning-crosses-layers])——
|
|
196
|
-
// 要么被 server 拒,要么静默跳过新 run 的开头(那正是本 bug 的另一种死法)。
|
|
197
|
-
// 🔴 台账里**跟着 run 走**的那几格同批清掉(`forgetRunScopedState`,逐格理由见该动词头注):
|
|
198
|
-
// ① seq 游标 —— 不清的话,下一轮若没有换挂,`led.lastSeq()` 会把**上一条 run** 的序号带回
|
|
199
|
-
// 新 run 的续读上,同一个跨命名空间取数换个时点再犯一次;
|
|
200
|
-
// ② 🔴 **已渲 call 集 + 两张 args 快照表** —— 异源复审 [high] 实撞的安全格:`toolCallId`
|
|
201
|
-
// 不保证跨 run 唯一,而 `routeToolStart` 在 `markStarted` 判重后直接早退,新 run 的
|
|
202
|
-
// `noteGatedStart` 于是不执行 ⇒ 卡面渲**旧 run 的入参**,而 decide 回显**新 pending 行**
|
|
203
|
-
// 的 D-1 绑定:人看见 A、批准的是 B。
|
|
204
|
-
// 「这一只 ask 的历史」(已决身份 / 扣留帧 / 同因计数)**刻意保留** —— 它们正是换挂的理由。
|
|
205
111
|
const handoff = resolution.handoffTaskId;
|
|
206
112
|
if (handoff !== undefined) {
|
|
207
113
|
taskId.current = handoff;
|