@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
package/dist/seam.d.ts
CHANGED
|
@@ -1,129 +1,36 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* client-core seam types — [1651] 设计稿 v1.1 已对签形([1652] core 签/[1653] 钉版)。
|
|
3
|
-
*
|
|
4
|
-
* 平面判据(成文,[1652]):「重启后还该看得见的进 transcript,纯瞬态进 chrome。」
|
|
5
|
-
* transcript id 纪律([1653] v1 定案,后改=BREAKING):优先从 wire 稳定键确定性派生
|
|
6
|
-
* (StampedAgentEvent.id/seq/toolCallId),ctx.uuid() 仅兜底无稳定键合成帧;
|
|
7
|
-
* 往返守卫不变量:同流重放 ⇒ 同 id 序列。
|
|
8
|
-
*/
|
|
9
1
|
import type { ModelUsage, SDKMessage } from '@sema-agent/agent-types';
|
|
10
2
|
import type { EngineTurnUsage } from './adapter/downstream/turnUsageToModelUsage.js';
|
|
11
3
|
import type { RunCostReconcile } from './adapter/downstream/terminalToSdkResult.js';
|
|
12
4
|
import type { WiringManifestAutoMode, WiringManifestModelGate, WiringManifestMcpEntryView, WiringManifestHookEntryView, WiringManifestLspSeamView, WiringManifestWriteProtectionView, WiringManifestAutoConsolidationView, WiringManifestReadDenyView, ContextUsageSectionView, PromptManifestSectionView, PromptManifestBlockView, PromptManifestToolView } from './adapter/downstream/eventToSdkMessage.js';
|
|
13
5
|
import type { ToolRosterView, ToolRosterDeltaView } from './toolRoster.js';
|
|
14
|
-
/**
|
|
15
|
-
* `AbortSignal` 的结构型(B3 扩容,SEAM-GAP-4)。
|
|
16
|
-
*
|
|
17
|
-
* 🔴 **别写成 `AbortSignal`**:本包 tsconfig 是 `"types": []` + 无 DOM lib(浏览器可移植性的
|
|
18
|
-
* 静态保障),`AbortSignal` 这个名字在本包里根本不存在。真 `AbortSignal`(浏览器原生 / Node
|
|
19
|
-
* globalThis)结构上满足本型,直接传即可,零适配。
|
|
20
|
-
*/
|
|
21
6
|
export interface AbortSignalLike {
|
|
22
7
|
readonly aborted: boolean;
|
|
23
8
|
}
|
|
24
|
-
/** 宿主定时器句柄(不透明:Node 是 Timeout 对象、浏览器是 number,库侧只负责回传)。 */
|
|
25
9
|
export type TimerHandle = unknown;
|
|
26
|
-
/** `ctx.log` 的级别词表(cli utils/debug logForDebugging 的等价面)。 */
|
|
27
10
|
export type AdapterLogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
28
|
-
/**
|
|
29
|
-
* TYPESHAPE-13:inline task tick 的形状——本文件(seam.ts,ChromeEvent 的 `inline_task_stats`/
|
|
30
|
-
* `op:'tick'` 臂内嵌套 `stats` 字段)与 `engineInlineTaskStats.ts`(`publishEngineInlineTaskTick`
|
|
31
|
-
* 的 `tick` 形参)两处逐字相同的形状,抽成具名类型两处共用——漏改一处(比如只给这里加
|
|
32
|
-
* `currentToolName?`)时,两侧编译仍全绿但字段会被静默丢弃,B4 命名 DU 豁免只护直接成员形状,
|
|
33
|
-
* 不护这种嵌套字段。
|
|
34
|
-
*
|
|
35
|
-
* 🔴 [P1 回炉,opus advisory⑤] 定义搬到这里(此前在 `engineInlineTaskStats.ts` 反向 import 进
|
|
36
|
-
* seam.ts):seam.ts 是本包基础词表模块,`engineInlineTaskStats.ts` 改前是零 import 文件——原先
|
|
37
|
-
* 由「零 import 的边缘文件」定义、被「基础词表模块」反向导入,层级是倒的。现在改为
|
|
38
|
-
* `engineInlineTaskStats.ts` 从这里 `import type`,方向回正;`index.ts` 的 barrel 不重复导出
|
|
39
|
-
* (只有这里 `export`,避免两处 `export *` 撞同名)。
|
|
40
|
-
*/
|
|
41
11
|
export interface InlineTaskTick {
|
|
42
12
|
toolUses: number;
|
|
43
13
|
totalTokens: number;
|
|
44
14
|
durationMs: number;
|
|
45
15
|
currentAction?: string;
|
|
46
16
|
}
|
|
47
|
-
/**
|
|
48
|
-
* 宿主注入的适配上下文(时钟/铸号可测,B 形跨端确定性)。
|
|
49
|
-
*
|
|
50
|
-
* **B3 扩容(0.5.0,契约 minor —— 只加可选位,既有宿主零改动)**:下面五个可选口是
|
|
51
|
-
* 「客户端内核需要、但实现方式因端而异」的能力(设计稿 §5.4①)。浏览器实现全部原生零 polyfill:
|
|
52
|
-
* `log`→console/上报、`probe`→省略、`signal`→AbortController.signal、
|
|
53
|
-
* `setTimer/clearTimer`→setTimeout/clearTimeout。
|
|
54
|
-
*
|
|
55
|
-
* 🔴 **缺席语义都是「该能力不启用」,不是「报错」也不是「换个方式偷偷做」**:
|
|
56
|
-
* 内核绝不 `require('fs')` 写探针、绝不 `console.log`、绝不 `setTimeout` 兜底 ——
|
|
57
|
-
* 那正是这批要切掉的东西(§5.2 的 33 个 `utils/debug` 消费点)。
|
|
58
|
-
*/
|
|
59
17
|
export interface AdapterContext {
|
|
60
18
|
sessionId: string;
|
|
61
|
-
/** 兜底铸号——仅当帧无稳定键时使用(见 deriveTranscriptId)。 */
|
|
62
19
|
uuid(): string;
|
|
63
20
|
now(): number;
|
|
64
|
-
/**
|
|
65
|
-
* L-215③(0.65.0)—— **这条流跑在哪个模型上**,由宿主开流时钉(同 `sessionId` 一类:请求是宿主
|
|
66
|
-
* 构造的,模型 id 是它自己写进 `TaskRequest` 的那一个)。
|
|
67
|
-
*
|
|
68
|
-
* 用途:本层铸出的 assistant 转录消息的 `message.model`。**取值序 = 帧优先、ctx 兜底** ——
|
|
69
|
-
* 上游投影器(`eventToSdkMessage` 的 `assistantArm`)已经在 durable 内容帧上铸过这一位,本层
|
|
70
|
-
* 原样接住;只有 **live 分段腿**(`stream_event` 锚)帧上没有它,才回落到这一格。
|
|
71
|
-
* 🔴 **缺席 ⇒ 那一位不铸,绝不猜**(同 {@link import('./adapter/types.js').EmitContext.model})。
|
|
72
|
-
* ⚠️ 它是「这条流**声明**的模型」,不是「这一轮真正服务的模型」:mid-run degrade / 网关重路由
|
|
73
|
-
* 不改写它(与 `TaskResult.model` 同一条纪律)。
|
|
74
|
-
*/
|
|
75
21
|
model?: string;
|
|
76
|
-
/**
|
|
77
|
-
* 诊断日志(替 cli `utils/debug.logForDebugging` —— 那一行 import 就把 1565 个文件拉进闭包,
|
|
78
|
-
* 是浏览器可移植性的头号污染源,设计稿 §2.1.3)。缺席 = 内核静默(绝不回落 console)。
|
|
79
|
-
*/
|
|
80
22
|
log?(level: AdapterLogLevel, msg: string, data?: unknown): void;
|
|
81
|
-
/**
|
|
82
|
-
* 行式探针(替 cli 的 6 处 `SEMA_*_PROBE` 文件探针 —— Ink 挂载后 console 被吞,壳侧靠写文件
|
|
83
|
-
* 取证)。`channel` = 探针名(如 `'stream'`),`line` = 单行载荷。浏览器宿主直接省略。
|
|
84
|
-
*/
|
|
85
23
|
probe?(channel: string, line: string): void;
|
|
86
|
-
/**
|
|
87
|
-
* turn 级中断信号(SEAM-GAP-4)。Esc/abort 后内核立刻停止投影,**不产终答**
|
|
88
|
-
* (CC 自己的 abort 路径渲 InterruptedByUser chrome,由宿主负责)。
|
|
89
|
-
* 缺席 = 该 turn 不可中断(既有行为)。
|
|
90
|
-
*/
|
|
91
24
|
signal?: AbortSignalLike;
|
|
92
|
-
/**
|
|
93
|
-
* 宿主定时器(T40 IDLE-FLUSH 竞速需要)。`fn` 到点执行一次。
|
|
94
|
-
* 🔴 **缺席 = IDLE-FLUSH 过渡修不启用**(纯等下一帧,与 0.4.0 逐字同行为)——绝不用
|
|
95
|
-
* `setTimeout` 兜底:那会在没有宏任务概念的宿主上凭空造出一个时钟。
|
|
96
|
-
*/
|
|
97
25
|
setTimer?(ms: number, fn: () => void): TimerHandle;
|
|
98
26
|
clearTimer?(handle: TimerHandle): void;
|
|
99
|
-
/**
|
|
100
|
-
* 活体增量攒批节拍(T29)。缺席 = `FLUSH_INTERVAL_MS` 默认值。
|
|
101
|
-
* 🔴 这是**宿主渲染策略**,不是 wire 语义:CC 自己两个端就是两个值(桌面宿主
|
|
102
|
-
* `makeStreamDeltaCoalescer`=16ms 单帧攒批;我们对标的 CC 2.1.207 CLI 口径=100ms,
|
|
103
|
-
* 降重绘频率让长回答滚动更稳)。合并**语义**(先思考后文本、段边界重开块)与节拍无关,
|
|
104
|
-
* 所以节拍下放给宿主、语义留库里。
|
|
105
|
-
*/
|
|
106
27
|
coalesceIntervalMs?: number;
|
|
107
28
|
}
|
|
108
|
-
/** chrome 平面事件 v1 枚举(cli 现役 UI 面归纳;additive 演进,臂只增不改)。
|
|
109
|
-
*
|
|
110
|
-
* v1.1 增臂(#52a adapt() 首批落码,2026-07-25):下方 8 臂随 adapt() 管线一起加入——
|
|
111
|
-
* 它们全是 cli sdkMessagesToCcEvents 里「壳态耦合」的副作用面(store 写 / hook fire /
|
|
112
|
-
* 队列操作 / 瞬态 render 事件),按 [1652] 判据(纯瞬态进 chrome)投影成事件让宿主消费。
|
|
113
|
-
* 每臂的「宿主消费义务」写在臂上方注释里——不实现该义务 = 该 UI 面在宿主上是哑的。 */
|
|
114
29
|
export type ChromeEvent = {
|
|
115
30
|
kind: 'retry_status';
|
|
116
31
|
laneProof: LaneProof;
|
|
117
32
|
status: unknown;
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* footer 面板行事件(载荷 = 本包 `EngineAgentPanelEvent`,B1 已搬入)。
|
|
121
|
-
* 宿主消费义务:原样 `publishEngineAgentPanelEvent(event)`。
|
|
122
|
-
* 🔴 **session 常驻台账(`markEnginePanelTaskResident`/`clearEnginePanelTaskResident`)不在宿主义务里**
|
|
123
|
-
* —— B4 起由适配器**整臂自持**(读者 `isEnginePanelTaskResident` 也在本包,写读同包 = R4 纪律)。
|
|
124
|
-
* 宿主再写一遍不会更对,只会两臂打架。
|
|
125
|
-
*/
|
|
126
|
-
| {
|
|
33
|
+
} | {
|
|
127
34
|
kind: 'panel_task';
|
|
128
35
|
laneProof: LaneProof;
|
|
129
36
|
event: unknown;
|
|
@@ -133,22 +40,7 @@ export type ChromeEvent = {
|
|
|
133
40
|
taskId: string;
|
|
134
41
|
status: string;
|
|
135
42
|
outputPath?: string;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* B5 新臂(#117a,E 层 Bash/Monitor 分臂的**执行半场**)—— 模型发起的后台回执被认出来了。
|
|
139
|
-
* 判定在库(`detectEngineBgShellReceipt`,纯文案锚定,**按工具名正向枚举分臂**:
|
|
140
|
-
* `Bash` 臂 = 三形回执首句 + `run_in_background === true` 门;`Monitor` 臂(#158)= 第四形
|
|
141
|
-
* 回执首句 `Monitoring in background; task_id=…`,**没有** `run_in_background` 门
|
|
142
|
-
* (Monitor 天然后台,参数里根本没这个键);其它工具名一律不铸行);执行留宿主:
|
|
143
|
-
* 宿主消费义务 = ① 把 registration 发给自己的后台 shell 面板 store(壳 =
|
|
144
|
-
* `publishEngineBgShellPanelEvent`)② 登记「句柄 → 宿主 run」映射(壳 = `recordBgParentRun(
|
|
145
|
-
* taskId, getActiveEngineTaskId())`,[1501] A/B 寻址的硬证据)。
|
|
146
|
-
* 🔴 载荷 = 本包 `EngineBgShellRegistration`,**0.18.0 起带必填 `source: 'bash' | 'monitor'`**
|
|
147
|
-
* 行家族判别位(闭集)—— 消费端要分流行形/行文案就读它,别按 command 文本猜;把 monitor 行
|
|
148
|
-
* 一律贴成 bash 行是产者/消费者字段谎报(名义口径不符)。
|
|
149
|
-
* 缺席 = ctrl+B 面板看不到这条后台命令/监视(不是报错,是这一面在该宿主上哑掉)。
|
|
150
|
-
*/
|
|
151
|
-
| {
|
|
43
|
+
} | {
|
|
152
44
|
kind: 'bgshell_register';
|
|
153
45
|
laneProof: LaneProof;
|
|
154
46
|
taskId: string;
|
|
@@ -157,130 +49,44 @@ export type ChromeEvent = {
|
|
|
157
49
|
kind: 'thinking_activity';
|
|
158
50
|
laneProof: LaneProof;
|
|
159
51
|
active: boolean;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* 一个 turn 开场(cli `yield {type:'stream_request_start'}` 的等价面)。
|
|
163
|
-
* 宿主消费义务:把 spinner 置 'requesting' 态(CC query.ts:337 同形);不落转录。
|
|
164
|
-
*/
|
|
165
|
-
| {
|
|
52
|
+
} | {
|
|
166
53
|
kind: 'request_start';
|
|
167
54
|
laneProof: LaneProof;
|
|
168
|
-
}
|
|
169
|
-
/**
|
|
170
|
-
* 合并后的活体增量(cli COALESCER 的 content_block_start/delta 语义面)。`opening`=该
|
|
171
|
-
* channel 本段首帧(宿主应先发 content_block_start 再发 delta);`estimatedTokens`=CJK 加权
|
|
172
|
-
* token 估算(cli estimateCjkTokens 同权重),给 spinner 计数用。
|
|
173
|
-
* 宿主消费义务:① 渲活体预览(streamingText/streamingThinking)② 推进 responseLength/
|
|
174
|
-
* spinner 模式 ③ 绝不落转录——committed 形随后由 transcript 平面的 assistant 消息给出。
|
|
175
|
-
*/
|
|
176
|
-
| {
|
|
55
|
+
} | {
|
|
177
56
|
kind: 'stream_delta';
|
|
178
57
|
laneProof: LaneProof;
|
|
179
58
|
channel: 'text' | 'thinking';
|
|
180
59
|
text: string;
|
|
181
60
|
estimatedTokens: number;
|
|
182
61
|
opening: boolean;
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* 187 C1a 计量喂料(cli messageStartEvt / messageDeltaEndEvt 的语义面)。
|
|
186
|
-
* phase='start' 携 ttftMs(首 token 时延),phase='end' 携该 model round 的 outputTokens。
|
|
187
|
-
* 宿主消费义务:驱动自己的 responseLength reducer(start=压基线,end=按真 output_tokens 对账);
|
|
188
|
-
* 不落转录。
|
|
189
|
-
*/
|
|
190
|
-
| {
|
|
62
|
+
} | {
|
|
191
63
|
kind: 'response_metrics';
|
|
192
64
|
laneProof: LaneProof;
|
|
193
65
|
phase: 'start' | 'end';
|
|
194
66
|
ttftMs?: number;
|
|
195
67
|
outputTokens?: number;
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* 非持久 attachment 行(cli 的 diagnostics / steering_injected / workspace_changed /
|
|
199
|
-
* compact_file_reference 四类 attachment render 事件)。按 [1652] 判据归 chrome:
|
|
200
|
-
* attachment 不进壳 jsonl,重启后本就该消失。
|
|
201
|
-
* 宿主消费义务:渲成自己的 attachment 行(CC 宿主=AttachmentMessage,按 attachment.type 分臂,
|
|
202
|
-
* 必须带 default 臂——core 可加新 source);`id` 为确定性行键(列表 key 用);不落转录。
|
|
203
|
-
*/
|
|
204
|
-
| {
|
|
68
|
+
} | {
|
|
205
69
|
kind: 'attachment';
|
|
206
70
|
laneProof: LaneProof;
|
|
207
71
|
id: string;
|
|
208
72
|
attachment: unknown;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* 一条终态 task_notification 抵达(引擎已 server-side steer-inject 过,壳侧只做记账)。
|
|
212
|
-
* 宿主消费义务(cli 现役三件里 **B4 起只剩零件**——见下,本臂现在纯属「告知」):
|
|
213
|
-
* ① ~~drop 壳队列里同 run 的 Path B 条目~~ → B2 起 `dropQueuedNotificationsForRun` 已在本包,
|
|
214
|
-
* B4 起由适配器自己调(宿主只需在启动时 `installNotificationQueuePort`);
|
|
215
|
-
* ② ~~清 resident 台账~~ → B4 起由适配器自己调(`clearEnginePanelTaskResident` 在本包)。
|
|
216
|
-
* ⇒ 宿主对本臂的义务 = **可选的 UI 提示**(如"后台任务完成"toast)。<br>
|
|
217
|
-
* 🔴 配对纪律([paired-mechanisms-must-share-premise]):这两件从「宿主义务」改成「库自持」是
|
|
218
|
-
* **整臂让位**,不是两边都做——宿主若仍照旧实现,两次 drop/clear 幂等无害,但**记号必须删**,
|
|
219
|
-
* 否则下一棒会以为库没做。
|
|
220
|
-
* 跨通道去重(「补发通道不得再注入模型一遍」)由**库自持**,不摊给宿主 —— B5 起台账回到
|
|
221
|
-
* `notifications.ts` 的 **module 级** `notifiedRunIds` / `cardEnqueuedRunIds`(0.6.0 曾放在适配器
|
|
222
|
-
* 实例上,与清账/记账的另一半不共享前提 = [1857] 那个缺口)。
|
|
223
|
-
* 🔴 宿主**不要**再在本臂上调 `markEngineWorkflowNotified` —— 库已在同一位置调过(幂等,
|
|
224
|
-
* 宿主照调无害,但记号该删:整臂让位,不是两边都做)。
|
|
225
|
-
* 注:面板行 end 事件本身走 panel_task 臂、SubagentStop 走 subagent_lifecycle 臂,不重复。
|
|
226
|
-
*/
|
|
227
|
-
| {
|
|
73
|
+
} | {
|
|
228
74
|
kind: 'notification_terminal';
|
|
229
75
|
laneProof: LaneProof;
|
|
230
76
|
taskId: string;
|
|
231
77
|
status: string;
|
|
232
78
|
taskType?: string;
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* 子代生命周期 hook 触发点(cli fireSubagentStartHook / fireSubagentStopHook)。
|
|
236
|
-
* 宿主消费义务:fire SubagentStart/SubagentStop hooks(observe-only,fail-soft,永不阻塞流)。
|
|
237
|
-
*
|
|
238
|
-
* 🔴 **B4 起「一生只许一次」的台账由适配器自持**(实例级 = 一个 session 一份,cli 的 module 级
|
|
239
|
-
* 等价物):`phase:'start'` 对同一 taskId **本臂只会发一次**,宿主收到就 fire,不必再去重。
|
|
240
|
-
* `guard:'if-started'` 同理已由适配器解掉——**只有真 fire 过 Start 的 taskId 才会收到带 guard 的
|
|
241
|
-
* stop**(cli `task_notification` 臂 `firedSubagentStartHookTaskIds.has()` 的等价面)。guard 字段
|
|
242
|
-
* 保留只为让宿主能识别这条 stop 的来源臂,**不是**要宿主再判一次(判据锚在能决定结果的量上:
|
|
243
|
-
* 台账在库里,宿主手上根本没有那个量)。
|
|
244
|
-
*/
|
|
245
|
-
| {
|
|
79
|
+
} | {
|
|
246
80
|
kind: 'subagent_lifecycle';
|
|
247
81
|
laneProof: LaneProof;
|
|
248
82
|
phase: 'start' | 'stop';
|
|
249
83
|
taskId: string;
|
|
250
|
-
/**
|
|
251
|
-
* 子代的**类型**(CC `SubagentStart.agent_type` 那一位)。0.75.1 起按**诚实来源**取,三态:
|
|
252
|
-
* ① wire `task_progress` 上的结构读类型键 —— 亲核 sdk 9.8.1 `events.d.ts` 的 `task_progress` 臂:
|
|
253
|
-
* **没有** `agentType` / `spawnAgentType` 这一位(也不在 `FleetTaskRow` 之外的任何 tick 面上),
|
|
254
|
-
* 所以本档今天恒不命中;上游哪天铸了这一位,本档先于 ② 生效;
|
|
255
|
-
* ② fleet 行帧的 `agentType`(sdk `FleetTaskRow.agentType`,§K-7 的短类型 label,如 `Explore`);
|
|
256
|
-
* ③ 两者都没有 ⇒ **键缺席**。
|
|
257
|
-
* 🔴 缺席 = 不知道这只子代是什么类型,**不是**「无类型」—— 宿主的 hook 侧要有 absent 兜底(别渲空串、别编
|
|
258
|
-
* `subagent`)。0.75.1 之前本键取的是 tick 的**展示名** `name`(上游由委派卡 description 派生)= 一个
|
|
259
|
-
* 看起来合理的错答案:子代启动 hook 收到的于是是那段描述文本。
|
|
260
|
-
*/
|
|
261
84
|
agentType?: string;
|
|
262
85
|
guard?: 'if-started';
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* B4 新臂 ①(A 层 `task_progress` 搬入)—— **inline 群组行**的累计统计(cli
|
|
266
|
-
* `engineInlineTaskStats` 的三个写口:`publishEngineInlineTaskTick` / `settleEngineInlineTaskStats`
|
|
267
|
-
* / `settleAllEngineInlineTaskStats`)。转录里那条 "Running N agents… ├ … 12 tool uses" 的数字面。
|
|
268
|
-
*
|
|
269
|
-
* 为什么与 `panel_task` 分臂:两者键不同 —— 本臂按**委派卡 id**(`cardId` = tool_use id,渲染面
|
|
270
|
-
* 的 AgentProgressLine 只有卡 id 在手),`panel_task` 按 **taskId**(footer 面板行)。同一 tick
|
|
271
|
-
* 同时喂两面是 cli 现役行为,合臂会逼消费端反解键。
|
|
272
|
-
*
|
|
273
|
-
* 宿主消费义务(三个 op 逐一,缺一即回归):
|
|
274
|
-
* · `op:'tick'` → `publishEngineInlineTaskTick(cardId, stats)`(已 settle 的卡是 no-op);
|
|
275
|
-
* · `op:'settle'` → `settleEngineInlineTaskStats(cardId, isError)`(冻结终值,幂等);
|
|
276
|
-
* · `op:'settle_all'` → `settleAllEngineInlineTaskStats()`(turn 末/abort 的防御 sweep 孪生腿)。
|
|
277
|
-
* 三个函数本包已导出(B1 搬入),宿主直接转发即可,不必自己实现语义。
|
|
278
|
-
*/
|
|
279
|
-
| {
|
|
86
|
+
} | {
|
|
280
87
|
kind: 'inline_task_stats';
|
|
281
88
|
laneProof: LaneProof;
|
|
282
89
|
op: 'tick';
|
|
283
|
-
/** 委派 tool_use id(渲染面订阅键)。 */
|
|
284
90
|
cardId: string;
|
|
285
91
|
stats: InlineTaskTick;
|
|
286
92
|
} | {
|
|
@@ -293,400 +99,69 @@ export type ChromeEvent = {
|
|
|
293
99
|
kind: 'inline_task_stats';
|
|
294
100
|
laneProof: LaneProof;
|
|
295
101
|
op: 'settle_all';
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* 带外后台 workflow 完成推送(service 1.75 Path B:引擎**没有** server-side 注入,壳负责喂模型)。
|
|
299
|
-
* 宿主消费义务 = **只有投递一件**:把 `message`(模型面 `<task-notification>` 正文,适配器已按 core
|
|
300
|
-
* 同形铸好)入「完成通知队列」,idle 时 auto-submit 给模型(CC RemoteAgentTask 先例,默认 'later'
|
|
301
|
-
* 优先级)。
|
|
302
|
-
*
|
|
303
|
-
* 🔴 **切缝 = 「门归包、投递归宿主」**([1857] Path B 回归的定谳形,B5 壳侧收批实撞;
|
|
304
|
-
* [paired-mechanisms-must-share-premise]):`workflow_complete` 臂在**发本臂之前**已经在库内
|
|
305
|
-
* 一次做完三件 —— ① 跨通道去重门 `isEngineWorkflowNotified(runId)` 早退;
|
|
306
|
-
* ② `markEngineWorkflowNotified(runId)`;③ `noteWorkflowCompletionCardEnqueued(runId)`
|
|
307
|
-
* (adapt.ts `case 'workflow_complete'` 三行连坐)。⇒ 宿主这三件**一件都不要再做**:
|
|
308
|
-
* · 绝不要借任何「自带同一道门」的宿主老函数投递(cli 的 `enqueueEngineWorkflowNotification()`
|
|
309
|
-
* 首行就是 `if (notifiedRunIds.has(runId)) return`,读的正是库刚写的记账 ⇒ **恒早退,
|
|
310
|
-
* 一条都进不了队列**,两半各自都对、组合零结果);投递要用**裸入队**口。
|
|
311
|
-
* · 也不要再补 `noteWorkflowCompletionCardEnqueued` —— 库已落(幂等 Set.add,宿主照落无害,
|
|
312
|
-
* 但记号该删:整臂让位,不是两边都做)。
|
|
313
|
-
* 🔴 **这条建议在 B6 之前是不安全的,别照抄旧结论**:库里那一行原本写在 `yield` **之后**,
|
|
314
|
-
* 消费者早退时永不执行 ⇒ 那时壳 `upstreamBridge.ts:488` 的显式落记号是**真的在补一个洞**。
|
|
315
|
-
* B6 已把它移到 `yield` 之前(adapt.ts `case 'workflow_complete'`,pure 门「早退 ⇒
|
|
316
|
-
* cardEnqueued 仍落」先红后绿钉住)⇒ 库侧现在**无条件**落,壳那一行才成为可删的冗余。
|
|
317
|
-
* ⇒ 判据只能锚在「队列里到底有没有多出这一条」,不能锚在「谁调了什么」。
|
|
318
|
-
*/
|
|
319
|
-
| {
|
|
102
|
+
} | {
|
|
320
103
|
kind: 'workflow_notification_enqueue';
|
|
321
104
|
laneProof: LaneProof;
|
|
322
105
|
runId: string;
|
|
323
106
|
status: 'completed' | 'failed';
|
|
324
107
|
summary: string;
|
|
325
108
|
message: string;
|
|
326
|
-
}
|
|
327
|
-
/**
|
|
328
|
-
* 引擎侧 task 族工具调用的台账同步点(cli handleEngineTaskToolUse:引擎模式下壳工具的 call()
|
|
329
|
-
* 从不执行,ctrl+t 面板的本地 store 只能靠这条侧信道)。
|
|
330
|
-
* 宿主消费义务:按 toolUseId 幂等地把 TaskCreate/TaskUpdate 落自己的 task store(畸形 input
|
|
331
|
-
* fail-soft 丢弃);不落转录。
|
|
332
|
-
*/
|
|
333
|
-
| {
|
|
109
|
+
} | {
|
|
334
110
|
kind: 'task_ledger_sync';
|
|
335
111
|
laneProof: LaneProof;
|
|
336
112
|
source: 'tool_use';
|
|
337
113
|
toolName: string;
|
|
338
114
|
toolUseId: string;
|
|
339
115
|
input: unknown;
|
|
340
|
-
}
|
|
341
|
-
/**
|
|
342
|
-
* B5 —— 同一台账的**第二个来源**:core 1.217([379])的 `task` / `task-list` structured 权威全量态。
|
|
343
|
-
* `source:'tool_use'` 那条是旧引擎兜底(从 input 重建),本条是引擎真实 id 的精确同步。
|
|
344
|
-
* 宿主消费义务:壳 = `handleEngineTaskStructured(structured)`(两路经 engineToShellTaskId 收敛)。
|
|
345
|
-
* 🔴 两条**不是**二选一 —— 旧引擎只有前者、新引擎两者都来且后者更准,宿主按幂等处理即可。
|
|
346
|
-
*/
|
|
347
|
-
| {
|
|
116
|
+
} | {
|
|
348
117
|
kind: 'task_ledger_sync';
|
|
349
118
|
laneProof: LaneProof;
|
|
350
119
|
source: 'structured';
|
|
351
|
-
/** `'task' | 'task-list'`(白名单已在库内判过)。 */
|
|
352
120
|
structuredType: string;
|
|
353
121
|
structured: unknown;
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* B3 新臂 ①(T38 三清的第三清 + T57 五处断闸的第五处)—— E12「下一步可问什么」建议**批**。
|
|
357
|
-
* `suggestions: null` = 作废(turn 开场必发一次:上一轮的建议对新上下文是噪声,挂着不掉会让人
|
|
358
|
-
* 以为是这一轮的产出);非空数组 = 本轮产出。
|
|
359
|
-
* 🔴 UNTRUSTED 模型文本(service 已 redact),**仅 UI**:宿主消费义务 = 推给 composer 上方的
|
|
360
|
-
* chips 面;**绝不回喂模型、绝不落转录、绝不进 /compact 的对话体**。
|
|
361
|
-
* 子流(parentToolCallId 标)的建议不发本臂 —— 断闸在库里,不摊给宿主。
|
|
362
|
-
*/
|
|
363
|
-
| {
|
|
122
|
+
} | {
|
|
364
123
|
kind: 'prompt_suggestions';
|
|
365
124
|
laneProof: LaneProof;
|
|
366
125
|
suggestions: readonly string[] | null;
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* B3 新臂 ②(runStream 外向边切除,设计稿 §5.2 第二条边)—— 每个 leader `turn_end` 折叠出的
|
|
370
|
-
* 真 usage。此前是 runStream 里一条 `void import('lastTurnUsageStore')` 的壳内动态边。
|
|
371
|
-
* 宿主消费义务:落「最近一次 turn 的真 usage」槽,供 statusline 类消费面在消息面取不到 usage
|
|
372
|
-
* 时回落(不落 = 插件的 Context 条恒 0%,原病复发)。子流 turn_end **不发本臂**(判据同 §E2:
|
|
373
|
-
* statusline 显示的是主会话窗口,子代 usage 会把 Context% 打成孩子的窗口占用)。
|
|
374
|
-
*
|
|
375
|
-
* `engineUsage`([2295] 裁 ② 逐字通道,2026-08-02 加,additive):引擎 `turn_end.usage`
|
|
376
|
-
* **整对象原形**(SDK 3.0.0 六键必填,含 `totalInputTokens`=归一化总输入含 cache)。
|
|
377
|
-
* `usage`(CC ModelUsage 镜像)保持纯净不加键 —— CC 形状不承载非 CC 语义;要总量/命中率的
|
|
378
|
-
* 消费面(context% 分子、cacheHitRate 分母)一律吃这份原形,别把镜像键求和当总量
|
|
379
|
-
* (求和等式仅 cache 族一致时成立,唯一硬保证=弱式 ≥,[2318])。optional:旧引擎
|
|
380
|
-
* (core <3.0.0)wire 无此形时缺席,消费方按诚实缺席处理,不造零值。
|
|
381
|
-
*/
|
|
382
|
-
| {
|
|
126
|
+
} | {
|
|
383
127
|
kind: 'last_turn_usage';
|
|
384
128
|
laneProof: LaneProof;
|
|
385
129
|
usage: ModelUsage;
|
|
386
130
|
engineUsage?: EngineTurnUsage;
|
|
387
|
-
/**
|
|
388
|
-
* L-215③(0.65.0)—— core 的 `turn_end.usageMissing`:这一轮**没有** provider usage 帧
|
|
389
|
-
* (臂注逐字「Consumers must treat the missing usage as UNKNOWN — **not zero**」;它与
|
|
390
|
-
* `usage` 可以同帧)。🔴 在场 ⇒ 同行那份 `usage` **不是一笔已知的账**,别当真值落进
|
|
391
|
-
* statusline / 账单槽;缺席 = 这一轮的账是真的。本位**只在 true 时在场**,绝不铸 false。
|
|
392
|
-
* ⚠️ 它不能靠「不发 `usage`」表达:`usage` 是本臂的必填位(宿主义务是「落最近一次 turn
|
|
393
|
-
* 真 usage」),所以「不知道」只能以判别位在场。
|
|
394
|
-
*/
|
|
395
131
|
usageMissing?: true;
|
|
396
|
-
/**
|
|
397
|
-
* L-215③ —— core 的 `turn_end.stopReason` **原词**透传(归一化后的五词
|
|
398
|
-
* `stop`/`length`/`toolUse`/`error`/`aborted`;sdk 型面是开放 `string` ⇒ **按开集读**)。
|
|
399
|
-
* 「这一轮是不是被 max_tokens 截了」这条机读位此前 stream 与 trace 两面互盲。
|
|
400
|
-
* 🔴 缺席 ⇒ 键不铸,**绝不**读作 `"stop"`。
|
|
401
|
-
*/
|
|
402
132
|
stopReason?: string;
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* **L-228(0.67.0;core 7.14.0 提货批件 F-6)—— per-subagent 的 turn usage 分表。**
|
|
406
|
-
*
|
|
407
|
-
* ── 它修的是什么 ─────────────────────────────────────────────────────────────────────────
|
|
408
|
-
* 一条 run 委派出去的那本账,core 终局**只有合计**(`TaskResult.stats.nested` 的
|
|
409
|
-
* `{tokens, turns, tasks, costMicroUsd}`,`task-result.d.ts` #594-660)——**没有 per-task 分项**。
|
|
410
|
-
* 而流里每一条子流的 `turn_end` 都带着它自己那一轮的 usage,本包此前在 §E2 断闸处**折而未读**
|
|
411
|
-
* (`!isSubFlow` 才发 `last_turn_usage` / 才 yield `turn_usage`)⇒ 子代详情面(壳的
|
|
412
|
-
* `engineAgentView`)只渲得出「这个子代的 usage 不知道」。⇒ 分表**只能**由流内子流累加得出,
|
|
413
|
-
* 本臂就是那条通道。
|
|
414
|
-
*
|
|
415
|
-
* ── 🔴 它**不**改主臂的断闸 ──────────────────────────────────────────────────────────────
|
|
416
|
-
* `last_turn_usage` / `turn_usage` 两处 `!isSubFlow` 一个字节不动(§E2:子代的 outputTokens 拿去
|
|
417
|
-
* 对账 leader 的 responseLength 就是 token-jump 那个病)。本臂是**additive 的第三条腿**,
|
|
418
|
-
* `laneProof` 恒是**子流那条**(`{lane:'subagent', parentToolCallId}`)—— 宿主据此就知道这条不是
|
|
419
|
-
* 主会话的账,不会误落进 statusline 的窗口占用。
|
|
420
|
-
*
|
|
421
|
-
* ── 载荷 ─────────────────────────────────────────────────────────────────────────────────
|
|
422
|
-
* `taskId` = 引擎给这只子任务的 id;wire 上缺席时**回落 `parentToolCallId`**(同一只子代的每一轮
|
|
423
|
-
* 至少归得到同一行)。`usage` / `engineUsage` / `usageMissing` / `stopReason` 与
|
|
424
|
-
* {@link ChromeEvent} 的 `last_turn_usage` 臂**逐位同义**(同一只 `turnEndUsage()` 产物,不另铸)。
|
|
425
|
-
*
|
|
426
|
-
* ── 🔴 0.67.1 / B-090:本臂的**射程边界**(如实记,不是遗漏)──────────────────────────────
|
|
427
|
-
* 子流判据(`isSubFlow`)0.67.1 起认**身份信封两键任一在场**(`parentToolCallId` ∪ `sourceTaskId`;
|
|
428
|
-
* core 合同上两键同条件盖章、顶层任务一个都不带)。而**本臂**还多一个前提:车道证明
|
|
429
|
-
* {@link LaneProof} 的子流臂是 `{lane:'subagent', parentToolCallId: string}` ⇒ 一条**只带
|
|
430
|
-
* `sourceTaskId`、没有父调用 id** 的子代轮**发不出本臂**(拿任务 id 去填父调用 id 那一格是身份位
|
|
431
|
-
* 互串,座位门 `checkLaneProof` 也会把缺伴随位的信封吃掉)。
|
|
432
|
-
* ⇒ 那一形上:主臂两处断闸**照断**(不污染主会话用量)、终帧分表
|
|
433
|
-
* `_sema_nested_usage_by_task` **照带那一行**,只有本臂这条**实时增量**腿静默。
|
|
434
|
-
* 🔴 宿主据此:**不许**把「本臂没来过」读成「这只子代没花钱」——收口快照才是那本账的全量面。
|
|
435
|
-
*
|
|
436
|
-
* 宿主消费义务(`required: false`):渲子代详情的 per-agent 用量。不接 = 那一面看不见(不是报错);
|
|
437
|
-
* 🔴 **绝不**把本臂的数加进主会话的 turn 用量 —— 两条腿分工见上;
|
|
438
|
-
* 🔴 `usageMissing` 在场 ⇒ 同行那份 usage 是**下界**,别当已知账落槽。
|
|
439
|
-
*/
|
|
440
|
-
| {
|
|
133
|
+
} | {
|
|
441
134
|
kind: 'subagent_turn_usage';
|
|
442
135
|
laneProof: LaneProof;
|
|
443
|
-
/**
|
|
444
|
-
* **分表的行键** = `sourceTaskId ?? parentToolCallId`;与终帧 `_sema_nested_usage_by_task`
|
|
445
|
-
* 的键**逐字相同**(本臂与那张表的 join 键)。
|
|
446
|
-
* 🔴 它**不是** wire 上的某一个字段名:core 的 `TaskEventIdentity` 上**没有** `taskId`
|
|
447
|
-
* (顶注逐字「NOT a second `taskId` — that field already exists on `task_progress` and a
|
|
448
|
-
* duplicate would bite consumers」),真身份是 {@link sourceTaskId};回落见那一位。
|
|
449
|
-
*/
|
|
450
136
|
taskId: string;
|
|
451
|
-
/**
|
|
452
|
-
* core `TaskEventIdentity.sourceTaskId` **原值**:这条子流所属任务的 canonical id
|
|
453
|
-
* (`spec.taskId ?? sessionId`),**只**盖在「作为子代跑」的任务的内容事件上。
|
|
454
|
-
* 缺席 = 引擎没报这一位(老引擎 / 某些腿)⇒ {@link taskId} 回落到 `parentToolCallId`。
|
|
455
|
-
* ⚠️ 回落是**有损**的:同一个父调用下若真有多只子任务,它们会并成一行 —— 这时
|
|
456
|
-
* 终帧那张表的 `partial` 判别位会因行数对不上 `nested.tasks` 而立起来。
|
|
457
|
-
*/
|
|
458
137
|
sourceTaskId?: string;
|
|
459
|
-
/** 引擎给这条子流打的父调用 id(`laneProof` 里那一个,平铺一份省得宿主解 union)。 */
|
|
460
138
|
parentToolCallId: string;
|
|
461
|
-
/**
|
|
462
|
-
* 这一轮的 CC `ModelUsage` 镜像。
|
|
463
|
-
* 🔴 **可选**:core 真会发**裸** `{type:'turn_end', usageMissing:true}`(无 usage、无 stopReason)
|
|
464
|
-
* —— 主臂 0.65.1 / B-088 就是为这一形放宽的发臂条件,子代这条腿同律(同形存量不许再犯一次)。
|
|
465
|
-
* 缺席 ⇒ 这一轮**什么账都没报**,读 {@link usageMissing}。
|
|
466
|
-
*/
|
|
467
139
|
usage?: ModelUsage;
|
|
468
140
|
engineUsage?: EngineTurnUsage;
|
|
469
|
-
/** 见 `last_turn_usage` 同名位:在场 ⇒ 这一轮的账**不是**一笔已知的账,never false。 */
|
|
470
141
|
usageMissing?: true;
|
|
471
|
-
/** 见 `last_turn_usage` 同名位:原词开集透传,缺席不铸。 */
|
|
472
142
|
stopReason?: string;
|
|
473
|
-
}
|
|
474
|
-
/**
|
|
475
|
-
* B3 新臂 ③(runStream 外向边切除,设计稿 §5.2 头号污染源)—— `done{status:"needs_review"}` +
|
|
476
|
-
* gate `plan_review` 的 park 终帧。此前是 runStream 里一条 `await import('planReviewWire')`,
|
|
477
|
-
* 而 planReviewWire → `utils/debug` → **整棵 1565 文件的 CC 树**进闭包(浏览器可移植性归零)。
|
|
478
|
-
* 宿主消费义务:弹审批卡(cli 借 AskUserQuestion overlay 合成 question,决断走
|
|
479
|
-
* `/v1/assistant/tasks/:id/plan_review` resume verb);**fail-soft**——不实现或实现失败都不影响
|
|
480
|
-
* 紧随其后的终态帧照常投影(用户至少看到 plan fence + 一条普通完成)。
|
|
481
|
-
* `result` = done 帧的 RAW `result` 载荷(判形与取 taskId 都由宿主做,库不猜)。
|
|
482
|
-
*/
|
|
483
|
-
| {
|
|
143
|
+
} | {
|
|
484
144
|
kind: 'plan_review_park';
|
|
485
145
|
laneProof: LaneProof;
|
|
486
146
|
result: unknown;
|
|
487
|
-
}
|
|
488
|
-
/**
|
|
489
|
-
* D-3 / B-068 · L-198(0.66.0;core ≥7.12.0 `TaskStats.costBreakdown` / `nested`)——
|
|
490
|
-
* **终局那一拍的成本对账**。载荷本体 = {@link RunCostReconcile}(与终帧超集键
|
|
491
|
-
* `_sema_cost_breakdown` / `_sema_nested_usage` **同一个读器**产出,两面不会各算各的)。
|
|
492
|
-
*
|
|
493
|
-
* 🔴 **为什么另起一条臂,而不是扩 `last_turn_usage` 的终局那一拍**:那条臂的宿主义务逐字是
|
|
494
|
-
* 「落**最近一次 turn** 的真 usage(statusline 回落源)」—— 它回答的是「这一轮」的问题,而
|
|
495
|
-
* 本臂回答的是「**这条 run 一共**花了多少、其中子代与压缩各多少」。把两个量塞进一条臂,宿主
|
|
496
|
-
* 就得在同一个载荷上分辨「这是 turn 还是 run」,那正是[same-name-different-meaning]那一族病;
|
|
497
|
-
* 而且 `last_turn_usage` 是 `required: true` 的既有义务面,往上加语义会改已接宿主的读法。
|
|
498
|
-
*
|
|
499
|
-
* 🔴 **子流断闸不动**:`isSubFlow` 的 `turn_end` 仍然**不发** `last_turn_usage`(§E2 判据),
|
|
500
|
-
* 子代花费**只**经本臂的 `nestedMicroUsd`(= 终局 `stats.nested`)到账 —— 流中增量与终局总账
|
|
501
|
-
* 两条腿分工不变,壳把两者相加就是重复计账。
|
|
502
|
-
*
|
|
503
|
-
* 发臂条件 = **这条终帧带得出 stats**;`stats` 缺席(409 拒绝信封 / park 体 / `failed` 事件帧)
|
|
504
|
-
* ⇒ 一条都不发(没有账就不说话,不发一条全缺席的空账)。非成功终局**照发** —— 花掉的钱与
|
|
505
|
-
* 结局好不好无关。
|
|
506
|
-
*
|
|
507
|
-
* 宿主消费义务(`required: false`):终局按本臂对账(`/cost` 面把 own / nested / compaction
|
|
508
|
-
* 三段各渲一行)。不接 = 必须改从终帧那两个超集键自己对账,否则子代与压缩两笔账永远不进成本面
|
|
509
|
-
* (B-068 原病)。🔴 判别位在场时**别渲 0**:`costAbsent` / `nestedCostAbsent` 说的是
|
|
510
|
-
* 「这一段没定价」,渲成 `$0.00` 就是替引擎编了一笔它没报的账。
|
|
511
|
-
*/
|
|
512
|
-
| ({
|
|
147
|
+
} | ({
|
|
513
148
|
kind: 'run_cost_reconciled';
|
|
514
149
|
laneProof: LaneProof;
|
|
515
|
-
} & RunCostReconcile)
|
|
516
|
-
/**
|
|
517
|
-
* FIX⑦(2026-08-07,[3017]/[3020];core 5.14.0 design/171 新 `TaskEvent` 臂,server 7.4.0
|
|
518
|
-
* 起真上 SSE)——「**谁把什么喂进了这条 run**」的生命周期账本帧:objective / 实时 steer /
|
|
519
|
-
* nextTurn / parked-steer 续跑 / wake 五个载体共用一个投影点。
|
|
520
|
-
*
|
|
521
|
-
* 🔴 **本帧不带正文**(core 的臂里就没有 text 字段)—— 所以它归 chrome 而不是 transcript,
|
|
522
|
-
* 而且宿主**不许**据此铸任何一行「用户说了…」的转录:那会是替引擎编一句它没说过的话。
|
|
523
|
-
* 宿主消费义务(全部可选,fail-soft):把它记进会话审计/时间线(「12:03 operator 通过 steer
|
|
524
|
-
* 注入了一条指令」),或在 HUD 上闪一下。什么都不做也是合法的 —— 本臂存在的第一价值是
|
|
525
|
-
* **不再落 `unknown_arm` 被丢弃**(账本帧丢了,壳就说不出「这条 run 被谁插过话」)。
|
|
526
|
-
* `actor.hostAsserted` 是消费端唯一能判「这个署名可信吗」的位:渲署名而不渲这个位 = 把一个
|
|
527
|
-
* 未经验证的名字渲成可信的(core 自己的 `[from …]` 渲染就是靠它决定加不加 `(unverified)`)。
|
|
528
|
-
*/
|
|
529
|
-
| HumanInputChromeEvent
|
|
530
|
-
/**
|
|
531
|
-
* B-072 ④(0.65.0;core message-identity Phase 1,server ≥7.69.0 **live 腿**真发)——
|
|
532
|
-
* 一条**已经流过**的可渲染消息在会话树里落账了。`entryId` 是持久、副本稳定的条目 id
|
|
533
|
-
* (uuidv7),与 `compacted.preserved_segment.firstKeptEntryId` 是**同一个 id 空间**。
|
|
534
|
-
*
|
|
535
|
-
* 🔴 **它存在的唯一理由是解析压缩分割线**:core 亲口说消费方用本帧自建 `entryId → message`
|
|
536
|
-
* 映射,再拿 `_sema_preserved_segment` 去查「保留尾段从哪条消息开始」。没有本帧,那个超集
|
|
537
|
-
* 键就是一个查不出东西的锚。绑定规则同 core:`toolResult` 腿按 `toolCallId` 绑,
|
|
538
|
-
* user/assistant 腿按**流序**绑(本帧是刚刚流完那段内容的终止边界)。
|
|
539
|
-
* 🔴 **本帧不带正文** ⇒ 宿主**不许**据此铸任何 transcript 行(同 `human_input` 那条硬约束);
|
|
540
|
-
* 义务是**可选**的:落一张 `entryId → 已渲消息` 的映射表即可,不落 = 压缩分割线画不出来,
|
|
541
|
-
* 别的什么都不受影响。
|
|
542
|
-
* ⚠️ **只有 live 腿有本帧**(server 7.69.0 亲读:durable/bg 腿把它喂给 rewind 锚而不入账本)
|
|
543
|
-
* ⇒ replay/resume 上映射表是空的;那时正解是**不画分割线**,不是回退成「画在最后一条」。
|
|
544
|
-
*/
|
|
545
|
-
| MessageCommittedChromeEvent | EngineNoticeChromeEvent | TextSegmentEndChromeEvent | ThinkingSegmentEndChromeEvent | ToolDisclosureChromeEvent | ToolProgressChromeEvent | ToolRosterDeltaChromeEvent | ContextUsageChromeEvent | CompactionOutcomeChromeEvent | PromptAssembledChromeEvent | WiringManifestChromeEvent | ResultTextDivergedChromeEvent
|
|
546
|
-
/**
|
|
547
|
-
* B-078 / L-208(0.65.0):design/172 流内审批协议的**两条帧**。修前它们在标准管线上落
|
|
548
|
-
* `dropped('unsupported_arm')`,壳自己另接一份 ⇒ 只走包管线的宿主(desktop/web)拿不到
|
|
549
|
-
* 卡集与撤卡。契约本体在两个接口的头注(那是宿主要读的那一份)。
|
|
550
|
-
*/
|
|
551
|
-
| ApprovalRequestChromeEvent | ApprovalRevokeChromeEvent;
|
|
552
|
-
/**
|
|
553
|
-
* {@link ChromeEvent} 的 `wiring_manifest` 臂(core #524 + core 147③,server ≥7.58.0)——
|
|
554
|
-
* 引擎接线自述里**三段面向终端用户的事实**(S-124 起 `mcp[]` 是第三段),其余每一段仍不投影(射程见 eventToSdkMessage 的
|
|
555
|
-
* `case 'wiring_manifest'` 头注)。
|
|
556
|
-
*
|
|
557
|
-
* ── 🔴 宿主消费义务(四条,全部是「不许做什么」)────────────────────────────────────────────
|
|
558
|
-
* ① **缺席不可反推**。`modelGate` 缺席 = 本 run 没有门卸(core 只在真卸时铸段),
|
|
559
|
-
* `autoMode` 缺席 = 老 mint / 外部 derive **没报**。两者都**不许**被渲成一句肯定句
|
|
560
|
-
* (「没有工具被卸掉」/「auto 未武装」)—— 那是把「没报」说成「报了个否」。
|
|
561
|
-
* `mcp` 缺席同理(义务④)。本臂在**三段都不成形**时根本不会到达,所以宿主见到本臂就至少有
|
|
562
|
-
* 一段是真读数。
|
|
563
|
-
* ② **`autoMode.reason` 六词逐字呈现,不许映射**到 `/v1/capabilities.permissionModeAuto.reason`
|
|
564
|
-
* 的六词:两套词表**同名不同义**(`settings_denied` 在 capabilities 那边折 `no_intent`
|
|
565
|
-
* 不折 `denied`)。要两面都说,就两面各自读、各自渲,绝不归一。
|
|
566
|
-
* ③ **`modelGate.restore` 原样呈现**:它是 core 铸的**逐字**恢复办法,宿主自己拼一句
|
|
567
|
-
* 「试试把某某开关关掉」等于替引擎编了一条它没说过的出口。
|
|
568
|
-
* ④ **`mcp: []` 不许当缺席**(S-124,0.59.0)。空数组是「这条腿一台 MCP 都没申报」这句**正面
|
|
569
|
-
* 事实**,缺席才是「老 mint / 外部 derive 没报」—— 判在场写 `mcp !== undefined`,写
|
|
570
|
-
* `mcp?.length` 就把两句话折成了一句。条目里 `toolCount: 0` 同理(连上了、零工具 ≠ 没报)。
|
|
571
|
-
* ⚠️ 反过来本包也**不会**拿 `[]` 骗你:一份非空却整表读不出来的回体在投影层就落成**段缺席**
|
|
572
|
-
* (异源对抗复审 r1 真病),所以你读到的 `[]` 一定是引擎真报的零申报,不是「都被丢光了」。
|
|
573
|
-
* 🔴 **幂等**:durable 腿重放会再送同一帧(与 `workspace_changed`/`engine_notice` 同纪律),
|
|
574
|
-
* 宿主按 run/leg 去重,别按到达次数计数。
|
|
575
|
-
* 缺席(宿主不接本臂)= 这三条披露在该宿主上看不见,**不是**报错。
|
|
576
|
-
*/
|
|
150
|
+
} & RunCostReconcile) | HumanInputChromeEvent | MessageCommittedChromeEvent | EngineNoticeChromeEvent | TextSegmentEndChromeEvent | ThinkingSegmentEndChromeEvent | ToolDisclosureChromeEvent | ToolProgressChromeEvent | ToolRosterDeltaChromeEvent | ContextUsageChromeEvent | CompactionOutcomeChromeEvent | PromptAssembledChromeEvent | WiringManifestChromeEvent | ResultTextDivergedChromeEvent | ApprovalRequestChromeEvent | ApprovalRevokeChromeEvent;
|
|
577
151
|
export interface WiringManifestChromeEvent {
|
|
578
152
|
kind: 'wiring_manifest';
|
|
579
153
|
laneProof: LaneProof;
|
|
580
|
-
/** 仅本 run 真有门卸时在场(见义务①)。 */
|
|
581
154
|
modelGate?: WiringManifestModelGate;
|
|
582
|
-
/** effective 腿恒在;缺席只表示「没报」(见义务①)。 */
|
|
583
155
|
autoMode?: WiringManifestAutoMode;
|
|
584
|
-
/**
|
|
585
|
-
* 本条腿**申报的每台 MCP 服务器**的连接时快照(S-124 / core 7.5.0,server ≥7.60.0)。
|
|
586
|
-
*
|
|
587
|
-
* 🔴 **空数组不是缺席**(core 顶注逐字,也是本臂第四条消费义务):`[]` = 「这条腿一台都没申报」
|
|
588
|
-
* (一句正面事实,该渲成那句话);**缺席** = 老 mint / 外部 derive **没报**(什么都别渲)。
|
|
589
|
-
* 宿主写 `mcp?.length ? … : …` 就把两者折成了一件 —— 判在场用 `mcp !== undefined`。
|
|
590
|
-
* ⚠️ 本包这一侧的对偶承诺:非空却零行幸存(整表读不出来)的回体**不铸 `[]`**,落段缺席。
|
|
591
|
-
* 🔴 **不与 `GET /v1/sessions/:id/mcp` 的二态合并、也不互相校验**(server 裁定逐字):那条端点的
|
|
592
|
-
* 真源是 server 自己的部署面台账,本段的真源是 core 这条腿 materialize 的连接时快照 ——
|
|
593
|
-
* 同名不同源,合并只会造出一个「哪个才算数」的新问题。
|
|
594
|
-
* 🔴 **`errorCode` 按开集分支**(十词 + `http_<status>` 形),`switch` 必须带 `default` 臂;
|
|
595
|
-
* 远端错误**自由文本**(`error`)上游就不投,宿主也拿不到 —— 可操作的因由在 `errorCode`。
|
|
596
|
-
*/
|
|
597
156
|
mcp?: readonly WiringManifestMcpEntryView[];
|
|
598
|
-
/** CC-08 ①(0.71.0):第四段 —— 这条腿开跑那一刻的工具名册快照(`toolRoster.ts` 读器;之后的变更走 `tool_roster_delta`)。 */
|
|
599
157
|
tools?: ToolRosterView;
|
|
600
|
-
/** CC-08 ①:第五段 —— hook 族(family / owner / observational?)。 */
|
|
601
158
|
hooks?: readonly WiringManifestHookEntryView[];
|
|
602
|
-
/** CC-08 ①:第六段 —— LSP 接缝(在场 iff 解析出了 manager 席;`mounted` 与 `lane` 禁合读)。 */
|
|
603
159
|
lsp?: WiringManifestLspSeamView;
|
|
604
|
-
/** core 7.20.1(0.71.4):第七段 —— 写保护判官自报 targetView(present-iff 编译出判官;🔴 缺席 = 第三态,不折 spelling-only)。 */
|
|
605
160
|
writeProtection?: WiringManifestWriteProtectionView;
|
|
606
|
-
/** core 7.21.0 / server 7.82.0(0.72.4 CC-35):第八段 —— 记忆自动整理武装(present-iff 武装 ∧ operator 面;🔴 缺席 = indeterminate,不折 false)。 */
|
|
607
161
|
autoConsolidation?: WiringManifestAutoConsolidationView;
|
|
608
|
-
/** core 7.22.0 #889(0.72.7 CC-42):第九段 —— 内置读 deny 表的实质激活档位(present-iff 有内置行判;🔴 缺席 = 没有这条腿,不是「没有读被 deny 判」)。 */
|
|
609
162
|
readDeny?: WiringManifestReadDenyView;
|
|
610
|
-
/** core 铸的事件身份(uuidv7 形);wire 未必带 ⇒ 缺席时本键不在场。 */
|
|
611
163
|
eventId?: string;
|
|
612
164
|
}
|
|
613
|
-
/**
|
|
614
|
-
* {@link ChromeEvent} 的 `text_segment_end` 臂(#323 / core #447,core ≥5.63 / server ≥7.50)——
|
|
615
|
-
* 「**assistant 的这一段散文写完了**」,由引擎明说,不是由本包猜。
|
|
616
|
-
*
|
|
617
|
-
* ── 它替代的是什么 ──────────────────────────────────────────────────────────────────────────
|
|
618
|
-
* 本包的 `adapt/textStream.ts` 至今用**启发式**猜段边界:静默 ≥1.5s + 段尾是句末/段末字符 +
|
|
619
|
-
* 每段至多一刀(`takeAnswerSegmentOnIdle`,#323 症状① 的止血件)。那是猜 —— 慢模型的一次卡顿会
|
|
620
|
-
* 被当成段结束,一轮回复被切成 N 条 assistant 消息。本臂是**引擎报的真边界**:模型关掉了那个
|
|
621
|
-
* text content block。CC 对位:CC 在 provider 的 `content_block_stop` 上把每个写完的块当作一条
|
|
622
|
-
* 独立 assistant 消息 —— 块结束**就是**分段信号,本臂把同一个边界搬到了 wire 上。
|
|
623
|
-
*
|
|
624
|
-
* 🔴 **宿主消费义务**(② ③ ④ 可选、fail-soft;① 自 0.68.1 起是**安全面义务**,不实现 = 未脱敏
|
|
625
|
-
* 字节留在那个宿主的本地转录里):
|
|
626
|
-
* ① 🔴 **它是信号 + 权威内容**(0.68.1 改口;server ≥7.75.3)。`content` = 那一段的**权威全文**,
|
|
627
|
-
* 并且与活体增量的拼接**可以不相等** —— server 7.75.3 起它与 `result`/账本走**同一只脱敏器**,
|
|
628
|
-
* 而 `text_delta` 仍逐字(跨 chunk 的凭据无法就地判)。修前这里写的是「与增量拼接逐字节相等…
|
|
629
|
-
* 别拿它再渲一行」,那句话在 7.75.3 起**不再成立**;按它不渲 = 屏上与转录里留的是**未脱敏**
|
|
630
|
-
* 的那一份。
|
|
631
|
-
* · **`diverged` 在场**(never false,缺席 = 逐字节相同)⇒ 你按增量拼出来的那一段是**过期**的:
|
|
632
|
-
* 必须用 `content` **重渲该段**,并以它为该段的 committed 文本,**不许保留增量拼文**。
|
|
633
|
-
* · 🔴 **`committedPrefixDiverged` 在场**(never false)⇒ 这一段此前已经 committed 上屏的那一截
|
|
634
|
-
* **自己**就是过期的(凭据落在它里面),而它**撤不回**(那条 transcript 消息早已交给你)。
|
|
635
|
-
* 这一形下本包**一个字节都不再交**给 transcript 平面 —— 该段唯一算数的那一份就是本帧的
|
|
636
|
-
* `content`:宿主必须把 `committedPrefixLen` 指的那一截(见下)换成 `content`。
|
|
637
|
-
* 🔴 **不实现这一条 = 这一段在你的转录里只剩未脱敏的那半截**(而且缺了后半段)。
|
|
638
|
-
* 它**缺席**时(含压根没有已提交前缀)本包交的是**尾段** —— 前缀 + 尾段拼起来逐字节 =
|
|
639
|
-
* `content`,宿主**什么都不用丢**,照常把新到的 transcript 消息接在后面。
|
|
640
|
-
* · **`committedPrefixLen` 在场**(never 0)= 这一段已经 committed 上屏的**长度**,是上一条的
|
|
641
|
-
* **定位量**,照抄这一行就对:
|
|
642
|
-
* `已committed正文.slice(0, 已committed正文.length - committedPrefixLen) + content`。
|
|
643
|
-
* 🔴 **单位 = JS 字符串长度(UTF-16 代码单元),不是 UTF-8 字节** —— 按 UTF-8 字节去截会在
|
|
644
|
-
* 任何非 ASCII 正文上截错位置(实测 `sk-…` + `中文`×30 + 换行:UTF-16 长度 82 / UTF-8 字节 202,
|
|
645
|
-
* 按 202 截会把凭据**原样留在屏上**还附带乱码)。
|
|
646
|
-
* 🔴 **也不是「几条消息」** —— 本包在 idle-flush 那一形下会把「上一段的定稿 + 这一段的
|
|
647
|
-
* 半截」合并进**同一条** assistant 消息(分段行为零改动的代价),按**消息**去丢会把已经
|
|
648
|
-
* 定稿的上一段一起删掉,而本包不会再补发它。
|
|
649
|
-
* 🔴 它按**增量拼文**计长,**不是** `content` 上的偏移量 —— 前缀自己也可能被脱敏改过字节,
|
|
650
|
-
* 拿它去切 `content` 在 `committedPrefixDiverged` 那一形上会切出半截乱码。
|
|
651
|
-
* ⚠️ 🔴 **一条总不变量 + 一条如实留白**:
|
|
652
|
-
* **不变量** —— 本包只在「整段都在自己手里(**同一条** committed 消息内)」时改自己交的字节;
|
|
653
|
-
* 段一旦跨过包侧边界(工具卡 / 消息划界),就**只发这三个键、不动任何既有行为**:转录逐条、
|
|
654
|
-
* 终帧补差走向都与 0.68.0 **逐字相同**(常驻门按「补差臂走向」这个真正决定结果的量对照)。
|
|
655
|
-
* **留白** —— 因此跨消息那几形里,`committedPrefixLen` 指的那一截可能落在别条消息里、甚至
|
|
656
|
-
* 中间**夹着一张工具卡**,而终帧补差的基线也不会跟着换(它本来就不跟,与本批无关)。
|
|
657
|
-
* 两者的根因是同一个:**包按自己的边界切 committed 消息,引擎按 content block 切段**。
|
|
658
|
-
* 根治 = 「每个引擎段各自一条 committed 消息」(= CC 在 `content_block_stop` 上的原生做法),
|
|
659
|
-
* 那是**分段行为改动**、与撤 idle-flush 启发式同一件事,按宪法三问单独走;本批不做,
|
|
660
|
-
* 把边界如实写在这里而不是假装没有。
|
|
661
|
-
* · 三键**都缺席**(= 最常见的那一形)⇒ 一切照旧:`content` 只是**定界**信号,这些字节已经
|
|
662
|
-
* 以 `stream_delta` 流过、并由 transcript 平面给出 committed 形,**拿它再渲一行 = 同一段
|
|
663
|
-
* 文字上屏两遍**。
|
|
664
|
-
* ⚠️ 分工:`diverged` 那一条只有**自己拼 delta 上屏**的宿主要做(只渲 transcript 平面的宿主
|
|
665
|
-
* 自动正确 —— 本包已经把权威全文换进段缓冲);而 `committedPrefixDiverged` 那一条
|
|
666
|
-
* **所有宿主都要做**(包在那一形上交不出东西,只有你能修)。
|
|
667
|
-
* ⚠️ 🔴 **迟到的段边界**(引擎在工具执行之后才报这一段的边界 —— openai 车道的实测时序)同样
|
|
668
|
-
* 会带着这三个键到达:那一段的正文可能已经落在**上一条** assistant 消息里,`committedPrefixLen`
|
|
669
|
-
* 指的就是那一条。宿主按同一条规矩处置(丢掉 + 用 `content` 重渲),不要因为「这一段看起来
|
|
670
|
-
* 已经结束很久了」就跳过。
|
|
671
|
-
* ② **诚实缺席,不可反推**(core 臂注逐字):只有会报块结束的 Brain 才发它 —— 三个一方 brain 都发,
|
|
672
|
-
* 自定义 brain 可能整条流一帧都没有。⇒ 缺席 = 「**没报**」,**永远不等于**「这一段没结束」。
|
|
673
|
-
* 消费方按**每条流**判「这条流带不带边界帧」,只在整条流一帧都没有时才回落自己的启发式;
|
|
674
|
-
* 按**单帧**缺席就回落 = 把「这一拍还没到边界」误当「引擎不支持」。
|
|
675
|
-
* ③ **空段无帧**:引擎只为**有字节**的段发帧(空 text block 静默关闭)—— 所以宿主永远不会收到
|
|
676
|
-
* 空 `content`,收到了也不该提交一个幻影段(本包投影层已按 `empty_payload` 拦下)。
|
|
677
|
-
* ④ 🔴 **子流让位**:带 `parentToolCallId` 的段边界属于子代/编排流,拿它去提交 leader 的段就是
|
|
678
|
-
* 跨 lane 状态破坏(与 `stream_delta` 的 thinking 半场、`retry_status` 同一条纪律)。所以本臂
|
|
679
|
-
* 在库内**已经断闸** —— 子流的段边界**根本不产出本 chrome 事件**,本臂因此没有
|
|
680
|
-
* `parentToolCallId` 位(有位才是可疑的:那意味着 leader 面上会出现别人的边界)。
|
|
681
|
-
* 要消费子流边界的宿主读 SDKMessage 平面的 `text_end` 内部臂,那一层原样带 `parentToolCallId`。
|
|
682
|
-
*
|
|
683
|
-
* ⚠️ **UNTRUSTED、仅展示**:`content` 是模型输出,契约与活体增量同 —— 渲染,绝不回喂模型。
|
|
684
|
-
* 📋 如实留白:本包的 `takeAnswerSegmentOnIdle` 启发式**仍未撤**(撤它要按 ② 做一条 per-stream
|
|
685
|
-
* 的状态化策略,属行为面改动,按宪法三问单独走)。0.68.1 的权威段替换是**兼容**它的 ——
|
|
686
|
-
* 「半段已被 idle-flush 提交」那一形由 `committedPrefixLen` / `committedPrefixDiverged` 如实
|
|
687
|
-
* 交代,不是把启发式悄悄换掉了。
|
|
688
|
-
*/
|
|
689
|
-
/** {@link TextSegmentEndChromeEvent.committedRows} 的一行:该 uuid 的文本行替换后应有的正文(端逐行写回)。 */
|
|
690
165
|
export interface TextSegmentCommittedRow {
|
|
691
166
|
uuid: string;
|
|
692
167
|
text: string;
|
|
@@ -694,105 +169,22 @@ export interface TextSegmentCommittedRow {
|
|
|
694
169
|
export interface TextSegmentEndChromeEvent {
|
|
695
170
|
kind: 'text_segment_end';
|
|
696
171
|
laneProof: LaneProof;
|
|
697
|
-
/**
|
|
698
|
-
* 该段的**权威全文**(server ≥7.75.3 起经脱敏器;**可以**与活体增量的拼接**不相等**)。
|
|
699
|
-
* 🔴 读法全在上面义务 ①:`diverged` 缺席时它只是对账/定界量(别拿它再渲一行);在场时它是
|
|
700
|
-
* 该段唯一算数的那一份。
|
|
701
|
-
*/
|
|
702
172
|
content: string;
|
|
703
|
-
/**
|
|
704
|
-
* **活体面**那份过期了(never false —— 缺席 = 与增量拼接逐字节相同)。
|
|
705
|
-
* 在场 ⇒ 按 {@link TextSegmentEndChromeEvent.content} 重渲该段,别保留增量拼文。
|
|
706
|
-
*/
|
|
707
173
|
diverged?: true;
|
|
708
|
-
/**
|
|
709
|
-
* **转录面**已经 committed 的那一截**自己**也过期了(never false)。
|
|
710
|
-
* 🔴 在场 ⇒ 本包**一个字节都不再交**给转录面(撤不回的那截拼不出 `content`,再补一条就是同一段话
|
|
711
|
-
* 上屏两遍)⇒ 该段唯一算数的那一份就是 {@link TextSegmentEndChromeEvent.content},宿主把
|
|
712
|
-
* {@link TextSegmentEndChromeEvent.committedPrefixLen} 指的那一截换成它;
|
|
713
|
-
* 缺席 ⇒ 本包交的是**尾段**,前缀 + 尾段 = `content`,什么都不用丢。
|
|
714
|
-
*/
|
|
715
174
|
committedPrefixDiverged?: true;
|
|
716
|
-
/**
|
|
717
|
-
* 这一段已经 committed 上屏的**长度**(never 0)——「要换的是哪一段」的定位量:
|
|
718
|
-
* `已committed正文.slice(0, 已committed正文.length - committedPrefixLen) + content`。
|
|
719
|
-
* 🔴 **单位 = JS 字符串长度(UTF-16 代码单元),不是 UTF-8 字节**(按字节截会在非 ASCII 正文上
|
|
720
|
-
* 截错位置,凭据会原样留在屏上);🔴 **也不是「几条消息」**(本包会把上一段的定稿与这一段的
|
|
721
|
-
* 半截合并进同一条消息);
|
|
722
|
-
* 🔴 按**增量拼文**计长,不是 `content` 上的偏移量(见义务 ①)。
|
|
723
|
-
*/
|
|
724
175
|
committedPrefixLen?: number;
|
|
725
|
-
/**
|
|
726
|
-
* **段身份**(CC-01,0.68.2)—— 与本段已过境的 committed assistant 文本行顶层 `_sema_segment_id`
|
|
727
|
-
* **同值**(本包在 `adapt()` 出口盖;语义与铸法见 `SEMA_SEGMENT_ID_KEY` 头注)。
|
|
728
|
-
* 🔴 宿主按 {@link TextSegmentEndChromeEvent.committedPrefixLen} 换掉已提交那一截时,认行的钥匙是
|
|
729
|
-
* **两把**:行 `uuid` ∧ 行上的段身份 === 本键(按字节相等找行会被同后缀的独立行冒充)。
|
|
730
|
-
* 恒在场(本包每条 leader 段边界都带);它**不是** wire 键 —— `eventId` 才是引擎铸的事件身份。
|
|
731
|
-
*/
|
|
732
176
|
segmentId: string;
|
|
733
|
-
/**
|
|
734
|
-
* CC-16(0.71.0):本段身份窗口里、段边界**之前**已提交的文本行 uuid(按序;与 `ThinkingSegmentEndChromeEvent.committedUuids`
|
|
735
|
-
* 同律)。`[]` = 本包判定本窗口零已提交行(在场但空);整键缺席 = 本包零经手(形 f),说不出。
|
|
736
|
-
* 端义务:`committedPrefixDiverged` ⇒ **按 {@link committedRows} 逐行写回**(包已算好每行最终正文;别拿 `content` 整行换首行);
|
|
737
|
-
* 不再自己数窗口里过境的行、不再对多行段整发放弃。常态段的定稿行在轮换之后才提交 ⇒ 不在列(它的正文已是权威)。
|
|
738
|
-
*/
|
|
739
177
|
committedUuids?: readonly string[];
|
|
740
|
-
/** 末条兼容位;零行时缺席。 */
|
|
741
178
|
committedUuid?: string;
|
|
742
|
-
/**
|
|
743
|
-
* CC-16(0.71.0):端要**写回**的最终正文,按行(与 `committedUuids` 同序)。只在 `committedPrefixDiverged` ∧ 本窗口有已提交行时在场:
|
|
744
|
-
* 首行 = 前段定稿前缀 + `content`,其余行 `''`。🔴 端按行写、零算术 —— 别自己拿 `content` 整行换首行:提交行可能是
|
|
745
|
-
* 「上一段已封存的定稿 + 本段那截」一条(封存只换字节不切消息),整行换会把上一段的权威正文一起删。
|
|
746
|
-
*/
|
|
747
179
|
committedRows?: readonly TextSegmentCommittedRow[];
|
|
748
|
-
/** core 铸的事件身份(uuidv7 形);wire 未必带 ⇒ 缺席时本键不在场。 */
|
|
749
180
|
eventId?: string;
|
|
750
181
|
}
|
|
751
|
-
/**
|
|
752
|
-
* {@link ChromeEvent} 的 `thinking_segment_end` 臂(CC-02,0.68.3;server ≥7.77.0 S-310 `reasoning_end`,
|
|
753
|
-
* sdk ≥9.4.0 `SegmentEndFields` 与 `text_end` 单源)——「**引擎明报:一段推理到此为止,这是它的权威全文**」。
|
|
754
|
-
*
|
|
755
|
-
* ── 与 `text_segment_end` 同一句消费律(sdk 顶注逐字:一个 wire 概念一份形,读法只学一次)────────
|
|
756
|
-
* `reasoning_delta` 逐 chunk 脱敏对**跨 chunk** 的凭据形无能为力,只有整段看得见 ⇒ `content` 是经与
|
|
757
|
-
* `text_end` / `result` **同一只**脱敏器的段权威全文,**可以**与活体增量的拼接不相等。本包在臂上做
|
|
758
|
-
* **整段替换**(思考缓冲 + 活体尾巴),三个 additive 键与 `text_segment_end` **同名同律**(never-false)。
|
|
759
|
-
*
|
|
760
|
-
* ── 与散文段的一处结构差(读这一条再接)──────────────────────────────────────────────────────
|
|
761
|
-
* 思考块**没有 idle-flush**:本包只在三处正常边界提交它(思考→回答边界 / 工具卡前 / turn 收口),
|
|
762
|
-
* 提交是**整块**的 ⇒ 「已提交前缀」在思考面上是**全有或全无**:`committedPrefixDiverged` 在场时,
|
|
763
|
-
* `committedPrefixLen` 恒 = 那条已 committed 思考行的全文长度,而且本臂**多带一把钥匙**
|
|
764
|
-
* {@link ThinkingSegmentEndChromeEvent.committedUuid}(那条行的 `uuid`,本包铸的)—— 思考行**不盖**
|
|
765
|
-
* `_sema_segment_id`(CC-01 只盖文本行,刻意),宿主认行用这把 uuid 就够了(整块换,不切片)。
|
|
766
|
-
*
|
|
767
|
-
* ── 🔴 宿主消费义务(与 `text_segment_end` 逐条同形)─────────────────────────────────────────
|
|
768
|
-
* ① `diverged` 在场 ⇒ **自己拼 `stream_delta{channel:'thinking'}` 上屏**的端按 `content` 重渲该块;
|
|
769
|
-
* 只渲 transcript 平面的端零改动(包已把权威全文换进思考缓冲,下一次提交交的就是它)。
|
|
770
|
-
* ② `committedPrefixDiverged` 在场 ⇒ **所有端都要做**:那条已 committed 的思考行(`uuid === committedUuid`)
|
|
771
|
-
* 是过期的,整块换成 `content`;本包在这一形上**一个字节都不再交**(再交一条 = 同一段推理上屏两遍)。
|
|
772
|
-
* ③ 三键全缺席 ⇒ 照旧只当对账/定界,拿 `content` 再渲一行 = 同一段上屏两遍。
|
|
773
|
-
* ④ 缺席 ≠ 段没结束:只有会报块结束的引擎才发它;按整条流判有没有边界帧。
|
|
774
|
-
*/
|
|
775
|
-
/**
|
|
776
|
-
* CC-08(0.71.0;sdk 9.6.0 `tool_disclosure`,core design/393 S3 第二缝):这条腿的工具**名字占位普查**。
|
|
777
|
-
* additive 臂(`required: false`):不接 = 看不见普查,不属「已发生的行为丢失」。
|
|
778
|
-
*/
|
|
779
|
-
/**
|
|
780
|
-
* CC-08 ①(0.71.0;sdk `tool_roster_delta`,server ≥7.70.0 LIVE only):运行期工具名册**增量**。收到 = 收到一份完整名册
|
|
781
|
-
* (server 判不出形整帧不发);`fromDigest` 对不上不是拒绝,记 skew 后整只替换;durable/resume 不落账 ⇒ 重连按
|
|
782
|
-
* `wiring_manifest.tools` 快照重同步。additive 臂(`required: false`)。
|
|
783
|
-
*/
|
|
784
182
|
export interface ToolRosterDeltaChromeEvent {
|
|
785
183
|
kind: 'tool_roster_delta';
|
|
786
184
|
laneProof: LaneProof;
|
|
787
|
-
/** 已窄读的增量;宿主拿它喂 `applyToolRosterDelta`(与手上名册比 digest)。 */
|
|
788
185
|
delta: ToolRosterDeltaView;
|
|
789
186
|
eventId?: string;
|
|
790
187
|
}
|
|
791
|
-
/**
|
|
792
|
-
* CC-08 ③(0.71.0;sdk `context_usage` + `sections` core 7.18.0 #790):每个压缩边界报一次,宿主按**最后一条**取当前值。
|
|
793
|
-
* 🔴 `usedTokens > compactAtTokens` 就是引擎自己喂 shouldCompact 的谓词,别重算;`windowTokens` 是 autocompact 窗不是模型上下文大小;
|
|
794
|
-
* 🔴 `sections[].tokens` 与 `usedTokens` **不是同一坐标系,禁相减**、禁拿一段比 `compactAtTokens`;`sections` 整键缺席 = 这条腿没装配出段 IR,不是各段为零。
|
|
795
|
-
*/
|
|
796
188
|
export interface ContextUsageChromeEvent {
|
|
797
189
|
kind: 'context_usage';
|
|
798
190
|
laneProof: LaneProof;
|
|
@@ -802,13 +194,6 @@ export interface ContextUsageChromeEvent {
|
|
|
802
194
|
sections?: readonly ContextUsageSectionView[];
|
|
803
195
|
eventId?: string;
|
|
804
196
|
}
|
|
805
|
-
/**
|
|
806
|
-
* CC-89(0.75.0;sdk `compaction_outcome`):一次压缩的**非 compacted 结局**(例:被任务终态抢先而作废、熔断开着而失败)。
|
|
807
|
-
* 成功压缩不走本臂 —— 那条的权威仍是转录里的 `compact_boundary`。
|
|
808
|
-
* 🔴 `outcome` / `trigger` 是引擎**开集**原词(已知 `trigger`:`auto` / `manual` / `forced`),按成员渲染时必须带 default 臂,认不得的词照原词显示,别丢帧;
|
|
809
|
-
* 🔴 本臂**不是终态**:任务还在跑,别据它收 spinner / 判 run 结束;`reason` 是引擎说明文本(上游已脱敏),渲前仍按宿主自己的不可信文本纪律处理。
|
|
810
|
-
* `laneProof.lane === 'subagent'` = 这是某只子代的压缩结局,别渲成主会话的。缺席键 = 引擎没说,不是空值。
|
|
811
|
-
*/
|
|
812
197
|
export interface CompactionOutcomeChromeEvent {
|
|
813
198
|
kind: 'compaction_outcome';
|
|
814
199
|
laneProof: LaneProof;
|
|
@@ -817,320 +202,107 @@ export interface CompactionOutcomeChromeEvent {
|
|
|
817
202
|
reason?: string;
|
|
818
203
|
eventId?: string;
|
|
819
204
|
}
|
|
820
|
-
/**
|
|
821
|
-
* CC-91(0.76.0;sdk `prompt_assembled` = `{type} & PromptManifest`):**这一次 prepare 的提示词装配清单** ——
|
|
822
|
-
* 系统提示词由哪些段 / 块组成、每段多大、这一腿挂了哪些工具。durable 腿的台账帧。
|
|
823
|
-
*
|
|
824
|
-
* 🔴 **没有 `tokens`,只有 `chars`** —— 上游真字节里就没有 token 位(core `prompt.assembled` 的 sections 是
|
|
825
|
-
* `chars`,server 的白名单投影逐字段同形)。本包**刻意不铸** `tokens`:`chars / 系数` 是编的,不是真值。
|
|
826
|
-
* 要引擎自己的 token 估算去读 {@link ContextUsageChromeEvent} 的 `sections[].tokens`(引擎就是拿同一份
|
|
827
|
-
* `chars` 估的)。🔴 **这条 join 只在两面的 `sections` 都在场时成立**(同一张 v2 段 id 词表):`context_usage`
|
|
828
|
-
* 那一面的段视图也是从同一份 manifest 段列投影的,manifest 没有段列时它同样缺席 ⇒ **v1-only 腿上没有这条 join**,
|
|
829
|
-
* 那时别拿 `blocks` 当 `sections` 的同名替代(见下,两张词表不同)。
|
|
830
|
-
* 🔴 **`chars` 与 `context_usage.usedTokens` 禁相减**(两个量纲不是一条账,且 chars ≠ tokens 更差一层);
|
|
831
|
-
* `Σ chars` 也不构成「提示词占了窗口多少」——那句话只能由 `context_usage` 那一帧回答。
|
|
832
|
-
* 🔴 **一次任务可能多条**(cascade / verify 的每一 rung、resume 腿各自 re-prepare,server 逐条保序落账)⇒
|
|
833
|
-
* 本包每一条都交出去、**不去重**;要「当前组成」的宿主按**最后一条**取(与 `context_usage` 同律)。
|
|
834
|
-
* 🔴 `sections[].id` 与 `blocks[].id` 是**两张不同的词表**,不要混着分组:
|
|
835
|
-
* · `sections[].id` = core pack 的**段** id(`core/<slot>.<name>` 命名空间,例 `core/role.base` / `core/harness.head`);
|
|
836
|
-
* · `blocks[].id` = v1 的**带标签块** id(`role.base` / `harness.context` / `env.context` / `memory.tail` …),
|
|
837
|
-
* 而且是**多对一**:多个段可以折进同一个块 ⇒ 块不是段的另一种写法,两面的行数与粒度都可以不同。
|
|
838
|
-
* ⚠️ 两张词表**没有命名空间隔离的保证**(块 id 不带前缀、operator 声明的段 id 是自由串,理论上能撞同名)⇒
|
|
839
|
-
* **按面各自分组**,别靠 id 形状判断自己在哪一面,更别拿块 id 去 join `context_usage` 的段面。
|
|
840
|
-
* 两张词表都是引擎**开集**原词:按成员渲染必须带 default 臂,认不得的原词照显示;**别**假定任何固定的分类闭集,
|
|
841
|
-
* 也别把某一类的缺席读成「那一类是零」(见下)。
|
|
842
|
-
* ⚠️ **这一面没有工具尺寸**:`tools[]` 只有名字,「工具 schema 占了多少」在这条 wire 上读不出来。
|
|
843
|
-
* 🔴 **缺席只说「本事件没有可读的这一面」,不是一句关于引擎的诊断**:上游整键缺席、发了空数组、逐行滤完只剩空
|
|
844
|
-
* 三种情形在本臂上**同形**(都折成键缺席)⇒ 看到 `sections` / `tools` / `blocks` 不在场,**不许**据此渲
|
|
845
|
-
* 「这个 provider 交的是不透明提示词」「这一腿没挂工具」之类的结论 —— 那需要别的独立证据。
|
|
846
|
-
* ⚠️ `sections[].slot` 是**语义槽**(`identity` / `security` / `harness` / `discovery` / `memory` …,开集),逐字沿用上游键名 ——
|
|
847
|
-
* 同一件事在 {@link ContextUsageChromeEvent} 的 `sections[].kind` 上叫 `kind`,两面各跟自己的上游,别指望同名。
|
|
848
|
-
* ⚠️ **skills 清单不在这一面**:core 已把它移出稳定前缀(观测口是 `steering_injected{source:"skills_listing"}`)⇒
|
|
849
|
-
* 清单里找不到 skills **不是**「skills 是 0」。
|
|
850
|
-
* ⚠️ `hash` / `contentHash` 等对账锚、以及帧上的 `constitution`(谁拥有宪法层)本包**不过境** —— 前者进程加盐跨重启不可比,后者今天零消费场景
|
|
851
|
-
* (每个上公面的键都是一条要长期兑现的契约:additive 键晚加不破坏、早加删不掉)。要它们按表态制另提需求。
|
|
852
|
-
* 🔴 本臂**不是终态**、也不是一条转录消息(转录面零行);`laneProof.lane === 'subagent'` = 某只子代这一腿的清单
|
|
853
|
-
* (server 今天的登记闸只登记 top-level run,所以这一支是防御性的,不是常态),别渲成主会话的。
|
|
854
|
-
*/
|
|
855
205
|
export interface PromptAssembledChromeEvent {
|
|
856
206
|
kind: 'prompt_assembled';
|
|
857
207
|
laneProof: LaneProof;
|
|
858
|
-
/** 整条提示词的渲染字符数。缺席 = 没报,**不是 0**。 */
|
|
859
208
|
totalChars?: number;
|
|
860
|
-
/** v1 面:带标签块(`role.base` / `harness.context` / …;与 `sections[].id` **不是同一张词表**,且段→块可多对一)。
|
|
861
|
-
* 缺席 = 本事件没有可读的块视图(上游缺席 / 空数组 / 逐行滤光三者同形),**不是**「没有块」。 */
|
|
862
209
|
blocks?: readonly PromptManifestBlockView[];
|
|
863
|
-
/** v2 面:编译 IR 的逐段视图。🔴 整键缺席 = **本事件没有可读的段视图**(上游整键缺席 / 空数组 / 逐行滤光同形),
|
|
864
|
-
* **不是**各段为零、也**不能**反推「引擎没装配出段 IR」(那是上游缺席那一支的成因之一,本面分不出是哪一支)。 */
|
|
865
210
|
sections?: readonly PromptManifestSectionView[];
|
|
866
|
-
/** v2 面:这一腿挂载的工具名(MCP 类按名字前缀分组渲染靠它)。缺席 = 本事件没有可读的工具视图(三支同形),
|
|
867
|
-
* **不是**「没挂工具」、更不是「工具占 0」(这一面本来就没有尺寸位)。 */
|
|
868
211
|
tools?: readonly PromptManifestToolView[];
|
|
869
212
|
eventId?: string;
|
|
870
213
|
}
|
|
871
214
|
export interface ToolDisclosureChromeEvent {
|
|
872
215
|
kind: 'tool_disclosure';
|
|
873
216
|
laneProof: LaneProof;
|
|
874
|
-
/** 哪条策略判的:core 闭三词 `always` / `never` / `auto`,**按开集读**(core 加一档要能穿过你的 default 臂)。 */
|
|
875
217
|
policy: string;
|
|
876
|
-
/** `auto` 档下候选集必须够到的窗口百分比。🔴 缺席 = 两档下根本没查过阈值,**不是**默认百分比。 */
|
|
877
218
|
thresholdPercent?: number;
|
|
878
|
-
/** 这条腿上每一个以名字占位的工具名(prepare 期冻结,已排序)。**全量快照:整只替换**;`[]` = 普查坏到只剩空壳。 */
|
|
879
219
|
deferred: readonly string[];
|
|
880
|
-
/** 此刻已被激活的延迟工具名(引擎当下状态;已排序;恒 ⊆ deferred)。**全量快照:整只替换**。 */
|
|
881
220
|
activated: readonly string[];
|
|
882
|
-
/** core 铸的事件身份;wire 未必带 ⇒ 缺席时本键不在场。 */
|
|
883
221
|
eventId?: string;
|
|
884
222
|
}
|
|
885
|
-
/**
|
|
886
|
-
* CC-08(0.71.0;sdk 9.6.0 `tool_progress`;DV-741 clay C-R50 裁「一帧两拍」入 divergence 册,本包按裁定形投):
|
|
887
|
-
* 一只**仍在跑**的工具调用的进度 tick。Bash 类每 ≥1 s 一拍带输出尾巴三键;其他工具 30 s 一拍只带 `elapsedSeconds`。
|
|
888
|
-
* additive 臂(`required: false`)。
|
|
889
|
-
*/
|
|
890
223
|
export interface ToolProgressChromeEvent {
|
|
891
224
|
kind: 'tool_progress';
|
|
892
225
|
laneProof: LaneProof;
|
|
893
|
-
/** 与它自己的 `tool_start` / `tool_end` join 得上的 id。 */
|
|
894
226
|
toolCallId: string;
|
|
895
|
-
/** `tool_start` 的值逐字同源。 */
|
|
896
227
|
toolName: string;
|
|
897
|
-
/** 已经跑了多少整秒(向下取整、跨帧单调、一次调用一个原点)。🔴 **缺席不是 0**;🔴 不等于 `tool_end` 的 duration。 */
|
|
898
228
|
elapsedSeconds?: number;
|
|
899
|
-
/** 命令至今写出来的尾巴(stdout/stderr 交错,引擎按尾部行数封顶)—— 一块活面板,不是日志。
|
|
900
|
-
* 🔴 **UNTRUSTED RAW**(与 `tool_end.output` 同类;server 已脱敏一次):宿主可再封顶展示,**绝不**回喂模型。 */
|
|
901
229
|
output?: string;
|
|
902
|
-
/** 至今观察到的换行数(≥ 尾巴自己的行数)。只在 `output` 在场时铸。 */
|
|
903
230
|
totalLines?: number;
|
|
904
|
-
/** 至今观察到的字节数(尾巴封顶之前计)。只在 `output` 在场时铸。 */
|
|
905
231
|
totalBytes?: number;
|
|
906
|
-
/** core 铸的事件身份;wire 未必带 ⇒ 缺席时本键不在场。 */
|
|
907
232
|
eventId?: string;
|
|
908
233
|
}
|
|
909
234
|
export interface ThinkingSegmentEndChromeEvent {
|
|
910
235
|
kind: 'thinking_segment_end';
|
|
911
236
|
laneProof: LaneProof;
|
|
912
|
-
/** 该段推理的**权威全文**(server ≥7.77.0 经脱敏器;可以与活体增量拼接不相等)。读法见义务 ①③。 */
|
|
913
237
|
content: string;
|
|
914
|
-
/** 活体面那份过期了(never false)。 */
|
|
915
238
|
diverged?: true;
|
|
916
|
-
/** 已 committed 的那条思考行过期了(never false)⇒ 整块换,本包不再交字节。 */
|
|
917
239
|
committedPrefixDiverged?: true;
|
|
918
|
-
/** 已 committed 思考行的全文长度(UTF-16 代码单元;never 0)—— 思考面上恒 = 整块。 */
|
|
919
240
|
committedPrefixLen?: number;
|
|
920
|
-
/** 有已提交思考行时在场:**末条**行的 `uuid`(0.69.0 兼容位;整段归属看 {@link committedUuids})。 */
|
|
921
241
|
committedUuid?: string;
|
|
922
|
-
/**
|
|
923
|
-
* CC-11(0.69.1):有已提交思考行时在场 —— 段内**全部**已提交行的 `uuid`,按提交序(一段推理跨工具卡时多条)。
|
|
924
|
-
* 🔴 `committedPrefixDiverged` 在场 ⇒ 宿主把首行就地换成 `content`,其余行**删除或清空其推理正文**(宿主按自身转录结构选:
|
|
925
|
-
* 有父链 / 压缩段依赖的转录**清空优于删**,保行身份、父链与压缩元数据;安全目标 = 未脱敏字节零留盘;整段换,不切片);
|
|
926
|
-
* 缺席(`committedPrefixDiverged` 缺席)⇒ 这些行照旧,本包只换了还押着的后段(或零字节)。
|
|
927
|
-
*/
|
|
928
|
-
/** CC-11 段内全部已提交思考行 uuid(按序);CC-15(0.69.3):形 (a) 为 `[]`(在场但空 = 本包判定本段零已提交行),形 (f) 零经手才整键缺席。 */
|
|
929
242
|
committedUuids?: readonly string[];
|
|
930
|
-
/** core 铸的事件身份(uuidv7 形);wire 未必带 ⇒ 缺席时本键不在场。 */
|
|
931
243
|
eventId?: string;
|
|
932
244
|
}
|
|
933
|
-
/**
|
|
934
|
-
* {@link ChromeEvent} 的 `approval_request` 臂(B-078 / L-208,0.65.0;design/172 流内审批协议,
|
|
935
|
-
* server ≥7.3.0、7.5.0 起默认开)——「**引擎在这条流上呈了一张审批卡**」。
|
|
936
|
-
*
|
|
937
|
-
* ── 为什么 0.65.0 才有它(归层修,不是新功能)──────────────────────────────────────────────
|
|
938
|
-
* 本臂之前,标准管线对 `approval_request` / `approval_revoke` 两帧的处置是
|
|
939
|
-
* `dropped('unsupported_arm')` —— 有痕,但**包内零消费口**。壳(cli)于是在自己的
|
|
940
|
-
* `approvalStreamWire.ts` 里单独接了这两帧,而 desktop / web **只走包管线** ⇒ 它们
|
|
941
|
-
* ①开流 preamble 恢复不了 pending 卡集、②收到撤卡帧后本地卡不清。同一条 wire 上的同一件事,
|
|
942
|
-
* 一个端有、两个端没有 —— 那正是归层要根治的形(判定归包、呈现归端)。
|
|
943
|
-
* ⇒ 本臂把两帧**送到宿主手上**;卡的呈现与决断仍归端。
|
|
944
|
-
*
|
|
945
|
-
* ── 🔴 载荷是**信封**,不是 v1 卡(sdk 的顶注当场挡下来的那条)──────────────────────────────
|
|
946
|
-
* sdk `AgentEvent` 的这一臂声明成 {@link "@sema-agent/sdk".ApprovalFrameEnvelope}(`type` +
|
|
947
|
-
* `schemaVersion: number` + 开集键),**刻意不是** `ApprovalRequestFrame`(那只型的判别位是
|
|
948
|
-
* `schemaVersion: 1` + `kind: "permission"` 两个字面量)。理由 sdk events.d.ts:961-968 逐字:
|
|
949
|
-
* SSE 解析腿只做 `JSON.parse(...) as AgentEvent`、**不跑**谓词,若臂直接窄化到 v1,一条
|
|
950
|
-
* `schemaVersion: 2` 的合法帧会被类型系统当成 v1 端上来,消费端于是心安理得地去取
|
|
951
|
-
* `card.risk.requiresRealApproval` —— 而未知版本的卡根本不保证有这些键。
|
|
952
|
-
* ⇒ 本臂**原样窄读**:只保证 `frame` 是一只对象、`schemaVersion` 是一个数;**不替宿主窄化**。
|
|
953
|
-
*
|
|
954
|
-
* ── 🔴 宿主消费义务(不实现 = 这一面在该宿主上是哑的)────────────────────────────────────────
|
|
955
|
-
* ① 用 sdk 的 {@link "@sema-agent/sdk".isApprovalRequestFrameV1} 窄化 `frame` 才能拿
|
|
956
|
-
* `card` / `askId` / 窗三键;**窄不下来 ⇒ 呈通用卡(安全元数据 + 人工 approve/deny),
|
|
957
|
-
* 🔴 永不 auto-deny**(design/172 §3.1)。
|
|
958
|
-
* ② 按 `approvalId` 与 legacy `tool_approval` 帧**去重**:开关打开时同一只 ask 出两帧
|
|
959
|
-
* (顺序钉死「先 legacy、后本帧」,两帧同带 `approvalId`),优先渲本帧。
|
|
960
|
-
* ③ 🔴 **账本里重放的历史帧只用于时间线渲染,不是卡集基准**(它带的 `expiresInMs` 是铸帧时刻的
|
|
961
|
-
* 旧值)——卡集的**全量对账基准是开流 preamble**(sdk events.d.ts:974-975 逐字)。
|
|
962
|
-
* ④ `card` 的散文位(`message` / `args`)是**模型/工具产文**:只渲染,**永不回喂模型**。
|
|
963
|
-
*/
|
|
964
245
|
export interface ApprovalRequestChromeEvent {
|
|
965
246
|
kind: 'approval_request';
|
|
966
247
|
laneProof: LaneProof;
|
|
967
|
-
/**
|
|
968
|
-
* 帧**原样**(信封视角)。🔴 本包不替宿主窄化到 v1,也不摘键重铸 —— 摘键就是在包里立第二份
|
|
969
|
-
* 卡形台账,而未知 `schemaVersion` 的帧上那些键根本不保证在。
|
|
970
|
-
*/
|
|
971
248
|
frame: unknown;
|
|
972
|
-
/** 信封上的 `schemaVersion`(窄读保证是一个有限数);`!== 1` ⇒ 宿主走通用卡腿。 */
|
|
973
249
|
schemaVersion: number;
|
|
974
250
|
}
|
|
975
|
-
/**
|
|
976
|
-
* {@link ChromeEvent} 的 `approval_revoke` 臂(B-078 / L-208,0.65.0;design/172 §3.3 批级撤卡帧,
|
|
977
|
-
* [5924]/S-58,server ≥7.55.0 起也进 durable 账本)——「**这一批卡不该再被决断了**」。
|
|
978
|
-
*
|
|
979
|
-
* 与 {@link ApprovalRequestChromeEvent} **同源同纪律**(载荷同是信封;窄化谓词是
|
|
980
|
-
* {@link "@sema-agent/sdk".isApprovalRevokeFrameV1},窄不下来按通用撤卡处理:**该批本地卡照清**)。
|
|
981
|
-
*
|
|
982
|
-
* ── 🔴 宿主消费义务(sdk events.d.ts:986-988 的三纪律,逐条搬来)────────────────────────────
|
|
983
|
-
* ① **按 `taskId` 归属/过滤**(server ≥7.55.0 恒带):分发集合是 broker 的 session 形,晚入集合的
|
|
984
|
-
* run 账本里可以出现**无配对卡帧的孤儿撤帧行** —— 非我即忽略;
|
|
985
|
-
* ② **账本重放的撤帧只用于时间线渲染**,卡集对账基准恒为开流 preamble(撤帧**可能整帧丢失** ——
|
|
986
|
-
* 帧是通知,行才是真源);
|
|
987
|
-
* ③ 已 `DECIDED` 的兄弟**不在** `askIds` 里(决议已被接受,不受撤卡影响)。
|
|
988
|
-
* 🔴 清卡时要给用户**一行归因**(`reason` 是引擎生成文本,消毒后呈现):一张卡凭空消失比一条
|
|
989
|
-
* 「引擎撤回了这张卡」更坏 —— 用户对前者没有任何线索。零命中时**不要**多说那一行
|
|
990
|
-
* (headless 车道自动拒的卡从没呈现过,对它归因是凭空多说一句话)。
|
|
991
|
-
*/
|
|
992
251
|
export interface ApprovalRevokeChromeEvent {
|
|
993
252
|
kind: 'approval_revoke';
|
|
994
253
|
laneProof: LaneProof;
|
|
995
|
-
/** 帧**原样**(信封视角);窄化归宿主,理由与呈卡臂逐字相同。 */
|
|
996
254
|
frame: unknown;
|
|
997
|
-
/** 信封上的 `schemaVersion`(窄读保证是一个有限数);`!== 1` ⇒ 宿主走通用撤卡腿。 */
|
|
998
255
|
schemaVersion: number;
|
|
999
256
|
}
|
|
1000
|
-
/**
|
|
1001
|
-
* {@link ChromeEvent} 的 `result_text_diverged` 臂(0.62.0)——「**终帧正文与已上屏的正文对不上**」。
|
|
1002
|
-
*
|
|
1003
|
-
* 什么时候会有:一个 turn 的正文正常是**流着上屏**的,终帧带的那份是同一段话的全文,两者恒相等
|
|
1004
|
-
* (或终帧那份是已上屏的**延长**——断线期间模型接着说完了,那一截由库补吐一发)。本臂只在第三种
|
|
1005
|
-
* 情形发出:两份**互相都不是对方的前缀** —— 即终帧说的话与屏上那段**从某处起就分了岔**。
|
|
1006
|
-
*
|
|
1007
|
-
* 🔴 **库刻意什么都不补吐**:两份对不上时,谁才算数**只有引擎说得清**;把终帧那份接在屏上已有
|
|
1008
|
-
* 那段后面,会拼出一段**谁都没说过**的话(前半是流式的、后半是另一版的),那比缺一截更坏。
|
|
1009
|
-
* 🔴 **宿主消费义务**(可选、fail-soft):把这一拍的转录行**改口** —— 一句诚实的「这一轮的最终
|
|
1010
|
-
* 答复与上面流式显示的内容不一致」,而不是让用户以为屏上那段就是最终答复。不接本臂 = 用户
|
|
1011
|
-
* 看不到这条披露(不是报错),但**绝不许**把它渲成「已完成」的正面确认。
|
|
1012
|
-
* 🔴 两个数是**长度**不是内容:本臂不复述任何一份正文(屏上那份宿主自己有,终帧那份在 result 帧上),
|
|
1013
|
-
* 复述一遍只会给渲染端第三个版本去挑。
|
|
1014
|
-
*/
|
|
1015
257
|
export interface ResultTextDivergedChromeEvent {
|
|
1016
258
|
kind: 'result_text_diverged';
|
|
1017
259
|
laneProof: LaneProof;
|
|
1018
|
-
/** 本 turn 已经**提交上屏**的 assistant 正文长度(UTF-16 单元)。 */
|
|
1019
260
|
committedLength: number;
|
|
1020
|
-
/** 终帧 `result` 那份正文的长度(UTF-16 单元)。 */
|
|
1021
261
|
resultLength: number;
|
|
1022
262
|
}
|
|
1023
|
-
/**
|
|
1024
|
-
* {@link ChromeEvent} 的 `engine_notice` 臂(#310 / #318 件①,server ≥7.36;契约 = server
|
|
1025
|
-
* `ASSISTANT-WIRE-CONTRACT` 附录 D)——「**引擎想让这条会话的人知道一件事**」。
|
|
1026
|
-
*
|
|
1027
|
-
* 为什么**不走 `attachment` 臂**(与 `human_input` 同因):attachment 三条是要在转录流里渲一行的
|
|
1028
|
-
* 东西,而通告是**会话级披露**、且 live/durable 两腿都会到(重放会再看到)⇒ 它需要一个带幂等键、
|
|
1029
|
-
* 带结构化事实的独立臂,塞进 attachment 会逼消费端从一行文案里反解 code。
|
|
1030
|
-
*
|
|
1031
|
-
* 🔴 **宿主消费义务**(全部可选、fail-soft;本臂存在的第一价值 = 帧不再落 `unknown_arm` 被丢弃):
|
|
1032
|
-
* ① **按 `code` + `detail` 渲染,`message` 只作 fallback**。core 明写
|
|
1033
|
-
* `memory.session_polluted` 的 message 随 `memoryProvenance` 模式变文 ⇒ **按 message 文本匹配必碎**。
|
|
1034
|
-
* ② **`code` 是开集,认不得也不许丢**:认得的码渲专用呈现,认不得的码用 `message` 兜底展示。
|
|
1035
|
-
* 库侧**一个码都不硬编**,所以「认不认得」这张表由渲染面自己持有 —— 但它只能决定**怎么渲**,
|
|
1036
|
-
* 不能决定**渲不渲**。
|
|
1037
|
-
* ③ **幂等消费**:durable 腿重放会再送同一条(与 `workspace_changed` 同纪律),按 `eventId`
|
|
1038
|
-
* (在场时)或 `code+ts` 去重,别按到达次数计数。
|
|
1039
|
-
* ④ 🔴 `memory.harvest_quarantined` 的 `moved` 与 `escalated` **不可相减**(就地墓碑同时计入两者,
|
|
1040
|
-
* core 顶注)—— 两个数各自读、并列呈现,任何减法都会得出一个不存在的量。
|
|
1041
|
-
* ⑤ 🔴 **缺席不可反推**:server 对非白名单码 / 缺 `sessionId` 的通告**如实不投**(宁缺席不串台),
|
|
1042
|
-
* 全族那一份只在 server 的运维日志里。所以「没收到通告」**不等于**「没发生」,渲染面不许把
|
|
1043
|
-
* 本臂的缺席说成「一切正常」。
|
|
1044
|
-
* 缺席(宿主不接本臂)= 引擎的这类披露在该宿主上看不见,**不是**报错。
|
|
1045
|
-
*/
|
|
1046
263
|
export interface EngineNoticeChromeEvent {
|
|
1047
264
|
kind: 'engine_notice';
|
|
1048
265
|
laneProof: LaneProof;
|
|
1049
|
-
/** 稳定机器码,点分命名空间(`memory.session_polluted` …)。**开集**——见臂注 ②。 */
|
|
1050
266
|
code: string;
|
|
1051
|
-
/** core 铸的人话行。🔴 **仅 fallback 展示,不是匹配键**;wire 上非串时本位是空串。 */
|
|
1052
267
|
message: string;
|
|
1053
|
-
/** 机器可读事实(逐码不同,开集)。server 已脱敏 + 尺寸 bound,**仍按外部串处理**。 */
|
|
1054
268
|
detail: Record<string, unknown>;
|
|
1055
|
-
/** 归属会话(server 从 `detail` 提升为顶层)。畸形/缺席 ⇒ 本键不在场。 */
|
|
1056
269
|
sessionId?: string;
|
|
1057
|
-
/** **server 观察时刻**(ms epoch),**不是**引擎铸造时刻 —— `EngineNotice` 自身不带时间戳。 */
|
|
1058
270
|
ts?: number;
|
|
1059
|
-
/** durable 重放的稳定身份键 —— **core 铸的事件身份**(uuidv7 形)。wire 今天未必带。 */
|
|
1060
271
|
eventId?: string;
|
|
1061
|
-
/**
|
|
1062
|
-
* durable 重放的**第二层**身份 —— SDK 从 SSE `id:` 字段 stamp 上来的 per-task 序号
|
|
1063
|
-
* (= `task_event.seq`)。对「同一条账本行」稳定,重放会带同一个值。
|
|
1064
|
-
* 🔴 与 {@link EngineNoticeChromeEvent.eventId} 是**两个命名空间**(全局身份 vs per-task 序号),
|
|
1065
|
-
* 绝不互相顶替。消费端幂等序:`eventId` > `eventSeq` > 两者都缺才退 `code+ts`
|
|
1066
|
-
* (最后那一档是有损的:`ts` 是 server 观察时刻(ms),同毫秒同码的两条会被折成一条)。
|
|
1067
|
-
*/
|
|
1068
272
|
eventSeq?: string;
|
|
1069
273
|
}
|
|
1070
|
-
/**
|
|
1071
|
-
* `human_input` 臂的署名(core `ActorAssertion` 的投影;server 已 redact 后上帧)。
|
|
1072
|
-
* 🔴 `hostAsserted` 是消费端**唯一**能判「这个署名可信吗」的位 —— 渲 `id` 而不渲它,
|
|
1073
|
-
* 等于把一个未经验证的名字渲成可信的。
|
|
1074
|
-
*/
|
|
1075
274
|
export interface HumanInputActor {
|
|
1076
275
|
id?: string;
|
|
1077
276
|
hostAsserted?: boolean;
|
|
1078
277
|
issuer?: string;
|
|
1079
278
|
}
|
|
1080
|
-
/** {@link ChromeEvent} 的 `human_input` 臂(具名:本仓 typeshape 门对内联匿名形有棘轮)。 */
|
|
1081
279
|
export interface HumanInputChromeEvent {
|
|
1082
280
|
kind: 'human_input';
|
|
1083
281
|
laneProof: LaneProof;
|
|
1084
|
-
/** 载体:objective / steer / next_turn / parked_steer / wake …(core 开集,原样透传)。 */
|
|
1085
282
|
carrier: string;
|
|
1086
283
|
inputId?: string;
|
|
1087
284
|
sessionSeq?: number;
|
|
1088
|
-
/** 入口来源(oa / cc-mcp / portal …)。 */
|
|
1089
285
|
source?: string;
|
|
1090
286
|
delivery?: string;
|
|
1091
|
-
/** 宿主从入口凭据派生的身份串(server 已 redact)。UNTRUSTED-for-display。 */
|
|
1092
287
|
issuer?: string;
|
|
1093
288
|
actor?: HumanInputActor;
|
|
1094
289
|
entryId?: string;
|
|
1095
|
-
/** 引擎铸的**稳定事件身份** —— durable 腿按 `Last-Event-ID` 续读会重放同一条账本帧,宿主
|
|
1096
|
-
* 落审计/时间线时**按这个键幂等**(`inputId`/`entryId` 都是可选位,靠不住)。 */
|
|
1097
290
|
eventId?: string;
|
|
1098
291
|
}
|
|
1099
|
-
/** {@link ChromeEvent} 的 `message_committed` 臂(具名:本仓 typeshape 门对内联匿名形有棘轮)。 */
|
|
1100
292
|
export interface MessageCommittedChromeEvent {
|
|
1101
293
|
kind: 'message_committed';
|
|
1102
294
|
laneProof: LaneProof;
|
|
1103
|
-
/** 持久、副本稳定的会话树条目 id(uuidv7)—— 与 `compacted` 的 `firstKeptEntryId` 同一 id 空间。 */
|
|
1104
295
|
entryId: string;
|
|
1105
|
-
/** core 今天三词 `user` / `assistant` / `toolResult`,**按开集读**(上游加词照过)。 */
|
|
1106
296
|
role: string;
|
|
1107
|
-
/** 只在 `role === 'toolResult'` 腿在场:绑回已渲那张工具卡的 join 键。 */
|
|
1108
297
|
toolCallId?: string;
|
|
1109
|
-
/** 引擎铸的稳定事件身份 —— 重放同一条账本帧时宿主**按这个键幂等**。 */
|
|
1110
298
|
eventId?: string;
|
|
1111
299
|
}
|
|
1112
|
-
/** `ChromeEvent` 的判别键(臂名)—— 覆盖率断言与宿主装配自检都锚在它上。 */
|
|
1113
300
|
export type ChromeArmKind = ChromeEvent['kind'];
|
|
1114
|
-
/**
|
|
1115
|
-
* chrome 臂**覆盖率断言出口**(§8-1 裁决的一半:client-core 定接口不定实现)。
|
|
1116
|
-
*
|
|
1117
|
-
* 用途:任何宿主(TUI / web / 桌面)在自检里遍历本表,对 `required:true` 的臂断言"我实现了消费口"。
|
|
1118
|
-
* 不实现 = 该 UI 面在那个宿主上是**哑的**(不是报错,是静默没有)—— 这正是多端最容易漏的一类,
|
|
1119
|
-
* 所以把义务做成**数据**而不是散落在注释里。
|
|
1120
|
-
*
|
|
1121
|
-
* `required` 判据:**不实现会让已发生的行为丢失**(转录/模型输入/hook/去重)⇒ true;
|
|
1122
|
-
* 只影响可选装饰(spinner 计量、活体预览、chips)⇒ false。
|
|
1123
|
-
* `duty` = 一句话义务(完整义务在上方每臂的注释里,那里是真源)。
|
|
1124
|
-
*
|
|
1125
|
-
* 数组形对外形状不变(消费方逐字沿用 `CHROME_ARMS.map/find/filter`)——真源是上面
|
|
1126
|
-
* {@link CHROME_ARM_TABLE},本表只是它的 `Object.entries` 派生投影。
|
|
1127
|
-
*/
|
|
1128
301
|
export declare const CHROME_ARMS: readonly {
|
|
1129
302
|
kind: ChromeArmKind;
|
|
1130
303
|
required: boolean;
|
|
1131
304
|
duty: string;
|
|
1132
305
|
}[];
|
|
1133
|
-
/** 车道纪律一等公民([1617] 家族固化):chrome 事件构造必须携判别证明。 */
|
|
1134
306
|
export type LaneProof = {
|
|
1135
307
|
lane: 'main';
|
|
1136
308
|
} | {
|
|
@@ -1141,7 +313,6 @@ export type LaneProof = {
|
|
|
1141
313
|
via: 'workflowRunId' | 'wa-id' | 'workflow-card-parent';
|
|
1142
314
|
key: string;
|
|
1143
315
|
};
|
|
1144
|
-
/** 双平面输出。 */
|
|
1145
316
|
export type AdapterOutput = {
|
|
1146
317
|
plane: 'transcript';
|
|
1147
318
|
message: SDKMessage;
|
|
@@ -1149,16 +320,10 @@ export type AdapterOutput = {
|
|
|
1149
320
|
plane: 'chrome';
|
|
1150
321
|
event: ChromeEvent;
|
|
1151
322
|
};
|
|
1152
|
-
/** L3 适配器接口(实现分批落码;首版先出纯函数面,见 index.ts)。 */
|
|
1153
323
|
export interface WireToCcAdapter {
|
|
1154
324
|
adapt(frames: AsyncIterable<unknown>, ctx: AdapterContext): AsyncGenerator<AdapterOutput>;
|
|
1155
|
-
/** 台账序列化位(#9 定谳的工程化:重启恢复=台账加载+纯重放)。 */
|
|
1156
325
|
exportLedger(): Record<string, unknown>;
|
|
1157
326
|
}
|
|
1158
|
-
/**
|
|
1159
|
-
* transcript id 确定性派生([1653] 定案):稳定键优先序 = 帧 id > seq > toolCallId;
|
|
1160
|
-
* 全缺才用 ctx.uuid()。同流重放 ⇒ 同 id 序列(往返守卫钉此不变量)。
|
|
1161
|
-
*/
|
|
1162
327
|
export declare function deriveTranscriptId(frame: {
|
|
1163
328
|
id?: unknown;
|
|
1164
329
|
seq?: unknown;
|