@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,54 +1,21 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* src/fleet/workflowSizeWarning.ts —— workflow **规模告警**的判定(0.73.5)。
|
|
3
|
-
*
|
|
4
|
-
* 三端 footer / 面板都要回答同一个问题:「这条 workflow 是不是大到该提醒用户了」。判定与 CC 同形
|
|
5
|
-
* (三个缺省帽、每 agent 用量估算、guideline 表、两个 env 覆盖、三档文案与宽度阶梯),属于客户端公共逻辑,
|
|
6
|
-
* 由本包单源;端只负责读环境、读设置、量宽度与渲染。
|
|
7
|
-
*
|
|
8
|
-
* 🔴 **入参按 fleet 视图的三态键读**(`FleetWorkflowView`:`totalCount` / `startedCount` / `doneCount` /
|
|
9
|
-
* `failedCount` / `tokens` 全是可选位,缺席 = wire 没报 = 不知道)。出参三态:
|
|
10
|
-
* · `warn` —— 有**正向证据**证明至少一条轴超帽(别的键缺席不挡它;下界分母算出的上界**不算**证据);
|
|
11
|
-
* · `ok` —— 两条轴都判得出,且都在帽内(或 ultracode 压掉了整条告警);
|
|
12
|
-
* · `unknown` —— 没有超帽的正向证据,且至少一条轴判不出。**未知的规模不能被当作规模正常**:
|
|
13
|
-
* `unknown` 绝不折成 `ok`,`missing` 点名缺了哪几键。
|
|
14
|
-
*
|
|
15
|
-
* 🔴 **分母口径**(每 agent 用量 `u = tokens / started`):
|
|
16
|
-
* · `startedCount` 在场且不小于 `doneCount + failedCount` ⇒ 用引擎真值(含真 0:「一个都还没起」是一条真信息
|
|
17
|
-
* ⇒ 用先验);比已完成数还小(帧间竞态)⇒ 这份读数是陈旧的,按下面的下界处置;
|
|
18
|
-
* · 缺席 ⇒ 只有 `doneCount` / `failedCount` **两键都在场**才回退成下界,结果标 `startedIsLowerBound`。
|
|
19
|
-
* 下界偏小 ⇒ `u` 偏大 ⇒ 算出来的是投影的**上界**(`projectedTokensUpperBound`,不是 `projectedTokens`):
|
|
20
|
-
* 上界在帽内 ⇒ 真的在帽内 ⇒ 可以判 `ok`;上界超帽**不是**超帽的证据(同一份读数补上真 `startedCount`
|
|
21
|
-
* 可能远在帽内)⇒ 投影轴判不出,`unknown`。想保守一点的端可以自己拿上界去提示,判词不替它撒谎;
|
|
22
|
-
* · 下界为 0 ⇒ 每 agent 用量判不出:「0 个完成」不是「一个没起」的证据,先验只在引擎**亲口**报
|
|
23
|
-
* `startedCount = 0` 时可用;
|
|
24
|
-
* · 只有一键在场 ⇒ 不回退(缺席的那键不读作 0)。
|
|
25
|
-
*/
|
|
26
|
-
/** 缺省 agent 数帽。 */
|
|
27
1
|
export const WORKFLOW_SIZE_WARNING_AGENT_CAP = 25;
|
|
28
|
-
/** 缺省 token 帽(已花 ∨ 投影)。 */
|
|
29
2
|
export const WORKFLOW_SIZE_WARNING_TOKEN_CAP = 1_500_000;
|
|
30
|
-
/** 还没有任何 agent 起跑时的每 agent 用量先验。 */
|
|
31
3
|
export const WORKFLOW_SIZE_WARNING_TOKENS_PER_AGENT = 70_000;
|
|
32
|
-
/** 显式 `workflowSizeGuideline` → agent 数帽。`unrestricted` 与缺省(未配置)**不贡献帽**,故不在表里。 */
|
|
33
4
|
export const WORKFLOW_SIZE_GUIDELINE_AGENT_CAPS = Object.freeze({
|
|
34
5
|
small: 5,
|
|
35
6
|
medium: 15,
|
|
36
7
|
large: 50,
|
|
37
8
|
});
|
|
38
|
-
/** 两个 env 覆盖各自的名字,按读取优先级排(品牌名在前,兼容名在后)。本包不读 `process.env`,名字单源在这里。 */
|
|
39
9
|
export const WORKFLOW_SIZE_WARNING_ENV_NAMES = Object.freeze({
|
|
40
10
|
agents: Object.freeze(['SEMA_CODE_WORKFLOW_SIZE_WARNING_AGENTS', 'CLAUDE_CODE_WORKFLOW_SIZE_WARNING_AGENTS']),
|
|
41
11
|
tokens: Object.freeze(['SEMA_CODE_WORKFLOW_SIZE_WARNING_TOKENS', 'CLAUDE_CODE_WORKFLOW_SIZE_WARNING_TOKENS']),
|
|
42
12
|
});
|
|
43
|
-
/** 三档文案(宽 → 窄)。 */
|
|
44
13
|
export const WORKFLOW_SIZE_WARNING_TEXT_LONG = '⚠ Large workflow · /workflows to stop';
|
|
45
14
|
export const WORKFLOW_SIZE_WARNING_TEXT_SHORT = '⚠ Large workflow';
|
|
46
15
|
export const WORKFLOW_SIZE_WARNING_TEXT_MIN = '⚠';
|
|
47
|
-
/** 有限非负数,否则缺席(坏形按缺席,不猜)。 */
|
|
48
16
|
function count(v) {
|
|
49
17
|
return typeof v === 'number' && Number.isFinite(v) && v >= 0 ? v : undefined;
|
|
50
18
|
}
|
|
51
|
-
/** 正有限数,否则缺席。 */
|
|
52
19
|
function positive(v) {
|
|
53
20
|
return typeof v === 'number' && Number.isFinite(v) && v > 0 ? v : undefined;
|
|
54
21
|
}
|
|
@@ -57,7 +24,6 @@ function guidelineCap(size) {
|
|
|
57
24
|
? WORKFLOW_SIZE_GUIDELINE_AGENT_CAPS[size]
|
|
58
25
|
: undefined;
|
|
59
26
|
}
|
|
60
|
-
/** 规模判定。纯函数:每个环境量都由调用方注入。 */
|
|
61
27
|
export function evaluateWorkflowSize(input) {
|
|
62
28
|
const agentCap = positive(input.envAgentCap) ?? guidelineCap(input.guidelineSize) ?? WORKFLOW_SIZE_WARNING_AGENT_CAP;
|
|
63
29
|
const tokenCap = positive(input.envTokenCap) ?? WORKFLOW_SIZE_WARNING_TOKEN_CAP;
|
|
@@ -71,7 +37,6 @@ export function evaluateWorkflowSize(input) {
|
|
|
71
37
|
};
|
|
72
38
|
if (input.ultracodeActive === true)
|
|
73
39
|
return { kind: 'ok', suppressed: true, ...base };
|
|
74
|
-
// 分母:真值 / 两键下界 / 判不出。
|
|
75
40
|
const startedWire = count(input.startedCount);
|
|
76
41
|
const done = count(input.doneCount);
|
|
77
42
|
const failed = count(input.failedCount);
|
|
@@ -82,12 +47,9 @@ export function evaluateWorkflowSize(input) {
|
|
|
82
47
|
started = startedWire;
|
|
83
48
|
}
|
|
84
49
|
else if (bound !== undefined) {
|
|
85
|
-
// `startedCount` 缺席,或它比已完成数还小(帧间竞态:已完成的 agent 必然起过 ⇒ 这份 started 是陈旧的)。
|
|
86
|
-
// 顶上来的 `done + failed` 只是**下界**,不是真值 —— 与缺席同一处置。
|
|
87
50
|
started = bound;
|
|
88
51
|
lowerBound = true;
|
|
89
52
|
}
|
|
90
|
-
// 投影:分母是真值 ⇒ 投影;分母是下界(> 0)⇒ 只有上界;其余判不出。
|
|
91
53
|
let projected;
|
|
92
54
|
let upperBound;
|
|
93
55
|
if (scheduled !== undefined && tokens !== undefined && started !== undefined) {
|
|
@@ -104,7 +66,6 @@ export function evaluateWorkflowSize(input) {
|
|
|
104
66
|
...(upperBound !== undefined ? { projectedTokensUpperBound: upperBound } : {}),
|
|
105
67
|
...(lowerBound && scheduled !== undefined && tokens !== undefined ? { startedIsLowerBound: true } : {}),
|
|
106
68
|
};
|
|
107
|
-
/** 投影轴在帽内的证据:真投影在帽内,或上界在帽内。 */
|
|
108
69
|
const projectionWithinCap = (projected !== undefined && projected <= tokenCap) || (upperBound !== undefined && upperBound <= tokenCap);
|
|
109
70
|
const overAgents = scheduled !== undefined && scheduled > agentCap;
|
|
110
71
|
const overTokens = (tokens !== undefined && tokens > tokenCap) || (projected !== undefined && projected > tokenCap);
|
|
@@ -122,11 +83,6 @@ export function evaluateWorkflowSize(input) {
|
|
|
122
83
|
return { kind: 'unknown', missing, ...facts };
|
|
123
84
|
return { kind: 'ok', ...facts };
|
|
124
85
|
}
|
|
125
|
-
/**
|
|
126
|
-
* 两个 env 覆盖的读口。`env` 由调用方交(本包不碰 `process.env`)。每组按 {@link WORKFLOW_SIZE_WARNING_ENV_NAMES}
|
|
127
|
-
* 的顺序取**第一个在场的名字**;那个名字的值不是正有限数 ⇒ 该键不在场,**不回落**到第二个名字
|
|
128
|
-
* (显式写错不该被悄悄换源)。
|
|
129
|
-
*/
|
|
130
86
|
export function readWorkflowSizeWarningEnvCaps(env) {
|
|
131
87
|
const pick = (names) => {
|
|
132
88
|
if (env === undefined || env === null)
|
|
@@ -134,7 +90,7 @@ export function readWorkflowSizeWarningEnvCaps(env) {
|
|
|
134
90
|
for (const n of names) {
|
|
135
91
|
const raw = env[n];
|
|
136
92
|
if (typeof raw !== 'string')
|
|
137
|
-
continue;
|
|
93
|
+
continue;
|
|
138
94
|
return positive(Number(raw));
|
|
139
95
|
}
|
|
140
96
|
return undefined;
|
|
@@ -143,7 +99,6 @@ export function readWorkflowSizeWarningEnvCaps(env) {
|
|
|
143
99
|
const t = pick(WORKFLOW_SIZE_WARNING_ENV_NAMES.tokens);
|
|
144
100
|
return { ...(a !== undefined ? { envAgentCap: a } : {}), ...(t !== undefined ? { envTokenCap: t } : {}) };
|
|
145
101
|
}
|
|
146
|
-
/** 宽度阶梯:挑放得下的最长一档;连字形都放不下 ⇒ `undefined`(整段不渲)。`width` 由调用方注入(与渲染器同一把尺)。 */
|
|
147
102
|
export function workflowSizeWarningTextForWidth(available, width) {
|
|
148
103
|
if (available >= width(WORKFLOW_SIZE_WARNING_TEXT_LONG))
|
|
149
104
|
return WORKFLOW_SIZE_WARNING_TEXT_LONG;
|
|
@@ -1,71 +1,23 @@
|
|
|
1
|
-
/** 行帧投影后的最小 agent 行形(fleet-tree 的 FleetTask 是它的超集)。 */
|
|
2
1
|
export interface FleetAgentRowLike {
|
|
3
2
|
id: string;
|
|
4
|
-
/** fleet 行 label 列 = agent identity(agentName ?? agentType),如 'fork'。 */
|
|
5
3
|
name?: string;
|
|
6
|
-
/** fleet 行描述列 = 任务描述,如 'alpha-probe'(面板行 label 用它)。 */
|
|
7
4
|
description?: string;
|
|
8
5
|
status?: string;
|
|
9
6
|
tokens?: number;
|
|
10
|
-
/**
|
|
11
|
-
* server 1.278.0 `toolUses` —— 子代**累计**工具调用数。🔴 三态:有键真值(含真 0)/
|
|
12
|
-
* 无键 `undefined` = 老引擎不知道。**本层绝不 `?? 0`**(那等于把「不知道」冒充成「跑了 0 个」,
|
|
13
|
-
* 而且会把台账里已知的累计值擦回 0)。
|
|
14
|
-
*
|
|
15
|
-
* ⚠️ **这句话只对本层成立 —— 分层实情**(2026-07-31 更正:原文写成绝对句「绝不在本层 `?? 0`」,
|
|
16
|
-
* 读起来像是全包禁令,于是与 `adapt.ts` tick 臂那句 `: 0` 构成一处**包内自相矛盾**;真相是两条
|
|
17
|
-
* lane 的供给形不同,判据见 `engineAgentPanelStore.ts` 的 `PANEL_TOOLUSES_LANE_POLICY`):
|
|
18
|
-
* · **本 lane(fleet 行帧)**:该键是 server 1.278.0 **新加**的可选位,老引擎真的不发 ⇒
|
|
19
|
-
* 缺席 = 不知道 ⇒ 必须传播缺席(键不落)。
|
|
20
|
-
* · **tick lane(`task_progress`)**:`usage` 在 core 的事件类型里是**必填**
|
|
21
|
-
* (core 2.12.0 `core/types.d.ts:606-610`),两处发帧点无条件构造它
|
|
22
|
-
* (`core/runner/runtask.js:1080` / `:2925`),server 白名单整键透传
|
|
23
|
-
* (`trace/project.js:118`)⇒ 那条 lane 上「缺席」不是「不知道」,是没有这种帧;那里的
|
|
24
|
-
* `: 0` 是对一个**恒发的累计计数**兜底,不是编造一个不知道的值。
|
|
25
|
-
* 两条 lane 的可选性差异由 `engineAgentPanelStore.ts` 的编译钉锁住:谁想把两层「统一」成
|
|
26
|
-
* 同一种形,先在那里撞红。
|
|
27
|
-
*/
|
|
28
7
|
toolUses?: number;
|
|
29
|
-
/** server 1.278.0 `transcriptId`(子代 childSessionId)—— 委派 prompt 的取件锚,不是 prompt 本身。 */
|
|
30
8
|
transcriptId?: string;
|
|
31
|
-
/** server 1.288.0 / core 1.429.0([1831]②)—— 子代当前工具的结构化形。缺席=旧端或从未跑过工具。 */
|
|
32
9
|
currentTool?: {
|
|
33
10
|
toolName: string;
|
|
34
11
|
target?: string;
|
|
35
12
|
};
|
|
36
|
-
/** server 1.250 起行带的 launch 真锚(epoch ms)。R4(clay 五报 07-31):此前投影载荷丢弃它,
|
|
37
|
-
* 详情页 elapsed 只能锚「壳建行时刻」——遗留行上渲出 1h+ 的假时长。缺席=老引擎,消费端保持现状。 */
|
|
38
13
|
startedAt?: number;
|
|
39
|
-
/** 0.74.0 —— 行的代际号(fleet 视图 `FleetTaskView.cycleSeq` 原样交)。缺席 = 这一行没有代际概念,不是第一代。 */
|
|
40
14
|
cycleSeq?: number;
|
|
41
|
-
/** 0.74.3 CC-70:行帧上的委派卡 id(sdk `FleetTaskRow.parentToolCallId`);身份归一的退路键,在场才投影。 */
|
|
42
15
|
parentToolCallId?: string;
|
|
43
16
|
}
|
|
44
|
-
/** 行从投影集消失多久之后上报 `absent`(0.72.12 起不再 settle;重连空窗 / snapshot 清表远小于此)。名字沿用(公面导出)。 */
|
|
45
17
|
export declare const ABSENT_SETTLE_MS = 30000;
|
|
46
|
-
/**
|
|
47
|
-
* 测试钩:清投影台账 —— **全部 sessionKey**,不是只清 default 桶。
|
|
48
|
-
*
|
|
49
|
-
* 🔴 回炉定谳(P3 wave2 复审 blocker④):per-session 化那一批一度把它收窄成
|
|
50
|
-
* `resetFleetAgentPanelProjectionFor(DEFAULT_SESSION_KEY)`。它的契约是「清投影台账」,不是一个
|
|
51
|
-
* 会话语义位 —— 收窄等于给多会话宿主的用例之间留一条跨用例串扰通道(用例 A 先
|
|
52
|
-
* `projectFleetAgentRowsFor('sess-b', …)`,用例间调零参 reset,`sess-b` 桶存活 ⇒ 下个用例首次
|
|
53
|
-
* 投影同 taskId 时 `prev` 非空且 `settled:true`,`fleet-row`/`end` 被去重门吞掉)。
|
|
54
|
-
* 对位实现同形:`fleet/fleetLedger.__resetFleetLedgerRegistryForTests()` = `liveBgViews.clear()`;
|
|
55
|
-
* W1 段五个槽位的现成规约也逐个钉的是「reset 清全部键」。
|
|
56
|
-
* 要只清一个会话请用 `resetFleetAgentPanelProjectionFor(sessionKey)`。
|
|
57
|
-
*/
|
|
58
18
|
export declare function resetFleetAgentPanelProjection(): void;
|
|
59
|
-
/** W1 keyed variant(REF-CC-045):只清**这一个会话**的桶。 */
|
|
60
19
|
export declare function resetFleetAgentPanelProjectionFor(sessionKey: string): void;
|
|
61
|
-
/** 台账读面(测试/诊断):当前记着的行数。 */
|
|
62
20
|
export declare function fleetAgentProjectionSize(): number;
|
|
63
|
-
/** W1 keyed variant。 */
|
|
64
21
|
export declare function fleetAgentProjectionSizeFor(sessionKey: string): number;
|
|
65
|
-
/**
|
|
66
|
-
* 把一次 fleet 投影(已经过 own 判别 + workflow belt 的 FleetTask[])喂给面板事件流。
|
|
67
|
-
* 幂等、无副作用地重复调用安全 —— 每秒被 footer 调用两次就是常态。
|
|
68
|
-
*/
|
|
69
22
|
export declare function projectFleetAgentRows(rows: readonly FleetAgentRowLike[], nowMs?: number): void;
|
|
70
|
-
/** W1 keyed variant(REF-CC-045):多会话宿主每会话一份台账,互不顶盖。 */
|
|
71
23
|
export declare function projectFleetAgentRowsFor(sessionKey: string, rows: readonly FleetAgentRowLike[], nowMs?: number): void;
|
|
@@ -1,88 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ⇄ B1 批搬迁(2026-07-27,多端改造设计稿 §2.4.1-B):cli src/sema/fleetAgentPanelProjection.ts 逐字搬入(唯一 import = 同批搬入的
|
|
3
|
-
* engineAgentPanelStore,包内相对路径不变;壳侧改 re-export)。
|
|
4
|
-
* 🔴 REF-CC-041/042(P3 wave2,fleet2-03/04):P1 迁移之后本文件不再是「唯一 import」——同批把
|
|
5
|
-
* `TERMINAL_STATUSES` 改成 import `./fleet/fleetProjection.js` 的 `TERMINAL_FLEET_TASK_STATUSES`
|
|
6
|
-
* (单源,原副本零测试锁着,分叉理由已不成立)、`rowIdTail` 改 import `./workflow.js`(同包另两个
|
|
7
|
-
* 消费者 `fleet/fleetLedger.ts` / `fleet/fleetProjection.ts` 早就这么做,只有本文件是例外)。
|
|
8
|
-
* ⚠️ 本文件含**两个字面 NUL 字节**(`${ct.toolName}\0${ct.target}` 的 currentTool 判等键分隔符,
|
|
9
|
-
* 语义承载位,搬迁时逐字节保留)—— 副作用:BSD `grep`/`file` 把本文件当二进制,`grep` 不加 `-a`
|
|
10
|
-
* 会**静默零命中**(不是「没有」,是「没在找」)。改本文件的探针一律 `grep -a`。
|
|
11
|
-
*/
|
|
12
|
-
/**
|
|
13
|
-
* src/sema/fleetAgentPanelProjection.ts — fleet 行帧 lane → Background 面板 local_agent 行的**投影闸**
|
|
14
|
-
* (2026-07-26「后台 Agent 子代不进 Background 面板」案;零依赖叶模块,mock 钉直测面)。
|
|
15
|
-
*
|
|
16
|
-
* ══ 为什么需要这条腿(分诊 = B 类,一手取证)═══════════════════════════════════════════════════
|
|
17
|
-
* verify/_bgagent-panel-lane-live-pty.mjs 首跑(engine 1.277.4 真机,真 deepseek):两个
|
|
18
|
-
* `run_in_background:true` 的 fork 子代**整跑活跃干活**(footer fleet 树 `◯ fork alpha-probe … 47.8k
|
|
19
|
-
* tokens`,token 在涨),同一跑里
|
|
20
|
-
* task_progress tick 探针 = 0 条 · fleet 行帧探针 = 24 条
|
|
21
|
-
* 面板的 local_agent 行此前**只**由 `task_progress` tick 注册(chrome-agentprogress
|
|
22
|
-
* useEngineAgentPanelBridge),而后台子代的 tick 从来没有通道到壳(父 turn 秒收口即关 SSE)——
|
|
23
|
-
* 于是产品自印的「N background agents launched (↓ to manage)」把用户指向一个**看不到它们**的面板,
|
|
24
|
-
* 且 `ctrl+x ctrl+k … stop all agents` 的渲染门(> 1 running local_agent)在真产品里永不成立。
|
|
25
|
-
* 帧**到了壳**、只是走了另一条 lane ⇒ 壳侧可修:把行帧 lane 的 agent 事实也投影进 AppState.tasks。
|
|
26
|
-
*
|
|
27
|
-
* ══ CC 220 对位 ═══════════════════════════════════════════════════════════════════════════════
|
|
28
|
-
* CC 2.1.220 `esi`(BackgroundTasksDialog)的 Local agents 分节就是
|
|
29
|
-
* Object.values(tasks).filter(isBackgroundTask) → .filter(ge => ge.type === "local_agent" && ge.id !== i)
|
|
30
|
-
* → { key:"local-agents", header: zEt({label:"Local agents", size: y.length}) }
|
|
31
|
-
* (cc-decoded/pretty220.js:860404 起的 filter 串 + 860812 的分节表)。所以正确的修法是**让这些子代
|
|
32
|
-
* 成为 running 的 local_agent 行**,而不是新造分节/新造行形 —— 面板形状一个字都不动。
|
|
33
|
-
*
|
|
34
|
-
* ══ 本模块的规矩 ═══════════════════════════════════════════════════════════════════════════════
|
|
35
|
-
* ① 只发**变化**:同一行 status/tokens 没变就不发事件(footer 每秒 tick 两次,无脑发 = 每秒两次
|
|
36
|
-
* setAppState 全树重渲)。
|
|
37
|
-
* ② 终态行发一次 `end`(幂等台账),并摘除常驻标 —— 与 bg_notification 合成链同一个 settle 边,
|
|
38
|
-
* 两边先到先得,消费端 settle 本身幂等(running 才动)。
|
|
39
|
-
* ③ 缺席上报(0.72.12 CC-50 改形):行从投影集里消失且**超过宽限窗**仍没见终态 ⇒ 经**独立缺席口**(`publishEngineAgentPanelAbsence`,0.72.13;不上主通道)
|
|
40
|
-
* 上报一条(**不是** `end`、**不** settle)。此前这里「按 completed settle」= 把「引擎不再上报这一行」
|
|
41
|
-
* 编成「成功」—— 本包手上没有任何载体说明它完没完成(test [7541] 两条现场腿秒级实测:屏上
|
|
42
|
-
* ✔ Completed 的真实来源就是这一格;server [7545]:子行随父 run 离场被 `orphaned` 移除,真终局由
|
|
43
|
-
* 后续对账周期补发,结构性晚于这个窗)。真终态帧迟到照发那唯一一次 `end`;行回来照发 `fleet-row`。
|
|
44
|
-
* 宽限窗内的重连空窗(snapshot 清表)不上报;lastSeen 恒**先**按本次在场行刷新、再判缺席,所以
|
|
45
|
-
* footer 长时间卸载后重挂也不误报。
|
|
46
|
-
* ④ 行 id 尾段判(`${runId} ${taskId}` 复合形取尾;真机 1.277.4 上子行 id 是裸 a+16hex,复合形是
|
|
47
|
-
* run 发布器双生行的形)——REF-CC-042:与同包 `workflow.rowIdTail` 同一个函数(import,不再
|
|
48
|
-
* 就地维护第二份;该函数出过等价性事故,0.1.1 修,见 `workflow.ts` 头注)。
|
|
49
|
-
*/
|
|
50
1
|
import { isStaleEngineAgentPanelEnd, publishEngineAgentPanelAbsence, publishEngineAgentPanelEvent } from './engineAgentPanelStore.js';
|
|
51
2
|
import { __resetPanelRunningHistoryForTests, notePanelRowRunning, panelRowUnknownToConsumer, panelRowEndedIdentity, holdNewbornTerminalRow, peekHeldNewbornTerminalRow, dropHeldNewbornTerminalRow } from './panelRunningHistory.js';
|
|
52
3
|
import { rowIdTail } from './workflow.js';
|
|
53
4
|
import { TERMINAL_FLEET_TASK_STATUSES } from './fleet/fleetProjection.js';
|
|
54
5
|
import { DEFAULT_SESSION_KEY } from './sessionSlot.js';
|
|
55
|
-
// L-215+(0.65.0;core [6908]):「非成功终局」的单铸谓词(与 notifications 的同名位同源)。
|
|
56
6
|
import { isTerminalNotSuccess } from './runTerminal.js';
|
|
57
|
-
/** 行从投影集消失多久之后上报 `absent`(0.72.12 起不再 settle;重连空窗 / snapshot 清表远小于此)。名字沿用(公面导出)。 */
|
|
58
7
|
export const ABSENT_SETTLE_MS = 30_000;
|
|
59
|
-
/** REF-CC-045(fleet2-07):settled 条目的回收期 —— settle 后这么久仍未再被投影 ⇒ 台账整条
|
|
60
|
-
* delete,给 `fleetAgentProjectionSizeFor()` 一个上界(此前 `seen` 只增不减,长会话里每个
|
|
61
|
-
* 跑过的 bg 子代永久占一条)。settle 事件已经发过,消费端 settle 幂等,delete 对外无事件。
|
|
62
|
-
*
|
|
63
|
-
* 🔴 [2393] notif-F13 / sweep-F7(2026-08-03 全窗复审)**两处纠**(判据换轴 + 范围如实):
|
|
64
|
-
* (a) 回收判据从 `lastSeenAt` 换成 **`settledAtMs`**(settle 那一刻的钟)。上一版 ③ 缺席兜底
|
|
65
|
-
* 把条目标 `settled:true` 时**保留旧的 lastSeenAt**,紧接着 ④ 在**同一次调用**里用
|
|
66
|
-
* `nowMs - lastSeenAt > 120s` 判回收 ⇒ 面板卸载超过 120s 再挂回来时,那条行「刚被 settle
|
|
67
|
-
* 就立刻被删」,而 `prev?.settled` 正是「终态 end 只发一次」的**唯一**判据 —— 去重记号随
|
|
68
|
-
* 条目一起消失,同 taskId 的迟到终态帧会再发一次 `fleet-row`+`end`。
|
|
69
|
-
* 换轴之后「settle 后至少保留一个回收期」成为真的。
|
|
70
|
-
* (b) 回收只对**本次投影里已不在场**的条目成立(`!present.has(taskId)`)。仍在场的终态行不删:
|
|
71
|
-
* 删了它下一拍 `prev === undefined` 会**重发 end**,每拍一次,比不删坏得多。
|
|
72
|
-
* ⇒ 上界的如实表述:**不再被投影的条目会被回收**;仍被持续投影的终态行由投影集自身定界
|
|
73
|
-
* (它的大小是引擎/宿主列出来的行数,不是本台账的无界累积)。ledger 里 REF-CC-045 的问题
|
|
74
|
-
* 陈述「只增不减」覆盖的正是前半场,后半场此前被说成也已解决,那句话不成立。 */
|
|
75
8
|
const SETTLED_RETENTION_MS = ABSENT_SETTLE_MS * 4;
|
|
76
|
-
/** currentTool 判等键(POST-MERGE 行每秒重发同值,只有键变了才算变化)。 */
|
|
77
9
|
function currentToolKeyOf(ct) {
|
|
78
10
|
if (!ct || typeof ct.toolName !== 'string' || ct.toolName.length === 0)
|
|
79
11
|
return undefined;
|
|
80
12
|
return `${ct.toolName}\u0000${ct.target ?? ''}`;
|
|
81
13
|
}
|
|
82
|
-
/** REF-CC-045(fleet2-07):per-sessionKey 台账(W1 同款 `Map<sessionKey, Map<...>>` 形)。 */
|
|
83
14
|
const seen = new Map();
|
|
84
|
-
// 0.74.5 CC-86:「发布过 running 而尚未结掉」的行 id 在 `panelRunningHistory.ts`(进程级共享叶;写方 = 本投影的非终态帧,
|
|
85
|
-
// 销账方 = 面板漏斗的任何 lane 的 end(通知车道的 end 不经本投影),读方 = 下面的终态分支)。
|
|
86
15
|
function seenFor(sessionKey) {
|
|
87
16
|
let m = seen.get(sessionKey);
|
|
88
17
|
if (!m) {
|
|
@@ -91,42 +20,22 @@ function seenFor(sessionKey) {
|
|
|
91
20
|
}
|
|
92
21
|
return m;
|
|
93
22
|
}
|
|
94
|
-
/**
|
|
95
|
-
* 测试钩:清投影台账 —— **全部 sessionKey**,不是只清 default 桶。
|
|
96
|
-
*
|
|
97
|
-
* 🔴 回炉定谳(P3 wave2 复审 blocker④):per-session 化那一批一度把它收窄成
|
|
98
|
-
* `resetFleetAgentPanelProjectionFor(DEFAULT_SESSION_KEY)`。它的契约是「清投影台账」,不是一个
|
|
99
|
-
* 会话语义位 —— 收窄等于给多会话宿主的用例之间留一条跨用例串扰通道(用例 A 先
|
|
100
|
-
* `projectFleetAgentRowsFor('sess-b', …)`,用例间调零参 reset,`sess-b` 桶存活 ⇒ 下个用例首次
|
|
101
|
-
* 投影同 taskId 时 `prev` 非空且 `settled:true`,`fleet-row`/`end` 被去重门吞掉)。
|
|
102
|
-
* 对位实现同形:`fleet/fleetLedger.__resetFleetLedgerRegistryForTests()` = `liveBgViews.clear()`;
|
|
103
|
-
* W1 段五个槽位的现成规约也逐个钉的是「reset 清全部键」。
|
|
104
|
-
* 要只清一个会话请用 `resetFleetAgentPanelProjectionFor(sessionKey)`。
|
|
105
|
-
*/
|
|
106
23
|
export function resetFleetAgentPanelProjection() {
|
|
107
24
|
seen.clear();
|
|
108
25
|
__resetPanelRunningHistoryForTests();
|
|
109
26
|
}
|
|
110
|
-
/** W1 keyed variant(REF-CC-045):只清**这一个会话**的桶。 */
|
|
111
27
|
export function resetFleetAgentPanelProjectionFor(sessionKey) {
|
|
112
28
|
seen.delete(sessionKey);
|
|
113
29
|
}
|
|
114
|
-
/** 台账读面(测试/诊断):当前记着的行数。 */
|
|
115
30
|
export function fleetAgentProjectionSize() {
|
|
116
31
|
return fleetAgentProjectionSizeFor(DEFAULT_SESSION_KEY);
|
|
117
32
|
}
|
|
118
|
-
/** W1 keyed variant。 */
|
|
119
33
|
export function fleetAgentProjectionSizeFor(sessionKey) {
|
|
120
34
|
return seen.get(sessionKey)?.size ?? 0;
|
|
121
35
|
}
|
|
122
|
-
/**
|
|
123
|
-
* 把一次 fleet 投影(已经过 own 判别 + workflow belt 的 FleetTask[])喂给面板事件流。
|
|
124
|
-
* 幂等、无副作用地重复调用安全 —— 每秒被 footer 调用两次就是常态。
|
|
125
|
-
*/
|
|
126
36
|
export function projectFleetAgentRows(rows, nowMs = Date.now()) {
|
|
127
37
|
projectFleetAgentRowsFor(DEFAULT_SESSION_KEY, rows, nowMs);
|
|
128
38
|
}
|
|
129
|
-
/** W1 keyed variant(REF-CC-045):多会话宿主每会话一份台账,互不顶盖。 */
|
|
130
39
|
export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
131
40
|
const seenMap = seenFor(sessionKey);
|
|
132
41
|
const present = new Set();
|
|
@@ -138,74 +47,40 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
138
47
|
continue;
|
|
139
48
|
present.add(taskId);
|
|
140
49
|
const status = row.status ?? 'running';
|
|
141
|
-
// 0.73.0:三态 —— 帧上真给了非负整数才算数;缺席 / 坏形 ⇒ 沿用已知值(粘性),从没报过就是 undefined。
|
|
142
|
-
// 此前 `?? 0`:首帧发布 `totalTokens:0`(面板渲「0 tokens」),已知之后来一帧缺席又发布 0 把用量清零。
|
|
143
50
|
const wireTokens = typeof row.tokens === 'number' && Number.isInteger(row.tokens) && row.tokens >= 0 ? row.tokens : undefined;
|
|
144
|
-
const tokens = wireTokens;
|
|
145
|
-
// 🔴 三态直取:`row.toolUses` 缺席就是 undefined,这里**不许**兜 0(见 FleetAgentRowLike 注)。
|
|
51
|
+
const tokens = wireTokens;
|
|
146
52
|
const toolUses = typeof row.toolUses === 'number' ? row.toolUses : undefined;
|
|
147
53
|
const transcriptId = row.transcriptId || undefined;
|
|
148
54
|
const parentToolCallId = typeof row.parentToolCallId === 'string' && row.parentToolCallId.length > 0 ? row.parentToolCallId : undefined;
|
|
149
|
-
// 🔴 形核与周期判据(`isStaleEngineAgentPanelEnd` / `isNewEngineAgentPanelCycle`)**逐字同源**:
|
|
150
|
-
// 有限正数才算数。少一个 `Number.isFinite` 就会让 `Infinity` 进台账 —— 那两只判据按缺席看它,
|
|
151
|
-
// 而本层按在场看它,同一帧在两处得出相反的「可比不可比」。
|
|
152
|
-
// `Infinity` 还会被序列化成 `null` 发给消费端,渲成一个不存在的 launch 时刻。
|
|
153
55
|
const startedAt = typeof row.startedAt === 'number' && Number.isFinite(row.startedAt) && row.startedAt > 0 ? row.startedAt : undefined;
|
|
154
|
-
// 0.74.0:代际号(正整数才算;坏形 / 缺席 ⇒ undefined,绝不补 1)。
|
|
155
56
|
const cycleSeq = typeof row.cycleSeq === 'number' && Number.isInteger(row.cycleSeq) && row.cycleSeq >= 1 ? row.cycleSeq : undefined;
|
|
156
57
|
const currentTool = currentToolKeyOf(row.currentTool) !== undefined ? row.currentTool : undefined;
|
|
157
58
|
const currentToolKey = currentToolKeyOf(row.currentTool);
|
|
158
59
|
const prev = seenMap.get(taskId);
|
|
159
|
-
// 0.74.0(异源对抗复审 R1):行上已是更新的一代,这一帧却是更早的一代 ⇒ 前代迟到帧。整只跳过:不发 fleet-row
|
|
160
|
-
// (它会把消费端记的周期身份改写回旧代,让随后的 end{旧代} 过陈旧判据)、不发 end、不动台账(否则台账被标
|
|
161
|
-
// settled,新一代的真终态就被去重吞掉)。在场已记 ⇒ 不会因此误报缺席。
|
|
162
|
-
// 判据与消费端同一条(`isStaleEngineAgentPanelEnd`:cycleSeq 优先,startedAt 回退)—— 只比 cycleSeq 会让只带
|
|
163
|
-
// startedAt 的前代帧漏网(异源对抗复审 R2)。
|
|
164
60
|
const rowIdentity = { ...(cycleSeq !== undefined ? { cycleSeq } : {}), ...(startedAt !== undefined ? { startedAt } : {}) };
|
|
165
61
|
const prevIdentity = prev !== undefined
|
|
166
62
|
? { ...(prev.cycleSeq !== undefined ? { cycleSeq: prev.cycleSeq } : {}), ...(prev.startedAt !== undefined ? { startedAt: prev.startedAt } : {}) }
|
|
167
63
|
: undefined;
|
|
168
64
|
if (prev !== undefined && isStaleEngineAgentPanelEnd(rowIdentity, prevIdentity))
|
|
169
65
|
continue;
|
|
170
|
-
/** 这一帧的周期身份**可证明**比台账上的新(同一条规则反向)。 */
|
|
171
66
|
const rowNewerCycle = prev !== undefined && isStaleEngineAgentPanelEnd(prevIdentity, rowIdentity);
|
|
172
|
-
// 🔴 粘性只在**同一周期**内成立:上一条已 settle(同 id 复活 = 新周期)或 launch 锚换了 ⇒ 不继承上一周期的用量
|
|
173
|
-
// (否则新周期首帧没报 tokens 时会把上一周期的数当成当前读数发布;异源对抗复审)。
|
|
174
67
|
const sameCycle = prev !== undefined &&
|
|
175
68
|
!prev.settled &&
|
|
176
69
|
(startedAt === undefined || prev.startedAt === undefined || prev.startedAt === startedAt) &&
|
|
177
|
-
// 0.74.0:代际号变了同样是新周期(两条都报了才比;任一条没报 = 这一帧没说)
|
|
178
70
|
(cycleSeq === undefined || prev.cycleSeq === undefined || prev.cycleSeq === cycleSeq);
|
|
179
71
|
const knownTokens = tokens !== undefined ? tokens : sameCycle ? prev?.tokens : undefined;
|
|
180
|
-
// 本周期已知的 launch 锚:帧上给了用帧上的,没给则同周期沿用。🔴 它随**每一条** fleet-row 发布(不只是变化那一帧)——
|
|
181
|
-
// 事件缓冲靠它判「这两条部分帧是不是同一周期」;缺锚的部分帧会让跨周期合并绕过屏障(异源对抗复审 [high])。
|
|
182
|
-
// 🔴 身份的沿用与用量的沿用是两回事(异源对抗复审 R3):用量只在**活着的同周期**内粘(`sameCycle` 要求
|
|
183
|
-
// !prev.settled);身份只要这一帧**不可证更新**就沿用 —— 同周期重复的终态帧若把记住的 startedAt / cycleSeq
|
|
184
|
-
// 抹掉,下一代只带另一半身份时就判不出「更新」,被 settled 吞掉。
|
|
185
72
|
const carryIdentity = prev !== undefined && !rowNewerCycle;
|
|
186
73
|
const knownStartedAt = startedAt !== undefined ? startedAt : carryIdentity ? prev.startedAt : undefined;
|
|
187
74
|
const knownCycleSeq = cycleSeq !== undefined ? cycleSeq : carryIdentity ? prev.cycleSeq : undefined;
|
|
188
75
|
if (TERMINAL_FLEET_TASK_STATUSES.has(status)) {
|
|
189
|
-
// ② 终态一次性 settle(幂等台账;消费端 settle 也幂等)。0.74.0:去重按**周期** —— 已 settle 的是上一代、这一帧是
|
|
190
|
-
// 更新的一代(中间没见到 running 帧)⇒ 新周期的终态照发,不被上一代的 settled 吞掉。
|
|
191
|
-
// 🔴 0.74.5 CC-86(cli L-415):**首次见到就已终态**的行(prev 缺席)零事件 —— 只在台账记 settled。此前先发 fleet-row
|
|
192
|
-
// (交最终用量)再发 end ⇒ 宿主为本会话从没跑过的任务建行随即 settle = 面板幽灵完成行(reattach / resume 后引擎
|
|
193
|
-
// fleet 列表里的历史终态行全部上屏)。本会话内起步又结束、面板从没见过 running 的后台任务由通知车道的 end 收尸;
|
|
194
|
-
// 复活(prev 已 settled 且这一帧周期更新)不在此列,照发。
|
|
195
|
-
// 0.75.0 W2:「首见」= 消费端没有这一行(没发布过 running **也没递达过 end**);通知 end 先到的短命子代 ⇒ 终态行照发(交最终用量,不再第二次 end)。
|
|
196
76
|
const newbornTerminal = prev === undefined && panelRowUnknownToConsumer(taskId);
|
|
197
77
|
const settledThisCycle = prev?.settled === true && !rowNewerCycle;
|
|
198
|
-
// 结过的行(本进程递达过 end)再来终态帧:同代或判不出代际 = 短命子代的最终用量到了 ⇒ 只发 fleet-row、不再第二次 end;
|
|
199
|
-
// 可证更新的一代 = 结过之后复活又结束 ⇒ 照发 fleet-row + end。
|
|
200
78
|
const endedRec = prev === undefined ? panelRowEndedIdentity(taskId) : undefined;
|
|
201
79
|
const frameCycle = { ...(cycleSeq !== undefined ? { cycleSeq } : {}), ...(startedAt !== undefined ? { startedAt } : {}) };
|
|
202
|
-
// 方向判(异源复审 R3 [high]:只判「不等」会把迟到的前代终态当成新一代 ⇒ 倒写用量 + 第二次 end):
|
|
203
|
-
// 帧可证比已结周期**旧** ⇒ 整帧丢(不进台账,不发);可证**新** ⇒ 复活又结束,fleet-row + end;同代 / 判不出 ⇒ 只补用量。
|
|
204
80
|
if (endedRec !== undefined && isStaleEngineAgentPanelEnd(frameCycle, endedRec))
|
|
205
81
|
continue;
|
|
206
82
|
const endedSameCycle = endedRec !== undefined && !isStaleEngineAgentPanelEnd(endedRec, frameCycle);
|
|
207
83
|
if (newbornTerminal) {
|
|
208
|
-
// 反序保护:end 也许下一拍才到 ⇒ 终态行(带用量)缓在历史叶里,end 到漏斗时先放它再放 end;真历史行永远等不到 end,缓着直到被挤掉。
|
|
209
84
|
holdNewbornTerminalRow(taskId, {
|
|
210
85
|
kind: 'fleet-row',
|
|
211
86
|
taskId,
|
|
@@ -220,13 +95,8 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
220
95
|
});
|
|
221
96
|
}
|
|
222
97
|
else if (!settledThisCycle) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
if (
|
|
226
|
-
// 0.74.0:周期身份本身推进(或首帧就带身份)也是变化 —— 消费端要先记下身份才能对 end 判陈旧。
|
|
227
|
-
rowNewerCycle ||
|
|
228
|
-
(cycleSeq !== undefined && prev?.cycleSeq !== cycleSeq) || // 含首帧(prev 缺席)就带身份的终态
|
|
229
|
-
// 最终用量也算(终态帧常是唯一带全 usage 的一帧;消费端不更新非 running 行 ⇒ 必须赶在 end 之前发)
|
|
98
|
+
if (rowNewerCycle ||
|
|
99
|
+
(cycleSeq !== undefined && prev?.cycleSeq !== cycleSeq) ||
|
|
230
100
|
(tokens !== undefined && prev?.tokens !== tokens) ||
|
|
231
101
|
(toolUses !== undefined && prev?.toolUses !== toolUses) ||
|
|
232
102
|
(transcriptId !== undefined && prev?.transcriptId !== transcriptId) ||
|
|
@@ -249,11 +119,7 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
249
119
|
publishEngineAgentPanelEvent({
|
|
250
120
|
kind: 'end',
|
|
251
121
|
taskId,
|
|
252
|
-
// L-215② 族扫(0.65.0):与 `notifications.enqueueBgChildNotification` 的 `isError` 位
|
|
253
|
-
// **同一个病形**(内联两词 ⇒ core [6908] 的 `blocked` 漏成「成功」)。两处一次改齐,
|
|
254
|
-
// 读同一个单铸谓词;只修当格 = 下一次加词又漏一处。
|
|
255
122
|
isError: isTerminalNotSuccess(status),
|
|
256
|
-
// 0.74.0:这条终态属于哪个周期(在场才带)—— 消费端据此挡掉上一周期迟到的 end。
|
|
257
123
|
...(knownCycleSeq !== undefined ? { cycleSeq: knownCycleSeq } : {}),
|
|
258
124
|
...(knownStartedAt !== undefined ? { startedAt: knownStartedAt } : {}),
|
|
259
125
|
});
|
|
@@ -269,36 +135,18 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
269
135
|
currentToolKey: currentToolKey !== undefined ? currentToolKey : prev?.currentToolKey,
|
|
270
136
|
lastSeenAt: nowMs,
|
|
271
137
|
settled: true,
|
|
272
|
-
// notif-F13:settle 时刻只在**首次** settle 时铸(重复投影的终态行不许一路续命回收期)。
|
|
273
138
|
settledAtMs: prev?.settled ? prev.settledAtMs : nowMs,
|
|
274
139
|
absentReportedAtMs: undefined,
|
|
275
140
|
});
|
|
276
141
|
continue;
|
|
277
142
|
}
|
|
278
|
-
// 🔴 0.75.1:缓着一条「首见即终态」的行时,后到的 running 帧有**三向**(0.75.0 是无条件作废 ⇒ 同代陈旧快照
|
|
279
|
-
// 把终态那条的最终用量顶掉,面板最后显示的是快照里的小数字):
|
|
280
|
-
// · **可证同代**(两侧有可比的同一种周期键且相等)= 陈旧快照 —— 与终态分支 `settledThisCycle` 同律:
|
|
281
|
-
// 整帧不落地(零事件、台账保持 settled),缓行留着等 end;
|
|
282
|
-
// · **可证更新** ⇒ 真复活:照发 running 行,缓着的前代终态行作废(下面那句 drop);
|
|
283
|
-
// · **判不出**(任一侧没有可比的周期键)⇒ 维持 0.75.0 的行为(当复活、作废缓行)—— 缺席不制造周期,
|
|
284
|
-
// 这一向是**已知并接受**的限制(接入文档的缺口行有记)。
|
|
285
|
-
// 「可证更旧」不在这三向里:它在本循环开头就被 `isStaleEngineAgentPanelEnd(rowIdentity, prevIdentity)` 整只跳过了。
|
|
286
|
-
// 可比性只由**帧自带的**两键与台账里记着的两键决定(不能用 `knownCycleSeq` / `knownStartedAt` —— 那两位会把
|
|
287
|
-
// 缺席沿用成「与台账相等」,把「判不出」误判成「可证同代」)。判据与 `isNewEngineAgentPanelCycle` 的前件同形。
|
|
288
143
|
const cycleComparable = (cycleSeq !== undefined && prev?.cycleSeq !== undefined) || (startedAt !== undefined && prev?.startedAt !== undefined);
|
|
289
|
-
// 🔴 再加一道 `prev.settled` 的窄化:缓行只由**终态**分支铸(铸完台账即 settled),所以「缓着行而台账说它在跑」
|
|
290
|
-
// 在本会话的台账里不可达;写出来是为了让这一格永远只对**结过的行**生效 —— 缓行表是进程级、seenMap 是按
|
|
291
|
-
// sessionKey 分桶的两个作用域,不写这一句的话,别的会话缓的行会让本会话一条真在跑的行被判成陈旧快照。
|
|
292
144
|
const staleSnapshotOverHeldRow = prev !== undefined && prev.settled === true && cycleComparable && !rowNewerCycle && peekHeldNewbornTerminalRow(taskId) !== undefined;
|
|
293
145
|
if (staleSnapshotOverHeldRow)
|
|
294
146
|
continue;
|
|
295
|
-
// ① 只发变化(新行 / status 翻 / token 涨 / 累计工具数涨 / 转录锚首次到)。
|
|
296
|
-
// 🔴 后两项的比较是**单向**的:只有「这一帧真给了值且与台账不同」才算变化。帧上**缺席**
|
|
297
|
-
// 不算变化(缺席=引擎这帧没说,不是「回到不知道」)——否则新旧引擎混发时台账会在
|
|
298
|
-
// 值↔undefined 之间来回抖,每秒白发两次事件。
|
|
299
147
|
if (!prev ||
|
|
300
148
|
prev.settled ||
|
|
301
|
-
prev.absentReportedAtMs !== undefined ||
|
|
149
|
+
prev.absentReportedAtMs !== undefined ||
|
|
302
150
|
prev.status !== status ||
|
|
303
151
|
prev.tokens !== knownTokens ||
|
|
304
152
|
(toolUses !== undefined && prev.toolUses !== toolUses) ||
|
|
@@ -307,15 +155,14 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
307
155
|
(startedAt !== undefined && prev.startedAt !== startedAt) ||
|
|
308
156
|
(cycleSeq !== undefined && prev.cycleSeq !== cycleSeq) ||
|
|
309
157
|
(currentToolKey !== undefined && prev.currentToolKey !== currentToolKey)) {
|
|
310
|
-
notePanelRowRunning(taskId);
|
|
311
|
-
dropHeldNewbornTerminalRow(taskId);
|
|
158
|
+
notePanelRowRunning(taskId);
|
|
159
|
+
dropHeldNewbornTerminalRow(taskId);
|
|
312
160
|
publishEngineAgentPanelEvent({
|
|
313
161
|
kind: 'fleet-row',
|
|
314
162
|
taskId,
|
|
315
163
|
...(row.name ? { name: row.name } : {}),
|
|
316
164
|
...(row.description ? { description: row.description } : {}),
|
|
317
165
|
...(knownTokens !== undefined ? { totalTokens: knownTokens } : {}),
|
|
318
|
-
// 🔴 缺席即不落键(消费端据「键在不在」判三态)。
|
|
319
166
|
...(toolUses !== undefined ? { toolUses } : {}),
|
|
320
167
|
...(transcriptId !== undefined ? { transcriptId } : {}),
|
|
321
168
|
...(parentToolCallId !== undefined ? { parentToolCallId } : {}),
|
|
@@ -324,7 +171,6 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
324
171
|
...(currentTool !== undefined ? { currentTool } : {}),
|
|
325
172
|
});
|
|
326
173
|
}
|
|
327
|
-
// 台账对这几位是**粘性**的:缺席帧不擦掉已知值(同上的单向语义)。
|
|
328
174
|
seenMap.set(taskId, {
|
|
329
175
|
status,
|
|
330
176
|
tokens: knownTokens,
|
|
@@ -336,30 +182,19 @@ export function projectFleetAgentRowsFor(sessionKey, rows, nowMs = Date.now()) {
|
|
|
336
182
|
currentToolKey: currentToolKey !== undefined ? currentToolKey : prev?.currentToolKey,
|
|
337
183
|
lastSeenAt: nowMs,
|
|
338
184
|
settled: false,
|
|
339
|
-
settledAtMs: undefined,
|
|
340
|
-
absentReportedAtMs: undefined,
|
|
185
|
+
settledAtMs: undefined,
|
|
186
|
+
absentReportedAtMs: undefined,
|
|
341
187
|
});
|
|
342
188
|
}
|
|
343
|
-
// ③ 缺席上报 —— 必须在【本次在场行全部刷完 lastSeen 之后】判,否则 footer 长时间卸载后重挂
|
|
344
|
-
// 会把仍在跑的行按「陈旧」误报。🔴 0.72.12 CC-50:这里只发 `absent`,**不** settle、不铸 end ——
|
|
345
|
-
// 缺席不是终局,本包不替引擎下这个断言;真终态帧迟到照走 ② 发那唯一一次 end(去重记号不被缺席占用)。
|
|
346
189
|
for (const [taskId, s] of seenMap) {
|
|
347
190
|
if (present.has(taskId) || s.settled || s.absentReportedAtMs !== undefined)
|
|
348
191
|
continue;
|
|
349
192
|
const absentForMs = nowMs - s.lastSeenAt;
|
|
350
193
|
if (absentForMs <= ABSENT_SETTLE_MS)
|
|
351
194
|
continue;
|
|
352
|
-
// 🔴 0.72.13:走**独立缺席口**,不上主通道(老消费者的裸 else = sweep 体,会把新 kind 当 sweep;见 store 头注 / DS-07)。
|
|
353
195
|
publishEngineAgentPanelAbsence({ taskId, lastSeenAtMs: s.lastSeenAt, absentForMs });
|
|
354
196
|
seenMap.set(taskId, { ...s, absentReportedAtMs: nowMs });
|
|
355
197
|
}
|
|
356
|
-
// ④ REF-CC-045(fleet2-07):settled 条目回收 —— 给台账一个上界(此前只增不减)。settle 已发过
|
|
357
|
-
// 事件,delete 对外无事件,消费端 settle 本身幂等。
|
|
358
|
-
// [2393] notif-F13/sweep-F7 两处纠(判据见 SETTLED_RETENTION_MS 头注):
|
|
359
|
-
// · 锚 `settledAtMs`(settle 那一刻)而不是 `lastSeenAt`(最后一次被投影);
|
|
360
|
-
// · 只回收**已不在场**的条目 —— 仍在场的终态行删了会每拍重发 end。
|
|
361
|
-
// 0.72.12:已上报 absent 且始终不再在场的条目同样有上界 —— 锚 `absentReportedAtMs`(上报那一刻),
|
|
362
|
-
// 回收后迟到的终态帧仍会发恰一次 end(prev 缺席 ⇒ 首次 settle),行回来则按新行重建。
|
|
363
198
|
for (const [taskId, s] of seenMap) {
|
|
364
199
|
if (present.has(taskId))
|
|
365
200
|
continue;
|
package/dist/fleetTaskDesc.d.ts
CHANGED
|
@@ -1,43 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ⇄ B1 批搬迁(2026-07-27,多端改造设计稿 §2.4.1-B):cli src/sema/fleetTaskDesc.ts 逐字搬入(零依赖;壳侧改 re-export)。
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* src/sema/fleetTaskDesc.ts — footer fleet 行「label/描述列」纯投影助手(零依赖,从 fleetClient.ts 提出
|
|
6
|
-
* 供单测直取——fleetClient 拖 SDK/appState/notification 重图,无法轻量 bundle;行为与提出前逐字同源)。
|
|
7
|
-
*/
|
|
8
1
|
export declare function escapeDisplayControlChars(s: string): string;
|
|
9
|
-
/**
|
|
10
|
-
* UNTRUSTED-for-display 呈前处理的**共用铸点**:**先转义、后按转义结果封长**。
|
|
11
|
-
*
|
|
12
|
-
* 🔴 顺序反过来会让承诺的显示预算失守 —— {@link escapeDisplayControlChars} 把每个不可见字符
|
|
13
|
-
* 改写成 6 字符的 `\uXXXX`,先按原文截长再转义,会把一段纯控制字符的 `max` 个原始字符送成
|
|
14
|
-
* `6 × max` 个显示字符。屏上的列宽预算是按**显示字符**给的,所以封长必须量转义后的那一份。
|
|
15
|
-
* 🔴 相反方向的顾虑(「先转义后截会把一枚转义序列拦腰截断」)由下面两条避让解掉,不构成
|
|
16
|
-
* 改回先截后转义的理由:
|
|
17
|
-
* · 截点落在一枚 `\uXXXX` token 中间 ⇒ 回退到该 token 之前(留半截 `\u00` 比整枚不渲更坏,
|
|
18
|
-
* 它看起来像一个完整答案的开头);
|
|
19
|
-
* · 截点落在一对合法代理对(如 emoji)中间 ⇒ 回退一位。`DISPLAY_UNSAFE` 只转义**孤**代理项,
|
|
20
|
-
* 合法对被放行原样透传,在这里截断等于人为造一枚裸高位代理项留在末尾。
|
|
21
|
-
*
|
|
22
|
-
* 语义:返回值恒是**已消毒**的串,长度 ≤ `max`(可能因避让短于 `max`)。`max <= 0` ⇒ 空串。
|
|
23
|
-
*
|
|
24
|
-
* ⇄ 本函数是本包该族的**唯一**实现(0.62.0 起):operator 面的 READ 档位读器、写保护姿态行、
|
|
25
|
-
* SQL 姿态行四处此前各写一份,其中三份是先截后转义 —— 同形存量清剿后一律接这一只。
|
|
26
|
-
*/
|
|
27
2
|
export declare function capForDisplay(raw: string, max: number): string;
|
|
28
|
-
/** collapse a wire label to a single trimmed line (drops embedded newlines/runs). 187 row labels are always
|
|
29
|
-
* one short line; the <FleetTree/> column (Math.min(28,…) + wrap="truncate") does the visible ellipsis, so we
|
|
30
|
-
* only normalize here — no double-ellipsis, faithful to the 187 render.
|
|
31
|
-
* #307:折叠之后再过 {@link escapeDisplayControlChars} —— `\s+` 折叠管不到 C0 非空白段/C1(NEL)/
|
|
32
|
-
* 双向控制符/孤代理项,那四族原样透到终端就是「一行」这个结构账被绕过。空/非空判定不变
|
|
33
|
-
* (可见转义不产生空白,`|| fallback` 那些调用点的真假面照旧)。 */
|
|
34
3
|
export declare function collapseLabel(s: string): string;
|
|
35
|
-
/** CC row-body fallback(CC 真身锚 2026-07-20 人类剧本帧:`◯ general-purpose t1calc`——row body 从第一帧
|
|
36
|
-
* 起就是 Agent 工具的 description)。引擎子行帧不带 `description` 字段,任务描述只在 `name` 里,且有两形
|
|
37
|
-
* (07-24 D2 wire 实证,engine 1.271.0 帧 dump):
|
|
38
|
-
* ① 出生帧:name = `${agentType}: ${description}` 合成形(如 "fork: t1calc")→ 剥前缀复原;
|
|
39
|
-
* ② 后续帧:引擎把 name 重写为【裸任务描述】(如 "t1calc",无前缀)→ 直接按描述投影——
|
|
40
|
-
* 修前只认①,②一到描述列即塌空(footer 只剩 `◯ fork`,D2 症状)。
|
|
41
|
-
* 防重复列 belt:裸 name 恰为 identity 回声(=agentType 或 =agentName)时不当描述(label 列已渲它)。
|
|
42
|
-
* 纯投影非双源;真进度(last tool name)到帧后仍然优先(调用侧 projectDescription 先行)。 */
|
|
43
4
|
export declare function taskDescFromName(name: string | undefined, agentType: string | undefined, agentName?: string): string;
|