@adhdev/daemon-core 0.9.82-rc.16 โ 0.9.82-rc.161
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/process-hardening.d.ts +50 -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 +19 -2
- package/dist/cli-adapters/cli-script-runner.d.ts +117 -0
- package/dist/cli-adapters/cli-state-engine.d.ts +178 -0
- package/dist/cli-adapters/provider-cli-adapter.d.ts +104 -63
- package/dist/cli-adapters/provider-cli-parse.d.ts +4 -0
- package/dist/cli-adapters/provider-cli-shared.d.ts +27 -0
- package/dist/commands/handler.d.ts +66 -0
- package/dist/commands/mesh-coordinator.d.ts +72 -1
- package/dist/commands/router.d.ts +22 -0
- package/dist/config/chat-history.d.ts +7 -0
- package/dist/config/config.d.ts +5 -0
- package/dist/config/mesh-config.d.ts +71 -1
- package/dist/git/git-commands.d.ts +5 -1
- package/dist/index.d.ts +31 -6
- package/dist/index.js +17210 -3575
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17127 -3551
- 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/mesh/beads-db.d.ts +72 -0
- package/dist/mesh/contracts.d.ts +164 -0
- package/dist/mesh/coordinator-prompt.d.ts +30 -0
- package/dist/mesh/coordinator-registry.d.ts +59 -0
- package/dist/mesh/mesh-active-work.d.ts +90 -0
- package/dist/mesh/mesh-events.d.ts +77 -5
- package/dist/mesh/mesh-fast-forward.d.ts +39 -0
- package/dist/mesh/mesh-host-ownership.d.ts +9 -0
- package/dist/mesh/mesh-ledger.d.ts +58 -1
- package/dist/mesh/mesh-refine-status.d.ts +26 -0
- package/dist/mesh/mesh-work-queue.d.ts +44 -5
- package/dist/mesh/preview-freshness.d.ts +18 -0
- package/dist/mesh/refine-config.d.ts +193 -0
- package/dist/mesh/worktree-bootstrap-config.d.ts +113 -0
- package/dist/providers/approval-utils.d.ts +9 -0
- package/dist/providers/cli-provider-instance.d.ts +7 -2
- package/dist/providers/contracts.d.ts +98 -5
- 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 +24 -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-loader.d.ts +19 -1
- 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 +64 -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 +169 -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 +56 -0
- package/dist/providers/spec/cli-adapter.d.ts +76 -0
- package/dist/providers/spec/driver.d.ts +148 -0
- package/dist/providers/spec/evaluator.d.ts +47 -0
- package/dist/providers/spec/loader.d.ts +14 -0
- package/dist/providers/spec/native-history-executor.d.ts +39 -0
- package/dist/providers/spec/route.d.ts +4 -0
- package/dist/providers/spec/schema.gen.d.ts +507 -0
- package/dist/providers/spec/types.d.ts +211 -0
- package/dist/providers/transcript-v2.d.ts +176 -0
- package/dist/repo-mesh-types.d.ts +100 -1
- package/dist/sessions/registry.d.ts +3 -0
- package/dist/shared-types.d.ts +12 -0
- package/dist/status/reporter.d.ts +2 -0
- package/dist/status/snapshot.d.ts +1 -0
- package/dist/types.d.ts +5 -0
- package/package.json +7 -2
- package/src/boot/daemon-lifecycle.ts +17 -10
- package/src/boot/process-hardening.ts +89 -0
- package/src/chat/source-machine.ts +534 -0
- package/src/chat/source-resolver.ts +0 -0
- package/src/chat/subscription-updates.ts +14 -1
- package/src/cli-adapter-types.d.ts +1 -0
- package/src/cli-adapter-types.ts +18 -2
- package/src/cli-adapters/cli-script-runner.ts +421 -0
- package/src/cli-adapters/cli-state-engine.ts +1086 -0
- package/src/cli-adapters/provider-cli-adapter.d.ts +1 -1
- package/src/cli-adapters/provider-cli-adapter.ts +664 -1137
- 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 +3 -1
- package/src/cli-adapters/provider-cli-shared.d.ts +2 -0
- package/src/cli-adapters/provider-cli-shared.ts +57 -11
- package/src/cli-adapters/terminal-backends/ghostty-vt-backend.ts +17 -1
- package/src/cli-adapters/terminal-backends/xterm-backend.ts +8 -1
- package/src/commands/chat-commands.ts +1597 -60
- package/src/commands/cli-manager.ts +195 -3
- package/src/commands/handler.ts +547 -2
- package/src/commands/mesh-coordinator.ts +231 -127
- package/src/commands/router.ts +3547 -502
- package/src/config/chat-history.ts +87 -24
- package/src/config/config.ts +12 -0
- package/src/config/mesh-config.ts +264 -2
- package/src/config/recent-activity.ts +8 -2
- package/src/daemon/dev-cli-debug.ts +10 -1
- package/src/detection/ide-detector.ts +26 -16
- package/src/git/git-commands.ts +17 -5
- package/src/git/git-worktree.ts +8 -1
- package/src/index.ts +91 -5
- 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/logger.ts +2 -1
- package/src/mesh/beads-db.ts +479 -0
- package/src/mesh/contracts.ts +329 -0
- package/src/mesh/coordinator-prompt.ts +204 -30
- package/src/mesh/coordinator-registry.ts +121 -0
- package/src/mesh/mesh-active-work.ts +437 -0
- package/src/mesh/mesh-events.ts +820 -61
- package/src/mesh/mesh-fast-forward.ts +430 -0
- package/src/mesh/mesh-host-ownership.ts +73 -0
- package/src/mesh/mesh-ledger.ts +457 -104
- package/src/mesh/mesh-refine-status.ts +144 -0
- package/src/mesh/mesh-work-queue.ts +216 -158
- package/src/mesh/preview-freshness.ts +118 -0
- package/src/mesh/refine-config.ts +366 -0
- package/src/mesh/worktree-bootstrap-config.ts +247 -0
- package/src/providers/approval-utils.ts +39 -5
- package/src/providers/chat-message-normalization.ts +4 -11
- package/src/providers/cli-provider-instance.ts +388 -47
- package/src/providers/contracts.ts +105 -5
- package/src/providers/ide-provider-instance.ts +17 -3
- 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 +419 -0
- package/src/providers/native-history/dispatcher.ts +227 -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-loader.ts +420 -31
- package/src/providers/provider-schema.ts +31 -13
- 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 +245 -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 +457 -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 +119 -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 +210 -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 +153 -0
- package/src/providers/spec/cli-adapter.ts +318 -0
- package/src/providers/spec/driver.ts +498 -0
- package/src/providers/spec/evaluator.ts +268 -0
- package/src/providers/spec/loader.ts +130 -0
- package/src/providers/spec/native-history-executor.ts +612 -0
- package/src/providers/spec/route.ts +51 -0
- package/src/providers/spec/schema.gen.ts +507 -0
- package/src/providers/spec/schema.json +210 -0
- package/src/providers/spec/types.ts +230 -0
- package/src/providers/transcript-v2.ts +567 -0
- package/src/providers/version-archive.ts +38 -20
- package/src/repo-mesh-types.ts +110 -1
- package/src/sessions/registry.ts +3 -0
- package/src/shared-types.ts +9 -0
- package/src/status/builders.ts +23 -6
- package/src/status/reporter.ts +15 -0
- package/src/status/snapshot.ts +35 -11
- package/src/system/host-memory.ts +29 -12
- package/src/types.ts +5 -0
|
@@ -18,6 +18,7 @@ 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';
|
|
@@ -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', '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;
|
|
@@ -255,10 +364,14 @@ function detectExplicitProviderSessionId(
|
|
|
255
364
|
|
|
256
365
|
const subcommands = resume?.sessionIdFromSubcommand;
|
|
257
366
|
if (Array.isArray(subcommands) && subcommands.length > 0) {
|
|
367
|
+
const hasResumeSubcommand = args.some((arg) => subcommands.includes(arg));
|
|
258
368
|
const subcommandSessionId = readSubcommandSessionId(args, subcommands);
|
|
259
369
|
if (subcommandSessionId) {
|
|
260
370
|
return { providerSessionId: subcommandSessionId, launchMode: 'resume' };
|
|
261
371
|
}
|
|
372
|
+
if (hasResumeSubcommand) {
|
|
373
|
+
return { launchMode: 'resume' };
|
|
374
|
+
}
|
|
262
375
|
}
|
|
263
376
|
|
|
264
377
|
return { launchMode: 'manual' };
|
|
@@ -292,6 +405,12 @@ export function resolveCliSessionBinding(
|
|
|
292
405
|
launchMode: explicit.launchMode,
|
|
293
406
|
};
|
|
294
407
|
}
|
|
408
|
+
if (explicit.launchMode === 'resume') {
|
|
409
|
+
return {
|
|
410
|
+
cliArgs: baseArgs,
|
|
411
|
+
launchMode: 'resume',
|
|
412
|
+
};
|
|
413
|
+
}
|
|
295
414
|
if (explicit.launchMode === 'manual' && hasArg(baseArgs || [], ['--session-id'])) {
|
|
296
415
|
return {
|
|
297
416
|
cliArgs: baseArgs,
|
|
@@ -435,7 +554,9 @@ export class DaemonCliManager {
|
|
|
435
554
|
providerSessionId,
|
|
436
555
|
attachExisting,
|
|
437
556
|
);
|
|
438
|
-
|
|
557
|
+
const adapter = new ProviderCliAdapter(resolvedProvider as CliProviderModule, workingDir, cliArgs, extraEnv || {}, transportFactory);
|
|
558
|
+
if (providerSessionId) adapter.updateRuntimeMeta({ providerSessionId });
|
|
559
|
+
return adapter;
|
|
439
560
|
}
|
|
440
561
|
|
|
441
562
|
throw new Error(`No CLI provider found for '${cliType}'. Create a provider.js in providers/cli/${cliType}/`);
|
|
@@ -457,6 +578,7 @@ export class DaemonCliManager {
|
|
|
457
578
|
this.deps.removeAgentTracking(key);
|
|
458
579
|
sessionRegistry?.unregisterByInstanceKey(key);
|
|
459
580
|
instanceManager?.removeInstance(key);
|
|
581
|
+
unregisterMeshCoordinator(key);
|
|
460
582
|
LOG.info('CLI', `๐งน Auto-cleaned ${status.status} CLI: ${cliType}`);
|
|
461
583
|
this.deps.onStatusChange();
|
|
462
584
|
}
|
|
@@ -516,6 +638,17 @@ export class DaemonCliManager {
|
|
|
516
638
|
transport: 'pty',
|
|
517
639
|
adapterKey: key,
|
|
518
640
|
instanceKey: key,
|
|
641
|
+
// attachExisting === true means we're restoring an already-spawned
|
|
642
|
+
// hosted runtime after a daemon restart, not starting a fresh PTY.
|
|
643
|
+
// The real spawn time is in the past and we don't have it on the
|
|
644
|
+
// restored descriptor; pinning spawnedAtMs to Date.now() in that
|
|
645
|
+
// case would push the native-history session-floor cutoff past
|
|
646
|
+
// every existing transcript file, so the agy/hermes/claude reader
|
|
647
|
+
// would return null even though the transcript on disk is fresh.
|
|
648
|
+
// 0 disables the floor for this session โ recent_window_ms in the
|
|
649
|
+
// spec still bounds how far back we look. Fresh launches still
|
|
650
|
+
// get a proper floor so prior-session leak protection holds.
|
|
651
|
+
spawnedAtMs: attachExisting ? 0 : Date.now(),
|
|
519
652
|
});
|
|
520
653
|
} catch (spawnErr: any) {
|
|
521
654
|
LOG.error('CLI', `[${cliType}] Spawn failed: ${spawnErr?.message}`);
|
|
@@ -783,6 +916,7 @@ export class DaemonCliManager {
|
|
|
783
916
|
this.deps.removeAgentTracking(key);
|
|
784
917
|
this.deps.getSessionRegistry?.()?.unregisterByInstanceKey(key);
|
|
785
918
|
this.deps.getInstanceManager()?.removeInstance(key);
|
|
919
|
+
unregisterMeshCoordinator(key);
|
|
786
920
|
LOG.info('CLI', `๐ Agent stopped: ${adapter.cliType} in ${adapter.workingDir}`);
|
|
787
921
|
this.deps.onStatusChange();
|
|
788
922
|
} else {
|
|
@@ -792,6 +926,7 @@ export class DaemonCliManager {
|
|
|
792
926
|
this.deps.getSessionRegistry?.()?.unregisterByInstanceKey(key);
|
|
793
927
|
im.removeInstance(key);
|
|
794
928
|
this.deps.removeAgentTracking(key);
|
|
929
|
+
unregisterMeshCoordinator(key);
|
|
795
930
|
LOG.warn('CLI', `๐งน Force-removed orphan entry: ${key}`);
|
|
796
931
|
this.deps.onStatusChange();
|
|
797
932
|
}
|
|
@@ -1030,6 +1165,45 @@ export class DaemonCliManager {
|
|
|
1030
1165
|
this.deps.onStatusChange();
|
|
1031
1166
|
return { success: true, id: found.key, mode };
|
|
1032
1167
|
}
|
|
1168
|
+
case 'record_provider_pty': {
|
|
1169
|
+
const cliType = args?.type || args?.cliType;
|
|
1170
|
+
if (!cliType) {
|
|
1171
|
+
return { success: false, error: '`type` (provider type) is required', code: 'MISSING_TYPE' };
|
|
1172
|
+
}
|
|
1173
|
+
const targetSessionId = typeof args?.targetSessionId === 'string' ? args.targetSessionId : '';
|
|
1174
|
+
const dir = args?.dir || '';
|
|
1175
|
+
const found = (targetSessionId ? this.findAdapterBySessionId(targetSessionId) : null)
|
|
1176
|
+
|| this.findAdapter(cliType, { instanceKey: targetSessionId, dir });
|
|
1177
|
+
if (!found) {
|
|
1178
|
+
return {
|
|
1179
|
+
success: false,
|
|
1180
|
+
error: `No running ${cliType} session. Launch one first (adhdev launch ${cliType}) or pass --target-session-id.`,
|
|
1181
|
+
code: 'NO_RUNNING_SESSION',
|
|
1182
|
+
};
|
|
1183
|
+
}
|
|
1184
|
+
const instance = this.deps.getInstanceManager()?.getInstance(found.key);
|
|
1185
|
+
if (!(instance instanceof CliProviderInstance)) {
|
|
1186
|
+
return { success: false, error: 'CLI instance not available', code: 'CLI_INSTANCE_NOT_FOUND' };
|
|
1187
|
+
}
|
|
1188
|
+
const adapter = instance.getAdapter();
|
|
1189
|
+
if (!adapter || typeof (adapter as any).getAccumulatedRawBuffer !== 'function') {
|
|
1190
|
+
return { success: false, error: 'Adapter does not expose PTY buffer', code: 'ADAPTER_NOT_RECORDABLE' };
|
|
1191
|
+
}
|
|
1192
|
+
const buffer = (adapter as any).getAccumulatedRawBuffer() as { text: string; droppedChars: number };
|
|
1193
|
+
const maxBytes = Number(args?.maxBytes) > 0 ? Number(args.maxBytes) : 262144;
|
|
1194
|
+
const truncated = buffer.text.length > maxBytes;
|
|
1195
|
+
const ptyBytes = truncated ? buffer.text.slice(-maxBytes) : buffer.text;
|
|
1196
|
+
return {
|
|
1197
|
+
success: true,
|
|
1198
|
+
cliType,
|
|
1199
|
+
sessionId: found.key,
|
|
1200
|
+
ptyBytes,
|
|
1201
|
+
bytes: ptyBytes.length,
|
|
1202
|
+
truncated,
|
|
1203
|
+
droppedChars: buffer.droppedChars,
|
|
1204
|
+
capturedAt: Date.now(),
|
|
1205
|
+
};
|
|
1206
|
+
}
|
|
1033
1207
|
case 'restart_session': {
|
|
1034
1208
|
const cliType = args?.cliType || args?.agentType || args?.ideType;
|
|
1035
1209
|
const cfg = loadConfig();
|
|
@@ -1073,6 +1247,12 @@ export class DaemonCliManager {
|
|
|
1073
1247
|
const { adapter, key } = found;
|
|
1074
1248
|
|
|
1075
1249
|
if (action === 'send_chat') {
|
|
1250
|
+
let currentStatus = getEffectiveAgentSendStatus(adapter);
|
|
1251
|
+
if (currentStatus === 'starting' && await waitForZeroMessageStartingLaunch(adapter)) {
|
|
1252
|
+
currentStatus = 'idle';
|
|
1253
|
+
} else if (currentStatus === 'starting') {
|
|
1254
|
+
currentStatus = getEffectiveAgentSendStatus(adapter);
|
|
1255
|
+
}
|
|
1076
1256
|
const input = normalizeInputEnvelope(args?.input ? { input: args.input } : args);
|
|
1077
1257
|
const provider = this.providerLoader.resolve(agentType) || this.providerLoader.getMeta(agentType);
|
|
1078
1258
|
if (provider?.category === 'acp') {
|
|
@@ -1082,8 +1262,20 @@ export class DaemonCliManager {
|
|
|
1082
1262
|
}
|
|
1083
1263
|
const message = input.textFallback;
|
|
1084
1264
|
if (!message) throw new Error('message required for send_chat');
|
|
1085
|
-
|
|
1086
|
-
|
|
1265
|
+
const forceSend = args?.force === true || args?.forceSend === true;
|
|
1266
|
+
if (forceSend && typeof (adapter as any).forceSendMessage === 'function') {
|
|
1267
|
+
await (adapter as any).forceSendMessage(message);
|
|
1268
|
+
} else if (forceSend) {
|
|
1269
|
+
await adapter.sendMessage(message, { force: true });
|
|
1270
|
+
} else {
|
|
1271
|
+
await adapter.sendMessage(message);
|
|
1272
|
+
}
|
|
1273
|
+
return {
|
|
1274
|
+
success: true,
|
|
1275
|
+
status: BUSY_AGENT_STATUSES.has(currentStatus) ? currentStatus : 'generating',
|
|
1276
|
+
...(BUSY_AGENT_STATUSES.has(currentStatus) ? { queued: true, queuedReason: 'agent_runtime_busy' } : {}),
|
|
1277
|
+
...(forceSend ? { forceSent: true, queued: false } : {}),
|
|
1278
|
+
};
|
|
1087
1279
|
} else if (action === 'clear_history') {
|
|
1088
1280
|
if (typeof adapter.clearHistory === 'function') adapter.clearHistory();
|
|
1089
1281
|
return { success: true, cleared: true };
|