@sema-agent/client-core 0.77.0 → 0.77.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -1
- package/README.md +5 -4
- package/dist/abortableSleep.d.ts +0 -28
- package/dist/abortableSleep.js +0 -28
- package/dist/adapt/arms.d.ts +0 -46
- package/dist/adapt/arms.js +9 -544
- package/dist/adapt/ids.d.ts +0 -58
- package/dist/adapt/ids.js +0 -63
- package/dist/adapt/instanceLedger.d.ts +0 -25
- package/dist/adapt/instanceLedger.js +0 -20
- package/dist/adapt/panelTasks.d.ts +0 -69
- package/dist/adapt/panelTasks.js +0 -95
- package/dist/adapt/textSegmentAuthority.d.ts +1 -137
- package/dist/adapt/textSegmentAuthority.js +0 -54
- package/dist/adapt/textStream.d.ts +0 -252
- package/dist/adapt/textStream.js +2 -281
- package/dist/adapt/toolCards.d.ts +0 -46
- package/dist/adapt/toolCards.js +0 -23
- package/dist/adapt/turnFlags.d.ts +0 -54
- package/dist/adapt/turnFlags.js +1 -17
- package/dist/adapt/wireShapes.d.ts +0 -92
- package/dist/adapt/wireShapes.js +0 -83
- package/dist/adapt.d.ts +0 -55
- package/dist/adapt.js +1 -120
- package/dist/adapter/activeRunSelfHeal.d.ts +22 -515
- package/dist/adapter/activeRunSelfHeal.js +10 -625
- package/dist/adapter/downstream/eventToSdkMessage.d.ts +2 -305
- package/dist/adapter/downstream/eventToSdkMessage.js +2 -867
- package/dist/adapter/downstream/terminalToSdkResult.d.ts +2 -314
- package/dist/adapter/downstream/terminalToSdkResult.js +13 -560
- package/dist/adapter/downstream/turnUsageToModelUsage.d.ts +0 -95
- package/dist/adapter/downstream/turnUsageToModelUsage.js +2 -31
- package/dist/adapter/runStream.d.ts +0 -206
- package/dist/adapter/runStream.js +6 -596
- package/dist/adapter/types.d.ts +0 -111
- package/dist/adapter/types.js +0 -29
- package/dist/agentSession/backgroundView.d.ts +0 -106
- package/dist/agentSession/backgroundView.js +3 -49
- package/dist/agentSession/contract.d.ts +0 -98
- package/dist/agentSession/contract.js +0 -12
- package/dist/agentsWireCaps.d.ts +0 -72
- package/dist/agentsWireCaps.js +4 -72
- package/dist/approvalsStreamLiveCapability.d.ts +0 -25
- package/dist/approvalsStreamLiveCapability.js +0 -31
- package/dist/argvFlagValue.d.ts +0 -33
- package/dist/argvFlagValue.js +3 -35
- package/dist/attachmentsWireCaps.d.ts +0 -127
- package/dist/attachmentsWireCaps.js +0 -144
- package/dist/autoModeUnavailable.d.ts +0 -120
- package/dist/autoModeUnavailable.js +0 -144
- package/dist/classifierStatus.d.ts +0 -72
- package/dist/classifierStatus.js +0 -167
- package/dist/classifierVerdictWire.d.ts +0 -54
- package/dist/classifierVerdictWire.js +0 -133
- package/dist/clientContextWireCaps.d.ts +0 -37
- package/dist/clientContextWireCaps.js +0 -36
- package/dist/clientSlice.d.ts +0 -63
- package/dist/clientSlice.js +0 -45
- package/dist/cloudConfigWireCaps.d.ts +0 -86
- package/dist/cloudConfigWireCaps.js +2 -65
- package/dist/compensations.d.ts +0 -52
- package/dist/compensations.js +2 -63
- package/dist/controlRouter.d.ts +2 -208
- package/dist/controlRouter.js +1 -129
- package/dist/coreValuePorts.d.ts +0 -84
- package/dist/coreValuePorts.js +0 -29
- package/dist/decideReceipt.d.ts +0 -110
- package/dist/decideReceipt.js +0 -84
- package/dist/detachWire.d.ts +0 -130
- package/dist/detachWire.js +1 -130
- package/dist/deviceExecutorManagementCapability.d.ts +2 -35
- package/dist/deviceExecutorManagementCapability.js +1 -37
- package/dist/diagnostics.d.ts +0 -8
- package/dist/diagnostics.js +0 -8
- package/dist/diff/patch.d.ts +0 -17
- package/dist/diff/patch.js +0 -19
- package/dist/effectiveFacts.d.ts +0 -40
- package/dist/effectiveFacts.js +0 -22
- package/dist/effortWire.d.ts +0 -11
- package/dist/effortWire.js +0 -12
- package/dist/engineAgentPanelStore.d.ts +0 -169
- package/dist/engineAgentPanelStore.js +13 -293
- package/dist/engineCapReader.d.ts +0 -62
- package/dist/engineCapReader.js +1 -43
- package/dist/engineCapsCache.d.ts +0 -177
- package/dist/engineCapsCache.js +0 -199
- package/dist/engineCapsGenerationGuard.d.ts +0 -2
- package/dist/engineCapsGenerationGuard.js +0 -11
- package/dist/engineErrorCodes.d.ts +1 -316
- package/dist/engineErrorCodes.js +0 -427
- package/dist/engineHttpTools.d.ts +0 -29
- package/dist/engineHttpTools.js +0 -29
- package/dist/engineIdentity.d.ts +0 -83
- package/dist/engineIdentity.js +0 -88
- package/dist/engineInlineTaskStats.d.ts +0 -57
- package/dist/engineInlineTaskStats.js +1 -42
- package/dist/engineNoticeCodes.d.ts +0 -190
- package/dist/engineNoticeCodes.js +0 -182
- package/dist/engineSessionParam.d.ts +0 -30
- package/dist/engineSessionParam.js +0 -52
- package/dist/engineToolLabelStore.d.ts +0 -29
- package/dist/engineToolLabelStore.js +0 -31
- package/dist/engineWireSdk.d.ts +0 -90
- package/dist/engineWireSdk.js +0 -74
- package/dist/engineWireTarget.d.ts +0 -14
- package/dist/engineWireTarget.js +0 -39
- package/dist/env/localeGeo.d.ts +0 -12
- package/dist/env/localeGeo.js +2 -77
- package/dist/env/localeTag.d.ts +0 -34
- package/dist/env/localeTag.js +0 -32
- package/dist/env/uiLanguage.d.ts +0 -13
- package/dist/env/uiLanguage.js +0 -25
- package/dist/envFlag.d.ts +0 -37
- package/dist/envFlag.js +0 -40
- package/dist/executionLaneCapability.d.ts +0 -48
- package/dist/executionLaneCapability.js +0 -54
- package/dist/finalVerifyWire.d.ts +0 -67
- package/dist/finalVerifyWire.js +3 -43
- package/dist/fleet/fleetLedger.d.ts +0 -308
- package/dist/fleet/fleetLedger.js +10 -429
- package/dist/fleet/fleetProjection.d.ts +0 -240
- package/dist/fleet/fleetProjection.js +0 -189
- package/dist/fleet/fleetRowAgentType.d.ts +0 -6
- package/dist/fleet/fleetRowAgentType.js +1 -32
- package/dist/fleet/workflowSizeWarning.d.ts +0 -47
- package/dist/fleet/workflowSizeWarning.js +1 -46
- package/dist/fleetAgentPanelProjection.d.ts +0 -48
- package/dist/fleetAgentPanelProjection.js +8 -173
- package/dist/fleetTaskDesc.d.ts +0 -39
- package/dist/fleetTaskDesc.js +0 -69
- package/dist/forkWireCaps.d.ts +0 -23
- package/dist/forkWireCaps.js +1 -24
- package/dist/gateOutcome.d.ts +0 -140
- package/dist/gateOutcome.js +0 -85
- package/dist/gateVocabulary.d.ts +0 -114
- package/dist/gateVocabulary.js +1 -161
- package/dist/goalStopHook.d.ts +0 -127
- package/dist/goalStopHook.js +0 -178
- package/dist/headlessPermissionModeWire.d.ts +0 -76
- package/dist/headlessPermissionModeWire.js +1 -155
- package/dist/headlessReconnectWire.d.ts +0 -84
- package/dist/headlessReconnectWire.js +13 -67
- package/dist/hitl/approvalDecisionNoteAudit.d.ts +0 -49
- package/dist/hitl/approvalDecisionNoteAudit.js +0 -56
- package/dist/hitl/approvalOutcomeNote.d.ts +0 -2
- package/dist/hitl/approvalOutcomeNote.js +0 -20
- package/dist/hitl/approvalResolution.d.ts +0 -113
- package/dist/hitl/approvalResolution.js +0 -66
- package/dist/hitl/approvalsFeed.d.ts +0 -183
- package/dist/hitl/approvalsFeed.js +12 -243
- package/dist/hitl/armedGateRegistry.d.ts +0 -55
- package/dist/hitl/armedGateRegistry.js +0 -146
- package/dist/hitl/askGateWire.d.ts +0 -86
- package/dist/hitl/askGateWire.js +1 -95
- package/dist/hitl/askParkRowRouting.d.ts +0 -123
- package/dist/hitl/askParkRowRouting.js +1 -89
- package/dist/hitl/crashConverged.d.ts +0 -148
- package/dist/hitl/crashConverged.js +0 -214
- package/dist/hitl/editedRuleTextPrecheck.d.ts +0 -109
- package/dist/hitl/editedRuleTextPrecheck.js +0 -71
- package/dist/hitl/frameRouter.d.ts +0 -134
- package/dist/hitl/frameRouter.js +6 -378
- package/dist/hitl/gateIdentity.d.ts +0 -39
- package/dist/hitl/gateIdentity.js +0 -41
- package/dist/hitl/gateLedger.d.ts +0 -267
- package/dist/hitl/gateLedger.js +0 -121
- package/dist/hitl/hitlBridge.d.ts +7 -431
- package/dist/hitl/hitlBridge.js +7 -476
- package/dist/hitl/hitlHostSurface.d.ts +0 -150
- package/dist/hitl/hitlHostSurface.js +0 -169
- package/dist/hitl/livePendingAsk.d.ts +0 -91
- package/dist/hitl/livePendingAsk.js +0 -74
- package/dist/hitl/localAllowRule.d.ts +0 -62
- package/dist/hitl/localAllowRule.js +1 -33
- package/dist/hitl/parkOwnership.d.ts +0 -56
- package/dist/hitl/parkOwnership.js +0 -22
- package/dist/hitl/parkResolver.d.ts +3 -88
- package/dist/hitl/parkResolver.js +8 -349
- package/dist/hitl/parkRowBirthWait.d.ts +2 -26
- package/dist/hitl/parkRowBirthWait.js +3 -93
- package/dist/hitl/persistedRulesWire.d.ts +13 -358
- package/dist/hitl/persistedRulesWire.js +0 -310
- package/dist/hitl/planReviewWire.d.ts +4 -176
- package/dist/hitl/planReviewWire.js +9 -312
- package/dist/hitl/resumeRunningCard.d.ts +0 -105
- package/dist/hitl/resumeRunningCard.js +0 -105
- package/dist/hitl/sessionPolicyWire.d.ts +11 -191
- package/dist/hitl/sessionPolicyWire.js +0 -149
- package/dist/hitl/suspendedReopen.d.ts +3 -24
- package/dist/hitl/suspendedReopen.js +0 -14
- package/dist/hitl/toolApprovalWire.d.ts +5 -1308
- package/dist/hitl/toolApprovalWire.js +5 -945
- package/dist/hooksWireCaps.d.ts +0 -38
- package/dist/hooksWireCaps.js +0 -190
- package/dist/host.d.ts +0 -105
- package/dist/host.js +0 -33
- package/dist/hostEnv.d.ts +0 -14
- package/dist/hostEnv.js +0 -13
- package/dist/imagesWireCaps.d.ts +0 -21
- package/dist/imagesWireCaps.js +0 -22
- package/dist/index.d.ts +0 -134
- package/dist/index.js +0 -476
- package/dist/interactiveHalt.d.ts +5 -153
- package/dist/interactiveHalt.js +0 -111
- package/dist/interactiveToolsWire.d.ts +0 -62
- package/dist/interactiveToolsWire.js +1 -67
- package/dist/leaderConflict.d.ts +0 -59
- package/dist/leaderConflict.js +0 -48
- package/dist/limitsWire.d.ts +0 -125
- package/dist/limitsWire.js +2 -120
- package/dist/liveInitToolFace.d.ts +0 -77
- package/dist/liveInitToolFace.js +1 -109
- package/dist/liveModelCatalog.d.ts +0 -52
- package/dist/liveModelCatalog.js +0 -48
- package/dist/liveQuestionStore.d.ts +0 -87
- package/dist/liveQuestionStore.js +1 -56
- package/dist/mcpLiveness.d.ts +0 -151
- package/dist/mcpLiveness.js +0 -122
- package/dist/mcpPanel.d.ts +0 -104
- package/dist/mcpPanel.js +0 -49
- package/dist/mcpReconnect.d.ts +0 -58
- package/dist/mcpReconnect.js +1 -69
- package/dist/mcpWireCaps.d.ts +0 -55
- package/dist/mcpWireCaps.js +1 -13
- package/dist/memoryComplianceCapability.d.ts +3 -57
- package/dist/memoryComplianceCapability.js +0 -57
- package/dist/memoryEntriesWire.d.ts +6 -198
- package/dist/memoryEntriesWire.js +0 -144
- package/dist/memoryOriginCapability.d.ts +3 -53
- package/dist/memoryOriginCapability.js +0 -50
- package/dist/memorySpecWire.d.ts +0 -116
- package/dist/memorySpecWire.js +0 -150
- package/dist/model/catalog.d.ts +0 -111
- package/dist/model/catalog.js +0 -87
- package/dist/model/catalogLoader.d.ts +0 -114
- package/dist/model/catalogLoader.js +2 -139
- package/dist/model/modelSupplyRules.d.ts +1 -55
- package/dist/model/modelSupplyRules.js +0 -62
- package/dist/model/providerAuth.d.ts +0 -103
- package/dist/model/providerAuth.js +2 -38
- package/dist/model/providerCatalog.d.ts +0 -45
- package/dist/model/providerCatalog.js +0 -37
- package/dist/model/providerPresets.d.ts +0 -33
- package/dist/model/providerPresets.js +2 -91
- package/dist/model/tierVocabulary.d.ts +0 -31
- package/dist/model/tierVocabulary.js +0 -27
- package/dist/modelBudgetRule.d.ts +0 -39
- package/dist/modelBudgetRule.js +0 -39
- package/dist/modelCapabilityProbe.d.ts +0 -175
- package/dist/modelCapabilityProbe.js +0 -147
- package/dist/modelWireCaps.d.ts +0 -13
- package/dist/modelWireCaps.js +0 -13
- package/dist/notifications.d.ts +0 -233
- package/dist/notifications.js +14 -492
- package/dist/oneShotWireCaps.d.ts +0 -34
- package/dist/oneShotWireCaps.js +0 -35
- package/dist/ownKey.d.ts +0 -33
- package/dist/ownKey.js +0 -33
- package/dist/panelRunningHistory.d.ts +0 -28
- package/dist/panelRunningHistory.js +0 -43
- package/dist/peerFrames.d.ts +0 -71
- package/dist/peerFrames.js +0 -168
- package/dist/peerLaneCapability.d.ts +0 -44
- package/dist/peerLaneCapability.js +0 -52
- package/dist/permissionRuleIssue.d.ts +0 -30
- package/dist/permissionRuleIssue.js +0 -78
- package/dist/permissionRulesWriteCapability.d.ts +0 -46
- package/dist/permissionRulesWriteCapability.js +0 -54
- package/dist/permissionWireCaps.d.ts +0 -37
- package/dist/permissionWireCaps.js +0 -37
- package/dist/postureKnob.d.ts +0 -71
- package/dist/postureKnob.js +0 -86
- package/dist/principalWire.d.ts +0 -17
- package/dist/principalWire.js +0 -17
- package/dist/printToolResultFrame.d.ts +0 -100
- package/dist/printToolResultFrame.js +0 -33
- package/dist/promptProfileWireCaps.d.ts +0 -13
- package/dist/promptProfileWireCaps.js +0 -13
- package/dist/readFacePosture.d.ts +0 -43
- package/dist/readFacePosture.js +0 -46
- package/dist/request/printNotification.d.ts +0 -20
- package/dist/request/printNotification.js +0 -55
- package/dist/request/taskRequest.d.ts +0 -249
- package/dist/request/taskRequest.js +10 -496
- package/dist/resumeRefusalCopy.d.ts +0 -136
- package/dist/resumeRefusalCopy.js +1 -117
- package/dist/retainBackgroundWireCaps.d.ts +0 -48
- package/dist/retainBackgroundWireCaps.js +0 -48
- package/dist/retryStatus.d.ts +2 -221
- package/dist/retryStatus.js +0 -107
- package/dist/rewindWireCaps.d.ts +0 -27
- package/dist/rewindWireCaps.js +0 -24
- package/dist/runCancelContext.d.ts +1 -20
- package/dist/runCancelContext.js +0 -34
- package/dist/runTerminal.d.ts +0 -273
- package/dist/runTerminal.js +0 -177
- package/dist/sandboxWire.d.ts +0 -38
- package/dist/sandboxWire.js +0 -82
- package/dist/scenarioWire.d.ts +0 -60
- package/dist/scenarioWire.js +0 -68
- package/dist/scratchpadWireCaps.d.ts +0 -11
- package/dist/scratchpadWireCaps.js +0 -32
- package/dist/sdkWireTransit.d.ts +0 -38
- package/dist/sdkWireTransit.js +0 -30
- package/dist/seam.d.ts +18 -853
- package/dist/seam.js +0 -52
- package/dist/seatContract.d.ts +0 -555
- package/dist/seatContract.js +5 -304
- package/dist/selfOrchestrationDenial.d.ts +0 -189
- package/dist/selfOrchestrationDenial.js +0 -162
- package/dist/selfOrchestrationWireCaps.d.ts +0 -38
- package/dist/selfOrchestrationWireCaps.js +0 -38
- package/dist/sessionMap.d.ts +0 -60
- package/dist/sessionMap.js +0 -37
- package/dist/sessionMemoryStatus.d.ts +11 -114
- package/dist/sessionMemoryStatus.js +0 -112
- package/dist/sessionModelLatch.d.ts +0 -29
- package/dist/sessionModelLatch.js +0 -40
- package/dist/sessionPolicyCapability.d.ts +3 -53
- package/dist/sessionPolicyCapability.js +0 -52
- package/dist/sessionSlot.d.ts +0 -26
- package/dist/sessionSlot.js +0 -17
- package/dist/skillsWireCaps.d.ts +0 -87
- package/dist/skillsWireCaps.js +0 -38
- package/dist/sqlEngineCapability.d.ts +0 -118
- package/dist/sqlEngineCapability.js +0 -134
- package/dist/sseIdleTriage.d.ts +0 -79
- package/dist/sseIdleTriage.js +1 -80
- package/dist/steering.d.ts +0 -54
- package/dist/steering.js +0 -63
- package/dist/subagent/engineCompactWire.d.ts +0 -34
- package/dist/subagent/engineCompactWire.js +4 -134
- package/dist/subagent/engineDelegatedPrompt.d.ts +0 -31
- package/dist/subagent/engineDelegatedPrompt.js +1 -103
- package/dist/subagent/engineRowStopGate.d.ts +0 -20
- package/dist/subagent/engineRowStopGate.js +0 -49
- package/dist/subagent/engineSubagentOutput.d.ts +0 -7
- package/dist/subagent/engineSubagentOutput.js +1 -51
- package/dist/subagent/engineSubagentResume.d.ts +2 -279
- package/dist/subagent/engineSubagentResume.js +2 -129
- package/dist/subagent/engineSubagentSteer.d.ts +0 -26
- package/dist/subagent/engineSubagentSteer.js +0 -63
- package/dist/subagent/engineSubagentTail.d.ts +0 -38
- package/dist/subagent/engineSubagentTail.js +2 -110
- package/dist/subagent/engineTaskHandleWire.d.ts +11 -65
- package/dist/subagent/engineTaskHandleWire.js +20 -131
- package/dist/subagent/subagentOwnerAbsence.d.ts +0 -2
- package/dist/subagent/subagentOwnerAbsence.js +0 -25
- package/dist/subagentContentStore.d.ts +3 -260
- package/dist/subagentContentStore.js +7 -540
- package/dist/systemReminderTag.d.ts +0 -49
- package/dist/systemReminderTag.js +0 -61
- package/dist/toolResult.d.ts +1 -211
- package/dist/toolResult.js +1 -358
- package/dist/toolRoster.d.ts +0 -140
- package/dist/toolRoster.js +0 -66
- package/dist/typePins.d.ts +0 -46
- package/dist/types/engineState.d.ts +0 -71
- package/dist/types/engineState.js +0 -16
- package/dist/ultracodeWireCaps.d.ts +0 -75
- package/dist/ultracodeWireCaps.js +0 -92
- package/dist/unrefTimer.d.ts +0 -27
- package/dist/webSearchBackendCapability.d.ts +0 -72
- package/dist/webSearchBackendCapability.js +0 -79
- package/dist/webSearchWireCaps.d.ts +0 -37
- package/dist/webSearchWireCaps.js +0 -34
- package/dist/websearch/searchProviderPresets.d.ts +0 -81
- package/dist/websearch/searchProviderPresets.js +0 -27
- package/dist/wireErrorTriage.d.ts +4 -160
- package/dist/wireErrorTriage.js +0 -171
- package/dist/wireRefusalCopy.d.ts +0 -28
- package/dist/wireRefusalCopy.js +0 -28
- package/dist/workflow.d.ts +0 -40
- package/dist/workflow.js +0 -52
- package/dist/workflowClient.d.ts +0 -122
- package/dist/workflowClient.js +8 -360
- package/dist/workflowMonitor.d.ts +2 -72
- package/dist/workflowMonitor.js +0 -26
- package/dist/writeProtectionCapability.d.ts +0 -112
- package/dist/writeProtectionCapability.js +0 -109
- package/docs/INTEGRATION-CLIENTS.md +62 -1
- package/package.json +1 -1
|
@@ -1,39 +1,5 @@
|
|
|
1
|
-
/** Test/introspection hook(缺省 = 默认槽,与 0.44.0 逐字同)。 */
|
|
2
1
|
export declare function isEngineCompactPending(sessionKey?: string): boolean;
|
|
3
|
-
/**
|
|
4
|
-
* Test hook: reset the cached capability (fresh engine / respawn)。
|
|
5
|
-
*
|
|
6
|
-
* 🔴 **只清能力面,绝不动 arm 台账**(异源对抗复审第四轮 [medium] 采纳,修回归):本口是**生产口**
|
|
7
|
-
* (引擎重启 / respawn 的能力失效),不是「取消用户的 /compact」。一度顺手加的 `pendingCompactKeys.clear()`
|
|
8
|
-
* 会让「idle 时 `/compact` 回过 armed → 引擎 respawn → 下一条 run 不再压缩」——用户的命令无声蒸发,
|
|
9
|
-
* 而且那是**默认槽**上的行为改变,与本批「单会话宿主逐字节零变化」的声明直接矛盾。
|
|
10
|
-
* 要清 arm 走 {@link __resetEngineCompactArmForTests}(测试钩,生产面没有这个动作)。
|
|
11
|
-
*/
|
|
12
2
|
export declare function resetManualCompactCapability(): void;
|
|
13
|
-
/** 测试钩:清 arm 台账(module 级单例,同进程多组断言必须能清)。生产面**没有**这个动作。 */
|
|
14
3
|
export declare function __resetEngineCompactArmForTests(): void;
|
|
15
|
-
/**
|
|
16
|
-
* The /compact command's live half. Mid-turn: fire now. Idle: arm for the next run bind.
|
|
17
|
-
* Returns what it did (for the command's display line / tests). No-op ('offline') without a live
|
|
18
|
-
* wire; 'unsupported' when the engine's capabilities said manualCompact:false ([488] TOC-local) —
|
|
19
|
-
* the client-side projection compaction still runs, but the ENGINE session context does not shrink.
|
|
20
|
-
*
|
|
21
|
-
* 🔴 design/285 批 3(D7b):本族三处零参 `engineWireTarget()` 全部换成 `engineWireTargetFor(sessionKey)`。
|
|
22
|
-
* /compact 打的是**这个会话此刻在飞的那条 run**,不是某一行子代 —— owner 台账里没有它,所以槽键
|
|
23
|
-
* 只能由调用方给(多会话宿主每个 REPL 面板一个槽)。缺省 `DEFAULT_SESSION_KEY` ⇒ 与 0.44.0 逐字同。
|
|
24
|
-
* 📋 **带反证的驳回半场(异源对抗复审第三轮 [high] 的另一半,如实记)**:复审还要求把快照提前到
|
|
25
|
-
* **request(arm)那一拍**,理由是「arm 与 bind 之间槽可能被重绑,意图属于 A 却在 B 上执行」。
|
|
26
|
-
* **不采**,反证:arm 那一拍**根本没有 taskId** —— `/compact` 在 idle 下的语义是成文的
|
|
27
|
-
* 「**这个槽的下一条 run**」(见本文件头注的 arm-then-fire 段),槽的身份就是 key 本身。
|
|
28
|
-
* 槽真被重绑到另一台引擎时,「下一条 run」就在那台引擎上,压它才是意图;把 request 那一刻的
|
|
29
|
-
* target 冻下来反而会去压一台**已经不再跑这条会话**的引擎。⇒ 冻结的正确起点是**拿到 taskId 的
|
|
30
|
-
* 那一拍**(bind),那之后的每一次延迟与重试都必须用同一份 —— 那正是上面这一条。
|
|
31
|
-
* 现状由常驻钉 `B3-P31/R6i` 钉住(arm 之后换槽装配 ⇒ 发射打的是**换后**那台,且带换后的会话)。
|
|
32
|
-
* 🔴 **一条动词的槽键必须一以贯之**(异源对抗复审 [high] 采纳):目标、`?session=`、**run id**
|
|
33
|
-
* (`activeEngineRunIdFor`)、**能力位**(per-baseUrl 分桶)、**arm 状态**(per-key 分桶)——
|
|
34
|
-
* 五件全按同一个 key。只换其中几件就是**半 keyed 形**:那比换锚之前更坏(之前五件一致地错在同一个
|
|
35
|
-
* 槽上,一眼可见;半 keyed 是「A 的 run id 发到 B 的服务器」「B 的 arm 被 A 的 bind 吃掉」这类只在
|
|
36
|
-
* 多会话下现形的错)。这条正是 plan 决策链本批**豁免**的同一条理由 —— 那边整条链搬不动,这边搬得动。
|
|
37
|
-
*/
|
|
38
4
|
export declare function requestEngineCompact(sessionKey?: string): 'fired' | 'armed' | 'offline' | 'unsupported';
|
|
39
5
|
export declare function onEngineTaskBound(taskId: string, sessionKey?: string): void;
|
|
@@ -1,71 +1,12 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ⇄ B6 批搬迁(2026-07-27,设计稿 §3 B6):cli `src/sema/engineCompactWire.ts` 整搬。
|
|
3
|
-
*
|
|
4
|
-
* 🔴 搬迁差分:
|
|
5
|
-
* · `wireConfig()`(六份手抄的**最后一份**,而且这一份已经多长了一行 principal 注释 ——
|
|
6
|
-
* 漂移的活样本)→ `engineWireTarget()`;
|
|
7
|
-
* · `getActiveEngineTaskId()` → `activeEngineRunId()`(SessionPort);
|
|
8
|
-
* · `logForDebugging` → `hostLog('debug', …)`;
|
|
9
|
-
* · `setTimeout(...)+t.unref?.()` → `hostTimers()`(**本文件是 TimersPort 的第一个消费者**)。
|
|
10
|
-
* 🔴 端没装 TimersPort 的后果**说清楚**:两处延迟发射(404 单次重试 / bind 后 1.5s 发射)
|
|
11
|
-
* 会**整个不发生** —— `/compact` 在 idle armed 之后就再也不会真正打到引擎,而命令行显示的
|
|
12
|
-
* 还是 'armed'。这不是「少个定时器」,是一条静默失效的功能腿。所以缺 port 时留 debug 日志,
|
|
13
|
-
* 并且 `hostPortMisses()` 里能看见(端自检恒应为空)。
|
|
14
|
-
*
|
|
15
|
-
* ── 以下为原文件的领域说明(逐字保留)────────────────────────────────────────────────────────
|
|
16
|
-
*
|
|
17
|
-
* engineCompactWire — manual /compact reaches the ENGINE (K-1c), not just the client projection.
|
|
18
|
-
*
|
|
19
|
-
* Problem (clay dogfood 07-03): in live mode `/compact` ran only the CLIENT-side compaction (the local
|
|
20
|
-
* message projection) — the engine session's context was never compacted, so the next turn still paid
|
|
21
|
-
* the full window.
|
|
22
|
-
*
|
|
23
|
-
* Engine contract (service server.ts:1874, core 1.156 `TaskStream.compact()`):
|
|
24
|
-
* POST /v1/runs/:id/compact → 202; compaction runs at the next SAFE turn boundary and a
|
|
25
|
-
* `compacted{trigger:"manual"}` event rides the run's OWN stream. The verb only applies to a run LIVE
|
|
26
|
-
* on the replica — and `/compact` is typed while IDLE, when there is no live run. So the wire is
|
|
27
|
-
* arm-then-fire:
|
|
28
|
-
* - `/compact` mid-turn (active engine run bound) → fire immediately against that run.
|
|
29
|
-
* - `/compact` idle → arm a pending flag; the host's run_started bind (onEngineTaskBound) fires it
|
|
30
|
-
* against the NEXT turn's run — the engine compacts at that turn's first safe boundary, exactly
|
|
31
|
-
* the semantics CC users expect ("everything before this point is summarized").
|
|
32
|
-
*
|
|
33
|
-
* SDK 0.0.52 长出 runs.compact verb(SDK 宪法迁移批)—— raw fetch 退役,改走 AgentClient
|
|
34
|
-
* (engineWireSdk 工厂;baseUrl/token/principal 纪律与 live wire 同源)。Fire-and-forget + fail-soft
|
|
35
|
-
* 语义不变:409/501/网络错都只留 debug 日志,端侧投影压缩仍是可见结果。
|
|
36
|
-
* 迁移差分记账:①原 raw POST 无超时 → SDK 缺省 60s 预算(compact 是 202 即回的 arm verb,本地
|
|
37
|
-
* 口毫秒级,纯上界改善);②404 单次 2s 延迟重试(早 header bind 跑赢 run-row 持久化)逐字保留。
|
|
38
|
-
*/
|
|
39
1
|
import { hostLog, hostTimersFor } from '../host.js';
|
|
40
2
|
import { makeEngineWireClient } from '../engineWireSdk.js';
|
|
41
3
|
import { engineWireTargetFor } from '../engineWireTarget.js';
|
|
42
4
|
import { activeEngineRunIdFor, engineSessionParamFor } from '../engineSessionParam.js';
|
|
43
5
|
import { DEFAULT_SESSION_KEY } from '../sessionSlot.js';
|
|
44
|
-
/**
|
|
45
|
-
* 🔴 **arm 状态按会话槽分桶**(design/285 批 3,异源对抗复审 [high] 采纳)。
|
|
46
|
-
*
|
|
47
|
-
* 修前是一个**进程级布尔**:`/compact` 在 B 会话上 idle-arm 之后,**先 bind 的那条会话**(可能是 A)
|
|
48
|
-
* 会把它消费掉 —— B 要的压缩发到了 A 的 run 上(动了一条不相干会话的上下文),而 B 自己永远没压缩。
|
|
49
|
-
* 单会话宿主上这两件事是同一件,keyed 化之后才第一次分得开。
|
|
50
|
-
*/
|
|
51
6
|
const pendingCompactKeys = new Set();
|
|
52
|
-
/** Test/introspection hook(缺省 = 默认槽,与 0.44.0 逐字同)。 */
|
|
53
7
|
export function isEngineCompactPending(sessionKey = DEFAULT_SESSION_KEY) {
|
|
54
8
|
return pendingCompactKeys.has(sessionKey);
|
|
55
9
|
}
|
|
56
|
-
/**
|
|
57
|
-
* [488] 定谳(2026-07-07 指纹探针,server 1.130.0):TOC 本地引擎(无 TiDB runStore)的
|
|
58
|
-
* manual-compact verb 是 BY-DESIGN 501(handler 第一道闸 `!deps.runStore → 501`,capabilities
|
|
59
|
-
* 也如实报 `manualCompact:false`)——之前端没消费这个 gate,verb 打过去 501 被 fire-and-forget
|
|
60
|
-
* 吞掉,引擎 session 从未压缩=「静默 no-op」的真机理。这里 lazy 探一次 /v1/capabilities 并缓存;
|
|
61
|
-
* false ⇒ requestEngineCompact 返回 'unsupported'(不再装作 armed/fired)。探测失败 fail-open
|
|
62
|
-
* (null=未知 ⇒ 保持旧行为发 verb,错误面不变)。
|
|
63
|
-
*/
|
|
64
|
-
// 🔴 **判定位与在途探测按 baseUrl 分桶**(design/285 批 3,异源对抗复审 [high] 采纳;与
|
|
65
|
-
// `engineCapsCache` / `engineSubagentOutput.capByBase` 同代)。修前是**进程级单值**:keyed 宿主上
|
|
66
|
-
// `requestEngineCompact('B')` 会拿**先探到的那台引擎**(可能是 A)的 `manualCompact` 位去决定要不要
|
|
67
|
-
// 给 B 发 verb —— 一条动词的槽键必须一以贯之,目标/会话/run id/能力位缺一个都是半 keyed 形。
|
|
68
|
-
// ⚠️ 单会话宿主只有一个 baseUrl ⇒ 分桶后与 0.44.0 逐字同(同一个 base 仍是「探一次、缓存住」)。
|
|
69
10
|
const manualCompactCapableByBase = new Map();
|
|
70
11
|
const capabilitiesProbeByBase = new Map();
|
|
71
12
|
function probeManualCompactCapability(sessionKey = DEFAULT_SESSION_KEY) {
|
|
@@ -77,9 +18,6 @@ function probeManualCompactCapability(sessionKey = DEFAULT_SESSION_KEY) {
|
|
|
77
18
|
return;
|
|
78
19
|
capabilitiesProbeByBase.set(base, (async () => {
|
|
79
20
|
try {
|
|
80
|
-
// SDK 0.0.52 client.capabilities()(typed Capabilities.manualCompact)。5s 预算经 client
|
|
81
|
-
// timeoutMs(对抗复审 MED 原语义:hung engine 不 pin probe promise);非 2xx/网络错/超时 SDK
|
|
82
|
-
// 统一抛错 → 与原「non-200 也重试」同归 catch 删记号允许后续重试。
|
|
83
21
|
const client = makeEngineWireClient({
|
|
84
22
|
baseUrl: base,
|
|
85
23
|
...(cfg.token ? { token: cfg.token } : {}),
|
|
@@ -94,39 +32,21 @@ function probeManualCompactCapability(sessionKey = DEFAULT_SESSION_KEY) {
|
|
|
94
32
|
if (typeof caps.manualCompact === 'boolean')
|
|
95
33
|
manualCompactCapableByBase.set(base, caps.manualCompact);
|
|
96
34
|
else
|
|
97
|
-
capabilitiesProbeByBase.delete(base);
|
|
35
|
+
capabilitiesProbeByBase.delete(base);
|
|
98
36
|
}
|
|
99
37
|
catch {
|
|
100
|
-
capabilitiesProbeByBase.delete(base);
|
|
38
|
+
capabilitiesProbeByBase.delete(base);
|
|
101
39
|
}
|
|
102
40
|
})());
|
|
103
41
|
}
|
|
104
|
-
/**
|
|
105
|
-
* Test hook: reset the cached capability (fresh engine / respawn)。
|
|
106
|
-
*
|
|
107
|
-
* 🔴 **只清能力面,绝不动 arm 台账**(异源对抗复审第四轮 [medium] 采纳,修回归):本口是**生产口**
|
|
108
|
-
* (引擎重启 / respawn 的能力失效),不是「取消用户的 /compact」。一度顺手加的 `pendingCompactKeys.clear()`
|
|
109
|
-
* 会让「idle 时 `/compact` 回过 armed → 引擎 respawn → 下一条 run 不再压缩」——用户的命令无声蒸发,
|
|
110
|
-
* 而且那是**默认槽**上的行为改变,与本批「单会话宿主逐字节零变化」的声明直接矛盾。
|
|
111
|
-
* 要清 arm 走 {@link __resetEngineCompactArmForTests}(测试钩,生产面没有这个动作)。
|
|
112
|
-
*/
|
|
113
42
|
export function resetManualCompactCapability() {
|
|
114
43
|
manualCompactCapableByBase.clear();
|
|
115
44
|
capabilitiesProbeByBase.clear();
|
|
116
45
|
}
|
|
117
|
-
/** 测试钩:清 arm 台账(module 级单例,同进程多组断言必须能清)。生产面**没有**这个动作。 */
|
|
118
46
|
export function __resetEngineCompactArmForTests() {
|
|
119
47
|
pendingCompactKeys.clear();
|
|
120
48
|
}
|
|
121
|
-
/**
|
|
122
|
-
* 延迟发射(`setTimeout` + `unref` 的 port 形)。缺 TimersPort ⇒ **不发射**并留日志 ——
|
|
123
|
-
* 静默 drop 会让 `/compact` 看起来 armed 了却永不落地(见文件头)。
|
|
124
|
-
*/
|
|
125
49
|
function deferFire(ms, fn, why, sessionKey) {
|
|
126
|
-
// 🔴 定时器也按本槽取(异源对抗复审第四轮 [medium] 采纳):零参 `hostTimers()` 读的是**默认槽** ——
|
|
127
|
-
// 按接入契约只走 `installHostFor(key, {timers})` 的 keyed-only 宿主在那里恒空 ⇒ 快照有效、arm 已划掉、
|
|
128
|
-
// 请求永远不发射。一条动词的槽键必须一以贯之,定时器是第六件。
|
|
129
|
-
// (默认槽下 `hostTimersFor(DEFAULT_SESSION_KEY)` ≡ `hostTimers()`,逐字节等价。)
|
|
130
50
|
const timers = hostTimersFor(sessionKey);
|
|
131
51
|
if (!timers) {
|
|
132
52
|
hostLog('debug', `engineCompactWire: no TimersPort — ${why} 不会发射(端漏装 port,/compact 这条腿静默失效)`);
|
|
@@ -135,7 +55,6 @@ function deferFire(ms, fn, why, sessionKey) {
|
|
|
135
55
|
timers.setTimer(ms, fn);
|
|
136
56
|
return true;
|
|
137
57
|
}
|
|
138
|
-
/** 按本槽冻一发;`null` = 那一刻没有 wire(与修前的 `!cfg` 早退同语义,只是提前到冻结那一拍)。 */
|
|
139
58
|
function freezeCompactShot(taskId, sessionKey) {
|
|
140
59
|
const cfg = engineWireTargetFor(sessionKey);
|
|
141
60
|
if (!cfg)
|
|
@@ -151,9 +70,6 @@ function freezeCompactShot(taskId, sessionKey) {
|
|
|
151
70
|
};
|
|
152
71
|
}
|
|
153
72
|
async function postCompact(shot, retriesLeft = 1) {
|
|
154
|
-
// SDK runs.compact(0.0.52)——POST /v1/runs/:id/compact body {}(无 instructions 时与原 '{}' 逐字
|
|
155
|
-
// 同 wire);header 姿势 = Transport buildHeaders(Bearer 仅有 token 时 + x-agent-principal +
|
|
156
|
-
// content-type),与原手抄同三头。🔴 三头与 `?session=` 全取**冻结的那一份**,绝不现读。
|
|
157
73
|
const client = makeEngineWireClient({
|
|
158
74
|
baseUrl: shot.baseUrl,
|
|
159
75
|
...(shot.token ? { token: shot.token } : {}),
|
|
@@ -170,9 +86,7 @@ async function postCompact(shot, retriesLeft = 1) {
|
|
|
170
86
|
const status = e?.status;
|
|
171
87
|
if (typeof status === 'number') {
|
|
172
88
|
hostLog('debug', `engineCompactWire: POST compact ${taskId} → ${status}`);
|
|
173
|
-
// 404 = the early header bind outran the run-row persist — one deferred retry covers it.
|
|
174
89
|
if (status === 404 && retriesLeft > 0) {
|
|
175
|
-
// 重试用**同一份**冻结快照:重试窗内换了会话/换了引擎,旧 taskId 也绝不配新凭证。
|
|
176
90
|
deferFire(2000, () => void postCompact(shot, retriesLeft - 1), '404 单次重试', shot.sessionKey);
|
|
177
91
|
}
|
|
178
92
|
return;
|
|
@@ -180,39 +94,15 @@ async function postCompact(shot, retriesLeft = 1) {
|
|
|
180
94
|
hostLog('debug', `engineCompactWire: compact fire failed (best-effort): ${String(e)}`);
|
|
181
95
|
}
|
|
182
96
|
}
|
|
183
|
-
/**
|
|
184
|
-
* The /compact command's live half. Mid-turn: fire now. Idle: arm for the next run bind.
|
|
185
|
-
* Returns what it did (for the command's display line / tests). No-op ('offline') without a live
|
|
186
|
-
* wire; 'unsupported' when the engine's capabilities said manualCompact:false ([488] TOC-local) —
|
|
187
|
-
* the client-side projection compaction still runs, but the ENGINE session context does not shrink.
|
|
188
|
-
*
|
|
189
|
-
* 🔴 design/285 批 3(D7b):本族三处零参 `engineWireTarget()` 全部换成 `engineWireTargetFor(sessionKey)`。
|
|
190
|
-
* /compact 打的是**这个会话此刻在飞的那条 run**,不是某一行子代 —— owner 台账里没有它,所以槽键
|
|
191
|
-
* 只能由调用方给(多会话宿主每个 REPL 面板一个槽)。缺省 `DEFAULT_SESSION_KEY` ⇒ 与 0.44.0 逐字同。
|
|
192
|
-
* 📋 **带反证的驳回半场(异源对抗复审第三轮 [high] 的另一半,如实记)**:复审还要求把快照提前到
|
|
193
|
-
* **request(arm)那一拍**,理由是「arm 与 bind 之间槽可能被重绑,意图属于 A 却在 B 上执行」。
|
|
194
|
-
* **不采**,反证:arm 那一拍**根本没有 taskId** —— `/compact` 在 idle 下的语义是成文的
|
|
195
|
-
* 「**这个槽的下一条 run**」(见本文件头注的 arm-then-fire 段),槽的身份就是 key 本身。
|
|
196
|
-
* 槽真被重绑到另一台引擎时,「下一条 run」就在那台引擎上,压它才是意图;把 request 那一刻的
|
|
197
|
-
* target 冻下来反而会去压一台**已经不再跑这条会话**的引擎。⇒ 冻结的正确起点是**拿到 taskId 的
|
|
198
|
-
* 那一拍**(bind),那之后的每一次延迟与重试都必须用同一份 —— 那正是上面这一条。
|
|
199
|
-
* 现状由常驻钉 `B3-P31/R6i` 钉住(arm 之后换槽装配 ⇒ 发射打的是**换后**那台,且带换后的会话)。
|
|
200
|
-
* 🔴 **一条动词的槽键必须一以贯之**(异源对抗复审 [high] 采纳):目标、`?session=`、**run id**
|
|
201
|
-
* (`activeEngineRunIdFor`)、**能力位**(per-baseUrl 分桶)、**arm 状态**(per-key 分桶)——
|
|
202
|
-
* 五件全按同一个 key。只换其中几件就是**半 keyed 形**:那比换锚之前更坏(之前五件一致地错在同一个
|
|
203
|
-
* 槽上,一眼可见;半 keyed 是「A 的 run id 发到 B 的服务器」「B 的 arm 被 A 的 bind 吃掉」这类只在
|
|
204
|
-
* 多会话下现形的错)。这条正是 plan 决策链本批**豁免**的同一条理由 —— 那边整条链搬不动,这边搬得动。
|
|
205
|
-
*/
|
|
206
97
|
export function requestEngineCompact(sessionKey = DEFAULT_SESSION_KEY) {
|
|
207
98
|
const cfg = engineWireTargetFor(sessionKey);
|
|
208
99
|
if (!cfg)
|
|
209
100
|
return 'offline';
|
|
210
|
-
probeManualCompactCapability(sessionKey);
|
|
101
|
+
probeManualCompactCapability(sessionKey);
|
|
211
102
|
if (manualCompactCapableByBase.get(cfg.baseUrl) === false) {
|
|
212
103
|
hostLog('debug', 'engineCompactWire: engine capabilities report manualCompact:false — verb suppressed (TOC-local runStore-less engine, [488])');
|
|
213
104
|
return 'unsupported';
|
|
214
105
|
}
|
|
215
|
-
// 🔴 run id 也按本槽取(异源对抗复审 [high]):写死默认槽 = 把 A 的 run id 发到 B 的服务器上。
|
|
216
106
|
const taskId = activeEngineRunIdFor(sessionKey);
|
|
217
107
|
if (taskId) {
|
|
218
108
|
const shot = freezeCompactShot(taskId, sessionKey);
|
|
@@ -223,34 +113,14 @@ export function requestEngineCompact(sessionKey = DEFAULT_SESSION_KEY) {
|
|
|
223
113
|
pendingCompactKeys.add(sessionKey);
|
|
224
114
|
return 'armed';
|
|
225
115
|
}
|
|
226
|
-
/**
|
|
227
|
-
* host run_started hook: a new engine run just bound. If a manual compact is pending, fire it —
|
|
228
|
-
* the engine compacts at this turn's first safe boundary.
|
|
229
|
-
*
|
|
230
|
-
* Timing: the bind fires off the X-Task-Id RESPONSE HEADER — the earliest possible signal, which can
|
|
231
|
-
* precede the server's run-row persist (a straight POST here raced it to a 404 in the live harness).
|
|
232
|
-
* Compaction runs at the next safe TURN BOUNDARY anyway, so a short defer loses nothing; retry once
|
|
233
|
-
* more for slow persists. Both shots are best-effort (postCompact never throws).
|
|
234
|
-
*/
|
|
235
116
|
const BOUND_FIRE_DELAY_MS = 1500;
|
|
236
117
|
export function onEngineTaskBound(taskId, sessionKey = DEFAULT_SESSION_KEY) {
|
|
237
|
-
probeManualCompactCapability(sessionKey);
|
|
238
|
-
// 🔴 只消费**本槽**的 arm(异源对抗复审 [high]):进程级布尔会让先 bind 的那条会话把别人的 arm 吃掉 ——
|
|
239
|
-
// B 要的压缩发到 A 的 run 上,而 B 自己永远没压缩。
|
|
118
|
+
probeManualCompactCapability(sessionKey);
|
|
240
119
|
if (!pendingCompactKeys.has(sessionKey))
|
|
241
120
|
return;
|
|
242
|
-
// 🔴 **在 bind 这一拍冻结**(异源对抗复审 [high]):延迟 1.5s 之后再现读 target/session,就会把
|
|
243
|
-
// 这一拍的 taskId 配上那一拍的引擎与会话。
|
|
244
|
-
// 🔴 **冻不出快照就不消费这一记 arm**(异源对抗复审第三轮 [high] 的可采半场):那一刻没有 wire
|
|
245
|
-
// 时,旧形是「先把 arm 划掉、再发现发不出去」= 用户的 `/compact` 无声蒸发,而命令行早就回过
|
|
246
|
-
// 'armed'。改成**冻出来了才划掉**:这一拍发不出就留着,下一次 bind 再兑现(arm-then-fire 的
|
|
247
|
-
// 本意就是「下一条 run」,不是「下一条 run 且那一刻恰好有 wire」)。
|
|
248
121
|
const shot = freezeCompactShot(taskId, sessionKey);
|
|
249
122
|
if (shot === null)
|
|
250
123
|
return;
|
|
251
|
-
// 🔴 **登记上定时器才划掉 arm**(异源对抗复审第四轮 [medium]):端漏装 TimersPort 时 `deferFire`
|
|
252
|
-
// 只留一行日志就返回,先划掉 arm 就等于把用户的 `/compact` 无声吃掉(与上面那条同一个道理,
|
|
253
|
-
// 只是这一次挡的是「冻得出快照但排不上队」)。
|
|
254
124
|
if (deferFire(BOUND_FIRE_DELAY_MS, () => void postCompact(shot), 'bind 后发射', sessionKey)) {
|
|
255
125
|
pendingCompactKeys.delete(sessionKey);
|
|
256
126
|
}
|
|
@@ -1,44 +1,13 @@
|
|
|
1
|
-
/** 记一个子代行的转录锚(幂等;server <1.278 永不调用 = 台账恒空,取件腿整条静默不动)。 */
|
|
2
1
|
export declare function recordEngineTranscriptId(taskId: string, transcriptId: string): void;
|
|
3
|
-
/** 读面(取件腿 + 测试)。 */
|
|
4
2
|
export declare function getEngineTranscriptId(taskId: string): string | undefined;
|
|
5
|
-
/** 测试钩:清台账 + 在飞记号。 */
|
|
6
3
|
export declare function __resetEngineDelegatedPromptForTests(): void;
|
|
7
|
-
/**
|
|
8
|
-
* content → 纯文本。tool_result 型正文返回 undefined —— 那是子代自己跑工具的回填,**不是**委派
|
|
9
|
-
* prompt(这条判别就是「别把子代自己的消息当委派 prompt」的落点)。
|
|
10
|
-
*/
|
|
11
4
|
export declare function delegatedPromptText(content: unknown): string | undefined;
|
|
12
|
-
/**
|
|
13
|
-
* 从转录里挑出委派 prompt = **最后一条非 tool_result 的 user 消息**(倒扫)。
|
|
14
|
-
* 🔴 倒扫不是随手选的:fork 型子代的转录以**父会话历史**开头,正扫会拿到宿主自己的首轮提示
|
|
15
|
-
* (live pty 实测的错答案);全新子会话型只有一条 user 文本消息,倒扫结果与正扫相同。
|
|
16
|
-
*/
|
|
17
5
|
export declare function pickDelegatedPrompt(messages: readonly unknown[]): string | undefined;
|
|
18
|
-
/** 读面注入点(离线测试用):替身返回转录窗口条目数组。 */
|
|
19
6
|
type TranscriptWindowReader = (transcriptId: string) => Promise<readonly unknown[] | null>;
|
|
20
7
|
export declare function __setTranscriptWindowReaderForTests(r: TranscriptWindowReader | null): void;
|
|
21
|
-
/** `fetchDelegatedPrompt` 的结果 —— 三态,**端必须分得开**(见下面 outcome 的键注)。 */
|
|
22
8
|
export interface DelegatedPromptFetch {
|
|
23
|
-
/** 挑到的委派 prompt;`undefined` = 没拿到(看 `outcome` 分清是哪种没拿到)。 */
|
|
24
9
|
prompt?: string;
|
|
25
|
-
/**
|
|
26
|
-
* · `'hit'` —— 拿到了,端可以落状态。
|
|
27
|
-
* · `'skipped'` —— 无转录锚 / 已有在飞 ⇒ 端什么都别做(不是失败)。
|
|
28
|
-
* · `'unreadable'` —— 压根没读到(无 wire / 构造失败 / throw)⇒ **记号已撤**,下次可重试。
|
|
29
|
-
* · `'absent'` —— 读成功但转录里挑不出委派 user 消息 ⇒ **定论**,记号保留,不再重复打读面。
|
|
30
|
-
*
|
|
31
|
-
* 🔴 `unreadable` 与 `absent` 分开是复审穷举第 5 条:混成一个会把「一次性取件」变成
|
|
32
|
-
* 「每次进查看态都打一发 `GET /v1/sessions/:id`」。
|
|
33
|
-
*/
|
|
34
10
|
outcome: 'hit' | 'skipped' | 'unreadable' | 'absent';
|
|
35
11
|
}
|
|
36
|
-
/**
|
|
37
|
-
* 取一个后台子代行的**委派 prompt**(判定半场:防抖 + 取锚 + 读转录 + 挑正文)。
|
|
38
|
-
* 幂等、fail-soft、绝不 throw。**不碰任何端状态** —— 落状态是端的事(见文件头拆缝说明)。
|
|
39
|
-
*
|
|
40
|
-
* 端侧用法(壳 `hydrateEngineAgentPrompt` shim):先自己判「这行是不是 local_agent、prompt 是不是
|
|
41
|
-
* 已经有了」,是才调本函数;拿到 `outcome==='hit'` 再 `setState`。
|
|
42
|
-
*/
|
|
43
12
|
export declare function fetchDelegatedPrompt(taskId: string): Promise<DelegatedPromptFetch>;
|
|
44
13
|
export {};
|
|
@@ -1,78 +1,24 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ⇄ B6 批搬迁(2026-07-27,设计稿 §3 B6 + §2.5 拆缝表):cli `src/sema/engineDelegatedPrompt.ts` 的
|
|
3
|
-
* **判定半场** —— 转录锚台账(module 级)+ 委派 prompt 挑选规则 + 转录窗口读面 + 在飞防抖。
|
|
4
|
-
*
|
|
5
|
-
* 留在 TUI(**执行半场**):`hydrateEngineAgentPrompt` 里对 `AppState.tasks[taskId]` 的
|
|
6
|
-
* `isLocalAgentTask` 判别 / `store.setState` 落 `prompt` / 查看态转录补插首条 user 消息 ——
|
|
7
|
-
* 那三件读写的是**端的任务状态形状**(`LocalAgentTaskState`),web/桌面各有各的形。
|
|
8
|
-
* 壳侧 shim 保留原函数名与签名,内部改成「调本包 `fetchDelegatedPrompt()` → 拿到串再 setState」。
|
|
9
|
-
*
|
|
10
|
-
* 🔴 **单实例纪律(这条是本文件搬迁的真正理由,不是顺手)**:`transcriptIdByTask` 是 module 级
|
|
11
|
-
* Map,**写者 = `fleetLedger` 的行帧/通知帧消费臂**(`recordEngineTranscriptId`),
|
|
12
|
-
* **读者 = 取件腿**。fleetLedger 已在本包内 ⇒ 台账若留在壳里就是「包写壳读」两份实例,
|
|
13
|
-
* 取件腿恒读空、Prompt 段恒留白,而两边代码看着都对
|
|
14
|
-
* ([paired-mechanisms-must-share-premise] 同族失败形)。所以台账必须与写者同包。
|
|
15
|
-
*
|
|
16
|
-
* ── 以下为原文件的领域说明(逐字保留,它记着两条踩过的坑)────────────────────────────────────
|
|
17
|
-
*
|
|
18
|
-
* engineDelegatedPrompt — 后台子代**委派 prompt** 的取件腿(server 1.278.0 `transcriptId` 提货)。
|
|
19
|
-
*
|
|
20
|
-
* ── 缺陷形
|
|
21
|
-
* 后台子代行是行帧 lane(fleet stream)投影出来的,行帧上**没有** prompt —— 于是
|
|
22
|
-
* `AsyncAgentDetailDialog` 的 `Prompt` 段恒空(row.prompt = '')。前台子代的 prompt 由
|
|
23
|
-
* `task_progress` tick 的绑定臂晚绑,后台子代整跑零 tick(tick lane 根本没通道),所以那条腿
|
|
24
|
-
* 对它无效。
|
|
25
|
-
*
|
|
26
|
-
* ── 修法(不发明:server 1.278.0 在 fleet 行上加了 `transcriptId`)
|
|
27
|
-
* `transcriptId` = core 铸的**子代 childSessionId**(core subagent.js:`transcriptId: child.sessionId`)。
|
|
28
|
-
* 它是**取件锚不是内容** —— 端凭它去 session 读面(`GET /v1/sessions/:id`,SDK
|
|
29
|
-
* `sessions.get`)取转录,从里面挑出委派 prompt。
|
|
30
|
-
*
|
|
31
|
-
* 🔴 取哪一条 —— **最后一条非 tool_result 的 user 消息**,不是第一条(live 一手取证订正):
|
|
32
|
-
* `fork` 型子代的 `child.sessionId` 是**父会话的 fork**(core subagent.js:1749
|
|
33
|
-
* `forkTranscriptId = child.sessionId ?? forkedId`),转录里先是**父会话的全部历史**,委派
|
|
34
|
-
* prompt 追加在 fork 点。所以「第一条 user 消息」拿到的是**宿主自己的首轮提示**——第一版就是
|
|
35
|
-
* 这么写的,live pty 实测拉回 6869 字符(委派 prompt 只有 ~330),典型的「看起来很合理的错答案」。
|
|
36
|
-
* 反过来,全新子会话型子代的转录里委派 prompt 是唯一一条 user 文本消息 —— 两种形状都满足
|
|
37
|
-
* 「最后一条非 tool_result 的 user 消息」,所以倒扫是同时正确的那一条规则。
|
|
38
|
-
* (`tool_result` 型 user 条目 = 子代自己跑工具的回填,必须跳过。)
|
|
39
|
-
* 窗口取 `tail=N`(转录尾部)+ `blobCap`:委派 prompt 在尾部方向,而 `messages` 整段可以非常大。
|
|
40
|
-
* 诚实边界:子代被 steer 过(steerSubagent 注入 user 消息)时倒扫会拿到最新那条指令 —— 已记账,
|
|
41
|
-
* wire 上没有「哪条是委派」的标,端不猜。
|
|
42
|
-
*
|
|
43
|
-
* 诚实边界:拉不到 / 没有 transcriptId / 读面 501/404 ⇒ **什么都不写**,Prompt 段维持留白。
|
|
44
|
-
* 绝不用「子代的首条输出」或行描述冒充委派 prompt(那是把一个看起来合理的错答案摆上屏)。
|
|
45
|
-
* 一切失败 fail-soft,绝不 throw。
|
|
46
|
-
*/
|
|
47
1
|
import { stripSystemReminderBlocks } from '../systemReminderTag.js';
|
|
48
2
|
import { hostLog } from '../host.js';
|
|
49
3
|
import { makeEngineWireClient } from '../engineWireSdk.js';
|
|
50
4
|
import { engineWireTargetFor } from '../engineWireTarget.js';
|
|
51
5
|
import { resolveOwnerContext } from './engineSubagentResume.js';
|
|
52
|
-
/** 只拉转录**尾部**这么多条(委派 prompt 在尾部方向;见文件头的 fork 形状订正)。 */
|
|
53
6
|
const TAIL_WINDOW = 200;
|
|
54
|
-
/** 单条正文的上限:详情页自己还会截到 300 字符,这里只防拉回一个巨型 blob。 */
|
|
55
7
|
const BLOB_CAP = 8 * 1024;
|
|
56
|
-
// ── 转录锚台账(module-level:footer/REPL 谁重挂都不丢;写者=行帧消费臂)───────────────────────
|
|
57
8
|
const transcriptIdByTask = new Map();
|
|
58
|
-
/** 记一个子代行的转录锚(幂等;server <1.278 永不调用 = 台账恒空,取件腿整条静默不动)。 */
|
|
59
9
|
export function recordEngineTranscriptId(taskId, transcriptId) {
|
|
60
10
|
if (!taskId || !transcriptId)
|
|
61
11
|
return;
|
|
62
12
|
transcriptIdByTask.set(taskId, transcriptId);
|
|
63
13
|
}
|
|
64
|
-
/** 读面(取件腿 + 测试)。 */
|
|
65
14
|
export function getEngineTranscriptId(taskId) {
|
|
66
15
|
return transcriptIdByTask.get(taskId);
|
|
67
16
|
}
|
|
68
|
-
/** 测试钩:清台账 + 在飞记号。 */
|
|
69
17
|
export function __resetEngineDelegatedPromptForTests() {
|
|
70
18
|
transcriptIdByTask.clear();
|
|
71
19
|
promptHydrateInFlight.clear();
|
|
72
20
|
}
|
|
73
|
-
/** 每 task 一次在飞防抖;拉不到即撤记号,下次进入查看态可重试(副本重启/瞬态 404)。 */
|
|
74
21
|
const promptHydrateInFlight = new Set();
|
|
75
|
-
/** 一条转录条目的 role(permissive:`role` 或 CC jsonl 形的 `type`)。 */
|
|
76
22
|
function roleOf(entry) {
|
|
77
23
|
if (typeof entry !== 'object' || entry === null)
|
|
78
24
|
return undefined;
|
|
@@ -81,7 +27,6 @@ function roleOf(entry) {
|
|
|
81
27
|
return e.role;
|
|
82
28
|
if (typeof e.type === 'string')
|
|
83
29
|
return e.type;
|
|
84
|
-
// CC jsonl 形:{type:'user', message:{role:'user', content}}
|
|
85
30
|
if (typeof e.message === 'object' && e.message !== null) {
|
|
86
31
|
const m = e.message;
|
|
87
32
|
if (typeof m.role === 'string')
|
|
@@ -89,7 +34,6 @@ function roleOf(entry) {
|
|
|
89
34
|
}
|
|
90
35
|
return undefined;
|
|
91
36
|
}
|
|
92
|
-
/** 一条转录条目的正文 content(permissive:直挂 或 嵌在 `message` 里)。 */
|
|
93
37
|
function contentOf(entry) {
|
|
94
38
|
if (typeof entry !== 'object' || entry === null)
|
|
95
39
|
return undefined;
|
|
@@ -101,13 +45,7 @@ function contentOf(entry) {
|
|
|
101
45
|
}
|
|
102
46
|
return undefined;
|
|
103
47
|
}
|
|
104
|
-
/**
|
|
105
|
-
* content → 纯文本。tool_result 型正文返回 undefined —— 那是子代自己跑工具的回填,**不是**委派
|
|
106
|
-
* prompt(这条判别就是「别把子代自己的消息当委派 prompt」的落点)。
|
|
107
|
-
*/
|
|
108
48
|
export function delegatedPromptText(content) {
|
|
109
|
-
// 字符串形也要过信封剥离 —— 这条早退曾经绕过它(自家红测抓到:剥的是数组形,而真转录里
|
|
110
|
-
// 两种形都出现)。任何「返回 prompt 正文」的出口都必须经同一道剥离,否则就是半修。
|
|
111
49
|
if (typeof content === 'string')
|
|
112
50
|
return stripEnvelopes(content);
|
|
113
51
|
if (!Array.isArray(content))
|
|
@@ -122,31 +60,12 @@ export function delegatedPromptText(content) {
|
|
|
122
60
|
continue;
|
|
123
61
|
const b = block;
|
|
124
62
|
if (b.type === 'tool_result')
|
|
125
|
-
return undefined;
|
|
63
|
+
return undefined;
|
|
126
64
|
if (b.type === 'text' && typeof b.text === 'string')
|
|
127
65
|
parts.push(b.text);
|
|
128
66
|
}
|
|
129
67
|
return stripEnvelopes(parts.join('\n'));
|
|
130
68
|
}
|
|
131
|
-
/**
|
|
132
|
-
* 剥掉委派 prompt 外面那两层**运行时信封**,再判空。
|
|
133
|
-
*
|
|
134
|
-
* 🔴 为什么必须剥(2026-08-01 真机实测):引擎会话里那条 user 消息的前 ~1330 字符是
|
|
135
|
-
* `<system-reminder>…技能不可用清单…</system-reminder>` 与 `<fork-boilerplate>…worker fork 交代…
|
|
136
|
-
* </fork-boilerplate>` 两层信封,真正的委派 prompt 排在后面。而详情页的 `displayPrompt` 只渲**前 300
|
|
137
|
-
* 字符** ⇒ 用户在「Prompt」标题下看到的是一份技能清单,不是他派下去的那句话。
|
|
138
|
-
*
|
|
139
|
-
* 判空也必须在剥完之后做:只有信封、没有正文的消息应当算**没有委派 prompt**(让取件腿如实留白),
|
|
140
|
-
* 而不是把信封当成 prompt 渲出去 —— 后者是「渲了个东西」冒充「渲对了东西」。
|
|
141
|
-
*
|
|
142
|
-
* 信封是**成对标签**,所以用配对正则整段剥;不配对(被截断等)时保守不动,宁可多渲也不吃掉正文。
|
|
143
|
-
*/
|
|
144
|
-
// 🔴 件⑦([4974],2026-08-22):`system-reminder` 的**开标签带属性**(core ≥5.46 恒带
|
|
145
|
-
// `mark="<22 位 base64url>"`),精确形 `<system-reminder>` 整段剥不掉 ⇒ 上面那条 2026-08-01
|
|
146
|
-
// 修过的 bug 原样复发(详情页 Prompt 又变回技能清单)。剥壳口径收进包内单一闸口
|
|
147
|
-
// `systemReminderTag`(同根因的另一座位是 `classifierVerdictWire`,见该模块头注)。
|
|
148
|
-
// `fork-boilerplate` 是 core `agents/subagent.js` 里的**裸**标签(dist 直证),保持精确形 ——
|
|
149
|
-
// 没有属性的标签不需要属性容忍,给它加 = 给伪造面白让一寸。
|
|
150
69
|
const PROMPT_ENVELOPE_EXACT_TAGS = ['fork-boilerplate'];
|
|
151
70
|
function stripEnvelopes(raw) {
|
|
152
71
|
let text = stripSystemReminderBlocks(raw);
|
|
@@ -155,11 +74,6 @@ function stripEnvelopes(raw) {
|
|
|
155
74
|
}
|
|
156
75
|
return text.trim() || undefined;
|
|
157
76
|
}
|
|
158
|
-
/**
|
|
159
|
-
* 从转录里挑出委派 prompt = **最后一条非 tool_result 的 user 消息**(倒扫)。
|
|
160
|
-
* 🔴 倒扫不是随手选的:fork 型子代的转录以**父会话历史**开头,正扫会拿到宿主自己的首轮提示
|
|
161
|
-
* (live pty 实测的错答案);全新子会话型只有一条 user 文本消息,倒扫结果与正扫相同。
|
|
162
|
-
*/
|
|
163
77
|
export function pickDelegatedPrompt(messages) {
|
|
164
78
|
for (let i = messages.length - 1; i >= 0; i--) {
|
|
165
79
|
const entry = messages[i];
|
|
@@ -178,10 +92,6 @@ export function __setTranscriptWindowReaderForTests(r) {
|
|
|
178
92
|
async function readTranscriptWindow(transcriptId, sessionKey) {
|
|
179
93
|
if (transcriptWindowReader)
|
|
180
94
|
return transcriptWindowReader(transcriptId);
|
|
181
|
-
// 🔴 B6:六份手抄 `wireConfig()` 收成 `engineWireTarget()`(env 读经 hostEnv,本包零 process)。
|
|
182
|
-
// 🔴 design/285 批 3(D7b):零参形写死默认槽 —— 转录取件是**按行**的读面(锚 = 这一行登记的
|
|
183
|
-
// transcriptId),所以 baseUrl/token/principal 必须按**这一行所属的槽**取,否则 keyed 宿主上
|
|
184
|
-
// 会拿 A 槽的凭证去 `GET /v1/sessions/:id` 读 B 槽的转录(404,或更坏:读到同 id 的别人)。
|
|
185
95
|
const cfg = engineWireTargetFor(sessionKey);
|
|
186
96
|
if (!cfg)
|
|
187
97
|
return null;
|
|
@@ -192,8 +102,6 @@ async function readTranscriptWindow(transcriptId, sessionKey) {
|
|
|
192
102
|
});
|
|
193
103
|
if (!client)
|
|
194
104
|
return null;
|
|
195
|
-
// 窗口读:`tail=N` = 转录**尾部** N 条(server ≥1.162)。老引擎忽略 query 返回全量 ——
|
|
196
|
-
// 倒扫规则对全量同样正确,只是多传了点字节(行为等价)。
|
|
197
105
|
const rec = await client.sessions.get(transcriptId, {
|
|
198
106
|
tail: TAIL_WINDOW,
|
|
199
107
|
blobCap: BLOB_CAP,
|
|
@@ -201,13 +109,6 @@ async function readTranscriptWindow(transcriptId, sessionKey) {
|
|
|
201
109
|
const msgs = rec.messages;
|
|
202
110
|
return Array.isArray(msgs) ? msgs : null;
|
|
203
111
|
}
|
|
204
|
-
/**
|
|
205
|
-
* 取一个后台子代行的**委派 prompt**(判定半场:防抖 + 取锚 + 读转录 + 挑正文)。
|
|
206
|
-
* 幂等、fail-soft、绝不 throw。**不碰任何端状态** —— 落状态是端的事(见文件头拆缝说明)。
|
|
207
|
-
*
|
|
208
|
-
* 端侧用法(壳 `hydrateEngineAgentPrompt` shim):先自己判「这行是不是 local_agent、prompt 是不是
|
|
209
|
-
* 已经有了」,是才调本函数;拿到 `outcome==='hit'` 再 `setState`。
|
|
210
|
-
*/
|
|
211
112
|
export async function fetchDelegatedPrompt(taskId) {
|
|
212
113
|
if (promptHydrateInFlight.has(taskId))
|
|
213
114
|
return { outcome: 'skipped' };
|
|
@@ -217,7 +118,6 @@ export async function fetchDelegatedPrompt(taskId) {
|
|
|
217
118
|
promptHydrateInFlight.add(taskId);
|
|
218
119
|
let msgs = null;
|
|
219
120
|
try {
|
|
220
|
-
// 槽键取自 owner 台账的这一行(缺席 ⇒ DEFAULT_SESSION_KEY ⇒ 与 0.44.0 逐字同)。
|
|
221
121
|
msgs = await readTranscriptWindow(transcriptId, resolveOwnerContext(taskId).key);
|
|
222
122
|
}
|
|
223
123
|
catch (e) {
|
|
@@ -232,8 +132,6 @@ export async function fetchDelegatedPrompt(taskId) {
|
|
|
232
132
|
hostLog('debug', `[delegated-prompt] ${taskId} transcript ${transcriptId}: ${msgs === null ? 'transcript unreadable (retryable)' : 'no delegated user message (final)'}`);
|
|
233
133
|
return { outcome: msgs === null ? 'unreadable' : 'absent' };
|
|
234
134
|
}
|
|
235
|
-
// 诊断锚(SEMA_DEBUG 才落盘):字符数 + 头 60 字符 —— 「拿到的到底是委派 prompt 还是
|
|
236
|
-
// fork 转录里宿主自己的首轮提示」只有看得见正文头才分得开(第一版倒在这上面)。
|
|
237
135
|
hostLog('debug', `[delegated-prompt] ${taskId} <- transcript ${transcriptId} (${prompt.length} chars) head=${JSON.stringify(prompt.slice(0, 60))}`);
|
|
238
136
|
return { prompt, outcome: 'hit' };
|
|
239
137
|
}
|
|
@@ -1,25 +1,5 @@
|
|
|
1
|
-
/** 引擎 bridge 从 `task_progress` tick / fleet 行帧建的行(module-level:footer 重挂不丢归属)。 */
|
|
2
1
|
export declare const engineOwnedRowIds: Set<string>;
|
|
3
|
-
/** fleet 树 enter 时为「面板无行的 fleet 行」stub 出来的纯查看载体行。 */
|
|
4
2
|
export declare const fleetViewStubRowIds: Set<string>;
|
|
5
|
-
/** 这一行的真身在引擎里(本地 abortController 管不到它)。 */
|
|
6
3
|
export declare function isEngineViewRow(taskId: string): boolean;
|
|
7
|
-
/**
|
|
8
|
-
* 能力门同步读口(liveClient 构造期已 kick /v1/capabilities 进 engineCapsCache)。
|
|
9
|
-
*
|
|
10
|
-
* 🔴 design/285 批 3(D7b):零参 `engineWireTarget()` 换成 `engineWireTargetFor(sessionKey)`。
|
|
11
|
-
* caps 缓存按 **baseUrl** 分桶,而 keyed 多会话宿主每槽一个 baseUrl —— 写死默认槽 = 用 A 引擎的
|
|
12
|
-
* 能力位去判 B 引擎能不能停行。本模块是**零依赖叶**(单实例纪律见头注),不许 import 台账,
|
|
13
|
-
* 所以槽键由调用方给;缺省 `DEFAULT_SESSION_KEY` ⇒ 与 0.44.0 逐字同。
|
|
14
|
-
*/
|
|
15
4
|
export declare function engineTaskHandlesCapable(sessionKey?: string): boolean;
|
|
16
|
-
/**
|
|
17
|
-
* 停这一行**必须先拿到引擎回执**吗?
|
|
18
|
-
*
|
|
19
|
-
* true ⇒ 行的执行者是引擎,端写 `killed` 是一句它没证实过的断言 —— 必须 `POST …/stop` 拿到 200
|
|
20
|
-
* 才翻;409 `stop.not_landed` / `stop.not_local` / `stop.parked` 一律保持原状(引擎里
|
|
21
|
-
* 可能还在跑),下一拍由行帧/`stopped-by` 归因 settle([1754]③)。
|
|
22
|
-
* false ⇒ 行跑在本进程(CC 逐字形态),`abortController.abort()` 就是执行本身,端写 `killed`
|
|
23
|
-
* 按构造恒真 ⇒ 同步翻,与 CC 2.1.220 `UPd`(pretty220.js:507299)一字不差。
|
|
24
|
-
*/
|
|
25
5
|
export declare function engineRowNeedsStopConfirm(taskId: string, sessionKey?: string): boolean;
|
|
@@ -1,63 +1,14 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ⇄ B6 批搬迁(2026-07-27,设计稿 §3 B6):cli `src/sema/engineRowStopGate.ts` 整搬。
|
|
3
|
-
* 唯一差分 = `process.env.SEMA_LIVE_BASEURL` → `engineWireTarget()?.baseUrl`
|
|
4
|
-
* (本包零 `process`;Node 宿主下 `hostEnv()` 返回的就是 `process.env` 同一对象 ⇒ 取值相同。
|
|
5
|
-
* **超集**:非 Node 宿主可用 `installEngineWireTarget()` 显式装,此前那条腿恒 false)。
|
|
6
|
-
*
|
|
7
|
-
* 🔴 单实例纪律(本文件两个 module 级 Set 都是判据真源):
|
|
8
|
-
* `engineOwnedRowIds` 写者 = 引擎 bridge 的 `task_progress` tick / fleet 行帧臂;
|
|
9
|
-
* `fleetViewStubRowIds` 写者 = fleet 树 enter 的 stub 造行处;
|
|
10
|
-
* 读者 = 批量停/单行停的同步分诊。两份实例 ⇒ 分诊恒判「纯本地行」⇒ 引擎侧行被壳直接写
|
|
11
|
-
* `killed` 而引擎里还在跑 = [1754]③ 那类「壳说了一句它没证实过的话」。
|
|
12
|
-
*
|
|
13
|
-
* ── 以下为原文件的领域说明(逐字保留)────────────────────────────────────────────────────────
|
|
14
|
-
*
|
|
15
|
-
* engineRowStopGate — 「这一行是引擎侧的吗 / 停它要不要等引擎回执」的**同步**判别叶模块(#98)。
|
|
16
|
-
*
|
|
17
|
-
* 为什么单独一个叶模块:批量停(`ctrl+x ctrl+k` → `killAllRunningAgentTasks`)必须在**同步**
|
|
18
|
-
* 那一拍就把行分成两半 —— 纯本地行照 CC 逐字立刻翻 `killed`(CC 的 markNotified→kill 顺序不容
|
|
19
|
-
* 插入一个 await,否则 runner 自己的完成通知会抢在 markNotified 前面发出去),引擎侧行才走
|
|
20
|
-
* 「等 200 再翻」。而原先这两个判据分别住在 `engineAgentView`(拉 React/ink/transcript 全图)和
|
|
21
|
-
* `engineTaskHandleWire`(拉 SDK),`LocalAgentTask` 静态 import 任一都是循环依赖风险 —— 所以此前
|
|
22
|
-
* 只能 `await import(...)`,分类天然异步。把判据本身下沉成零依赖叶(只依赖同样零依赖的
|
|
23
|
-
* `engineCapsCache`),两边改成 re-export,判据单一真源不变,调用方拿到同步口。
|
|
24
|
-
*
|
|
25
|
-
* 🔴 语义与单行 `x`(BackgroundTasksDialog.killEngineAwareAgentTask)必须逐字一致:
|
|
26
|
-
* 引擎视图行 ∧ `capabilities.taskHandles` 在场 → 发真停止动词、**只有 200 才翻行**;
|
|
27
|
-
* 缺任一(老引擎 / 无 wire / 纯本地 AgentTool 行) → 回落旧行为(本地 abort 即真停,立即翻)。
|
|
28
|
-
*/
|
|
29
1
|
import { engineCapTrue } from '../engineCapsCache.js';
|
|
30
2
|
import { engineWireTargetFor } from '../engineWireTarget.js';
|
|
31
3
|
import { DEFAULT_SESSION_KEY } from '../sessionSlot.js';
|
|
32
|
-
/** 引擎 bridge 从 `task_progress` tick / fleet 行帧建的行(module-level:footer 重挂不丢归属)。 */
|
|
33
4
|
export const engineOwnedRowIds = new Set();
|
|
34
|
-
/** fleet 树 enter 时为「面板无行的 fleet 行」stub 出来的纯查看载体行。 */
|
|
35
5
|
export const fleetViewStubRowIds = new Set();
|
|
36
|
-
/** 这一行的真身在引擎里(本地 abortController 管不到它)。 */
|
|
37
6
|
export function isEngineViewRow(taskId) {
|
|
38
7
|
return engineOwnedRowIds.has(taskId) || fleetViewStubRowIds.has(taskId);
|
|
39
8
|
}
|
|
40
|
-
/**
|
|
41
|
-
* 能力门同步读口(liveClient 构造期已 kick /v1/capabilities 进 engineCapsCache)。
|
|
42
|
-
*
|
|
43
|
-
* 🔴 design/285 批 3(D7b):零参 `engineWireTarget()` 换成 `engineWireTargetFor(sessionKey)`。
|
|
44
|
-
* caps 缓存按 **baseUrl** 分桶,而 keyed 多会话宿主每槽一个 baseUrl —— 写死默认槽 = 用 A 引擎的
|
|
45
|
-
* 能力位去判 B 引擎能不能停行。本模块是**零依赖叶**(单实例纪律见头注),不许 import 台账,
|
|
46
|
-
* 所以槽键由调用方给;缺省 `DEFAULT_SESSION_KEY` ⇒ 与 0.44.0 逐字同。
|
|
47
|
-
*/
|
|
48
9
|
export function engineTaskHandlesCapable(sessionKey = DEFAULT_SESSION_KEY) {
|
|
49
10
|
return engineCapTrue(engineWireTargetFor(sessionKey)?.baseUrl, 'taskHandles');
|
|
50
11
|
}
|
|
51
|
-
/**
|
|
52
|
-
* 停这一行**必须先拿到引擎回执**吗?
|
|
53
|
-
*
|
|
54
|
-
* true ⇒ 行的执行者是引擎,端写 `killed` 是一句它没证实过的断言 —— 必须 `POST …/stop` 拿到 200
|
|
55
|
-
* 才翻;409 `stop.not_landed` / `stop.not_local` / `stop.parked` 一律保持原状(引擎里
|
|
56
|
-
* 可能还在跑),下一拍由行帧/`stopped-by` 归因 settle([1754]③)。
|
|
57
|
-
* false ⇒ 行跑在本进程(CC 逐字形态),`abortController.abort()` 就是执行本身,端写 `killed`
|
|
58
|
-
* 按构造恒真 ⇒ 同步翻,与 CC 2.1.220 `UPd`(pretty220.js:507299)一字不差。
|
|
59
|
-
*/
|
|
60
12
|
export function engineRowNeedsStopConfirm(taskId, sessionKey) {
|
|
61
|
-
// `sessionKey` additive(design/285 批 3):keyed 宿主把这一行所属的槽传下来;缺省 = 默认槽。
|
|
62
13
|
return isEngineViewRow(taskId) && engineTaskHandlesCapable(sessionKey ?? DEFAULT_SESSION_KEY);
|
|
63
14
|
}
|
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
/** 测试钩:清 caps 缓存。 */
|
|
2
1
|
export declare function __resetSubagentOutputCapCacheForTests(): void;
|
|
3
2
|
export interface EngineSubagentReport {
|
|
4
|
-
/** 子代最终 assistant 正文(server 对 running 态给状态文本——由 status 区分)。 */
|
|
5
3
|
content: string;
|
|
6
|
-
/** output.status 原样(completed/failed/killed/running…;undefined = wire 未带)。 */
|
|
7
4
|
status?: string;
|
|
8
5
|
}
|
|
9
|
-
/**
|
|
10
|
-
* 拉取一个后台子代的终报正文。null = 读不到(无 wire / caps 缺 / 404 域外或副本重启 / 网错)——
|
|
11
|
-
* 调用方回落 bg 事实渲染。绝不 throw。
|
|
12
|
-
*/
|
|
13
6
|
export declare function fetchEngineSubagentReport(taskId: string, opts?: {
|
|
14
7
|
signal?: AbortSignal;
|
|
15
8
|
}): Promise<EngineSubagentReport | null>;
|