@indianic/dialout 1.1.2 → 1.2.1
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 +425 -24
- package/bin/AGENTS.md +44 -0
- package/bin/devdash-agent.js +2 -0
- package/dist/ai-adapters/claude.d.ts +3 -0
- package/dist/ai-adapters/claude.d.ts.map +1 -0
- package/dist/ai-adapters/claude.js +98 -0
- package/dist/ai-adapters/claude.js.map +1 -0
- package/dist/ai-adapters/codex.d.ts +3 -0
- package/dist/ai-adapters/codex.d.ts.map +1 -0
- package/dist/ai-adapters/codex.js +147 -0
- package/dist/ai-adapters/codex.js.map +1 -0
- package/dist/ai-adapters/grok.d.ts +3 -0
- package/dist/ai-adapters/grok.d.ts.map +1 -0
- package/dist/ai-adapters/grok.js +164 -0
- package/dist/ai-adapters/grok.js.map +1 -0
- package/dist/ai-adapters/index.d.ts +5 -0
- package/dist/ai-adapters/index.d.ts.map +1 -0
- package/dist/ai-adapters/index.js +30 -0
- package/dist/ai-adapters/index.js.map +1 -0
- package/dist/ai-adapters/types.d.ts +3 -0
- package/dist/ai-adapters/types.d.ts.map +1 -0
- package/dist/ai-adapters/types.js +7 -0
- package/dist/ai-adapters/types.js.map +1 -0
- package/dist/ai-capabilities/claude.d.ts +4 -0
- package/dist/ai-capabilities/claude.d.ts.map +1 -0
- package/dist/ai-capabilities/claude.js +174 -0
- package/dist/ai-capabilities/claude.js.map +1 -0
- package/dist/ai-capabilities/describe.d.ts +2 -0
- package/dist/ai-capabilities/describe.d.ts.map +1 -0
- package/dist/ai-capabilities/describe.js +31 -0
- package/dist/ai-capabilities/describe.js.map +1 -0
- package/dist/ai-capabilities/fsdeps.d.ts +3 -0
- package/dist/ai-capabilities/fsdeps.d.ts.map +1 -0
- package/dist/ai-capabilities/fsdeps.js +71 -0
- package/dist/ai-capabilities/fsdeps.js.map +1 -0
- package/dist/ai-capabilities/grok.d.ts +5 -0
- package/dist/ai-capabilities/grok.d.ts.map +1 -0
- package/dist/ai-capabilities/grok.js +145 -0
- package/dist/ai-capabilities/grok.js.map +1 -0
- package/dist/ai-capabilities/index.d.ts +4 -0
- package/dist/ai-capabilities/index.d.ts.map +1 -0
- package/dist/ai-capabilities/index.js +94 -0
- package/dist/ai-capabilities/index.js.map +1 -0
- package/dist/ai-capabilities/redact.d.ts +2 -0
- package/dist/ai-capabilities/redact.d.ts.map +1 -0
- package/dist/ai-capabilities/redact.js +27 -0
- package/dist/ai-capabilities/redact.js.map +1 -0
- package/dist/ai-capabilities/types.d.ts +11 -0
- package/dist/ai-capabilities/types.d.ts.map +1 -0
- package/dist/ai-capabilities/types.js +3 -0
- package/dist/ai-capabilities/types.js.map +1 -0
- package/dist/ai-launch.d.ts +35 -0
- package/dist/ai-launch.d.ts.map +1 -0
- package/dist/ai-launch.js +211 -0
- package/dist/ai-launch.js.map +1 -0
- package/dist/ai-session-detector.d.ts +19 -0
- package/dist/ai-session-detector.d.ts.map +1 -0
- package/dist/ai-session-detector.js +79 -0
- package/dist/ai-session-detector.js.map +1 -0
- package/dist/ai-sessions.d.ts +36 -0
- package/dist/ai-sessions.d.ts.map +1 -0
- package/dist/ai-sessions.js +309 -0
- package/dist/ai-sessions.js.map +1 -0
- package/dist/ai-status.d.ts +6 -0
- package/dist/ai-status.d.ts.map +1 -0
- package/dist/ai-status.js +40 -0
- package/dist/ai-status.js.map +1 -0
- package/dist/ai-transcript-locator.d.ts +35 -0
- package/dist/ai-transcript-locator.d.ts.map +1 -0
- package/dist/ai-transcript-locator.js +268 -0
- package/dist/ai-transcript-locator.js.map +1 -0
- package/dist/ai-transcript-tail.d.ts +17 -0
- package/dist/ai-transcript-tail.d.ts.map +1 -0
- package/dist/ai-transcript-tail.js +120 -0
- package/dist/ai-transcript-tail.js.map +1 -0
- package/dist/checklist.d.ts +20 -0
- package/dist/checklist.d.ts.map +1 -0
- package/dist/checklist.js +51 -0
- package/dist/checklist.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1427 -0
- package/dist/cli.js.map +1 -0
- package/dist/command-runner.d.ts +15 -0
- package/dist/command-runner.d.ts.map +1 -0
- package/dist/command-runner.js +84 -0
- package/dist/command-runner.js.map +1 -0
- package/dist/config.d.ts +41 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +152 -0
- package/dist/config.js.map +1 -0
- package/dist/cowork.d.ts +26 -0
- package/dist/cowork.d.ts.map +1 -0
- package/dist/cowork.js +370 -0
- package/dist/cowork.js.map +1 -0
- package/dist/fs-browser.d.ts +6 -0
- package/dist/fs-browser.d.ts.map +1 -0
- package/dist/fs-browser.js +61 -0
- package/dist/fs-browser.js.map +1 -0
- package/dist/has-command.d.ts +12 -0
- package/dist/has-command.d.ts.map +1 -0
- package/dist/has-command.js +24 -0
- package/dist/has-command.js.map +1 -0
- package/dist/heartbeat.d.ts +7 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +50 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/port-scanner.d.ts +4 -0
- package/dist/port-scanner.d.ts.map +1 -0
- package/dist/port-scanner.js +75 -0
- package/dist/port-scanner.js.map +1 -0
- package/dist/project-scanner.d.ts +15 -0
- package/dist/project-scanner.d.ts.map +1 -0
- package/dist/project-scanner.js +333 -0
- package/dist/project-scanner.js.map +1 -0
- package/dist/pty-manager.d.ts +28 -0
- package/dist/pty-manager.d.ts.map +1 -0
- package/dist/pty-manager.js +506 -0
- package/dist/pty-manager.js.map +1 -0
- package/dist/service-installer.d.ts +95 -0
- package/dist/service-installer.d.ts.map +1 -0
- package/dist/service-installer.js +911 -0
- package/dist/service-installer.js.map +1 -0
- package/dist/single-instance.d.ts +20 -0
- package/dist/single-instance.d.ts.map +1 -0
- package/dist/single-instance.js +151 -0
- package/dist/single-instance.js.map +1 -0
- package/dist/ssh-local-network.d.ts +26 -0
- package/dist/ssh-local-network.d.ts.map +1 -0
- package/dist/ssh-local-network.js +169 -0
- package/dist/ssh-local-network.js.map +1 -0
- package/dist/terminal-detect.d.ts +52 -0
- package/dist/terminal-detect.d.ts.map +1 -0
- package/dist/terminal-detect.js +147 -0
- package/dist/terminal-detect.js.map +1 -0
- package/dist/terminal-markers.d.ts +52 -0
- package/dist/terminal-markers.d.ts.map +1 -0
- package/dist/terminal-markers.js +174 -0
- package/dist/terminal-markers.js.map +1 -0
- package/dist/tmux-manager.d.ts +35 -0
- package/dist/tmux-manager.d.ts.map +1 -0
- package/dist/tmux-manager.js +274 -0
- package/dist/tmux-manager.js.map +1 -0
- package/dist/update-check.d.ts +3 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +202 -0
- package/dist/update-check.js.map +1 -0
- package/dist/websocket.d.ts +8 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +472 -0
- package/dist/websocket.js.map +1 -0
- package/node_modules/@dialout/shared/README.md +16 -0
- package/node_modules/@dialout/shared/dist/ai-chat-prefs.d.ts +8 -0
- package/node_modules/@dialout/shared/dist/ai-chat-prefs.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/ai-chat-prefs.js +41 -0
- package/node_modules/@dialout/shared/dist/capabilities.d.ts +25 -0
- package/node_modules/@dialout/shared/dist/capabilities.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/capabilities.js +2 -0
- package/node_modules/@dialout/shared/dist/chat-blocks.d.ts +33 -0
- package/node_modules/@dialout/shared/dist/chat-blocks.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/chat-blocks.js +61 -0
- package/node_modules/@dialout/shared/dist/command-filter.d.ts +4 -0
- package/node_modules/@dialout/shared/dist/command-filter.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/command-filter.js +49 -0
- package/node_modules/@dialout/shared/dist/composer-behaviour.d.ts +6 -0
- package/node_modules/@dialout/shared/dist/composer-behaviour.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/composer-behaviour.js +24 -0
- package/node_modules/@dialout/shared/dist/events.d.ts +37 -0
- package/node_modules/@dialout/shared/dist/events.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/events.js +13 -0
- package/node_modules/@dialout/shared/dist/index.d.ts +21 -0
- package/node_modules/@dialout/shared/dist/index.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/index.js +37 -0
- package/node_modules/@dialout/shared/dist/kinds.d.ts +2 -0
- package/node_modules/@dialout/shared/dist/kinds.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/kinds.js +2 -0
- package/node_modules/@dialout/shared/dist/notify.d.ts +3 -0
- package/node_modules/@dialout/shared/dist/notify.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/notify.js +31 -0
- package/node_modules/@dialout/shared/dist/permission.d.ts +4 -0
- package/node_modules/@dialout/shared/dist/permission.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/permission.js +8 -0
- package/node_modules/@dialout/shared/dist/scroll-pin.d.ts +3 -0
- package/node_modules/@dialout/shared/dist/scroll-pin.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/scroll-pin.js +11 -0
- package/node_modules/@dialout/shared/dist/session.d.ts +19 -0
- package/node_modules/@dialout/shared/dist/session.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/session.js +6 -0
- package/node_modules/@dialout/shared/dist/terminal-name.d.ts +25 -0
- package/node_modules/@dialout/shared/dist/terminal-name.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/terminal-name.js +63 -0
- package/node_modules/@dialout/shared/dist/tool-appearance.d.ts +9 -0
- package/node_modules/@dialout/shared/dist/tool-appearance.d.ts.map +1 -0
- package/node_modules/@dialout/shared/dist/tool-appearance.js +30 -0
- package/node_modules/@dialout/shared/package.json +37 -0
- package/node_modules/@dialout/shared/src/ai-chat-prefs.test.ts +40 -0
- package/node_modules/@dialout/shared/src/ai-chat-prefs.ts +39 -0
- package/node_modules/@dialout/shared/src/capabilities.ts +30 -0
- package/node_modules/@dialout/shared/src/chat-blocks.test.ts +65 -0
- package/node_modules/@dialout/shared/src/chat-blocks.ts +79 -0
- package/node_modules/@dialout/shared/src/command-filter.test.ts +76 -0
- package/node_modules/@dialout/shared/src/command-filter.ts +45 -0
- package/node_modules/@dialout/shared/src/composer-behaviour.test.ts +31 -0
- package/node_modules/@dialout/shared/src/composer-behaviour.ts +22 -0
- package/node_modules/@dialout/shared/src/events.ts +27 -0
- package/node_modules/@dialout/shared/src/index.ts +32 -0
- package/node_modules/@dialout/shared/src/kinds.ts +5 -0
- package/node_modules/@dialout/shared/src/notify.test.ts +49 -0
- package/node_modules/@dialout/shared/src/notify.ts +30 -0
- package/node_modules/@dialout/shared/src/permission.ts +10 -0
- package/node_modules/@dialout/shared/src/scroll-pin.test.ts +23 -0
- package/node_modules/@dialout/shared/src/scroll-pin.ts +13 -0
- package/node_modules/@dialout/shared/src/session.ts +25 -0
- package/node_modules/@dialout/shared/src/terminal-name.ts +82 -0
- package/node_modules/@dialout/shared/src/tool-appearance.test.ts +41 -0
- package/node_modules/@dialout/shared/src/tool-appearance.ts +39 -0
- package/package.json +54 -14
- package/scripts/postinstall.js +79 -0
- package/scripts/prepack.js +45 -0
- package/bin/dialout.js +0 -13
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.REPLAY_LIMIT = void 0;
|
|
37
|
+
exports.launchedTranscript = launchedTranscript;
|
|
38
|
+
exports.listLaunchedSessions = listLaunchedSessions;
|
|
39
|
+
exports.discoverAiSessions = discoverAiSessions;
|
|
40
|
+
exports.createAiSession = createAiSession;
|
|
41
|
+
exports.deleteAiSession = deleteAiSession;
|
|
42
|
+
exports.openAiSession = openAiSession;
|
|
43
|
+
exports.closeAiSession = closeAiSession;
|
|
44
|
+
exports.closeAllAiSessions = closeAllAiSessions;
|
|
45
|
+
exports.sendKeysArgs = sendKeysArgs;
|
|
46
|
+
exports.sendAiInput = sendAiInput;
|
|
47
|
+
const child_process_1 = require("child_process");
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const ai_session_detector_1 = require("./ai-session-detector");
|
|
50
|
+
const ai_transcript_locator_1 = require("./ai-transcript-locator");
|
|
51
|
+
const ai_launch_1 = require("./ai-launch");
|
|
52
|
+
const os = __importStar(require("os"));
|
|
53
|
+
const crypto_1 = require("crypto");
|
|
54
|
+
const ai_transcript_tail_1 = require("./ai-transcript-tail");
|
|
55
|
+
const ai_adapters_1 = require("./ai-adapters");
|
|
56
|
+
const ai_status_1 = require("./ai-status");
|
|
57
|
+
const tmux_manager_1 = require("./tmux-manager");
|
|
58
|
+
const shared_1 = require("@dialout/shared");
|
|
59
|
+
Object.defineProperty(exports, "REPLAY_LIMIT", { enumerable: true, get: function () { return shared_1.REPLAY_LIMIT; } });
|
|
60
|
+
const open = new Map();
|
|
61
|
+
function defaultPanePid(tmuxName) {
|
|
62
|
+
try {
|
|
63
|
+
const out = (0, child_process_1.execFileSync)('tmux', ['list-panes', '-t', tmuxName, '-F', '#{pane_pid}'], { timeout: 5000, stdio: 'pipe' }).toString();
|
|
64
|
+
return parseInt(out.split('\n')[0], 10) || 0;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return 0;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// The label that keeps two Claude subscriptions on one machine apart. DevDash
|
|
71
|
+
// never sees an account — only which config home the process was started with.
|
|
72
|
+
function defaultProfileOf(pid) {
|
|
73
|
+
try {
|
|
74
|
+
const env = process.platform === 'linux'
|
|
75
|
+
? fs.readFileSync(`/proc/${pid}/environ`, 'utf8')
|
|
76
|
+
: (0, child_process_1.execFileSync)('ps', ['eww', '-p', String(pid), '-o', 'command='], { timeout: 5000, stdio: 'pipe' }).toString();
|
|
77
|
+
const m = env.match(/CLAUDE_CONFIG_DIR=([^\s\0]+)/);
|
|
78
|
+
if (!m)
|
|
79
|
+
return 'default';
|
|
80
|
+
const parts = m[1].split('/').filter(Boolean);
|
|
81
|
+
return parts[parts.length - 1] || 'default';
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return 'default';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function launchedTranscript(rec) {
|
|
88
|
+
// Must match the config home the CHILD will actually use, not a guess. The
|
|
89
|
+
// child inherits the agent's environment, so an agent started under a
|
|
90
|
+
// non-default CLAUDE_CONFIG_DIR writes its transcripts there — predicting
|
|
91
|
+
// ~/.claude would point at a file that never appears.
|
|
92
|
+
const home = rec.configHome
|
|
93
|
+
|| process.env.CLAUDE_CONFIG_DIR
|
|
94
|
+
|| `${os.homedir()}/.claude`;
|
|
95
|
+
return `${(0, ai_transcript_locator_1.claudeProjectDir)(home, rec.cwd)}/${rec.sessionId}.jsonl`;
|
|
96
|
+
}
|
|
97
|
+
// Launched sessions are not tmux sessions, so they are listed from the agent's
|
|
98
|
+
// own registry rather than discovered. Their transcript path is deterministic
|
|
99
|
+
// because DevDash chose the session id when it started them.
|
|
100
|
+
function listLaunchedSessions() {
|
|
101
|
+
return (0, ai_launch_1.listRecords)().map((rec) => {
|
|
102
|
+
const live = open.get((0, ai_launch_1.launchId)(rec.sessionId));
|
|
103
|
+
const running = (0, ai_launch_1.isTurnRunning)(rec.sessionId);
|
|
104
|
+
return {
|
|
105
|
+
tmuxName: (0, ai_launch_1.launchId)(rec.sessionId),
|
|
106
|
+
kind: rec.kind,
|
|
107
|
+
title: live?.title || rec.title || rec.sessionId.slice(0, 8),
|
|
108
|
+
folder: rec.cwd.split('/').filter(Boolean).pop() || '',
|
|
109
|
+
folderPath: rec.cwd,
|
|
110
|
+
gitBranch: '',
|
|
111
|
+
profile: rec.configHome ? rec.configHome.split('/').filter(Boolean).pop() : 'default',
|
|
112
|
+
// A turn in flight is definitive: the process is running right now, so
|
|
113
|
+
// there is no need to infer 'working' from transcript timing.
|
|
114
|
+
status: running
|
|
115
|
+
? 'working'
|
|
116
|
+
: (live ? (0, ai_status_1.deriveStatus)(live.events, live.tail.lastGrowthMs, Date.now()) : 'waiting_input'),
|
|
117
|
+
origin: 'launched',
|
|
118
|
+
permissionMode: rec.permissionMode,
|
|
119
|
+
updatedAt: rec.createdAt,
|
|
120
|
+
transcript: launchedTranscript(rec),
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
async function discoverAiSessions(deps = {}) {
|
|
125
|
+
const list = deps.listSessions || tmux_manager_1.listSessions;
|
|
126
|
+
const panePid = deps.panePid || defaultPanePid;
|
|
127
|
+
const table = deps.processTable || (() => (0, ai_session_detector_1.readProcessTable)());
|
|
128
|
+
const locate = deps.locate
|
|
129
|
+
|| ((pid, kind, exclude) => (0, ai_transcript_locator_1.locateTranscript)(pid, kind, { exclude }));
|
|
130
|
+
const procStartMs = deps.procStartMs || ai_transcript_locator_1.defaultProcStartMs;
|
|
131
|
+
const profileOf = deps.profileOf || defaultProfileOf;
|
|
132
|
+
const rows = await table();
|
|
133
|
+
// Resolve the agent process for every pane first, then claim transcripts
|
|
134
|
+
// newest-process-first. Two claude sessions in one folder under one config
|
|
135
|
+
// home both match the same directory, so without a claim set the newer one
|
|
136
|
+
// wins twice and the older pane shows the newer pane's conversation.
|
|
137
|
+
// Verified live on 2026-08-21: two panes, two pids, one transcript.
|
|
138
|
+
const panes = [];
|
|
139
|
+
for (const session of await list()) {
|
|
140
|
+
const pid = panePid(session.name);
|
|
141
|
+
if (!pid)
|
|
142
|
+
continue;
|
|
143
|
+
const agent = (0, ai_session_detector_1.findAgentInPane)(rows, pid);
|
|
144
|
+
if (!agent)
|
|
145
|
+
continue;
|
|
146
|
+
panes.push({ session, agent, startedAt: procStartMs(agent.pid) });
|
|
147
|
+
}
|
|
148
|
+
panes.sort((a, b) => b.startedAt - a.startedAt);
|
|
149
|
+
const claimed = new Set();
|
|
150
|
+
const out = [];
|
|
151
|
+
for (const { session, agent } of panes) {
|
|
152
|
+
// A session whose transcript cannot be found is not showable as chat.
|
|
153
|
+
// Listing it would produce a row that opens into permanent emptiness.
|
|
154
|
+
const transcript = locate(agent.pid, agent.kind, claimed);
|
|
155
|
+
if (!transcript)
|
|
156
|
+
continue;
|
|
157
|
+
claimed.add(transcript);
|
|
158
|
+
const live = open.get(session.name);
|
|
159
|
+
out.push({
|
|
160
|
+
tmuxName: session.name,
|
|
161
|
+
kind: agent.kind,
|
|
162
|
+
title: live?.title || session.folder || session.name,
|
|
163
|
+
folder: session.folder || '',
|
|
164
|
+
folderPath: session.folderPath || '',
|
|
165
|
+
gitBranch: session.gitBranch || '',
|
|
166
|
+
profile: profileOf(agent.pid),
|
|
167
|
+
status: live ? (0, ai_status_1.deriveStatus)(live.events, live.tail.lastGrowthMs, Date.now()) : 'idle',
|
|
168
|
+
origin: 'tmux',
|
|
169
|
+
updatedAt: (session.lastActivity || 0) * 1000,
|
|
170
|
+
transcript,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
// Launched sessions come from the registry, not from tmux, and are listed
|
|
174
|
+
// alongside so the user sees one list rather than two.
|
|
175
|
+
return [...out, ...(deps.listSessions ? [] : listLaunchedSessions())];
|
|
176
|
+
}
|
|
177
|
+
// Start a brand-new session and send its first message. Returns the id the
|
|
178
|
+
// browser should open, or null if the request was unusable.
|
|
179
|
+
function createAiSession(opts) {
|
|
180
|
+
const cwd = String(opts.cwd || '').trim();
|
|
181
|
+
const prompt = String(opts.prompt || '').trim();
|
|
182
|
+
// An absolute path only: a relative one would resolve against the agent's
|
|
183
|
+
// own working directory, which is not where the user thinks they are.
|
|
184
|
+
if (!cwd.startsWith('/') || !prompt)
|
|
185
|
+
return null;
|
|
186
|
+
try {
|
|
187
|
+
if (!fs.statSync(cwd).isDirectory())
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
const mode = ai_launch_1.PERMISSION_MODES.includes(String(opts.permissionMode))
|
|
194
|
+
? opts.permissionMode
|
|
195
|
+
: 'default';
|
|
196
|
+
const rec = {
|
|
197
|
+
sessionId: (0, crypto_1.randomUUID)(),
|
|
198
|
+
kind: opts.kind === 'codex' ? 'codex' : 'claude',
|
|
199
|
+
cwd,
|
|
200
|
+
// The first prompt is the best title we have until the CLI writes its own.
|
|
201
|
+
title: prompt.slice(0, 60),
|
|
202
|
+
permissionMode: mode,
|
|
203
|
+
configHome: String(opts.configHome || ''),
|
|
204
|
+
createdAt: Date.now(),
|
|
205
|
+
};
|
|
206
|
+
(0, ai_launch_1.addRecord)(rec);
|
|
207
|
+
(0, ai_launch_1.runTurn)(rec, prompt, true);
|
|
208
|
+
return (0, ai_launch_1.launchId)(rec.sessionId);
|
|
209
|
+
}
|
|
210
|
+
function deleteAiSession(id) {
|
|
211
|
+
const sessionId = (0, ai_launch_1.parseLaunchId)(id);
|
|
212
|
+
if (!sessionId)
|
|
213
|
+
return false;
|
|
214
|
+
(0, ai_launch_1.stopTurn)(sessionId);
|
|
215
|
+
closeAiSession(id);
|
|
216
|
+
(0, ai_launch_1.removeRecord)(sessionId);
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
function openAiSession(tmuxName, onEvents) {
|
|
220
|
+
closeAiSession(tmuxName);
|
|
221
|
+
void (async () => {
|
|
222
|
+
// Ask discovery rather than resolving again: it is the only place that
|
|
223
|
+
// claims transcripts across all panes, so re-resolving here in isolation
|
|
224
|
+
// would race the other panes and could pick a different file than the row
|
|
225
|
+
// the user tapped.
|
|
226
|
+
const row = (0, ai_launch_1.isLaunchId)(tmuxName)
|
|
227
|
+
? listLaunchedSessions().find((r) => r.tmuxName === tmuxName)
|
|
228
|
+
: (await discoverAiSessions()).find((r) => r.tmuxName === tmuxName);
|
|
229
|
+
if (!row || !row.transcript)
|
|
230
|
+
return;
|
|
231
|
+
const path = row.transcript;
|
|
232
|
+
const adapter = (0, ai_adapters_1.adapterFor)(row.kind);
|
|
233
|
+
const live = {
|
|
234
|
+
tail: null,
|
|
235
|
+
events: [], kind: row.kind, title: '',
|
|
236
|
+
};
|
|
237
|
+
live.tail = new ai_transcript_tail_1.TranscriptTail(path, (records) => {
|
|
238
|
+
const batch = [];
|
|
239
|
+
for (const record of records) {
|
|
240
|
+
const title = adapter.title(record);
|
|
241
|
+
if (title)
|
|
242
|
+
live.title = title;
|
|
243
|
+
batch.push(...adapter.toEvents(record));
|
|
244
|
+
}
|
|
245
|
+
live.events.push(...batch);
|
|
246
|
+
// Bound memory: a long session's transcript is unbounded, the agent's
|
|
247
|
+
// heap is not.
|
|
248
|
+
if (live.events.length > shared_1.REPLAY_LIMIT * 5) {
|
|
249
|
+
live.events = live.events.slice(-shared_1.REPLAY_LIMIT * 5);
|
|
250
|
+
}
|
|
251
|
+
if (batch.length) {
|
|
252
|
+
onEvents(batch, (0, ai_status_1.deriveStatus)(live.events, live.tail.lastGrowthMs, Date.now()));
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
open.set(tmuxName, live);
|
|
256
|
+
live.tail.start();
|
|
257
|
+
})();
|
|
258
|
+
}
|
|
259
|
+
function closeAiSession(tmuxName) {
|
|
260
|
+
const live = open.get(tmuxName);
|
|
261
|
+
if (!live)
|
|
262
|
+
return;
|
|
263
|
+
live.tail.stop();
|
|
264
|
+
open.delete(tmuxName);
|
|
265
|
+
}
|
|
266
|
+
function closeAllAiSessions() {
|
|
267
|
+
for (const name of Array.from(open.keys()))
|
|
268
|
+
closeAiSession(name);
|
|
269
|
+
// Turns are child processes; leaving them running after a disconnect would
|
|
270
|
+
// orphan them with nobody reading the result.
|
|
271
|
+
(0, ai_launch_1.stopAllTurns)();
|
|
272
|
+
}
|
|
273
|
+
// Named keys must be sent as key presses, not literal text: sending the byte
|
|
274
|
+
// 0x03 literally types a control character into the buffer instead of
|
|
275
|
+
// interrupting the agent.
|
|
276
|
+
const NAMED_KEYS = {
|
|
277
|
+
'\u001b': 'Escape',
|
|
278
|
+
'\u0003': 'C-c',
|
|
279
|
+
'\r': 'Enter',
|
|
280
|
+
'\t': 'Tab',
|
|
281
|
+
};
|
|
282
|
+
function sendKeysArgs(tmuxName, text) {
|
|
283
|
+
const named = NAMED_KEYS[text];
|
|
284
|
+
if (named)
|
|
285
|
+
return [['send-keys', '-t', tmuxName, named]];
|
|
286
|
+
return [
|
|
287
|
+
// `-l` sends literally; `--` stops tmux parsing text that starts with '-'
|
|
288
|
+
// as an option, which would otherwise let composed text run tmux commands.
|
|
289
|
+
['send-keys', '-t', tmuxName, '-l', '--', text],
|
|
290
|
+
['send-keys', '-t', tmuxName, 'Enter'],
|
|
291
|
+
];
|
|
292
|
+
}
|
|
293
|
+
function sendAiInput(tmuxName, text, deps = {}) {
|
|
294
|
+
// A launched session takes structured input on stdin; a tmux one takes
|
|
295
|
+
// keystrokes. Same call site, different mechanism.
|
|
296
|
+
const sessionId = (0, ai_launch_1.parseLaunchId)(tmuxName);
|
|
297
|
+
if (sessionId) {
|
|
298
|
+
const rec = (0, ai_launch_1.listRecords)().find((r) => r.sessionId === sessionId);
|
|
299
|
+
if (rec)
|
|
300
|
+
(0, ai_launch_1.runTurn)(rec, text, false);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
const run = deps.run || ((args) => {
|
|
304
|
+
(0, child_process_1.execFile)('tmux', args, { timeout: 5000 }, () => { });
|
|
305
|
+
});
|
|
306
|
+
for (const args of sendKeysArgs(tmuxName, text))
|
|
307
|
+
run(args);
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=ai-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-sessions.js","sourceRoot":"","sources":["../src/ai-sessions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,gDASC;AAKD,oDAuBC;AAED,gDAsDC;AAYD,0CA6BC;AAED,0CAOC;AAED,sCA4CC;AAED,wCAKC;AAED,gDAKC;AAYD,oCASC;AAMD,kCAaC;AApTD,iDAAuD;AACvD,uCAAyB;AACzB,+DAA2F;AAC3F,mEAAiG;AACjG,2CAGqB;AACrB,uCAAyB;AACzB,mCAAoC;AACpC,6DAAsD;AACtD,+CAA8D;AAC9D,2CAA2C;AAC3C,iDAA8C;AAE9C,4CAA+C;AAGtC,6FAHA,qBAAY,OAGA;AASrB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;AAW5C,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAA,4BAAY,EAAC,MAAM,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,CAAC,EAClF,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC/C,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,+EAA+E;AAC/E,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;YACtC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,GAAG,UAAU,EAAE,MAAM,CAAC;YACjD,CAAC,CAAC,IAAA,4BAAY,EAAC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,EAC7D,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC;YAAE,OAAO,SAAS,CAAC;QACzB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAgB,kBAAkB,CAAC,GAAmB;IACpD,2EAA2E;IAC3E,sEAAsE;IACtE,0EAA0E;IAC1E,sDAAsD;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU;WACtB,OAAO,CAAC,GAAG,CAAC,iBAAiB;WAC7B,GAAG,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;IAC/B,OAAO,GAAG,IAAA,wCAAgB,EAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,SAAS,QAAQ,CAAC;AACrE,CAAC;AAED,+EAA+E;AAC/E,8EAA8E;AAC9E,6DAA6D;AAC7D,SAAgB,oBAAoB;IAClC,OAAO,IAAA,uBAAW,GAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAA,oBAAQ,EAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAA,yBAAa,EAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO;YACL,QAAQ,EAAE,IAAA,oBAAQ,EAAC,GAAG,CAAC,SAAS,CAAC;YACjC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5D,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;YACtD,UAAU,EAAE,GAAG,CAAC,GAAG;YACnB,SAAS,EAAE,EAAE;YACb,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAG,CAAC,CAAC,CAAC,SAAS;YACtF,uEAAuE;YACvE,8DAA8D;YAC9D,MAAM,EAAE,OAAO;gBACb,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,wBAAY,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;YAC5F,MAAM,EAAE,UAAmB;YAC3B,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,UAAU,EAAE,kBAAkB,CAAC,GAAG,CAAC;SACpC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,OAAqB,EAAE;IAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,2BAAY,CAAC;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,IAAA,sCAAgB,GAAE,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;WACrB,CAAC,CAAC,GAAW,EAAE,IAAY,EAAE,OAAoB,EAAE,EAAE,CACtD,IAAA,wCAAgB,EAAC,GAAG,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,0CAAkB,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,gBAAgB,CAAC;IAErD,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,CAAC;IAE3B,yEAAyE;IACzE,2EAA2E;IAC3E,2EAA2E;IAC3E,qEAAqE;IACrE,oEAAoE;IACpE,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,OAAO,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,KAAK,GAAG,IAAA,qCAAe,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC;QACvC,sEAAsE;QACtE,sEAAsE;QACtE,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,GAAG,CAAC,IAAI,CAAC;YACP,QAAQ,EAAE,OAAO,CAAC,IAAI;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI;YACpD,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;YACpC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE;YAClC,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;YAC7B,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAA,wBAAY,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;YACrF,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,IAAI;YAC7C,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IACD,0EAA0E;IAC1E,uDAAuD;IACvD,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC;AAUD,2EAA2E;AAC3E,4DAA4D;AAC5D,SAAgB,eAAe,CAAC,IAA0B;IACxD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,0EAA0E;IAC1E,sEAAsE;IACtE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACjD,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,IAAI,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,IAAI,GAAI,4BAA6B,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/E,CAAC,CAAE,IAAI,CAAC,cAAiC;QACzC,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,GAAG,GAAmB;QAC1B,SAAS,EAAE,IAAA,mBAAU,GAAE;QACvB,IAAI,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;QAChD,GAAG;QACH,2EAA2E;QAC3E,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC1B,cAAc,EAAE,IAAI;QACpB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACzC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;IACF,IAAA,qBAAS,EAAC,GAAG,CAAC,CAAC;IACf,IAAA,mBAAO,EAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3B,OAAO,IAAA,oBAAQ,EAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,eAAe,CAAC,EAAU;IACxC,MAAM,SAAS,GAAG,IAAA,yBAAa,EAAC,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAA,oBAAQ,EAAC,SAAS,CAAC,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,CAAC;IACnB,IAAA,wBAAY,EAAC,SAAS,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,aAAa,CAC3B,QAAgB,EAChB,QAAuD;IAEvD,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEzB,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,uEAAuE;QACvE,yEAAyE;QACzE,0EAA0E;QAC1E,mBAAmB;QACnB,MAAM,GAAG,GAAG,IAAA,sBAAU,EAAC,QAAQ,CAAC;YAC9B,CAAC,CAAC,oBAAoB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;YAC7D,CAAC,CAAC,CAAC,MAAM,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU;YAAE,OAAO;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC;QAE5B,MAAM,OAAO,GAAG,IAAA,wBAAU,EAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,IAAI,GAAgB;YACxB,IAAI,EAAE,IAAiC;YACvC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;SACtC,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG,IAAI,mCAAc,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YAC/C,MAAM,KAAK,GAAc,EAAE,CAAC;YAC5B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACpC,IAAI,KAAK;oBAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;YAC3B,sEAAsE;YACtE,eAAe;YACf,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,qBAAY,GAAG,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAY,GAAG,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,QAAQ,CAAC,KAAK,EAAE,IAAA,wBAAY,EAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACjF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC,CAAC,EAAE,CAAC;AACP,CAAC;AAED,SAAgB,cAAc,CAAC,QAAgB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACxB,CAAC;AAED,SAAgB,kBAAkB;IAChC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IACjE,2EAA2E;IAC3E,8CAA8C;IAC9C,IAAA,wBAAY,GAAE,CAAC;AACjB,CAAC;AAED,6EAA6E;AAC7E,sEAAsE;AACtE,0BAA0B;AAC1B,MAAM,UAAU,GAA2B;IACzC,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,KAAK;IACf,IAAI,EAAE,OAAO;IACb,IAAI,EAAE,KAAK;CACZ,CAAC;AAEF,SAAgB,YAAY,CAAC,QAAgB,EAAE,IAAY;IACzD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAK;QAAE,OAAO,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;IACzD,OAAO;QACL,0EAA0E;QAC1E,2EAA2E;QAC3E,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QAC/C,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;KACvC,CAAC;AACJ,CAAC;AAMD,SAAgB,WAAW,CAAC,QAAgB,EAAE,IAAY,EAAE,OAAiB,EAAE;IAC7E,uEAAuE;IACvE,mDAAmD;IACnD,MAAM,SAAS,GAAG,IAAA,yBAAa,EAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,GAAG,GAAG,IAAA,uBAAW,GAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QACjE,IAAI,GAAG;YAAE,IAAA,mBAAO,EAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO;IACT,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAc,EAAE,EAAE;QAC1C,IAAA,wBAAQ,EAAC,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAqB,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,IAAI,IAAI,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { AiEvent, AiStatus } from './ai-adapters/types';
|
|
2
|
+
export declare const IDLE_MS = 300000;
|
|
3
|
+
export declare const APPROVAL_MS = 3000;
|
|
4
|
+
export declare const INPUT_MS = 2000;
|
|
5
|
+
export declare function deriveStatus(events: AiEvent[], lastGrowthMs: number, nowMs: number): AiStatus;
|
|
6
|
+
//# sourceMappingURL=ai-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-status.d.ts","sourceRoot":"","sources":["../src/ai-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAQxD,eAAO,MAAM,OAAO,SAAU,CAAC;AAC/B,eAAO,MAAM,WAAW,OAAQ,CAAC;AACjC,eAAO,MAAM,QAAQ,OAAQ,CAAC;AAE9B,wBAAgB,YAAY,CAC1B,MAAM,EAAE,OAAO,EAAE,EACjB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,GACZ,QAAQ,CAyBV"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.INPUT_MS = exports.APPROVAL_MS = exports.IDLE_MS = void 0;
|
|
4
|
+
exports.deriveStatus = deriveStatus;
|
|
5
|
+
// Status is derived from the transcript alone, never from the TUI.
|
|
6
|
+
//
|
|
7
|
+
// The rules overlap by construction — an unresolved tool call is also a
|
|
8
|
+
// growing transcript — so they are evaluated in order and the first match
|
|
9
|
+
// wins. Changing the order changes the meaning.
|
|
10
|
+
exports.IDLE_MS = 300_000;
|
|
11
|
+
exports.APPROVAL_MS = 3_000;
|
|
12
|
+
exports.INPUT_MS = 2_000;
|
|
13
|
+
function deriveStatus(events, lastGrowthMs, nowMs) {
|
|
14
|
+
if (!events.length)
|
|
15
|
+
return 'idle';
|
|
16
|
+
const quietFor = nowMs - lastGrowthMs;
|
|
17
|
+
// 1. Nothing has happened for a long time.
|
|
18
|
+
if (quietFor > exports.IDLE_MS)
|
|
19
|
+
return 'idle';
|
|
20
|
+
// 2. A tool call with no matching result. In attach mode the permission
|
|
21
|
+
// prompt itself is not a typed event, so an unresolved call that has sat
|
|
22
|
+
// still is the best available signal that the CLI is asking to proceed.
|
|
23
|
+
const resolved = new Set();
|
|
24
|
+
for (const e of events)
|
|
25
|
+
if (e.kind === 'tool_result')
|
|
26
|
+
resolved.add(e.forId);
|
|
27
|
+
const unresolved = events.some((e) => e.kind === 'tool_call' && !!e.id && !resolved.has(e.id));
|
|
28
|
+
if (unresolved && quietFor > exports.APPROVAL_MS)
|
|
29
|
+
return 'waiting_approval';
|
|
30
|
+
// 3. A complete assistant message that has settled: the agent has finished
|
|
31
|
+
// and the ball is with the user.
|
|
32
|
+
const last = events[events.length - 1];
|
|
33
|
+
if (last.kind === 'message' && last.role === 'assistant' && quietFor > exports.INPUT_MS) {
|
|
34
|
+
return 'waiting_input';
|
|
35
|
+
}
|
|
36
|
+
// 4. Anything else: the transcript is advancing, or the last thing said was
|
|
37
|
+
// the user's and a reply is owed.
|
|
38
|
+
return 'working';
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=ai-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-status.js","sourceRoot":"","sources":["../src/ai-status.ts"],"names":[],"mappings":";;;AAYA,oCA6BC;AAvCD,mEAAmE;AACnE,EAAE;AACF,wEAAwE;AACxE,0EAA0E;AAC1E,gDAAgD;AAEnC,QAAA,OAAO,GAAG,OAAO,CAAC;AAClB,QAAA,WAAW,GAAG,KAAK,CAAC;AACpB,QAAA,QAAQ,GAAG,KAAK,CAAC;AAE9B,SAAgB,YAAY,CAC1B,MAAiB,EACjB,YAAoB,EACpB,KAAa;IAEb,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAClC,MAAM,QAAQ,GAAG,KAAK,GAAG,YAAY,CAAC;IAEtC,2CAA2C;IAC3C,IAAI,QAAQ,GAAG,eAAO;QAAE,OAAO,MAAM,CAAC;IAEtC,wEAAwE;IACxE,yEAAyE;IACzE,wEAAwE;IACxE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/F,IAAI,UAAU,IAAI,QAAQ,GAAG,mBAAW;QAAE,OAAO,kBAAkB,CAAC;IAEpE,2EAA2E;IAC3E,iCAAiC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACvC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,QAAQ,GAAG,gBAAQ,EAAE,CAAC;QAChF,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,4EAA4E;IAC5E,kCAAkC;IAClC,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AiKind } from './ai-session-detector';
|
|
2
|
+
export interface LocatorDeps {
|
|
3
|
+
writeHandles?: (pid: number) => string[];
|
|
4
|
+
procCwd?: (pid: number) => string;
|
|
5
|
+
procEnv?: (pid: number) => Record<string, string>;
|
|
6
|
+
procStartMs?: (pid: number) => number;
|
|
7
|
+
listJsonl?: (dir: string) => {
|
|
8
|
+
path: string;
|
|
9
|
+
mtimeMs: number;
|
|
10
|
+
}[];
|
|
11
|
+
transcriptCwds?: (path: string) => string[];
|
|
12
|
+
exclude?: Set<string>;
|
|
13
|
+
/** Grok's own pid -> session map; see grokTranscript(). */
|
|
14
|
+
grokSessions?: (home: string) => GrokSession[];
|
|
15
|
+
/** Newest chat_history.jsonl under a grok cwd directory, for the fallback. */
|
|
16
|
+
grokNewest?: (cwdDir: string) => {
|
|
17
|
+
path: string;
|
|
18
|
+
mtimeMs: number;
|
|
19
|
+
}[];
|
|
20
|
+
}
|
|
21
|
+
export interface GrokSession {
|
|
22
|
+
session_id: string;
|
|
23
|
+
pid: number;
|
|
24
|
+
cwd: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function grokTranscriptPath(home: string, cwd: string, sessionId: string): string;
|
|
27
|
+
export declare function claudeProjectDir(configHome: string, cwd: string): string;
|
|
28
|
+
export declare function defaultProcStartMs(pid: number): number;
|
|
29
|
+
export declare function pickNewest(files: {
|
|
30
|
+
path: string;
|
|
31
|
+
mtimeMs: number;
|
|
32
|
+
}[]): string | null;
|
|
33
|
+
export declare function grokTranscript(pid: number, home: string, deps?: LocatorDeps): string | null;
|
|
34
|
+
export declare function locateTranscript(pid: number, kind: AiKind, deps?: LocatorDeps): string | null;
|
|
35
|
+
//# sourceMappingURL=ai-transcript-locator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-transcript-locator.d.ts","sourceRoot":"","sources":["../src/ai-transcript-locator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAgB/C,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAClC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IAI5C,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,WAAW,EAAE,CAAC;IAC/C,8EAA8E;IAC9E,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtE;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAQD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvF;AAUD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAExE;AAID,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAStD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,GAAG,IAAI,CAMpF;AA0GD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,WAAgB,GACrB,MAAM,GAAG,IAAI,CAKf;AAED,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,WAAgB,GACrB,MAAM,GAAG,IAAI,CAyDf"}
|