@adhdev/daemon-core 0.9.82-rc.34 → 0.9.82-rc.341
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/dist/boot/daemon-lifecycle.d.ts +8 -0
- package/dist/boot/process-hardening.d.ts +50 -0
- package/dist/build-info.d.ts +37 -0
- package/dist/chat/source-machine.d.ts +166 -0
- package/dist/chat/source-resolver.d.ts +104 -0
- package/dist/chat/subscription-updates.d.ts +1 -0
- package/dist/cli-adapter-types.d.ts +46 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +198 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +116 -64
- package/dist/cli-adapters/provider-cli-parse.d.ts +4 -0
- package/dist/cli-adapters/provider-cli-runtime.d.ts +34 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +53 -0
- package/dist/cli-adapters/raw-terminal-io.d.ts +37 -0
- package/dist/cli-adapters/resolve-executable.d.ts +14 -0
- package/dist/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +6 -3
- package/dist/cli-adapters/terminal-backends/types.d.ts +10 -2
- package/dist/cli-adapters/terminal-screen.d.ts +4 -11
- package/dist/commands/cli-manager.d.ts +2 -1
- package/dist/commands/handler.d.ts +110 -0
- package/dist/commands/mesh-coordinator.d.ts +85 -1
- package/dist/commands/router.d.ts +308 -1
- package/dist/commands/upgrade-helper.d.ts +12 -0
- package/dist/config/chat-history.d.ts +9 -0
- package/dist/config/config.d.ts +5 -0
- package/dist/config/mesh-config.d.ts +77 -1
- package/dist/detection/ide-detector.d.ts +13 -0
- package/dist/detection/win32-ide-version.d.ts +37 -0
- package/dist/git/change-impact-config.d.ts +159 -0
- package/dist/git/git-commands.d.ts +11 -1
- package/dist/git/git-diff.d.ts +6 -0
- package/dist/git/git-executor.d.ts +11 -0
- package/dist/git/git-status.d.ts +23 -0
- package/dist/git/git-types.d.ts +2 -50
- package/dist/git/index.d.ts +2 -0
- package/dist/index.d.ts +52 -13
- package/dist/index.js +42012 -17098
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +41683 -16890
- package/dist/index.mjs.map +1 -1
- package/dist/installer.d.ts +1 -4
- package/dist/ipc/local-ipc-server.d.ts +91 -0
- package/dist/launch.d.ts +1 -1
- package/dist/logging/async-batch-writer.d.ts +10 -0
- package/dist/logging/log-redactor.d.ts +24 -0
- package/dist/logging/log-tail-reader.d.ts +46 -0
- package/dist/mesh/contracts.d.ts +164 -0
- package/dist/mesh/coordinator-prompt.d.ts +36 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +174 -0
- package/dist/mesh/mesh-delivery-policy.d.ts +131 -0
- package/dist/mesh/mesh-events-coordinator.d.ts +169 -0
- package/dist/mesh/mesh-events-pending.d.ts +45 -0
- package/dist/mesh/mesh-events-stale.d.ts +40 -0
- package/dist/mesh/mesh-events-utils.d.ts +66 -0
- package/dist/mesh/mesh-events.d.ts +6 -49
- package/dist/mesh/mesh-fast-forward.d.ts +81 -0
- package/dist/mesh/mesh-host-ownership.d.ts +9 -0
- package/dist/mesh/mesh-init.d.ts +86 -0
- package/dist/mesh/mesh-ledger-reconciliation.d.ts +23 -3
- package/dist/mesh/mesh-ledger.d.ts +77 -1
- package/dist/mesh/mesh-missions.d.ts +116 -0
- package/dist/mesh/mesh-reconcile-loop.d.ts +7 -0
- package/dist/mesh/mesh-refine-batch.d.ts +68 -0
- package/dist/mesh/mesh-refine-status.d.ts +62 -0
- package/dist/mesh/mesh-review-inbox.d.ts +90 -0
- package/dist/mesh/mesh-routing.d.ts +70 -0
- package/dist/mesh/mesh-runtime-store.d.ts +418 -0
- package/dist/mesh/mesh-task-stats.d.ts +49 -0
- package/dist/mesh/mesh-unresolved-forward-outbox.d.ts +30 -0
- package/dist/mesh/mesh-work-queue.d.ts +208 -5
- package/dist/mesh/preview-freshness.d.ts +18 -0
- package/dist/mesh/refine-config.d.ts +216 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +135 -0
- package/dist/providers/acp-provider-instance.d.ts +2 -0
- package/dist/providers/approval-utils.d.ts +13 -0
- package/dist/providers/chat-message-normalization.d.ts +12 -0
- package/dist/providers/cli-provider-instance.d.ts +76 -3
- package/dist/providers/contracts.d.ts +139 -6
- package/dist/providers/external-sources.d.ts +71 -0
- package/dist/providers/native-history/antigravity-cli-transcript.d.ts +100 -0
- package/dist/providers/native-history/claude-cli-transcript.d.ts +70 -0
- package/dist/providers/native-history/codex-cli-transcript.d.ts +73 -0
- package/dist/providers/native-history/dispatcher.d.ts +27 -0
- package/dist/providers/native-history/hermes-cli-transcript.d.ts +30 -0
- package/dist/providers/native-history/index.d.ts +13 -0
- package/dist/providers/provider-instance-manager.d.ts +13 -0
- package/dist/providers/provider-instance.d.ts +13 -1
- package/dist/providers/provider-loader.d.ts +26 -4
- package/dist/providers/provider-trust.d.ts +31 -0
- package/dist/providers/read-chat-contract.d.ts +29 -0
- package/dist/providers/sdk/v1/builders/acp/detect-status.d.ts +68 -0
- package/dist/providers/sdk/v1/builders/cli/detect-status.d.ts +85 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval-squash.d.ts +59 -0
- package/dist/providers/sdk/v1/builders/cli/parse-approval.d.ts +65 -0
- package/dist/providers/sdk/v1/builders/cli/parse-session.d.ts +91 -0
- package/dist/providers/sdk/v1/builders/cli/visible-region.d.ts +42 -0
- package/dist/providers/sdk/v1/fixture-tooling/format.d.ts +126 -0
- package/dist/providers/sdk/v1/fixture-tooling/index.d.ts +8 -0
- package/dist/providers/sdk/v1/fixture-tooling/replay.d.ts +38 -0
- package/dist/providers/sdk/v1/index.d.ts +30 -0
- package/dist/providers/sdk/v1/sandbox/README-design.d.ts +193 -0
- package/dist/providers/sdk/v1/sandbox/require-whitelist.d.ts +74 -0
- package/dist/providers/sdk/v1/sandbox/script-runner.d.ts +98 -0
- package/dist/providers/sdk/v1/types/cli/index.d.ts +277 -0
- package/dist/providers/sdk/v1/types/common/index.d.ts +203 -0
- package/dist/providers/sdk/v1/validators/index.d.ts +5 -0
- package/dist/providers/sdk/v1/validators/manifest.d.ts +40 -0
- package/dist/providers/sdk/v1/validators/taint.d.ts +52 -0
- package/dist/providers/spec/adapter.d.ts +69 -0
- package/dist/providers/spec/cli-adapter.d.ts +217 -0
- package/dist/providers/spec/evaluator.d.ts +23 -0
- package/dist/providers/spec/fsm-driver.d.ts +306 -0
- package/dist/providers/spec/fsm-evaluator.d.ts +72 -0
- package/dist/providers/spec/fsm-loader.d.ts +14 -0
- package/dist/providers/spec/fsm-types.d.ts +144 -0
- package/dist/providers/spec/native-history-executor.d.ts +41 -0
- package/dist/providers/spec/pre-launch-trust.d.ts +16 -0
- package/dist/providers/spec/route.d.ts +4 -0
- package/dist/providers/spec/types.d.ts +180 -0
- package/dist/providers/status-monitor.d.ts +7 -7
- package/dist/providers/transcript-v2.d.ts +176 -0
- package/dist/providers/types/interactive-prompt.d.ts +84 -0
- package/dist/providers/working-dir.d.ts +17 -0
- package/dist/repo-mesh-types.d.ts +295 -13
- package/dist/sessions/registry.d.ts +6 -0
- package/dist/shared-types-extra.d.ts +2 -4
- package/dist/shared-types.d.ts +59 -2
- package/dist/status/normalize.d.ts +1 -1
- package/dist/status/normalize.js +1 -0
- package/dist/status/normalize.js.map +1 -1
- package/dist/status/normalize.mjs +1 -0
- package/dist/status/normalize.mjs.map +1 -1
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +26 -0
- package/dist/system/load-better-sqlite3.d.ts +21 -0
- package/dist/types.d.ts +5 -0
- package/package.json +7 -3
- package/src/agent-stream/poller.ts +2 -3
- package/src/agent-stream/provider-adapter.ts +1 -1
- package/src/boot/daemon-lifecycle.ts +55 -12
- package/src/boot/process-hardening.ts +89 -0
- package/src/build-info.ts +73 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +20 -1
- package/src/cli-adapter-types.d.ts +1 -0
- package/src/cli-adapter-types.ts +47 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1215 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +774 -1141
- package/src/cli-adapters/provider-cli-parse.d.ts +1 -0
- package/src/cli-adapters/provider-cli-parse.ts +13 -0
- package/src/cli-adapters/provider-cli-runtime.ts +56 -7
- package/src/cli-adapters/provider-cli-shared.d.ts +4 -0
- package/src/cli-adapters/provider-cli-shared.ts +100 -11
- package/src/cli-adapters/pty-transport.ts +2 -1
- package/src/cli-adapters/raw-terminal-io.ts +252 -0
- package/src/cli-adapters/resolve-executable.ts +90 -0
- package/src/cli-adapters/session-host-transport.ts +2 -1
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +53 -29
- package/src/cli-adapters/terminal-backends/types.ts +10 -3
- package/src/cli-adapters/terminal-screen.ts +16 -81
- package/src/commands/chat-commands.ts +1823 -62
- package/src/commands/cli-manager.ts +286 -14
- package/src/commands/handler.ts +809 -2
- package/src/commands/mesh-coordinator.ts +332 -122
- package/src/commands/router.ts +7433 -1317
- package/src/commands/stream-commands.ts +8 -0
- package/src/commands/upgrade-helper.ts +81 -30
- package/src/config/chat-history.ts +483 -24
- package/src/config/config.ts +12 -0
- package/src/config/mesh-config.ts +388 -6
- package/src/config/recent-activity.ts +8 -2
- package/src/daemon/dev-auto-implement.ts +3 -2
- package/src/daemon/dev-cli-debug.ts +10 -1
- package/src/detection/cli-detector.ts +28 -9
- package/src/detection/ide-detector.ts +55 -16
- package/src/detection/win32-ide-version.ts +106 -0
- package/src/git/change-impact-config.ts +354 -0
- package/src/git/git-commands.ts +55 -14
- package/src/git/git-diff.ts +53 -0
- package/src/git/git-executor.ts +12 -0
- package/src/git/git-status.ts +574 -43
- package/src/git/git-types.ts +14 -62
- package/src/git/git-worktree.ts +8 -1
- package/src/git/index.ts +16 -0
- package/src/index.ts +146 -12
- package/src/installer.d.ts +1 -1
- package/src/installer.ts +8 -6
- package/src/ipc/local-ipc-server.ts +278 -0
- package/src/launch.d.ts +1 -1
- package/src/launch.ts +37 -28
- package/src/logging/async-batch-writer.ts +55 -0
- package/src/logging/log-redactor.ts +100 -0
- package/src/logging/log-tail-reader.ts +220 -0
- package/src/logging/logger.ts +2 -1
- package/src/mesh/contracts.ts +329 -0
- package/src/mesh/coordinator-prompt.ts +234 -31
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +623 -0
- package/src/mesh/mesh-delivery-policy.ts +315 -0
- package/src/mesh/mesh-events-coordinator.ts +2144 -0
- package/src/mesh/mesh-events-pending.ts +508 -0
- package/src/mesh/mesh-events-stale.ts +290 -0
- package/src/mesh/mesh-events-utils.ts +300 -0
- package/src/mesh/mesh-events.ts +30 -1035
- package/src/mesh/mesh-fast-forward.ts +839 -0
- package/src/mesh/mesh-host-ownership.ts +73 -0
- package/src/mesh/mesh-init.ts +260 -0
- package/src/mesh/mesh-ledger-reconciliation.ts +12 -5
- package/src/mesh/mesh-ledger.ts +589 -102
- package/src/mesh/mesh-missions.ts +248 -0
- package/src/mesh/mesh-reconcile-loop.ts +822 -0
- package/src/mesh/mesh-refine-batch.ts +197 -0
- package/src/mesh/mesh-refine-status.ts +231 -0
- package/src/mesh/mesh-review-inbox.ts +307 -0
- package/src/mesh/mesh-routing.ts +291 -0
- package/src/mesh/mesh-runtime-store.ts +1626 -0
- package/src/mesh/mesh-task-stats.ts +154 -0
- package/src/mesh/mesh-unresolved-forward-outbox.ts +185 -0
- package/src/mesh/mesh-work-queue.ts +888 -141
- package/src/mesh/preview-freshness.ts +118 -0
- package/src/mesh/refine-config.ts +423 -0
- package/src/mesh/worktree-bootstrap-config.ts +331 -0
- package/src/providers/acp-provider-instance.ts +25 -9
- package/src/providers/approval-utils.d.ts +4 -0
- package/src/providers/approval-utils.ts +47 -5
- package/src/providers/chat-message-normalization.ts +45 -5
- package/src/providers/cli-provider-instance.ts +1038 -99
- package/src/providers/contracts.d.ts +55 -0
- package/src/providers/contracts.ts +150 -6
- package/src/providers/extension-provider-instance.ts +12 -7
- package/src/providers/external-sources.ts +218 -0
- package/src/providers/ide-provider-instance.ts +35 -12
- package/src/providers/native-history/antigravity-cli-transcript.ts +643 -0
- package/src/providers/native-history/claude-cli-transcript.ts +396 -0
- package/src/providers/native-history/codex-cli-transcript.ts +479 -0
- package/src/providers/native-history/dispatcher.ts +340 -0
- package/src/providers/native-history/hermes-cli-transcript.ts +230 -0
- package/src/providers/native-history/index.ts +30 -0
- package/src/providers/provider-instance-manager.ts +30 -0
- package/src/providers/provider-instance.ts +10 -1
- package/src/providers/provider-loader.ts +670 -50
- package/src/providers/provider-schema.ts +87 -14
- package/src/providers/provider-trust.ts +114 -0
- package/src/providers/read-chat-contract.ts +76 -16
- package/src/providers/sdk/README.md +49 -0
- package/src/providers/sdk/v1/builders/acp/detect-status.ts +144 -0
- package/src/providers/sdk/v1/builders/cli/detect-status.ts +262 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval-squash.ts +158 -0
- package/src/providers/sdk/v1/builders/cli/parse-approval.ts +250 -0
- package/src/providers/sdk/v1/builders/cli/parse-session.ts +276 -0
- package/src/providers/sdk/v1/builders/cli/visible-region.ts +143 -0
- package/src/providers/sdk/v1/fixture-tooling/format.ts +130 -0
- package/src/providers/sdk/v1/fixture-tooling/index.ts +22 -0
- package/src/providers/sdk/v1/fixture-tooling/replay.ts +352 -0
- package/src/providers/sdk/v1/index.ts +152 -0
- package/src/providers/sdk/v1/sandbox/README-design.ts +195 -0
- package/src/providers/sdk/v1/sandbox/require-whitelist.ts +472 -0
- package/src/providers/sdk/v1/sandbox/script-runner.ts +150 -0
- package/src/providers/sdk/v1/schemas/cli/provider.schema.json +504 -0
- package/src/providers/sdk/v1/schemas/primitives/acp-session-protocol-v1.json +131 -0
- package/src/providers/sdk/v1/schemas/primitives/native-history-codex-rollout-v1.json +66 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-approval-squash-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-assistant-block-v1.json +91 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-cue-ordering-v1.json +47 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-dispatch-order-v1.json +32 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-footer-chrome-v1.json +42 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-index-finder-v1.json +27 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-modal-v1.json +125 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-prompt-marker-v1.json +45 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-session-id-extraction-v1.json +46 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-settled-prompt-v1.json +71 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-spinner-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-transcript-pty-v1.json +83 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-visible-region-v1.json +57 -0
- package/src/providers/sdk/v1/schemas/primitives/tui-welcome-screen-v1.json +35 -0
- package/src/providers/sdk/v1/types/cli/index.ts +365 -0
- package/src/providers/sdk/v1/types/common/index.ts +229 -0
- package/src/providers/sdk/v1/validators/index.ts +19 -0
- package/src/providers/sdk/v1/validators/manifest.ts +110 -0
- package/src/providers/sdk/v1/validators/taint.ts +309 -0
- package/src/providers/spec/adapter.ts +168 -0
- package/src/providers/spec/cli-adapter.ts +986 -0
- package/src/providers/spec/evaluator.ts +345 -0
- package/src/providers/spec/fsm-driver.ts +1015 -0
- package/src/providers/spec/fsm-evaluator.ts +255 -0
- package/src/providers/spec/fsm-loader.ts +120 -0
- package/src/providers/spec/fsm-types.ts +238 -0
- package/src/providers/spec/native-history-executor.ts +1136 -0
- package/src/providers/spec/pre-launch-trust.ts +104 -0
- package/src/providers/spec/route.ts +51 -0
- package/src/providers/spec/types.ts +226 -0
- package/src/providers/status-monitor.d.ts +7 -7
- package/src/providers/status-monitor.ts +37 -22
- package/src/providers/transcript-v2.ts +567 -0
- package/src/providers/types/interactive-prompt.ts +536 -0
- package/src/providers/version-archive.ts +64 -24
- package/src/providers/working-dir.ts +23 -0
- package/src/repo-mesh-types.ts +378 -14
- package/src/sessions/registry.ts +6 -0
- package/src/shared-types-extra.ts +2 -4
- package/src/shared-types.d.ts +8 -0
- package/src/shared-types.ts +64 -1
- package/src/status/builders.ts +26 -6
- package/src/status/normalize.ts +2 -0
- package/src/status/reporter.ts +19 -1
- package/src/status/snapshot.ts +95 -26
- package/src/system/host-memory.ts +29 -12
- package/src/system/load-better-sqlite3.ts +68 -0
- package/src/types.ts +5 -0
- package/dist/cli-adapters/terminal-backends/xterm-backend.d.ts +0 -17
- package/dist/mesh/mesh-sync.d.ts +0 -53
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.d.ts +0 -16
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +0 -97
- package/src/mesh/mesh-sync.ts +0 -111
|
@@ -18,13 +18,14 @@ import { loadConfig } from '../config/config.js';
|
|
|
18
18
|
import { loadState, saveState } from '../config/state-store.js';
|
|
19
19
|
import { getWorkspaceState, resolveLaunchDirectory } from '../config/workspaces.js';
|
|
20
20
|
import { appendRecentActivity } from '../config/recent-activity.js';
|
|
21
|
+
import { unregisterMeshCoordinator } from '../mesh/coordinator-registry.js';
|
|
21
22
|
import { upsertSavedProviderSession } from '../config/saved-sessions.js';
|
|
22
23
|
import { buildLegacyModelModeSummaryMetadata, normalizeProviderSummaryMetadata } from '../providers/summary-metadata.js';
|
|
23
24
|
import { CliProviderInstance } from '../providers/cli-provider-instance.js';
|
|
24
25
|
import { AcpProviderInstance } from '../providers/acp-provider-instance.js';
|
|
25
26
|
import type { ProviderInstanceManager } from '../providers/provider-instance-manager.js';
|
|
26
27
|
import { ProviderLoader } from '../providers/provider-loader.js';
|
|
27
|
-
import { normalizeInputEnvelope, type ProviderModule, type ProviderResumeCapability } from '../providers/contracts.js';
|
|
28
|
+
import { normalizeInputEnvelope, type MeshCoordinatorDelegatedWorkerIsolation, type ProviderModule, type ProviderResumeCapability } from '../providers/contracts.js';
|
|
28
29
|
import { assertProviderSupportsDeclaredInput, assertTextOnlyInput } from '../providers/provider-input-support.js';
|
|
29
30
|
import type { CliAdapter } from '../cli-adapter-types.js';
|
|
30
31
|
import type { PtyTransportFactory } from '../cli-adapters/pty-transport.js';
|
|
@@ -80,6 +81,114 @@ export interface CliManagerDeps {
|
|
|
80
81
|
|
|
81
82
|
type CommandResult = { success: boolean;[key: string]: unknown };
|
|
82
83
|
|
|
84
|
+
const BUSY_AGENT_STATUSES = new Set(['generating', 'running', 'streaming', 'starting', 'busy', 'waiting', 'waiting_approval', 'no_progress', 'long_generating']);
|
|
85
|
+
const ZERO_MESSAGE_STARTING_SEND_WAIT_MS = 2_000;
|
|
86
|
+
|
|
87
|
+
function normalizeAgentStatus(value: unknown): string {
|
|
88
|
+
return typeof value === 'string' ? value.trim().toLowerCase() : '';
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function hasNonEmptyModalButtons(activeModal: unknown): boolean {
|
|
92
|
+
const buttons = (activeModal as any)?.buttons;
|
|
93
|
+
return Array.isArray(buttons) && buttons.some((button) => String(button || '').trim().length > 0);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function hasAdapterPendingResponse(adapter: any): boolean {
|
|
97
|
+
if (adapter?.isWaitingForResponse === true) return true;
|
|
98
|
+
if (adapter?.currentTurnScope) return true;
|
|
99
|
+
try {
|
|
100
|
+
if (typeof adapter?.isProcessing === 'function' && adapter.isProcessing()) return true;
|
|
101
|
+
} catch { /* defensive: send guard should not fail on diagnostics */ }
|
|
102
|
+
try {
|
|
103
|
+
const partial = typeof adapter?.getPartialResponse === 'function' ? adapter.getPartialResponse() : '';
|
|
104
|
+
if (typeof partial === 'string' && partial.trim()) return true;
|
|
105
|
+
} catch { /* defensive: missing partial means no pending evidence */ }
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function countMessages(value: unknown): number {
|
|
110
|
+
return Array.isArray(value) ? value.length : 0;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function hasFinalAssistantMessage(value: unknown): boolean {
|
|
114
|
+
const messages = Array.isArray(value) ? value : [];
|
|
115
|
+
const last = messages[messages.length - 1] as any;
|
|
116
|
+
if (!last || last.role !== 'assistant') return false;
|
|
117
|
+
if (last.bubbleState === 'streaming') return false;
|
|
118
|
+
if (last.meta?.streaming === true) return false;
|
|
119
|
+
return typeof last.content === 'string' && last.content.trim().length > 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function hasZeroMessageStartingLaunch(adapter: any): boolean {
|
|
123
|
+
const adapterStatus = adapter?.getStatus?.({ allowParse: false }) ?? adapter?.getStatus?.() ?? {};
|
|
124
|
+
const parsedStatus = typeof adapter?.getScriptParsedStatus === 'function'
|
|
125
|
+
? adapter.getScriptParsedStatus()
|
|
126
|
+
: {};
|
|
127
|
+
const adapterRawStatus = normalizeAgentStatus(adapterStatus?.status);
|
|
128
|
+
const parsedRawStatus = normalizeAgentStatus(parsedStatus?.status);
|
|
129
|
+
if (adapterRawStatus !== 'starting') return false;
|
|
130
|
+
if (parsedRawStatus && parsedRawStatus !== 'starting' && parsedRawStatus !== 'generating') return false;
|
|
131
|
+
if (hasNonEmptyModalButtons(adapterStatus?.activeModal ?? adapterStatus?.modal ?? parsedStatus?.activeModal ?? parsedStatus?.modal)) return false;
|
|
132
|
+
if (countMessages(adapterStatus?.messages) > 0 || countMessages(parsedStatus?.messages) > 0) return false;
|
|
133
|
+
return !hasAdapterPendingResponse(adapter);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function hasCompletedStartingLaunch(adapter: any): boolean {
|
|
137
|
+
const adapterStatus = adapter?.getStatus?.({ allowParse: false }) ?? adapter?.getStatus?.() ?? {};
|
|
138
|
+
const adapterRawStatus = normalizeAgentStatus(adapterStatus?.status);
|
|
139
|
+
if (adapterRawStatus !== 'starting') return false;
|
|
140
|
+
if (hasAdapterPendingResponse(adapter)) return false;
|
|
141
|
+
|
|
142
|
+
const parsedStatus = typeof adapter?.getScriptParsedStatus === 'function'
|
|
143
|
+
? adapter.getScriptParsedStatus()
|
|
144
|
+
: {};
|
|
145
|
+
const parsedRawStatus = normalizeAgentStatus(parsedStatus?.status);
|
|
146
|
+
if (parsedRawStatus !== 'idle') return false;
|
|
147
|
+
if (hasNonEmptyModalButtons(adapterStatus?.activeModal ?? adapterStatus?.modal ?? parsedStatus?.activeModal ?? parsedStatus?.modal)) return false;
|
|
148
|
+
return hasFinalAssistantMessage(parsedStatus?.messages);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function shouldSuppressStaleParsedBusyStatus(adapterStatus: string, parsedStatus: any, adapter: any): boolean {
|
|
152
|
+
const parsedRawStatus = normalizeAgentStatus(parsedStatus?.status);
|
|
153
|
+
if (!BUSY_AGENT_STATUSES.has(parsedRawStatus)) return false;
|
|
154
|
+
if (adapterStatus !== 'idle') return false;
|
|
155
|
+
if (hasNonEmptyModalButtons(parsedStatus?.activeModal ?? parsedStatus?.modal)) return false;
|
|
156
|
+
return !hasAdapterPendingResponse(adapter);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function getEffectiveAgentSendStatus(adapter: any): string {
|
|
160
|
+
const adapterStatus = normalizeAgentStatus(adapter?.getStatus?.({ allowParse: false })?.status ?? adapter?.getStatus?.()?.status);
|
|
161
|
+
if (adapterStatus === 'starting' && hasCompletedStartingLaunch(adapter)) return 'idle';
|
|
162
|
+
if (adapterStatus && adapterStatus !== 'idle') return adapterStatus;
|
|
163
|
+
if (adapterStatus !== 'idle') return adapterStatus;
|
|
164
|
+
|
|
165
|
+
if (typeof adapter?.getScriptParsedStatus !== 'function') return adapterStatus;
|
|
166
|
+
try {
|
|
167
|
+
const parsedStatus = adapter.getScriptParsedStatus();
|
|
168
|
+
const parsedRawStatus = normalizeAgentStatus(parsedStatus?.status);
|
|
169
|
+
if (BUSY_AGENT_STATUSES.has(parsedRawStatus) && !shouldSuppressStaleParsedBusyStatus(adapterStatus, parsedStatus, adapter)) {
|
|
170
|
+
return parsedRawStatus;
|
|
171
|
+
}
|
|
172
|
+
} catch {
|
|
173
|
+
return adapterStatus;
|
|
174
|
+
}
|
|
175
|
+
return adapterStatus;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
async function waitForZeroMessageStartingLaunch(adapter: any): Promise<boolean> {
|
|
179
|
+
try {
|
|
180
|
+
if (!hasZeroMessageStartingLaunch(adapter)) return false;
|
|
181
|
+
} catch {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
await new Promise(resolve => setTimeout(resolve, ZERO_MESSAGE_STARTING_SEND_WAIT_MS));
|
|
185
|
+
try {
|
|
186
|
+
return hasZeroMessageStartingLaunch(adapter);
|
|
187
|
+
} catch {
|
|
188
|
+
return false;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
83
192
|
export interface CliTransportFactoryParams {
|
|
84
193
|
runtimeId: string;
|
|
85
194
|
providerType: string;
|
|
@@ -138,18 +247,19 @@ type CliStartOptions = {
|
|
|
138
247
|
extraEnv?: Record<string, string>;
|
|
139
248
|
};
|
|
140
249
|
|
|
141
|
-
const
|
|
142
|
-
ADHDEV_INLINE_MESH
|
|
143
|
-
ADHDEV_MCP_TRANSPORT
|
|
144
|
-
ADHDEV_MESH_ID
|
|
145
|
-
HERMES_EPHEMERAL_SYSTEM_PROMPT
|
|
146
|
-
|
|
250
|
+
const DEFAULT_COORDINATOR_DELEGATED_ENV_UNSETS = [
|
|
251
|
+
'ADHDEV_INLINE_MESH',
|
|
252
|
+
'ADHDEV_MCP_TRANSPORT',
|
|
253
|
+
'ADHDEV_MESH_ID',
|
|
254
|
+
'HERMES_EPHEMERAL_SYSTEM_PROMPT',
|
|
255
|
+
] as const;
|
|
147
256
|
|
|
148
257
|
export interface CoordinatorDelegatedCliLaunchOptionsInput {
|
|
149
258
|
cliType: string;
|
|
150
259
|
workspace: string;
|
|
151
260
|
cliArgs?: string[];
|
|
152
261
|
env?: Record<string, string>;
|
|
262
|
+
isolation?: MeshCoordinatorDelegatedWorkerIsolation;
|
|
153
263
|
}
|
|
154
264
|
|
|
155
265
|
export interface CoordinatorDelegatedCliLaunchOptions {
|
|
@@ -161,6 +271,21 @@ function hasCliArg(args: string[], flag: string): boolean {
|
|
|
161
271
|
return args.some((arg) => arg === flag || arg.startsWith(`${flag}=`));
|
|
162
272
|
}
|
|
163
273
|
|
|
274
|
+
function hasConfigOverride(args: string[], key: string): boolean {
|
|
275
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
276
|
+
const arg = args[index];
|
|
277
|
+
const next = args[index + 1];
|
|
278
|
+
if ((arg === '-c' || arg === '--config') && typeof next === 'string') {
|
|
279
|
+
if (next === key || next.startsWith(`${key}=`) || next.startsWith(`${key}.`)) return true;
|
|
280
|
+
}
|
|
281
|
+
if (arg.startsWith('--config=')) {
|
|
282
|
+
const value = arg.slice('--config='.length);
|
|
283
|
+
if (value === key || value.startsWith(`${key}=`) || value.startsWith(`${key}.`)) return true;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
|
|
164
289
|
function ensureEmptyDelegatedMcpConfig(workspace: string): string {
|
|
165
290
|
const baseDir = path.join(os.tmpdir(), 'adhdev-delegated-agent-empty-mcp');
|
|
166
291
|
mkdirSync(baseDir, { recursive: true });
|
|
@@ -173,12 +298,31 @@ function ensureEmptyDelegatedMcpConfig(workspace: string): string {
|
|
|
173
298
|
export function buildCoordinatorDelegatedCliLaunchOptions(
|
|
174
299
|
input: CoordinatorDelegatedCliLaunchOptionsInput,
|
|
175
300
|
): CoordinatorDelegatedCliLaunchOptions {
|
|
176
|
-
const cliType = String(input.cliType || '').trim();
|
|
177
301
|
const cliArgs = Array.isArray(input.cliArgs) ? [...input.cliArgs] : [];
|
|
178
|
-
const env: Record<string, string> = { ...(input.env || {})
|
|
302
|
+
const env: Record<string, string> = { ...(input.env || {}) };
|
|
303
|
+
const envUnsets = new Set<string>(DEFAULT_COORDINATOR_DELEGATED_ENV_UNSETS);
|
|
304
|
+
for (const key of input.isolation?.env?.unset || []) {
|
|
305
|
+
if (typeof key === 'string' && key.trim()) envUnsets.add(key.trim());
|
|
306
|
+
}
|
|
307
|
+
for (const key of envUnsets) env[key] = '';
|
|
179
308
|
|
|
180
|
-
|
|
181
|
-
|
|
309
|
+
for (const rule of input.isolation?.args || []) {
|
|
310
|
+
if (!rule || typeof rule !== 'object') continue;
|
|
311
|
+
if (rule.mode === 'empty_mcp_config') {
|
|
312
|
+
if (rule.flag && !hasCliArg(cliArgs, rule.flag)) {
|
|
313
|
+
cliArgs.unshift(rule.flag, ensureEmptyDelegatedMcpConfig(input.workspace));
|
|
314
|
+
}
|
|
315
|
+
if (rule.strictFlag && !hasCliArg(cliArgs, rule.strictFlag)) {
|
|
316
|
+
cliArgs.unshift(rule.strictFlag);
|
|
317
|
+
}
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
if (rule.mode === 'config_override') {
|
|
321
|
+
const key = String(rule.dedupeKey || rule.key || '').trim();
|
|
322
|
+
const flag = String(rule.flag || '').trim();
|
|
323
|
+
if (!key || !flag || hasConfigOverride(cliArgs, key)) continue;
|
|
324
|
+
cliArgs.unshift(flag, `${rule.key}=${rule.value}`);
|
|
325
|
+
}
|
|
182
326
|
}
|
|
183
327
|
|
|
184
328
|
return { cliArgs, env };
|
|
@@ -255,10 +399,14 @@ function detectExplicitProviderSessionId(
|
|
|
255
399
|
|
|
256
400
|
const subcommands = resume?.sessionIdFromSubcommand;
|
|
257
401
|
if (Array.isArray(subcommands) && subcommands.length > 0) {
|
|
402
|
+
const hasResumeSubcommand = args.some((arg) => subcommands.includes(arg));
|
|
258
403
|
const subcommandSessionId = readSubcommandSessionId(args, subcommands);
|
|
259
404
|
if (subcommandSessionId) {
|
|
260
405
|
return { providerSessionId: subcommandSessionId, launchMode: 'resume' };
|
|
261
406
|
}
|
|
407
|
+
if (hasResumeSubcommand) {
|
|
408
|
+
return { launchMode: 'resume' };
|
|
409
|
+
}
|
|
262
410
|
}
|
|
263
411
|
|
|
264
412
|
return { launchMode: 'manual' };
|
|
@@ -292,6 +440,12 @@ export function resolveCliSessionBinding(
|
|
|
292
440
|
launchMode: explicit.launchMode,
|
|
293
441
|
};
|
|
294
442
|
}
|
|
443
|
+
if (explicit.launchMode === 'resume') {
|
|
444
|
+
return {
|
|
445
|
+
cliArgs: baseArgs,
|
|
446
|
+
launchMode: 'resume',
|
|
447
|
+
};
|
|
448
|
+
}
|
|
295
449
|
if (explicit.launchMode === 'manual' && hasArg(baseArgs || [], ['--session-id'])) {
|
|
296
450
|
return {
|
|
297
451
|
cliArgs: baseArgs,
|
|
@@ -435,7 +589,9 @@ export class DaemonCliManager {
|
|
|
435
589
|
providerSessionId,
|
|
436
590
|
attachExisting,
|
|
437
591
|
);
|
|
438
|
-
|
|
592
|
+
const adapter = new ProviderCliAdapter(resolvedProvider as CliProviderModule, workingDir, cliArgs, extraEnv || {}, transportFactory);
|
|
593
|
+
if (providerSessionId) adapter.updateRuntimeMeta({ providerSessionId });
|
|
594
|
+
return adapter;
|
|
439
595
|
}
|
|
440
596
|
|
|
441
597
|
throw new Error(`No CLI provider found for '${cliType}'. Create a provider.js in providers/cli/${cliType}/`);
|
|
@@ -457,6 +613,7 @@ export class DaemonCliManager {
|
|
|
457
613
|
this.deps.removeAgentTracking(key);
|
|
458
614
|
sessionRegistry?.unregisterByInstanceKey(key);
|
|
459
615
|
instanceManager?.removeInstance(key);
|
|
616
|
+
unregisterMeshCoordinator(key);
|
|
460
617
|
LOG.info('CLI', `🧹 Auto-cleaned ${status.status} CLI: ${cliType}`);
|
|
461
618
|
this.deps.onStatusChange();
|
|
462
619
|
}
|
|
@@ -516,6 +673,18 @@ export class DaemonCliManager {
|
|
|
516
673
|
transport: 'pty',
|
|
517
674
|
adapterKey: key,
|
|
518
675
|
instanceKey: key,
|
|
676
|
+
workspace: resolvedDir,
|
|
677
|
+
// attachExisting === true means we're restoring an already-spawned
|
|
678
|
+
// hosted runtime after a daemon restart, not starting a fresh PTY.
|
|
679
|
+
// The real spawn time is in the past and we don't have it on the
|
|
680
|
+
// restored descriptor; pinning spawnedAtMs to Date.now() in that
|
|
681
|
+
// case would push the native-history session-floor cutoff past
|
|
682
|
+
// every existing transcript file, so the agy/hermes/claude reader
|
|
683
|
+
// would return null even though the transcript on disk is fresh.
|
|
684
|
+
// 0 disables the floor for this session — recent_window_ms in the
|
|
685
|
+
// spec still bounds how far back we look. Fresh launches still
|
|
686
|
+
// get a proper floor so prior-session leak protection holds.
|
|
687
|
+
spawnedAtMs: attachExisting ? 0 : Date.now(),
|
|
519
688
|
});
|
|
520
689
|
} catch (spawnErr: any) {
|
|
521
690
|
LOG.error('CLI', `[${cliType}] Spawn failed: ${spawnErr?.message}`);
|
|
@@ -589,6 +758,7 @@ export class DaemonCliManager {
|
|
|
589
758
|
transport: 'acp',
|
|
590
759
|
adapterKey: key,
|
|
591
760
|
instanceKey: key,
|
|
761
|
+
workspace: resolvedDir,
|
|
592
762
|
});
|
|
593
763
|
|
|
594
764
|
// Register ACP entry in adapter map (getStatus queries from acpInstance in real-time)
|
|
@@ -783,6 +953,7 @@ export class DaemonCliManager {
|
|
|
783
953
|
this.deps.removeAgentTracking(key);
|
|
784
954
|
this.deps.getSessionRegistry?.()?.unregisterByInstanceKey(key);
|
|
785
955
|
this.deps.getInstanceManager()?.removeInstance(key);
|
|
956
|
+
unregisterMeshCoordinator(key);
|
|
786
957
|
LOG.info('CLI', `🛑 Agent stopped: ${adapter.cliType} in ${adapter.workingDir}`);
|
|
787
958
|
this.deps.onStatusChange();
|
|
788
959
|
} else {
|
|
@@ -792,6 +963,7 @@ export class DaemonCliManager {
|
|
|
792
963
|
this.deps.getSessionRegistry?.()?.unregisterByInstanceKey(key);
|
|
793
964
|
im.removeInstance(key);
|
|
794
965
|
this.deps.removeAgentTracking(key);
|
|
966
|
+
unregisterMeshCoordinator(key);
|
|
795
967
|
LOG.warn('CLI', `🧹 Force-removed orphan entry: ${key}`);
|
|
796
968
|
this.deps.onStatusChange();
|
|
797
969
|
}
|
|
@@ -955,6 +1127,8 @@ export class DaemonCliManager {
|
|
|
955
1127
|
const launchSource = resolved.source;
|
|
956
1128
|
if (!cliType) throw new Error('cliType required');
|
|
957
1129
|
|
|
1130
|
+
const providerType = this.providerLoader.resolveAlias(cliType);
|
|
1131
|
+
const provLookup = this.providerLoader.getMeta(providerType) as ProviderModule | undefined;
|
|
958
1132
|
const settingsOverride = args?.settings && typeof args.settings === 'object' ? args.settings : undefined;
|
|
959
1133
|
const delegatedLaunch = settingsOverride?.launchedByCoordinator === true
|
|
960
1134
|
? buildCoordinatorDelegatedCliLaunchOptions({
|
|
@@ -962,8 +1136,28 @@ export class DaemonCliManager {
|
|
|
962
1136
|
workspace: dir,
|
|
963
1137
|
cliArgs: args?.cliArgs,
|
|
964
1138
|
env: args?.env,
|
|
1139
|
+
isolation: provLookup?.meshCoordinator?.delegatedWorkerIsolation,
|
|
965
1140
|
})
|
|
966
1141
|
: null;
|
|
1142
|
+
// Untrusted-provider gate: an external source that ships JS
|
|
1143
|
+
// hooks needs explicit user confirmation before its first
|
|
1144
|
+
// launch. Dashboards add `confirmExternalUntrusted: true` to
|
|
1145
|
+
// the launch args after showing the trust modal. Without
|
|
1146
|
+
// that ack we refuse to spawn and tell the caller why.
|
|
1147
|
+
const provMeta = provLookup as any;
|
|
1148
|
+
const provTrust = provMeta?._sourceTrust;
|
|
1149
|
+
if (provTrust === 'external-untrusted' && args?.confirmExternalUntrusted !== true) {
|
|
1150
|
+
return {
|
|
1151
|
+
success: false,
|
|
1152
|
+
error: 'untrusted_external_provider',
|
|
1153
|
+
provider: {
|
|
1154
|
+
type: provLookup?.type ?? cliType,
|
|
1155
|
+
sourceName: provMeta?._sourceName ?? null,
|
|
1156
|
+
trust: provTrust,
|
|
1157
|
+
},
|
|
1158
|
+
hint: 'Resend launch_cli with confirmExternalUntrusted=true after the user explicitly approves running JavaScript from this 3rd-party source.',
|
|
1159
|
+
};
|
|
1160
|
+
}
|
|
967
1161
|
const started = await this.startSession(
|
|
968
1162
|
cliType,
|
|
969
1163
|
dir,
|
|
@@ -1030,6 +1224,45 @@ export class DaemonCliManager {
|
|
|
1030
1224
|
this.deps.onStatusChange();
|
|
1031
1225
|
return { success: true, id: found.key, mode };
|
|
1032
1226
|
}
|
|
1227
|
+
case 'record_provider_pty': {
|
|
1228
|
+
const cliType = args?.type || args?.cliType;
|
|
1229
|
+
if (!cliType) {
|
|
1230
|
+
return { success: false, error: '`type` (provider type) is required', code: 'MISSING_TYPE' };
|
|
1231
|
+
}
|
|
1232
|
+
const targetSessionId = typeof args?.targetSessionId === 'string' ? args.targetSessionId : '';
|
|
1233
|
+
const dir = args?.dir || '';
|
|
1234
|
+
const found = (targetSessionId ? this.findAdapterBySessionId(targetSessionId) : null)
|
|
1235
|
+
|| this.findAdapter(cliType, { instanceKey: targetSessionId, dir });
|
|
1236
|
+
if (!found) {
|
|
1237
|
+
return {
|
|
1238
|
+
success: false,
|
|
1239
|
+
error: `No running ${cliType} session. Launch one first (adhdev launch ${cliType}) or pass --target-session-id.`,
|
|
1240
|
+
code: 'NO_RUNNING_SESSION',
|
|
1241
|
+
};
|
|
1242
|
+
}
|
|
1243
|
+
const instance = this.deps.getInstanceManager()?.getInstance(found.key);
|
|
1244
|
+
if (!(instance instanceof CliProviderInstance)) {
|
|
1245
|
+
return { success: false, error: 'CLI instance not available', code: 'CLI_INSTANCE_NOT_FOUND' };
|
|
1246
|
+
}
|
|
1247
|
+
const adapter = instance.getAdapter();
|
|
1248
|
+
if (!adapter || typeof (adapter as any).getAccumulatedRawBuffer !== 'function') {
|
|
1249
|
+
return { success: false, error: 'Adapter does not expose PTY buffer', code: 'ADAPTER_NOT_RECORDABLE' };
|
|
1250
|
+
}
|
|
1251
|
+
const buffer = (adapter as any).getAccumulatedRawBuffer() as { text: string; droppedChars: number };
|
|
1252
|
+
const maxBytes = Number(args?.maxBytes) > 0 ? Number(args.maxBytes) : 262144;
|
|
1253
|
+
const truncated = buffer.text.length > maxBytes;
|
|
1254
|
+
const ptyBytes = truncated ? buffer.text.slice(-maxBytes) : buffer.text;
|
|
1255
|
+
return {
|
|
1256
|
+
success: true,
|
|
1257
|
+
cliType,
|
|
1258
|
+
sessionId: found.key,
|
|
1259
|
+
ptyBytes,
|
|
1260
|
+
bytes: ptyBytes.length,
|
|
1261
|
+
truncated,
|
|
1262
|
+
droppedChars: buffer.droppedChars,
|
|
1263
|
+
capturedAt: Date.now(),
|
|
1264
|
+
};
|
|
1265
|
+
}
|
|
1033
1266
|
case 'restart_session': {
|
|
1034
1267
|
const cliType = args?.cliType || args?.agentType || args?.ideType;
|
|
1035
1268
|
const cfg = loadConfig();
|
|
@@ -1073,6 +1306,29 @@ export class DaemonCliManager {
|
|
|
1073
1306
|
const { adapter, key } = found;
|
|
1074
1307
|
|
|
1075
1308
|
if (action === 'send_chat') {
|
|
1309
|
+
let currentStatus = getEffectiveAgentSendStatus(adapter);
|
|
1310
|
+
if (currentStatus === 'starting' && await waitForZeroMessageStartingLaunch(adapter)) {
|
|
1311
|
+
currentStatus = 'idle';
|
|
1312
|
+
} else if (currentStatus === 'starting') {
|
|
1313
|
+
currentStatus = getEffectiveAgentSendStatus(adapter);
|
|
1314
|
+
}
|
|
1315
|
+
// Stamp mesh direct-dispatch assignment on the target
|
|
1316
|
+
// instance BEFORE sending the prompt so the completion
|
|
1317
|
+
// event has a routing marker by the time it fires.
|
|
1318
|
+
// mesh_send_task --direct ships meshContext for plain CLI
|
|
1319
|
+
// sessions that were never launched as mesh delegates.
|
|
1320
|
+
const meshContext = (args as any)?.meshContext;
|
|
1321
|
+
if (meshContext && typeof meshContext === 'object' && typeof meshContext.meshId === 'string' && meshContext.meshId) {
|
|
1322
|
+
const targetInstanceId = key;
|
|
1323
|
+
try {
|
|
1324
|
+
this.deps.getInstanceManager()?.attachMeshAssignmentToInstance(targetInstanceId, {
|
|
1325
|
+
meshId: meshContext.meshId,
|
|
1326
|
+
...(typeof meshContext.nodeId === 'string' && meshContext.nodeId ? { nodeId: meshContext.nodeId } : {}),
|
|
1327
|
+
...(typeof meshContext.taskId === 'string' && meshContext.taskId ? { taskId: meshContext.taskId } : {}),
|
|
1328
|
+
...(typeof meshContext.coordinatorDaemonId === 'string' && meshContext.coordinatorDaemonId ? { coordinatorDaemonId: meshContext.coordinatorDaemonId } : {}),
|
|
1329
|
+
});
|
|
1330
|
+
} catch { /* best-effort */ }
|
|
1331
|
+
}
|
|
1076
1332
|
const input = normalizeInputEnvelope(args?.input ? { input: args.input } : args);
|
|
1077
1333
|
const provider = this.providerLoader.resolve(agentType) || this.providerLoader.getMeta(agentType);
|
|
1078
1334
|
if (provider?.category === 'acp') {
|
|
@@ -1082,8 +1338,24 @@ export class DaemonCliManager {
|
|
|
1082
1338
|
}
|
|
1083
1339
|
const message = input.textFallback;
|
|
1084
1340
|
if (!message) throw new Error('message required for send_chat');
|
|
1085
|
-
|
|
1086
|
-
|
|
1341
|
+
const forceSend = args?.force === true || args?.forceSend === true;
|
|
1342
|
+
if (forceSend && typeof (adapter as any).forceSendMessage === 'function') {
|
|
1343
|
+
await (adapter as any).forceSendMessage(message);
|
|
1344
|
+
} else if (forceSend) {
|
|
1345
|
+
await adapter.sendMessage(message, { force: true });
|
|
1346
|
+
} else {
|
|
1347
|
+
await adapter.sendMessage(message);
|
|
1348
|
+
}
|
|
1349
|
+
const targetInstance = this.deps.getInstanceManager()?.getInstance(key) as
|
|
1350
|
+
| { recordAcknowledgedUserInput?: (input: unknown) => void }
|
|
1351
|
+
| undefined;
|
|
1352
|
+
targetInstance?.recordAcknowledgedUserInput?.(input);
|
|
1353
|
+
return {
|
|
1354
|
+
success: true,
|
|
1355
|
+
status: BUSY_AGENT_STATUSES.has(currentStatus) ? currentStatus : 'generating',
|
|
1356
|
+
...(BUSY_AGENT_STATUSES.has(currentStatus) ? { queued: true, queuedReason: 'agent_runtime_busy' } : {}),
|
|
1357
|
+
...(forceSend ? { forceSent: true, queued: false } : {}),
|
|
1358
|
+
};
|
|
1087
1359
|
} else if (action === 'clear_history') {
|
|
1088
1360
|
if (typeof adapter.clearHistory === 'function') adapter.clearHistory();
|
|
1089
1361
|
return { success: true, cleared: true };
|