@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
package/README.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# codedeck
|
|
2
|
+
|
|
3
|
+
Remote control AI coding agents (Claude Code, Codex, OpenCode) via Discord, Telegram, Feishu, web terminal, and native mobile apps.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g codedeck
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Start the daemon
|
|
15
|
+
codedeck start
|
|
16
|
+
|
|
17
|
+
# Bind to Cloudflare central server
|
|
18
|
+
codedeck bind
|
|
19
|
+
|
|
20
|
+
# Check status
|
|
21
|
+
codedeck status
|
|
22
|
+
|
|
23
|
+
# Send a message to an agent session
|
|
24
|
+
codedeck send --session deck_myapp_w1 "fix the auth bug"
|
|
25
|
+
|
|
26
|
+
# Run auto-fix with two agents
|
|
27
|
+
codedeck autofix --project myapp "fix the authentication timeout bug"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Requirements
|
|
31
|
+
|
|
32
|
+
- Node.js >= 20
|
|
33
|
+
- tmux
|
|
34
|
+
- One or more AI agents: Claude Code, Codex, or OpenCode
|
|
35
|
+
|
|
36
|
+
## Documentation
|
|
37
|
+
|
|
38
|
+
See [design.md](openspec/changes/codedeck/design.md) for architecture decisions.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
daemon:
|
|
2
|
+
pollInterval: 2000 # ms between status polls
|
|
3
|
+
signalCheckInterval: 100 # ms to check signal files
|
|
4
|
+
streamFps: 10 # tmux capture FPS when viewers connected
|
|
5
|
+
streamIdleFps: 1 # FPS when no viewers
|
|
6
|
+
maxRestarts: 3 # max restarts before marking error
|
|
7
|
+
restartWindow: 300000 # ms window for restart counting (5 min)
|
|
8
|
+
heartbeatInterval: 30000 # ms WebSocket heartbeat
|
|
9
|
+
reconnectBase: 1000 # ms initial reconnect backoff
|
|
10
|
+
reconnectMax: 60000 # ms max reconnect backoff
|
|
11
|
+
|
|
12
|
+
agents:
|
|
13
|
+
defaultType: claude-code
|
|
14
|
+
supportedTypes:
|
|
15
|
+
- claude-code
|
|
16
|
+
- codex
|
|
17
|
+
- opencode
|
|
18
|
+
|
|
19
|
+
sessions:
|
|
20
|
+
storePath: ~/.codedeck/sessions.json
|
|
21
|
+
signalDir: /tmp/codedeck/signals
|
|
22
|
+
|
|
23
|
+
projects:
|
|
24
|
+
storePath: ~/.codedeck/projects.json
|
|
25
|
+
|
|
26
|
+
autofix:
|
|
27
|
+
defaultCoder: claude-code
|
|
28
|
+
defaultAuditor: codex
|
|
29
|
+
maxDiscussionRounds: 3
|
|
30
|
+
autoMerge: false
|
|
31
|
+
|
|
32
|
+
tracker:
|
|
33
|
+
type: github # github | gitlab
|
|
34
|
+
apiUrl: '' # empty = hosted (github.com / gitlab.com); set for Enterprise/self-hosted
|
|
35
|
+
tokenEnv: TRACKER_TOKEN # env var holding the API token
|
|
36
|
+
repo: '' # GitHub: "owner/repo"; GitLab: leave empty, use projectId
|
|
37
|
+
projectId: '' # GitLab only: numeric ID or "namespace/project-path"
|
|
38
|
+
baseBranch: main # branch to create feature branches from
|
|
39
|
+
|
|
40
|
+
memory:
|
|
41
|
+
claudeMemUrl: ${CLAUDE_MEM_URL:-http://localhost:37777}
|
|
42
|
+
mem0Url: ${MEM0_URL:-http://localhost:37778}
|
|
43
|
+
|
|
44
|
+
server:
|
|
45
|
+
cfWorkerUrl: ${CF_WORKER_URL}
|
|
46
|
+
apiKey: ${CF_API_KEY}
|
|
47
|
+
credentialsPath: ~/.codedeck/server.json
|
|
48
|
+
|
|
49
|
+
log:
|
|
50
|
+
level: info
|
|
51
|
+
pretty: false
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export type CoreCommand = {
|
|
2
|
+
type: 'worker';
|
|
3
|
+
workerId: string;
|
|
4
|
+
message: string;
|
|
5
|
+
} | {
|
|
6
|
+
type: 'brain';
|
|
7
|
+
message: string;
|
|
8
|
+
} | {
|
|
9
|
+
type: 'status';
|
|
10
|
+
args: string[];
|
|
11
|
+
} | {
|
|
12
|
+
type: 'screen';
|
|
13
|
+
args: string[];
|
|
14
|
+
} | {
|
|
15
|
+
type: 'reply';
|
|
16
|
+
message: string;
|
|
17
|
+
} | {
|
|
18
|
+
type: 'ask';
|
|
19
|
+
workerId: string;
|
|
20
|
+
question: string;
|
|
21
|
+
};
|
|
22
|
+
export type ExtensionCommand = {
|
|
23
|
+
type: 'audit';
|
|
24
|
+
workerId: string;
|
|
25
|
+
} | {
|
|
26
|
+
type: 'approve';
|
|
27
|
+
workerId: string;
|
|
28
|
+
} | {
|
|
29
|
+
type: 'reject';
|
|
30
|
+
workerId: string;
|
|
31
|
+
findings: string;
|
|
32
|
+
} | {
|
|
33
|
+
type: 'merge';
|
|
34
|
+
workerId: string;
|
|
35
|
+
} | {
|
|
36
|
+
type: 'custom';
|
|
37
|
+
name: string;
|
|
38
|
+
args: string[];
|
|
39
|
+
};
|
|
40
|
+
export type BrainCommand = CoreCommand | ExtensionCommand;
|
|
41
|
+
export interface BrainDispatcherOpts {
|
|
42
|
+
projectName: string;
|
|
43
|
+
sendToWorker: (workerId: string, message: string) => Promise<void>;
|
|
44
|
+
sendToBrain: (message: string) => Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
type CommandHandler = (args: string[]) => Promise<unknown> | unknown;
|
|
47
|
+
export declare class BrainDispatcher {
|
|
48
|
+
private projectName;
|
|
49
|
+
private sendToWorker;
|
|
50
|
+
private sendToBrain;
|
|
51
|
+
private commandHandlers;
|
|
52
|
+
private autoFixEnabled;
|
|
53
|
+
constructor(opts: BrainDispatcherOpts);
|
|
54
|
+
/** Register a per-command-type handler. Called with parsed args as string array. */
|
|
55
|
+
registerCommand(type: string, handler: CommandHandler): void;
|
|
56
|
+
/** Enable auto-fix extension commands (@audit, @approve, @reject, @merge) */
|
|
57
|
+
registerAutoFixExtensions(): void;
|
|
58
|
+
/** Parse a single line. Returns undefined if not a recognized command. */
|
|
59
|
+
parseLine(line: string): BrainCommand | undefined;
|
|
60
|
+
private _callHandler;
|
|
61
|
+
/** Parse a line, execute built-in routing, and call registered handlers */
|
|
62
|
+
dispatch(line: string): Promise<void>;
|
|
63
|
+
/** Dispatch all @commands found in multi-line screen output */
|
|
64
|
+
dispatchAll(screenText: string): Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=brain-dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-dispatcher.d.ts","sourceRoot":"","sources":["../../src/agent/brain-dispatcher.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErD,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,gBAAgB,CAAC;AAE1D,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,KAAK,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAErE,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAuD;IAC3E,OAAO,CAAC,WAAW,CAAqC;IACxD,OAAO,CAAC,eAAe,CAA0C;IACjE,OAAO,CAAC,cAAc,CAAS;gBAEnB,IAAI,EAAE,mBAAmB;IAMrC,oFAAoF;IACpF,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAI5D,6EAA6E;IAC7E,yBAAyB,IAAI,IAAI;IAIjC,0EAA0E;IAC1E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAwFjD,OAAO,CAAC,YAAY;IAKpB,2EAA2E;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB3C,+DAA+D;IACzD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMrD"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BrainDispatcher = void 0;
|
|
4
|
+
class BrainDispatcher {
|
|
5
|
+
projectName;
|
|
6
|
+
sendToWorker;
|
|
7
|
+
sendToBrain;
|
|
8
|
+
commandHandlers = new Map();
|
|
9
|
+
autoFixEnabled = false;
|
|
10
|
+
constructor(opts) {
|
|
11
|
+
this.projectName = opts.projectName;
|
|
12
|
+
this.sendToWorker = opts.sendToWorker;
|
|
13
|
+
this.sendToBrain = opts.sendToBrain;
|
|
14
|
+
}
|
|
15
|
+
/** Register a per-command-type handler. Called with parsed args as string array. */
|
|
16
|
+
registerCommand(type, handler) {
|
|
17
|
+
this.commandHandlers.set(type, handler);
|
|
18
|
+
}
|
|
19
|
+
/** Enable auto-fix extension commands (@audit, @approve, @reject, @merge) */
|
|
20
|
+
registerAutoFixExtensions() {
|
|
21
|
+
this.autoFixEnabled = true;
|
|
22
|
+
}
|
|
23
|
+
/** Parse a single line. Returns undefined if not a recognized command. */
|
|
24
|
+
parseLine(line) {
|
|
25
|
+
const trimmed = line.trim();
|
|
26
|
+
if (!trimmed.startsWith('@'))
|
|
27
|
+
return undefined;
|
|
28
|
+
let m;
|
|
29
|
+
// @w<N> <message>
|
|
30
|
+
m = trimmed.match(/^@w(\d+)\s+(.+)$/is);
|
|
31
|
+
if (m) {
|
|
32
|
+
this._callHandler('worker', [`w${m[1]}`, m[2].trim()]);
|
|
33
|
+
return { type: 'worker', workerId: `w${m[1]}`, message: m[2].trim() };
|
|
34
|
+
}
|
|
35
|
+
// @brain <message>
|
|
36
|
+
m = trimmed.match(/^@brain\s+(.+)$/is);
|
|
37
|
+
if (m) {
|
|
38
|
+
this._callHandler('brain', [m[1].trim()]);
|
|
39
|
+
return { type: 'brain', message: m[1].trim() };
|
|
40
|
+
}
|
|
41
|
+
// @status
|
|
42
|
+
if (/^@status\s*$/i.test(trimmed)) {
|
|
43
|
+
this._callHandler('status', []);
|
|
44
|
+
return { type: 'status', args: [] };
|
|
45
|
+
}
|
|
46
|
+
// @screen w<N>
|
|
47
|
+
m = trimmed.match(/^@screen\s+(w\d+)\s*$/i);
|
|
48
|
+
if (m) {
|
|
49
|
+
this._callHandler('screen', [m[1]]);
|
|
50
|
+
return { type: 'screen', args: [m[1]] };
|
|
51
|
+
}
|
|
52
|
+
// @reply <message>
|
|
53
|
+
m = trimmed.match(/^@reply\s+(.+)$/is);
|
|
54
|
+
if (m) {
|
|
55
|
+
this._callHandler('reply', [m[1].trim()]);
|
|
56
|
+
return { type: 'reply', message: m[1].trim() };
|
|
57
|
+
}
|
|
58
|
+
// @ask w<N> <question>
|
|
59
|
+
m = trimmed.match(/^@ask\s+(w\d+)\s+(.+)$/is);
|
|
60
|
+
if (m) {
|
|
61
|
+
this._callHandler('ask', [m[1], m[2].trim()]);
|
|
62
|
+
return { type: 'ask', workerId: m[1], question: m[2].trim() };
|
|
63
|
+
}
|
|
64
|
+
// Auto-fix extension commands
|
|
65
|
+
if (this.autoFixEnabled) {
|
|
66
|
+
m = trimmed.match(/^@audit\s+(w\d+)\s*$/i);
|
|
67
|
+
if (m) {
|
|
68
|
+
this._callHandler('audit', [m[1]]);
|
|
69
|
+
return { type: 'audit', workerId: m[1] };
|
|
70
|
+
}
|
|
71
|
+
m = trimmed.match(/^@approve\s+(w\d+)\s*$/i);
|
|
72
|
+
if (m) {
|
|
73
|
+
this._callHandler('approve', [m[1]]);
|
|
74
|
+
return { type: 'approve', workerId: m[1] };
|
|
75
|
+
}
|
|
76
|
+
m = trimmed.match(/^@reject\s+(w\d+)\s+(.+)$/is);
|
|
77
|
+
if (m) {
|
|
78
|
+
this._callHandler('reject', [m[1], m[2].trim()]);
|
|
79
|
+
return { type: 'reject', workerId: m[1], findings: m[2].trim() };
|
|
80
|
+
}
|
|
81
|
+
m = trimmed.match(/^@merge\s+(w\d+)\s*$/i);
|
|
82
|
+
if (m) {
|
|
83
|
+
this._callHandler('merge', [m[1]]);
|
|
84
|
+
return { type: 'merge', workerId: m[1] };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Custom registered commands: @<name> [args...]
|
|
88
|
+
for (const [name] of this.commandHandlers) {
|
|
89
|
+
const pattern = new RegExp(`^@${name}(?:\\s+(.+))?$`, 'is');
|
|
90
|
+
m = trimmed.match(pattern);
|
|
91
|
+
if (m) {
|
|
92
|
+
const args = m[1] ? m[1].trim().split(/\s+/) : [];
|
|
93
|
+
this._callHandler(name, args);
|
|
94
|
+
return { type: 'custom', name, args };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
_callHandler(type, args) {
|
|
100
|
+
const handler = this.commandHandlers.get(type);
|
|
101
|
+
if (handler)
|
|
102
|
+
void Promise.resolve(handler(args));
|
|
103
|
+
}
|
|
104
|
+
/** Parse a line, execute built-in routing, and call registered handlers */
|
|
105
|
+
async dispatch(line) {
|
|
106
|
+
const trimmed = line.trim();
|
|
107
|
+
if (!trimmed.startsWith('@'))
|
|
108
|
+
return;
|
|
109
|
+
const cmd = this.parseLine(trimmed);
|
|
110
|
+
if (!cmd)
|
|
111
|
+
return;
|
|
112
|
+
switch (cmd.type) {
|
|
113
|
+
case 'worker':
|
|
114
|
+
await this.sendToWorker(cmd.workerId, cmd.message);
|
|
115
|
+
break;
|
|
116
|
+
case 'brain':
|
|
117
|
+
await this.sendToBrain(cmd.message);
|
|
118
|
+
break;
|
|
119
|
+
case 'ask':
|
|
120
|
+
await this.sendToWorker(cmd.workerId, cmd.question);
|
|
121
|
+
break;
|
|
122
|
+
case 'reply':
|
|
123
|
+
await this.sendToBrain(cmd.message);
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Dispatch all @commands found in multi-line screen output */
|
|
128
|
+
async dispatchAll(screenText) {
|
|
129
|
+
const lines = screenText.split('\n');
|
|
130
|
+
for (const line of lines) {
|
|
131
|
+
await this.dispatch(line);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.BrainDispatcher = BrainDispatcher;
|
|
136
|
+
//# sourceMappingURL=brain-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-dispatcher.js","sourceRoot":"","sources":["../../src/agent/brain-dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port of cc_detect.py — multi-sample status detection for CC, Codex, OpenCode.
|
|
3
|
+
*
|
|
4
|
+
* Detection order: signal file (instant) → multi-sample polling (fallback).
|
|
5
|
+
* Status: 'idle' | 'streaming' | 'thinking' | 'tool_running' | 'permission' | 'unknown'
|
|
6
|
+
*/
|
|
7
|
+
export type AgentStatus = 'idle' | 'streaming' | 'thinking' | 'tool_running' | 'permission' | 'unknown';
|
|
8
|
+
export type AgentType = 'claude-code' | 'codex' | 'opencode' | 'shell' | 'script' | 'gemini';
|
|
9
|
+
/** Detect agent status from a captured pane snapshot. */
|
|
10
|
+
export declare function detectStatus(lines: string[], agentType: AgentType): AgentStatus;
|
|
11
|
+
export interface MultiSampleOptions {
|
|
12
|
+
samples?: number;
|
|
13
|
+
intervalMs?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Multi-sample detection: poll N times and return the most common status.
|
|
17
|
+
* Handles timing jitter — a single 'unknown' doesn't override a stable 'idle'.
|
|
18
|
+
*/
|
|
19
|
+
export declare function detectStatusMulti(captureLines: () => Promise<string[]>, agentType: AgentType, opts?: MultiSampleOptions): Promise<AgentStatus>;
|
|
20
|
+
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/agent/detect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,WAAW,GACX,UAAU,GACV,cAAc,GACd,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AA6G7F,yDAAyD;AACzD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,SAAS,GACnB,WAAW,CAsDb;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACrC,SAAS,EAAE,SAAS,EACpB,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC,WAAW,CAAC,CAiCtB"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Port of cc_detect.py — multi-sample status detection for CC, Codex, OpenCode.
|
|
4
|
+
*
|
|
5
|
+
* Detection order: signal file (instant) → multi-sample polling (fallback).
|
|
6
|
+
* Status: 'idle' | 'streaming' | 'thinking' | 'tool_running' | 'permission' | 'unknown'
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.detectStatus = detectStatus;
|
|
10
|
+
exports.detectStatusMulti = detectStatusMulti;
|
|
11
|
+
// ─── Claude Code patterns ─────────────────────────────────────────────────────
|
|
12
|
+
const CC_IDLE_PATTERNS = [
|
|
13
|
+
/❯\s*$/m, // ❯ prompt
|
|
14
|
+
/✓\s*$/m, // completion check
|
|
15
|
+
];
|
|
16
|
+
const CC_SPINNER_CHARS = [
|
|
17
|
+
'⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏', // braille
|
|
18
|
+
];
|
|
19
|
+
const CC_THINKING_PATTERNS = [
|
|
20
|
+
/\bThinking\b/i,
|
|
21
|
+
/\bAnalyz/i,
|
|
22
|
+
];
|
|
23
|
+
const CC_TOOL_PATTERNS = [
|
|
24
|
+
/\bRunning\b/i,
|
|
25
|
+
/\bExecuting\b/i,
|
|
26
|
+
/ToolUse/,
|
|
27
|
+
/Bash\(|Read\(|Write\(|Edit\(/,
|
|
28
|
+
];
|
|
29
|
+
const CC_PERMISSION_PATTERNS = [
|
|
30
|
+
/Allow|Deny/,
|
|
31
|
+
/\[Y\/n\]/i,
|
|
32
|
+
/Do you want to/i,
|
|
33
|
+
];
|
|
34
|
+
// ─── Codex patterns ────────────────────────────────────────────────────────────
|
|
35
|
+
const CODEX_IDLE_PATTERNS = [
|
|
36
|
+
/>\s*$/m, // > prompt
|
|
37
|
+
/›\s*$/m, // › prompt (alternate)
|
|
38
|
+
/context_pct:\s*\d+/, // context indicator (idle state)
|
|
39
|
+
];
|
|
40
|
+
const CODEX_SPINNER_CHARS = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧'];
|
|
41
|
+
const CODEX_THINKING_PATTERNS = [
|
|
42
|
+
/\bthinking\b/i,
|
|
43
|
+
/\breasoning\b/i,
|
|
44
|
+
];
|
|
45
|
+
const CODEX_TOOL_PATTERNS = [
|
|
46
|
+
/shell\(/i,
|
|
47
|
+
/file\(/i,
|
|
48
|
+
];
|
|
49
|
+
// ─── OpenCode patterns ─────────────────────────────────────────────────────────
|
|
50
|
+
const OC_IDLE_PATTERNS = [
|
|
51
|
+
/λ\s*$/m, // λ prompt
|
|
52
|
+
/>\s*$/m, // > prompt (fallback)
|
|
53
|
+
];
|
|
54
|
+
const OC_SPINNER_CHARS = ['|', '/', '-', '\\'];
|
|
55
|
+
const OC_THINKING_PATTERNS = [
|
|
56
|
+
/\bthinking\b/i,
|
|
57
|
+
];
|
|
58
|
+
const OC_TOOL_PATTERNS = [
|
|
59
|
+
/\brun\b/i,
|
|
60
|
+
/\btool\b/i,
|
|
61
|
+
];
|
|
62
|
+
// ─── Gemini CLI patterns ───────────────────────────────────────────────────────
|
|
63
|
+
const GEMINI_IDLE_PATTERNS = [
|
|
64
|
+
/>\s*$/m, // > prompt (primary — confirmed from TUI)
|
|
65
|
+
/❯\s*$/m, // ❯ prompt (fallback)
|
|
66
|
+
];
|
|
67
|
+
const GEMINI_SPINNER_CHARS = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
68
|
+
const GEMINI_THINKING_PATTERNS = [
|
|
69
|
+
/\bThinking\b/i,
|
|
70
|
+
/\bGenerating\b/i,
|
|
71
|
+
];
|
|
72
|
+
const GEMINI_TOOL_PATTERNS = [
|
|
73
|
+
/\bRunning\b/i,
|
|
74
|
+
/\bExecuting\b/i,
|
|
75
|
+
/tool_use/i,
|
|
76
|
+
];
|
|
77
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
78
|
+
function hasSpinner(lines, spinners) {
|
|
79
|
+
// Match spinner chars only when they appear at line boundaries or surrounded by spaces
|
|
80
|
+
// to avoid false positives from hyphens in words like "my-project"
|
|
81
|
+
const lastFew = lines.slice(-5).join('\n');
|
|
82
|
+
return spinners.some((s) => {
|
|
83
|
+
// For single ASCII chars that could appear in words, require word boundary context
|
|
84
|
+
if (s.length === 1 && /[-/\\|]/.test(s)) {
|
|
85
|
+
const escaped = s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
86
|
+
return new RegExp(`(?:^|\\s)${escaped}(?:\\s|$)`, 'm').test(lastFew);
|
|
87
|
+
}
|
|
88
|
+
return lastFew.includes(s);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function matchesAny(text, patterns) {
|
|
92
|
+
return patterns.some((p) => p.test(text));
|
|
93
|
+
}
|
|
94
|
+
/** Detect agent status from a captured pane snapshot. */
|
|
95
|
+
function detectStatus(lines, agentType) {
|
|
96
|
+
const text = lines.join('\n');
|
|
97
|
+
const tail = lines.slice(-10).join('\n');
|
|
98
|
+
switch (agentType) {
|
|
99
|
+
case 'claude-code':
|
|
100
|
+
if (matchesAny(tail, CC_PERMISSION_PATTERNS))
|
|
101
|
+
return 'permission';
|
|
102
|
+
if (matchesAny(tail, CC_IDLE_PATTERNS) && !hasSpinner(lines, CC_SPINNER_CHARS))
|
|
103
|
+
return 'idle';
|
|
104
|
+
if (matchesAny(text, CC_TOOL_PATTERNS))
|
|
105
|
+
return 'tool_running';
|
|
106
|
+
if (hasSpinner(lines, CC_SPINNER_CHARS)) {
|
|
107
|
+
if (matchesAny(text, CC_THINKING_PATTERNS))
|
|
108
|
+
return 'thinking';
|
|
109
|
+
return 'streaming';
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
case 'codex':
|
|
113
|
+
if (matchesAny(tail, CODEX_IDLE_PATTERNS) && !hasSpinner(lines, CODEX_SPINNER_CHARS))
|
|
114
|
+
return 'idle';
|
|
115
|
+
if (matchesAny(text, CODEX_TOOL_PATTERNS))
|
|
116
|
+
return 'tool_running';
|
|
117
|
+
if (hasSpinner(lines, CODEX_SPINNER_CHARS)) {
|
|
118
|
+
if (matchesAny(text, CODEX_THINKING_PATTERNS))
|
|
119
|
+
return 'thinking';
|
|
120
|
+
return 'streaming';
|
|
121
|
+
}
|
|
122
|
+
break;
|
|
123
|
+
case 'opencode':
|
|
124
|
+
if (matchesAny(tail, OC_IDLE_PATTERNS) && !hasSpinner(lines, OC_SPINNER_CHARS))
|
|
125
|
+
return 'idle';
|
|
126
|
+
if (matchesAny(text, OC_TOOL_PATTERNS))
|
|
127
|
+
return 'tool_running';
|
|
128
|
+
if (hasSpinner(lines, OC_SPINNER_CHARS)) {
|
|
129
|
+
if (matchesAny(text, OC_THINKING_PATTERNS))
|
|
130
|
+
return 'thinking';
|
|
131
|
+
return 'streaming';
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
134
|
+
case 'gemini':
|
|
135
|
+
if (matchesAny(tail, GEMINI_IDLE_PATTERNS) && !hasSpinner(lines, GEMINI_SPINNER_CHARS))
|
|
136
|
+
return 'idle';
|
|
137
|
+
if (matchesAny(text, GEMINI_TOOL_PATTERNS))
|
|
138
|
+
return 'tool_running';
|
|
139
|
+
if (hasSpinner(lines, GEMINI_SPINNER_CHARS)) {
|
|
140
|
+
if (matchesAny(text, GEMINI_THINKING_PATTERNS))
|
|
141
|
+
return 'thinking';
|
|
142
|
+
return 'streaming';
|
|
143
|
+
}
|
|
144
|
+
break;
|
|
145
|
+
case 'shell':
|
|
146
|
+
// Shell idle: last non-empty line ends with a common prompt char
|
|
147
|
+
if (/[$%›>#]\s*$/.test(tail.trimEnd()))
|
|
148
|
+
return 'idle';
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
// No active signals (no spinner, no tool output) → assume idle
|
|
152
|
+
return 'idle';
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Multi-sample detection: poll N times and return the most common status.
|
|
156
|
+
* Handles timing jitter — a single 'unknown' doesn't override a stable 'idle'.
|
|
157
|
+
*/
|
|
158
|
+
async function detectStatusMulti(captureLines, agentType, opts) {
|
|
159
|
+
const samples = opts?.samples ?? 3;
|
|
160
|
+
const intervalMs = opts?.intervalMs ?? 500;
|
|
161
|
+
const results = [];
|
|
162
|
+
for (let i = 0; i < samples; i++) {
|
|
163
|
+
if (i > 0)
|
|
164
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
165
|
+
const lines = await captureLines();
|
|
166
|
+
results.push(detectStatus(lines, agentType));
|
|
167
|
+
}
|
|
168
|
+
// Count frequencies
|
|
169
|
+
const freq = new Map();
|
|
170
|
+
for (const s of results)
|
|
171
|
+
freq.set(s, (freq.get(s) ?? 0) + 1);
|
|
172
|
+
// Most common wins; ties broken by priority: idle > streaming > thinking > tool_running > permission > unknown
|
|
173
|
+
const priority = [
|
|
174
|
+
'idle', 'streaming', 'thinking', 'tool_running', 'permission', 'unknown',
|
|
175
|
+
];
|
|
176
|
+
let best = 'unknown';
|
|
177
|
+
let bestCount = 0;
|
|
178
|
+
for (const status of priority) {
|
|
179
|
+
const count = freq.get(status) ?? 0;
|
|
180
|
+
if (count > bestCount) {
|
|
181
|
+
bestCount = count;
|
|
182
|
+
best = status;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return best;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/agent/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { AgentStatus, AgentType } from '../detect.js';
|
|
2
|
+
export type DeleteBufferFn = () => Promise<void>;
|
|
3
|
+
export interface LaunchOptions {
|
|
4
|
+
cwd?: string;
|
|
5
|
+
/** When true, start a fresh session without resuming the last conversation. */
|
|
6
|
+
fresh?: boolean;
|
|
7
|
+
/** CC session UUID for --session-id / --resume (CC sub-sessions only) */
|
|
8
|
+
ccSessionId?: string;
|
|
9
|
+
/** Codex session UUID for `codex resume <UUID>`. */
|
|
10
|
+
codexSessionId?: string;
|
|
11
|
+
/** Codex model override — passed as `-m MODEL` flag on launch. */
|
|
12
|
+
codexModel?: string;
|
|
13
|
+
/** Gemini session UUID for `gemini --resume <UUID>`. */
|
|
14
|
+
geminiSessionId?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface AgentDriver {
|
|
17
|
+
readonly type: AgentType;
|
|
18
|
+
/** Primary idle prompt character(s) */
|
|
19
|
+
readonly promptChar: string;
|
|
20
|
+
/** Spinner characters used while active */
|
|
21
|
+
readonly spinnerChars: string[];
|
|
22
|
+
/** Build the shell command to launch the agent (fresh start). */
|
|
23
|
+
buildLaunchCommand(sessionName: string, opts?: LaunchOptions): string;
|
|
24
|
+
/**
|
|
25
|
+
* Build the shell command to resume the most recent session.
|
|
26
|
+
* Returns null if this agent does not support resume.
|
|
27
|
+
*/
|
|
28
|
+
buildResumeCommand(sessionName: string, opts?: LaunchOptions): string | null;
|
|
29
|
+
/**
|
|
30
|
+
* Detect the current status from captured pane lines.
|
|
31
|
+
* May use agent-specific heuristics on top of the shared detect.ts logic.
|
|
32
|
+
*/
|
|
33
|
+
detectStatus(lines: string[]): AgentStatus;
|
|
34
|
+
/**
|
|
35
|
+
* Returns true if the pane is currently showing an overlay (e.g. CC permission dialog,
|
|
36
|
+
* Codex context menu). When true, the agent is not idle.
|
|
37
|
+
*/
|
|
38
|
+
isOverlay(lines: string[]): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Optional: Called after session launch to auto-dismiss startup prompts
|
|
41
|
+
* (trust folder, settings errors, update dialogs, etc.).
|
|
42
|
+
* Should return once the agent is ready (idle prompt visible) or after timeout.
|
|
43
|
+
*/
|
|
44
|
+
postLaunch?(capturePane: () => Promise<string[]>, sendKey: (key: string) => Promise<void>): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Capture the last agent response cleanly.
|
|
47
|
+
* CC: send /copy and read tmux buffer. Others: use capture-pane.
|
|
48
|
+
* @param capturePane - function to get current pane lines
|
|
49
|
+
* @param sendKeys - function to send keys to the session
|
|
50
|
+
* @param showBuffer - function to read tmux paste buffer
|
|
51
|
+
*/
|
|
52
|
+
/**
|
|
53
|
+
* @param deleteBuffer - optional fn to clear tmux buffer after reading (task 12.15 clipboard cleanup)
|
|
54
|
+
*/
|
|
55
|
+
captureLastResponse(capturePane: () => Promise<string[]>, sendKeys: (keys: string) => Promise<void>, showBuffer: () => Promise<string>, deleteBuffer?: DeleteBufferFn): Promise<string>;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,uCAAuC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2CAA2C;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;IAEhC,iEAAiE;IACjE,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IAEtE;;;OAGG;IACH,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAAC;IAE7E;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC;IAE3C;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEpC;;;;OAIG;IACH,UAAU,CAAC,CACT,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,CAAC;IAEjB;;;;;;OAMG;IACH;;OAEG;IACH,mBAAmB,CACjB,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,EACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EACzC,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EACjC,YAAY,CAAC,EAAE,cAAc,GAC5B,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/agent/drivers/base.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AgentDriver, LaunchOptions, DeleteBufferFn } from './base.js';
|
|
2
|
+
import type { AgentStatus } from '../detect.js';
|
|
3
|
+
export declare class ClaudeCodeDriver implements AgentDriver {
|
|
4
|
+
readonly type: "claude-code";
|
|
5
|
+
readonly promptChar = "\u276F";
|
|
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>, deleteBuffer?: DeleteBufferFn): Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/agent/drivers/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA8BhD,qBAAa,gBAAiB,YAAW,WAAW;IAClD,QAAQ,CAAC,IAAI,EAAG,aAAa,CAAU;IACvC,QAAQ,CAAC,UAAU,YAAO;IAC1B,QAAQ,CAAC,YAAY,WAAsD;IAE3E,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;IAShE,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;IAwChB,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,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EACzC,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EACjC,YAAY,CAAC,EAAE,cAAc,GAC5B,OAAO,CAAC,MAAM,CAAC;CAiBnB"}
|