@codedeck/codedeck 2026.3.1-4.63
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/README.md +38 -0
- package/config/default.yaml +51 -0
- package/dist/agent/brain-dispatcher.d.ts +67 -0
- package/dist/agent/brain-dispatcher.d.ts.map +1 -0
- package/dist/agent/brain-dispatcher.js +136 -0
- package/dist/agent/brain-dispatcher.js.map +1 -0
- package/dist/agent/detect.d.ts +20 -0
- package/dist/agent/detect.d.ts.map +1 -0
- package/dist/agent/detect.js +187 -0
- package/dist/agent/detect.js.map +1 -0
- package/dist/agent/drivers/base.d.ts +57 -0
- package/dist/agent/drivers/base.d.ts.map +1 -0
- package/dist/agent/drivers/base.js +3 -0
- package/dist/agent/drivers/base.js.map +1 -0
- package/dist/agent/drivers/claude-code.d.ts +14 -0
- package/dist/agent/drivers/claude-code.d.ts.map +1 -0
- package/dist/agent/drivers/claude-code.js +112 -0
- package/dist/agent/drivers/claude-code.js.map +1 -0
- package/dist/agent/drivers/codex.d.ts +14 -0
- package/dist/agent/drivers/codex.d.ts.map +1 -0
- package/dist/agent/drivers/codex.js +77 -0
- package/dist/agent/drivers/codex.js.map +1 -0
- package/dist/agent/drivers/gemini.d.ts +24 -0
- package/dist/agent/drivers/gemini.d.ts.map +1 -0
- package/dist/agent/drivers/gemini.js +142 -0
- package/dist/agent/drivers/gemini.js.map +1 -0
- package/dist/agent/drivers/opencode.d.ts +18 -0
- package/dist/agent/drivers/opencode.d.ts.map +1 -0
- package/dist/agent/drivers/opencode.js +50 -0
- package/dist/agent/drivers/opencode.js.map +1 -0
- package/dist/agent/drivers/shell.d.ts +13 -0
- package/dist/agent/drivers/shell.d.ts.map +1 -0
- package/dist/agent/drivers/shell.js +30 -0
- package/dist/agent/drivers/shell.js.map +1 -0
- package/dist/agent/env-isolation.d.ts +26 -0
- package/dist/agent/env-isolation.d.ts.map +1 -0
- package/dist/agent/env-isolation.js +103 -0
- package/dist/agent/env-isolation.js.map +1 -0
- package/dist/agent/notify-setup.d.ts +18 -0
- package/dist/agent/notify-setup.d.ts.map +1 -0
- package/dist/agent/notify-setup.js +68 -0
- package/dist/agent/notify-setup.js.map +1 -0
- package/dist/agent/session-manager.d.ts +75 -0
- package/dist/agent/session-manager.d.ts.map +1 -0
- package/dist/agent/session-manager.js +407 -0
- package/dist/agent/session-manager.js.map +1 -0
- package/dist/agent/signal.d.ts +32 -0
- package/dist/agent/signal.d.ts.map +1 -0
- package/dist/agent/signal.js +199 -0
- package/dist/agent/signal.js.map +1 -0
- package/dist/agent/status-poller.d.ts +27 -0
- package/dist/agent/status-poller.d.ts.map +1 -0
- package/dist/agent/status-poller.js +76 -0
- package/dist/agent/status-poller.js.map +1 -0
- package/dist/agent/templates/brain-prompt.d.ts +14 -0
- package/dist/agent/templates/brain-prompt.d.ts.map +1 -0
- package/dist/agent/templates/brain-prompt.js +57 -0
- package/dist/agent/templates/brain-prompt.js.map +1 -0
- package/dist/agent/templates/identity.d.ts +19 -0
- package/dist/agent/templates/identity.d.ts.map +1 -0
- package/dist/agent/templates/identity.js +97 -0
- package/dist/agent/templates/identity.js.map +1 -0
- package/dist/agent/tmux.d.ts +90 -0
- package/dist/agent/tmux.d.ts.map +1 -0
- package/dist/agent/tmux.js +386 -0
- package/dist/agent/tmux.js.map +1 -0
- package/dist/autofix/audit-engine.d.ts +35 -0
- package/dist/autofix/audit-engine.d.ts.map +1 -0
- package/dist/autofix/audit-engine.js +144 -0
- package/dist/autofix/audit-engine.js.map +1 -0
- package/dist/autofix/branch-manager.d.ts +44 -0
- package/dist/autofix/branch-manager.d.ts.map +1 -0
- package/dist/autofix/branch-manager.js +97 -0
- package/dist/autofix/branch-manager.js.map +1 -0
- package/dist/autofix/decision-engine.d.ts +38 -0
- package/dist/autofix/decision-engine.d.ts.map +1 -0
- package/dist/autofix/decision-engine.js +115 -0
- package/dist/autofix/decision-engine.js.map +1 -0
- package/dist/autofix/index.d.ts +23 -0
- package/dist/autofix/index.d.ts.map +1 -0
- package/dist/autofix/index.js +192 -0
- package/dist/autofix/index.js.map +1 -0
- package/dist/autofix/prompt-builder.d.ts +25 -0
- package/dist/autofix/prompt-builder.d.ts.map +1 -0
- package/dist/autofix/prompt-builder.js +137 -0
- package/dist/autofix/prompt-builder.js.map +1 -0
- package/dist/autofix/report-parser.d.ts +18 -0
- package/dist/autofix/report-parser.d.ts.map +1 -0
- package/dist/autofix/report-parser.js +74 -0
- package/dist/autofix/report-parser.js.map +1 -0
- package/dist/autofix/state-machine.d.ts +40 -0
- package/dist/autofix/state-machine.d.ts.map +1 -0
- package/dist/autofix/state-machine.js +76 -0
- package/dist/autofix/state-machine.js.map +1 -0
- package/dist/bind/bind-flow.d.ts +15 -0
- package/dist/bind/bind-flow.d.ts.map +1 -0
- package/dist/bind/bind-flow.js +198 -0
- package/dist/bind/bind-flow.js.map +1 -0
- package/dist/config.d.ts +53 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +89 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/codex-watcher.d.ts +46 -0
- package/dist/daemon/codex-watcher.d.ts.map +1 -0
- package/dist/daemon/codex-watcher.js +533 -0
- package/dist/daemon/codex-watcher.js.map +1 -0
- package/dist/daemon/command-handler.d.ts +6 -0
- package/dist/daemon/command-handler.d.ts.map +1 -0
- package/dist/daemon/command-handler.js +770 -0
- package/dist/daemon/command-handler.js.map +1 -0
- package/dist/daemon/discussion-orchestrator.d.ts +63 -0
- package/dist/daemon/discussion-orchestrator.d.ts.map +1 -0
- package/dist/daemon/discussion-orchestrator.js +482 -0
- package/dist/daemon/discussion-orchestrator.js.map +1 -0
- package/dist/daemon/gemini-watcher.d.ts +42 -0
- package/dist/daemon/gemini-watcher.d.ts.map +1 -0
- package/dist/daemon/gemini-watcher.js +463 -0
- package/dist/daemon/gemini-watcher.js.map +1 -0
- package/dist/daemon/hook-server.d.ts +42 -0
- package/dist/daemon/hook-server.d.ts.map +1 -0
- package/dist/daemon/hook-server.js +160 -0
- package/dist/daemon/hook-server.js.map +1 -0
- package/dist/daemon/jsonl-watcher.d.ts +35 -0
- package/dist/daemon/jsonl-watcher.d.ts.map +1 -0
- package/dist/daemon/jsonl-watcher.js +635 -0
- package/dist/daemon/jsonl-watcher.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +20 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -0
- package/dist/daemon/lifecycle.js +331 -0
- package/dist/daemon/lifecycle.js.map +1 -0
- package/dist/daemon/server-link.d.ts +44 -0
- package/dist/daemon/server-link.d.ts.map +1 -0
- package/dist/daemon/server-link.js +232 -0
- package/dist/daemon/server-link.js.map +1 -0
- package/dist/daemon/subsession-manager.d.ts +37 -0
- package/dist/daemon/subsession-manager.d.ts.map +1 -0
- package/dist/daemon/subsession-manager.js +240 -0
- package/dist/daemon/subsession-manager.js.map +1 -0
- package/dist/daemon/terminal-parser.d.ts +42 -0
- package/dist/daemon/terminal-parser.d.ts.map +1 -0
- package/dist/daemon/terminal-parser.js +278 -0
- package/dist/daemon/terminal-parser.js.map +1 -0
- package/dist/daemon/terminal-streamer.d.ts +93 -0
- package/dist/daemon/terminal-streamer.d.ts.map +1 -0
- package/dist/daemon/terminal-streamer.js +451 -0
- package/dist/daemon/terminal-streamer.js.map +1 -0
- package/dist/daemon/timeline-emitter.d.ts +32 -0
- package/dist/daemon/timeline-emitter.d.ts.map +1 -0
- package/dist/daemon/timeline-emitter.js +97 -0
- package/dist/daemon/timeline-emitter.js.map +1 -0
- package/dist/daemon/timeline-event.d.ts +23 -0
- package/dist/daemon/timeline-event.d.ts.map +1 -0
- package/dist/daemon/timeline-event.js +7 -0
- package/dist/daemon/timeline-event.js.map +1 -0
- package/dist/daemon/timeline-store.d.ts +40 -0
- package/dist/daemon/timeline-store.d.ts.map +1 -0
- package/dist/daemon/timeline-store.js +153 -0
- package/dist/daemon/timeline-store.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +149 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/claude-mem.d.ts +9 -0
- package/dist/memory/claude-mem.d.ts.map +1 -0
- package/dist/memory/claude-mem.js +58 -0
- package/dist/memory/claude-mem.js.map +1 -0
- package/dist/memory/context-builder.d.ts +4 -0
- package/dist/memory/context-builder.d.ts.map +1 -0
- package/dist/memory/context-builder.js +35 -0
- package/dist/memory/context-builder.js.map +1 -0
- package/dist/memory/detector.d.ts +7 -0
- package/dist/memory/detector.d.ts.map +1 -0
- package/dist/memory/detector.js +17 -0
- package/dist/memory/detector.js.map +1 -0
- package/dist/memory/extractor.d.ts +21 -0
- package/dist/memory/extractor.d.ts.map +1 -0
- package/dist/memory/extractor.js +83 -0
- package/dist/memory/extractor.js.map +1 -0
- package/dist/memory/injector.d.ts +7 -0
- package/dist/memory/injector.d.ts.map +1 -0
- package/dist/memory/injector.js +18 -0
- package/dist/memory/injector.js.map +1 -0
- package/dist/memory/interface.d.ts +25 -0
- package/dist/memory/interface.d.ts.map +1 -0
- package/dist/memory/interface.js +3 -0
- package/dist/memory/interface.js.map +1 -0
- package/dist/memory/mem0.d.ts +12 -0
- package/dist/memory/mem0.d.ts.map +1 -0
- package/dist/memory/mem0.js +93 -0
- package/dist/memory/mem0.js.map +1 -0
- package/dist/router/command-parser.d.ts +33 -0
- package/dist/router/command-parser.d.ts.map +1 -0
- package/dist/router/command-parser.js +66 -0
- package/dist/router/command-parser.js.map +1 -0
- package/dist/router/message-router.d.ts +42 -0
- package/dist/router/message-router.d.ts.map +1 -0
- package/dist/router/message-router.js +222 -0
- package/dist/router/message-router.js.map +1 -0
- package/dist/router/response-collector.d.ts +28 -0
- package/dist/router/response-collector.d.ts.map +1 -0
- package/dist/router/response-collector.js +164 -0
- package/dist/router/response-collector.js.map +1 -0
- package/dist/store/project-store.d.ts +37 -0
- package/dist/store/project-store.d.ts.map +1 -0
- package/dist/store/project-store.js +70 -0
- package/dist/store/project-store.js.map +1 -0
- package/dist/store/session-store.d.ts +32 -0
- package/dist/store/session-store.d.ts.map +1 -0
- package/dist/store/session-store.js +67 -0
- package/dist/store/session-store.js.map +1 -0
- package/dist/tracker/branch.d.ts +24 -0
- package/dist/tracker/branch.d.ts.map +1 -0
- package/dist/tracker/branch.js +55 -0
- package/dist/tracker/branch.js.map +1 -0
- package/dist/tracker/github.d.ts +31 -0
- package/dist/tracker/github.d.ts.map +1 -0
- package/dist/tracker/github.js +117 -0
- package/dist/tracker/github.js.map +1 -0
- package/dist/tracker/gitlab.d.ts +31 -0
- package/dist/tracker/gitlab.d.ts.map +1 -0
- package/dist/tracker/gitlab.js +116 -0
- package/dist/tracker/gitlab.js.map +1 -0
- package/dist/tracker/index.d.ts +9 -0
- package/dist/tracker/index.d.ts.map +1 -0
- package/dist/tracker/index.js +28 -0
- package/dist/tracker/index.js.map +1 -0
- package/dist/tracker/interface.d.ts +39 -0
- package/dist/tracker/interface.d.ts.map +1 -0
- package/dist/tracker/interface.js +7 -0
- package/dist/tracker/interface.js.map +1 -0
- package/dist/tracker/priority.d.ts +19 -0
- package/dist/tracker/priority.d.ts.map +1 -0
- package/dist/tracker/priority.js +40 -0
- package/dist/tracker/priority.js.map +1 -0
- package/dist/util/logger.d.ts +4 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +14 -0
- package/dist/util/logger.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClaudeCodeDriver = void 0;
|
|
4
|
+
const detect_js_1 = require("../detect.js");
|
|
5
|
+
const OVERLAY_PATTERNS = [
|
|
6
|
+
/Allow|Deny/,
|
|
7
|
+
/\[Y\/n\]/i,
|
|
8
|
+
/Do you want to/i,
|
|
9
|
+
/Press Enter to/i,
|
|
10
|
+
/─{10,}/, // CC uses box-drawing chars for dialogs
|
|
11
|
+
];
|
|
12
|
+
// Startup dialogs to auto-dismiss after launch
|
|
13
|
+
const STARTUP_PROMPTS = [
|
|
14
|
+
// "Do you trust the files in this folder?" — Enter to accept (Yes is default)
|
|
15
|
+
{ pattern: /trust.*folder|do you trust/i, keys: ['Enter'], label: 'trust-folder' },
|
|
16
|
+
// Update available / Press enter to continue
|
|
17
|
+
{ pattern: /update available|press enter to continue/i, keys: ['Enter'], label: 'update' },
|
|
18
|
+
// "Bypass Permissions mode" dialog — "No, exit" is selected, Down selects "Yes, I accept"
|
|
19
|
+
// Pattern matches "bypass" alone since tmux may split "Bypass\nPermissions" across lines
|
|
20
|
+
{ pattern: /yes.*i accept|no.*exit.*bypass|bypass/i, keys: ['Down', 'Enter'], label: 'bypass-perms' },
|
|
21
|
+
// "Files with errors are skipped" / settings dialog — "Exit and fix" selected, Down → "Continue without these settings"
|
|
22
|
+
{ pattern: /continue without these settings|files with errors are skipped|invalid settings/i, keys: ['Down', 'Enter'], label: 'settings-error' },
|
|
23
|
+
// Generic "[Y/n]" confirmation — Enter for default yes
|
|
24
|
+
{ pattern: /\[Y\/n\]/i, keys: ['Enter'], label: 'confirm' },
|
|
25
|
+
];
|
|
26
|
+
class ClaudeCodeDriver {
|
|
27
|
+
type = 'claude-code';
|
|
28
|
+
promptChar = '❯';
|
|
29
|
+
spinnerChars = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
30
|
+
buildLaunchCommand(_sessionName, opts) {
|
|
31
|
+
const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
|
|
32
|
+
if (opts?.ccSessionId) {
|
|
33
|
+
// Sub-session: use deterministic session ID, always fresh start for that UUID
|
|
34
|
+
return `${cwd}claude --dangerously-skip-permissions --session-id ${opts.ccSessionId}`;
|
|
35
|
+
}
|
|
36
|
+
if (opts?.fresh) {
|
|
37
|
+
return `${cwd}claude --dangerously-skip-permissions`;
|
|
38
|
+
}
|
|
39
|
+
// Default: resume last conversation; fall back to fresh if no history
|
|
40
|
+
return `${cwd}claude --dangerously-skip-permissions -c || claude --dangerously-skip-permissions`;
|
|
41
|
+
}
|
|
42
|
+
buildResumeCommand(_sessionName, opts) {
|
|
43
|
+
const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
|
|
44
|
+
if (opts?.ccSessionId) {
|
|
45
|
+
// Resume specific session by UUID
|
|
46
|
+
return `${cwd}claude --dangerously-skip-permissions --resume ${opts.ccSessionId}`;
|
|
47
|
+
}
|
|
48
|
+
return this.buildLaunchCommand(_sessionName, opts);
|
|
49
|
+
}
|
|
50
|
+
async postLaunch(capturePane, sendKey) {
|
|
51
|
+
const POLL_INTERVAL_MS = 1_500;
|
|
52
|
+
const MAX_POLLS = 12; // up to 18 seconds total
|
|
53
|
+
for (let i = 0; i < MAX_POLLS; i++) {
|
|
54
|
+
await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
|
|
55
|
+
let lines;
|
|
56
|
+
try {
|
|
57
|
+
lines = await capturePane();
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
continue; // session may not be ready yet
|
|
61
|
+
}
|
|
62
|
+
const screen = lines.join('\n');
|
|
63
|
+
// Check startup prompts FIRST — dialogs contain ❯ in their menu cursors,
|
|
64
|
+
// so checking for idle ❯ before this would cause a false-positive early exit.
|
|
65
|
+
let handled = false;
|
|
66
|
+
for (const { pattern, keys } of STARTUP_PROMPTS) {
|
|
67
|
+
if (pattern.test(screen)) {
|
|
68
|
+
for (const key of keys) {
|
|
69
|
+
await sendKey(key);
|
|
70
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
71
|
+
}
|
|
72
|
+
handled = true;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (handled) {
|
|
77
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
78
|
+
continue; // re-poll — may be more dialogs, or idle prompt
|
|
79
|
+
}
|
|
80
|
+
// No dialog matched — check if agent is idle
|
|
81
|
+
if (screen.includes(this.promptChar))
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
detectStatus(lines) {
|
|
86
|
+
return (0, detect_js_1.detectStatus)(lines, 'claude-code');
|
|
87
|
+
}
|
|
88
|
+
isOverlay(lines) {
|
|
89
|
+
const tail = lines.slice(-5).join('\n');
|
|
90
|
+
return OVERLAY_PATTERNS.some((p) => p.test(tail));
|
|
91
|
+
}
|
|
92
|
+
async captureLastResponse(capturePane, sendKeys, showBuffer, deleteBuffer) {
|
|
93
|
+
// Always local — use /copy for clean output
|
|
94
|
+
try {
|
|
95
|
+
await sendKeys('/copy');
|
|
96
|
+
await new Promise((r) => setTimeout(r, 2000));
|
|
97
|
+
const buf = await showBuffer();
|
|
98
|
+
if (buf.trim()) {
|
|
99
|
+
// Immediately clear the buffer — task 12.15 clipboard cleanup
|
|
100
|
+
await deleteBuffer?.();
|
|
101
|
+
return buf;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// fall through to capture-pane
|
|
106
|
+
}
|
|
107
|
+
const lines = await capturePane();
|
|
108
|
+
return lines.join('\n');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.ClaudeCodeDriver = ClaudeCodeDriver;
|
|
112
|
+
//# sourceMappingURL=claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/agent/drivers/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentDriver, LaunchOptions } from './base.js';
|
|
2
|
+
import type { AgentStatus } from '../detect.js';
|
|
3
|
+
export declare class CodexDriver implements AgentDriver {
|
|
4
|
+
readonly type: "codex";
|
|
5
|
+
readonly promptChar = "\u203A";
|
|
6
|
+
readonly spinnerChars: string[];
|
|
7
|
+
buildLaunchCommand(_sessionName: string, opts?: LaunchOptions): string;
|
|
8
|
+
buildResumeCommand(_sessionName: string, opts?: LaunchOptions): string;
|
|
9
|
+
postLaunch(capturePane: () => Promise<string[]>, sendKey: (key: string) => Promise<void>): Promise<void>;
|
|
10
|
+
detectStatus(lines: string[]): AgentStatus;
|
|
11
|
+
isOverlay(lines: string[]): boolean;
|
|
12
|
+
captureLastResponse(capturePane: () => Promise<string[]>, _sendKeys: (keys: string) => Promise<void>, _showBuffer: () => Promise<string>): Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAahD,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,UAAU,YAAO;IAC1B,QAAQ,CAAC,YAAY,WAA4C;IAEjE,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAatE,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAIhE,UAAU,CACd,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;IAsChB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW;IAI1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAM7B,mBAAmB,CACvB,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC1C,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;CAKnB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CodexDriver = void 0;
|
|
4
|
+
const detect_js_1 = require("../detect.js");
|
|
5
|
+
// Startup prompts to auto-dismiss after launch
|
|
6
|
+
const STARTUP_PROMPTS = [
|
|
7
|
+
// "Update available! X.Y.Z -> A.B.C" — select "Skip until next version" (option 3: Down Down Enter)
|
|
8
|
+
{ pattern: /update available.*->|skip until next version/i, keys: ['Down', 'Down', 'Enter'], label: 'update' },
|
|
9
|
+
];
|
|
10
|
+
class CodexDriver {
|
|
11
|
+
type = 'codex';
|
|
12
|
+
promptChar = '›';
|
|
13
|
+
spinnerChars = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧'];
|
|
14
|
+
buildLaunchCommand(_sessionName, opts) {
|
|
15
|
+
const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
|
|
16
|
+
const modelFlag = opts?.codexModel ? ` -m ${JSON.stringify(opts.codexModel)}` : '';
|
|
17
|
+
if (opts?.codexSessionId) {
|
|
18
|
+
return `${cwd}codex${modelFlag} -s danger-full-access resume ${opts.codexSessionId}`;
|
|
19
|
+
}
|
|
20
|
+
if (opts?.fresh) {
|
|
21
|
+
return `${cwd}codex${modelFlag} -s danger-full-access`;
|
|
22
|
+
}
|
|
23
|
+
// Default: resume last session; fall back to fresh if no history
|
|
24
|
+
return `${cwd}codex${modelFlag} -s danger-full-access resume --last || codex${modelFlag} -s danger-full-access`;
|
|
25
|
+
}
|
|
26
|
+
buildResumeCommand(_sessionName, opts) {
|
|
27
|
+
return this.buildLaunchCommand(_sessionName, opts);
|
|
28
|
+
}
|
|
29
|
+
async postLaunch(capturePane, sendKey) {
|
|
30
|
+
const POLL_INTERVAL_MS = 1_500;
|
|
31
|
+
const MAX_POLLS = 10; // up to 15 seconds
|
|
32
|
+
for (let i = 0; i < MAX_POLLS; i++) {
|
|
33
|
+
await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
|
|
34
|
+
let lines;
|
|
35
|
+
try {
|
|
36
|
+
lines = await capturePane();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const screen = lines.join('\n');
|
|
42
|
+
let handled = false;
|
|
43
|
+
for (const { pattern, keys } of STARTUP_PROMPTS) {
|
|
44
|
+
if (pattern.test(screen)) {
|
|
45
|
+
for (const key of keys) {
|
|
46
|
+
await sendKey(key);
|
|
47
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
48
|
+
}
|
|
49
|
+
handled = true;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (handled) {
|
|
54
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// No dialog — check if agent is at its idle prompt
|
|
58
|
+
if (screen.includes(this.promptChar))
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
detectStatus(lines) {
|
|
63
|
+
return (0, detect_js_1.detectStatus)(lines, 'codex');
|
|
64
|
+
}
|
|
65
|
+
isOverlay(lines) {
|
|
66
|
+
// Codex shows context menu overlays when mid-action
|
|
67
|
+
const tail = lines.slice(-5).join('\n');
|
|
68
|
+
return /\[ESC\]|\[q\]/.test(tail);
|
|
69
|
+
}
|
|
70
|
+
async captureLastResponse(capturePane, _sendKeys, _showBuffer) {
|
|
71
|
+
// Codex has no /copy equivalent — always use capture-pane
|
|
72
|
+
const lines = await capturePane();
|
|
73
|
+
return lines.join('\n');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.CodexDriver = CodexDriver;
|
|
77
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/agent/drivers/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AgentDriver, LaunchOptions, DeleteBufferFn } from './base.js';
|
|
2
|
+
import type { AgentStatus } from '../detect.js';
|
|
3
|
+
export declare class GeminiDriver implements AgentDriver {
|
|
4
|
+
readonly type: "gemini";
|
|
5
|
+
readonly promptChar = ">";
|
|
6
|
+
readonly spinnerChars: string[];
|
|
7
|
+
/**
|
|
8
|
+
* Run gemini once in stream-json mode to obtain a fresh session UUID from
|
|
9
|
+
* the `init` event, then kill the process. The UUID can then be passed to
|
|
10
|
+
* subsequent launches via `--resume <uuid>` so the session is deterministic.
|
|
11
|
+
*
|
|
12
|
+
* Calls are serialized: only one Gemini CLI process runs at a time to avoid
|
|
13
|
+
* contention/timeouts when starting multiple Gemini sub-sessions.
|
|
14
|
+
*/
|
|
15
|
+
resolveSessionId(cwd?: string): Promise<string>;
|
|
16
|
+
private _doResolveSessionId;
|
|
17
|
+
buildLaunchCommand(_sessionName: string, opts?: LaunchOptions): string;
|
|
18
|
+
buildResumeCommand(_sessionName: string, opts?: LaunchOptions): string;
|
|
19
|
+
postLaunch(capturePane: () => Promise<string[]>, sendKey: (key: string) => Promise<void>): Promise<void>;
|
|
20
|
+
detectStatus(lines: string[]): AgentStatus;
|
|
21
|
+
isOverlay(lines: string[]): boolean;
|
|
22
|
+
captureLastResponse(capturePane: () => Promise<string[]>, _sendKeys: (keys: string) => Promise<void>, _showBuffer: () => Promise<string>, _deleteBuffer?: DeleteBufferFn): Promise<string>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=gemini.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA0BhD,qBAAa,YAAa,YAAW,WAAW;IAC9C,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,UAAU,OAAO;IAC1B,QAAQ,CAAC,YAAY,WAAsD;IAE3E;;;;;;;OAOG;IACG,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQrD,OAAO,CAAC,mBAAmB;IA+C3B,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAStE,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAIhE,UAAU,CACd,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;IAqChB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW;IAI1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAK7B,mBAAmB,CACvB,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC1C,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAClC,aAAa,CAAC,EAAE,cAAc,GAC7B,OAAO,CAAC,MAAM,CAAC;CAKnB"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GeminiDriver = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const detect_js_1 = require("../detect.js");
|
|
6
|
+
// Startup prompts to auto-dismiss after launch
|
|
7
|
+
const STARTUP_PROMPTS = [
|
|
8
|
+
// "Do you trust the files in this folder?" — Enter to accept
|
|
9
|
+
{ pattern: /trust.*folder|do you trust/i, keys: ['Enter'], label: 'trust-folder' },
|
|
10
|
+
// Update available
|
|
11
|
+
{ pattern: /update available|press enter to continue/i, keys: ['Enter'], label: 'update' },
|
|
12
|
+
// Generic [Y/n]
|
|
13
|
+
{ pattern: /\[Y\/n\]/i, keys: ['Enter'], label: 'confirm' },
|
|
14
|
+
];
|
|
15
|
+
const OVERLAY_PATTERNS = [
|
|
16
|
+
/Allow|Deny/,
|
|
17
|
+
/\[Y\/n\]/i,
|
|
18
|
+
/Do you want to/i,
|
|
19
|
+
];
|
|
20
|
+
// Serialize resolveSessionId calls — concurrent Gemini CLI spawns cause timeouts
|
|
21
|
+
let _resolveQueue = Promise.resolve();
|
|
22
|
+
class GeminiDriver {
|
|
23
|
+
type = 'gemini';
|
|
24
|
+
promptChar = '>';
|
|
25
|
+
spinnerChars = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
26
|
+
/**
|
|
27
|
+
* Run gemini once in stream-json mode to obtain a fresh session UUID from
|
|
28
|
+
* the `init` event, then kill the process. The UUID can then be passed to
|
|
29
|
+
* subsequent launches via `--resume <uuid>` so the session is deterministic.
|
|
30
|
+
*
|
|
31
|
+
* Calls are serialized: only one Gemini CLI process runs at a time to avoid
|
|
32
|
+
* contention/timeouts when starting multiple Gemini sub-sessions.
|
|
33
|
+
*/
|
|
34
|
+
async resolveSessionId(cwd) {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
_resolveQueue = _resolveQueue
|
|
37
|
+
.then(() => this._doResolveSessionId(cwd))
|
|
38
|
+
.then(resolve, reject);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
_doResolveSessionId(cwd) {
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
const timeout = setTimeout(() => {
|
|
44
|
+
proc.kill();
|
|
45
|
+
reject(new Error('Gemini session ID discovery timed out'));
|
|
46
|
+
}, 30_000);
|
|
47
|
+
const proc = (0, child_process_1.spawn)('gemini', ['-y', '-p', 'hi', '-o', 'stream-json'], {
|
|
48
|
+
cwd,
|
|
49
|
+
env: { ...process.env },
|
|
50
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
51
|
+
});
|
|
52
|
+
let buf = '';
|
|
53
|
+
proc.stdout.on('data', (chunk) => {
|
|
54
|
+
buf += chunk.toString();
|
|
55
|
+
const lines = buf.split('\n');
|
|
56
|
+
buf = lines.pop() ?? '';
|
|
57
|
+
for (const line of lines) {
|
|
58
|
+
if (!line.trim())
|
|
59
|
+
continue;
|
|
60
|
+
try {
|
|
61
|
+
const event = JSON.parse(line);
|
|
62
|
+
if (event.type === 'init' && event.session_id) {
|
|
63
|
+
clearTimeout(timeout);
|
|
64
|
+
proc.kill();
|
|
65
|
+
resolve(event.session_id);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// not JSON yet, keep buffering
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
proc.on('error', (err) => {
|
|
74
|
+
clearTimeout(timeout);
|
|
75
|
+
reject(err);
|
|
76
|
+
});
|
|
77
|
+
proc.on('close', (code) => {
|
|
78
|
+
clearTimeout(timeout);
|
|
79
|
+
if (code !== null && code !== 0 && code !== null) {
|
|
80
|
+
reject(new Error(`Gemini exited with code ${code} before emitting session_id`));
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
buildLaunchCommand(_sessionName, opts) {
|
|
86
|
+
const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
|
|
87
|
+
if (opts?.geminiSessionId) {
|
|
88
|
+
return `${cwd}gemini --yolo --resume ${opts.geminiSessionId}`;
|
|
89
|
+
}
|
|
90
|
+
// Always launch fresh when no UUID — never use --resume latest
|
|
91
|
+
return `${cwd}gemini --yolo`;
|
|
92
|
+
}
|
|
93
|
+
buildResumeCommand(_sessionName, opts) {
|
|
94
|
+
return this.buildLaunchCommand(_sessionName, opts);
|
|
95
|
+
}
|
|
96
|
+
async postLaunch(capturePane, sendKey) {
|
|
97
|
+
const POLL_INTERVAL_MS = 1_500;
|
|
98
|
+
const MAX_POLLS = 12; // up to 18 seconds
|
|
99
|
+
for (let i = 0; i < MAX_POLLS; i++) {
|
|
100
|
+
await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
|
|
101
|
+
let lines;
|
|
102
|
+
try {
|
|
103
|
+
lines = await capturePane();
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const screen = lines.join('\n');
|
|
109
|
+
let handled = false;
|
|
110
|
+
for (const { pattern, keys } of STARTUP_PROMPTS) {
|
|
111
|
+
if (pattern.test(screen)) {
|
|
112
|
+
for (const key of keys) {
|
|
113
|
+
await sendKey(key);
|
|
114
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
115
|
+
}
|
|
116
|
+
handled = true;
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (handled) {
|
|
121
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (screen.includes(this.promptChar) || screen.includes('>'))
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
detectStatus(lines) {
|
|
129
|
+
return (0, detect_js_1.detectStatus)(lines, 'gemini');
|
|
130
|
+
}
|
|
131
|
+
isOverlay(lines) {
|
|
132
|
+
const tail = lines.slice(-5).join('\n');
|
|
133
|
+
return OVERLAY_PATTERNS.some((p) => p.test(tail));
|
|
134
|
+
}
|
|
135
|
+
async captureLastResponse(capturePane, _sendKeys, _showBuffer, _deleteBuffer) {
|
|
136
|
+
// Gemini has no /copy equivalent — use capture-pane
|
|
137
|
+
const lines = await capturePane();
|
|
138
|
+
return lines.join('\n');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
exports.GeminiDriver = GeminiDriver;
|
|
142
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../src/agent/drivers/gemini.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AgentDriver, LaunchOptions } from './base.js';
|
|
2
|
+
import type { AgentStatus } from '../detect.js';
|
|
3
|
+
export declare class OpenCodeDriver implements AgentDriver {
|
|
4
|
+
readonly type: "opencode";
|
|
5
|
+
readonly promptChar = ">";
|
|
6
|
+
readonly spinnerChars: string[];
|
|
7
|
+
buildLaunchCommand(_sessionName: string, opts?: LaunchOptions): string;
|
|
8
|
+
buildResumeCommand(_sessionName: string, opts?: LaunchOptions): string;
|
|
9
|
+
detectStatus(lines: string[]): AgentStatus;
|
|
10
|
+
isOverlay(lines: string[]): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Ensure the project directory has opencode.json with full permissions.
|
|
13
|
+
* Called before launching the session.
|
|
14
|
+
*/
|
|
15
|
+
ensurePermissions(cwd: string): Promise<void>;
|
|
16
|
+
captureLastResponse(capturePane: () => Promise<string[]>, _sendKeys: (keys: string) => Promise<void>, _showBuffer: () => Promise<string>): Promise<string>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/opencode.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,QAAQ,CAAC,UAAU,OAAO;IAC1B,QAAQ,CAAC,YAAY,WAAyB;IAE9C,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAStE,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAItE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW;IAI1C,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO;IAInC;;;OAGG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7C,mBAAmB,CACvB,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EAC1C,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;CAInB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.OpenCodeDriver = void 0;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const detect_js_1 = require("../detect.js");
|
|
10
|
+
class OpenCodeDriver {
|
|
11
|
+
type = 'opencode';
|
|
12
|
+
promptChar = '>';
|
|
13
|
+
spinnerChars = ['|', '/', '-', '\\'];
|
|
14
|
+
buildLaunchCommand(_sessionName, opts) {
|
|
15
|
+
const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
|
|
16
|
+
if (opts?.fresh) {
|
|
17
|
+
return `${cwd}opencode`;
|
|
18
|
+
}
|
|
19
|
+
// Default: resume last conversation; fall back to fresh if no history
|
|
20
|
+
return `${cwd}opencode -c || opencode`;
|
|
21
|
+
}
|
|
22
|
+
buildResumeCommand(_sessionName, opts) {
|
|
23
|
+
return this.buildLaunchCommand(_sessionName, opts);
|
|
24
|
+
}
|
|
25
|
+
detectStatus(lines) {
|
|
26
|
+
return (0, detect_js_1.detectStatus)(lines, 'opencode');
|
|
27
|
+
}
|
|
28
|
+
isOverlay(lines) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Ensure the project directory has opencode.json with full permissions.
|
|
33
|
+
* Called before launching the session.
|
|
34
|
+
*/
|
|
35
|
+
async ensurePermissions(cwd) {
|
|
36
|
+
const configPath = path_1.default.join(cwd, 'opencode.json');
|
|
37
|
+
try {
|
|
38
|
+
await fs_1.promises.access(configPath);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
await fs_1.promises.writeFile(configPath, JSON.stringify({ permission: { '*': 'allow' } }, null, 2));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async captureLastResponse(capturePane, _sendKeys, _showBuffer) {
|
|
45
|
+
const lines = await capturePane();
|
|
46
|
+
return lines.join('\n');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.OpenCodeDriver = OpenCodeDriver;
|
|
50
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/agent/drivers/opencode.ts"],"names":[],"mappings":";;;;;;AAAA,2BAAoC;AACpC,gDAAwB;AAGxB,4CAA4C;AAE5C,MAAa,cAAc;IAChB,IAAI,GAAG,UAAmB,CAAC;IAC3B,UAAU,GAAG,GAAG,CAAC;IACjB,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAE9C,kBAAkB,CAAC,YAAoB,EAAE,IAAoB;QAC3D,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,OAAO,GAAG,GAAG,UAAU,CAAC;QAC1B,CAAC;QACD,sEAAsE;QACtE,OAAO,GAAG,GAAG,yBAAyB,CAAC;IACzC,CAAC;IAED,kBAAkB,CAAC,YAAoB,EAAE,IAAoB;QAC3D,OAAO,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,YAAY,CAAC,KAAe;QAC1B,OAAO,IAAA,wBAAY,EAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,CAAC,KAAe;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,iBAAiB,CAAC,GAAW;QACjC,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,aAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,aAAE,CAAC,SAAS,CAChB,UAAU,EACV,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,WAAoC,EACpC,SAA0C,EAC1C,WAAkC;QAElC,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AAlDD,wCAkDC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AgentDriver, LaunchOptions } from './base.js';
|
|
2
|
+
import type { AgentStatus } from '../detect.js';
|
|
3
|
+
export declare class ShellDriver implements AgentDriver {
|
|
4
|
+
readonly type: "shell";
|
|
5
|
+
readonly promptChar = "$";
|
|
6
|
+
readonly spinnerChars: string[];
|
|
7
|
+
buildLaunchCommand(_sessionName: string, opts?: LaunchOptions): string;
|
|
8
|
+
buildResumeCommand(sessionName: string, opts?: LaunchOptions): string;
|
|
9
|
+
detectStatus(lines: string[]): AgentStatus;
|
|
10
|
+
isOverlay(_lines: string[]): boolean;
|
|
11
|
+
captureLastResponse(capturePane: () => Promise<string[]>): Promise<string>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/shell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,qBAAa,WAAY,YAAW,WAAW;IAC7C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,UAAU,OAAO;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAM;IAErC,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAQtE,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM;IAIrE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW;IAI1C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO;IAI9B,mBAAmB,CAAC,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAGjF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ShellDriver = void 0;
|
|
4
|
+
const detect_js_1 = require("../detect.js");
|
|
5
|
+
class ShellDriver {
|
|
6
|
+
type = 'shell';
|
|
7
|
+
promptChar = '$';
|
|
8
|
+
spinnerChars = [];
|
|
9
|
+
buildLaunchCommand(_sessionName, opts) {
|
|
10
|
+
const bin = opts?.shellBin
|
|
11
|
+
?? process.env.SHELL
|
|
12
|
+
?? '/bin/bash';
|
|
13
|
+
const cwd = opts?.cwd ? `cd ${JSON.stringify(opts.cwd)} && ` : '';
|
|
14
|
+
return `${cwd}${bin}`;
|
|
15
|
+
}
|
|
16
|
+
buildResumeCommand(sessionName, opts) {
|
|
17
|
+
return this.buildLaunchCommand(sessionName, opts);
|
|
18
|
+
}
|
|
19
|
+
detectStatus(lines) {
|
|
20
|
+
return (0, detect_js_1.detectStatus)(lines, 'shell');
|
|
21
|
+
}
|
|
22
|
+
isOverlay(_lines) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
async captureLastResponse(capturePane) {
|
|
26
|
+
return (await capturePane()).join('\n');
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.ShellDriver = ShellDriver;
|
|
30
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/agent/drivers/shell.ts"],"names":[],"mappings":";;;AAEA,4CAA4C;AAE5C,MAAa,WAAW;IACb,IAAI,GAAG,OAAgB,CAAC;IACxB,UAAU,GAAG,GAAG,CAAC;IACjB,YAAY,GAAa,EAAE,CAAC;IAErC,kBAAkB,CAAC,YAAoB,EAAE,IAAoB;QAC3D,MAAM,GAAG,GAAI,IAA0C,EAAE,QAAQ;eAC5D,OAAO,CAAC,GAAG,CAAC,KAAK;eACjB,WAAW,CAAC;QACjB,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,OAAO,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,kBAAkB,CAAC,WAAmB,EAAE,IAAoB;QAC1D,OAAO,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IAED,YAAY,CAAC,KAAe;QAC1B,OAAO,IAAA,wBAAY,EAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,SAAS,CAAC,MAAgB;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,WAAoC;QAC5D,OAAO,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF;AA5BD,kCA4BC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build a minimal explicit environment for spawning agent tmux sessions.
|
|
3
|
+
* Only pass through safe, non-secret env vars. Never pass secrets to child processes.
|
|
4
|
+
*
|
|
5
|
+
* Agents are spawned with ONLY these env vars — any secrets from the daemon's
|
|
6
|
+
* environment are explicitly excluded.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Build a minimal environment for an agent tmux session.
|
|
10
|
+
*
|
|
11
|
+
* @param agentSpecificVars Agent-specific vars to include (e.g., ANTHROPIC_API_KEY for CC).
|
|
12
|
+
* These must be explicitly opted-in — they are NOT automatically inherited.
|
|
13
|
+
* @returns Environment object safe to pass to `newSession({ env: ... })`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildAgentEnv(agentSpecificVars?: Record<string, string>): Record<string, string>;
|
|
16
|
+
/**
|
|
17
|
+
* Get the agent-specific env vars for a given agent type.
|
|
18
|
+
* Only includes the vars explicitly needed by that agent.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getAgentEnvVars(agentType: 'claude-code' | 'codex' | 'opencode'): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Build agent env from process.env, extracting only the agent-specific API key vars.
|
|
23
|
+
* The caller must ensure these vars are set in process.env before calling this.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildAgentEnvFromProcess(agentType: 'claude-code' | 'codex' | 'opencode'): Record<string, string>;
|
|
26
|
+
//# sourceMappingURL=env-isolation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-isolation.d.ts","sourceRoot":"","sources":["../../src/agent/env-isolation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAiCH;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,iBAAiB,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAuBpG;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,EAAE,CASzF;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,aAAa,GAAG,OAAO,GAAG,UAAU,GAC9C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAOxB"}
|