@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
package/dist/seatContract.js
CHANGED
|
@@ -1,114 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* seatContract — desktop/web **座位 IPC 契约的单一真源**(design/159 B18,2026-07-29)。
|
|
3
|
-
*
|
|
4
|
-
* 搬迁前的形:同一份契约有**两份声明**,而且跨仓名字零重合 ——
|
|
5
|
-
* · `sema-desktop/src/shared/localSessions.ts` = 15 个类型 + 3 个词表常量 + 6 个校验器 + SPEC(生产端)
|
|
6
|
-
* · `sema-web-client/ui/lib/desktop/local-sessions-transport.ts` = 9 个 `Seat*` 本地重声明(消费端)
|
|
7
|
-
* 两边名字不同 ⇒ **编译器永远不会告诉你它们漂了**。实测已经漂了(见下「漂移清单」),其中
|
|
8
|
-
* `LocalSessionEvent.outcome` 那一条是真 bug:宿主发了词、消费端的镜像里根本没有这个位,
|
|
9
|
-
* 于是「拒绝 / TTL 到点 / 人点了允许」在屏上长得一模一样 —— 正是 localSessions 自己在
|
|
10
|
-
* 「接缝记账」里写下的第 1 条,它一直没被销账的原因就是没有任何机制会让它红。
|
|
11
|
-
*
|
|
12
|
-
* 落点为什么是本包:desktop 与 web 都已经依赖 `@sema-agent/client-core`(0.11.5),而本文件是
|
|
13
|
-
* **纯类型 + 常量 + 纯谓词**,零值级 import、零 Node 内建 ⇒ 不动本包的可移植闭包(portability 门的
|
|
14
|
-
* `EXPECTED_PACKAGES_INDEX` 一个字不变)。
|
|
15
|
-
* ⚠️ 两条 `import type`(`./effortWire.js` 的 `ReasoningEffort`、`./seam.js` 的 `LaneProof`)都是
|
|
16
|
-
* **类型边**:portability 门走值级传递闭包时按规则剥掉 type-only import(门里 `/^\s*type\b/` 那一跳),
|
|
17
|
-
* bundle 里一个字节都不多。写成 import 而不是就地复刻,是因为「座位闭集」与「wire 投影闭集」必须是
|
|
18
|
-
* **同一套词**——复刻一份就等于埋一条只有真用户能发现的漂移(拨盘上的档在座位 lane 上静默到不了引擎;
|
|
19
|
-
* 车道证明在座位面变成一个「有位无证」的空对象)。
|
|
20
|
-
*
|
|
21
|
-
* ── 搬迁时按「真源为准」收敛的漂移(逐条,web 侧镜像 → 本文件)────────────────────────────
|
|
22
|
-
* 🔴 D1 `LocalSessionEvent.outcome` —— web 镜像整位缺席 ⇒ `tool_permission_resolved` 只会清面,
|
|
23
|
-
* 不会告诉用户为什么工具没跑。**真 bug**,本批只做「位补回来」;把词渲成可见痕迹是渲染面的活。
|
|
24
|
-
* D2 `SendMessageRequest.permissionMode` —— web 镜像是裸 `string`,真源是闭集 `PermissionModeIntent`,
|
|
25
|
-
* 而宿主入站门 `requireOptionalPermissionMode` 是**会抛的闭集门**。今日两边词表逐字相等
|
|
26
|
-
* (web `ComposerMode` 五档 ≡ `PERMISSION_MODE_INTENTS` 五档,已核),所以是**潜伏**不是现症:
|
|
27
|
-
* ComposerMode 哪天加一档,裸 string 一路放行到宿主门口才抛。收敛成闭集后当天编译红。
|
|
28
|
-
* D3 `AttachmentUploadReceipt.sha256` / `ToolPermissionRequest.createdAtMs` / `StartSessionOptions.cwd`
|
|
29
|
-
* / `.excludeTools` / `LocalSessionRecord.queuedMessages`·`model`·`engineSessionId` ——
|
|
30
|
-
* web 镜像缺位。都是「没接线」不是「接错线」(web 侧今日无消费点,已核),收敛后位在、待接。
|
|
31
|
-
* D4 `LocalSessionEvent.request` —— 真源有这个位,**宿主从不发**(session-host 零处写 `request:`);
|
|
32
|
-
* web 镜像没有它反而与运行时事实一致。真源保留该位(CC `fQe` 的 form 位),记在这里免得
|
|
33
|
-
* 下一棒把「web 没有」当成漏。
|
|
34
|
-
* D5 `EipcStoreClient.getStateSync` web 侧是 optional、真源是 required;`SeatSessionDirectoryRow.createdAt`
|
|
35
|
-
* web 侧 optional、真源 required。两条都是「更弱」方向,收敛到真源即可(宿主校验器
|
|
36
|
-
* `isLocalSessionRecord` 本来就要求 createdAt 在场,运行时保证一直成立)。
|
|
37
|
-
* · web 侧**没有**镜像、因而至今拿不到的面:队列三动词 / setFocusedSession / setModel /
|
|
38
|
-
* focusedSessionState / settingsState / `CHROME_EVENT_KINDS` / `ATTACHMENT_IDS_PER_TASK_CAP`。
|
|
39
|
-
* 本文件导出后它们对 web 首次可见(接不接线是渲染面的决定)。
|
|
40
|
-
*
|
|
41
|
-
* ── 🔴 wave2 卡E-seat 的**破坏性契约变更**(2026-08-02,REF-CC-064~070/072~074;发包说明点名)──
|
|
42
|
-
* ① `EipcMethodSpec.validate` / `EipcStoreSpec.validate` → **改名 `check`**,返回形从 `boolean`
|
|
43
|
-
* 升成 `true | SeatValidationFailure`(REF-CC-069)。改名是**安全机制不是洁癖**:老消费点写的是
|
|
44
|
-
* `if (m.validate && !m.validate(v))`,而失败**对象是真值** ⇒ 那一行会把「不合格」读成「合格」,
|
|
45
|
-
* 门从 fail-closed 静默变成 fail-open。改名让每个旧调用点在编译期红,而不是在运行期悄悄放行。
|
|
46
|
-
* ② `ToolPermissionRequest.createdAt: number` → **`createdAtMs`**(REF-CC-067):同一文件里
|
|
47
|
-
* `LocalSessionRecord.createdAt` 是 ISO 串,两个同名位两种域两种类型;epoch 单位入名(A4)。
|
|
48
|
-
* ③ `ToolPermissionRequest.boundCallId` + `.boundInputHash` → **合成 `toctouBinding`**
|
|
49
|
-
* (REF-CC-070):注释一直把它称作 pair,而类型/门此前各查各的,半个 pair 照样过门。
|
|
50
|
-
* ④ `LocalSessionEvent.chrome.laneProof` **可选 → 必填**且升成命名类型 `LaneProof`(REF-CC-064)——
|
|
51
|
-
* 出站门本来就要求它在场,类型却说可以缺席:一个照着这份「单一真源」写的宿主编译全绿、
|
|
52
|
-
* 事件被整条丢掉、而门只回 boolean 说不出为什么。这条是本卡的 bug 修复位。
|
|
53
|
-
* ⑤ `LocalSessionEvent.type` / `.chrome.kind` / `.permissionMode` 三个位闭集化(REF-CC-065)。
|
|
54
|
-
* ⑥ `uploadAttachment` 入参、`getTranscript`/`searchSessions` 返回形、三个 store 状态形全部提成
|
|
55
|
-
* 具名 interface(REF-CC-072/073/074),SPEC 里 13 个内联匿名 validator 收成具名 `check*`。
|
|
56
|
-
* 三端消费坐标见本批 commit message 的「候提货单」节。
|
|
57
|
-
*
|
|
58
|
-
* ── 沿革(以下正文自 sema-desktop/src/shared/localSessions.ts 逐字迁入)──────────────────────
|
|
59
|
-
* LocalSessions — the desktop host's session service contract, FORM-ported from the CC desktop
|
|
60
|
-
* app's `claude.web / LocalSessions` eipc interface (212 methods there; FIRST BATCH here = the four
|
|
61
|
-
* families clay scoped: session lifecycle / event subscription / interrupt / approvals).
|
|
62
|
-
*
|
|
63
|
-
* Naming: CC ns `claude.web` → `sema.web` (brand table). Method names kept verbatim where the CC
|
|
64
|
-
* method exists (`start`/`stop`/`interrupt`/`sendMessage`/`onEvent`/`onToolPermissionRequest`/
|
|
65
|
-
* `respondToToolPermission` are all real CC LocalSessions methods — see the 854-channel census).
|
|
66
|
-
*
|
|
67
|
-
* ══ 🔴 证据等级标注:本文件的 CC 断言取自**桌面 unpack**,本地语料库不可复验 ════════════════
|
|
68
|
-
*
|
|
69
|
-
* (test [5087] 提出的「语料**种类**缺口」,cli [5088] 认领三件之①,随 0.42.0 落;判据形见下)
|
|
70
|
-
*
|
|
71
|
-
* 本文件里所有以「CC 如何如何」为形的断言 —— 上面那句「212 methods / 854-channel census /
|
|
72
|
-
* 方法名逐字保留」、下面 `checkLocalSessionEvent` 的「CC 的 `fQe` 逐字段对照」、以及一切引
|
|
73
|
-
* `.vite/build/index.chunk-*.js` 坐标的句子 —— **证据等级 = 桌面 unpack(CC Electron app 的
|
|
74
|
-
* `.vite/build` 产物),本地语料库不可复验**。
|
|
75
|
-
*
|
|
76
|
-
* 为什么这一条必须写在这里(而不是只写进台账):
|
|
77
|
-
* · 本仓手边可复验的参照语料**只覆盖终端 CLI 形态**的静态产物,**没有**桌面壳的 unpack 产物。
|
|
78
|
-
* 这不是「语料版本旧」,是**产物形态不对** —— 拿 CLI 形态的语料去 grep 桌面壳里的符号只会得到
|
|
79
|
-
* 零命中,而零命中在这里**既不能证真也不能证伪**;
|
|
80
|
-
* · 「CC 取证纪律」要求 CC 断言的合法证据只有两种:本机 claude 实测,或语料二进制直证。本文件
|
|
81
|
-
* 的这一批两种都够不着 ⇒ 断言**保留**(它当初是照着真产物写的),但**必须带着这个等级一起读**;
|
|
82
|
-
* · 🔴 **这段注释随 `dist/*.d.ts` 出包**,三端读到的就是它。只把等级写进不进 tarball 的台账,
|
|
83
|
-
* 消费端读到的仍是一句看起来可复验、实际不可复验的断言(与本文件 `workerBadge` 出身订正
|
|
84
|
-
* 同一条理由)。
|
|
85
|
-
*
|
|
86
|
-
* **对下游的判据**:凡要对这些断言做「CC 到底是不是这样」的复核,**别拿终端 CLI 形态的语料当反证**
|
|
87
|
-
* ——零命中是语料形态缺口的必然结果,不是断言错。真正的复核路只有一条:取一份 CC 桌面版
|
|
88
|
-
* unpack 产物再对照(已在册为独立小件,做成后参照语料库增桌面形态子目录)。
|
|
89
|
-
*
|
|
90
|
-
* Event payload contract: ported in FORM from CC's `onEvent` runtime validator `fQe`
|
|
91
|
-
* (unpack `.vite/build/index.chunk-CnWKsyE_.js:369773`;**证据等级:桌面 unpack,本地语料库
|
|
92
|
-
* 不可复验** —— 见上方标注段). The load-bearing property we keep
|
|
93
|
-
* byte-faithful ([1832] axiom 2, independently proven by CC's own code): on an otherwise
|
|
94
|
-
* fully-schema'd IPC surface, the `message`/`messages` fields (= CC session-vocabulary SDKMessage
|
|
95
|
-
* bodies, our transcript plane) are UNVALIDATED passthrough positions, while every other field is a
|
|
96
|
-
* neutral typed position. Our implementation体 differs (sema wire via @sema-agent/sdk +
|
|
97
|
-
* @sema-agent/client-core), the contract shape does not.
|
|
98
|
-
*/
|
|
99
1
|
const bad = (reason, field) => field === undefined ? { reason } : { reason, field };
|
|
100
|
-
/**
|
|
101
|
-
* 🔴 [2393] sweep-F8(2026-08-03 全窗复审):**嵌套失败的 field 路径不许在汇聚点被丢掉**。
|
|
102
|
-
* 修前三种写法各写各的:`chrome` 那条把已经算好的 `chrome.laneProof.lane` 整个覆盖成 `"chrome"`;
|
|
103
|
-
* `request`/`session`/`results[i]`/`sessions[i]` 把路径丢成父键名(reason 前缀里还留着索引,
|
|
104
|
-
* field 里没有)。这与 `SeatValidationFailure.field` 自己的定义(「嵌套位用点号,如
|
|
105
|
-
* `chrome.laneProof`」)直接相悖,也削弱 REF-CC-069 存在的理由 ——「一条被门吃掉的事件从此可诊断」:
|
|
106
|
-
* 宿主日志只会说「chrome 有问题」,而门明明知道是 `chrome.laneProof.lane`。
|
|
107
|
-
* @param prefix 父位路径(`"chrome"` / `` `results[${i}]` ``)
|
|
108
|
-
* @param verdict 子判据的失败(field 可能已是点号路径,也可能是裸键名,也可能缺席)
|
|
109
|
-
*/
|
|
110
2
|
const nested = (prefix, verdict) => {
|
|
111
|
-
// 子判据自己已经带上父前缀时(checkSeatChromeEnvelope 收的就是 field 参数)不再重复拼。
|
|
112
3
|
const path = verdict.field === undefined
|
|
113
4
|
? prefix
|
|
114
5
|
: verdict.field === prefix || verdict.field.startsWith(`${prefix}.`)
|
|
@@ -117,18 +8,10 @@ const nested = (prefix, verdict) => {
|
|
|
117
8
|
const reason = verdict.reason.startsWith(`${prefix}:`) ? verdict.reason : `${prefix}: ${verdict.reason}`;
|
|
118
9
|
return bad(reason, path);
|
|
119
10
|
};
|
|
120
|
-
/** 存在性判定(§B10:`!!v` 那种真值判定会把空串/0 当缺席,对象位则会把 `{}` 当「有证」)。 */
|
|
121
11
|
const isObject = (v) => typeof v === "object" && v !== null;
|
|
122
12
|
const isAbsent = (v) => typeof v === "undefined";
|
|
123
13
|
const optionalString = (v) => isAbsent(v) || typeof v === "string";
|
|
124
14
|
const inTuple = (tuple, v) => tuple.includes(v);
|
|
125
|
-
/**
|
|
126
|
-
* `ToolPermissionRequest.requestId` 的**域词表**(FIX⑥,2026-08-07)—— 三端唯一真源。
|
|
127
|
-
*
|
|
128
|
-
* 🔴 前缀不是装饰:它**就是**决断的路由依据(session-host 按它挑 wire 动词)。一个域外的 requestId
|
|
129
|
-
* 意味着「这条决断无处可去」,所以校验器对它 fail-loud 而不是放行(此前门只校「是不是串」,
|
|
130
|
-
* 于是 desktop 早就在用的 `plan:` 既不在枚举里、也不会被任何一处说出来)。
|
|
131
|
-
*/
|
|
132
15
|
export const TOOL_PERMISSION_REQUEST_ID_DOMAINS = [
|
|
133
16
|
"live:",
|
|
134
17
|
"durable:",
|
|
@@ -136,38 +19,11 @@ export const TOOL_PERMISSION_REQUEST_ID_DOMAINS = [
|
|
|
136
19
|
"elicit:",
|
|
137
20
|
"plan:",
|
|
138
21
|
];
|
|
139
|
-
/** 读口:requestId → 它的域。未登记前缀 / 非串 ⇒ `undefined`(诚实缺席,绝不猜一个域)。 */
|
|
140
22
|
export function toolPermissionRequestIdDomain(requestId) {
|
|
141
23
|
if (typeof requestId !== "string")
|
|
142
24
|
return undefined;
|
|
143
25
|
return TOOL_PERMISSION_REQUEST_ID_DOMAINS.find((d) => requestId.startsWith(d));
|
|
144
26
|
}
|
|
145
|
-
/**
|
|
146
|
-
* **正向铸口**:域 + 域内 id → `ToolPermissionRequest.requestId`(P-26,2026-08-12)。
|
|
147
|
-
*
|
|
148
|
-
* 沿革:此前本文件只有域表与读口 {@link toolPermissionRequestIdDomain},**没有铸口** —— 于是每个
|
|
149
|
-
* 铸方(session-host 的五条 park 臂、各端的合成行)各自手抄 `` `live:${id}` `` 这样的模板串。手抄
|
|
150
|
-
* 模板串的失效形不是编译红,是**运行期路由到一个不存在的目标**:少个冒号 / 抄错域 / id 是
|
|
151
|
-
* `undefined` 时静默铸出 `"live:undefined"`,而读口对这三种坏键里的后两种照样「认得出域」,所以
|
|
152
|
-
* 谁都不会响。铸口在场之后,这一类错在**铸的那一行**就被拒。
|
|
153
|
-
*
|
|
154
|
-
* 🔴 **往返性**(本口的契约,门里有断言):对任何登记域 `d` 与合法 id,
|
|
155
|
-
* `toolPermissionRequestIdDomain(toolPermissionRequestId(d, id)) === d` 恒成立 ——
|
|
156
|
-
* 铸出来的键必被读口认回**同一个**域,`isToolPermissionRequest` / `LOCAL_SESSIONS_SPEC` 的
|
|
157
|
-
* 域校验也必然放行(三处读的是同一张 {@link TOOL_PERMISSION_REQUEST_ID_DOMAINS})。
|
|
158
|
-
*
|
|
159
|
-
* 🔴 **坏入参一律 throw,绝不静默吐坏键**:铸口的整个价值就在于「坏键铸不出来」,返回
|
|
160
|
-
* `undefined` 只会把 `${undefined}` 推到下一行的模板串里(与 `honest-absence` 同族的取舍:
|
|
161
|
-
* 缺席要说出来,而这里连「缺席」都不该发生 —— 调用方手上没有合法 id 就不该走到铸这一步)。
|
|
162
|
-
* 三条拒绝各自对应一个真实误用:
|
|
163
|
-
* ① 域不在词表(含忘了尾冒号的 `"live"`)—— 域外键 = 这条决断无处可去,与读口/校验器同判据;
|
|
164
|
-
* ② id 非串 / 空串 —— `"live:"` 是半截键,读口却照样认出 `live:` 域,故必须在铸时拦;
|
|
165
|
-
* ③ id **本身**已经带着某个登记域前缀 —— 典型误用 = 把一条铸好的 requestId 当 id 再喂进来,
|
|
166
|
-
* 得到 `"live:live:ap-1"`(往返性仍成立、校验器仍放行,只有决断落地时才发现目标不存在)。
|
|
167
|
-
* ⚠️ 这条不拦「id 里含冒号」:`durable:<engineSessionId>:<callId>` 的 id 段天生带冒号。
|
|
168
|
-
*
|
|
169
|
-
* 错误文本只带**域**与判据,不回显 id 原文(id 段可能含 session/call 标识,错误路径也是外溢面)。
|
|
170
|
-
*/
|
|
171
27
|
export function toolPermissionRequestId(domain, id) {
|
|
172
28
|
if (!TOOL_PERMISSION_REQUEST_ID_DOMAINS.includes(domain)) {
|
|
173
29
|
throw new Error(`toolPermissionRequestId: 未登记的 requestId 域 —— 只认 ${TOOL_PERMISSION_REQUEST_ID_DOMAINS.join(" / ")}` +
|
|
@@ -185,14 +41,6 @@ export function toolPermissionRequestId(domain, id) {
|
|
|
185
41
|
return `${domain}${id}`;
|
|
186
42
|
}
|
|
187
43
|
export const TOCTOU_BINDING_KEYS = ["callId", "inputHash"];
|
|
188
|
-
/**
|
|
189
|
-
* 座位事件名的**闭集**(REF-CC-065):这是三端唯一的事件名真源。
|
|
190
|
-
*
|
|
191
|
-
* 方向判据(本文件 `PERMISSION_MODE_INTENTS` 头注立的那条):词由**我们自己的宿主**铸出、发往渲染端,
|
|
192
|
-
* 因此闭集 —— 拼错一个字母在编译期红,而不是变成一条谁也不认识、被 switch 默默丢掉的事件。
|
|
193
|
-
* 与 `outcome`(wire 铸词,开集)的区别正是「谁铸的词」,不是「字段像不像枚举」。
|
|
194
|
-
* 词表 = sema-desktop `session-host` 的 emit 面实测八词。
|
|
195
|
-
*/
|
|
196
44
|
const SEAT_EVENT_TYPE_TUPLE = [
|
|
197
45
|
"start",
|
|
198
46
|
"close",
|
|
@@ -204,38 +52,15 @@ const SEAT_EVENT_TYPE_TUPLE = [
|
|
|
204
52
|
"tool_permission_resolved",
|
|
205
53
|
];
|
|
206
54
|
export const SEAT_EVENT_TYPES = SEAT_EVENT_TYPE_TUPLE;
|
|
207
|
-
/** Chrome arms wired to the renderer position (batch 4); other arms stay host-side on the ring. */
|
|
208
55
|
const CHROME_EVENT_KIND_TUPLE = [
|
|
209
56
|
"panel_task",
|
|
210
57
|
"notification_terminal",
|
|
211
58
|
"prompt_suggestions",
|
|
212
59
|
"subagent_lifecycle",
|
|
213
60
|
];
|
|
214
|
-
/**
|
|
215
|
-
* 🔴 BREAKING(REF-CC-065,2026-08-02):公开面类型从 `readonly string[]` **收窄**成
|
|
216
|
-
* `readonly ChromeEventKind[]`。与 `PERMISSION_MODE_INTENTS` / `SEAT_REASONING_EFFORTS` 那两条
|
|
217
|
-
* **不同**:那两个本来就已经是闭集类型,加元组只是补「类型→常量」那半边、公开面一个字没变;
|
|
218
|
-
* 这一个的公开面**真的变了**,所以它是本批第四处破坏性契约变更,不是「同上理由」的搭车项。
|
|
219
|
-
*
|
|
220
|
-
* 谁受影响(实测消费坐标,提货单同条):`sema-desktop/src/main/session-host.ts:1752`
|
|
221
|
-
* `CHROME_EVENT_KINDS.includes(event.kind)` —— 那里的 `event: ChromeEvent` 是 seam.ts 的 17 词
|
|
222
|
-
* 判别式联合,收窄后 `includes()` 的入参类型只认这 4 个词 ⇒ TS2345,提货当天编译红。
|
|
223
|
-
* 迁移形:`(CHROME_EVENT_KINDS as readonly string[]).includes(event.kind)`,或先按 `ChromeEventKind`
|
|
224
|
-
* 做一次显式收窄再进这一支。sema-web-client / sema-cli 实测零命中。
|
|
225
|
-
*/
|
|
226
61
|
export const CHROME_EVENT_KINDS = CHROME_EVENT_KIND_TUPLE;
|
|
227
|
-
/** `LaneProof` 的判别位词表 —— 与 `seam.ts` 的联合逐词对账(下方 `_seatContractPins` 双向钉:
|
|
228
|
-
* seam 加一条车道而这里不跟 ⇒ 编译红,而不是运行期把新车道的 chrome 帧整条丢掉)。 */
|
|
229
62
|
const LANE_PROOF_LANE_TUPLE = ["main", "subagent", "workflow"];
|
|
230
63
|
export const SEAT_CHROME_ENVELOPE_KEYS = ["kind", "laneProof"];
|
|
231
|
-
/**
|
|
232
|
-
* The resolution words the host currently puts on `tool_permission_resolved.outcome` ([1947] 红③).
|
|
233
|
-
* DOCUMENTARY + test anchor only — the gate does NOT enforce membership (see the field's doc: a
|
|
234
|
-
* closed set would fail-close the whole event on the day the wire grows a word). Grouped by family:
|
|
235
|
-
* - tool approval (wire `ToolApprovalFrame.outcome`, + our own settle sweep): allowed/denied/expired
|
|
236
|
-
* - question (wire `QuestionFrame.outcome`): answered/unanswered
|
|
237
|
-
* - elicitation (wire `ElicitationFrame.action`): accept/decline/cancel
|
|
238
|
-
*/
|
|
239
64
|
export const HITL_RESOLUTION_OUTCOMES = [
|
|
240
65
|
"allowed",
|
|
241
66
|
"denied",
|
|
@@ -246,10 +71,6 @@ export const HITL_RESOLUTION_OUTCOMES = [
|
|
|
246
71
|
"decline",
|
|
247
72
|
"cancel",
|
|
248
73
|
];
|
|
249
|
-
/** The closed set the inbound gate checks. CLOSED deliberately, unlike `outcome` above: this word
|
|
250
|
-
* ORIGINATES in our own renderer and goes OUT to a wire that 400s on anything else, so an unknown
|
|
251
|
-
* value is a local bug we want reported at the door — not an unknown future wire word we must
|
|
252
|
-
* tolerate. (The direction of travel is what decides open vs closed, not the field's shape.) */
|
|
253
74
|
const PERMISSION_MODE_INTENT_TUPLE = [
|
|
254
75
|
"default",
|
|
255
76
|
"plan",
|
|
@@ -258,18 +79,7 @@ const PERMISSION_MODE_INTENT_TUPLE = [
|
|
|
258
79
|
"auto",
|
|
259
80
|
];
|
|
260
81
|
export const PERMISSION_MODE_INTENTS = PERMISSION_MODE_INTENT_TUPLE;
|
|
261
|
-
/** Per-task attachment cap — the server's own limit (`attachmentIds` > 16 ⇒ 400). Gated here so the
|
|
262
|
-
* seat gets a precise local error instead of a wire 400 halfway through a turn. */
|
|
263
82
|
export const ATTACHMENT_IDS_PER_TASK_CAP = 16;
|
|
264
|
-
/** The per-turn `reasoningEffort` accept-set — core's ThinkingLevel tiers, re-exported from the
|
|
265
|
-
* package's own wire projection (`effortWire.ReasoningEffort`) rather than re-typed here.
|
|
266
|
-
*
|
|
267
|
-
* CLOSED for the same reason `PERMISSION_MODE_INTENTS` is: the word ORIGINATES in our own composer
|
|
268
|
-
* and travels OUT to a wire that 400s (fail-loud) on an unknown tier — so an unknown value is a
|
|
269
|
-
* local bug we want reported at the seat's door, not a future wire word to tolerate. `ultracode` is
|
|
270
|
-
* deliberately NOT a tier here: in CC it is a standalone `settings.ultracode` preset boolean that
|
|
271
|
-
* COEXISTS with `xhigh` (see `SeatTurnSettings`), and folding it into this axis is exactly how the
|
|
272
|
-
* orchestration axis gets eaten by the reasoning axis. */
|
|
273
83
|
const SEAT_REASONING_EFFORT_TUPLE = [
|
|
274
84
|
"off",
|
|
275
85
|
"minimal",
|
|
@@ -284,12 +94,6 @@ export const SEAT_TURN_SETTINGS_KEYS = ["ultracode"];
|
|
|
284
94
|
export const ATTACHMENT_UPLOAD_REQUEST_KEYS = ["name", "mimeType", "bytes"];
|
|
285
95
|
export const SESSION_SEARCH_RESULT_KEYS = ["sessionId", "title", "matches"];
|
|
286
96
|
export const GET_TRANSCRIPT_RESULT_KEYS = ["sessionId", "messages"];
|
|
287
|
-
// ───────────────────────────── validators (CC dual-gate posture) ─────────────────────────────
|
|
288
|
-
//
|
|
289
|
-
// 一种方言(REF-CC-072):每个载荷形恰有一个具名 `check*`(返回 `true | {reason, field?}`),
|
|
290
|
-
// 需要类型收窄的地方再包一层 `is*` 谓词。SPEC 里不再有内联匿名 validator。
|
|
291
|
-
// 「哪些键真被校验、哪些是刻意豁免」由 `SEAT_VALIDATOR_KEY_COVERAGE` 登记,门里逐位投毒对账
|
|
292
|
-
// (REF-CC-068):说校验的位投毒必拒,说豁免的位投毒必过 —— 表和码不可能各说各话。
|
|
293
97
|
const checkLocalSessionRecord = (s) => {
|
|
294
98
|
if (!isObject(s))
|
|
295
99
|
return bad("session record is not an object");
|
|
@@ -324,7 +128,6 @@ export function isLocalSessionRecord(s) {
|
|
|
324
128
|
const checkToctouBinding = (v) => {
|
|
325
129
|
if (!isObject(v))
|
|
326
130
|
return bad("toctouBinding must be an object", "toctouBinding");
|
|
327
|
-
// 🔴 REF-CC-070:pair 的两半在同一个判据里 —— 只剩一半的绑定不是「降级」,是半个绑定。
|
|
328
131
|
if (typeof v.callId !== "string")
|
|
329
132
|
return bad("toctouBinding.callId must be a string", "toctouBinding.callId");
|
|
330
133
|
if (typeof v.inputHash !== "string")
|
|
@@ -336,7 +139,6 @@ const checkToolPermissionRequest = (r) => {
|
|
|
336
139
|
return bad("tool permission request is not an object");
|
|
337
140
|
if (typeof r.requestId !== "string")
|
|
338
141
|
return bad("requestId must be a string", "requestId");
|
|
339
|
-
// FIX⑥:域(前缀)就是决断的路由依据 —— 认不出域 = 这条决断无处可去,fail-closed 而不是放行。
|
|
340
142
|
if (toolPermissionRequestIdDomain(r.requestId) === undefined) {
|
|
341
143
|
return bad(`requestId must carry a registered domain prefix (${TOOL_PERMISSION_REQUEST_ID_DOMAINS.join("|")})`, "requestId");
|
|
342
144
|
}
|
|
@@ -348,7 +150,6 @@ const checkToolPermissionRequest = (r) => {
|
|
|
348
150
|
if (!isAbsent(r.toolCallId) && r.toolCallId !== null && typeof r.toolCallId !== "string") {
|
|
349
151
|
return bad("toolCallId must be a string or null when present", "toolCallId");
|
|
350
152
|
}
|
|
351
|
-
// `input` is the untrusted redacted payload — passthrough (render-only), like CC's request args.
|
|
352
153
|
if (!optionalString(r.message))
|
|
353
154
|
return bad("message must be a string when present", "message");
|
|
354
155
|
if (!isAbsent(r.toctouBinding)) {
|
|
@@ -364,8 +165,6 @@ const checkToolPermissionRequest = (r) => {
|
|
|
364
165
|
export function isToolPermissionRequest(r) {
|
|
365
166
|
return checkToolPermissionRequest(r) === true;
|
|
366
167
|
}
|
|
367
|
-
/** 车道证明的结构校验(REF-CC-064 的另一半):此前门写的是 `!!laneProof` —— 真值判定当存在性判定
|
|
368
|
-
* (§B10),于是 `laneProof: {}` 这种「有位无证」的帧照样过门,而下游按 lane 分发时它谁也不是。 */
|
|
369
168
|
const checkLaneProof = (v, field) => {
|
|
370
169
|
if (!isObject(v))
|
|
371
170
|
return bad("laneProof must be an object", field);
|
|
@@ -392,25 +191,6 @@ const checkSeatChromeEnvelope = (v, field) => {
|
|
|
392
191
|
}
|
|
393
192
|
return checkLaneProof(v.laneProof, `${field}.laneProof`);
|
|
394
193
|
};
|
|
395
|
-
/**
|
|
396
|
-
* onEvent payload validator — line-for-line FORM port of CC's `fQe`
|
|
397
|
-
* (`.vite/build/index.chunk-CnWKsyE_.js:369773`)。
|
|
398
|
-
* 🔴 **证据等级:桌面 unpack,本地语料库不可复验**(0.42.0 标注件,判据与复核路见文件头注的
|
|
399
|
-
* 「证据等级标注」段;下面每一条 `CC …` 对照句都受该等级约束)。
|
|
400
|
-
* Field-by-field mapping:
|
|
401
|
-
* - `type`/`sessionId`: required strings (same);`type` 另加闭集成员校验(REF-CC-065,词由本宿主铸);
|
|
402
|
-
* - `message`: CC's minified source reads `typeof e.message<"u"` inside a comma expression whose
|
|
403
|
-
* value is discarded — i.e. NO validation, a deliberate transcript-plane passthrough. Same here.
|
|
404
|
-
* - `messages`: array-checked, elements `every(t=>!0)` (constant true) — array shape only. Same here.
|
|
405
|
-
* - `error`/`errorCategory`: optional strings (same); `code`: optional number (same);
|
|
406
|
-
* - `request`: CC gates with `S1` (ToolPermissionRequest schema) → our checkToolPermissionRequest;
|
|
407
|
-
* - `session`: CC gates with `aM` (SessionRecord schema) → our checkLocalSessionRecord;
|
|
408
|
-
* - `data`: optional string / `sources`: optional string[] / `permissionMode`: 闭集成员 /
|
|
409
|
-
* `userMessageUuid`: optional string / `hasPreClearSession`: optional boolean (same);
|
|
410
|
-
* - CC fields we do not emit in this batch (`tccFolderKind`/`initializationStatus`/`fsFile`/
|
|
411
|
-
* `localMcpServers`/`refusalFallbackPrompt`) are not carried — their positions return when the
|
|
412
|
-
* corresponding service families are ported.
|
|
413
|
-
*/
|
|
414
194
|
const checkLocalSessionEvent = (v) => {
|
|
415
195
|
if (!isObject(v))
|
|
416
196
|
return bad("event is not an object");
|
|
@@ -422,7 +202,6 @@ const checkLocalSessionEvent = (v) => {
|
|
|
422
202
|
}
|
|
423
203
|
if (typeof v.sessionId !== "string")
|
|
424
204
|
return bad("sessionId must be a string", "sessionId");
|
|
425
|
-
// `message`: intentionally unvalidated passthrough (see doc above — CC fQe does the same).
|
|
426
205
|
if (!isAbsent(v.messages) && !Array.isArray(v.messages))
|
|
427
206
|
return bad("messages must be an array", "messages");
|
|
428
207
|
if (!optionalString(v.error))
|
|
@@ -434,7 +213,7 @@ const checkLocalSessionEvent = (v) => {
|
|
|
434
213
|
if (!isAbsent(v.request)) {
|
|
435
214
|
const verdict = checkToolPermissionRequest(v.request);
|
|
436
215
|
if (verdict !== true)
|
|
437
|
-
return nested("request", verdict);
|
|
216
|
+
return nested("request", verdict);
|
|
438
217
|
}
|
|
439
218
|
if (!optionalString(v.data))
|
|
440
219
|
return bad("data must be a string when present", "data");
|
|
@@ -452,7 +231,7 @@ const checkLocalSessionEvent = (v) => {
|
|
|
452
231
|
if (!isAbsent(v.session)) {
|
|
453
232
|
const verdict = checkLocalSessionRecord(v.session);
|
|
454
233
|
if (verdict !== true)
|
|
455
|
-
return nested("session", verdict);
|
|
234
|
+
return nested("session", verdict);
|
|
456
235
|
}
|
|
457
236
|
if (!optionalString(v.userMessageUuid))
|
|
458
237
|
return bad("userMessageUuid must be a string when present", "userMessageUuid");
|
|
@@ -461,14 +240,12 @@ const checkLocalSessionEvent = (v) => {
|
|
|
461
240
|
}
|
|
462
241
|
if (!optionalString(v.requestId))
|
|
463
242
|
return bad("requestId must be a string when present", "requestId");
|
|
464
|
-
// `outcome`: type-checked only, NOT membership-checked (see the field doc — an unknown future
|
|
465
|
-
// wire word must reach the renderer as "settled, reason unknown", never take the event down).
|
|
466
243
|
if (!optionalString(v.outcome))
|
|
467
244
|
return bad("outcome must be a string when present", "outcome");
|
|
468
245
|
if (!isAbsent(v.chrome)) {
|
|
469
246
|
const verdict = checkSeatChromeEnvelope(v.chrome, "chrome");
|
|
470
247
|
if (verdict !== true)
|
|
471
|
-
return nested("chrome", verdict);
|
|
248
|
+
return nested("chrome", verdict);
|
|
472
249
|
}
|
|
473
250
|
return true;
|
|
474
251
|
};
|
|
@@ -510,8 +287,6 @@ const checkSeatModelInfo = (m, index) => {
|
|
|
510
287
|
}
|
|
511
288
|
return true;
|
|
512
289
|
};
|
|
513
|
-
/** applyModelConfig ack 校验:布尔形 + reason 条件在场(ok:false ⇒ 必带非空 reason)。
|
|
514
|
-
* 🔴 错误消息零回显 req/ack 值——本 verb 载荷带 apiKey,校验层是回显面之一。 */
|
|
515
290
|
const checkApplyModelConfigResult = (v) => {
|
|
516
291
|
if (!isObject(v))
|
|
517
292
|
return bad("applyModelConfig result is not an object");
|
|
@@ -558,31 +333,24 @@ const checkSendMessageAck = (v) => {
|
|
|
558
333
|
export function isSendMessageAck(v) {
|
|
559
334
|
return checkSendMessageAck(v) === true;
|
|
560
335
|
}
|
|
561
|
-
// ── REF-CC-072:SPEC 里此前 13 个内联匿名 validator 的具名化(同一方言,各配 interface + 键集钉)──
|
|
562
336
|
const checkInterruptAck = (v) => isObject(v) && typeof v.interrupted === "boolean" ? true : bad("interrupt ack needs boolean `interrupted`", "interrupted");
|
|
563
337
|
const checkStopAck = (v) => isObject(v) && typeof v.stopped === "boolean" ? true : bad("stop ack needs boolean `stopped`", "stopped");
|
|
564
338
|
const checkOkAck = (v) => isObject(v) && typeof v.ok === "boolean" ? true : bad("ack needs boolean `ok`", "ok");
|
|
565
|
-
/** Queue family + setModel — CC returns bare booleans (false = too-late/no-op), same here. */
|
|
566
339
|
const checkBooleanAck = (v) => typeof v === "boolean" ? true : bad("expected a bare boolean result");
|
|
567
340
|
const checkGetTranscriptResult = (v) => {
|
|
568
341
|
if (!isObject(v))
|
|
569
342
|
return bad("transcript envelope is not an object");
|
|
570
343
|
if (typeof v.sessionId !== "string")
|
|
571
344
|
return bad("sessionId must be a string", "sessionId");
|
|
572
|
-
// messages = the transcript-plane passthrough batch (fQe `messages` posture: array-checked,
|
|
573
|
-
// elements deliberately unvalidated — they are CC SDKMessage bodies).
|
|
574
345
|
if (!Array.isArray(v.messages))
|
|
575
346
|
return bad("messages must be an array", "messages");
|
|
576
347
|
return true;
|
|
577
348
|
};
|
|
578
|
-
/** 一行搜索命中(REF-CC-072 的同一方言:此前它是 envelope 校验器体内的一段内联判据 ⇒ 没有自己的
|
|
579
|
-
* 名字、没有覆盖表席位,给 `SessionSearchResult` 加一个必填位不会让任何门变红)。 */
|
|
580
349
|
const checkSessionSearchResult = (v) => {
|
|
581
350
|
if (!isObject(v))
|
|
582
351
|
return bad("search result row is not an object");
|
|
583
352
|
if (typeof v.sessionId !== "string")
|
|
584
353
|
return bad("sessionId must be a string", "sessionId");
|
|
585
|
-
// REF-CC-073:`title` 此前从不被校 —— 一个非串 title 会一路走到渲染端。
|
|
586
354
|
if (!optionalString(v.title))
|
|
587
355
|
return bad("title must be a string when present", "title");
|
|
588
356
|
if (!Array.isArray(v.matches))
|
|
@@ -601,7 +369,7 @@ const checkSessionSearchEnvelope = (v) => {
|
|
|
601
369
|
for (let i = 0; i < results.length; i += 1) {
|
|
602
370
|
const verdict = checkSessionSearchResult(results[i]);
|
|
603
371
|
if (verdict !== true)
|
|
604
|
-
return nested(`results[${i}]`, verdict);
|
|
372
|
+
return nested(`results[${i}]`, verdict);
|
|
605
373
|
}
|
|
606
374
|
return true;
|
|
607
375
|
};
|
|
@@ -614,7 +382,7 @@ const checkSessionsState = (v) => {
|
|
|
614
382
|
for (let i = 0; i < sessions.length; i += 1) {
|
|
615
383
|
const verdict = checkLocalSessionRecord(sessions[i]);
|
|
616
384
|
if (verdict !== true)
|
|
617
|
-
return nested(`sessions[${i}]`, verdict);
|
|
385
|
+
return nested(`sessions[${i}]`, verdict);
|
|
618
386
|
}
|
|
619
387
|
return true;
|
|
620
388
|
};
|
|
@@ -638,7 +406,6 @@ const checkSettingsState = (v) => {
|
|
|
638
406
|
return bad("dataRoot must be a string when present", "dataRoot");
|
|
639
407
|
return true;
|
|
640
408
|
};
|
|
641
|
-
// ───────────────────────────── service spec (eipc registration table) ─────────────────────────────
|
|
642
409
|
export const LOCAL_SESSIONS_SPEC = {
|
|
643
410
|
ns: "sema.web",
|
|
644
411
|
service: "LocalSessions",
|
|
@@ -667,7 +434,6 @@ export const LOCAL_SESSIONS_SPEC = {
|
|
|
667
434
|
settingsState: { check: checkSettingsState },
|
|
668
435
|
},
|
|
669
436
|
};
|
|
670
|
-
/** verb 名清单 = `LOCAL_SESSIONS_SPEC.methods` 应有的键集(逐元素相等,门里断言)。 */
|
|
671
437
|
export const SEAT_METHOD_NAMES = [
|
|
672
438
|
"start",
|
|
673
439
|
"sendMessage",
|
|
@@ -687,15 +453,12 @@ export const SEAT_METHOD_NAMES = [
|
|
|
687
453
|
"onEvent",
|
|
688
454
|
"onToolPermissionRequest",
|
|
689
455
|
];
|
|
690
|
-
/** `$store$` 属性名清单;SPEC 的 store 键 + `"Store"` 必须逐条等于这里的名字(门里断言)。 */
|
|
691
456
|
export const SEAT_STORE_PROPS = [
|
|
692
457
|
"sessionsStateStore",
|
|
693
458
|
"focusedSessionStateStore",
|
|
694
459
|
"settingsStateStore",
|
|
695
460
|
];
|
|
696
|
-
/** 事件式(main→renderer push)的 verb —— SPEC 里 `kind: "event"` 的那一撮,门里逐元素对账。 */
|
|
697
461
|
export const SEAT_EVENT_METHOD_NAMES = ["onEvent", "onToolPermissionRequest"];
|
|
698
|
-
// ── payload 键集镜像(与各自 interface 之间有类型钉,不可能漂)────────────────────────────────
|
|
699
462
|
export const LOCAL_SESSION_EVENT_KEYS = [
|
|
700
463
|
"type",
|
|
701
464
|
"sessionId",
|
|
@@ -715,8 +478,6 @@ export const LOCAL_SESSION_EVENT_KEYS = [
|
|
|
715
478
|
"outcome",
|
|
716
479
|
"chrome",
|
|
717
480
|
];
|
|
718
|
-
// 🔴 REF-CC-067/070(BREAKING):`createdAt` → `createdAtMs`(epoch 单位入名);
|
|
719
|
-
// `boundCallId` + `boundInputHash` → `toctouBinding`(pair 一位承载)。三端消费坐标见 commit。
|
|
720
481
|
export const TOOL_PERMISSION_REQUEST_KEYS = [
|
|
721
482
|
"requestId",
|
|
722
483
|
"sessionId",
|
|
@@ -726,8 +487,6 @@ export const TOOL_PERMISSION_REQUEST_KEYS = [
|
|
|
726
487
|
"message",
|
|
727
488
|
"toctouBinding",
|
|
728
489
|
"createdAtMs",
|
|
729
|
-
// [C130] 补键(2026-08-08):治理徽标+委派行的座位载体——desktop 座位 lane 此前无键可透传,
|
|
730
|
-
// 「治理徽标可开工」只在浏览器 lane 成立(半场口径,[C130] 修正)。
|
|
731
490
|
"governanceForced",
|
|
732
491
|
"delegation",
|
|
733
492
|
];
|
|
@@ -749,35 +508,13 @@ export const SEND_MESSAGE_REQUEST_KEYS = [
|
|
|
749
508
|
"userMessageUuid",
|
|
750
509
|
"permissionMode",
|
|
751
510
|
"attachmentIds",
|
|
752
|
-
// 2026-07-29(web 收编第一批②):三位补齐。此前座位 lane **结构性**拿不到它们 —— 闭集就是
|
|
753
|
-
// 载体本身,不在集里 = 那个决定在这条 lane 上根本没有位置可放。
|
|
754
511
|
"reasoningEffort",
|
|
755
512
|
"retainBackgroundProcesses",
|
|
756
|
-
// 0.62.0(子代面两位补载体):同上结构性缺席形 —— 「这一轮要不要看子代正文 / 要不要留子代会话」
|
|
757
|
-
// 此前在座位 lane 上没有位置可放。两位都**原样转投**同名引擎请求位(出身表 + 常驻门对账)。
|
|
758
513
|
"forwardSubagentEvents",
|
|
759
514
|
"retainSubagentSessions",
|
|
760
515
|
"settings",
|
|
761
|
-
// [C131] 补载体(2026-08-08):scenario 拨盘的座位 lane 席位(同上结构性缺席形)。
|
|
762
516
|
"scenario",
|
|
763
517
|
];
|
|
764
|
-
/**
|
|
765
|
-
* **座位键 → 引擎请求位**的出身表(0.62.0;`SEND_MESSAGE_REQUEST_KEYS` 的逐键出身登记)。
|
|
766
|
-
*
|
|
767
|
-
* 为什么要有它:座位 lane 的载荷是一个**闭集接口**,而它的绝大多数位最终是要**原样落到引擎请求
|
|
768
|
-
* 体上**的。这两件事此前没有任何东西把它们接起来 —— 一个座位位可以叫一个引擎请求体上**根本不存在**
|
|
769
|
-
* 的名字(端照着它写、上了 wire 被引擎整键忽略,面上是「开关点了没反应」这类静默缺席),而引擎请求
|
|
770
|
-
* 体新长出一个位时,也没有任何信号说「座位 lane 还没有它的席位」。本表把每个座位键的出身写成**数据**:
|
|
771
|
-
* · `taskRequestKey` —— 这个位**原样转投**引擎请求体的同名/异名位。常驻门拿它对**装在盘上的**
|
|
772
|
-
* sdk 型面逐名核(型直读,不手抄):名字不在引擎请求体上 ⇒ 当天红。
|
|
773
|
-
* · `seatOnly` —— 这个位**不上 wire**,只活在座位 lane 上;字符串写清它是什么、为什么不转投。
|
|
774
|
-
*
|
|
775
|
-
* 🔴 `sessionId` 是**同名不同义**的典型:座位这一位是**座位会话句柄**(渲染端持有的本地 id),而引擎
|
|
776
|
-
* 请求体上那个同名位是**引擎会话 id**(座位记录里另有 `engineSessionId` 承载)。两者恰好同名,
|
|
777
|
-
* 把它登记成「转投」会让下一个人以为直接透传就行 —— 那是把本地句柄当引擎会话送上 wire。
|
|
778
|
-
* 🔴 `text` 是**异名转投**:座位说 `text`,引擎请求体那一位叫 `objective`。异名不是问题,**没记账**
|
|
779
|
-
* 才是;本表就是那本账。
|
|
780
|
-
*/
|
|
781
518
|
export const SEAT_SEND_MESSAGE_KEY_ORIGINS = {
|
|
782
519
|
sessionId: { seatOnly: "座位会话句柄(渲染端持有的本地 id);引擎会话 id 由座位记录的 `engineSessionId` 承载 —— 与引擎请求体上的同名位**同名不同义**,绝不直传" },
|
|
783
520
|
text: { taskRequestKey: "objective" },
|
|
@@ -801,29 +538,6 @@ export const TOOL_PERMISSION_DECISION_KEYS = [
|
|
|
801
538
|
"remember",
|
|
802
539
|
];
|
|
803
540
|
export const START_SESSION_OPTION_KEYS = ["model", "title", "cwd", "excludeTools"];
|
|
804
|
-
/**
|
|
805
|
-
* 校验器覆盖表(REF-CC-068)—— 每个校验器**逐键**声明:哪些位真被校验、哪些位**刻意**不校验。
|
|
806
|
-
*
|
|
807
|
-
* 为什么需要它:`防再漂钉` 封的是「interface ↔ 名字常量 ↔ SPEC」两跳,**校验器这条链此前没人钉**。
|
|
808
|
-
* 给一个 interface 加一个必填位,门全绿,而新位从此不过校验(fail-closed 面出现缺口)。
|
|
809
|
-
* 正确做法不是「全键必查」—— 本文件有真正**刻意不查**的位(transcript 面直通),所以豁免必须显式登记
|
|
810
|
-
* 并带理由。门里对每个位投毒:说校验的必拒、说豁免的必过 ⇒ 这张表不可能变成一段过期的说明文字。
|
|
811
|
-
*
|
|
812
|
-
* 🔴 覆盖范围(wave2 回炉批 2026-08-02 补齐,首版只登了 6 个而发包说明写的是「每个校验器」——
|
|
813
|
-
* 那 8 个没登的恰好就是 REF-CC-072 本批新提名的那批 `check*`,实测「加一个必填位、全门照绿」在它们
|
|
814
|
-
* 身上仍然全开,即这张表自称堵死的失效形当时并没有被堵死):
|
|
815
|
-
* · **SPEC 面 15 个具名 `check`,14 个对象形在本表登记**,余下 1 个(裸布尔回执)逐形豁免;
|
|
816
|
-
* · 另加 4 个**嵌套**形(SeatModelInfo / SessionSearchResult / ToctouBinding /
|
|
817
|
-
* SeatChromeEnvelopeBase)—— 它们不是 SPEC 面的直接 check,但父校验器的覆盖表只登记得到
|
|
818
|
-
* `models` / `results` / `toctouBinding` / `chrome` 这一个顶层键,给**子形**加必填位同样全绿;
|
|
819
|
-
* · 合计 **18 条**。两个不适用的形逐形写在 `SEAT_VALIDATOR_COVERAGE_EXEMPT` 里。
|
|
820
|
-
* 完备性不靠这段话:门里逐条比对 `LOCAL_SESSIONS_SPEC` 每个 method/store 的 `check` **函数引用**
|
|
821
|
-
* 必须落在「本表 ∪ 豁免表」里 —— 再加一条 verb 而不登记,门当场红。
|
|
822
|
-
*
|
|
823
|
-
* `check` 位存的是**函数引用本身**(不是名字):名字查表要靠一张 guards 映射,而那张映射漏一行
|
|
824
|
-
* 就是又一个没人看见的缺口;引用相等是机械的。`guard` 位只在该形另有公开面 `is*` 谓词时登记,
|
|
825
|
-
* 门里额外校「谓词与 check 判决一致」。
|
|
826
|
-
*/
|
|
827
541
|
export const SEAT_VALIDATOR_KEY_COVERAGE = {
|
|
828
542
|
LocalSessionRecord: {
|
|
829
543
|
guard: "isLocalSessionRecord",
|
|
@@ -901,7 +615,6 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
|
|
|
901
615
|
validated: ["sessionId", "userMessageUuid", "queued"],
|
|
902
616
|
unchecked: [],
|
|
903
617
|
},
|
|
904
|
-
// ── wave2 回炉批补齐:REF-CC-072 提名的 8 个 SPEC 面 check* ────────────────────────────────
|
|
905
618
|
InterruptAck: {
|
|
906
619
|
check: checkInterruptAck,
|
|
907
620
|
validated: ["interrupted"],
|
|
@@ -919,8 +632,6 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
|
|
|
919
632
|
},
|
|
920
633
|
GetTranscriptResult: {
|
|
921
634
|
check: checkGetTranscriptResult,
|
|
922
|
-
// `messages` 登在 validated:门校的是**数组形**这一层(与 `LocalSessionEvent.messages` 同口径)。
|
|
923
|
-
// 元素刻意不校(CC fQe 姿态,SDKMessage 体)—— 那是键**内**的粒度,覆盖表管的是键面,别把两者混谈。
|
|
924
635
|
validated: ["sessionId", "messages"],
|
|
925
636
|
unchecked: [],
|
|
926
637
|
},
|
|
@@ -944,7 +655,6 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
|
|
|
944
655
|
validated: ["defaultModel", "engineVersion", "dataRoot"],
|
|
945
656
|
unchecked: [],
|
|
946
657
|
},
|
|
947
|
-
// ── wave2 回炉批补齐:父校验器只登记得到一个顶层键的 4 个嵌套形 ──────────────────────────
|
|
948
658
|
SeatModelInfo: {
|
|
949
659
|
check: (v) => checkSeatModelInfo(v, 0),
|
|
950
660
|
validated: ["id", "name", "provider", "contextWindow", "maxOutputTokens"],
|
|
@@ -966,11 +676,6 @@ export const SEAT_VALIDATOR_KEY_COVERAGE = {
|
|
|
966
676
|
unchecked: [],
|
|
967
677
|
},
|
|
968
678
|
};
|
|
969
|
-
/**
|
|
970
|
-
* 逐形豁免(REF-CC-068 的另一半):**不适用**覆盖表的具名校验器 —— 每条写清为什么,以及它的判别力
|
|
971
|
-
* 由谁承担。这张表存在的唯一理由是让「本表 ∪ 覆盖表 ⊇ SPEC 面全部 check」这条完备性钉能机械成立:
|
|
972
|
-
* 没有它,「某个 check 没登记」和「某个 check 不该登记」在门里长得一模一样。
|
|
973
|
-
*/
|
|
974
679
|
export const SEAT_VALIDATOR_COVERAGE_EXEMPT = [
|
|
975
680
|
{
|
|
976
681
|
label: "BooleanAck",
|
|
@@ -987,12 +692,9 @@ export const SEAT_VALIDATOR_COVERAGE_EXEMPT = [
|
|
|
987
692
|
"② run-client-core-pure-test.mjs **FIX7 段 ④** —— 未登记车道词 / subagent 缺伴随位 / workflow 缺 via 或 key 三条投毒 + 两条逐臂正控 + 一条「main 臂不被过紧误拒」负控,全部直接喂本条的 `check`。",
|
|
988
693
|
},
|
|
989
694
|
];
|
|
990
|
-
/** 双向覆盖钉:`Exclude` 两个方向都必须塌成 `never`,少一个键红、多一个键也红。
|
|
991
|
-
* `Covers`(REF-CC-145/dup-12,P3 wave1 卡C-argv)改吃共用叶 typePins.ts——四份逐字重复钉之一。 */
|
|
992
695
|
const _seatContractPins = [
|
|
993
696
|
true, true, true, true, true, true, true, true, true,
|
|
994
697
|
true, true, true, true, true, true, true, true,
|
|
995
|
-
// 0.62.0:出身表 ↔ 载荷键集双向
|
|
996
698
|
true, true,
|
|
997
699
|
true, true,
|
|
998
700
|
true, true, true, true,
|
|
@@ -1004,7 +706,6 @@ const _seatContractPins = [
|
|
|
1004
706
|
true, true, true, true,
|
|
1005
707
|
true, true, true, true, true, true,
|
|
1006
708
|
true, true, true, true, true, true, true, true, true, true, true, true,
|
|
1007
|
-
// wave2 回炉批:覆盖表补齐的 12 个形 × 双向 = 24
|
|
1008
709
|
true, true, true, true, true, true, true, true,
|
|
1009
710
|
true, true, true, true, true, true, true, true,
|
|
1010
711
|
true, true, true, true, true, true, true, true,
|