@agtd/agent 0.1.1 → 0.1.2

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 (109) hide show
  1. package/dist/__tests__/codexAdapterFindFile.test.d.ts +2 -0
  2. package/dist/__tests__/codexAdapterFindFile.test.d.ts.map +1 -0
  3. package/dist/__tests__/codexAdapterFindFile.test.js +298 -0
  4. package/dist/__tests__/codexAdapterFindFile.test.js.map +1 -0
  5. package/dist/__tests__/enrichers.test.d.ts +2 -0
  6. package/dist/__tests__/enrichers.test.d.ts.map +1 -0
  7. package/dist/__tests__/enrichers.test.js +47 -0
  8. package/dist/__tests__/enrichers.test.js.map +1 -0
  9. package/dist/__tests__/tmux.integration.test.d.ts +2 -0
  10. package/dist/__tests__/tmux.integration.test.d.ts.map +1 -0
  11. package/dist/__tests__/tmux.integration.test.js +112 -0
  12. package/dist/__tests__/tmux.integration.test.js.map +1 -0
  13. package/dist/__tests__/tmux.test.d.ts +2 -0
  14. package/dist/__tests__/tmux.test.d.ts.map +1 -0
  15. package/dist/__tests__/tmux.test.js +26 -0
  16. package/dist/__tests__/tmux.test.js.map +1 -0
  17. package/dist/__tests__/transcriptAdapters.test.d.ts +2 -0
  18. package/dist/__tests__/transcriptAdapters.test.d.ts.map +1 -0
  19. package/dist/__tests__/transcriptAdapters.test.js +133 -0
  20. package/dist/__tests__/transcriptAdapters.test.js.map +1 -0
  21. package/dist/adapters/claude-code.d.ts +3 -0
  22. package/dist/adapters/claude-code.d.ts.map +1 -0
  23. package/dist/adapters/claude-code.js +48 -0
  24. package/dist/adapters/claude-code.js.map +1 -0
  25. package/dist/adapters/codex.d.ts +3 -0
  26. package/dist/adapters/codex.d.ts.map +1 -0
  27. package/dist/adapters/codex.js +33 -0
  28. package/dist/adapters/codex.js.map +1 -0
  29. package/dist/adapters/generic.d.ts +3 -0
  30. package/dist/adapters/generic.d.ts.map +1 -0
  31. package/dist/adapters/generic.js +38 -0
  32. package/dist/adapters/generic.js.map +1 -0
  33. package/dist/adapters/index.d.ts +7 -0
  34. package/dist/adapters/index.d.ts.map +1 -0
  35. package/dist/adapters/index.js +12 -0
  36. package/dist/adapters/index.js.map +1 -0
  37. package/dist/agent.d.ts +3 -0
  38. package/dist/agent.d.ts.map +1 -0
  39. package/dist/agent.js +49 -6
  40. package/dist/agent.js.map +1 -0
  41. package/dist/cli.d.ts +11 -0
  42. package/dist/cli.d.ts.map +1 -0
  43. package/dist/cli.js +120 -186
  44. package/dist/cli.js.map +1 -0
  45. package/dist/config.d.ts +26 -0
  46. package/dist/config.d.ts.map +1 -0
  47. package/dist/config.js +48 -0
  48. package/dist/config.js.map +1 -0
  49. package/dist/enrichers/git.d.ts +6 -0
  50. package/dist/enrichers/git.d.ts.map +1 -0
  51. package/dist/enrichers/git.js +20 -0
  52. package/dist/enrichers/git.js.map +1 -0
  53. package/dist/enrichers/pr.d.ts +2 -0
  54. package/dist/enrichers/pr.d.ts.map +1 -0
  55. package/dist/enrichers/pr.js +10 -0
  56. package/dist/enrichers/pr.js.map +1 -0
  57. package/dist/enrichers/transcript.d.ts +8 -0
  58. package/dist/enrichers/transcript.d.ts.map +1 -0
  59. package/dist/enrichers/transcript.js +33 -0
  60. package/dist/enrichers/transcript.js.map +1 -0
  61. package/dist/heartbeat.d.ts +4 -0
  62. package/dist/heartbeat.d.ts.map +1 -0
  63. package/dist/heartbeat.js +15 -0
  64. package/dist/heartbeat.js.map +1 -0
  65. package/dist/init.d.ts +10 -0
  66. package/dist/init.d.ts.map +1 -0
  67. package/dist/init.js +70 -0
  68. package/dist/init.js.map +1 -0
  69. package/dist/register.d.ts +3 -0
  70. package/dist/register.d.ts.map +1 -0
  71. package/dist/register.js +22 -0
  72. package/dist/register.js.map +1 -0
  73. package/dist/sessionScanner.d.ts +20 -0
  74. package/dist/sessionScanner.d.ts.map +1 -0
  75. package/dist/sessionScanner.js +479 -0
  76. package/dist/sessionScanner.js.map +1 -0
  77. package/dist/spawn.d.ts +8 -0
  78. package/dist/spawn.d.ts.map +1 -0
  79. package/dist/spawn.js +73 -0
  80. package/dist/spawn.js.map +1 -0
  81. package/dist/syncProjects.d.ts +3 -0
  82. package/dist/syncProjects.d.ts.map +1 -0
  83. package/dist/syncProjects.js +91 -0
  84. package/dist/syncProjects.js.map +1 -0
  85. package/dist/terminalBridge.d.ts +4 -0
  86. package/dist/terminalBridge.d.ts.map +1 -0
  87. package/dist/terminalBridge.js +42 -0
  88. package/dist/terminalBridge.js.map +1 -0
  89. package/dist/tmux.d.ts +21 -0
  90. package/dist/tmux.d.ts.map +1 -0
  91. package/dist/tmux.js +89 -0
  92. package/dist/tmux.js.map +1 -0
  93. package/dist/transcriptAdapters/claude-code.d.ts +3 -0
  94. package/dist/transcriptAdapters/claude-code.d.ts.map +1 -0
  95. package/dist/transcriptAdapters/claude-code.js +147 -0
  96. package/dist/transcriptAdapters/claude-code.js.map +1 -0
  97. package/dist/transcriptAdapters/codex.d.ts +3 -0
  98. package/dist/transcriptAdapters/codex.d.ts.map +1 -0
  99. package/dist/transcriptAdapters/codex.js +251 -0
  100. package/dist/transcriptAdapters/codex.js.map +1 -0
  101. package/dist/transcriptAdapters/index.d.ts +17 -0
  102. package/dist/transcriptAdapters/index.d.ts.map +1 -0
  103. package/dist/transcriptAdapters/index.js +9 -0
  104. package/dist/transcriptAdapters/index.js.map +1 -0
  105. package/dist/wsClient.d.ts +6 -0
  106. package/dist/wsClient.d.ts.map +1 -0
  107. package/dist/wsClient.js +156 -0
  108. package/dist/wsClient.js.map +1 -0
  109. package/package.json +6 -2
@@ -0,0 +1,251 @@
1
+ // packages/agent/src/transcriptAdapters/codex.ts
2
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { homedir } from "node:os";
5
+ import { execSync } from "node:child_process";
6
+ import { registerAdapter, } from "./index.js";
7
+ function truncate(s, max) {
8
+ if (!s)
9
+ return "";
10
+ return s.length > max ? s.slice(0, max) + "..." : s;
11
+ }
12
+ function extractCodexText(content) {
13
+ if (!content)
14
+ return "";
15
+ if (typeof content === "string")
16
+ return content;
17
+ if (!Array.isArray(content))
18
+ return "";
19
+ return content
20
+ .map((c) => c.text || "")
21
+ .filter((t) => t.trim())
22
+ .join("\n");
23
+ }
24
+ function summarizeCodexToolInput(name, args) {
25
+ if (name === "exec_command" || name === "shell")
26
+ return { cmd: truncate(args.cmd, 200) };
27
+ if (name === "read_file" || name === "write_file")
28
+ return {
29
+ path: args.path || args.file_path,
30
+ content: args.content ? truncate(args.content, 100) : undefined,
31
+ };
32
+ return Object.fromEntries(Object.entries(args)
33
+ .slice(0, 3)
34
+ .map(([k, v]) => [k, typeof v === "string" ? truncate(v, 150) : v]));
35
+ }
36
+ function parseRecord(record, counter) {
37
+ if (!record.type || !record.payload)
38
+ return null;
39
+ const p = record.payload;
40
+ const ts = record.timestamp || "";
41
+ if (record.type !== "response_item")
42
+ return null;
43
+ if (p.type === "message" && p.role === "user") {
44
+ // Split multi-item content into separate messages so each appears as its own bubble
45
+ const texts = Array.isArray(p.content)
46
+ ? p.content
47
+ .map((c) => (typeof c === "string" ? c : c.text || ""))
48
+ .filter((t) => t.trim() && !t.startsWith("#") && !t.startsWith("<permissions"))
49
+ : (() => {
50
+ const t = extractCodexText(p.content);
51
+ return t && !t.startsWith("#") && !t.startsWith("<permissions")
52
+ ? [t]
53
+ : [];
54
+ })();
55
+ if (texts.length === 0)
56
+ return null;
57
+ if (texts.length === 1)
58
+ return {
59
+ id: `codex-${++counter.value}`,
60
+ role: "user",
61
+ timestamp: ts,
62
+ content: [{ type: "text", text: texts[0] }],
63
+ };
64
+ return texts.map((text) => ({
65
+ id: `codex-${++counter.value}`,
66
+ role: "user",
67
+ timestamp: ts,
68
+ content: [{ type: "text", text }],
69
+ }));
70
+ }
71
+ if (p.type === "message" && p.role === "assistant") {
72
+ const text = extractCodexText(p.content);
73
+ if (!text)
74
+ return null;
75
+ return {
76
+ id: `codex-${++counter.value}`,
77
+ role: "assistant",
78
+ timestamp: ts,
79
+ content: [{ type: "text", text }],
80
+ model: "codex",
81
+ };
82
+ }
83
+ if (p.type === "reasoning") {
84
+ const summaryText = Array.isArray(p.summary) && p.summary.length > 0
85
+ ? p.summary.map((s) => s.text || "").join("\n")
86
+ : null;
87
+ if (!summaryText)
88
+ return null;
89
+ return {
90
+ id: `codex-${++counter.value}`,
91
+ role: "assistant",
92
+ timestamp: ts,
93
+ content: [{ type: "thinking", text: summaryText }],
94
+ };
95
+ }
96
+ if (p.type === "function_call") {
97
+ let args = {};
98
+ try {
99
+ args =
100
+ typeof p.arguments === "string"
101
+ ? JSON.parse(p.arguments)
102
+ : p.arguments || {};
103
+ }
104
+ catch {
105
+ args = { raw: truncate(p.arguments, 200) };
106
+ }
107
+ return {
108
+ id: `codex-${++counter.value}`,
109
+ role: "assistant",
110
+ timestamp: ts,
111
+ content: [
112
+ {
113
+ type: "tool_use",
114
+ toolName: p.name || "unknown",
115
+ toolInput: summarizeCodexToolInput(p.name, args),
116
+ },
117
+ ],
118
+ };
119
+ }
120
+ if (p.type === "function_call_output") {
121
+ const output = typeof p.output === "string" ? p.output : "";
122
+ if (!output.trim())
123
+ return null;
124
+ return {
125
+ id: `codex-${++counter.value}`,
126
+ role: "assistant",
127
+ timestamp: ts,
128
+ content: [{ type: "tool_result", text: truncate(output, 500) }],
129
+ };
130
+ }
131
+ return null;
132
+ }
133
+ function safeReaddir(dir) {
134
+ try {
135
+ return readdirSync(dir);
136
+ }
137
+ catch {
138
+ return [];
139
+ }
140
+ }
141
+ function findLatestJsonl(dir) {
142
+ let latest = null;
143
+ try {
144
+ for (const year of readdirSync(dir)) {
145
+ for (const month of safeReaddir(join(dir, year))) {
146
+ for (const day of safeReaddir(join(dir, year, month))) {
147
+ for (const file of safeReaddir(join(dir, year, month, day))) {
148
+ if (!file.endsWith(".jsonl"))
149
+ continue;
150
+ const fp = join(dir, year, month, day, file);
151
+ try {
152
+ const { mtimeMs } = statSync(fp);
153
+ if (!latest || mtimeMs > latest.mtime)
154
+ latest = { path: fp, mtime: mtimeMs };
155
+ }
156
+ catch {
157
+ continue;
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ }
164
+ catch {
165
+ /* ignore */
166
+ }
167
+ return latest?.path ?? null;
168
+ }
169
+ export const codexAdapter = {
170
+ findFile(session, homeDir = homedir()) {
171
+ const s = session;
172
+ const dbPath = join(homeDir, ".codex", "state_5.sqlite");
173
+ if (existsSync(dbPath)) {
174
+ try {
175
+ const safeDb = dbPath.replace(/'/g, "'\\''");
176
+ // Prefer the stored Codex thread ID — set at spawn time, uniquely identifies
177
+ // this session's thread even when multiple sessions share the same cwd.
178
+ if (s.codexThreadId) {
179
+ // Thread IDs are UUIDs — no special chars, single-quote wrapping is fine
180
+ const safeId = s.codexThreadId.replace(/'/g, "'\\''");
181
+ const idOutput = execSync(`sqlite3 '${safeDb}' "SELECT rollout_path FROM threads WHERE id='${safeId}' LIMIT 1;"`, { encoding: "utf-8", timeout: 3000, stdio: "pipe" }).trim();
182
+ if (idOutput && existsSync(idOutput))
183
+ return idOutput;
184
+ }
185
+ // Fallback: use tmux session creation time to find the right thread.
186
+ // The tmux session was created when agtd spawned the agent, so the Codex thread
187
+ // created at or after that time belongs to this session.
188
+ if (session.cwd && s.tmuxSession) {
189
+ try {
190
+ const safeTmux = s.tmuxSession.replace(/'/g, "'\\''");
191
+ const tmuxCreated = execSync(`tmux display-message -t '${safeTmux}' -p '#{session_created}'`, { encoding: "utf-8", timeout: 2000, stdio: "pipe" }).trim();
192
+ if (tmuxCreated && /^\d+$/.test(tmuxCreated)) {
193
+ // Use double-quote outer wrapping so the cwd single quotes are literal
194
+ const safeCwd = session.cwd.replace(/"/g, '\\"');
195
+ const tsOutput = execSync(`sqlite3 '${safeDb}' "SELECT rollout_path FROM threads WHERE cwd='${safeCwd}' AND archived=0 AND created_at >= ${tmuxCreated} ORDER BY created_at ASC LIMIT 1;"`, { encoding: "utf-8", timeout: 3000, stdio: "pipe" }).trim();
196
+ if (tsOutput && existsSync(tsOutput))
197
+ return tsOutput;
198
+ }
199
+ }
200
+ catch {
201
+ /* tmux unavailable or session gone — fall through to Tier 3 */
202
+ }
203
+ }
204
+ // Last resort: most recently updated thread for this cwd.
205
+ if (session.cwd) {
206
+ const safeCwd = session.cwd.replace(/"/g, '\\"');
207
+ const cwdOutput = execSync(`sqlite3 '${safeDb}' "SELECT rollout_path FROM threads WHERE cwd='${safeCwd}' AND archived=0 ORDER BY updated_at DESC LIMIT 1;"`, { encoding: "utf-8", timeout: 3000, stdio: "pipe" }).trim();
208
+ if (cwdOutput && existsSync(cwdOutput))
209
+ return cwdOutput;
210
+ }
211
+ }
212
+ catch {
213
+ /* SQLite unavailable */
214
+ }
215
+ }
216
+ const sessionsDir = join(homeDir, ".codex", "sessions");
217
+ if (!existsSync(sessionsDir))
218
+ return null;
219
+ return findLatestJsonl(sessionsDir);
220
+ },
221
+ parse(filePath, cursor, limit) {
222
+ try {
223
+ const content = readFileSync(filePath, "utf-8");
224
+ const lines = content.split("\n").filter((l) => l.trim());
225
+ const counter = { value: 0 };
226
+ const messages = [];
227
+ for (const line of lines) {
228
+ try {
229
+ const record = JSON.parse(line);
230
+ const msg = parseRecord(record, counter);
231
+ if (Array.isArray(msg))
232
+ messages.push(...msg);
233
+ else if (msg)
234
+ messages.push(msg);
235
+ }
236
+ catch {
237
+ /* skip */
238
+ }
239
+ }
240
+ const total = messages.length;
241
+ const page = messages.slice(cursor, cursor + limit);
242
+ const nextCursor = cursor + page.length;
243
+ return { messages: page, total, hasMore: nextCursor < total, nextCursor };
244
+ }
245
+ catch {
246
+ return { messages: [], total: 0, hasMore: false, nextCursor: 0 };
247
+ }
248
+ },
249
+ };
250
+ registerAdapter("codex", codexAdapter);
251
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/transcriptAdapters/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { TranscriptMessage, Session } from "@agtd/shared";
2
+ export interface ParseResult {
3
+ messages: TranscriptMessage[];
4
+ total: number;
5
+ hasMore: boolean;
6
+ nextCursor: number;
7
+ }
8
+ export interface TranscriptAdapter {
9
+ /** Return absolute path to transcript file, or null if not found.
10
+ * `homeDir` is optional and defaults to `os.homedir()` — used in tests to inject a tmp dir. */
11
+ findFile(session: Session, homeDir?: string): string | null;
12
+ /** Parse messages starting from `cursor` (0-based index into the message array), returning up to `limit` */
13
+ parse(filePath: string, cursor: number, limit: number): ParseResult;
14
+ }
15
+ export declare function registerAdapter(agentType: string, adapter: TranscriptAdapter): void;
16
+ export declare function getAdapter(agentType: string): TranscriptAdapter | undefined;
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transcriptAdapters/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC;oGACgG;IAChG,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5D,4GAA4G;IAC5G,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC;CACrE;AAKD,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,IAAI,CAEN;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAE3E"}
@@ -0,0 +1,9 @@
1
+ // Registry is populated by the individual adapter modules
2
+ const adapters = new Map();
3
+ export function registerAdapter(agentType, adapter) {
4
+ adapters.set(agentType, adapter);
5
+ }
6
+ export function getAdapter(agentType) {
7
+ return adapters.get(agentType);
8
+ }
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transcriptAdapters/index.ts"],"names":[],"mappings":"AAkBA,0DAA0D;AAC1D,MAAM,QAAQ,GAAmC,IAAI,GAAG,EAAE,CAAC;AAE3D,MAAM,UAAU,eAAe,CAC7B,SAAiB,EACjB,OAA0B;IAE1B,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import WebSocket from "ws";
2
+ import type { AgentConfig } from "./config.js";
3
+ import "./transcriptAdapters/claude-code.js";
4
+ import "./transcriptAdapters/codex.js";
5
+ export declare function connectToBackend(config: AgentConfig): WebSocket;
6
+ //# sourceMappingURL=wsClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsClient.d.ts","sourceRoot":"","sources":["../src/wsClient.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAY/C,OAAO,qCAAqC,CAAC;AAC7C,OAAO,+BAA+B,CAAC;AAIvC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAwL/D"}
@@ -0,0 +1,156 @@
1
+ import WebSocket from "ws";
2
+ import { spawnAgentSession } from "./spawn.js";
3
+ import { startTerminalBridge, stopTerminalBridge } from "./terminalBridge.js";
4
+ import { sendKeys, isTmuxAvailable, tmuxExec, tmuxSessionExists, sanitizeShellArg, } from "./tmux.js";
5
+ import { getAdapter } from "./transcriptAdapters/index.js";
6
+ import "./transcriptAdapters/claude-code.js"; // side-effect: registers adapter
7
+ import "./transcriptAdapters/codex.js"; // side-effect: registers adapter
8
+ let reconnectAttempts = 0;
9
+ export function connectToBackend(config) {
10
+ const wsUrl = config.backendUrl.replace(/^http/, "ws") +
11
+ `/ws/agent/${config.deviceId}?apiKey=${encodeURIComponent(config.apiKey)}`;
12
+ console.log(`Connecting to backend WS: ${config.backendUrl}/ws/agent/${config.deviceId}`);
13
+ const ws = new WebSocket(wsUrl);
14
+ ws.on("open", () => {
15
+ reconnectAttempts = 0;
16
+ console.log("Connected to backend WebSocket");
17
+ });
18
+ ws.on("message", async (data) => {
19
+ try {
20
+ const msg = JSON.parse(data.toString());
21
+ switch (msg.type) {
22
+ case "spawn-session": {
23
+ const { projectPath, projectName, agentType, task } = msg.payload;
24
+ const sessionId = await spawnAgentSession(config, {
25
+ projectPath,
26
+ projectName,
27
+ agentType,
28
+ task,
29
+ });
30
+ ws.send(JSON.stringify({
31
+ type: "session-started",
32
+ payload: { sessionId },
33
+ }));
34
+ break;
35
+ }
36
+ case "kill-session": {
37
+ const { sessionId, tmuxSession } = msg.payload;
38
+ stopTerminalBridge(sessionId);
39
+ if (tmuxSession && tmuxSessionExists(tmuxSession)) {
40
+ tmuxExec(`tmux kill-session -t '${sanitizeShellArg(tmuxSession)}'`);
41
+ console.log(`Killed tmux session: ${tmuxSession}`);
42
+ }
43
+ ws.send(JSON.stringify({
44
+ type: "session-ended",
45
+ payload: { sessionId },
46
+ }));
47
+ break;
48
+ }
49
+ case "attach-terminal": {
50
+ const { sessionId, tmuxSession } = msg.payload;
51
+ startTerminalBridge(sessionId, tmuxSession, ws);
52
+ break;
53
+ }
54
+ case "detach-terminal": {
55
+ stopTerminalBridge(msg.payload.sessionId);
56
+ break;
57
+ }
58
+ case "terminal-input": {
59
+ if (isTmuxAvailable()) {
60
+ sendKeys(msg.payload.tmuxSession, msg.payload.data);
61
+ }
62
+ break;
63
+ }
64
+ case "user-message": {
65
+ const tmuxAvail = isTmuxAvailable();
66
+ const sessionExists = tmuxSessionExists(msg.payload.tmuxSession);
67
+ // Dump current pane list so we can see active window/pane
68
+ let paneInfo = "n/a";
69
+ try {
70
+ paneInfo = tmuxExec(`tmux list-panes -t '${sanitizeShellArg(msg.payload.tmuxSession)}' -F '#I:#P #{pane_current_command} #{pane_active}'`).trim();
71
+ }
72
+ catch { }
73
+ console.log(`[user-message] session=${msg.payload.tmuxSession} exists=${sessionExists} available=${tmuxAvail} panes="${paneInfo}" msg="${msg.payload.message?.slice(0, 80)}"`);
74
+ if (tmuxAvail && sessionExists) {
75
+ try {
76
+ // Capture pane BEFORE send so we can see Codex's current state in logs
77
+ let paneBefore = "";
78
+ try {
79
+ paneBefore = tmuxExec(`tmux capture-pane -t '${sanitizeShellArg(msg.payload.tmuxSession)}' -p -S -10`)
80
+ .split("\n")
81
+ .slice(-5)
82
+ .join(" | ");
83
+ }
84
+ catch { }
85
+ console.log(`[user-message] pane-before: ${paneBefore}`);
86
+ // Send text first, then CR (0x0d) as a SEPARATE tmux command with a
87
+ // short delay. When text+CR arrive in one PTY write Codex processes the
88
+ // text chars but drops the CR. xterm.js sends each keystroke as a separate
89
+ // write — sending CR separately mirrors that and Codex accepts the Enter.
90
+ sendKeys(msg.payload.tmuxSession, msg.payload.message);
91
+ await new Promise((r) => setTimeout(r, 80));
92
+ sendKeys(msg.payload.tmuxSession, "\r");
93
+ console.log(`[user-message] sent OK`);
94
+ // Capture pane AFTER send to verify bytes arrived
95
+ await new Promise((r) => setTimeout(r, 500));
96
+ let paneAfter = "";
97
+ try {
98
+ paneAfter = tmuxExec(`tmux capture-pane -t '${sanitizeShellArg(msg.payload.tmuxSession)}' -p -S -10`)
99
+ .split("\n")
100
+ .slice(-5)
101
+ .join(" | ");
102
+ }
103
+ catch { }
104
+ console.log(`[user-message] pane-after: ${paneAfter}`);
105
+ }
106
+ catch (e) {
107
+ console.error(`[user-message] sendKeys failed:`, e);
108
+ }
109
+ }
110
+ break;
111
+ }
112
+ case "get-transcript": {
113
+ // Single destructure — all fields come from the same payload object
114
+ const { requestId, sessionId, agentType, cwd, cursor = 0, limit = 50, codexThreadId = null, tmuxSession = null, } = msg.payload;
115
+ const adapter = getAdapter(agentType);
116
+ let result = {
117
+ messages: [],
118
+ total: 0,
119
+ hasMore: false,
120
+ nextCursor: 0,
121
+ };
122
+ if (adapter) {
123
+ const fakeSession = {
124
+ id: sessionId,
125
+ cwd,
126
+ agentType,
127
+ codexThreadId,
128
+ tmuxSession,
129
+ };
130
+ const filePath = adapter.findFile(fakeSession);
131
+ if (filePath) {
132
+ result = adapter.parse(filePath, cursor, limit);
133
+ }
134
+ }
135
+ ws.send(JSON.stringify({
136
+ type: "transcript-response",
137
+ payload: { requestId, ...result },
138
+ }));
139
+ break;
140
+ }
141
+ }
142
+ }
143
+ catch (e) {
144
+ console.error("Error handling WS message:", e);
145
+ }
146
+ });
147
+ ws.on("close", () => {
148
+ const delaySec = Math.min(2 ** Math.min(reconnectAttempts, 5), 32);
149
+ reconnectAttempts++;
150
+ console.log(`Disconnected. Reconnecting in ${delaySec}s...`);
151
+ setTimeout(() => connectToBackend(config), delaySec * 1000);
152
+ });
153
+ ws.on("error", (e) => console.error("WS error:", e.message));
154
+ return ws;
155
+ }
156
+ //# sourceMappingURL=wsClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsClient.js","sourceRoot":"","sources":["../src/wsClient.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,16 @@
1
1
  {
2
2
  "name": "@agtd/agent",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "agtd-agent": "./bin/agtd-agent.js"
7
7
  },
8
8
  "main": "dist/agent.js",
9
- "files": ["bin", "dist", "README.md"],
9
+ "files": [
10
+ "bin",
11
+ "dist",
12
+ "README.md"
13
+ ],
10
14
  "scripts": {
11
15
  "dev": "tsx watch src/agent.ts",
12
16
  "build": "tsc",