@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,5 +1,4 @@
|
|
|
1
1
|
import type { ClassifierDenyVerdict } from '../classifierVerdictWire.js';
|
|
2
|
-
/** footer 通知(壳 `AppState.notifications.current` 的形)。 */
|
|
3
2
|
export interface HitlNotice {
|
|
4
3
|
key: string;
|
|
5
4
|
text: string;
|
|
@@ -7,181 +6,32 @@ export interface HitlNotice {
|
|
|
7
6
|
priority: 'immediate';
|
|
8
7
|
timeoutMs: number;
|
|
9
8
|
}
|
|
10
|
-
/**
|
|
11
|
-
* 分类器 deny 裁决的**这一只 call 的现场**(L-69⑨,0.52.0;{@link HitlHostSurface.surfaceClassifierDeny}
|
|
12
|
-
* 的 **additive 可选**第三参)。
|
|
13
|
-
*
|
|
14
|
-
* 🔴 为什么要有它:修前宿主只拿到 `toolName`,于是端的 Recent Denials 面板三行同名(三条被拒的
|
|
15
|
-
* `Bash` 长一个样),而端要做的两件事 —— **行文案**(这一行说的是哪条命令 / 哪个文件)与
|
|
16
|
-
* **retry 粒度**(重试这一只调用,而不是「整个 Bash 工具」)—— 都需要这一只 call 的身份与入参。
|
|
17
|
-
* 🔴 `args` 是 **UNTRUSTED** wire 值(模型产出的工具入参):本包**原样**交给宿主,不渲染、不截断、
|
|
18
|
-
* 不消毒 —— 展示消毒是端的事(cli 有 `cleanUntrustedForDisplay`)。要拿它铸**行文案**请用
|
|
19
|
-
* `classifierDenyDisplay(toolName, args)`(`src/classifierVerdictWire.ts`,三端同形的判定)。
|
|
20
|
-
* 🔴 `args` **可缺席**:分类器拒绝的工具通常没被 gate,而在飞 args 表是**有界**的(见
|
|
21
|
-
* `gateLedger.START_ARGS_MAX_ENTRIES`),长流上早期 call 的快照可能已被淘汰。缺席 = 诚实缺席,
|
|
22
|
-
* 端按「只有工具名」降级渲,**绝不**据此编一个空 args 出来。
|
|
23
|
-
*/
|
|
24
9
|
export interface ClassifierDenyContext {
|
|
25
|
-
/** 这一只被拒调用的 wire `toolCallId`(retry 粒度的锚;帧上取,恒在场)。 */
|
|
26
10
|
toolCallId: string;
|
|
27
|
-
/** 这一只调用的 `tool_start` 入参快照;**UNTRUSTED**,缺席 = 台账里没有(见上)。 */
|
|
28
11
|
args?: unknown;
|
|
29
12
|
}
|
|
30
|
-
/** HITL 的宿主副作用面 —— 通知上屏 + 分类器 deny 的端侧记账。 */
|
|
31
13
|
export interface HitlHostSurface {
|
|
32
|
-
/** 立即顶到 current(壳:`notifications.current = notice`,queue 不动)。 */
|
|
33
14
|
showNotice(notice: HitlNotice): void;
|
|
34
|
-
/** **仅当** current 仍是这个 key 时清掉(壳原文的 if-still-mine 语义 —— 否则会误清别人的通知)。 */
|
|
35
15
|
clearNoticeIfCurrent(key: string): void;
|
|
36
|
-
/**
|
|
37
|
-
* 分类器 deny 裁决的宿主副作用:footer 通知 + /permissions Recent Denials 记账(壳资产)。
|
|
38
|
-
*
|
|
39
|
-
* 🔴 `ctx` 是 **additive 可选**第三参(0.52.0,L-69⑨):老宿主的两参实现**零改动照跑**
|
|
40
|
-
* —— JS 里多传一个实参不影响两参函数,TS 里「参数少的函数可赋给参数多的签名」是语言规则
|
|
41
|
-
* (函数参数双变/协变),desktop/web 现有 `surfaceClassifierDeny(t, v)` 实现不需要跟车。
|
|
42
|
-
* ⚠️ 反过来**不成立**:端一旦读了 `ctx`,就必须按可选处理(库对老路径/缺席场景不承诺在场)。
|
|
43
|
-
*/
|
|
44
16
|
surfaceClassifierDeny(toolName: string, verdict: ClassifierDenyVerdict, ctx?: ClassifierDenyContext): void;
|
|
45
17
|
}
|
|
46
|
-
/** 装 HITL 宿主面(传 null 卸)。返回还原函数。 */
|
|
47
18
|
export declare function installHitlHostSurface(surface: HitlHostSurface | null): () => void;
|
|
48
|
-
/** W1 带 key 变体:装/卸某会话的 HITL 宿主面(多会话宿主每会话一键,互不顶盖)。 */
|
|
49
19
|
export declare function installHitlHostSurfaceFor(sessionKey: string, surface: HitlHostSurface | null): () => void;
|
|
50
|
-
/** 🔴 宿主自检:恒应为 0。非 0 = 有 HITL 副作用发生时口不在,那一行 warn / 那条记账丢了。 */
|
|
51
20
|
export declare function hitlHostSurfaceMisses(): number;
|
|
52
|
-
/** W1 带 key 变体(miss 计数逐键)。 */
|
|
53
21
|
export declare function hitlHostSurfaceMissesFor(sessionKey: string): number;
|
|
54
|
-
/** W1 读端:某会话的 HITL 宿主面(未装 = null;**不计 miss** —— miss 只在副作用真发生时计)。 */
|
|
55
22
|
export declare function hitlHostSurfaceFor(sessionKey: string): HitlHostSurface | null;
|
|
56
|
-
/** 测试钩:卸口 + 清计数。 */
|
|
57
23
|
export declare function _resetHitlHostSurfaceForTest(): void;
|
|
58
|
-
/** 内部读点(计 miss)。`askGateWire.ts` 的 `surfaceClassifierDeny` 路径与本文件的
|
|
59
|
-
* `surfaceCancelDenyWarn` 共用它。 */
|
|
60
24
|
export declare function surfaceForCurrentSession(): HitlHostSurface | null;
|
|
61
|
-
/**
|
|
62
|
-
* 中断-deny 的后台 settle 观察预算。
|
|
63
|
-
*
|
|
64
|
-
* ══ 🔴 §2.4「DENY-abort」撤稿 + 本常量的论证前提重审(0.42.0;server [4833] 明请)═══════════
|
|
65
|
-
*
|
|
66
|
-
* **本段 0.28.0 原文写的是**:「decide 是 SYNC 驱动的(引擎跑到下一 park/终态才返,实测 4-5s+),
|
|
67
|
-
* 但 **DENY-abort 语义上引擎收到即终结 run**;2s 内连收都没收到 ⇒ 按丢失警示」。
|
|
68
|
-
* 那句加粗的前提**已被上游撤稿**,来源是 server 自己的契约成文(`4631a0f`,随 7.39 出;
|
|
69
|
-
* `ASSISTANT-WIRE-CONTRACT.md` §4a):**DENY 是 TOOL 级的应答,永远不是 run kill**;客户端不得
|
|
70
|
-
* 把「拒绝」译成「取消」;两个动词的 wire 判别式是 `cancelled` vs `gate.batch_halted`。
|
|
71
|
-
* ⇒ 「引擎收到 deny 即终结 run」这条**不成立**:deny 只结算**这一只 ask**,run 按自己的编排继续
|
|
72
|
-
* (裸拒 ⇒ `gate.batch_halted` 兄弟 coded 结算 + `haltedOnUserRejection`;带留言拒 ⇒ run 续跑)。
|
|
73
|
-
*
|
|
74
|
-
* **重审结论(本批只改论证,不改数值 —— 理由写全)**:
|
|
75
|
-
* · 旧论证「2s 没结算 = deny 大概率丢了,因为收到就该终结」**作废**;
|
|
76
|
-
* · 但本常量守的那件事**换一个理由仍然成立**:它是一个**观察上限**,给「decide 永不返回」这种
|
|
77
|
-
* 形态一条出声的路 —— 没有它,一次真的丢失就只剩静默;
|
|
78
|
-
* · **数值不在本批动**:动它是行为面改动,而判据(多久算「没回来」)只有拿真实 decide 往返分布
|
|
79
|
-
* 说了算,那份实测在**消费端**(壳中断路径)而不在包里;且下游 `sema-cli` 的
|
|
80
|
-
* `src/sema/hitlCancelDeny.test.ts` 按现值锁着行为,单边改会当场把消费端打红。
|
|
81
|
-
* · **如实登记的残余**(接入档 §6e/§7 同批记):预算到点就发的那行 warn 措辞是
|
|
82
|
-
* {@link CANCEL_DENY_WARN_TEXT}(「the session may stay locked」),而在新契约下「decide 慢」
|
|
83
|
-
* 与「deny 丢了」这两件事在 2s 这个刻度上**不可分** —— 晚到的成功不会撤回那行 warn(只有 10s
|
|
84
|
-
* 自清)。要根治得做成两档(软档只记 debug、硬档才上屏),那是**跨仓一批**:包侧改时序、壳侧
|
|
85
|
-
* 同批换判据与用例。本批不做单边改动。
|
|
86
|
-
*/
|
|
87
25
|
export declare const CANCEL_DENY_BUDGET_MS = 2000;
|
|
88
|
-
/** warn 行文案(测试锁字面)。 */
|
|
89
26
|
export declare const CANCEL_DENY_WARN_TEXT = "could not cancel the pending question \u2014 the session may stay locked; the run may need engine-side recovery";
|
|
90
|
-
/** 文案(测试锁字面)。措辞刻意描述**后果**而不是内部机制:用户要知道的是「下次还会问」。 */
|
|
91
27
|
export declare const REMEMBER_NOT_APPLIED_WARN_TEXT = "this session-wide allow was not remembered by the worker \u2014 you will be asked again for this tool";
|
|
92
|
-
/** 文案(测试锁字面)。"original" 是判据词:用户必须读到「跑的是原来那份」。 */
|
|
93
28
|
export declare const EDIT_NOT_FORWARDED_WARN_TEXT = "your edited tool input was NOT forwarded \u2014 the tool is running with the ORIGINAL input you saw before editing";
|
|
94
|
-
/**
|
|
95
|
-
* `allow_session` 决断的 ack 回报 `rememberApplied:false`(server 1.239 起诚实回显 —— 典型成因
|
|
96
|
-
* 是这条 run 没有 sessionId,grant 无处可落)。
|
|
97
|
-
*
|
|
98
|
-
* 🔴 为什么这必须上屏而不是只记 debug:三选卡第 2 项在用户心里签的是「本会话这个工具不再问我」。
|
|
99
|
-
* 记没落店而界面照渲「全放行」,就是**把一个没有发生的授权渲成发生了** —— 下一次弹卡时用户会以为
|
|
100
|
-
* 是 bug,更坏的是他可能因此养成「一路回车」的习惯。缺席(旧 server 不出这个位)= 未知,
|
|
101
|
-
* 按 [honest-absence-not-fabricated-zero] 一律不发通知,绝不把未知渲成失败。
|
|
102
|
-
* 无宿主口(print/headless 没屏)⇒ 静默,与 {@link surfaceCancelDenyWarn} 同语义。
|
|
103
|
-
*/
|
|
104
29
|
export declare function surfaceRememberNotApplied(): void;
|
|
105
|
-
/**
|
|
106
|
-
* 「编辑并批准」带了 `updatedInput`,而 ack 回报 `updatedInputForwarded:false`(server 1.241 起
|
|
107
|
-
* 诚实回显)—— 引擎拿到的是**原始**入参。
|
|
108
|
-
*
|
|
109
|
-
* 🔴 这一条比 remember 那条严重一个量级,它是本批 对抗复审判的 [high]:用户在卡上把
|
|
110
|
-
* `rm -rf /tmp/x` 改成 `rm -rf /tmp/x/build` 然后按了批准,而真正执行的是他改之前那条。
|
|
111
|
-
* **事后没有 fail-closed 的余地**(allow 已经送达,工具已经在跑),所以唯一诚实的处置就是立刻
|
|
112
|
-
* 响亮地说出来 —— 静默(此前只写 debug 日志)等于让用户以为自己的编辑生效了。
|
|
113
|
-
* 上游的正位是让 server 在「带了 updatedInput 却转发不了」时 fail-closed 拒批;那属跨仓,
|
|
114
|
-
* 已记进 docs/refactor/README.md 的宿主/上游工单表,本层不做旁路补偿(只做如实告知)。
|
|
115
|
-
*/
|
|
116
30
|
export declare function surfaceEditNotForwarded(): void;
|
|
117
|
-
/** 0.72.14:入参不可得的卡上收到了「编辑后批准」——什么都没发,ask 仍挂着(文案测试锁字面)。 */
|
|
118
31
|
export declare const EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT: string;
|
|
119
|
-
/** 见 {@link EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT};无宿主口 ⇒ 静默(与同族通知同语义)。 */
|
|
120
32
|
export declare function surfaceEditRefusedOnBlindAsk(): void;
|
|
121
|
-
/**
|
|
122
|
-
* 文案(测试锁字面)。措辞刻意描述**后果**,并且**只说证得出的话**(异源对抗复审四轮 [medium] 修):
|
|
123
|
-
* · 不写「这台引擎不支持」——能力位缺席有三种同形成因(宿主没接这个字段 / 探测还没回来 / 探测失败),
|
|
124
|
-
* 其中只有明确的 `false` 才勉强算「引擎说了不」。写成断言就是替引擎宣布一件没证据的事
|
|
125
|
-
* ([honest-absence-not-fabricated-zero]);改成 `could not be confirmed` 的未知口径。
|
|
126
|
-
* · 「审批本身过了」这句**只在 respond 真成功之后**才成立 —— 所以本通知的**发出时机**被移到
|
|
127
|
-
* `await respond(...)` 成功之后(见 `toolApprovalWire` 的调用点顶注),而不是丢键那一刻。
|
|
128
|
-
*/
|
|
129
33
|
export declare const RULE_NOT_SENT_WARN_TEXT = "your \"don't ask again\" choice was NOT sent to this engine \u2014 support for that rule form could not be confirmed. The approval itself went through, but you will be asked again";
|
|
130
|
-
/**
|
|
131
|
-
* 卡上选中了「不再询问」(编辑臂的自由文本 / 批臂的合取批),而**这台引擎的能力位没有确认**
|
|
132
|
-
* 那条兑付通道 ⇒ 编排层把持久臂整条丢掉、只送决断。
|
|
133
|
-
*
|
|
134
|
-
* 🔴 为什么这必须上屏而不是只记 debug(异源对抗复审三轮 [high] 采纳,0.43.0):它与
|
|
135
|
-
* {@link surfaceRememberNotApplied} 是**同一个病**——用户按下了一个明确的意图,系统把它静默
|
|
136
|
-
* 丢掉,然后下一次照旧弹卡。用户能得出的唯一结论是「这个功能坏了」或「我按错了」。卡上那一格
|
|
137
|
-
* 是**真 affordance**(offer 确实在场、确实可以走本地落规则那条路),被丢的只是**这条 wire
|
|
138
|
-
* 兑付通道** —— 所以正解不是把选项藏起来,是**如实说出来**。
|
|
139
|
-
* 🔴 **一条通知服务两条臂**(同形清剿):编辑臂(`respondFreeFormRules` 位缺席)与批臂
|
|
140
|
-
* (`respondBatchRuleOffers` 位缺席)此前都只写 debug —— 同一个病形两处存量,同批一起改。
|
|
141
|
-
* 🔴 决断本身**不受影响**(照常送达),所以文案第二句说清「审批过了,只是规则没存」——
|
|
142
|
-
* ⚠️ 正因为文案里有那句话,**调用时机必须在 `respond` 真成功之后**(异源对抗复审四轮 [medium]:
|
|
143
|
-
* 丢键那一刻就发,而随后 respond 抛错 ⇒ 决断其实**没有**落定,用户却已经读到「审批过了」,
|
|
144
|
-
* 可能按「工具已经在跑」继续操作)。调用点的时序契约见 `toolApprovalWire` 那一处。
|
|
145
|
-
* 🔴 文案**不说「引擎不支持」**:能力位缺席三种同形成因(宿主没接字段 / 探测未回 / 探测失败),
|
|
146
|
-
* 断言引擎的能力是没有证据的话 —— 用 `could not be confirmed` 的未知口径。
|
|
147
|
-
* 无宿主口(print/headless 没屏)⇒ 静默,与本文件其余 surface 同语义。
|
|
148
|
-
*/
|
|
149
34
|
export declare function surfaceRuleArmNotSent(): void;
|
|
150
|
-
/**
|
|
151
|
-
* 文案(测试锁字面)。与 {@link RULE_NOT_SENT_WARN_TEXT} **刻意分两条**:两者对用户的下一步建议不同 ——
|
|
152
|
-
* 那条说「这台引擎能不能收还不知道」(换台引擎/等探测就好了),本条说「你这次的选择**本身**没过
|
|
153
|
-
* 客户端那道核对」(卡口实现有问题或同时给了两个互斥选择,换台引擎也不会变)。折成一条会让任一方
|
|
154
|
-
* 谎报原因。措辞同样只说证得出的话:不猜是哪一种坏法,把两种都摆出来。
|
|
155
|
-
*/
|
|
156
35
|
export declare const RULE_NOT_SENT_REJECTED_WARN_TEXT = "your \"don't ask again\" choice was NOT sent \u2014 it did not pass the client-side check (the card returned a rule the engine never offered, an index that is not a batch offer, or two conflicting choices at once). The approval itself went through, but you will be asked again";
|
|
157
|
-
/**
|
|
158
|
-
* 卡上选中了「不再询问」,而那次选择**没过包内那道表核 / 互斥核**(报了引擎没 offer 过的文本、
|
|
159
|
-
* 下标不指向 batch offer、或文本臂与批臂同场)⇒ 编排层把持久臂整条丢掉、只送决断。
|
|
160
|
-
*
|
|
161
|
-
* 🔴 为什么这也必须上屏(异源对抗复审十轮 [medium] 采纳,0.43.0):它与
|
|
162
|
-
* {@link surfaceRuleArmNotSent} 是**同一个诚实性问题**,只是原因换了一个 —— 用户按下的明确意图
|
|
163
|
-
* 被系统丢掉,审批照常成功,下次照旧弹卡。此前这三条丢键路径**只写 `hostLog('error')`**:
|
|
164
|
-
* 那是给开发者看的诊断,**不是**给按下按钮的那个人的答复。
|
|
165
|
-
* 🔴 **时序契约与那条一致**:文案里有「审批本身过了」⇒ 只在 `await respond(...)` 真成功之后发。
|
|
166
|
-
* 🔴 **成因通常是卡口实现的 bug**(表外文本/坏下标/两臂同场都是宿主侧构造出来的),所以 `hostLog`
|
|
167
|
-
* 的那条 `error` 留痕**照旧保留** —— 两个受众,两条通道,谁都不顶替谁。
|
|
168
|
-
* 无宿主口(print/headless 没屏)⇒ 静默,与本文件其余 surface 同语义。
|
|
169
|
-
*/
|
|
170
36
|
export declare function surfaceRuleArmRejected(): void;
|
|
171
|
-
/**
|
|
172
|
-
* 中断 deny 的有界观察(壳侧单测 `hitlCancelDeny.test.ts` 的被测面;REF-CC-023 起两条决断腿共用)。
|
|
173
|
-
*
|
|
174
|
-
* 🔴 **命名撤稿(0.42.0)**:函数名与日志里的「cancel-by-deny」是**历史词**,保留只为不打断下游
|
|
175
|
-
* 按名锚的用例。它描述的动作在现行契约(server `ASSISTANT-WIRE-CONTRACT.md` §4a)下的准确说法是
|
|
176
|
-
* 「**中断时把这只挂着的 ask 用一个 TOOL 级 deny 结算掉**,好让 run 不停在 suspended 上」——
|
|
177
|
-
* **不是**「用 deny 去 cancel 一条 run」。方向也别读反:这里是把**用户的中断**结算成一次 deny,
|
|
178
|
-
* 而 §4a 禁的是反向的那件事(把**用户的拒绝**译成 cancel),两者不是同一件事。
|
|
179
|
-
*
|
|
180
|
-
* 铁律:不 await 进 abort 返回路径(用户立即拿回控制);这里只管后台 settle 的«观察»:
|
|
181
|
-
* - 2s 内 settle 成功 ⇒ 零上屏(SEMA_DEBUG 记成功);
|
|
182
|
-
* - 失败/超时 ⇒ 上屏一行 warn + SEMA_DEBUG 记原因(deny 丢失 = run 卡 suspended,下一条消息
|
|
183
|
-
* 撞 409;配合件2b 的专属文案,用户知道现场 + 出路);
|
|
184
|
-
* - `code === 'no_pending'`(判据见上方 `isNoPendingError`)⇒ 良性静默(pending 已被别处消解/
|
|
185
|
-
* 过期 —— run 没锁;hitlBridge decideTool 的同款语义,那里的静默维持不动)。
|
|
186
|
-
*/
|
|
187
37
|
export declare function observeCancelByDeny(settle: Promise<unknown>, taskId: string): void;
|
|
@@ -1,32 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hitlHostSurface.ts — REF-CC-023(2026-08-02,P3 wave2 卡C-bridge):共享的 HITL 宿主通知面
|
|
3
|
-
* + cancel-by-deny 有界观察,从 `askGateWire.ts` 提出来给 `toolApprovalWire.ts` 也用。
|
|
4
|
-
*
|
|
5
|
-
* 🔴 为什么要提出来(不是顺手重排):`askGateWire.ts` 已经 `import` `toolApprovalWire.ts`(§ ask 桥
|
|
6
|
-
* 消费工具审批帧判定),反向 `toolApprovalWire.ts` → `askGateWire.ts` 会成环。`observeCancelByDeny`
|
|
7
|
-
* 曾经只活在 `askGateWire.ts` 里,而 `toolApprovalWire.ts:surfaceFsApprovalAndDecide` 的中断-deny
|
|
8
|
-
* 臂原样复刻了它要修的那个事故(件3,中断事故修复批 G,2026-07-15):裸 `.catch(()=>{})` 全吞 ⇒
|
|
9
|
-
* deny 丢失时 run 永卡 suspended、session 锁死,用户下一条消息撞 409「active run」还全无线索。
|
|
10
|
-
* 单源到一个两边都能 import 的模块,两条腿共用同一次修复,而不是「同一个仓、同一个事故、
|
|
11
|
-
* 一处修了另一处原样留着」。
|
|
12
|
-
*
|
|
13
|
-
* 这个模块也顺带带走了 `surfaceCancelDenyWarn` 唯一依赖的宿主通知面(`HitlHostSurface` /
|
|
14
|
-
* `installHitlHostSurface*` / `hitlHostSurfaceFor*`)—— 它不只是给 cancel-by-deny 用(分类器 deny
|
|
15
|
-
* 的端侧记账 `surfaceClassifierDeny` 也走它),`askGateWire.ts` 仍然是它的主要消费方,只是不再是
|
|
16
|
-
* 唯一持有方。
|
|
17
|
-
*/
|
|
18
1
|
import { createSessionSlot, DEFAULT_SESSION_KEY } from '../sessionSlot.js';
|
|
19
2
|
import { hostLog } from '../host.js';
|
|
20
3
|
import { unrefTimer } from '../unrefTimer.js';
|
|
21
4
|
import { HitlSafetyError } from './hitlBridge.js';
|
|
22
|
-
// W1(design/161):sessionKey → 注册表;零参 API = DEFAULT_SESSION_KEY 兼容层(cli 装配不动)。
|
|
23
5
|
const hostSurfaceByKey = createSessionSlot();
|
|
24
6
|
const hostSurfaceMissesByKey = new Map();
|
|
25
|
-
/** 装 HITL 宿主面(传 null 卸)。返回还原函数。 */
|
|
26
7
|
export function installHitlHostSurface(surface) {
|
|
27
8
|
return installHitlHostSurfaceFor(DEFAULT_SESSION_KEY, surface);
|
|
28
9
|
}
|
|
29
|
-
/** W1 带 key 变体:装/卸某会话的 HITL 宿主面(多会话宿主每会话一键,互不顶盖)。 */
|
|
30
10
|
export function installHitlHostSurfaceFor(sessionKey, surface) {
|
|
31
11
|
const prev = hostSurfaceByKey.get(sessionKey);
|
|
32
12
|
hostSurfaceByKey.set(sessionKey, surface);
|
|
@@ -34,25 +14,19 @@ export function installHitlHostSurfaceFor(sessionKey, surface) {
|
|
|
34
14
|
hostSurfaceByKey.set(sessionKey, prev);
|
|
35
15
|
};
|
|
36
16
|
}
|
|
37
|
-
/** 🔴 宿主自检:恒应为 0。非 0 = 有 HITL 副作用发生时口不在,那一行 warn / 那条记账丢了。 */
|
|
38
17
|
export function hitlHostSurfaceMisses() {
|
|
39
18
|
return hitlHostSurfaceMissesFor(DEFAULT_SESSION_KEY);
|
|
40
19
|
}
|
|
41
|
-
/** W1 带 key 变体(miss 计数逐键)。 */
|
|
42
20
|
export function hitlHostSurfaceMissesFor(sessionKey) {
|
|
43
21
|
return hostSurfaceMissesByKey.get(sessionKey) ?? 0;
|
|
44
22
|
}
|
|
45
|
-
/** W1 读端:某会话的 HITL 宿主面(未装 = null;**不计 miss** —— miss 只在副作用真发生时计)。 */
|
|
46
23
|
export function hitlHostSurfaceFor(sessionKey) {
|
|
47
24
|
return hostSurfaceByKey.get(sessionKey) ?? null;
|
|
48
25
|
}
|
|
49
|
-
/** 测试钩:卸口 + 清计数。 */
|
|
50
26
|
export function _resetHitlHostSurfaceForTest() {
|
|
51
27
|
hostSurfaceByKey.clear();
|
|
52
28
|
hostSurfaceMissesByKey.clear();
|
|
53
29
|
}
|
|
54
|
-
/** 内部读点(计 miss)。`askGateWire.ts` 的 `surfaceClassifierDeny` 路径与本文件的
|
|
55
|
-
* `surfaceCancelDenyWarn` 共用它。 */
|
|
56
30
|
export function surfaceForCurrentSession() {
|
|
57
31
|
const hostSurface = hitlHostSurfaceFor(DEFAULT_SESSION_KEY);
|
|
58
32
|
if (hostSurface === null) {
|
|
@@ -60,52 +34,13 @@ export function surfaceForCurrentSession() {
|
|
|
60
34
|
}
|
|
61
35
|
return hostSurface;
|
|
62
36
|
}
|
|
63
|
-
// ── 件3(中断事故修复批 G,2026-07-15)—— 中断 deny 的有界观察 ─────────────────────────────────
|
|
64
|
-
/**
|
|
65
|
-
* 中断-deny 的后台 settle 观察预算。
|
|
66
|
-
*
|
|
67
|
-
* ══ 🔴 §2.4「DENY-abort」撤稿 + 本常量的论证前提重审(0.42.0;server [4833] 明请)═══════════
|
|
68
|
-
*
|
|
69
|
-
* **本段 0.28.0 原文写的是**:「decide 是 SYNC 驱动的(引擎跑到下一 park/终态才返,实测 4-5s+),
|
|
70
|
-
* 但 **DENY-abort 语义上引擎收到即终结 run**;2s 内连收都没收到 ⇒ 按丢失警示」。
|
|
71
|
-
* 那句加粗的前提**已被上游撤稿**,来源是 server 自己的契约成文(`4631a0f`,随 7.39 出;
|
|
72
|
-
* `ASSISTANT-WIRE-CONTRACT.md` §4a):**DENY 是 TOOL 级的应答,永远不是 run kill**;客户端不得
|
|
73
|
-
* 把「拒绝」译成「取消」;两个动词的 wire 判别式是 `cancelled` vs `gate.batch_halted`。
|
|
74
|
-
* ⇒ 「引擎收到 deny 即终结 run」这条**不成立**:deny 只结算**这一只 ask**,run 按自己的编排继续
|
|
75
|
-
* (裸拒 ⇒ `gate.batch_halted` 兄弟 coded 结算 + `haltedOnUserRejection`;带留言拒 ⇒ run 续跑)。
|
|
76
|
-
*
|
|
77
|
-
* **重审结论(本批只改论证,不改数值 —— 理由写全)**:
|
|
78
|
-
* · 旧论证「2s 没结算 = deny 大概率丢了,因为收到就该终结」**作废**;
|
|
79
|
-
* · 但本常量守的那件事**换一个理由仍然成立**:它是一个**观察上限**,给「decide 永不返回」这种
|
|
80
|
-
* 形态一条出声的路 —— 没有它,一次真的丢失就只剩静默;
|
|
81
|
-
* · **数值不在本批动**:动它是行为面改动,而判据(多久算「没回来」)只有拿真实 decide 往返分布
|
|
82
|
-
* 说了算,那份实测在**消费端**(壳中断路径)而不在包里;且下游 `sema-cli` 的
|
|
83
|
-
* `src/sema/hitlCancelDeny.test.ts` 按现值锁着行为,单边改会当场把消费端打红。
|
|
84
|
-
* · **如实登记的残余**(接入档 §6e/§7 同批记):预算到点就发的那行 warn 措辞是
|
|
85
|
-
* {@link CANCEL_DENY_WARN_TEXT}(「the session may stay locked」),而在新契约下「decide 慢」
|
|
86
|
-
* 与「deny 丢了」这两件事在 2s 这个刻度上**不可分** —— 晚到的成功不会撤回那行 warn(只有 10s
|
|
87
|
-
* 自清)。要根治得做成两档(软档只记 debug、硬档才上屏),那是**跨仓一批**:包侧改时序、壳侧
|
|
88
|
-
* 同批换判据与用例。本批不做单边改动。
|
|
89
|
-
*/
|
|
90
37
|
export const CANCEL_DENY_BUDGET_MS = 2000;
|
|
91
|
-
/** warn 行文案(测试锁字面)。 */
|
|
92
38
|
export const CANCEL_DENY_WARN_TEXT = 'could not cancel the pending question — the session may stay locked; the run may need engine-side recovery';
|
|
93
39
|
const CANCEL_DENY_WARN_KEY = 'hitl-cancel-deny-warn';
|
|
94
40
|
const CANCEL_DENY_WARN_TIMEOUT_MS = 10_000;
|
|
95
|
-
/** 失败 warn 上屏:借 footer notifications 通道。壳原文经 `appStateRef` 直写 store
|
|
96
|
-
* (immediate 语义:立即顶到 current + 到点自清「仅当仍是本 warn 时」);本包把那两次
|
|
97
|
-
* setState 拆成宿主口的两个动词,**时序纪律(2s 预算 / 10s 自清)留在库内**——
|
|
98
|
-
* [paired-mechanisms-must-share-premise]:只给「显示」不给「清」,端各写各的清法必然漂。
|
|
99
|
-
* 无口(print/headless 没屏可上)⇒ 静默,与壳原文 `if (!store) return` 同语义。 */
|
|
100
41
|
function surfaceCancelDenyWarn() {
|
|
101
42
|
surfaceSelfClearingWarn(CANCEL_DENY_WARN_KEY, CANCEL_DENY_WARN_TEXT, CANCEL_DENY_WARN_TIMEOUT_MS);
|
|
102
43
|
}
|
|
103
|
-
/**
|
|
104
|
-
* 「上屏一行 warning + 到点自清(仅当仍是本 key)」的**唯一**实现(FIX① 收编:此前只有
|
|
105
|
-
* cancel-by-deny 一处,新增 remember-not-applied 时若各写一遍,两处的自清时序必然漂 ——
|
|
106
|
-
* [paired-mechanisms-must-share-premise];顺带保住 TIMER③ 的裸定时器创建点基线不上涨)。
|
|
107
|
-
* 无宿主口 ⇒ 静默(print/headless 没屏可上,与壳原文 `if (!store) return` 同语义)。
|
|
108
|
-
*/
|
|
109
44
|
function surfaceSelfClearingWarn(key, text, timeoutMs) {
|
|
110
45
|
try {
|
|
111
46
|
const s = surfaceForCurrentSession();
|
|
@@ -117,130 +52,43 @@ function surfaceSelfClearingWarn(key, text, timeoutMs) {
|
|
|
117
52
|
s.clearNoticeIfCurrent(key);
|
|
118
53
|
}
|
|
119
54
|
catch {
|
|
120
|
-
/* fail-soft */
|
|
121
55
|
}
|
|
122
56
|
}, timeoutMs);
|
|
123
57
|
unrefTimer(timer);
|
|
124
58
|
}
|
|
125
59
|
catch {
|
|
126
|
-
/* fail-soft:上屏失败绝不再伤害它所依附的那条流 */
|
|
127
60
|
}
|
|
128
61
|
}
|
|
129
|
-
// ── FIX① (2026-08-07) —— allow_session 的「记住了没有」诚实回执 ────────────────────────────────
|
|
130
|
-
/** 文案(测试锁字面)。措辞刻意描述**后果**而不是内部机制:用户要知道的是「下次还会问」。 */
|
|
131
62
|
export const REMEMBER_NOT_APPLIED_WARN_TEXT = 'this session-wide allow was not remembered by the worker — you will be asked again for this tool';
|
|
132
63
|
const REMEMBER_NOT_APPLIED_KEY = 'hitl-remember-not-applied';
|
|
133
64
|
const REMEMBER_NOT_APPLIED_TIMEOUT_MS = 10_000;
|
|
134
|
-
/** 文案(测试锁字面)。"original" 是判据词:用户必须读到「跑的是原来那份」。 */
|
|
135
65
|
export const EDIT_NOT_FORWARDED_WARN_TEXT = 'your edited tool input was NOT forwarded — the tool is running with the ORIGINAL input you saw before editing';
|
|
136
66
|
const EDIT_NOT_FORWARDED_KEY = 'hitl-edit-not-forwarded';
|
|
137
|
-
/** 比 remember 那条久:它说的是「正在跑的东西和你批的不是同一份」,值得多留一会儿。 */
|
|
138
67
|
const EDIT_NOT_FORWARDED_TIMEOUT_MS = 20_000;
|
|
139
|
-
/**
|
|
140
|
-
* `allow_session` 决断的 ack 回报 `rememberApplied:false`(server 1.239 起诚实回显 —— 典型成因
|
|
141
|
-
* 是这条 run 没有 sessionId,grant 无处可落)。
|
|
142
|
-
*
|
|
143
|
-
* 🔴 为什么这必须上屏而不是只记 debug:三选卡第 2 项在用户心里签的是「本会话这个工具不再问我」。
|
|
144
|
-
* 记没落店而界面照渲「全放行」,就是**把一个没有发生的授权渲成发生了** —— 下一次弹卡时用户会以为
|
|
145
|
-
* 是 bug,更坏的是他可能因此养成「一路回车」的习惯。缺席(旧 server 不出这个位)= 未知,
|
|
146
|
-
* 按 [honest-absence-not-fabricated-zero] 一律不发通知,绝不把未知渲成失败。
|
|
147
|
-
* 无宿主口(print/headless 没屏)⇒ 静默,与 {@link surfaceCancelDenyWarn} 同语义。
|
|
148
|
-
*/
|
|
149
68
|
export function surfaceRememberNotApplied() {
|
|
150
69
|
surfaceSelfClearingWarn(REMEMBER_NOT_APPLIED_KEY, REMEMBER_NOT_APPLIED_WARN_TEXT, REMEMBER_NOT_APPLIED_TIMEOUT_MS);
|
|
151
70
|
}
|
|
152
|
-
/**
|
|
153
|
-
* 「编辑并批准」带了 `updatedInput`,而 ack 回报 `updatedInputForwarded:false`(server 1.241 起
|
|
154
|
-
* 诚实回显)—— 引擎拿到的是**原始**入参。
|
|
155
|
-
*
|
|
156
|
-
* 🔴 这一条比 remember 那条严重一个量级,它是本批 对抗复审判的 [high]:用户在卡上把
|
|
157
|
-
* `rm -rf /tmp/x` 改成 `rm -rf /tmp/x/build` 然后按了批准,而真正执行的是他改之前那条。
|
|
158
|
-
* **事后没有 fail-closed 的余地**(allow 已经送达,工具已经在跑),所以唯一诚实的处置就是立刻
|
|
159
|
-
* 响亮地说出来 —— 静默(此前只写 debug 日志)等于让用户以为自己的编辑生效了。
|
|
160
|
-
* 上游的正位是让 server 在「带了 updatedInput 却转发不了」时 fail-closed 拒批;那属跨仓,
|
|
161
|
-
* 已记进 docs/refactor/README.md 的宿主/上游工单表,本层不做旁路补偿(只做如实告知)。
|
|
162
|
-
*/
|
|
163
71
|
export function surfaceEditNotForwarded() {
|
|
164
72
|
surfaceSelfClearingWarn(EDIT_NOT_FORWARDED_KEY, EDIT_NOT_FORWARDED_WARN_TEXT, EDIT_NOT_FORWARDED_TIMEOUT_MS);
|
|
165
73
|
}
|
|
166
|
-
/** 0.72.14:入参不可得的卡上收到了「编辑后批准」——什么都没发,ask 仍挂着(文案测试锁字面)。 */
|
|
167
74
|
export const EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT = 'That approval was NOT sent: this request does not expose its tool arguments here, so an edited approval cannot be applied. ' +
|
|
168
75
|
'The request is still waiting — approve or deny it as it is.';
|
|
169
76
|
const EDIT_REFUSED_ON_BLIND_ASK_KEY = 'hitl-edit-refused-blind-ask';
|
|
170
|
-
/** 见 {@link EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT};无宿主口 ⇒ 静默(与同族通知同语义)。 */
|
|
171
77
|
export function surfaceEditRefusedOnBlindAsk() {
|
|
172
78
|
surfaceSelfClearingWarn(EDIT_REFUSED_ON_BLIND_ASK_KEY, EDIT_REFUSED_ON_BLIND_ASK_WARN_TEXT, EDIT_NOT_FORWARDED_TIMEOUT_MS);
|
|
173
79
|
}
|
|
174
|
-
/**
|
|
175
|
-
* 文案(测试锁字面)。措辞刻意描述**后果**,并且**只说证得出的话**(异源对抗复审四轮 [medium] 修):
|
|
176
|
-
* · 不写「这台引擎不支持」——能力位缺席有三种同形成因(宿主没接这个字段 / 探测还没回来 / 探测失败),
|
|
177
|
-
* 其中只有明确的 `false` 才勉强算「引擎说了不」。写成断言就是替引擎宣布一件没证据的事
|
|
178
|
-
* ([honest-absence-not-fabricated-zero]);改成 `could not be confirmed` 的未知口径。
|
|
179
|
-
* · 「审批本身过了」这句**只在 respond 真成功之后**才成立 —— 所以本通知的**发出时机**被移到
|
|
180
|
-
* `await respond(...)` 成功之后(见 `toolApprovalWire` 的调用点顶注),而不是丢键那一刻。
|
|
181
|
-
*/
|
|
182
80
|
export const RULE_NOT_SENT_WARN_TEXT = 'your "don\'t ask again" choice was NOT sent to this engine — support for that rule form could not be confirmed. The approval itself went through, but you will be asked again';
|
|
183
81
|
const RULE_NOT_SENT_KEY = 'hitl-rule-arm-not-sent';
|
|
184
|
-
/** 与 remember 那条同量级(都是「你以为记住了、其实没有」),取同一个时长。 */
|
|
185
82
|
const RULE_NOT_SENT_TIMEOUT_MS = 10_000;
|
|
186
|
-
/**
|
|
187
|
-
* 卡上选中了「不再询问」(编辑臂的自由文本 / 批臂的合取批),而**这台引擎的能力位没有确认**
|
|
188
|
-
* 那条兑付通道 ⇒ 编排层把持久臂整条丢掉、只送决断。
|
|
189
|
-
*
|
|
190
|
-
* 🔴 为什么这必须上屏而不是只记 debug(异源对抗复审三轮 [high] 采纳,0.43.0):它与
|
|
191
|
-
* {@link surfaceRememberNotApplied} 是**同一个病**——用户按下了一个明确的意图,系统把它静默
|
|
192
|
-
* 丢掉,然后下一次照旧弹卡。用户能得出的唯一结论是「这个功能坏了」或「我按错了」。卡上那一格
|
|
193
|
-
* 是**真 affordance**(offer 确实在场、确实可以走本地落规则那条路),被丢的只是**这条 wire
|
|
194
|
-
* 兑付通道** —— 所以正解不是把选项藏起来,是**如实说出来**。
|
|
195
|
-
* 🔴 **一条通知服务两条臂**(同形清剿):编辑臂(`respondFreeFormRules` 位缺席)与批臂
|
|
196
|
-
* (`respondBatchRuleOffers` 位缺席)此前都只写 debug —— 同一个病形两处存量,同批一起改。
|
|
197
|
-
* 🔴 决断本身**不受影响**(照常送达),所以文案第二句说清「审批过了,只是规则没存」——
|
|
198
|
-
* ⚠️ 正因为文案里有那句话,**调用时机必须在 `respond` 真成功之后**(异源对抗复审四轮 [medium]:
|
|
199
|
-
* 丢键那一刻就发,而随后 respond 抛错 ⇒ 决断其实**没有**落定,用户却已经读到「审批过了」,
|
|
200
|
-
* 可能按「工具已经在跑」继续操作)。调用点的时序契约见 `toolApprovalWire` 那一处。
|
|
201
|
-
* 🔴 文案**不说「引擎不支持」**:能力位缺席三种同形成因(宿主没接字段 / 探测未回 / 探测失败),
|
|
202
|
-
* 断言引擎的能力是没有证据的话 —— 用 `could not be confirmed` 的未知口径。
|
|
203
|
-
* 无宿主口(print/headless 没屏)⇒ 静默,与本文件其余 surface 同语义。
|
|
204
|
-
*/
|
|
205
83
|
export function surfaceRuleArmNotSent() {
|
|
206
84
|
surfaceSelfClearingWarn(RULE_NOT_SENT_KEY, RULE_NOT_SENT_WARN_TEXT, RULE_NOT_SENT_TIMEOUT_MS);
|
|
207
85
|
}
|
|
208
|
-
/**
|
|
209
|
-
* 文案(测试锁字面)。与 {@link RULE_NOT_SENT_WARN_TEXT} **刻意分两条**:两者对用户的下一步建议不同 ——
|
|
210
|
-
* 那条说「这台引擎能不能收还不知道」(换台引擎/等探测就好了),本条说「你这次的选择**本身**没过
|
|
211
|
-
* 客户端那道核对」(卡口实现有问题或同时给了两个互斥选择,换台引擎也不会变)。折成一条会让任一方
|
|
212
|
-
* 谎报原因。措辞同样只说证得出的话:不猜是哪一种坏法,把两种都摆出来。
|
|
213
|
-
*/
|
|
214
86
|
export const RULE_NOT_SENT_REJECTED_WARN_TEXT = 'your "don\'t ask again" choice was NOT sent — it did not pass the client-side check (the card returned a rule the engine never offered, an index that is not a batch offer, or two conflicting choices at once). The approval itself went through, but you will be asked again';
|
|
215
87
|
const RULE_NOT_SENT_REJECTED_KEY = 'hitl-rule-arm-rejected';
|
|
216
88
|
const RULE_NOT_SENT_REJECTED_TIMEOUT_MS = 10_000;
|
|
217
|
-
/**
|
|
218
|
-
* 卡上选中了「不再询问」,而那次选择**没过包内那道表核 / 互斥核**(报了引擎没 offer 过的文本、
|
|
219
|
-
* 下标不指向 batch offer、或文本臂与批臂同场)⇒ 编排层把持久臂整条丢掉、只送决断。
|
|
220
|
-
*
|
|
221
|
-
* 🔴 为什么这也必须上屏(异源对抗复审十轮 [medium] 采纳,0.43.0):它与
|
|
222
|
-
* {@link surfaceRuleArmNotSent} 是**同一个诚实性问题**,只是原因换了一个 —— 用户按下的明确意图
|
|
223
|
-
* 被系统丢掉,审批照常成功,下次照旧弹卡。此前这三条丢键路径**只写 `hostLog('error')`**:
|
|
224
|
-
* 那是给开发者看的诊断,**不是**给按下按钮的那个人的答复。
|
|
225
|
-
* 🔴 **时序契约与那条一致**:文案里有「审批本身过了」⇒ 只在 `await respond(...)` 真成功之后发。
|
|
226
|
-
* 🔴 **成因通常是卡口实现的 bug**(表外文本/坏下标/两臂同场都是宿主侧构造出来的),所以 `hostLog`
|
|
227
|
-
* 的那条 `error` 留痕**照旧保留** —— 两个受众,两条通道,谁都不顶替谁。
|
|
228
|
-
* 无宿主口(print/headless 没屏)⇒ 静默,与本文件其余 surface 同语义。
|
|
229
|
-
*/
|
|
230
89
|
export function surfaceRuleArmRejected() {
|
|
231
90
|
surfaceSelfClearingWarn(RULE_NOT_SENT_REJECTED_KEY, RULE_NOT_SENT_REJECTED_WARN_TEXT, RULE_NOT_SENT_REJECTED_TIMEOUT_MS);
|
|
232
91
|
}
|
|
233
|
-
/**
|
|
234
|
-
* cancel-by-deny 的「良性 no_pending」判据。**结构化 `.code` 为主,`instanceof` 只作加强,绝不替代**:
|
|
235
|
-
* - `.code` 是 client-core 自家 `HitlSafetyError` 的契约属性(hitlBridge.ts,REF-CC-036 起是闭集
|
|
236
|
-
* 联合 binding_mismatch|no_pending|wrong_gate|bad_plan_edit)—— 不是 SDK 错误的 `errorCode`;
|
|
237
|
-
* - 只按 `instanceof` 判会在**跨 realm / 双实例**下假阴:打包后同一个包出现两份副本(本仓
|
|
238
|
-
* `singleton-manifest.json` 把双实例当在册风险处理)、或宿主与包各持一份构造器时,同一个
|
|
239
|
-
* 语义错误 `instanceof` 为假 ⇒ 良性 no_pending 被当成「deny 丢失」弹一行吓人的 warn;
|
|
240
|
-
* - 下游 `sema-cli` 的 `src/sema/hitlCancelDeny.test.ts` 用例 3 正是按 `code + name` 鸭子形造错,
|
|
241
|
-
* 那份契约就是「结构判据」本身。
|
|
242
|
-
* ⚠️ 判据不许松成「有 `.code` 就静默」—— 闭集里只有 `no_pending` 是良性,别的 code 照走 warn 臂。
|
|
243
|
-
*/
|
|
244
92
|
function isNoPendingError(e) {
|
|
245
93
|
if (e instanceof HitlSafetyError)
|
|
246
94
|
return e.code === 'no_pending';
|
|
@@ -249,22 +97,6 @@ function isNoPendingError(e) {
|
|
|
249
97
|
const code = e.code;
|
|
250
98
|
return typeof code === 'string' && code === 'no_pending';
|
|
251
99
|
}
|
|
252
|
-
/**
|
|
253
|
-
* 中断 deny 的有界观察(壳侧单测 `hitlCancelDeny.test.ts` 的被测面;REF-CC-023 起两条决断腿共用)。
|
|
254
|
-
*
|
|
255
|
-
* 🔴 **命名撤稿(0.42.0)**:函数名与日志里的「cancel-by-deny」是**历史词**,保留只为不打断下游
|
|
256
|
-
* 按名锚的用例。它描述的动作在现行契约(server `ASSISTANT-WIRE-CONTRACT.md` §4a)下的准确说法是
|
|
257
|
-
* 「**中断时把这只挂着的 ask 用一个 TOOL 级 deny 结算掉**,好让 run 不停在 suspended 上」——
|
|
258
|
-
* **不是**「用 deny 去 cancel 一条 run」。方向也别读反:这里是把**用户的中断**结算成一次 deny,
|
|
259
|
-
* 而 §4a 禁的是反向的那件事(把**用户的拒绝**译成 cancel),两者不是同一件事。
|
|
260
|
-
*
|
|
261
|
-
* 铁律:不 await 进 abort 返回路径(用户立即拿回控制);这里只管后台 settle 的«观察»:
|
|
262
|
-
* - 2s 内 settle 成功 ⇒ 零上屏(SEMA_DEBUG 记成功);
|
|
263
|
-
* - 失败/超时 ⇒ 上屏一行 warn + SEMA_DEBUG 记原因(deny 丢失 = run 卡 suspended,下一条消息
|
|
264
|
-
* 撞 409;配合件2b 的专属文案,用户知道现场 + 出路);
|
|
265
|
-
* - `code === 'no_pending'`(判据见上方 `isNoPendingError`)⇒ 良性静默(pending 已被别处消解/
|
|
266
|
-
* 过期 —— run 没锁;hitlBridge decideTool 的同款语义,那里的静默维持不动)。
|
|
267
|
-
*/
|
|
268
100
|
export function observeCancelByDeny(settle, taskId) {
|
|
269
101
|
let timer;
|
|
270
102
|
const budget = new Promise((_, reject) => {
|
|
@@ -287,6 +119,5 @@ export function observeCancelByDeny(settle, taskId) {
|
|
|
287
119
|
if (timer !== undefined)
|
|
288
120
|
clearTimeout(timer);
|
|
289
121
|
});
|
|
290
|
-
// 超时后原 promise 迟到 reject 不得变成 unhandledRejection。
|
|
291
122
|
void settle.catch(() => { });
|
|
292
123
|
}
|
|
@@ -1,53 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* livePendingAsk — 「悬挂的流内 ask」的三端共用读面与决断口(0.72.14)。
|
|
3
|
-
*
|
|
4
|
-
* ── 这个模块补的是哪一个缺口 ────────────────────────────────────────────────────────────────
|
|
5
|
-
* 流内 ask 在铸造那一刻若没有活着的宿主流可投,引擎把它转成**悬挂**(窗约一小时,不补发、不重算),此后只在
|
|
6
|
-
* `GET /v1/approvals` 回体的第二顶层键 `livePending` 里可发现。后台 workflow 的子代恒落这一形:宿主 turn 先结束,
|
|
7
|
-
* 子代稍后才撞上审批门 ⇒ 用户面零帧零卡,代理静默卡到窗尽。本模块让端从 {@link startApprovalsFeed} 的快照里
|
|
8
|
-
* 读到这些行、出带子代身份的卡、并经**与流内帧腿同一条链**决断。
|
|
9
|
-
*
|
|
10
|
-
* ── 🔴 四条读法 ────────────────────────────────────────────────────────────────────────────
|
|
11
|
-
* ① **键缺席 ≠ 没有悬挂 ask**:老引擎不发这个键 ⇒ `not_reported`;快照上键缺席,计数读 `null`(不知道),绝不铸 `[]` / `0`。
|
|
12
|
-
* 🔴 CC-98 同一条纪律的第三态:feed 发的「这次取不到」臂(`kind:'unknown'`)喂进本模块三个口时,
|
|
13
|
-
* 计数读 `null`、视图读空、跟踪器**零 delta**(绝不把「取不到」当成「行都消失了」去撤卡)。
|
|
14
|
-
* ② **数组名即路由判据**:`livePending` 行的决议口是 `POST /v1/tool-approvals/{approvalId}/respond`(流内审批那个口),
|
|
15
|
-
* **不是** durable 行的 decide 口;两数组不混编。幂等键 = `approvalId`(与流内帧同一个 id)。
|
|
16
|
-
* ③ **可选旗标 only-if-true**:`fromSubagent` / `governanceForced` / `requiresRealApproval` 缺席绝不编码成 `false`。
|
|
17
|
-
* ④ **行上没有工具入参**(引擎刻意不在这个读面开第二道脱敏面)⇒ 卡必须明说「看不到入参」,不许渲一个空命令冒充全貌。
|
|
18
|
-
*
|
|
19
|
-
* sdk 的 barrel 没有导出这一行的类型 ⇒ 按**结构**窄读(与 `capabilities.executionLane` 同一姿势),多余成员不过境。
|
|
20
|
-
*/
|
|
21
1
|
import type { ApprovalsFeedEmission } from './approvalsFeed.js';
|
|
22
2
|
import { type RespondToolApprovalFn, type ToolApprovalFrame, type ToolApprovalFrameLaneOpts, type ToolApprovalFrameOutcome } from './toolApprovalWire.js';
|
|
23
|
-
/** 一条悬挂的流内 ask(窄读后的形;键集即全部)。 */
|
|
24
3
|
export interface LivePendingAskView {
|
|
25
|
-
/** 与 respond 口收的同一个 id。 */
|
|
26
4
|
approvalId: string;
|
|
27
5
|
toolName: string;
|
|
28
|
-
/** 登记时刻(epoch ms)。 */
|
|
29
6
|
ts: number;
|
|
30
|
-
/** 窗死线(绝对 epoch ms;引擎铸定,本包不重算)。 */
|
|
31
7
|
expiresAtMs: number;
|
|
32
8
|
sessionId?: string;
|
|
33
9
|
requiresRealApproval?: true;
|
|
34
10
|
governanceForced?: true;
|
|
35
|
-
/** 出自委派子代。 */
|
|
36
11
|
fromSubagent?: true;
|
|
37
|
-
/** 子代 taskId(与 `fromSubagent` 同生同缺)。 */
|
|
38
12
|
originTaskId?: string;
|
|
39
|
-
/**
|
|
40
|
-
* 0.73.2(server ≥7.87.0):本来会 emit 的那只 `tool_approval` 帧(含入参 / 窗三键 / 规则报价 …)。在场 ⇒ 出**全卡**;
|
|
41
|
-
* 缺席(老 server)⇒ 盲卡(`argsUnavailable`)。只在帧判别器过 **且** `type === 'tool_approval'` **且** `frame.approvalId === approvalId` 时在场(否则坏形丢该位不丢行);
|
|
42
|
-
* 整只原样带出,帧腿自己逐键窄读。
|
|
43
|
-
*/
|
|
44
13
|
frame?: ToolApprovalFrame;
|
|
45
14
|
}
|
|
46
|
-
/**
|
|
47
|
-
* `livePending` 段的三态读数。`malformed` = 键在场但读不懂(**不**折成 `not_reported`,也不折成空)。
|
|
48
|
-
* 🔴 CC-98:`malformed` 含**非空数组却一行都读不出**那一形(见 {@link readLivePendingRows} 内的分界注);
|
|
49
|
-
* **部分**坏行仍是 `present` + `dropped`。
|
|
50
|
-
*/
|
|
51
15
|
export type LivePendingReading = {
|
|
52
16
|
kind: 'not_reported';
|
|
53
17
|
} | {
|
|
@@ -57,83 +21,28 @@ export type LivePendingReading = {
|
|
|
57
21
|
rows: LivePendingAskView[];
|
|
58
22
|
dropped: number;
|
|
59
23
|
};
|
|
60
|
-
/**
|
|
61
|
-
* `GET /v1/approvals` 回体 → `livePending` 段读数。四必填位坏形的行丢弃并计数;同 `approvalId` 重复行留第一条。
|
|
62
|
-
* 🔴 CC-98:**非空数组却一行都读不出** ⇒ `malformed`(不是 `present` + 空列表)——分界与理由见函数末那段注。
|
|
63
|
-
*/
|
|
64
24
|
export declare function readLivePendingRows(body: unknown): LivePendingReading;
|
|
65
|
-
/** 视图过滤:给了 `sessionId` ⇒ 只留该会话的行;行上没有 `sessionId` = 归不了属 ⇒ 不留(不替别的会话出卡)。 */
|
|
66
25
|
export interface SuspendedAskFilter {
|
|
67
26
|
sessionId?: string;
|
|
68
27
|
}
|
|
69
|
-
/** 快照里**出自子代**的悬挂 ask(宿主自己的流内 ask 走流内帧腿,不在这里出卡)。未报 / 没有快照 ⇒ `[]`。 */
|
|
70
28
|
export declare function suspendedSubagentAsks(snapshot: ApprovalsFeedEmission | null | undefined, filter?: SuspendedAskFilter): LivePendingAskView[];
|
|
71
|
-
/** 「在等人决定」的计数。`null` = 不知道(没有快照 / 引擎没报这一段),**不是** 0。 */
|
|
72
29
|
export interface ApprovalsAwaitingDecisionCount {
|
|
73
|
-
/** durable 停驻行数。 */
|
|
74
30
|
durable: number | null;
|
|
75
|
-
/** 流内 ask 行数(含宿主自己的与子代的)。 */
|
|
76
31
|
live: number | null;
|
|
77
|
-
/** 其中出自子代的行数。 */
|
|
78
32
|
suspendedSubagent: number | null;
|
|
79
33
|
}
|
|
80
34
|
export declare function countApprovalsAwaitingDecision(snapshot: ApprovalsFeedEmission | null | undefined, filter?: SuspendedAskFilter): ApprovalsAwaitingDecisionCount;
|
|
81
|
-
/**
|
|
82
|
-
* 悬挂行 → 流内帧腿的输入。只带行上**真有**的位:窗三键不带(行上只有绝对死线,没有出帧时刻,凑不出可校偏的窗),
|
|
83
|
-
* `args` 不带(行上没有)。`sourceTaskId` = `originTaskId`(卡头子代身份徽章的来源)。
|
|
84
|
-
*/
|
|
85
35
|
export declare function livePendingRowToApprovalFrame(row: LivePendingAskView): ToolApprovalFrame;
|
|
86
|
-
/**
|
|
87
|
-
* 出卡并决断一条悬挂 ask —— **与流内帧腿同一条链**({@link surfaceToolApprovalFrameAndRespond}):同一个卡口、
|
|
88
|
-
* 同一个身份键铸口(`approvalId`)、同一套回执 / 拒绝读法。差别只有一处:行上没有入参 ⇒ 卡上明说
|
|
89
|
-
* (`argsUnavailable`),且这张卡上收到「编辑后批准」时**整次不发**(结局 `editRefused`;没有原文可编,丢掉改写再批准 =
|
|
90
|
-
* 批准了人没看到的原始入参)。
|
|
91
|
-
*/
|
|
92
36
|
export declare function surfaceSuspendedAskAndRespond(row: LivePendingAskView, respond: RespondToolApprovalFn, signal?: AbortSignal, lane?: ToolApprovalFrameLaneOpts): Promise<ToolApprovalFrameOutcome>;
|
|
93
|
-
/** {@link createSuspendedAskTracker} 每次吞一张快照的产出。 */
|
|
94
37
|
export interface SuspendedAskDelta {
|
|
95
|
-
/** 首次见到、该出卡的行。 */
|
|
96
38
|
appeared: LivePendingAskView[];
|
|
97
|
-
/** 此前 appeared 过、现在不在列表里的 approvalId(已被别处决断 / 过期 / 引擎换代)⇒ 撤卡。 */
|
|
98
39
|
gone: string[];
|
|
99
|
-
/**
|
|
100
|
-
* 0.73.2:此前 appeared 过(当时无 `frame`,出的是盲卡)、这一张快照上 `frame` 到了的行(server 滚动升级到 ≥7.87.0 的中途形)。
|
|
101
|
-
* 🔴 包**不会**替换已出的盲卡(帧腿撤卡的唯一方式是给一个决断,那会把 ask 结算掉);端若有按 callKey 原地更新卡的能力就用它刷新
|
|
102
|
-
* 入参,否则让用户在盲卡上决定 —— 常态(7.87.0 起帧从第一张快照就在)不会走到这里。
|
|
103
|
-
*/
|
|
104
40
|
upgraded: LivePendingAskView[];
|
|
105
41
|
}
|
|
106
42
|
export interface SuspendedAskTracker {
|
|
107
|
-
/**
|
|
108
|
-
* 吞一张 feed 发布物。三种入参三句话:
|
|
109
|
-
* · 真快照(`kind:'snapshot'`)⇒ 正常对账(appeared / gone / upgraded);
|
|
110
|
-
* · 🔴 CC-98「这次取不到」(`kind:'unknown'`)⇒ **零 delta**,已出的卡一张都不撤;
|
|
111
|
-
* · `null` / `undefined` ⇒ 由**调用方**声明「现在一条都看不到」(引擎换代 / 拆装配),按「列表空」对账 ⇒ 撤卡。
|
|
112
|
-
* 🔴 后两者是**两句话**,别当一回事:`kind:'unknown'` 说的是「**wire 这一眼没看成**」(包说的),
|
|
113
|
-
* `null` 说的是「**我这边现在没有可看的东西**」(端说的,典型 = 拆装配:卡已经没有决断口,留着才是骗人)。
|
|
114
|
-
* 取不到请把 unknown 臂**原样**喂进来,别自己转成 `null` —— 转一下就把「不知道」变成了「没有」。
|
|
115
|
-
* 🔴 第三种不完整:真快照带 `livePendingDropped > 0`(这一段有读不出来的行)⇒ 照报 `appeared` / `upgraded`,
|
|
116
|
-
* 但**不报 `gone`**(禁止缺席对账;那几行留在账上,等下一张完整快照再判)。
|
|
117
|
-
*/
|
|
118
43
|
ingest(snapshot: ApprovalsFeedEmission | null | undefined): SuspendedAskDelta;
|
|
119
|
-
/**
|
|
120
|
-
* 流内帧腿出卡**之前**调:认领这只 ask。返回 `true` = 帧腿可以出卡(此后快照不再为它出第二张);
|
|
121
|
-
* 返回 `false` = 它已经从快照出过卡 / 已被认领 / 已决断 ⇒ 帧腿**跳过出卡**(两条通道同一只 ask 只有一张卡、一次决断)。
|
|
122
|
-
*/
|
|
123
44
|
noteSurfacedByStream(approvalId: string): boolean;
|
|
124
|
-
/** 让一只已出过卡的 ask 在下一张快照里重新 `appeared`(卡被关掉 / 改写被拒 `editRefused` 之后)。 */
|
|
125
45
|
requeue(approvalId: string): void;
|
|
126
|
-
/** 这只 ask 已在本端决断 ⇒ 引擎结算前它还会在列表里待一会儿,不重新出卡;之后消失也不再报 gone。 */
|
|
127
46
|
noteDecided(approvalId: string): void;
|
|
128
47
|
}
|
|
129
|
-
/**
|
|
130
|
-
* 快照 → 出卡 / 撤卡的去重账(每个宿主会话一只;不是模块级单例)。同一 `approvalId` 只 `appeared` 一次;
|
|
131
|
-
* `livePending` 键缺席按「现在一条都看不到」处理已出的卡(引擎换代后旧卡没有决断口可用)。
|
|
132
|
-
*
|
|
133
|
-
* 两本账,**都不按条数淘汰活跃条目**(异源对抗复审:无差别的「满了删最旧」会让仍挂着的卡重出、漏撤):
|
|
134
|
-
* · `shown` = 从快照出过卡、且仍在列表里的 ask。条目随「从列表消失」离账 ⇒ 大小恒 ≤ 列表长度,不设上界。
|
|
135
|
-
* · `claimed` = 被流内帧腿认领 / 已在本端决断的 ask,值 = 是否已在某张快照里见过。见过之后从列表消失 ⇒ 这只 ask
|
|
136
|
-
* 的一生结束,离账(同 id 日后再出现是新的一只)。**从未见过**的认领才受上界管(帧先到、快照一直没列到它的那一小段),
|
|
137
|
-
* 满了只淘汰这一类里最旧的。
|
|
138
|
-
*/
|
|
139
48
|
export declare function createSuspendedAskTracker(filter?: SuspendedAskFilter): SuspendedAskTracker;
|