@sema-agent/client-core 0.77.1 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -1
- package/README.md +6 -5
- package/dist/abortableSleep.d.ts +0 -28
- package/dist/abortableSleep.js +0 -28
- package/dist/adapt/arms.d.ts +0 -46
- package/dist/adapt/arms.js +9 -544
- package/dist/adapt/ids.d.ts +0 -58
- package/dist/adapt/ids.js +0 -63
- package/dist/adapt/instanceLedger.d.ts +0 -25
- package/dist/adapt/instanceLedger.js +0 -20
- package/dist/adapt/panelTasks.d.ts +0 -69
- package/dist/adapt/panelTasks.js +0 -95
- package/dist/adapt/textSegmentAuthority.d.ts +1 -137
- package/dist/adapt/textSegmentAuthority.js +0 -54
- package/dist/adapt/textStream.d.ts +0 -252
- package/dist/adapt/textStream.js +2 -281
- package/dist/adapt/toolCards.d.ts +0 -46
- package/dist/adapt/toolCards.js +0 -23
- package/dist/adapt/turnFlags.d.ts +0 -54
- package/dist/adapt/turnFlags.js +1 -17
- package/dist/adapt/wireShapes.d.ts +0 -92
- package/dist/adapt/wireShapes.js +0 -83
- package/dist/adapt.d.ts +0 -55
- package/dist/adapt.js +1 -120
- package/dist/adapter/activeRunSelfHeal.d.ts +22 -515
- package/dist/adapter/activeRunSelfHeal.js +10 -625
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +2 -305
- package/dist/adapter/downstream/eventToSdkMessage.js +2 -867
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -314
- package/dist/adapter/downstream/terminalToSdkResult.js +13 -560
- package/dist/adapter/downstream/turnUsageToModelUsage.d.ts +0 -95
- package/dist/adapter/downstream/turnUsageToModelUsage.js +2 -31
- package/dist/adapter/runStream.d.ts +0 -206
- package/dist/adapter/runStream.js +6 -596
- package/dist/adapter/types.d.ts +0 -111
- package/dist/adapter/types.js +0 -29
- package/dist/agentSession/backgroundView.d.ts +0 -106
- package/dist/agentSession/backgroundView.js +3 -49
- package/dist/agentSession/contract.d.ts +0 -98
- package/dist/agentSession/contract.js +0 -12
- package/dist/agentsWireCaps.d.ts +0 -72
- package/dist/agentsWireCaps.js +4 -72
- package/dist/approvalsStreamLiveCapability.d.ts +0 -25
- package/dist/approvalsStreamLiveCapability.js +0 -31
- package/dist/argvFlagValue.d.ts +0 -33
- package/dist/argvFlagValue.js +3 -35
- package/dist/attachmentsWireCaps.d.ts +0 -127
- package/dist/attachmentsWireCaps.js +0 -144
- package/dist/autoModeUnavailable.d.ts +0 -120
- package/dist/autoModeUnavailable.js +0 -144
- package/dist/classifierStatus.d.ts +0 -72
- package/dist/classifierStatus.js +0 -167
- package/dist/classifierVerdictWire.d.ts +0 -54
- package/dist/classifierVerdictWire.js +0 -133
- package/dist/clientContextWireCaps.d.ts +0 -37
- package/dist/clientContextWireCaps.js +0 -36
- package/dist/clientSlice.d.ts +0 -63
- package/dist/clientSlice.js +0 -45
- package/dist/cloudConfigWireCaps.d.ts +0 -86
- package/dist/cloudConfigWireCaps.js +2 -65
- package/dist/compensations.d.ts +0 -52
- package/dist/compensations.js +2 -63
- package/dist/controlRouter.d.ts +2 -208
- package/dist/controlRouter.js +1 -129
- package/dist/coreValuePorts.d.ts +0 -84
- package/dist/coreValuePorts.js +0 -29
- package/dist/decideReceipt.d.ts +0 -110
- package/dist/decideReceipt.js +0 -84
- package/dist/detachWire.d.ts +0 -130
- package/dist/detachWire.js +1 -130
- package/dist/deviceExecutorManagementCapability.d.ts +2 -35
- package/dist/deviceExecutorManagementCapability.js +1 -37
- package/dist/diagnostics.d.ts +0 -8
- package/dist/diagnostics.js +0 -8
- package/dist/diff/patch.d.ts +0 -17
- package/dist/diff/patch.js +0 -19
- package/dist/effectiveFacts.d.ts +0 -40
- package/dist/effectiveFacts.js +0 -22
- package/dist/effortWire.d.ts +0 -11
- package/dist/effortWire.js +0 -12
- package/dist/engineAgentPanelStore.d.ts +0 -169
- package/dist/engineAgentPanelStore.js +13 -293
- package/dist/engineCapReader.d.ts +0 -62
- package/dist/engineCapReader.js +1 -43
- package/dist/engineCapsCache.d.ts +0 -177
- package/dist/engineCapsCache.js +0 -199
- package/dist/engineCapsGenerationGuard.d.ts +0 -2
- package/dist/engineCapsGenerationGuard.js +0 -11
- package/dist/engineErrorCodes.d.ts +1 -316
- package/dist/engineErrorCodes.js +0 -427
- package/dist/engineHttpTools.d.ts +0 -29
- package/dist/engineHttpTools.js +0 -29
- package/dist/engineIdentity.d.ts +0 -83
- package/dist/engineIdentity.js +0 -88
- package/dist/engineInlineTaskStats.d.ts +0 -57
- package/dist/engineInlineTaskStats.js +1 -42
- package/dist/engineNoticeCodes.d.ts +0 -190
- package/dist/engineNoticeCodes.js +0 -182
- package/dist/engineSessionParam.d.ts +0 -30
- package/dist/engineSessionParam.js +0 -52
- package/dist/engineToolLabelStore.d.ts +0 -29
- package/dist/engineToolLabelStore.js +0 -31
- package/dist/engineWireSdk.d.ts +0 -90
- package/dist/engineWireSdk.js +0 -74
- package/dist/engineWireTarget.d.ts +0 -14
- package/dist/engineWireTarget.js +0 -39
- package/dist/env/localeGeo.d.ts +0 -12
- package/dist/env/localeGeo.js +2 -77
- package/dist/env/localeTag.d.ts +0 -34
- package/dist/env/localeTag.js +0 -32
- package/dist/env/uiLanguage.d.ts +0 -13
- package/dist/env/uiLanguage.js +0 -25
- package/dist/envFlag.d.ts +0 -37
- package/dist/envFlag.js +0 -40
- package/dist/executionLaneCapability.d.ts +0 -48
- package/dist/executionLaneCapability.js +0 -54
- package/dist/finalVerifyWire.d.ts +0 -67
- package/dist/finalVerifyWire.js +3 -43
- package/dist/fleet/fleetLedger.d.ts +0 -308
- package/dist/fleet/fleetLedger.js +10 -429
- package/dist/fleet/fleetProjection.d.ts +0 -240
- package/dist/fleet/fleetProjection.js +0 -189
- package/dist/fleet/fleetRowAgentType.d.ts +0 -6
- package/dist/fleet/fleetRowAgentType.js +1 -32
- package/dist/fleet/workflowSizeWarning.d.ts +0 -47
- package/dist/fleet/workflowSizeWarning.js +1 -46
- package/dist/fleetAgentPanelProjection.d.ts +0 -48
- package/dist/fleetAgentPanelProjection.js +8 -173
- package/dist/fleetTaskDesc.d.ts +0 -39
- package/dist/fleetTaskDesc.js +0 -69
- package/dist/forkWireCaps.d.ts +0 -23
- package/dist/forkWireCaps.js +1 -24
- package/dist/gateOutcome.d.ts +0 -140
- package/dist/gateOutcome.js +0 -85
- package/dist/gateVocabulary.d.ts +0 -114
- package/dist/gateVocabulary.js +3 -161
- package/dist/goalStopHook.d.ts +0 -127
- package/dist/goalStopHook.js +0 -178
- package/dist/headlessPermissionModeWire.d.ts +0 -76
- package/dist/headlessPermissionModeWire.js +1 -155
- package/dist/headlessReconnectWire.d.ts +0 -84
- package/dist/headlessReconnectWire.js +13 -67
- package/dist/hitl/approvalDecisionNoteAudit.d.ts +0 -49
- package/dist/hitl/approvalDecisionNoteAudit.js +0 -56
- package/dist/hitl/approvalOutcomeNote.d.ts +0 -2
- package/dist/hitl/approvalOutcomeNote.js +0 -20
- package/dist/hitl/approvalResolution.d.ts +0 -113
- package/dist/hitl/approvalResolution.js +0 -66
- package/dist/hitl/approvalsFeed.d.ts +0 -183
- package/dist/hitl/approvalsFeed.js +12 -243
- package/dist/hitl/armedGateRegistry.d.ts +0 -55
- package/dist/hitl/armedGateRegistry.js +0 -146
- package/dist/hitl/askGateWire.d.ts +0 -86
- package/dist/hitl/askGateWire.js +1 -95
- package/dist/hitl/askParkRowRouting.d.ts +0 -123
- package/dist/hitl/askParkRowRouting.js +1 -89
- package/dist/hitl/crashConverged.d.ts +0 -148
- package/dist/hitl/crashConverged.js +0 -214
- package/dist/hitl/editedRuleTextPrecheck.d.ts +0 -109
- package/dist/hitl/editedRuleTextPrecheck.js +0 -71
- package/dist/hitl/frameRouter.d.ts +0 -134
- package/dist/hitl/frameRouter.js +6 -378
- package/dist/hitl/gateIdentity.d.ts +0 -39
- package/dist/hitl/gateIdentity.js +0 -41
- package/dist/hitl/gateLedger.d.ts +0 -267
- package/dist/hitl/gateLedger.js +0 -121
- package/dist/hitl/hitlBridge.d.ts +7 -431
- package/dist/hitl/hitlBridge.js +7 -476
- package/dist/hitl/hitlHostSurface.d.ts +0 -150
- package/dist/hitl/hitlHostSurface.js +0 -169
- package/dist/hitl/livePendingAsk.d.ts +0 -91
- package/dist/hitl/livePendingAsk.js +0 -74
- package/dist/hitl/localAllowRule.d.ts +0 -62
- package/dist/hitl/localAllowRule.js +1 -33
- package/dist/hitl/parkOwnership.d.ts +0 -56
- package/dist/hitl/parkOwnership.js +0 -22
- package/dist/hitl/parkResolver.d.ts +3 -88
- package/dist/hitl/parkResolver.js +8 -349
- package/dist/hitl/parkRowBirthWait.d.ts +2 -26
- package/dist/hitl/parkRowBirthWait.js +3 -93
- package/dist/hitl/persistedRulesWire.d.ts +23 -371
- package/dist/hitl/persistedRulesWire.js +62 -329
- package/dist/hitl/planReviewWire.d.ts +4 -176
- package/dist/hitl/planReviewWire.js +9 -312
- package/dist/hitl/resumeRunningCard.d.ts +0 -105
- package/dist/hitl/resumeRunningCard.js +0 -105
- package/dist/hitl/sessionPolicyWire.d.ts +11 -191
- package/dist/hitl/sessionPolicyWire.js +0 -149
- package/dist/hitl/suspendedReopen.d.ts +3 -24
- package/dist/hitl/suspendedReopen.js +0 -14
- package/dist/hitl/toolApprovalWire.d.ts +5 -1308
- package/dist/hitl/toolApprovalWire.js +5 -945
- package/dist/hooksWireCaps.d.ts +0 -38
- package/dist/hooksWireCaps.js +0 -190
- package/dist/host.d.ts +0 -105
- package/dist/host.js +0 -33
- package/dist/hostEnv.d.ts +0 -14
- package/dist/hostEnv.js +0 -13
- package/dist/imagesWireCaps.d.ts +0 -21
- package/dist/imagesWireCaps.js +0 -22
- package/dist/index.d.ts +0 -134
- package/dist/index.js +0 -476
- package/dist/interactiveHalt.d.ts +5 -153
- package/dist/interactiveHalt.js +0 -111
- package/dist/interactiveToolsWire.d.ts +0 -62
- package/dist/interactiveToolsWire.js +1 -67
- package/dist/leaderConflict.d.ts +0 -59
- package/dist/leaderConflict.js +0 -48
- package/dist/limitsWire.d.ts +0 -125
- package/dist/limitsWire.js +2 -120
- package/dist/liveInitToolFace.d.ts +0 -77
- package/dist/liveInitToolFace.js +1 -109
- package/dist/liveModelCatalog.d.ts +0 -52
- package/dist/liveModelCatalog.js +0 -48
- package/dist/liveQuestionStore.d.ts +0 -87
- package/dist/liveQuestionStore.js +1 -56
- package/dist/mcpLiveness.d.ts +0 -151
- package/dist/mcpLiveness.js +0 -122
- package/dist/mcpPanel.d.ts +0 -104
- package/dist/mcpPanel.js +0 -49
- package/dist/mcpReconnect.d.ts +0 -58
- package/dist/mcpReconnect.js +0 -69
- package/dist/mcpWireCaps.d.ts +0 -55
- package/dist/mcpWireCaps.js +1 -13
- package/dist/memoryComplianceCapability.d.ts +3 -57
- package/dist/memoryComplianceCapability.js +0 -57
- package/dist/memoryEntriesWire.d.ts +6 -198
- package/dist/memoryEntriesWire.js +0 -144
- package/dist/memoryOriginCapability.d.ts +3 -53
- package/dist/memoryOriginCapability.js +0 -50
- package/dist/memorySpecWire.d.ts +0 -116
- package/dist/memorySpecWire.js +0 -150
- package/dist/model/catalog.d.ts +0 -111
- package/dist/model/catalog.js +0 -87
- package/dist/model/catalogLoader.d.ts +0 -114
- package/dist/model/catalogLoader.js +2 -139
- package/dist/model/modelSupplyRules.d.ts +1 -55
- package/dist/model/modelSupplyRules.js +0 -62
- package/dist/model/providerAuth.d.ts +0 -103
- package/dist/model/providerAuth.js +2 -38
- package/dist/model/providerCatalog.d.ts +0 -45
- package/dist/model/providerCatalog.js +0 -37
- package/dist/model/providerPresets.d.ts +0 -33
- package/dist/model/providerPresets.js +2 -91
- package/dist/model/tierVocabulary.d.ts +0 -31
- package/dist/model/tierVocabulary.js +0 -27
- package/dist/modelBudgetRule.d.ts +0 -39
- package/dist/modelBudgetRule.js +0 -39
- package/dist/modelCapabilityProbe.d.ts +0 -175
- package/dist/modelCapabilityProbe.js +0 -147
- package/dist/modelWireCaps.d.ts +0 -13
- package/dist/modelWireCaps.js +0 -13
- package/dist/notifications.d.ts +0 -233
- package/dist/notifications.js +14 -492
- package/dist/oneShotWireCaps.d.ts +0 -34
- package/dist/oneShotWireCaps.js +0 -35
- package/dist/ownKey.d.ts +0 -33
- package/dist/ownKey.js +0 -33
- package/dist/panelRunningHistory.d.ts +0 -28
- package/dist/panelRunningHistory.js +0 -43
- package/dist/peerFrames.d.ts +0 -71
- package/dist/peerFrames.js +0 -168
- package/dist/peerLaneCapability.d.ts +0 -44
- package/dist/peerLaneCapability.js +0 -52
- package/dist/permissionRuleIssue.d.ts +0 -30
- package/dist/permissionRuleIssue.js +0 -78
- package/dist/permissionRulesWriteCapability.d.ts +0 -46
- package/dist/permissionRulesWriteCapability.js +0 -54
- package/dist/permissionWireCaps.d.ts +0 -37
- package/dist/permissionWireCaps.js +0 -37
- package/dist/postureKnob.d.ts +0 -71
- package/dist/postureKnob.js +0 -86
- package/dist/principalWire.d.ts +0 -17
- package/dist/principalWire.js +0 -17
- package/dist/printToolResultFrame.d.ts +0 -100
- package/dist/printToolResultFrame.js +0 -33
- package/dist/promptProfileWireCaps.d.ts +0 -13
- package/dist/promptProfileWireCaps.js +0 -13
- package/dist/readFacePosture.d.ts +0 -43
- package/dist/readFacePosture.js +0 -46
- package/dist/request/printNotification.d.ts +0 -20
- package/dist/request/printNotification.js +0 -55
- package/dist/request/taskRequest.d.ts +1 -249
- package/dist/request/taskRequest.js +20 -498
- package/dist/resumeRefusalCopy.d.ts +0 -136
- package/dist/resumeRefusalCopy.js +1 -117
- package/dist/retainBackgroundWireCaps.d.ts +0 -48
- package/dist/retainBackgroundWireCaps.js +0 -48
- package/dist/retryStatus.d.ts +2 -221
- package/dist/retryStatus.js +0 -107
- package/dist/rewindWireCaps.d.ts +0 -27
- package/dist/rewindWireCaps.js +0 -24
- package/dist/runCancelContext.d.ts +1 -20
- package/dist/runCancelContext.js +0 -34
- package/dist/runTerminal.d.ts +0 -273
- package/dist/runTerminal.js +0 -177
- package/dist/sandboxWire.d.ts +0 -38
- package/dist/sandboxWire.js +0 -82
- package/dist/scenarioWire.d.ts +0 -60
- package/dist/scenarioWire.js +0 -68
- package/dist/scratchpadWireCaps.d.ts +0 -11
- package/dist/scratchpadWireCaps.js +0 -32
- package/dist/sdkWireTransit.d.ts +0 -38
- package/dist/sdkWireTransit.js +0 -30
- package/dist/seam.d.ts +18 -853
- package/dist/seam.js +0 -52
- package/dist/seatContract.d.ts +0 -555
- package/dist/seatContract.js +5 -304
- package/dist/selfOrchestrationDenial.d.ts +0 -189
- package/dist/selfOrchestrationDenial.js +0 -162
- package/dist/selfOrchestrationWireCaps.d.ts +0 -38
- package/dist/selfOrchestrationWireCaps.js +0 -38
- package/dist/sessionMap.d.ts +0 -60
- package/dist/sessionMap.js +0 -37
- package/dist/sessionMemoryStatus.d.ts +11 -114
- package/dist/sessionMemoryStatus.js +0 -112
- package/dist/sessionModelLatch.d.ts +0 -29
- package/dist/sessionModelLatch.js +0 -40
- package/dist/sessionPolicyCapability.d.ts +3 -53
- package/dist/sessionPolicyCapability.js +0 -52
- package/dist/sessionSlot.d.ts +0 -26
- package/dist/sessionSlot.js +0 -17
- package/dist/skillsWireCaps.d.ts +0 -87
- package/dist/skillsWireCaps.js +0 -38
- package/dist/sqlEngineCapability.d.ts +0 -118
- package/dist/sqlEngineCapability.js +0 -134
- package/dist/sseIdleTriage.d.ts +0 -79
- package/dist/sseIdleTriage.js +1 -80
- package/dist/steering.d.ts +0 -54
- package/dist/steering.js +0 -63
- package/dist/subagent/engineCompactWire.d.ts +0 -34
- package/dist/subagent/engineCompactWire.js +4 -134
- package/dist/subagent/engineDelegatedPrompt.d.ts +0 -31
- package/dist/subagent/engineDelegatedPrompt.js +1 -103
- package/dist/subagent/engineRowStopGate.d.ts +0 -20
- package/dist/subagent/engineRowStopGate.js +0 -49
- package/dist/subagent/engineSubagentOutput.d.ts +0 -7
- package/dist/subagent/engineSubagentOutput.js +1 -51
- package/dist/subagent/engineSubagentResume.d.ts +2 -279
- package/dist/subagent/engineSubagentResume.js +2 -129
- package/dist/subagent/engineSubagentSteer.d.ts +0 -26
- package/dist/subagent/engineSubagentSteer.js +0 -63
- package/dist/subagent/engineSubagentTail.d.ts +0 -38
- package/dist/subagent/engineSubagentTail.js +2 -110
- package/dist/subagent/engineTaskHandleWire.d.ts +6 -67
- package/dist/subagent/engineTaskHandleWire.js +0 -126
- package/dist/subagent/subagentOwnerAbsence.d.ts +0 -2
- package/dist/subagent/subagentOwnerAbsence.js +0 -25
- package/dist/subagentContentStore.d.ts +3 -260
- package/dist/subagentContentStore.js +7 -540
- package/dist/systemReminderTag.d.ts +0 -49
- package/dist/systemReminderTag.js +0 -61
- package/dist/toolResult.d.ts +1 -211
- package/dist/toolResult.js +1 -358
- package/dist/toolRoster.d.ts +0 -140
- package/dist/toolRoster.js +0 -66
- package/dist/typePins.d.ts +0 -46
- package/dist/types/engineState.d.ts +0 -71
- package/dist/types/engineState.js +0 -16
- package/dist/ultracodeWireCaps.d.ts +0 -75
- package/dist/ultracodeWireCaps.js +0 -92
- package/dist/unrefTimer.d.ts +0 -27
- package/dist/webSearchBackendCapability.d.ts +0 -72
- package/dist/webSearchBackendCapability.js +0 -79
- package/dist/webSearchWireCaps.d.ts +0 -37
- package/dist/webSearchWireCaps.js +0 -34
- package/dist/websearch/searchProviderPresets.d.ts +0 -81
- package/dist/websearch/searchProviderPresets.js +0 -27
- package/dist/wireErrorTriage.d.ts +4 -160
- package/dist/wireErrorTriage.js +0 -171
- package/dist/wireRefusalCopy.d.ts +0 -28
- package/dist/wireRefusalCopy.js +0 -28
- package/dist/workflow.d.ts +0 -40
- package/dist/workflow.js +0 -52
- package/dist/workflowClient.d.ts +0 -122
- package/dist/workflowClient.js +8 -360
- package/dist/workflowMonitor.d.ts +2 -72
- package/dist/workflowMonitor.js +0 -26
- package/dist/writeProtectionCapability.d.ts +0 -112
- package/dist/writeProtectionCapability.js +0 -109
- package/docs/INTEGRATION-CLIENTS.md +78 -5
- package/package.json +3 -3
|
@@ -1,157 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
* adapt/textSegmentAuthority.ts — `text_end.content` **权威段替换**的判决单源(L-318,0.68.2)。
|
|
3
|
-
*
|
|
4
|
-
* ── 为什么有这个文件(病形一句话)────────────────────────────────────────────────────────────
|
|
5
|
-
* 0.68.1 把权威替换落在 {@link import('./textStream.js').TextStream.replaceAnswerSegment} 里,
|
|
6
|
-
* 那一只服务的是**交互车道**(transcript / chrome 双平面)。而 `-p` 车道走的是另一条链
|
|
7
|
-
* (`eventToSdkMessage` 的内部臂 → 宿主自己的 CC stdout 投影器),它拿不到那只段缓冲 ⇒ cli 1.0.114
|
|
8
|
-
* 在壳里**又实现了一遍同样的六形**(B-122 热修)。同一条语义两份实现 = 上游改口时两边各走各的:
|
|
9
|
-
* 这正是「壳持有第二份真相」那一族病。
|
|
10
|
-
*
|
|
11
|
-
* ⇒ 本模块把**判决**(六形里真正决定结果的那三件事实 + 尾段)抽成一只**纯函数**,两条车道同吃:
|
|
12
|
-
* · 交互车道:`textStream.replaceAnswerSegment` 调它,再按本包的双平面语义落账;
|
|
13
|
-
* · print 车道:宿主(cli `PrintStreamProjector`)调它 + {@link createTextSegmentLedger},
|
|
14
|
-
* 只剩「把尾段写进 CC content block」这一步装配动作留在端上(多端改造设计稿 §8-5:
|
|
15
|
-
* stream-json 帧序/SSE 重铸属端,判定属包)。
|
|
16
|
-
*
|
|
17
|
-
* 🔴 **本模块零宿主形**:进出全是 `string` / `number` / `boolean` —— 没有 CC content block、没有
|
|
18
|
-
* transcript 消息、没有帧。可移植门(`--platform=browser` 真打包)因此一个字节都不受影响。
|
|
19
|
-
*
|
|
20
|
-
* ── 判决与落账刻意分家(读这一段再改本文件)──────────────────────────────────────────────────
|
|
21
|
-
* 两条车道的**账本形状不同**,而且那个差别是有理由的,不许在这里归一:
|
|
22
|
-
* · 交互车道的已提交前缀分两本(`previousSegmentCommitted` / `segmentCommitted`),因为它按
|
|
23
|
-
* **transcript 消息**划界;段跨过消息边界、且已提交那截自己也过期时它**只发信号不动字节**
|
|
24
|
-
* (`handOffOnly`,0.68.1 轮五 finding② 的基线对照结论);
|
|
25
|
-
* · print 车道只有一本(工具卡边界带走的字节跨卡累加),没有那一形 —— 它的 stdout 是只进不退
|
|
26
|
-
* 的流,`(b2)` 恒走「一个字节都不再交」。
|
|
27
|
-
* ⇒ 本模块只交**判决**;「判决出来之后各自怎么落账」仍归各自那一层。把落账也归一 = 改掉其中一条
|
|
28
|
-
* 车道的既有行为,那是行为面改动,不是归层。
|
|
29
|
-
*/
|
|
30
|
-
/** 六形归到三种**处置**(宿主按 {@link TextSegmentAuthority.form} 分支,不按「有没有 flush 过」分支)。 */
|
|
31
|
-
export type TextSegmentAuthorityForm =
|
|
32
|
-
/** (d)/(f):本层一个字节都没经手这一段 ⇒ 什么都不做(零替换、零披露)。 */
|
|
33
|
-
'untouched'
|
|
34
|
-
/** (a)/(b1)/(c)/(e)-对得上:未提交的尾段整只换成 {@link TextSegmentAuthority.tail}。 */
|
|
35
|
-
| 'replace_tail'
|
|
36
|
-
/** (b2):已提交前缀自己也过期 ⇒ **一个字节都不再交**,由宿主按前缀长度换掉那一截。 */
|
|
37
|
-
| 'withhold';
|
|
38
|
-
/**
|
|
39
|
-
* 一次权威替换的判决 —— **四件事实**,一个字节的正文都不复述(`tail` 是权威全文的切片,不是复述)。
|
|
40
|
-
*
|
|
41
|
-
* 🔴 三位事实互不替代(L-310 设计定谳,0.68.1 头注逐字保留):
|
|
42
|
-
* · {@link diverged} 回答「活体/已发那一份对不对」⇒ 要不要重渲;
|
|
43
|
-
* · {@link committedPrefixDiverged} 回答「**已经撤不回**的那一截是不是过期的」⇒ 是换尾巴还是
|
|
44
|
-
* 一个字节都不交。两位合成一个办不到:b1/b2 两形的 `diverged` 与 `committedPrefixLen` 完全同形,
|
|
45
|
-
* 而消费动作正相反;
|
|
46
|
-
* · {@link committedPrefixLen} 是**定位量**。
|
|
47
|
-
*/
|
|
1
|
+
export type TextSegmentAuthorityForm = 'untouched' | 'replace_tail' | 'withhold';
|
|
48
2
|
export interface TextSegmentAuthority {
|
|
49
3
|
readonly form: TextSegmentAuthorityForm;
|
|
50
|
-
/** 本层缝出来的那一段(已提交前缀 + 还押着的段缓冲)与权威全文**不逐字节相等**。 */
|
|
51
4
|
readonly diverged: boolean;
|
|
52
|
-
/**
|
|
53
|
-
* 本段在替换发生前**已经撤不回**的长度。
|
|
54
|
-
*
|
|
55
|
-
* 🔴 **单位 = JS 字符串长度(UTF-16 代码单元),不是 UTF-8 字节,也不是「几条消息/几条帧」**
|
|
56
|
-
* (0.68.1 轮三 finding① / 轮二 finding② 两条订正的合并结论)。按 UTF-8 字节去截会在任何
|
|
57
|
-
* 非 ASCII 正文上截错位置;按「消息」去丢会把已经定稿的上一段一起删掉。
|
|
58
|
-
* 🔴 它按**替换前的拼文**计长,**不是** `content` 上的偏移量。
|
|
59
|
-
*/
|
|
60
5
|
readonly committedPrefixLen: number;
|
|
61
|
-
/** 已提交的那一截**自己**与权威全文对不上(= 凭据落在已经出门的那一截里)。 */
|
|
62
6
|
readonly committedPrefixDiverged: boolean;
|
|
63
|
-
/**
|
|
64
|
-
* `replace_tail` 形下,未提交部分该换成的那一截 = `content.slice(committedPrefixLen)`。
|
|
65
|
-
*
|
|
66
|
-
* 🔴 另外两形下恒为空串,**而且不许拿它当「没有尾段」的判据** —— `withhold` 形下权威全文整份
|
|
67
|
-
* 都在帧上,由宿主换掉前缀那一截;`untouched` 形下本层压根没有可替换的对象。分支看
|
|
68
|
-
* {@link form},不看这一位的长度。
|
|
69
|
-
*/
|
|
70
7
|
readonly tail: string;
|
|
71
8
|
}
|
|
72
|
-
/** {@link resolveTextSegmentAuthority} 的输入 —— 调用层把自己那两截字节交进来。 */
|
|
73
9
|
export interface TextSegmentAuthorityInput {
|
|
74
|
-
/**
|
|
75
|
-
* 本段**已经撤不回**的那一截(交互车道 = 两本前缀账相加;print 车道 = 跨工具卡累加的已发前缀)。
|
|
76
|
-
*
|
|
77
|
-
* 🔴 **必须是相加后的那一份,不是二选一**(0.68.1 轮二 finding① 实抓):openai 车道的
|
|
78
|
-
* `text_end` 在 `finalize()` 里才 push,而工具卡先执行 —— 一段散文可以跨过两张卡,每一张
|
|
79
|
-
* 都带走一截。少算任何一截,`content.startsWith(前缀)` 这个判据就会在**没分歧**的常态上
|
|
80
|
-
* 误判成分歧。
|
|
81
|
-
*/
|
|
82
10
|
readonly committedPrefix: string;
|
|
83
|
-
/** 本段**还押在调用层手里、可以改**的那一截(段缓冲 / 未封存的块尾)。 */
|
|
84
11
|
readonly openSegment: string;
|
|
85
12
|
}
|
|
86
|
-
/**
|
|
87
|
-
* 权威段替换的**六形判决**(两条车道共用的那一份;`content` 是引擎报的段权威全文)。
|
|
88
|
-
*
|
|
89
|
-
* 六形与它们各自的判据锚:
|
|
90
|
-
* (a) 常态:整段还押在调用层手里 ⇒ `replace_tail`,`committedPrefixLen === 0`;
|
|
91
|
-
* (b1) 半段已出门、且 `content.startsWith(前缀)` ⇒ `replace_tail`,只换未出门那一截;
|
|
92
|
-
* (b2) 半段已出门、**前缀自己也过期** ⇒ `withhold`。🔴 判据锚 = `startsWith`,**不是**「有没有
|
|
93
|
-
* flush/提交过」—— 后者是前置条件,前者才是真正决定结果的那个量;
|
|
94
|
-
* (c) 一 turn 多段(anthropic 车道逐 `content_block_stop` 发 `text_end`):本函数只交尾段,
|
|
95
|
-
* 「换完即封存、下一段另起」由调用层落账 —— 不封存的话第二帧会把第一段正文一起覆盖;
|
|
96
|
-
* (d) 子流(`parentToolCallId` 在场):**根本不该走到这里**,断闸在调用层的臂上(拿子代的段边界
|
|
97
|
-
* 去改 leader 的缓冲 = 跨 lane 状态破坏)。本函数不认识 lane 位,也刻意不去认识它;
|
|
98
|
-
* (e) 迟到的段边界(openai 车道:工具卡先执行、`text_end` 在 `finalize()` 才到)⇒ 由调用层把
|
|
99
|
-
* 两本账相加后交进 {@link TextSegmentAuthorityInput.committedPrefix},照 (b1)/(b2) 分流;
|
|
100
|
-
* (f) 调用层一个字节都没经手这一段(两截皆空)⇒ `untouched`。替换的语义是「换掉本层自己缝合
|
|
101
|
-
* 出来的那一段」,不是「凭空铸一段」:durable 整块 `text` 腿之后再来一帧 `text_end`,塞进
|
|
102
|
-
* 空缓冲就会在收口**再铸一条一模一样的**(0.68.1 `#323-g` 正控守的就是这一形)。
|
|
103
|
-
*
|
|
104
|
-
* @param content 该段的权威全文(UNTRUSTED、仅展示,与 `text_delta` 同契约 —— 渲染,绝不回喂模型)。
|
|
105
|
-
*/
|
|
106
13
|
export declare function resolveTextSegmentAuthority(content: string, input: TextSegmentAuthorityInput): TextSegmentAuthority;
|
|
107
|
-
/**
|
|
108
|
-
* print 形车道的**段账**(L-318;交互车道不吃这一只 —— 它的账按 transcript 消息分两本,见文件头注)。
|
|
109
|
-
*
|
|
110
|
-
* 归包的理由与 `buildTaskRequest` / `taskNotificationToPrintFrame` 同一条(多端改造设计稿 §8-5):
|
|
111
|
-
* 这是一台**状态机**(什么时候前缀作废、什么时候段封顶、扣下的段怎么在终局判重),属三端公共判定;
|
|
112
|
-
* 「把尾段写进哪一个 content block」才是端的装配动作。
|
|
113
|
-
*
|
|
114
|
-
* 🔴 本台账**不持有正文块**:它只记「已经出门的那一截」「被扣下的那些段」。块对象身份锚
|
|
115
|
-
* (封存点属于哪一个块)必须留在端上 —— 那是 CC 帧形的事,包里没有那个概念。
|
|
116
|
-
*/
|
|
117
14
|
export interface TextSegmentLedger {
|
|
118
|
-
/**
|
|
119
|
-
* 一截字节**从这一拍起出门了**(print 车道 = 叙述搭上 tool_use 那条 assistant 帧发走)。
|
|
120
|
-
* 🔴 **累加,不是覆盖**:一段散文可以跨过两张卡,每张带走一截(见
|
|
121
|
-
* {@link TextSegmentAuthorityInput.committedPrefix} 的 (e) 形注)。
|
|
122
|
-
*/
|
|
123
15
|
noteFlushed(text: string): void;
|
|
124
|
-
/**
|
|
125
|
-
* 段账整只作废。三个调用点,语义同为「这一段到此为止,已发前缀对下一段无意义」:
|
|
126
|
-
* · **durable 整块 `text` 臂**:那一帧本身就是这一段的唯一载体(server 对 durable 行在写口与
|
|
127
|
-
* 读口各脱一次,它本身就是权威形),本层攒的段被它取代;
|
|
128
|
-
* · **模型轮收口**(`turn_end`):一个引擎段不可能跨模型轮(每次 API 调用有自己的 content
|
|
129
|
-
* block)⇒ 「这一段的 `text_end` 此后不会再来了」是事实,不是猜。不清账的后果实测过:
|
|
130
|
-
* 引擎省掉 `text_end` 又继续下一轮时,上一轮的已发前缀会让下一轮**正常**的 `text_end`
|
|
131
|
-
* 误入 (b2),新终答被整段清掉还附一条错的披露行;
|
|
132
|
-
* · **终局 flush**:流到此为止。
|
|
133
|
-
*/
|
|
134
16
|
closeSegmentAccount(): void;
|
|
135
|
-
/**
|
|
136
|
-
* 引擎明说这一段写完了 ⇒ 出判决 + 收账(`withhold` 形同批登记被扣段,供
|
|
137
|
-
* {@link TextSegmentLedger.repeatsWithheldSegment} 在终局判重)。
|
|
138
|
-
*
|
|
139
|
-
* @param openSegment 端此刻还押在手里、可以改的那一截(未封存的块尾)。
|
|
140
|
-
*/
|
|
141
17
|
applyTextEnd(content: string, openSegment: string): TextSegmentAuthority;
|
|
142
|
-
/**
|
|
143
|
-
* 终局兜底臂的让位判据 —— 「这一发要交的,**就是**刚才被扣的那一段吗」。
|
|
144
|
-
*
|
|
145
|
-
* 🔴 判据 = 规范化(`trim`)后**逐字相等**,不是子串关系(0.68.1 轮二两条实复现反例):
|
|
146
|
-
* ① 被扣段短到只剩一个脱敏标记时,后续**另一段**独立终答只要提到同一个标记就被整条挡掉
|
|
147
|
-
* (`includes` 误挡);② 被扣段以换行结尾时,引擎的 `assembleResult` 会 **trim** 最终正文
|
|
148
|
-
* ⇒ `includes` 不匹配,权威全文被兜底臂完整再发一次(漏挡)。
|
|
149
|
-
* 🔴 **登记的是一张表不是一个值**:一条 run 里可以有多段先后落 (b2)(多轮工具循环),
|
|
150
|
-
* 只记最后一段会让更早那段的重发漏挡。
|
|
151
|
-
*/
|
|
152
18
|
repeatsWithheldSegment(candidate: string): boolean;
|
|
153
|
-
/** 当前已出门前缀的长度(诊断/断言读位;分支判决一律走 {@link applyTextEnd} 的回执)。 */
|
|
154
19
|
readonly committedPrefixLength: number;
|
|
155
20
|
}
|
|
156
|
-
/** 建一本 print 形段账(一条流一本;跨流复用会把上一条流的已发前缀算进这一条)。 */
|
|
157
21
|
export declare function createTextSegmentLedger(): TextSegmentLedger;
|
|
@@ -1,56 +1,6 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* adapt/textSegmentAuthority.ts — `text_end.content` **权威段替换**的判决单源(L-318,0.68.2)。
|
|
3
|
-
*
|
|
4
|
-
* ── 为什么有这个文件(病形一句话)────────────────────────────────────────────────────────────
|
|
5
|
-
* 0.68.1 把权威替换落在 {@link import('./textStream.js').TextStream.replaceAnswerSegment} 里,
|
|
6
|
-
* 那一只服务的是**交互车道**(transcript / chrome 双平面)。而 `-p` 车道走的是另一条链
|
|
7
|
-
* (`eventToSdkMessage` 的内部臂 → 宿主自己的 CC stdout 投影器),它拿不到那只段缓冲 ⇒ cli 1.0.114
|
|
8
|
-
* 在壳里**又实现了一遍同样的六形**(B-122 热修)。同一条语义两份实现 = 上游改口时两边各走各的:
|
|
9
|
-
* 这正是「壳持有第二份真相」那一族病。
|
|
10
|
-
*
|
|
11
|
-
* ⇒ 本模块把**判决**(六形里真正决定结果的那三件事实 + 尾段)抽成一只**纯函数**,两条车道同吃:
|
|
12
|
-
* · 交互车道:`textStream.replaceAnswerSegment` 调它,再按本包的双平面语义落账;
|
|
13
|
-
* · print 车道:宿主(cli `PrintStreamProjector`)调它 + {@link createTextSegmentLedger},
|
|
14
|
-
* 只剩「把尾段写进 CC content block」这一步装配动作留在端上(多端改造设计稿 §8-5:
|
|
15
|
-
* stream-json 帧序/SSE 重铸属端,判定属包)。
|
|
16
|
-
*
|
|
17
|
-
* 🔴 **本模块零宿主形**:进出全是 `string` / `number` / `boolean` —— 没有 CC content block、没有
|
|
18
|
-
* transcript 消息、没有帧。可移植门(`--platform=browser` 真打包)因此一个字节都不受影响。
|
|
19
|
-
*
|
|
20
|
-
* ── 判决与落账刻意分家(读这一段再改本文件)──────────────────────────────────────────────────
|
|
21
|
-
* 两条车道的**账本形状不同**,而且那个差别是有理由的,不许在这里归一:
|
|
22
|
-
* · 交互车道的已提交前缀分两本(`previousSegmentCommitted` / `segmentCommitted`),因为它按
|
|
23
|
-
* **transcript 消息**划界;段跨过消息边界、且已提交那截自己也过期时它**只发信号不动字节**
|
|
24
|
-
* (`handOffOnly`,0.68.1 轮五 finding② 的基线对照结论);
|
|
25
|
-
* · print 车道只有一本(工具卡边界带走的字节跨卡累加),没有那一形 —— 它的 stdout 是只进不退
|
|
26
|
-
* 的流,`(b2)` 恒走「一个字节都不再交」。
|
|
27
|
-
* ⇒ 本模块只交**判决**;「判决出来之后各自怎么落账」仍归各自那一层。把落账也归一 = 改掉其中一条
|
|
28
|
-
* 车道的既有行为,那是行为面改动,不是归层。
|
|
29
|
-
*/
|
|
30
|
-
/**
|
|
31
|
-
* 权威段替换的**六形判决**(两条车道共用的那一份;`content` 是引擎报的段权威全文)。
|
|
32
|
-
*
|
|
33
|
-
* 六形与它们各自的判据锚:
|
|
34
|
-
* (a) 常态:整段还押在调用层手里 ⇒ `replace_tail`,`committedPrefixLen === 0`;
|
|
35
|
-
* (b1) 半段已出门、且 `content.startsWith(前缀)` ⇒ `replace_tail`,只换未出门那一截;
|
|
36
|
-
* (b2) 半段已出门、**前缀自己也过期** ⇒ `withhold`。🔴 判据锚 = `startsWith`,**不是**「有没有
|
|
37
|
-
* flush/提交过」—— 后者是前置条件,前者才是真正决定结果的那个量;
|
|
38
|
-
* (c) 一 turn 多段(anthropic 车道逐 `content_block_stop` 发 `text_end`):本函数只交尾段,
|
|
39
|
-
* 「换完即封存、下一段另起」由调用层落账 —— 不封存的话第二帧会把第一段正文一起覆盖;
|
|
40
|
-
* (d) 子流(`parentToolCallId` 在场):**根本不该走到这里**,断闸在调用层的臂上(拿子代的段边界
|
|
41
|
-
* 去改 leader 的缓冲 = 跨 lane 状态破坏)。本函数不认识 lane 位,也刻意不去认识它;
|
|
42
|
-
* (e) 迟到的段边界(openai 车道:工具卡先执行、`text_end` 在 `finalize()` 才到)⇒ 由调用层把
|
|
43
|
-
* 两本账相加后交进 {@link TextSegmentAuthorityInput.committedPrefix},照 (b1)/(b2) 分流;
|
|
44
|
-
* (f) 调用层一个字节都没经手这一段(两截皆空)⇒ `untouched`。替换的语义是「换掉本层自己缝合
|
|
45
|
-
* 出来的那一段」,不是「凭空铸一段」:durable 整块 `text` 腿之后再来一帧 `text_end`,塞进
|
|
46
|
-
* 空缓冲就会在收口**再铸一条一模一样的**(0.68.1 `#323-g` 正控守的就是这一形)。
|
|
47
|
-
*
|
|
48
|
-
* @param content 该段的权威全文(UNTRUSTED、仅展示,与 `text_delta` 同契约 —— 渲染,绝不回喂模型)。
|
|
49
|
-
*/
|
|
50
1
|
export function resolveTextSegmentAuthority(content, input) {
|
|
51
2
|
const committedPrefix = input.committedPrefix;
|
|
52
3
|
const openSegment = input.openSegment;
|
|
53
|
-
// (f) 两截皆空 ⇒ 什么都不做。三位全报否(never-false 律:缺席 = 否定)。
|
|
54
4
|
if (committedPrefix.length === 0 && openSegment.length === 0) {
|
|
55
5
|
return {
|
|
56
6
|
form: 'untouched',
|
|
@@ -64,7 +14,6 @@ export function resolveTextSegmentAuthority(content, input) {
|
|
|
64
14
|
const diverged = committedPrefix + openSegment !== content;
|
|
65
15
|
const committedPrefixDiverged = committedPrefixLen > 0 && !content.startsWith(committedPrefix);
|
|
66
16
|
if (committedPrefixDiverged) {
|
|
67
|
-
// (b2):已出门那截撤不回,而切片拼不出 `content` —— 再补一条就是同一段话上屏两遍。
|
|
68
17
|
return { form: 'withhold', diverged, committedPrefixLen, committedPrefixDiverged: true, tail: '' };
|
|
69
18
|
}
|
|
70
19
|
return {
|
|
@@ -75,7 +24,6 @@ export function resolveTextSegmentAuthority(content, input) {
|
|
|
75
24
|
tail: content.slice(committedPrefixLen),
|
|
76
25
|
};
|
|
77
26
|
}
|
|
78
|
-
/** 建一本 print 形段账(一条流一本;跨流复用会把上一条流的已发前缀算进这一条)。 */
|
|
79
27
|
export function createTextSegmentLedger() {
|
|
80
28
|
let committedPrefix = '';
|
|
81
29
|
const withheld = [];
|
|
@@ -90,8 +38,6 @@ export function createTextSegmentLedger() {
|
|
|
90
38
|
const verdict = resolveTextSegmentAuthority(content, { committedPrefix, openSegment });
|
|
91
39
|
if (verdict.form === 'withhold')
|
|
92
40
|
withheld.push(content);
|
|
93
|
-
// 🔴 `untouched` 形也清账:两截皆空本来就没有账可留,清它是幂等的;而漏清会把一条
|
|
94
|
-
// 「本层零经手」的段边界留成下一段的前缀(那正是 (b2) 误判的来源)。
|
|
95
41
|
committedPrefix = '';
|
|
96
42
|
return verdict;
|
|
97
43
|
},
|
|
@@ -1,293 +1,41 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* adapt/textStream.ts — M1 **流合并器**(A 族拆分 REF-CC-SPLIT-02;矩阵 §1.1 十二行状态)。
|
|
3
|
-
*
|
|
4
|
-
* 收编 ADAPT-RW-MATRIX §1.1 的 12 个变量(answer / answerSegment / thinking /
|
|
5
|
-
* emittedAssistantText / textPending / thinkingPending / textBlockOpen / thinkingBlockOpen /
|
|
6
|
-
* lastFlushAt / flushEveryMs / segmentAnchor / thinkingAnchor)+ 三个闭包(C12 takeThinking /
|
|
7
|
-
* C13 takeAnswerSegment / C14 drainLive)+ 两处原本长在驱动壳里的判据:
|
|
8
|
-
* · `hasPendingContent()` = D3 IDLE-FLUSH 竞速的四项 or(矩阵说的「接口化即封闭」);
|
|
9
|
-
* · `maybeFlushOnBeat(now)` = D5 COALESCER 节拍尾。
|
|
10
|
-
* 收进来之后这 12 行里**只剩两行**还跨模块(矩阵 §1.8):`answer` 与 `emittedAssistantText` ——
|
|
11
|
-
* 它们由 `appendAnswer()` / `markEmittedText()` 两个具名动作暴露给 assistant / result 两臂,
|
|
12
|
-
* 而不是把裸变量交出去(裸 `= true` 在拆分后没有任何人能追得住)。
|
|
13
|
-
*
|
|
14
|
-
* 🔴 不变量(段序铁律,本包最高不变量之一):**活体增量 → 思考 committed → 文本段 committed**。
|
|
15
|
-
* 三个 take/drain 的**相对次序**由调用点决定,本模块只保证每一个自身的内部序;拆分后
|
|
16
|
-
* 收口三形(result 臂 / abort 尾 / T60 尾)的次序差异登记在 ADAPT-RW-MATRIX §2.4,别归一。
|
|
17
|
-
*
|
|
18
|
-
* 🔴 0.68.1 / L-310 追加的**三行状态**(`segmentCommitted` = 当前引擎段里已经撤不回的那一截 /
|
|
19
|
-
* `previousSegmentCommitted` = 上一个包侧边界带走的那一截,迟到的段边界靠它算分歧 /
|
|
20
|
-
* `segmentSealed` = 已由引擎明报收尾、但还没提交的定稿正文)与第七个动作
|
|
21
|
-
* {@link TextStream.replaceAnswerSegment}(`text_end.content` 的权威段替换)。上面那句「12 个变量」
|
|
22
|
-
* 是 REF-CC-SPLIT-02 收编当时的实数,不是上限 —— 新增那三行各有自己的声明处头注,
|
|
23
|
-
* 数目与理由一起记明(封闭性声明必须机械验证,别拿一个对不上的数字自证)。
|
|
24
|
-
*
|
|
25
|
-
* 🔴 时序坑(矩阵 §2.3 ⑤,拆分专属):`drainLive()` 里两处 `pending = ''` 在 `yield` **之后**,
|
|
26
|
-
* 载荷是在 yield 之前**按值捕获**的,所以逻辑正确。**机械地把清空前移会读到已清空的串** ——
|
|
27
|
-
* 谁想「统一成 reset-before-yield」,先读这一条。
|
|
28
|
-
*/
|
|
29
1
|
import type { AdapterContext, AdapterOutput, TextSegmentCommittedRow } from '../seam.js';
|
|
30
2
|
import { type Frame, type IdOf } from './ids.js';
|
|
31
|
-
/**
|
|
32
|
-
* **段身份键**(CC-01,0.68.2)—— 打在 committed assistant **文本**转录行**顶层**的 `_sema_` 超集键。
|
|
33
|
-
*
|
|
34
|
-
* ── 为什么有它(归层修,不是新功能)──────────────────────────────────────────────────────────
|
|
35
|
-
* `text_segment_end` 到达时若已提交前缀自己也过期(`committedPrefixDiverged`),宿主要在**自己持有的**
|
|
36
|
-
* 转录里找出「这一段交出去的那一行」把它换掉。按字节相等去找会被**同后缀的独立行**冒充(实撞过);
|
|
37
|
-
* 按 uuid 找只证明「是这一行」,不证明「是这一段的」。⇒ 归属要两把钥匙:行身份(`uuid`)∧ **段身份**。
|
|
38
|
-
* 段身份此前由壳在自己的过境口铸(先壳后包);段的边界(开场 / 收口 / 轮换)本来就只有本模块知道,
|
|
39
|
-
* 铸点归这里,壳只读。
|
|
40
|
-
*
|
|
41
|
-
* ── 语义(一句话)────────────────────────────────────────────────────────────────────────────
|
|
42
|
-
* **一个身份覆盖「上一次段收口 → 本次段收口」之间过境的全部 committed 文本行**:流开场一个初值;
|
|
43
|
-
* idle-flush 提交的半段与终态提交的同段共享一个身份(归属正要这个);`text_segment_end` 臂处理完之后
|
|
44
|
-
* 轮换(帧上带的是轮换**前**的那一个,与它盖过的行同值);思考→回答边界**不**轮换;子流(带
|
|
45
|
-
* `parentToolCallId`)的段边界不轮换(它们不产 leader 事件,见臂头注)。
|
|
46
|
-
*
|
|
47
|
-
* ── 铸法与形 ──────────────────────────────────────────────────────────────────────────────
|
|
48
|
-
* 派生自本窗口的**第一帧**锚 + 窗口序号(`idOf(anchor, 'segment<n>')`)⇒ **同流重放同身份**
|
|
49
|
-
* (与 committed 行的 uuid 同一条确定性纪律;宿主的双跑对拍门靠它)。🔴 它是**转录格式**上的键,
|
|
50
|
-
* 不是 wire 键:只出现在宿主落盘的转录行上,不进 provider 请求(顶层自铸键不外溢,与
|
|
51
|
-
* `_sema_degraded` 同律)。🔴 **只盖尾块是 `text` 的 assistant 行**:只带 `tool_use` 的行永远不可能是
|
|
52
|
-
* 替换目标,盖了只是往转录里加噪;思考块同理。缺席 = 「这条不属于任何引擎段」,不是「属于某个未知段」。
|
|
53
|
-
* 🔴 **只加不减**:非本形消息一个字节不动。
|
|
54
|
-
*/
|
|
55
3
|
export declare const SEMA_SEGMENT_ID_KEY = "_sema_segment_id";
|
|
56
|
-
/**
|
|
57
|
-
* {@link TextStream.replaceAnswerSegment} 的回执 —— **三件事实**,一个字节的正文都不复述。
|
|
58
|
-
*
|
|
59
|
-
* 🔴 三位**互不替代**(L-310 设计定谳,2026-09-14):
|
|
60
|
-
* · {@link diverged} 回答「屏上那份对不对」;
|
|
61
|
-
* · {@link committedPrefixLen} 回答「这一段有多少字节**已经撤不回**了」(idle-flush 铸过的
|
|
62
|
-
* transcript 消息早已 yield 给宿主);
|
|
63
|
-
* · {@link committedPrefixDiverged} 回答「撤不回的那一截**自己**是不是也被改过」——
|
|
64
|
-
* 它为真就是本件要防的最坏一形:**未脱敏字节已经进了本地转录**,包内修不了,只有宿主重渲。
|
|
65
|
-
*/
|
|
66
4
|
export interface TextSegmentReplacement {
|
|
67
|
-
/** 替换前按 delta 拼出来的本段全文 ≠ 权威全文。假 = 逐字节相同(旧引擎 / 不含凭据形的文本)。 */
|
|
68
5
|
diverged: boolean;
|
|
69
|
-
/**
|
|
70
|
-
* CC-16(0.71.0):本段身份窗口里、段边界**之前**已提交的文本行 uuid(按序;与 `committedThinking` 同律)。
|
|
71
|
-
* `[]` = 本包判定本窗口零已提交行(在场但空);整键缺席只留给形 (f)(本包零经手,说不出)。
|
|
72
|
-
* 端义务:`committedPrefixDiverged` ⇒ 按 `committedRows` 逐行写回(首行 = 前段定稿前缀 + content、其余行空);不再自己数窗口里过境的行。
|
|
73
|
-
*/
|
|
74
6
|
committedUuids?: readonly string[];
|
|
75
|
-
/** 末条兼容位(与思考面 `committedUuid` 同律);零行时缺席。 */
|
|
76
7
|
committedUuid?: string;
|
|
77
|
-
/**
|
|
78
|
-
* 端要写回的最终正文(按行,与 `committedUuids` 同序);只在 `committedPrefixDiverged` ∧ 有已提交行时在场。
|
|
79
|
-
* 首行 = 前段定稿前缀(该行里属上一段、已封存的那截)+ `content`,其余行 `''`。混合行(A 定稿 + B 原始同一条)
|
|
80
|
-
* 的 A 不被换掉 —— 端整行换首行会删掉上一段权威正文(异源对抗复审第 1 轮 finding①)。
|
|
81
|
-
*/
|
|
82
8
|
committedRows?: readonly TextSegmentCommittedRow[];
|
|
83
|
-
/**
|
|
84
|
-
* 本段在替换发生前**已经 committed 上屏**的长度(idle-flush 的那些刀 + 包侧边界带走的那些截)。
|
|
85
|
-
*
|
|
86
|
-
* 🔴 **单位 = JS 字符串长度(UTF-16 代码单元),不是 UTF-8 字节,也不是「几条消息」**
|
|
87
|
-
* (异源对抗复审轮三 finding① 订正 —— 此前文案写「字节」,宿主按 UTF-8 字节去截会在任何非
|
|
88
|
-
* ASCII 正文上截错位置:实测 `'sk-…' + '中文'×30 + '.\n'` 的 UTF-16 长度 82 / UTF-8 字节 202,
|
|
89
|
-
* 按 202 截会把凭据**原样留在屏上**还附带乱码)。它就是给 `String.prototype.slice` 用的那个数:
|
|
90
|
-
* `已committed正文.slice(0, 已committed正文.length - committedPrefixLen) + content`。
|
|
91
|
-
* 🔴 **不是「几条消息」**:本包在 idle-flush 那一形下会把「上一段的定稿 + 这一段的半截」合并进
|
|
92
|
-
* **同一条**消息(分段行为零改动的代价),按**消息**去丢会把已经定稿的上一段一起删掉,而本包
|
|
93
|
-
* 不会再补发它。
|
|
94
|
-
* 🔴 它按**替换前的拼文**计长,**不是** `content` 上的偏移量 —— 前缀自己也可能被脱敏改过字节
|
|
95
|
-
* (见 {@link committedPrefixDiverged});拿它去切 `content` 在那一形上会切出半截乱码。
|
|
96
|
-
*/
|
|
97
9
|
committedPrefixLen: number;
|
|
98
|
-
/**
|
|
99
|
-
* 已提交的那一截**本身**与权威全文对不上(= 凭据落在已经上屏的那一截里)。
|
|
100
|
-
* 🔴 **统一规则**:这一位为真时本模块**一个字节都不再交**给转录面 —— 已提交那截撤不回,而切片
|
|
101
|
-
* 拼不出 `content`,再补一条就是同一段话上屏两遍。该段唯一算数的那一份在帧上的 `content` 里,
|
|
102
|
-
* 宿主用它换掉 {@link committedPrefixLen} 指的那一截(所以 chrome 臂上这一位是
|
|
103
|
-
* never-false 的显形键,不是内部量)。
|
|
104
|
-
* 🔴 这一形下、且**这一截整个都在当前这条 assistant 消息里**时,本模块同批把终答补差账
|
|
105
|
-
* ({@link TextStream.committedAnswerText})同步成「宿主照契约换过之后屏上有什么」——
|
|
106
|
-
* 不同步的话 `result` 臂会把权威全文当成「屏上缺的后缀」**再渲一遍**(轮三 finding② 实抓)。
|
|
107
|
-
* ⚠️ **段跨过包侧边界(工具卡 / 消息划界)时刻意不碰账**:那一截的字节落在**别的**消息里,而两本
|
|
108
|
-
* 补差账是**按消息**记的,写进当前这本就是把别条消息的正文算进这条(轮四 finding①② 实抓的两种
|
|
109
|
-
* 翻车)。那几形的补差基线与「换过之后的屏」对不齐 —— **这是本批之前就有的行为**(主树同条
|
|
110
|
-
* 时序实测同形),根因是包/引擎两套边界对不齐,根治见 `seam.ts` 义务① 末尾那条留白。
|
|
111
|
-
*/
|
|
112
10
|
committedPrefixDiverged: boolean;
|
|
113
11
|
}
|
|
114
|
-
/** {@link TextStream.replaceThinkingSegment} 的回执 —— 与 {@link TextSegmentReplacement} 同名同律,多一把 uuid。 */
|
|
115
12
|
export interface ThinkingSegmentReplacement {
|
|
116
|
-
/** 本包缝出来的那一块(已提交的 ∪ 还押着的)与权威全文不逐字节相等。 */
|
|
117
13
|
diverged: boolean;
|
|
118
|
-
/** 已 committed 思考行的全文长度(整块;0 = 没提交过)。 */
|
|
119
14
|
committedPrefixLen: number;
|
|
120
|
-
/** 已 committed 的那条思考行与权威全文不相等 ⇒ 本包不再交字节,宿主整块换。 */
|
|
121
15
|
committedPrefixDiverged: boolean;
|
|
122
|
-
/** 有已提交行时在场:**末条**行的 `uuid`(0.69.0 起;兼容位)。 */
|
|
123
16
|
committedUuid?: string;
|
|
124
|
-
/** CC-11(0.69.1):有已提交行时在场:段内**全部**已提交思考行的 `uuid`(按提交序;跨工具卡时多条)。 */
|
|
125
17
|
committedUuids?: readonly string[];
|
|
126
18
|
}
|
|
127
|
-
/** M1 对外的七个动作 + 两个读位(矩阵 §3.2 的 #2/#3 两条跨模块接口就是最后那三件)。 */
|
|
128
19
|
export interface TextStream {
|
|
129
|
-
/** A5 `text_delta` 半场:MOD-1 思考→回答边界(思考在场就先 committed 上屏)+ 段锚 + 三缓冲累加。 */
|
|
130
20
|
feedText(delta: string, frame: Frame): Generator<AdapterOutput>;
|
|
131
|
-
/** A5 `thinking_delta` 半场:首条推理增量点亮活动行(P2d elapsed 锚)。 */
|
|
132
21
|
feedThinking(delta: string, frame: Frame): Generator<AdapterOutput>;
|
|
133
|
-
/** 合并后的活体增量下泄(思考先于文本 = 持久臂序)。 */
|
|
134
22
|
drainLive(): Generator<AdapterOutput>;
|
|
135
|
-
/** 提交累积的思考块。 */
|
|
136
23
|
takeThinking(): Generator<AdapterOutput>;
|
|
137
|
-
/** 提交累积的文本段(#27 段序铁律)。**正常边界**专用(工具卡前 / turn 收口)。 */
|
|
138
24
|
takeAnswerSegment(): Generator<AdapterOutput>;
|
|
139
|
-
/**
|
|
140
|
-
* T40 IDLE-FLUSH 专用的段提交口(#323 症状①,2026-08-25 clay 裁 (a)+(b) **合取**)。
|
|
141
|
-
*
|
|
142
|
-
* 与 {@link takeAnswerSegment} 的差别只在**准入**,提交本体逐字同一份实现:
|
|
143
|
-
* (a) **每段至多一刀**:idle 提交过一次之后,该段后续 idle 一律跳过,直到一次**正常边界**
|
|
144
|
-
* (工具卡前 / turn 收口的 `takeAnswerSegment`)重开新段;
|
|
145
|
-
* (b) **只在句末/段末边界提交**:段尾不是句末字符或换行 ⇒ 跳过本拍,等下一拍。
|
|
146
|
-
* 两条都不满足时**什么都不做**(缓冲原样押着,活体预览照常由 `drainLive` 走)。
|
|
147
|
-
*/
|
|
148
25
|
takeAnswerSegmentOnIdle(): Generator<AdapterOutput>;
|
|
149
|
-
/**
|
|
150
|
-
* L-310 —— 用引擎报的**段权威全文**整段替换本段已攒的 delta 拼文(server ≥7.75.3)。
|
|
151
|
-
*
|
|
152
|
-
* ## 为什么要有它(病形一句话)
|
|
153
|
-
* server 7.75.3 起 `text_end.content` 走的是与 `result`/账本同一只**脱敏器**,而 `text_delta`
|
|
154
|
-
* 仍逐字(跨 chunk 的凭据无法就地判)⇒ 两者**可以不相等**。本包此前只把 `content` 当段界信号,
|
|
155
|
-
* 于是屏上的活体流与 transcript 平面的 committed 消息用的都是 delta 拼文 —— 一段含凭据的回答
|
|
156
|
-
* 以**未脱敏**的字节留在本地转录里。契约原文(server `ASSISTANT-WIRE-CONTRACT` §5.1 live 面)
|
|
157
|
-
* 逐字:「消费端在 `text_end` 到达时应以它**整段替换**已攒的 delta,而不是只当段界信号」。
|
|
158
|
-
*
|
|
159
|
-
* ## 四形怎么处置(每一形都是**判断**,不是顺手)
|
|
160
|
-
* (a) **`text_end` 先于段提交**(常态):整段还押在缓冲里 ⇒ 段缓冲整段换成 `content`,
|
|
161
|
-
* 下一次 {@link TextStream.takeAnswerSegment} 铸出来的 committed 文本就是权威全文。
|
|
162
|
-
* (b) **半段已被 idle-flush 提交**:那条 transcript 消息**早已 yield 给宿主**,包内撤不回。
|
|
163
|
-
* · 已提交前缀逐字对得上 ⇒ 只封存**未提交尾段**(`content` 去掉前缀那一截),两条 committed
|
|
164
|
-
* 拼起来逐字节 = `content`;
|
|
165
|
-
* · 已提交前缀**自己**就对不上(凭据落在它里面)⇒ **一个字节都不再交**
|
|
166
|
-
* ({@link TextSegmentReplacement.committedPrefixDiverged} 为真),该段唯一算数的那一份在帧上,
|
|
167
|
-
* 由宿主重渲并丢掉此前那些消息 —— 「整条 committed 消息重铸」只能由宿主做(它才持有那条
|
|
168
|
-
* 消息的句柄),包能做的是**把这件事说出来**。
|
|
169
|
-
* 判据锚在 `content.startsWith(<已提交前缀>)`,不锚「有没有 idle-flush 过」——
|
|
170
|
-
* 后者是前置条件,前者才是真正决定结果的量。
|
|
171
|
-
* (c) **一 turn 多段**(anthropic 车道常态:逐 `content_block_stop` 发 `text_end`):定稿正文
|
|
172
|
-
* **封存**、`answerSegment` 清空给下一段用。🔴 不清空 = 下一段的 delta 接着往同一个缓冲里加、
|
|
173
|
-
* 再被下一帧的 `content` 整段覆盖 ⇒ **上一段的正文凭空消失**,且下一帧还会误报 `diverged`
|
|
174
|
-
* (异源对抗复审实抓)。封存**不切消息**:整 turn 仍只提交一条 assistant 文本消息。
|
|
175
|
-
* (d) **子流**(`parentToolCallId` 在场):根本到不了这里 —— 臂在 `arms.ts` 就断闸了
|
|
176
|
-
* (拿子代的段边界去改 leader 的缓冲 = 跨 lane 状态破坏)。
|
|
177
|
-
* (e) 🔴 **迟到的段边界**(openai 车道实测时序:`text_end` 在 `finalize()` 里 push,而
|
|
178
|
-
* `toolcall_end` 先触发 `executor.maybeAdmit` ⇒ **工具卡先到、段边界后到**):那一拍卡前散文
|
|
179
|
-
* 已被 `takeAnswerSegment()` 提交进**上一条**消息,两个缓冲双双为空。据
|
|
180
|
-
* {@link previousSegmentCommitted} **照算分歧、照发信号**,但**不铸任何消息**(那些字节在
|
|
181
|
-
* 上一条消息里,在这里补一条只会落到工具卡**之后**)。修前这一形被当成 (f) 全否返回 ⇒
|
|
182
|
-
* 一段未脱敏正文静静留在转录里、三个键一个都不发(异源对抗复审实抓)。
|
|
183
|
-
* (f) 🔴 **本包一个字节都没经手这一段**(两本前缀账与段缓冲全空):**什么都不做**,三位全报否。
|
|
184
|
-
* 替换的语义是「换掉本包自己缝合出来的那一段」,不是「凭空铸一段」—— durable 内容腿
|
|
185
|
-
* (整块 `text` 帧,本身就是一整条 assistant 消息)之后再来一帧 `text_end`,塞进缓冲就会在
|
|
186
|
-
* turn 收口**再铸一条一模一样的**。红先绿后实抓(`run-client-core-pure-test` `#323-g`)。
|
|
187
|
-
*
|
|
188
|
-
* ## 活体面(`textPending`)按替换后的段重算
|
|
189
|
-
* 已经泄出去的那一截(`stream_delta`)**撤不回**。所以:已泄前缀仍是 `content` 的前缀 ⇒ 尾巴
|
|
190
|
-
* 换成 `content` 剩下那一截(屏上接着往下写,零重复);已泄前缀**不是** `content` 的前缀 ⇒
|
|
191
|
-
* **不再补任何尾巴**(在一段错的前缀后面接上权威后缀,拼出来的是一段谁都没说过的话),
|
|
192
|
-
* 由宿主按 `diverged` 重渲整段。
|
|
193
|
-
*
|
|
194
|
-
* @param content 该段的权威全文(UNTRUSTED、仅展示,与 `text_delta` 同契约)。
|
|
195
|
-
* @param anchor 本帧 —— 段锚此刻为空(整段已被 idle 提交光 / 整段零 delta)时用它当 committed
|
|
196
|
-
* 消息的 id 锚;段锚已在场时**不覆盖**(重放确定性:同流同 id)。
|
|
197
|
-
*/
|
|
198
26
|
replaceAnswerSegment(content: string, anchor?: Frame): TextSegmentReplacement;
|
|
199
|
-
/** D3 IDLE-FLUSH 竞速判据:四个缓冲有任何一个非空。 */
|
|
200
27
|
hasPendingContent(): boolean;
|
|
201
|
-
/** D5 攒批节拍:一个间隔至多一次 flush(判据与 `lastFlushAt` 一起收在本模块内)。 */
|
|
202
28
|
maybeFlushOnBeat(nowMs: number): Generator<AdapterOutput>;
|
|
203
|
-
/**
|
|
204
|
-
* A1 durable text 臂:把整块 text 计进 `answer`(它不走增量通道)。
|
|
205
|
-
*
|
|
206
|
-
* ── ADAPT-F8 留/删裁定(2026-08-02;矩阵 §338 点名要的那条裁定,此前仓内零落痕)──────────
|
|
207
|
-
* 事实:`answer` 的**唯一读者**是驱动壳 D8 收口的 `ctx.log?.('debug', … answerLen=…)`;拆分把
|
|
208
|
-
* 旧本一行 `void answer`(自陈「保留供调试/后续批」)换成了 `appendAnswer` + `answerLength`
|
|
209
|
-
* 两个模块级出口 —— 净效果与矩阵意图相反(包袱没裁,反而升了格)。
|
|
210
|
-
* **裁定 = 留**,理由与代价一起记明:
|
|
211
|
-
* · 留:D8 那行是「这个 turn 到底产没产出文本」的**唯一**分诊锚,而它恰好是本域最常翻车的
|
|
212
|
-
* 一类现象(终答兜底/段序/markEmittedText 三处任一漏配都在这里现形)。删掉等于把一条真在
|
|
213
|
-
* 用的诊断腿换成「下次再从头加仪器」。它不是「不报错的妥协」,是有读者的可观测面。
|
|
214
|
-
* · 代价(认领,不粉饰):两个出口是 turn 级状态的模块 API 面,`appendAnswer` 的调用点漂了
|
|
215
|
-
* 没有门会说话(答案长度只进 debug 行,没人对账)。所以它**不许再长第三个读者** —— 想读
|
|
216
|
-
* 正文的人去读段缓冲,别把这个累加器当答案来源。
|
|
217
|
-
*/
|
|
218
29
|
appendAnswer(text: string): void;
|
|
219
|
-
/**
|
|
220
|
-
* 「本 turn 已经产过 assistant 文本」的具名写口(A1 durable / A7 终答兜底两处)。
|
|
221
|
-
*
|
|
222
|
-
* `committed` = 这一发**真上屏**的那段正文(计入 {@link TextStream.committedAnswerText})。
|
|
223
|
-
* 缺席 = 只翻位不记账 —— 保留给「翻位但没有正文可记」的调用点;新调用点一律把正文传进来,
|
|
224
|
-
* 不传会让补差判据少算一截、把「已经在屏上了」的内容当成缺的再补一遍。
|
|
225
|
-
*/
|
|
226
30
|
markEmittedText(committed?: string): void;
|
|
227
|
-
/** A7 终答兜底的门 + D8 收口日志读位。 */
|
|
228
31
|
readonly emittedAssistantText: boolean;
|
|
229
|
-
/**
|
|
230
|
-
* **当前这条 assistant 消息**已提交上屏的正文(工具边界重置;durable 整条直渲时整段替换)。
|
|
231
|
-
*
|
|
232
|
-
* 🔴 **为什么是「当前这条消息」而不是「本 turn 全部正文」**(车内异源复审逼出的真病):终帧
|
|
233
|
-
* `result` 那一位在引擎侧取的是**最后一条 assistant 消息**的文本(装在盘上的引擎产物直证:
|
|
234
|
-
* `assembleResult` 只对 `final` 那一条调 `assistantText`,再 `.trim()`),**不是**整轮的拼接。
|
|
235
|
-
* 拿「本 turn 全部正文」去与它比,一个再正常不过的多步回答(散文 → 工具 → 散文)就会被判成
|
|
236
|
-
* 「两份互相都不是对方前缀」⇒ 对着一条完全正常的 turn 报分岔。⇒ 比较的两边必须是**同一种
|
|
237
|
-
* 东西**:一条 assistant 消息对一条 assistant 消息。
|
|
238
|
-
* 🔴 它与 {@link TextStream.answerLength} 背后那个累加器**不是同一个**,别合并:那一个记的是
|
|
239
|
-
* 「模型这一轮产了多少字」(含还押在缓冲里、尚未提交的、且跨消息累加),只进 D8 的调试行;
|
|
240
|
-
* 这一个记的是「屏上这条消息已经有了哪些字」,是**补差判据的输入**。
|
|
241
|
-
*/
|
|
242
32
|
readonly committedAnswerText: string;
|
|
243
|
-
/**
|
|
244
|
-
* 引擎「最后一条 assistant 消息」在屏上对应的那段正文 —— 终答补差的**正确比较对象**(0.63.2)。
|
|
245
|
-
*
|
|
246
|
-
* 🔴 与 {@link TextStream.committedAnswerText} 的差别只在一格:工具卡是这一轮最后一件事、卡后
|
|
247
|
-
* **零散文**时,`committedAnswerText` 已被边界重置成空串,而 provider 的一条 assistant 消息 =
|
|
248
|
-
* [text, tool_use] 两块 —— 引擎取的「最后一条消息的文本」正是卡**之前**那段。空串是任何终帧的
|
|
249
|
-
* 前缀,拿它去比会把整段终帧当「缺的后缀」再渲一遍(同一段话上屏两遍)。⇒ 当前消息一个字都没
|
|
250
|
-
* 上屏时,回退到**上一条真有正文的消息**那段;当前消息有字时与 `committedAnswerText` 逐字同。
|
|
251
|
-
*/
|
|
252
33
|
readonly lastCommittedAnswerText: string;
|
|
253
|
-
/**
|
|
254
|
-
* **一条新的 assistant 消息从这里开始**(重置 {@link TextStream.committedAnswerText})。
|
|
255
|
-
*
|
|
256
|
-
* 调用点恰两处,两处都是「上一条消息到此为止」这个事实的发生地:
|
|
257
|
-
* · 工具卡臂 —— 卡之前的散文已经段提交,卡之后的散文属于**下一条** assistant 消息;
|
|
258
|
-
* · durable 整条正文臂 —— 那一帧本身就是**一整条**消息(先划界、再把它记成这条消息的全部)。
|
|
259
|
-
* 🔴 它**不动** `emittedAssistantText`:那一位问的是「这一轮产没产过正文」,与消息边界无关。
|
|
260
|
-
*/
|
|
261
34
|
beginAssistantMessage(): void;
|
|
262
|
-
/**
|
|
263
|
-
* CC-02(0.68.3;server ≥7.77.0 `reasoning_end`):思考块的**权威段替换** —— `text_end` 那一套
|
|
264
|
-
* ({@link TextStream.replaceAnswerSegment})在推理面的孪生,但**只有两形**:
|
|
265
|
-
* (a) 思考还押在缓冲里(没到任何提交边界)⇒ 缓冲整块换成 `content`,活体尾巴按已泄前缀重算;
|
|
266
|
-
* (b) 思考已在边界**整块**提交(思考→回答边界最常见:`text_delta` 先到、server 的 `reasoning_end`
|
|
267
|
-
* 后到)⇒ 撤不回,一个字节都不再交;立 `committedPrefixDiverged` + 那条行的 `uuid`,由宿主整块换。
|
|
268
|
-
* (f) 本包一个字节都没经手(durable 整块思考臂 / 宿主只喂 end 不喂 delta)⇒ 什么都不做。
|
|
269
|
-
* CC-11(0.69.1)补上 (b1):一段推理**跨工具卡**时已提交的是多条行,前缀 = 全部行按序拼接 —— 对得上就只换还押着的
|
|
270
|
-
* 后段,对不上就整段归宿主换;两形都把全部行的 uuid 交出去(`committedUuids`,`committedUuid` = 末条兼容位)。
|
|
271
|
-
* 无 idle-flush、无封存(思考块只在正常边界整块提交)。
|
|
272
|
-
*/
|
|
273
35
|
replaceThinkingSegment(content: string, anchor?: Frame): ThinkingSegmentReplacement;
|
|
274
|
-
/**
|
|
275
|
-
* 当前**段身份**(语义与铸法见 {@link SEMA_SEGMENT_ID_KEY} 头注)。同一窗口内多次读**同值**;
|
|
276
|
-
* 首次读时窗口还没有帧锚(durable 整条消息先于任何增量到达)⇒ 退到 `ctx.uuid()` 并缓存。
|
|
277
|
-
*/
|
|
278
36
|
segmentId(): string;
|
|
279
|
-
/**
|
|
280
|
-
* **段界到此为止**:换新段身份(下一窗口以 `anchor` 为帧锚)。调用点恰一处 = `text_segment_end`
|
|
281
|
-
* 臂处理完之后(帧上带的是轮换前的那一个)。🔴 不在这里之外的任何地方轮换。
|
|
282
|
-
*/
|
|
283
37
|
rotateSegmentIdentity(anchor: Frame): void;
|
|
284
|
-
/**
|
|
285
|
-
* **出口单点**:committed assistant **文本**行盖当前段身份({@link SEMA_SEGMENT_ID_KEY});
|
|
286
|
-
* 非本形(chrome 事件 / 思考块 / 只带 tool_use 的行 / 非 assistant)**原样返回,一个字节不动**。
|
|
287
|
-
* 调用点恰一处 = `adapt()` 的出口(durable 整条与流式分段两条腿都从那里过)。
|
|
288
|
-
*/
|
|
289
38
|
stampSegmentIdentity(out: AdapterOutput): AdapterOutput;
|
|
290
|
-
/** D8 收口日志读位(`answer` 本体不出模块)。 */
|
|
291
39
|
readonly answerLength: number;
|
|
292
40
|
}
|
|
293
41
|
export declare function createTextStream(ctx: AdapterContext, idOf: IdOf): TextStream;
|