@sema-agent/client-core 0.77.1 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -1
- package/README.md +6 -5
- package/dist/abortableSleep.d.ts +0 -28
- package/dist/abortableSleep.js +0 -28
- package/dist/adapt/arms.d.ts +0 -46
- package/dist/adapt/arms.js +9 -544
- package/dist/adapt/ids.d.ts +0 -58
- package/dist/adapt/ids.js +0 -63
- package/dist/adapt/instanceLedger.d.ts +0 -25
- package/dist/adapt/instanceLedger.js +0 -20
- package/dist/adapt/panelTasks.d.ts +0 -69
- package/dist/adapt/panelTasks.js +0 -95
- package/dist/adapt/textSegmentAuthority.d.ts +1 -137
- package/dist/adapt/textSegmentAuthority.js +0 -54
- package/dist/adapt/textStream.d.ts +0 -252
- package/dist/adapt/textStream.js +2 -281
- package/dist/adapt/toolCards.d.ts +0 -46
- package/dist/adapt/toolCards.js +0 -23
- package/dist/adapt/turnFlags.d.ts +0 -54
- package/dist/adapt/turnFlags.js +1 -17
- package/dist/adapt/wireShapes.d.ts +0 -92
- package/dist/adapt/wireShapes.js +0 -83
- package/dist/adapt.d.ts +0 -55
- package/dist/adapt.js +1 -120
- package/dist/adapter/activeRunSelfHeal.d.ts +22 -515
- package/dist/adapter/activeRunSelfHeal.js +10 -625
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +2 -305
- package/dist/adapter/downstream/eventToSdkMessage.js +2 -867
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -314
- package/dist/adapter/downstream/terminalToSdkResult.js +13 -560
- package/dist/adapter/downstream/turnUsageToModelUsage.d.ts +0 -95
- package/dist/adapter/downstream/turnUsageToModelUsage.js +2 -31
- package/dist/adapter/runStream.d.ts +0 -206
- package/dist/adapter/runStream.js +6 -596
- package/dist/adapter/types.d.ts +0 -111
- package/dist/adapter/types.js +0 -29
- package/dist/agentSession/backgroundView.d.ts +0 -106
- package/dist/agentSession/backgroundView.js +3 -49
- package/dist/agentSession/contract.d.ts +0 -98
- package/dist/agentSession/contract.js +0 -12
- package/dist/agentsWireCaps.d.ts +0 -72
- package/dist/agentsWireCaps.js +4 -72
- package/dist/approvalsStreamLiveCapability.d.ts +0 -25
- package/dist/approvalsStreamLiveCapability.js +0 -31
- package/dist/argvFlagValue.d.ts +0 -33
- package/dist/argvFlagValue.js +3 -35
- package/dist/attachmentsWireCaps.d.ts +0 -127
- package/dist/attachmentsWireCaps.js +0 -144
- package/dist/autoModeUnavailable.d.ts +0 -120
- package/dist/autoModeUnavailable.js +0 -144
- package/dist/classifierStatus.d.ts +0 -72
- package/dist/classifierStatus.js +0 -167
- package/dist/classifierVerdictWire.d.ts +0 -54
- package/dist/classifierVerdictWire.js +0 -133
- package/dist/clientContextWireCaps.d.ts +0 -37
- package/dist/clientContextWireCaps.js +0 -36
- package/dist/clientSlice.d.ts +0 -63
- package/dist/clientSlice.js +0 -45
- package/dist/cloudConfigWireCaps.d.ts +0 -86
- package/dist/cloudConfigWireCaps.js +2 -65
- package/dist/compensations.d.ts +0 -52
- package/dist/compensations.js +2 -63
- package/dist/controlRouter.d.ts +2 -208
- package/dist/controlRouter.js +1 -129
- package/dist/coreValuePorts.d.ts +0 -84
- package/dist/coreValuePorts.js +0 -29
- package/dist/decideReceipt.d.ts +0 -110
- package/dist/decideReceipt.js +0 -84
- package/dist/detachWire.d.ts +0 -130
- package/dist/detachWire.js +1 -130
- package/dist/deviceExecutorManagementCapability.d.ts +2 -35
- package/dist/deviceExecutorManagementCapability.js +1 -37
- package/dist/diagnostics.d.ts +0 -8
- package/dist/diagnostics.js +0 -8
- package/dist/diff/patch.d.ts +0 -17
- package/dist/diff/patch.js +0 -19
- package/dist/effectiveFacts.d.ts +0 -40
- package/dist/effectiveFacts.js +0 -22
- package/dist/effortWire.d.ts +0 -11
- package/dist/effortWire.js +0 -12
- package/dist/engineAgentPanelStore.d.ts +0 -169
- package/dist/engineAgentPanelStore.js +13 -293
- package/dist/engineCapReader.d.ts +0 -62
- package/dist/engineCapReader.js +1 -43
- package/dist/engineCapsCache.d.ts +0 -177
- package/dist/engineCapsCache.js +0 -199
- package/dist/engineCapsGenerationGuard.d.ts +0 -2
- package/dist/engineCapsGenerationGuard.js +0 -11
- package/dist/engineErrorCodes.d.ts +1 -316
- package/dist/engineErrorCodes.js +0 -427
- package/dist/engineHttpTools.d.ts +0 -29
- package/dist/engineHttpTools.js +0 -29
- package/dist/engineIdentity.d.ts +0 -83
- package/dist/engineIdentity.js +0 -88
- package/dist/engineInlineTaskStats.d.ts +0 -57
- package/dist/engineInlineTaskStats.js +1 -42
- package/dist/engineNoticeCodes.d.ts +0 -190
- package/dist/engineNoticeCodes.js +0 -182
- package/dist/engineSessionParam.d.ts +0 -30
- package/dist/engineSessionParam.js +0 -52
- package/dist/engineToolLabelStore.d.ts +0 -29
- package/dist/engineToolLabelStore.js +0 -31
- package/dist/engineWireSdk.d.ts +0 -90
- package/dist/engineWireSdk.js +0 -74
- package/dist/engineWireTarget.d.ts +0 -14
- package/dist/engineWireTarget.js +0 -39
- package/dist/env/localeGeo.d.ts +0 -12
- package/dist/env/localeGeo.js +2 -77
- package/dist/env/localeTag.d.ts +0 -34
- package/dist/env/localeTag.js +0 -32
- package/dist/env/uiLanguage.d.ts +0 -13
- package/dist/env/uiLanguage.js +0 -25
- package/dist/envFlag.d.ts +0 -37
- package/dist/envFlag.js +0 -40
- package/dist/executionLaneCapability.d.ts +0 -48
- package/dist/executionLaneCapability.js +0 -54
- package/dist/finalVerifyWire.d.ts +0 -67
- package/dist/finalVerifyWire.js +3 -43
- package/dist/fleet/fleetLedger.d.ts +0 -308
- package/dist/fleet/fleetLedger.js +10 -429
- package/dist/fleet/fleetProjection.d.ts +0 -240
- package/dist/fleet/fleetProjection.js +0 -189
- package/dist/fleet/fleetRowAgentType.d.ts +0 -6
- package/dist/fleet/fleetRowAgentType.js +1 -32
- package/dist/fleet/workflowSizeWarning.d.ts +0 -47
- package/dist/fleet/workflowSizeWarning.js +1 -46
- package/dist/fleetAgentPanelProjection.d.ts +0 -48
- package/dist/fleetAgentPanelProjection.js +8 -173
- package/dist/fleetTaskDesc.d.ts +0 -39
- package/dist/fleetTaskDesc.js +0 -69
- package/dist/forkWireCaps.d.ts +0 -23
- package/dist/forkWireCaps.js +1 -24
- package/dist/gateOutcome.d.ts +0 -140
- package/dist/gateOutcome.js +0 -85
- package/dist/gateVocabulary.d.ts +0 -114
- package/dist/gateVocabulary.js +3 -161
- package/dist/goalStopHook.d.ts +0 -127
- package/dist/goalStopHook.js +0 -178
- package/dist/headlessPermissionModeWire.d.ts +0 -76
- package/dist/headlessPermissionModeWire.js +1 -155
- package/dist/headlessReconnectWire.d.ts +0 -84
- package/dist/headlessReconnectWire.js +13 -67
- package/dist/hitl/approvalDecisionNoteAudit.d.ts +0 -49
- package/dist/hitl/approvalDecisionNoteAudit.js +0 -56
- package/dist/hitl/approvalOutcomeNote.d.ts +0 -2
- package/dist/hitl/approvalOutcomeNote.js +0 -20
- package/dist/hitl/approvalResolution.d.ts +0 -113
- package/dist/hitl/approvalResolution.js +0 -66
- package/dist/hitl/approvalsFeed.d.ts +0 -183
- package/dist/hitl/approvalsFeed.js +12 -243
- package/dist/hitl/armedGateRegistry.d.ts +0 -55
- package/dist/hitl/armedGateRegistry.js +0 -146
- package/dist/hitl/askGateWire.d.ts +0 -86
- package/dist/hitl/askGateWire.js +1 -95
- package/dist/hitl/askParkRowRouting.d.ts +0 -123
- package/dist/hitl/askParkRowRouting.js +1 -89
- package/dist/hitl/crashConverged.d.ts +0 -148
- package/dist/hitl/crashConverged.js +0 -214
- package/dist/hitl/editedRuleTextPrecheck.d.ts +0 -109
- package/dist/hitl/editedRuleTextPrecheck.js +0 -71
- package/dist/hitl/frameRouter.d.ts +0 -134
- package/dist/hitl/frameRouter.js +6 -378
- package/dist/hitl/gateIdentity.d.ts +0 -39
- package/dist/hitl/gateIdentity.js +0 -41
- package/dist/hitl/gateLedger.d.ts +0 -267
- package/dist/hitl/gateLedger.js +0 -121
- package/dist/hitl/hitlBridge.d.ts +7 -431
- package/dist/hitl/hitlBridge.js +7 -476
- package/dist/hitl/hitlHostSurface.d.ts +0 -150
- package/dist/hitl/hitlHostSurface.js +0 -169
- package/dist/hitl/livePendingAsk.d.ts +0 -91
- package/dist/hitl/livePendingAsk.js +0 -74
- package/dist/hitl/localAllowRule.d.ts +0 -62
- package/dist/hitl/localAllowRule.js +1 -33
- package/dist/hitl/parkOwnership.d.ts +0 -56
- package/dist/hitl/parkOwnership.js +0 -22
- package/dist/hitl/parkResolver.d.ts +3 -88
- package/dist/hitl/parkResolver.js +8 -349
- package/dist/hitl/parkRowBirthWait.d.ts +2 -26
- package/dist/hitl/parkRowBirthWait.js +3 -93
- package/dist/hitl/persistedRulesWire.d.ts +23 -371
- package/dist/hitl/persistedRulesWire.js +62 -329
- package/dist/hitl/planReviewWire.d.ts +4 -176
- package/dist/hitl/planReviewWire.js +9 -312
- package/dist/hitl/resumeRunningCard.d.ts +0 -105
- package/dist/hitl/resumeRunningCard.js +0 -105
- package/dist/hitl/sessionPolicyWire.d.ts +11 -191
- package/dist/hitl/sessionPolicyWire.js +0 -149
- package/dist/hitl/suspendedReopen.d.ts +3 -24
- package/dist/hitl/suspendedReopen.js +0 -14
- package/dist/hitl/toolApprovalWire.d.ts +5 -1308
- package/dist/hitl/toolApprovalWire.js +5 -945
- package/dist/hooksWireCaps.d.ts +0 -38
- package/dist/hooksWireCaps.js +0 -190
- package/dist/host.d.ts +0 -105
- package/dist/host.js +0 -33
- package/dist/hostEnv.d.ts +0 -14
- package/dist/hostEnv.js +0 -13
- package/dist/imagesWireCaps.d.ts +0 -21
- package/dist/imagesWireCaps.js +0 -22
- package/dist/index.d.ts +0 -134
- package/dist/index.js +0 -476
- package/dist/interactiveHalt.d.ts +5 -153
- package/dist/interactiveHalt.js +0 -111
- package/dist/interactiveToolsWire.d.ts +0 -62
- package/dist/interactiveToolsWire.js +1 -67
- package/dist/leaderConflict.d.ts +0 -59
- package/dist/leaderConflict.js +0 -48
- package/dist/limitsWire.d.ts +0 -125
- package/dist/limitsWire.js +2 -120
- package/dist/liveInitToolFace.d.ts +0 -77
- package/dist/liveInitToolFace.js +1 -109
- package/dist/liveModelCatalog.d.ts +0 -52
- package/dist/liveModelCatalog.js +0 -48
- package/dist/liveQuestionStore.d.ts +0 -87
- package/dist/liveQuestionStore.js +1 -56
- package/dist/mcpLiveness.d.ts +0 -151
- package/dist/mcpLiveness.js +0 -122
- package/dist/mcpPanel.d.ts +0 -104
- package/dist/mcpPanel.js +0 -49
- package/dist/mcpReconnect.d.ts +0 -58
- package/dist/mcpReconnect.js +0 -69
- package/dist/mcpWireCaps.d.ts +0 -55
- package/dist/mcpWireCaps.js +1 -13
- package/dist/memoryComplianceCapability.d.ts +3 -57
- package/dist/memoryComplianceCapability.js +0 -57
- package/dist/memoryEntriesWire.d.ts +6 -198
- package/dist/memoryEntriesWire.js +0 -144
- package/dist/memoryOriginCapability.d.ts +3 -53
- package/dist/memoryOriginCapability.js +0 -50
- package/dist/memorySpecWire.d.ts +0 -116
- package/dist/memorySpecWire.js +0 -150
- package/dist/model/catalog.d.ts +0 -111
- package/dist/model/catalog.js +0 -87
- package/dist/model/catalogLoader.d.ts +0 -114
- package/dist/model/catalogLoader.js +2 -139
- package/dist/model/modelSupplyRules.d.ts +1 -55
- package/dist/model/modelSupplyRules.js +0 -62
- package/dist/model/providerAuth.d.ts +0 -103
- package/dist/model/providerAuth.js +2 -38
- package/dist/model/providerCatalog.d.ts +0 -45
- package/dist/model/providerCatalog.js +0 -37
- package/dist/model/providerPresets.d.ts +0 -33
- package/dist/model/providerPresets.js +2 -91
- package/dist/model/tierVocabulary.d.ts +0 -31
- package/dist/model/tierVocabulary.js +0 -27
- package/dist/modelBudgetRule.d.ts +0 -39
- package/dist/modelBudgetRule.js +0 -39
- package/dist/modelCapabilityProbe.d.ts +0 -175
- package/dist/modelCapabilityProbe.js +0 -147
- package/dist/modelWireCaps.d.ts +0 -13
- package/dist/modelWireCaps.js +0 -13
- package/dist/notifications.d.ts +0 -233
- package/dist/notifications.js +14 -492
- package/dist/oneShotWireCaps.d.ts +0 -34
- package/dist/oneShotWireCaps.js +0 -35
- package/dist/ownKey.d.ts +0 -33
- package/dist/ownKey.js +0 -33
- package/dist/panelRunningHistory.d.ts +0 -28
- package/dist/panelRunningHistory.js +0 -43
- package/dist/peerFrames.d.ts +0 -71
- package/dist/peerFrames.js +0 -168
- package/dist/peerLaneCapability.d.ts +0 -44
- package/dist/peerLaneCapability.js +0 -52
- package/dist/permissionRuleIssue.d.ts +0 -30
- package/dist/permissionRuleIssue.js +0 -78
- package/dist/permissionRulesWriteCapability.d.ts +0 -46
- package/dist/permissionRulesWriteCapability.js +0 -54
- package/dist/permissionWireCaps.d.ts +0 -37
- package/dist/permissionWireCaps.js +0 -37
- package/dist/postureKnob.d.ts +0 -71
- package/dist/postureKnob.js +0 -86
- package/dist/principalWire.d.ts +0 -17
- package/dist/principalWire.js +0 -17
- package/dist/printToolResultFrame.d.ts +0 -100
- package/dist/printToolResultFrame.js +0 -33
- package/dist/promptProfileWireCaps.d.ts +0 -13
- package/dist/promptProfileWireCaps.js +0 -13
- package/dist/readFacePosture.d.ts +0 -43
- package/dist/readFacePosture.js +0 -46
- package/dist/request/printNotification.d.ts +0 -20
- package/dist/request/printNotification.js +0 -55
- package/dist/request/taskRequest.d.ts +1 -249
- package/dist/request/taskRequest.js +20 -498
- package/dist/resumeRefusalCopy.d.ts +0 -136
- package/dist/resumeRefusalCopy.js +1 -117
- package/dist/retainBackgroundWireCaps.d.ts +0 -48
- package/dist/retainBackgroundWireCaps.js +0 -48
- package/dist/retryStatus.d.ts +2 -221
- package/dist/retryStatus.js +0 -107
- package/dist/rewindWireCaps.d.ts +0 -27
- package/dist/rewindWireCaps.js +0 -24
- package/dist/runCancelContext.d.ts +1 -20
- package/dist/runCancelContext.js +0 -34
- package/dist/runTerminal.d.ts +0 -273
- package/dist/runTerminal.js +0 -177
- package/dist/sandboxWire.d.ts +0 -38
- package/dist/sandboxWire.js +0 -82
- package/dist/scenarioWire.d.ts +0 -60
- package/dist/scenarioWire.js +0 -68
- package/dist/scratchpadWireCaps.d.ts +0 -11
- package/dist/scratchpadWireCaps.js +0 -32
- package/dist/sdkWireTransit.d.ts +0 -38
- package/dist/sdkWireTransit.js +0 -30
- package/dist/seam.d.ts +18 -853
- package/dist/seam.js +0 -52
- package/dist/seatContract.d.ts +0 -555
- package/dist/seatContract.js +5 -304
- package/dist/selfOrchestrationDenial.d.ts +0 -189
- package/dist/selfOrchestrationDenial.js +0 -162
- package/dist/selfOrchestrationWireCaps.d.ts +0 -38
- package/dist/selfOrchestrationWireCaps.js +0 -38
- package/dist/sessionMap.d.ts +0 -60
- package/dist/sessionMap.js +0 -37
- package/dist/sessionMemoryStatus.d.ts +11 -114
- package/dist/sessionMemoryStatus.js +0 -112
- package/dist/sessionModelLatch.d.ts +0 -29
- package/dist/sessionModelLatch.js +0 -40
- package/dist/sessionPolicyCapability.d.ts +3 -53
- package/dist/sessionPolicyCapability.js +0 -52
- package/dist/sessionSlot.d.ts +0 -26
- package/dist/sessionSlot.js +0 -17
- package/dist/skillsWireCaps.d.ts +0 -87
- package/dist/skillsWireCaps.js +0 -38
- package/dist/sqlEngineCapability.d.ts +0 -118
- package/dist/sqlEngineCapability.js +0 -134
- package/dist/sseIdleTriage.d.ts +0 -79
- package/dist/sseIdleTriage.js +1 -80
- package/dist/steering.d.ts +0 -54
- package/dist/steering.js +0 -63
- package/dist/subagent/engineCompactWire.d.ts +0 -34
- package/dist/subagent/engineCompactWire.js +4 -134
- package/dist/subagent/engineDelegatedPrompt.d.ts +0 -31
- package/dist/subagent/engineDelegatedPrompt.js +1 -103
- package/dist/subagent/engineRowStopGate.d.ts +0 -20
- package/dist/subagent/engineRowStopGate.js +0 -49
- package/dist/subagent/engineSubagentOutput.d.ts +0 -7
- package/dist/subagent/engineSubagentOutput.js +1 -51
- package/dist/subagent/engineSubagentResume.d.ts +2 -279
- package/dist/subagent/engineSubagentResume.js +2 -129
- package/dist/subagent/engineSubagentSteer.d.ts +0 -26
- package/dist/subagent/engineSubagentSteer.js +0 -63
- package/dist/subagent/engineSubagentTail.d.ts +0 -38
- package/dist/subagent/engineSubagentTail.js +2 -110
- package/dist/subagent/engineTaskHandleWire.d.ts +6 -67
- package/dist/subagent/engineTaskHandleWire.js +0 -126
- package/dist/subagent/subagentOwnerAbsence.d.ts +0 -2
- package/dist/subagent/subagentOwnerAbsence.js +0 -25
- package/dist/subagentContentStore.d.ts +3 -260
- package/dist/subagentContentStore.js +7 -540
- package/dist/systemReminderTag.d.ts +0 -49
- package/dist/systemReminderTag.js +0 -61
- package/dist/toolResult.d.ts +1 -211
- package/dist/toolResult.js +1 -358
- package/dist/toolRoster.d.ts +0 -140
- package/dist/toolRoster.js +0 -66
- package/dist/typePins.d.ts +0 -46
- package/dist/types/engineState.d.ts +0 -71
- package/dist/types/engineState.js +0 -16
- package/dist/ultracodeWireCaps.d.ts +0 -75
- package/dist/ultracodeWireCaps.js +0 -92
- package/dist/unrefTimer.d.ts +0 -27
- package/dist/webSearchBackendCapability.d.ts +0 -72
- package/dist/webSearchBackendCapability.js +0 -79
- package/dist/webSearchWireCaps.d.ts +0 -37
- package/dist/webSearchWireCaps.js +0 -34
- package/dist/websearch/searchProviderPresets.d.ts +0 -81
- package/dist/websearch/searchProviderPresets.js +0 -27
- package/dist/wireErrorTriage.d.ts +4 -160
- package/dist/wireErrorTriage.js +0 -171
- package/dist/wireRefusalCopy.d.ts +0 -28
- package/dist/wireRefusalCopy.js +0 -28
- package/dist/workflow.d.ts +0 -40
- package/dist/workflow.js +0 -52
- package/dist/workflowClient.d.ts +0 -122
- package/dist/workflowClient.js +8 -360
- package/dist/workflowMonitor.d.ts +2 -72
- package/dist/workflowMonitor.js +0 -26
- package/dist/writeProtectionCapability.d.ts +0 -112
- package/dist/writeProtectionCapability.js +0 -109
- package/docs/INTEGRATION-CLIENTS.md +78 -5
- package/package.json +3 -3
|
@@ -1,58 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hitl/approvalDecisionNoteAudit.ts — 审批**回决备注**(`decisionNote` / `noteRecorded`)的读面
|
|
3
|
-
* 判定 + 人话行(#265 上收件,2026-08-14;源形 = cli `src/sema/approvalDecisionNoteAudit.ts`,
|
|
4
|
-
* 供给半场 = server 7.15.0 的 `AskDecisionAck.decisionNote` / `ToolApprovalRespondAck.noteRecorded`)。
|
|
5
|
-
*
|
|
6
|
-
* ── 病 ────────────────────────────────────────────────────────────────────────────────────────
|
|
7
|
-
* 送出去的那条 deny 理由到底有没有落进审计档,客户端这边**一个字都不知道**:决断腿此前是
|
|
8
|
-
* `await decide…` 裸调,回体整个被丢掉。于是「我写了拒绝理由」与「那条理由真的进了审计行」之间
|
|
9
|
-
* 没有任何证据 —— deny 归因链在用户这一端是断的。
|
|
10
|
-
*
|
|
11
|
-
* ── 三态,不是两态 ────────────────────────────────────────────────────────────────────────────
|
|
12
|
-
* server 对这一位的契约(SDK `ToolApprovalRespondAck.noteRecorded` / `AskDecisionAck.decisionNote`
|
|
13
|
-
* 头注逐字)是**三态**,把它压成布尔就会造谎:
|
|
14
|
-
* · `recorded` —— `noteRecorded === true`,**或** durable ack 回显了 `decisionNote` 正文
|
|
15
|
-
* (契约:「行上有才发」⇒ 回显本身就是落行的证据);
|
|
16
|
-
* · `not-recorded` —— `noteRecorded === false`。这是店的**真实结果**(并发歧义臂的输家如实 false),
|
|
17
|
-
* 它说的是「理由没落档」,**不是**「审批失败」—— 决断照旧成立,渲染面必须
|
|
18
|
-
* 在同一行里把这句说出来,否则用户会以为自己按的那个拒绝没生效;
|
|
19
|
-
* · `unknown` —— 两个位都不在场(旧 server / 这台部署没有 durable ask 账本 / 本次压根没送 note)。
|
|
20
|
-
* ⇒ **整行不渲**。缺席≠false —— 渲一行「未记录」等于替引擎回答一个它没回答
|
|
21
|
-
* 的问题。
|
|
22
|
-
*
|
|
23
|
-
* 🔴 `noteRecorded === false` **压过**正文回显:显式的 per-call 真相优先。两者同时在场的形
|
|
24
|
-
* (并发歧义臂:行上留的是赢家那条备注,我这条没落)只有这样才说得准 —— 正文仍带出来当归因
|
|
25
|
-
* 材料(用户看得见「行上现在是哪条」),但状态词按 false 走。
|
|
26
|
-
*
|
|
27
|
-
* ── 🔴 归层 ───────────────────────────────────────────────────────────────────────────────────
|
|
28
|
-
* 本文件 = **纯判定 + 文案**,`import` 列表为空(常驻门 ④ 段逐次对账)。呈现口不在这里 ——
|
|
29
|
-
* 装配层把行交给宿主的通知/转录面。三端(cli / desktop / web)撞的是同一件事,读的是同一份 ack。
|
|
30
|
-
*
|
|
31
|
-
* ── UNTRUSTED ─────────────────────────────────────────────────────────────────────────────────
|
|
32
|
-
* `decisionNote` 的正文是**卡口自由文本**原样回声(用户自己打的拒绝理由,也可能是别的客户端打的)。
|
|
33
|
-
* 读面就地有界截断 + 清洗控制字符 —— 只渲染,永不回喂模型,也绝不整段进日志。
|
|
34
|
-
*/
|
|
35
|
-
/** 审计面通知的独占 key —— 与审批流告警面分格(两件事不抢同一格)。 */
|
|
36
1
|
export declare const DECISION_NOTE_NOTICE_KEY = "approval-decision-note";
|
|
37
|
-
/** 备注面的三态判决。`note` = 引擎回显的正文(缺席 = 引擎没回显,**不是**「没有备注」)。 */
|
|
38
2
|
export interface DecisionNoteAudit {
|
|
39
3
|
state: 'recorded' | 'not-recorded' | 'unknown';
|
|
40
4
|
note?: string;
|
|
41
5
|
}
|
|
42
|
-
/**
|
|
43
|
-
* 读一份回体(durable `AskDecisionAck` / legacy `ToolApprovalRespondAck` / 409
|
|
44
|
-
* `conflict.ask_decided` 体)里的备注面判决。
|
|
45
|
-
*
|
|
46
|
-
* 🔴 **在场即读、不在场即 unknown**:两个位在 SDK 类型上都是可选的,而「类型说 optional」与
|
|
47
|
-
* 「这台引擎真的发了」是两件事 —— 一律结构窄读,读不出就是缺席,绝不合成。
|
|
48
|
-
*/
|
|
49
6
|
export declare function readDecisionNoteAudit(ack: unknown): DecisionNoteAudit;
|
|
50
|
-
/**
|
|
51
|
-
* 人话行。**`unknown` ⇒ `null`(整行不渲)** —— 这条纪律不可削。
|
|
52
|
-
*
|
|
53
|
-
* @param opts.settledElsewhere 这份材料来自 409 `conflict.ask_decided`(别的客户端/legacy 腿先结算)
|
|
54
|
-
* ⇒ 行里要点明归因来源,否则用户会把首决那条备注当成自己刚写的那条。
|
|
55
|
-
*/
|
|
56
7
|
export declare function decisionNoteAuditLine(audit: DecisionNoteAudit, opts?: {
|
|
57
8
|
settledElsewhere?: boolean;
|
|
58
9
|
}): string | null;
|
|
@@ -1,45 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hitl/approvalDecisionNoteAudit.ts — 审批**回决备注**(`decisionNote` / `noteRecorded`)的读面
|
|
3
|
-
* 判定 + 人话行(#265 上收件,2026-08-14;源形 = cli `src/sema/approvalDecisionNoteAudit.ts`,
|
|
4
|
-
* 供给半场 = server 7.15.0 的 `AskDecisionAck.decisionNote` / `ToolApprovalRespondAck.noteRecorded`)。
|
|
5
|
-
*
|
|
6
|
-
* ── 病 ────────────────────────────────────────────────────────────────────────────────────────
|
|
7
|
-
* 送出去的那条 deny 理由到底有没有落进审计档,客户端这边**一个字都不知道**:决断腿此前是
|
|
8
|
-
* `await decide…` 裸调,回体整个被丢掉。于是「我写了拒绝理由」与「那条理由真的进了审计行」之间
|
|
9
|
-
* 没有任何证据 —— deny 归因链在用户这一端是断的。
|
|
10
|
-
*
|
|
11
|
-
* ── 三态,不是两态 ────────────────────────────────────────────────────────────────────────────
|
|
12
|
-
* server 对这一位的契约(SDK `ToolApprovalRespondAck.noteRecorded` / `AskDecisionAck.decisionNote`
|
|
13
|
-
* 头注逐字)是**三态**,把它压成布尔就会造谎:
|
|
14
|
-
* · `recorded` —— `noteRecorded === true`,**或** durable ack 回显了 `decisionNote` 正文
|
|
15
|
-
* (契约:「行上有才发」⇒ 回显本身就是落行的证据);
|
|
16
|
-
* · `not-recorded` —— `noteRecorded === false`。这是店的**真实结果**(并发歧义臂的输家如实 false),
|
|
17
|
-
* 它说的是「理由没落档」,**不是**「审批失败」—— 决断照旧成立,渲染面必须
|
|
18
|
-
* 在同一行里把这句说出来,否则用户会以为自己按的那个拒绝没生效;
|
|
19
|
-
* · `unknown` —— 两个位都不在场(旧 server / 这台部署没有 durable ask 账本 / 本次压根没送 note)。
|
|
20
|
-
* ⇒ **整行不渲**。缺席≠false —— 渲一行「未记录」等于替引擎回答一个它没回答
|
|
21
|
-
* 的问题。
|
|
22
|
-
*
|
|
23
|
-
* 🔴 `noteRecorded === false` **压过**正文回显:显式的 per-call 真相优先。两者同时在场的形
|
|
24
|
-
* (并发歧义臂:行上留的是赢家那条备注,我这条没落)只有这样才说得准 —— 正文仍带出来当归因
|
|
25
|
-
* 材料(用户看得见「行上现在是哪条」),但状态词按 false 走。
|
|
26
|
-
*
|
|
27
|
-
* ── 🔴 归层 ───────────────────────────────────────────────────────────────────────────────────
|
|
28
|
-
* 本文件 = **纯判定 + 文案**,`import` 列表为空(常驻门 ④ 段逐次对账)。呈现口不在这里 ——
|
|
29
|
-
* 装配层把行交给宿主的通知/转录面。三端(cli / desktop / web)撞的是同一件事,读的是同一份 ack。
|
|
30
|
-
*
|
|
31
|
-
* ── UNTRUSTED ─────────────────────────────────────────────────────────────────────────────────
|
|
32
|
-
* `decisionNote` 的正文是**卡口自由文本**原样回声(用户自己打的拒绝理由,也可能是别的客户端打的)。
|
|
33
|
-
* 读面就地有界截断 + 清洗控制字符 —— 只渲染,永不回喂模型,也绝不整段进日志。
|
|
34
|
-
*/
|
|
35
|
-
/** 备注面在渲染时的正文上界(一行 footer 通知,不是转录面正文)。 */
|
|
36
1
|
const NOTE_DISPLAY_MAX = 200;
|
|
37
|
-
/** 审计面通知的独占 key —— 与审批流告警面分格(两件事不抢同一格)。 */
|
|
38
2
|
export const DECISION_NOTE_NOTICE_KEY = 'approval-decision-note';
|
|
39
|
-
/**
|
|
40
|
-
* 控制字符/换行清洗 + 有界截断(UNTRUSTED 正文只走这一个口)。
|
|
41
|
-
* 🔴 换行必须折平:footer 通知是**单行**面,一条带换行的备注会把整段排版撕开。
|
|
42
|
-
*/
|
|
43
3
|
function cleanNote(raw) {
|
|
44
4
|
const flat = raw
|
|
45
5
|
.replace(/[\u0000-\u001f\u007f-\u009f]+/g, ' ')
|
|
@@ -47,40 +7,24 @@ function cleanNote(raw) {
|
|
|
47
7
|
.trim();
|
|
48
8
|
return flat.length <= NOTE_DISPLAY_MAX ? flat : `${flat.slice(0, NOTE_DISPLAY_MAX - 1)}…`;
|
|
49
9
|
}
|
|
50
|
-
/**
|
|
51
|
-
* 读一份回体(durable `AskDecisionAck` / legacy `ToolApprovalRespondAck` / 409
|
|
52
|
-
* `conflict.ask_decided` 体)里的备注面判决。
|
|
53
|
-
*
|
|
54
|
-
* 🔴 **在场即读、不在场即 unknown**:两个位在 SDK 类型上都是可选的,而「类型说 optional」与
|
|
55
|
-
* 「这台引擎真的发了」是两件事 —— 一律结构窄读,读不出就是缺席,绝不合成。
|
|
56
|
-
*/
|
|
57
10
|
export function readDecisionNoteAudit(ack) {
|
|
58
11
|
if (ack === null || typeof ack !== 'object')
|
|
59
12
|
return { state: 'unknown' };
|
|
60
13
|
const o = ack;
|
|
61
14
|
const note = typeof o.decisionNote === 'string' && o.decisionNote.trim() !== '' ? cleanNote(o.decisionNote) : undefined;
|
|
62
|
-
// 显式 per-call 真相优先(见头注)。
|
|
63
15
|
if (o.noteRecorded === false)
|
|
64
16
|
return { state: 'not-recorded', ...(note !== undefined ? { note } : {}) };
|
|
65
17
|
if (o.noteRecorded === true)
|
|
66
18
|
return { state: 'recorded', ...(note !== undefined ? { note } : {}) };
|
|
67
|
-
// `noteRecorded` 是非布尔垃圾值(旧 server / 代理改写)⇒ 当它不在场,只看正文回显。
|
|
68
19
|
if (note !== undefined)
|
|
69
20
|
return { state: 'recorded', note };
|
|
70
21
|
return { state: 'unknown' };
|
|
71
22
|
}
|
|
72
|
-
/**
|
|
73
|
-
* 人话行。**`unknown` ⇒ `null`(整行不渲)** —— 这条纪律不可削。
|
|
74
|
-
*
|
|
75
|
-
* @param opts.settledElsewhere 这份材料来自 409 `conflict.ask_decided`(别的客户端/legacy 腿先结算)
|
|
76
|
-
* ⇒ 行里要点明归因来源,否则用户会把首决那条备注当成自己刚写的那条。
|
|
77
|
-
*/
|
|
78
23
|
export function decisionNoteAuditLine(audit, opts) {
|
|
79
24
|
if (audit.state === 'unknown')
|
|
80
25
|
return null;
|
|
81
26
|
const quoted = audit.note !== undefined ? `: "${audit.note}"` : '';
|
|
82
27
|
if (opts?.settledElsewhere === true) {
|
|
83
|
-
// 首决备注只在 recorded 侧有意义(false = 我这条没落,但行上仍是别人那条)。
|
|
84
28
|
return audit.state === 'recorded'
|
|
85
29
|
? `this approval was already decided elsewhere — the reason recorded on the audit trail${quoted}`
|
|
86
30
|
: `this approval was already decided elsewhere; your reason was not saved to the audit trail — that decision stands${quoted}`;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { ToolApprovalFrame, ToolApprovalFrameOutcome } from './toolApprovalWire.js';
|
|
2
|
-
/** 宿主便签形(三端同一形;`retracted` / `detail` 在场才带)。 */
|
|
3
2
|
export interface StreamApprovalOutcomeNote {
|
|
4
3
|
readonly approvalId: string;
|
|
5
4
|
readonly settled: boolean;
|
|
@@ -8,5 +7,4 @@ export interface StreamApprovalOutcomeNote {
|
|
|
8
7
|
}
|
|
9
8
|
export declare const APPROVAL_NOTE_RETRACTED_DETAIL = "the card was retracted (this host no longer has a decision port for it)";
|
|
10
9
|
export declare const APPROVAL_NOTE_EDIT_REFUSED_DETAIL = "edits are not accepted on this card";
|
|
11
|
-
/** 帧 + 结局 → 便签(纯函数;结局上的坏形按缺席读,不抛)。 */
|
|
12
10
|
export declare function approvalOutcomeNoteOf(frame: Pick<ToolApprovalFrame, 'approvalId'>, outcome: ToolApprovalFrameOutcome): StreamApprovalOutcomeNote;
|
|
@@ -1,40 +1,20 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* approvalOutcomeNote — 流内帧腿的审批结局回交(`AskGateWireDeps.onToolApprovalOutcome(frame, outcome)`,0.74.1 CC-68)
|
|
3
|
-
* 到宿主「审批结局便签」的**单源映射**(0.74.5 CC-88;此前三端装配点各手拼一份,语义以 cli 1.0.123 现行为准):
|
|
4
|
-
* · `approvalId` = 帧上的原词;
|
|
5
|
-
* · `settled` = 这次决断**落定了**(respond 送达并落定;**不看** ack 在不在 —— ack 是 server 的回执形,宿主不读);
|
|
6
|
-
* 判据 = {@link approvalResolutionOf} 的落定臂,与旧口径 `outcome.decision !== 'unresolved'` 在实装可达的每一形上同值
|
|
7
|
-
* (撤卡 / 编辑被拒两形只与 `'unresolved'` 同场铸出);
|
|
8
|
-
* · `retracted` 只在 `outcome.retracted === true` 时带键(**独立判别位**,不折进 detail:撤卡 ≠ 投递失败 —— 释放认领但不扣重出卡预算);
|
|
9
|
-
* `editRefused` **不算** retracted,只折进 detail;
|
|
10
|
-
* · `detail` 三支优先序:撤卡固定句 → 编辑被拒固定句 → `respondRefusal` 的 errorCode / message 过滤非空后 ` · ` 拼接;
|
|
11
|
-
* 拼出空串 ⇒ 键缺席(绝不编一句;不用决断词、不用 ack 摘要)。
|
|
12
|
-
*
|
|
13
|
-
* 🔴 **三位的判据自本版起由 {@link approvalResolutionOf} 派生**(「一次决断最后怎么了」的单源判别联合):
|
|
14
|
-
* `settled` = 落定臂;`retracted` = 「零字节 · 撤卡」这一 cause;`detail` 的三支 = 那三个臂/cause 的
|
|
15
|
-
* 三个分支。本便签的**导出形与逐字输出不变** —— 变的只是判据不再在这里第二次手读旁挂布尔位
|
|
16
|
-
* (同一个问题两处各判一次 = 两份判据必然分叉)。
|
|
17
|
-
*/
|
|
18
1
|
import { approvalNotSentCause, approvalResolutionOf, isApprovalDecided, } from './approvalResolution.js';
|
|
19
2
|
export const APPROVAL_NOTE_RETRACTED_DETAIL = 'the card was retracted (this host no longer has a decision port for it)';
|
|
20
3
|
export const APPROVAL_NOTE_EDIT_REFUSED_DETAIL = 'edits are not accepted on this card';
|
|
21
4
|
function nonEmpty(v) {
|
|
22
5
|
return typeof v === 'string' && v.length > 0 ? v : undefined;
|
|
23
6
|
}
|
|
24
|
-
/** 结局的三支 detail(与 {@link ApprovalResolution} 的臂/cause 一一对应;拼出空串 = 没有可交的原文)。 */
|
|
25
7
|
function detailOf(r) {
|
|
26
8
|
const cause = approvalNotSentCause(r);
|
|
27
9
|
if (cause === 'retracted')
|
|
28
10
|
return APPROVAL_NOTE_RETRACTED_DETAIL;
|
|
29
11
|
if (cause === 'edit_refused')
|
|
30
12
|
return APPROVAL_NOTE_EDIT_REFUSED_DETAIL;
|
|
31
|
-
// 引擎那一头给的原文:机器码 + 拒句,各自非空才进,` · ` 拼(不复述决断词、不摘 ack)。
|
|
32
13
|
if (r.kind === 'unsettled') {
|
|
33
14
|
return [nonEmpty(r.errorCode), nonEmpty(r.detail)].filter((x) => x !== undefined).join(' · ');
|
|
34
15
|
}
|
|
35
16
|
return '';
|
|
36
17
|
}
|
|
37
|
-
/** 帧 + 结局 → 便签(纯函数;结局上的坏形按缺席读,不抛)。 */
|
|
38
18
|
export function approvalOutcomeNoteOf(frame, outcome) {
|
|
39
19
|
const r = approvalResolutionOf(outcome);
|
|
40
20
|
const retracted = approvalNotSentCause(r) === 'retracted';
|
|
@@ -1,148 +1,35 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* approvalResolution — 「**一次审批决断最后怎么了**」的单源判别联合({@link ApprovalResolution})
|
|
3
|
-
* 与它的唯一映射口({@link approvalResolutionOf})。
|
|
4
|
-
*
|
|
5
|
-
* ── 这一件修的是什么 ────────────────────────────────────────────────────────────────────────
|
|
6
|
-
* 同一个问题今天有**两种结局形**,而且第二种把三件互斥的事挤进同一个词:
|
|
7
|
-
* · durable-park 腿 {@link import('./toolApprovalWire.js').FsApprovalOutcome} —— 四个 `kind`
|
|
8
|
-
* + `failed.stage` 五词;
|
|
9
|
-
* · 流内帧腿 / 悬挂 ask(盲卡)腿 {@link import('./toolApprovalWire.js').ToolApprovalFrameOutcome}
|
|
10
|
-
* —— `decision` 四词,其中 `'unresolved'` 有 **3 种互斥含义**(宿主撤卡 / 编辑被拒 / respond 没落定),
|
|
11
|
-
* 要再读兄弟布尔位(`retracted` / `editRefused`)才分得开。
|
|
12
|
-
* ⇒ 本模块给出**一个**判别联合,两条腿的每一种结局各落恰一个臂 + 一个 cause 词,`'unresolved'`
|
|
13
|
-
* 的三义各落一臂。消费端从此一次判别拿到答案,不再靠读旁挂布尔位。
|
|
14
|
-
*
|
|
15
|
-
* ── 🔴 本版是 **additive**:既有型面一字未动 ───────────────────────────────────────────────
|
|
16
|
-
* `FsApprovalOutcome` / `ToolApprovalFrameOutcome` / `ApprovalCardDecision` 的键、值、语义
|
|
17
|
-
* **逐字节不变**;本模块只是**读**它们。端可以立刻改读本联合,也可以照旧读原结局对象。
|
|
18
|
-
*
|
|
19
|
-
* ── 三个臂各自答什么(边界写清,别处不许重铸)────────────────────────────────────────────────
|
|
20
|
-
* · `decided` —— 决断**送到了引擎并拿到语义答复**;
|
|
21
|
-
* · `not_sent` —— 包侧**一个字节都没发**(引擎那头的 ask 照旧挂着,`'no_pending'` 这一 cause 例外:
|
|
22
|
-
* 那一行本来就已经不在了);
|
|
23
|
-
* · `unsettled` —— **没落定**。🔴 它**刻意不承诺**「字节已经出站」:见
|
|
24
|
-
* {@link ApprovalUnsettledCause} 的 `'safety_stop'` / `'orchestration'` 两词的头注 ——
|
|
25
|
-
* 那两格在今天的结局对象上**分不出**决断有没有出站,而一个「保证发了」的承诺在这里是编的。
|
|
26
|
-
*/
|
|
27
1
|
import type { DecideReceiptView } from '../decideReceipt.js';
|
|
28
2
|
import type { HitlSafetyCode } from './hitlBridge.js';
|
|
29
3
|
import type { FsApprovalOutcome, ToolApprovalFrameOutcome, ToolApprovalRespondAckView, ToolApprovalRespondDecision } from './toolApprovalWire.js';
|
|
30
|
-
/**
|
|
31
|
-
* 「包侧一个字节都没发」的因由闭集(**唯一真源**;端零手抄)。
|
|
32
|
-
* · `'retracted'` —— 宿主撤掉了一张已经没有决断口的卡(两条腿都有这一形)。
|
|
33
|
-
* · `'edit_refused'` —— 入参不可得的卡(悬挂 ask)上收到「编辑后批准」:丢掉改写再批准、或把改写
|
|
34
|
-
* 转发出去,两条都不是人按下的那个决定 ⇒ 整次不发。
|
|
35
|
-
* · `'no_pending'` —— 取件那一拍队列里没有本 run 的可决行(结构化判别位,不是文案猜的)。
|
|
36
|
-
* · `'fetch_failed'` —— 取件这一步**自己**失败了(与上一词结构可分:那是「没有行」,这是「问不出来」)。
|
|
37
|
-
* · `'no_input'` —— 行上没有可呈现的工具入参,卡渲不出来。
|
|
38
|
-
* · `'card_unavailable'` —— 卡口那一段失败(没装卡口 / 卡口自报失败)。
|
|
39
|
-
*/
|
|
40
4
|
export declare const APPROVAL_NOT_SENT_CAUSES: readonly ["retracted", "edit_refused", "no_pending", "fetch_failed", "no_input", "card_unavailable"];
|
|
41
|
-
/** {@link APPROVAL_NOT_SENT_CAUSES} 的成员型。 */
|
|
42
5
|
export type ApprovalNotSentCause = (typeof APPROVAL_NOT_SENT_CAUSES)[number];
|
|
43
|
-
/**
|
|
44
|
-
* 「没落定」的因由闭集(**唯一真源**;端零手抄)。
|
|
45
|
-
* · `'engine_refused'` —— 决断发出去了,引擎**真的答复并拒了**(卡通常仍 pending、决定没被消费)。
|
|
46
|
-
* 🔴 **只在有肯定证据时才给这个词**:结局对象上带着引擎的 wire 机器码,或带着引擎在拒体上铸的指路键。
|
|
47
|
-
* 没有证据的 decide 失败落 `'decide_failed'` —— 见下一词。
|
|
48
|
-
* · `'decide_failed'` —— decide 这一段失败了,而结局对象上**没有任何「引擎答复过」的证据**:
|
|
49
|
-
* 调用方中止(人按了 Esc,出站前就抛)、抛出物身上根本没有码、老引擎的无码失败,三形同落这里。
|
|
50
|
-
* 🔴 **不许**据此说「引擎拒了」:那三形里有两形连字节都没出去。要不要重呈看别的位,不看这个词。
|
|
51
|
-
* · `'transport_exhausted'` —— 出站瞬断类失败重试后仍未送达:**两发都没拿到语义答复**。
|
|
52
|
-
* · `'safety_stop'` —— 本包的安全停闭集({@link HitlSafetyCode})命中 ⇒ 要重新呈现给人,**绝不自动重发**。
|
|
53
|
-
* 🔴 **这一格不承诺字节已出站**:`'binding_mismatch'` 既可能是本地绑定守卫在发送**前**拦下的,
|
|
54
|
-
* 也可能是引擎 409 答复重抛的 —— 今天的结局对象上这两个出处**不可分**,所以这里只说「没落定」。
|
|
55
|
-
* · `'respond_failed'` —— 流内帧腿的 respond 抛错:这次决断没落定,**引擎按 TTL / abort 自决**。
|
|
56
|
-
* · `'interrupted'` —— turn 被中断:包侧**发起**了一次工具级拒绝来结算挂着的 ask,但那一发是不观察结果的,
|
|
57
|
-
* 而且它自己也可能在出站前本地失败(绑定键缺失一类)。⇒ 既不能说落定,也**不能**说「一个字节都没发」。
|
|
58
|
-
* 🔴 它**不是** `not_sent`:`not_sent` 是「零字节」的承诺,这一格给不出那个承诺。
|
|
59
|
-
* · `'orchestration'` —— 重挂环在硬上限 / 连续零进展上收口:那不属于决断链的任何一段,
|
|
60
|
-
* 结局对象上**分不出**决断有没有出站。
|
|
61
|
-
* · `'unreadable'` —— 这个结局对象读不出来(不是对象 / 两个判别位都不成词 / 段词不认识)。
|
|
62
|
-
* 🔴 读不出**绝不猜 `decided`**,也不敢说「零字节」——两个方向猜错的代价都是替人说一句他没说的话。
|
|
63
|
-
*/
|
|
64
6
|
export declare const APPROVAL_UNSETTLED_CAUSES: readonly ["engine_refused", "decide_failed", "transport_exhausted", "safety_stop", "respond_failed", "interrupted", "orchestration", "unreadable"];
|
|
65
|
-
/** {@link APPROVAL_UNSETTLED_CAUSES} 的成员型。 */
|
|
66
7
|
export type ApprovalUnsettledCause = (typeof APPROVAL_UNSETTLED_CAUSES)[number];
|
|
67
|
-
/** 决断送到了引擎并拿到语义答复。 */
|
|
68
8
|
export interface ApprovalResolutionDecided {
|
|
69
9
|
kind: 'decided';
|
|
70
|
-
/**
|
|
71
|
-
* 落定的决断词,**原样透传**。
|
|
72
|
-
* 🔴 **不在这里复校闭集**:帧腿的词已经在它自己的发送段窄化过,边界上再校一遍等于装第二个判官
|
|
73
|
-
* (一个表外的词会被降成「读不出」,而它其实是引擎收下的那个决断)。
|
|
74
|
-
* 🔴 durable-park 腿只可能给 `'allow'` / `'deny'`:那一腿的结局对象上**没有**「remember 送成了」
|
|
75
|
-
* 这一位,所以这里**不铸** `'allow_session'`(铸一个就是替引擎说一句它没说的话)。
|
|
76
|
-
* 🔴 流内帧腿上 **fail-closed 的拒绝与人按的拒绝不可分**(卡口的 `aborted` / `failed` 与 `deny`
|
|
77
|
-
* 在发送段折成同一个词)—— 今天的真相如实说,本联合不发明新位。
|
|
78
|
-
*/
|
|
79
10
|
decision: ToolApprovalRespondDecision;
|
|
80
|
-
/** 待批 call 身份(durable-park 腿在场;帧腿没有这一位 —— 身份在帧的 `approvalId` 上,**不是**「没有身份」)。 */
|
|
81
11
|
gatedCallId?: string;
|
|
82
|
-
/** decide 的 200 回执读数(缺席 = 老 server / 终局形 / 回体读不动,三形同缺);🔴 它**不是**「门已解决」的证据。 */
|
|
83
12
|
receipt?: DecideReceiptView;
|
|
84
|
-
/** respond 的 200 ack(缺席 = **未知**:注入面回 void / 旧 server / 相关性门丢弃,绝不当成 false)。 */
|
|
85
13
|
ack?: ToolApprovalRespondAckView;
|
|
86
14
|
}
|
|
87
|
-
/** 包侧一个字节都没发。 */
|
|
88
15
|
export interface ApprovalResolutionNotSent {
|
|
89
16
|
kind: 'not_sent';
|
|
90
17
|
cause: ApprovalNotSentCause;
|
|
91
18
|
gatedCallId?: string;
|
|
92
|
-
/** 本包铸的诊断文案(原样;读不出 / 空串 ⇒ 键缺席,绝不编一句)。 */
|
|
93
19
|
detail?: string;
|
|
94
20
|
}
|
|
95
|
-
/** 没落定(见模块顶注:**不承诺**字节已出站)。 */
|
|
96
21
|
export interface ApprovalResolutionUnsettled {
|
|
97
22
|
kind: 'unsettled';
|
|
98
23
|
cause: ApprovalUnsettledCause;
|
|
99
24
|
gatedCallId?: string;
|
|
100
|
-
/** 本包的安全停判别位(`'safety_stop'` 这一 cause 上在场)。 */
|
|
101
25
|
safetyCode?: HitlSafetyCode;
|
|
102
|
-
/** 引擎的 wire 机器码(开集,原样;缺席**不带语义** —— 缺席 ≠「不是引擎拒的」)。 */
|
|
103
26
|
errorCode?: string;
|
|
104
|
-
/** 应答的 HTTP 状态(在场 = 引擎真应答了;缺席 = 传输层失败 / 注入面自抛,**不许**反推成 0)。 */
|
|
105
27
|
status?: number;
|
|
106
|
-
/** 可呈现的原文(帧腿 = 引擎的拒句原文;durable 腿 = 本包铸的诊断文案)。读不出 ⇒ 键缺席。 */
|
|
107
28
|
detail?: string;
|
|
108
29
|
}
|
|
109
|
-
/**
|
|
110
|
-
* 一次审批决断的**结局**(判别联合;三臂穷举,`'unresolved'` 的三义各落一臂)。
|
|
111
|
-
*
|
|
112
|
-
* 与旧读法的对照(消费端迁移判据一句话):
|
|
113
|
-
* · `out.decision !== 'unresolved'`(帧腿)⇒ `approvalResolutionOf(out).kind === 'decided'`;
|
|
114
|
-
* · `out.retracted === true` ⇒ `approvalNotSentCause(r) === 'retracted'`;
|
|
115
|
-
* · `out.editRefused === true` ⇒ `approvalNotSentCause(r) === 'edit_refused'`;
|
|
116
|
-
* · 裸 `'unresolved'` ⇒ `approvalUnsettledCause(r) === 'respond_failed'`。
|
|
117
|
-
*
|
|
118
|
-
* 🔴 **不并表的位**:指路键(`currentPending`)、ack 的逐位解释、receipt 的逐位语义照旧读原结局
|
|
119
|
-
* 对象 —— 本联合只答「怎么了」这一个问题。
|
|
120
|
-
*/
|
|
121
30
|
export type ApprovalResolution = ApprovalResolutionDecided | ApprovalResolutionNotSent | ApprovalResolutionUnsettled;
|
|
122
|
-
/**
|
|
123
|
-
* {@link approvalResolutionOf} 认的入参:两条腿今天的结局对象。
|
|
124
|
-
* 🔴 ask / plan-review 腿的 `GateOutcome` **刻意不在**这个联合里(它多一个 `answered` 位与一张
|
|
125
|
-
* 另外的失败码闭集),plan-review 的决断生效读数也不在(它自己是另一张六词表)。
|
|
126
|
-
* ⚠️ **这是分工边界,不是一道编译期围栏**,如实说:只有 `failed` 那一臂因为失败码闭集不同而赋不进来;
|
|
127
|
-
* `decided` / `aborted` 两臂在结构上仍然兼容,硬喂进来会被按本腿的口径读(`answered` 被忽略、
|
|
128
|
-
* 别的码表词读不出判别位)。把别的腿的结局喂进本口是调用方的错,本函数不替它兜。
|
|
129
|
-
*/
|
|
130
31
|
export type ApprovalLegOutcome = FsApprovalOutcome | ToolApprovalFrameOutcome;
|
|
131
|
-
/**
|
|
132
|
-
* 今天各腿的结局对象 → {@link ApprovalResolution}。**纯函数,永不抛,永不造**。
|
|
133
|
-
*
|
|
134
|
-
* 判别序(固定,不随键序变):
|
|
135
|
-
* ① `kind` 是 durable-park 腿的闭四词 ⇒ 按那一腿读;
|
|
136
|
-
* ② 否则决断词是串 ⇒ 按流内帧腿 / 盲卡腿读;
|
|
137
|
-
* ③ 都不成立 ⇒ `unsettled{cause:'unreadable'}`(🔴 不猜 `decided`,也不说「零字节」)。
|
|
138
|
-
*
|
|
139
|
-
* 🔴 **旁挂位在场压过决断词**(帧腿):撤卡 / 编辑被拒这两形是「一个字节都没发」,而它们今天与
|
|
140
|
-
* `decision` 同在一只对象上;先读决断词就会把一张没发出去的卡说成「批过了」。
|
|
141
|
-
*/
|
|
142
32
|
export declare function approvalResolutionOf(outcome: ApprovalLegOutcome): ApprovalResolution;
|
|
143
|
-
/** 这次决断**落定了吗**(唯一判据;`true` ⇒ 决断送到并拿到语义答复)。坏形入参 ⇒ `false`。 */
|
|
144
33
|
export declare function isApprovalDecided(r: ApprovalResolution): r is ApprovalResolutionDecided;
|
|
145
|
-
/** 「一个字节都没发」的因由;不是那一臂 ⇒ `undefined`(**不是**「发了」的证据,只是「不是这一臂」)。 */
|
|
146
34
|
export declare function approvalNotSentCause(r: ApprovalResolution): ApprovalNotSentCause | undefined;
|
|
147
|
-
/** 「没落定」的因由;不是那一臂 ⇒ `undefined`。 */
|
|
148
35
|
export declare function approvalUnsettledCause(r: ApprovalResolution): ApprovalUnsettledCause | undefined;
|
|
@@ -1,13 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 「包侧一个字节都没发」的因由闭集(**唯一真源**;端零手抄)。
|
|
3
|
-
* · `'retracted'` —— 宿主撤掉了一张已经没有决断口的卡(两条腿都有这一形)。
|
|
4
|
-
* · `'edit_refused'` —— 入参不可得的卡(悬挂 ask)上收到「编辑后批准」:丢掉改写再批准、或把改写
|
|
5
|
-
* 转发出去,两条都不是人按下的那个决定 ⇒ 整次不发。
|
|
6
|
-
* · `'no_pending'` —— 取件那一拍队列里没有本 run 的可决行(结构化判别位,不是文案猜的)。
|
|
7
|
-
* · `'fetch_failed'` —— 取件这一步**自己**失败了(与上一词结构可分:那是「没有行」,这是「问不出来」)。
|
|
8
|
-
* · `'no_input'` —— 行上没有可呈现的工具入参,卡渲不出来。
|
|
9
|
-
* · `'card_unavailable'` —— 卡口那一段失败(没装卡口 / 卡口自报失败)。
|
|
10
|
-
*/
|
|
11
1
|
export const APPROVAL_NOT_SENT_CAUSES = Object.freeze([
|
|
12
2
|
'retracted',
|
|
13
3
|
'edit_refused',
|
|
@@ -16,27 +6,6 @@ export const APPROVAL_NOT_SENT_CAUSES = Object.freeze([
|
|
|
16
6
|
'no_input',
|
|
17
7
|
'card_unavailable',
|
|
18
8
|
]);
|
|
19
|
-
/**
|
|
20
|
-
* 「没落定」的因由闭集(**唯一真源**;端零手抄)。
|
|
21
|
-
* · `'engine_refused'` —— 决断发出去了,引擎**真的答复并拒了**(卡通常仍 pending、决定没被消费)。
|
|
22
|
-
* 🔴 **只在有肯定证据时才给这个词**:结局对象上带着引擎的 wire 机器码,或带着引擎在拒体上铸的指路键。
|
|
23
|
-
* 没有证据的 decide 失败落 `'decide_failed'` —— 见下一词。
|
|
24
|
-
* · `'decide_failed'` —— decide 这一段失败了,而结局对象上**没有任何「引擎答复过」的证据**:
|
|
25
|
-
* 调用方中止(人按了 Esc,出站前就抛)、抛出物身上根本没有码、老引擎的无码失败,三形同落这里。
|
|
26
|
-
* 🔴 **不许**据此说「引擎拒了」:那三形里有两形连字节都没出去。要不要重呈看别的位,不看这个词。
|
|
27
|
-
* · `'transport_exhausted'` —— 出站瞬断类失败重试后仍未送达:**两发都没拿到语义答复**。
|
|
28
|
-
* · `'safety_stop'` —— 本包的安全停闭集({@link HitlSafetyCode})命中 ⇒ 要重新呈现给人,**绝不自动重发**。
|
|
29
|
-
* 🔴 **这一格不承诺字节已出站**:`'binding_mismatch'` 既可能是本地绑定守卫在发送**前**拦下的,
|
|
30
|
-
* 也可能是引擎 409 答复重抛的 —— 今天的结局对象上这两个出处**不可分**,所以这里只说「没落定」。
|
|
31
|
-
* · `'respond_failed'` —— 流内帧腿的 respond 抛错:这次决断没落定,**引擎按 TTL / abort 自决**。
|
|
32
|
-
* · `'interrupted'` —— turn 被中断:包侧**发起**了一次工具级拒绝来结算挂着的 ask,但那一发是不观察结果的,
|
|
33
|
-
* 而且它自己也可能在出站前本地失败(绑定键缺失一类)。⇒ 既不能说落定,也**不能**说「一个字节都没发」。
|
|
34
|
-
* 🔴 它**不是** `not_sent`:`not_sent` 是「零字节」的承诺,这一格给不出那个承诺。
|
|
35
|
-
* · `'orchestration'` —— 重挂环在硬上限 / 连续零进展上收口:那不属于决断链的任何一段,
|
|
36
|
-
* 结局对象上**分不出**决断有没有出站。
|
|
37
|
-
* · `'unreadable'` —— 这个结局对象读不出来(不是对象 / 两个判别位都不成词 / 段词不认识)。
|
|
38
|
-
* 🔴 读不出**绝不猜 `decided`**,也不敢说「零字节」——两个方向猜错的代价都是替人说一句他没说的话。
|
|
39
|
-
*/
|
|
40
9
|
export const APPROVAL_UNSETTLED_CAUSES = Object.freeze([
|
|
41
10
|
'engine_refused',
|
|
42
11
|
'decide_failed',
|
|
@@ -47,17 +16,13 @@ export const APPROVAL_UNSETTLED_CAUSES = Object.freeze([
|
|
|
47
16
|
'orchestration',
|
|
48
17
|
'unreadable',
|
|
49
18
|
]);
|
|
50
|
-
/** durable-park 腿的 `kind` 闭四词(判别序的第一把;不是这四个词才去看决断词)。 */
|
|
51
19
|
const FS_OUTCOME_KINDS = Object.freeze(['decided', 'aborted', 'retracted', 'failed']);
|
|
52
|
-
/** 非空串窄读(与本包其余读面同一条:空串 = 没这一格)。 */
|
|
53
20
|
function str(v) {
|
|
54
21
|
return typeof v === 'string' && v.length > 0 ? v : undefined;
|
|
55
22
|
}
|
|
56
|
-
/** 有限数窄读(在场 = 真答了;非有限数一律当缺席,**不许**反推成 0)。 */
|
|
57
23
|
function num(v) {
|
|
58
24
|
return typeof v === 'number' && Number.isFinite(v) ? v : undefined;
|
|
59
25
|
}
|
|
60
|
-
/** 一只可能来自宿主 / 注入面的记录:读属性本身就可能抛(getter 钩子),逐位各自兜住。 */
|
|
61
26
|
function pick(o, key) {
|
|
62
27
|
try {
|
|
63
28
|
return o?.[key];
|
|
@@ -66,21 +31,9 @@ function pick(o, key) {
|
|
|
66
31
|
return undefined;
|
|
67
32
|
}
|
|
68
33
|
}
|
|
69
|
-
/** `{...(x !== undefined ? {k:x} : {})}` 的一处写法收口:缺席**不落键**(不折成空串 / 0 / false)。 */
|
|
70
34
|
function opt(key, v) {
|
|
71
35
|
return v === undefined ? {} : { [key]: v };
|
|
72
36
|
}
|
|
73
|
-
/**
|
|
74
|
-
* 今天各腿的结局对象 → {@link ApprovalResolution}。**纯函数,永不抛,永不造**。
|
|
75
|
-
*
|
|
76
|
-
* 判别序(固定,不随键序变):
|
|
77
|
-
* ① `kind` 是 durable-park 腿的闭四词 ⇒ 按那一腿读;
|
|
78
|
-
* ② 否则决断词是串 ⇒ 按流内帧腿 / 盲卡腿读;
|
|
79
|
-
* ③ 都不成立 ⇒ `unsettled{cause:'unreadable'}`(🔴 不猜 `decided`,也不说「零字节」)。
|
|
80
|
-
*
|
|
81
|
-
* 🔴 **旁挂位在场压过决断词**(帧腿):撤卡 / 编辑被拒这两形是「一个字节都没发」,而它们今天与
|
|
82
|
-
* `decision` 同在一只对象上;先读决断词就会把一张没发出去的卡说成「批过了」。
|
|
83
|
-
*/
|
|
84
37
|
export function approvalResolutionOf(outcome) {
|
|
85
38
|
if (typeof outcome !== 'object' || outcome === null || Array.isArray(outcome)) {
|
|
86
39
|
return { kind: 'unsettled', cause: 'unreadable' };
|
|
@@ -94,12 +47,10 @@ export function approvalResolutionOf(outcome) {
|
|
|
94
47
|
}
|
|
95
48
|
return { kind: 'unsettled', cause: 'unreadable' };
|
|
96
49
|
}
|
|
97
|
-
/** durable-park 腿(`surfaceFsApprovalAndDecide`)的十二形。 */
|
|
98
50
|
function fsLegResolution(outcome, kind) {
|
|
99
51
|
const gatedCallId = str(pick(outcome, 'gatedCallId'));
|
|
100
52
|
const call = opt('gatedCallId', gatedCallId);
|
|
101
53
|
if (kind === 'decided') {
|
|
102
|
-
// `denied` 在场即真(缺席 = 放行);`'allow_session'` 在这一腿上无位可读 ⇒ 不铸(见 decision 位顶注)。
|
|
103
54
|
return {
|
|
104
55
|
kind: 'decided',
|
|
105
56
|
decision: pick(outcome, 'denied') === true ? 'deny' : 'allow',
|
|
@@ -109,15 +60,11 @@ function fsLegResolution(outcome, kind) {
|
|
|
109
60
|
}
|
|
110
61
|
if (kind === 'retracted')
|
|
111
62
|
return { kind: 'not_sent', cause: 'retracted', ...call };
|
|
112
|
-
// 🔴 中断臂**发起**一次工具级拒绝(不观察结果,也不保证真出了站)⇒ 给不出 `not_sent` 的零字节承诺。
|
|
113
63
|
if (kind === 'aborted')
|
|
114
64
|
return { kind: 'unsettled', cause: 'interrupted', ...call };
|
|
115
|
-
// 剩下的是 `failed`:**停在链条哪一段**决定了「有没有发出去」——
|
|
116
|
-
// 取件 / 入参 / 卡口三段一个字节都没送出,只有 decide 那一段代表决断已经离开本包。
|
|
117
65
|
const detail = opt('detail', str(pick(outcome, 'reason')));
|
|
118
66
|
const stage = pick(outcome, 'stage');
|
|
119
67
|
if (stage === 'fetch') {
|
|
120
|
-
// 取件腿的结构化判别位:「这一拍没有可决行」与「问不出来」结构可分(不靠文案子串猜)。
|
|
121
68
|
const cause = pick(outcome, 'code') === 'no_pending' ? 'no_pending' : 'fetch_failed';
|
|
122
69
|
return { kind: 'not_sent', cause, ...call, ...detail };
|
|
123
70
|
}
|
|
@@ -128,13 +75,7 @@ function fsLegResolution(outcome, kind) {
|
|
|
128
75
|
if (stage === 'decide') {
|
|
129
76
|
const safetyCode = str(pick(outcome, 'safetyCode'));
|
|
130
77
|
const errorCode = str(pick(outcome, 'errorCode'));
|
|
131
|
-
// 🔴 **「引擎答复过」必须有肯定证据**:wire 机器码在场,或引擎在拒体上铸的指路键在场。
|
|
132
|
-
// 没有证据的 decide 失败(调用方中止 ⇒ 出站前原错上抛 / 抛出物身上没有码 / 老引擎无码失败)
|
|
133
|
-
// 一律落 `'decide_failed'` —— 把它们说成「引擎拒了」是替引擎编了一句它没说过的话,
|
|
134
|
-
// 而消费端会照这句话去渲拒绝原因、去决定还要不要重呈。
|
|
135
78
|
const engineAnswered = errorCode !== undefined || pick(outcome, 'currentPending') !== undefined;
|
|
136
|
-
// 优先序固定:安全停 > 瞬断耗尽 > 引擎语义拒绝 > 无证据的 decide 失败。前两者在实装里互斥
|
|
137
|
-
// (两个抛出物类型),写死优先序是为了「同场也只有一个答案」,不让键序决定结局。
|
|
138
79
|
const cause = safetyCode !== undefined
|
|
139
80
|
? 'safety_stop'
|
|
140
81
|
: pick(outcome, 'retryExhausted') === true
|
|
@@ -153,13 +94,9 @@ function fsLegResolution(outcome, kind) {
|
|
|
153
94
|
}
|
|
154
95
|
if (stage === 'orchestration')
|
|
155
96
|
return { kind: 'unsettled', cause: 'orchestration', ...call, ...detail };
|
|
156
|
-
// 段词读不出 ⇒ 分不出停在哪:**不许**说「零字节」(那是 not_sent 的承诺),只说没落定。
|
|
157
97
|
return { kind: 'unsettled', cause: 'unreadable', ...call, ...detail };
|
|
158
98
|
}
|
|
159
|
-
/** 流内帧腿 / 悬挂 ask(盲卡)腿(`surfaceToolApprovalFrameAndRespond`)的四形。 */
|
|
160
99
|
function frameLegResolution(outcome) {
|
|
161
|
-
// 🔴 两个旁挂位先判(见 approvalResolutionOf 顶注):它们说的是「一个字节都没发」。
|
|
162
|
-
// 两位同在 ⇒ 撤卡胜 —— 与结局便签的 detail 优先序同一条,不是另铸一份。
|
|
163
100
|
if (pick(outcome, 'retracted') === true)
|
|
164
101
|
return { kind: 'not_sent', cause: 'retracted' };
|
|
165
102
|
if (pick(outcome, 'editRefused') === true)
|
|
@@ -181,17 +118,14 @@ function frameLegResolution(outcome) {
|
|
|
181
118
|
...(typeof ack === 'object' && ack !== null ? { ack: ack } : {}),
|
|
182
119
|
};
|
|
183
120
|
}
|
|
184
|
-
/** 这次决断**落定了吗**(唯一判据;`true` ⇒ 决断送到并拿到语义答复)。坏形入参 ⇒ `false`。 */
|
|
185
121
|
export function isApprovalDecided(r) {
|
|
186
122
|
return typeof r === 'object' && r !== null && r.kind === 'decided';
|
|
187
123
|
}
|
|
188
|
-
/** 「一个字节都没发」的因由;不是那一臂 ⇒ `undefined`(**不是**「发了」的证据,只是「不是这一臂」)。 */
|
|
189
124
|
export function approvalNotSentCause(r) {
|
|
190
125
|
if (typeof r !== 'object' || r === null || r.kind !== 'not_sent')
|
|
191
126
|
return undefined;
|
|
192
127
|
return r.cause;
|
|
193
128
|
}
|
|
194
|
-
/** 「没落定」的因由;不是那一臂 ⇒ `undefined`。 */
|
|
195
129
|
export function approvalUnsettledCause(r) {
|
|
196
130
|
if (typeof r !== 'object' || r === null || r.kind !== 'unsettled')
|
|
197
131
|
return undefined;
|