@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.
Files changed (224) hide show
  1. package/README.md +425 -24
  2. package/bin/AGENTS.md +44 -0
  3. package/bin/devdash-agent.js +2 -0
  4. package/dist/ai-adapters/claude.d.ts +3 -0
  5. package/dist/ai-adapters/claude.d.ts.map +1 -0
  6. package/dist/ai-adapters/claude.js +98 -0
  7. package/dist/ai-adapters/claude.js.map +1 -0
  8. package/dist/ai-adapters/codex.d.ts +3 -0
  9. package/dist/ai-adapters/codex.d.ts.map +1 -0
  10. package/dist/ai-adapters/codex.js +147 -0
  11. package/dist/ai-adapters/codex.js.map +1 -0
  12. package/dist/ai-adapters/grok.d.ts +3 -0
  13. package/dist/ai-adapters/grok.d.ts.map +1 -0
  14. package/dist/ai-adapters/grok.js +164 -0
  15. package/dist/ai-adapters/grok.js.map +1 -0
  16. package/dist/ai-adapters/index.d.ts +5 -0
  17. package/dist/ai-adapters/index.d.ts.map +1 -0
  18. package/dist/ai-adapters/index.js +30 -0
  19. package/dist/ai-adapters/index.js.map +1 -0
  20. package/dist/ai-adapters/types.d.ts +3 -0
  21. package/dist/ai-adapters/types.d.ts.map +1 -0
  22. package/dist/ai-adapters/types.js +7 -0
  23. package/dist/ai-adapters/types.js.map +1 -0
  24. package/dist/ai-capabilities/claude.d.ts +4 -0
  25. package/dist/ai-capabilities/claude.d.ts.map +1 -0
  26. package/dist/ai-capabilities/claude.js +174 -0
  27. package/dist/ai-capabilities/claude.js.map +1 -0
  28. package/dist/ai-capabilities/describe.d.ts +2 -0
  29. package/dist/ai-capabilities/describe.d.ts.map +1 -0
  30. package/dist/ai-capabilities/describe.js +31 -0
  31. package/dist/ai-capabilities/describe.js.map +1 -0
  32. package/dist/ai-capabilities/fsdeps.d.ts +3 -0
  33. package/dist/ai-capabilities/fsdeps.d.ts.map +1 -0
  34. package/dist/ai-capabilities/fsdeps.js +71 -0
  35. package/dist/ai-capabilities/fsdeps.js.map +1 -0
  36. package/dist/ai-capabilities/grok.d.ts +5 -0
  37. package/dist/ai-capabilities/grok.d.ts.map +1 -0
  38. package/dist/ai-capabilities/grok.js +145 -0
  39. package/dist/ai-capabilities/grok.js.map +1 -0
  40. package/dist/ai-capabilities/index.d.ts +4 -0
  41. package/dist/ai-capabilities/index.d.ts.map +1 -0
  42. package/dist/ai-capabilities/index.js +94 -0
  43. package/dist/ai-capabilities/index.js.map +1 -0
  44. package/dist/ai-capabilities/redact.d.ts +2 -0
  45. package/dist/ai-capabilities/redact.d.ts.map +1 -0
  46. package/dist/ai-capabilities/redact.js +27 -0
  47. package/dist/ai-capabilities/redact.js.map +1 -0
  48. package/dist/ai-capabilities/types.d.ts +11 -0
  49. package/dist/ai-capabilities/types.d.ts.map +1 -0
  50. package/dist/ai-capabilities/types.js +3 -0
  51. package/dist/ai-capabilities/types.js.map +1 -0
  52. package/dist/ai-launch.d.ts +35 -0
  53. package/dist/ai-launch.d.ts.map +1 -0
  54. package/dist/ai-launch.js +211 -0
  55. package/dist/ai-launch.js.map +1 -0
  56. package/dist/ai-session-detector.d.ts +19 -0
  57. package/dist/ai-session-detector.d.ts.map +1 -0
  58. package/dist/ai-session-detector.js +79 -0
  59. package/dist/ai-session-detector.js.map +1 -0
  60. package/dist/ai-sessions.d.ts +36 -0
  61. package/dist/ai-sessions.d.ts.map +1 -0
  62. package/dist/ai-sessions.js +309 -0
  63. package/dist/ai-sessions.js.map +1 -0
  64. package/dist/ai-status.d.ts +6 -0
  65. package/dist/ai-status.d.ts.map +1 -0
  66. package/dist/ai-status.js +40 -0
  67. package/dist/ai-status.js.map +1 -0
  68. package/dist/ai-transcript-locator.d.ts +35 -0
  69. package/dist/ai-transcript-locator.d.ts.map +1 -0
  70. package/dist/ai-transcript-locator.js +268 -0
  71. package/dist/ai-transcript-locator.js.map +1 -0
  72. package/dist/ai-transcript-tail.d.ts +17 -0
  73. package/dist/ai-transcript-tail.d.ts.map +1 -0
  74. package/dist/ai-transcript-tail.js +120 -0
  75. package/dist/ai-transcript-tail.js.map +1 -0
  76. package/dist/checklist.d.ts +20 -0
  77. package/dist/checklist.d.ts.map +1 -0
  78. package/dist/checklist.js +51 -0
  79. package/dist/checklist.js.map +1 -0
  80. package/dist/cli.d.ts +2 -0
  81. package/dist/cli.d.ts.map +1 -0
  82. package/dist/cli.js +1427 -0
  83. package/dist/cli.js.map +1 -0
  84. package/dist/command-runner.d.ts +15 -0
  85. package/dist/command-runner.d.ts.map +1 -0
  86. package/dist/command-runner.js +84 -0
  87. package/dist/command-runner.js.map +1 -0
  88. package/dist/config.d.ts +41 -0
  89. package/dist/config.d.ts.map +1 -0
  90. package/dist/config.js +152 -0
  91. package/dist/config.js.map +1 -0
  92. package/dist/cowork.d.ts +26 -0
  93. package/dist/cowork.d.ts.map +1 -0
  94. package/dist/cowork.js +370 -0
  95. package/dist/cowork.js.map +1 -0
  96. package/dist/fs-browser.d.ts +6 -0
  97. package/dist/fs-browser.d.ts.map +1 -0
  98. package/dist/fs-browser.js +61 -0
  99. package/dist/fs-browser.js.map +1 -0
  100. package/dist/has-command.d.ts +12 -0
  101. package/dist/has-command.d.ts.map +1 -0
  102. package/dist/has-command.js +24 -0
  103. package/dist/has-command.js.map +1 -0
  104. package/dist/heartbeat.d.ts +7 -0
  105. package/dist/heartbeat.d.ts.map +1 -0
  106. package/dist/heartbeat.js +50 -0
  107. package/dist/heartbeat.js.map +1 -0
  108. package/dist/index.d.ts +2 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +56 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/port-scanner.d.ts +4 -0
  113. package/dist/port-scanner.d.ts.map +1 -0
  114. package/dist/port-scanner.js +75 -0
  115. package/dist/port-scanner.js.map +1 -0
  116. package/dist/project-scanner.d.ts +15 -0
  117. package/dist/project-scanner.d.ts.map +1 -0
  118. package/dist/project-scanner.js +333 -0
  119. package/dist/project-scanner.js.map +1 -0
  120. package/dist/pty-manager.d.ts +28 -0
  121. package/dist/pty-manager.d.ts.map +1 -0
  122. package/dist/pty-manager.js +506 -0
  123. package/dist/pty-manager.js.map +1 -0
  124. package/dist/service-installer.d.ts +95 -0
  125. package/dist/service-installer.d.ts.map +1 -0
  126. package/dist/service-installer.js +911 -0
  127. package/dist/service-installer.js.map +1 -0
  128. package/dist/single-instance.d.ts +20 -0
  129. package/dist/single-instance.d.ts.map +1 -0
  130. package/dist/single-instance.js +151 -0
  131. package/dist/single-instance.js.map +1 -0
  132. package/dist/ssh-local-network.d.ts +26 -0
  133. package/dist/ssh-local-network.d.ts.map +1 -0
  134. package/dist/ssh-local-network.js +169 -0
  135. package/dist/ssh-local-network.js.map +1 -0
  136. package/dist/terminal-detect.d.ts +52 -0
  137. package/dist/terminal-detect.d.ts.map +1 -0
  138. package/dist/terminal-detect.js +147 -0
  139. package/dist/terminal-detect.js.map +1 -0
  140. package/dist/terminal-markers.d.ts +52 -0
  141. package/dist/terminal-markers.d.ts.map +1 -0
  142. package/dist/terminal-markers.js +174 -0
  143. package/dist/terminal-markers.js.map +1 -0
  144. package/dist/tmux-manager.d.ts +35 -0
  145. package/dist/tmux-manager.d.ts.map +1 -0
  146. package/dist/tmux-manager.js +274 -0
  147. package/dist/tmux-manager.js.map +1 -0
  148. package/dist/update-check.d.ts +3 -0
  149. package/dist/update-check.d.ts.map +1 -0
  150. package/dist/update-check.js +202 -0
  151. package/dist/update-check.js.map +1 -0
  152. package/dist/websocket.d.ts +8 -0
  153. package/dist/websocket.d.ts.map +1 -0
  154. package/dist/websocket.js +472 -0
  155. package/dist/websocket.js.map +1 -0
  156. package/node_modules/@dialout/shared/README.md +16 -0
  157. package/node_modules/@dialout/shared/dist/ai-chat-prefs.d.ts +8 -0
  158. package/node_modules/@dialout/shared/dist/ai-chat-prefs.d.ts.map +1 -0
  159. package/node_modules/@dialout/shared/dist/ai-chat-prefs.js +41 -0
  160. package/node_modules/@dialout/shared/dist/capabilities.d.ts +25 -0
  161. package/node_modules/@dialout/shared/dist/capabilities.d.ts.map +1 -0
  162. package/node_modules/@dialout/shared/dist/capabilities.js +2 -0
  163. package/node_modules/@dialout/shared/dist/chat-blocks.d.ts +33 -0
  164. package/node_modules/@dialout/shared/dist/chat-blocks.d.ts.map +1 -0
  165. package/node_modules/@dialout/shared/dist/chat-blocks.js +61 -0
  166. package/node_modules/@dialout/shared/dist/command-filter.d.ts +4 -0
  167. package/node_modules/@dialout/shared/dist/command-filter.d.ts.map +1 -0
  168. package/node_modules/@dialout/shared/dist/command-filter.js +49 -0
  169. package/node_modules/@dialout/shared/dist/composer-behaviour.d.ts +6 -0
  170. package/node_modules/@dialout/shared/dist/composer-behaviour.d.ts.map +1 -0
  171. package/node_modules/@dialout/shared/dist/composer-behaviour.js +24 -0
  172. package/node_modules/@dialout/shared/dist/events.d.ts +37 -0
  173. package/node_modules/@dialout/shared/dist/events.d.ts.map +1 -0
  174. package/node_modules/@dialout/shared/dist/events.js +13 -0
  175. package/node_modules/@dialout/shared/dist/index.d.ts +21 -0
  176. package/node_modules/@dialout/shared/dist/index.d.ts.map +1 -0
  177. package/node_modules/@dialout/shared/dist/index.js +37 -0
  178. package/node_modules/@dialout/shared/dist/kinds.d.ts +2 -0
  179. package/node_modules/@dialout/shared/dist/kinds.d.ts.map +1 -0
  180. package/node_modules/@dialout/shared/dist/kinds.js +2 -0
  181. package/node_modules/@dialout/shared/dist/notify.d.ts +3 -0
  182. package/node_modules/@dialout/shared/dist/notify.d.ts.map +1 -0
  183. package/node_modules/@dialout/shared/dist/notify.js +31 -0
  184. package/node_modules/@dialout/shared/dist/permission.d.ts +4 -0
  185. package/node_modules/@dialout/shared/dist/permission.d.ts.map +1 -0
  186. package/node_modules/@dialout/shared/dist/permission.js +8 -0
  187. package/node_modules/@dialout/shared/dist/scroll-pin.d.ts +3 -0
  188. package/node_modules/@dialout/shared/dist/scroll-pin.d.ts.map +1 -0
  189. package/node_modules/@dialout/shared/dist/scroll-pin.js +11 -0
  190. package/node_modules/@dialout/shared/dist/session.d.ts +19 -0
  191. package/node_modules/@dialout/shared/dist/session.d.ts.map +1 -0
  192. package/node_modules/@dialout/shared/dist/session.js +6 -0
  193. package/node_modules/@dialout/shared/dist/terminal-name.d.ts +25 -0
  194. package/node_modules/@dialout/shared/dist/terminal-name.d.ts.map +1 -0
  195. package/node_modules/@dialout/shared/dist/terminal-name.js +63 -0
  196. package/node_modules/@dialout/shared/dist/tool-appearance.d.ts +9 -0
  197. package/node_modules/@dialout/shared/dist/tool-appearance.d.ts.map +1 -0
  198. package/node_modules/@dialout/shared/dist/tool-appearance.js +30 -0
  199. package/node_modules/@dialout/shared/package.json +37 -0
  200. package/node_modules/@dialout/shared/src/ai-chat-prefs.test.ts +40 -0
  201. package/node_modules/@dialout/shared/src/ai-chat-prefs.ts +39 -0
  202. package/node_modules/@dialout/shared/src/capabilities.ts +30 -0
  203. package/node_modules/@dialout/shared/src/chat-blocks.test.ts +65 -0
  204. package/node_modules/@dialout/shared/src/chat-blocks.ts +79 -0
  205. package/node_modules/@dialout/shared/src/command-filter.test.ts +76 -0
  206. package/node_modules/@dialout/shared/src/command-filter.ts +45 -0
  207. package/node_modules/@dialout/shared/src/composer-behaviour.test.ts +31 -0
  208. package/node_modules/@dialout/shared/src/composer-behaviour.ts +22 -0
  209. package/node_modules/@dialout/shared/src/events.ts +27 -0
  210. package/node_modules/@dialout/shared/src/index.ts +32 -0
  211. package/node_modules/@dialout/shared/src/kinds.ts +5 -0
  212. package/node_modules/@dialout/shared/src/notify.test.ts +49 -0
  213. package/node_modules/@dialout/shared/src/notify.ts +30 -0
  214. package/node_modules/@dialout/shared/src/permission.ts +10 -0
  215. package/node_modules/@dialout/shared/src/scroll-pin.test.ts +23 -0
  216. package/node_modules/@dialout/shared/src/scroll-pin.ts +13 -0
  217. package/node_modules/@dialout/shared/src/session.ts +25 -0
  218. package/node_modules/@dialout/shared/src/terminal-name.ts +82 -0
  219. package/node_modules/@dialout/shared/src/tool-appearance.test.ts +41 -0
  220. package/node_modules/@dialout/shared/src/tool-appearance.ts +39 -0
  221. package/package.json +54 -14
  222. package/scripts/postinstall.js +79 -0
  223. package/scripts/prepack.js +45 -0
  224. package/bin/dialout.js +0 -13
@@ -0,0 +1,268 @@
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.grokTranscriptPath = grokTranscriptPath;
37
+ exports.claudeProjectDir = claudeProjectDir;
38
+ exports.defaultProcStartMs = defaultProcStartMs;
39
+ exports.pickNewest = pickNewest;
40
+ exports.grokTranscript = grokTranscript;
41
+ exports.locateTranscript = locateTranscript;
42
+ const child_process_1 = require("child_process");
43
+ const fs = __importStar(require("fs"));
44
+ const os = __importStar(require("os"));
45
+ // Map a running agent process to the JSONL transcript it is writing.
46
+ //
47
+ // Two tiers, both measured on a real machine 2026-08-21:
48
+ // 1. lsof — some CLIs hold the transcript open for writing, which makes the
49
+ // mapping exact. Always try this first.
50
+ // 2. cwd + newest — Claude Code opens, appends and closes, so lsof finds
51
+ // nothing for it. Narrow by the process's true cwd and its
52
+ // CLAUDE_CONFIG_DIR (which is how two subscriptions on one machine stay
53
+ // apart), then take the newest file and VALIDATE it against the cwd
54
+ // recorded inside the transcript itself.
55
+ const TRANSCRIPT_RE = /\.jsonl$/;
56
+ const CANDIDATE_RE = /\/(projects|sessions)\/.*\.jsonl$/;
57
+ // Grok stores a DIRECTORY per session, not a file:
58
+ // ~/.grok/sessions/<encodeURIComponent(cwd)>/<session-uuid>/chat_history.jsonl
59
+ // The encoding is plain encodeURIComponent — verified against every session
60
+ // directory on a real machine (5/5 round-tripped exactly). Unlike Claude's
61
+ // replace-every-non-alphanumeric-with-dash scheme, this one is reversible,
62
+ // which is why the fallback below can decode a directory back to a cwd.
63
+ function grokTranscriptPath(home, cwd, sessionId) {
64
+ return `${home}/.grok/sessions/${encodeURIComponent(cwd)}/${sessionId}/chat_history.jsonl`;
65
+ }
66
+ // Claude Code escapes the absolute path by replacing every character that is
67
+ // not a letter or digit with '-', so the leading slash becomes a leading dash
68
+ // and dots go too: /Users/me/www/saava.indianic.in
69
+ // -> -Users-me-www-saava-indianic-in
70
+ //
71
+ // Derived by comparing 49 real project directories against the cwd recorded
72
+ // inside them. Replacing only '/' — the obvious first guess — was wrong for 10
73
+ // of those 49, every one of them a path containing a dot.
74
+ function claudeProjectDir(configHome, cwd) {
75
+ return `${configHome}/projects/${cwd.replace(/[^a-zA-Z0-9]/g, '-')}`;
76
+ }
77
+ // Wall-clock start time of a process, ms since epoch; 0 when unknown.
78
+ // `lstart` prints e.g. "Thu Aug 20 13:09:44 2026", which Date.parse handles.
79
+ function defaultProcStartMs(pid) {
80
+ try {
81
+ const out = (0, child_process_1.execFileSync)('ps', ['-o', 'lstart=', '-p', String(pid)], { timeout: 5000, stdio: 'pipe' }).toString().trim();
82
+ const parsed = Date.parse(out);
83
+ return Number.isFinite(parsed) ? parsed : 0;
84
+ }
85
+ catch {
86
+ return 0;
87
+ }
88
+ }
89
+ function pickNewest(files) {
90
+ let best = null;
91
+ for (const f of files) {
92
+ if (!best || f.mtimeMs > best.mtimeMs)
93
+ best = f;
94
+ }
95
+ return best ? best.path : null;
96
+ }
97
+ function defaultWriteHandles(pid) {
98
+ try {
99
+ // -F n prints one 'n<path>' line per open file.
100
+ const out = (0, child_process_1.execFileSync)('lsof', ['-p', String(pid), '-F', 'n'], { timeout: 5000, stdio: 'pipe' }).toString();
101
+ return out.split('\n').filter((l) => l.startsWith('n')).map((l) => l.slice(1));
102
+ }
103
+ catch {
104
+ return [];
105
+ }
106
+ }
107
+ function defaultProcCwd(pid) {
108
+ try {
109
+ if (process.platform === 'linux')
110
+ return fs.readlinkSync(`/proc/${pid}/cwd`);
111
+ const out = (0, child_process_1.execFileSync)('lsof', ['-a', '-p', String(pid), '-d', 'cwd', '-F', 'n'], { timeout: 5000, stdio: 'pipe' }).toString();
112
+ const line = out.split('\n').find((l) => l.startsWith('n'));
113
+ return line ? line.slice(1) : '';
114
+ }
115
+ catch {
116
+ return '';
117
+ }
118
+ }
119
+ function defaultProcEnv(pid) {
120
+ const env = {};
121
+ try {
122
+ const raw = process.platform === 'linux'
123
+ ? fs.readFileSync(`/proc/${pid}/environ`, 'utf8').split('\0')
124
+ : (0, child_process_1.execFileSync)('ps', ['eww', '-p', String(pid), '-o', 'command='], { timeout: 5000, stdio: 'pipe' }).toString().split(' ');
125
+ for (const pair of raw) {
126
+ const eq = pair.indexOf('=');
127
+ if (eq > 0)
128
+ env[pair.slice(0, eq)] = pair.slice(eq + 1);
129
+ }
130
+ }
131
+ catch { /* env is a refinement, never required */ }
132
+ return env;
133
+ }
134
+ function defaultListJsonl(dir) {
135
+ try {
136
+ return fs.readdirSync(dir)
137
+ .filter((n) => TRANSCRIPT_RE.test(n))
138
+ .map((n) => ({ path: `${dir}/${n}`, mtimeMs: fs.statSync(`${dir}/${n}`).mtimeMs }));
139
+ }
140
+ catch {
141
+ return [];
142
+ }
143
+ }
144
+ // Every distinct cwd the head of the transcript mentions. Plural because a
145
+ // session's cwd drifts when the user moves between a repo and its worktree;
146
+ // measured on 3 of 49 real transcripts. Matching only the first record would
147
+ // reject those as belonging to another session.
148
+ //
149
+ // Reads only the head of the file — these grow to megabytes and this runs on
150
+ // every poll.
151
+ function defaultTranscriptCwds(path) {
152
+ try {
153
+ const fd = fs.openSync(path, 'r');
154
+ const buf = Buffer.alloc(64 * 1024);
155
+ const read = fs.readSync(fd, buf, 0, buf.length, 0);
156
+ fs.closeSync(fd);
157
+ const found = new Set();
158
+ for (const line of buf.subarray(0, read).toString().split('\n')) {
159
+ if (!line.trim())
160
+ continue;
161
+ try {
162
+ const rec = JSON.parse(line);
163
+ if (typeof rec.cwd === 'string')
164
+ found.add(rec.cwd);
165
+ else if (typeof rec?.payload?.cwd === 'string')
166
+ found.add(rec.payload.cwd);
167
+ }
168
+ catch { /* a truncated final line is normal */ }
169
+ }
170
+ return Array.from(found);
171
+ }
172
+ catch { /* unreadable */ }
173
+ return [];
174
+ }
175
+ function defaultGrokSessions(home) {
176
+ try {
177
+ const raw = JSON.parse(fs.readFileSync(`${home}/.grok/active_sessions.json`, 'utf8'));
178
+ return Array.isArray(raw) ? raw : [];
179
+ }
180
+ catch {
181
+ return [];
182
+ }
183
+ }
184
+ function defaultGrokNewest(cwdDir) {
185
+ try {
186
+ return fs.readdirSync(cwdDir)
187
+ .map((n) => `${cwdDir}/${n}/chat_history.jsonl`)
188
+ .filter((p) => fs.existsSync(p))
189
+ .map((p) => ({ path: p, mtimeMs: fs.statSync(p).mtimeMs }));
190
+ }
191
+ catch {
192
+ return [];
193
+ }
194
+ }
195
+ // Grok publishes its own pid -> session map at ~/.grok/active_sessions.json:
196
+ // [{ "session_id": "...", "pid": 39647, "cwd": "/abs/path", "opened_at": "..." }]
197
+ //
198
+ // That is strictly better than either generic tier. lsof works only while the
199
+ // CLI holds the file open, and the cwd+newest tier cannot tell two grok
200
+ // sessions in one folder apart — the exact collision that made one Claude pane
201
+ // show another's conversation. An explicit pid is not a heuristic, so try it
202
+ // first and only fall back when the map has no row for this process (a stale
203
+ // file, or a session grok has not registered yet).
204
+ function grokTranscript(pid, home, deps = {}) {
205
+ const sessions = (deps.grokSessions || defaultGrokSessions)(home);
206
+ const row = sessions.find((s) => s && s.pid === pid);
207
+ if (!row || !row.session_id || !row.cwd)
208
+ return null;
209
+ return grokTranscriptPath(home, row.cwd, row.session_id);
210
+ }
211
+ function locateTranscript(pid, kind, deps = {}) {
212
+ const writeHandles = deps.writeHandles || defaultWriteHandles;
213
+ const procCwd = deps.procCwd || defaultProcCwd;
214
+ const procEnv = deps.procEnv || defaultProcEnv;
215
+ const procStartMs = deps.procStartMs || defaultProcStartMs;
216
+ const listJsonl = deps.listJsonl || defaultListJsonl;
217
+ const transcriptCwds = deps.transcriptCwds || defaultTranscriptCwds;
218
+ const exclude = deps.exclude || new Set();
219
+ // Tier 0 — grok tells us outright which session a pid owns.
220
+ if (kind === 'grok') {
221
+ const home = procEnv(pid).HOME || os.homedir();
222
+ const exact = grokTranscript(pid, home, deps);
223
+ if (exact && !exclude.has(exact))
224
+ return exact;
225
+ }
226
+ // Tier 1 — exact.
227
+ const held = writeHandles(pid).find((p) => CANDIDATE_RE.test(p));
228
+ if (held)
229
+ return held;
230
+ // Tier 2 — narrow, then validate.
231
+ const cwd = procCwd(pid);
232
+ if (!cwd)
233
+ return null;
234
+ const env = procEnv(pid);
235
+ const home = env.HOME || os.homedir();
236
+ // Grok's transcripts sit one level deeper than the others and all share the
237
+ // name chat_history.jsonl, so listJsonl() — which lists *.jsonl in one
238
+ // directory — cannot see them at all. Walk its session dirs instead.
239
+ if (kind === 'grok') {
240
+ const grokNewest = deps.grokNewest || defaultGrokNewest;
241
+ const startedAtGrok = procStartMs(pid);
242
+ const found = grokNewest(`${home}/.grok/sessions/${encodeURIComponent(cwd)}`)
243
+ .filter((f) => !exclude.has(f.path))
244
+ .filter((f) => !startedAtGrok || f.mtimeMs >= startedAtGrok);
245
+ return pickNewest(found);
246
+ }
247
+ const dir = kind === 'claude'
248
+ ? claudeProjectDir(env.CLAUDE_CONFIG_DIR || `${home}/.claude`, cwd)
249
+ : `${env.CODEX_HOME || `${home}/.codex`}/sessions`;
250
+ // Every live session writes to its transcript at startup, so a file last
251
+ // touched before this process launched belongs to a session that has ended.
252
+ // startedAt of 0 means `ps` failed and the filter is skipped rather than
253
+ // hiding every session.
254
+ const startedAt = procStartMs(pid);
255
+ const candidates = listJsonl(dir)
256
+ .filter((f) => !exclude.has(f.path))
257
+ .filter((f) => !startedAt || f.mtimeMs >= startedAt);
258
+ const candidate = pickNewest(candidates);
259
+ if (!candidate)
260
+ return null;
261
+ const recorded = transcriptCwds(candidate);
262
+ // A transcript that names no directory we recognise belongs to another
263
+ // session; attaching to it would show the user someone else's conversation.
264
+ if (recorded.length && !recorded.includes(cwd))
265
+ return null;
266
+ return candidate;
267
+ }
268
+ //# sourceMappingURL=ai-transcript-locator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-transcript-locator.js","sourceRoot":"","sources":["../src/ai-transcript-locator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare function splitRecords(buffer: string): {
2
+ records: unknown[];
3
+ rest: string;
4
+ };
5
+ export declare class TranscriptTail {
6
+ private readonly path;
7
+ private readonly onRecords;
8
+ private position;
9
+ private partial;
10
+ private timer;
11
+ lastGrowthMs: number;
12
+ constructor(path: string, onRecords: (records: unknown[]) => void);
13
+ start(): void;
14
+ stop(): void;
15
+ pump(): void;
16
+ }
17
+ //# sourceMappingURL=ai-transcript-tail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-transcript-tail.d.ts","sourceRoot":"","sources":["../src/ai-transcript-tail.ts"],"names":[],"mappings":"AASA,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAcjF;AAED,qBAAa,cAAc;IAOvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAP5B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,KAAK,CAA+B;IAC5C,YAAY,SAAK;gBAGE,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,IAAI;IAG1D,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;IAKZ,IAAI,IAAI,IAAI;CAgCb"}
@@ -0,0 +1,120 @@
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.TranscriptTail = void 0;
37
+ exports.splitRecords = splitRecords;
38
+ const fs = __importStar(require("fs"));
39
+ // Vendor-neutral JSONL follower. It has no idea what a message is; it hands
40
+ // raw records to an adapter. Polled rather than fs.watch-driven: watch is
41
+ // unreliable on network and virtualised filesystems, and a 1 s stat is cheap.
42
+ const POLL_MS = 1000;
43
+ const MAX_CHUNK = 4 << 20; // never read more than 4 MB in one pass
44
+ function splitRecords(buffer) {
45
+ const records = [];
46
+ const lines = buffer.split('\n');
47
+ const rest = lines.pop() ?? '';
48
+ for (const line of lines) {
49
+ if (!line.trim())
50
+ continue;
51
+ try {
52
+ records.push(JSON.parse(line));
53
+ }
54
+ catch {
55
+ // A vendor format change, or a line caught mid-write. Skip it; the
56
+ // feature must degrade, never die.
57
+ }
58
+ }
59
+ return { records, rest };
60
+ }
61
+ class TranscriptTail {
62
+ path;
63
+ onRecords;
64
+ position = 0;
65
+ partial = '';
66
+ timer = null;
67
+ lastGrowthMs = 0;
68
+ constructor(path, onRecords) {
69
+ this.path = path;
70
+ this.onRecords = onRecords;
71
+ }
72
+ start() {
73
+ this.stop();
74
+ this.timer = setInterval(() => this.pump(), POLL_MS);
75
+ this.pump();
76
+ }
77
+ stop() {
78
+ if (this.timer) {
79
+ clearInterval(this.timer);
80
+ this.timer = null;
81
+ }
82
+ }
83
+ // Read from position to EOF. Public so an initial replay can be forced.
84
+ pump() {
85
+ let size;
86
+ try {
87
+ size = fs.statSync(this.path).size;
88
+ }
89
+ catch {
90
+ return; // rotated away or not created yet; try again next tick
91
+ }
92
+ if (size < this.position) {
93
+ // Truncated or replaced. Anything else would emit garbage from the
94
+ // middle of a line.
95
+ this.position = 0;
96
+ this.partial = '';
97
+ }
98
+ if (size === this.position)
99
+ return;
100
+ const length = Math.min(size - this.position, MAX_CHUNK);
101
+ const buf = Buffer.alloc(length);
102
+ let read = 0;
103
+ try {
104
+ const fd = fs.openSync(this.path, 'r');
105
+ read = fs.readSync(fd, buf, 0, length, this.position);
106
+ fs.closeSync(fd);
107
+ }
108
+ catch {
109
+ return;
110
+ }
111
+ this.position += read;
112
+ this.lastGrowthMs = Date.now();
113
+ const { records, rest } = splitRecords(this.partial + buf.subarray(0, read).toString());
114
+ this.partial = rest;
115
+ if (records.length)
116
+ this.onRecords(records);
117
+ }
118
+ }
119
+ exports.TranscriptTail = TranscriptTail;
120
+ //# sourceMappingURL=ai-transcript-tail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-transcript-tail.js","sourceRoot":"","sources":["../src/ai-transcript-tail.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,oCAcC;AAvBD,uCAAyB;AAEzB,4EAA4E;AAC5E,0EAA0E;AAC1E,8EAA8E;AAE9E,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,wCAAwC;AAEnE,SAAgB,YAAY,CAAC,MAAc;IACzC,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,mEAAmE;YACnE,mCAAmC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAa,cAAc;IAON;IACA;IAPX,QAAQ,GAAG,CAAC,CAAC;IACb,OAAO,GAAG,EAAE,CAAC;IACb,KAAK,GAA0B,IAAI,CAAC;IAC5C,YAAY,GAAG,CAAC,CAAC;IAEjB,YACmB,IAAY,EACZ,SAAuC;QADvC,SAAI,GAAJ,IAAI,CAAQ;QACZ,cAAS,GAAT,SAAS,CAA8B;IACvD,CAAC;IAEJ,KAAK;QACH,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAAC,CAAC;IACnE,CAAC;IAED,wEAAwE;IACxE,IAAI;QACF,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,uDAAuD;QACjE,CAAC;QACD,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,mEAAmE;YACnE,oBAAoB;YACpB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACvC,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtD,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE/B,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,OAAO,CAAC,MAAM;YAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;CACF;AAtDD,wCAsDC"}
@@ -0,0 +1,20 @@
1
+ export interface ChecklistItem {
2
+ /** Display name, e.g. "Hyper". */
3
+ label: string;
4
+ /** Canonical token stored in config and matched at runtime. */
5
+ token: string;
6
+ /** Optional parenthetical, e.g. "not installed" / "this terminal". */
7
+ hint?: string;
8
+ checked: boolean;
9
+ }
10
+ export interface ChecklistState {
11
+ items: ChecklistItem[];
12
+ cursor: number;
13
+ }
14
+ export declare function clampCursor(len: number, cursor: number): number;
15
+ export declare function moveCursor(state: ChecklistState, delta: number): ChecklistState;
16
+ export declare function toggleAt(state: ChecklistState, index?: number): ChecklistState;
17
+ export declare function toggleAll(state: ChecklistState): ChecklistState;
18
+ export declare function selectedTokens(state: ChecklistState): string[];
19
+ export declare function renderChecklist(state: ChecklistState): string;
20
+ //# sourceMappingURL=checklist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checklist.d.ts","sourceRoot":"","sources":["../src/checklist.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAE/E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,CAK9E;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAI/D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAE9D;AAID,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAS7D"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ // Pure state + rendering for the interactive terminal-app multi-select used by
3
+ // `setup-cowork`. All functions are immutable (return new state) so the
4
+ // raw-mode driver in cli.ts stays a thin keypress→state→redraw loop.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.clampCursor = clampCursor;
7
+ exports.moveCursor = moveCursor;
8
+ exports.toggleAt = toggleAt;
9
+ exports.toggleAll = toggleAll;
10
+ exports.selectedTokens = selectedTokens;
11
+ exports.renderChecklist = renderChecklist;
12
+ function clampCursor(len, cursor) {
13
+ if (len <= 0)
14
+ return 0;
15
+ if (cursor < 0)
16
+ return 0;
17
+ if (cursor > len - 1)
18
+ return len - 1;
19
+ return cursor;
20
+ }
21
+ function moveCursor(state, delta) {
22
+ return { ...state, cursor: clampCursor(state.items.length, state.cursor + delta) };
23
+ }
24
+ function toggleAt(state, index) {
25
+ const i = index ?? state.cursor;
26
+ if (i < 0 || i >= state.items.length)
27
+ return state;
28
+ const items = state.items.map((it, idx) => (idx === i ? { ...it, checked: !it.checked } : it));
29
+ return { ...state, items };
30
+ }
31
+ function toggleAll(state) {
32
+ const allChecked = state.items.length > 0 && state.items.every((it) => it.checked);
33
+ const items = state.items.map((it) => ({ ...it, checked: !allChecked }));
34
+ return { ...state, items };
35
+ }
36
+ function selectedTokens(state) {
37
+ return state.items.filter((it) => it.checked).map((it) => it.token);
38
+ }
39
+ // One line per item: '› ' marks the cursor row (two spaces otherwise), then
40
+ // '[x]'/'[ ]', the label, and an optional '(hint)'.
41
+ function renderChecklist(state) {
42
+ return state.items
43
+ .map((it, i) => {
44
+ const pointer = i === state.cursor ? '›' : ' ';
45
+ const box = it.checked ? '[x]' : '[ ]';
46
+ const hint = it.hint ? ` (${it.hint})` : '';
47
+ return `${pointer} ${box} ${it.label}${hint}`;
48
+ })
49
+ .join('\n');
50
+ }
51
+ //# sourceMappingURL=checklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checklist.js","sourceRoot":"","sources":["../src/checklist.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}