@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
package/dist/cli.js CHANGED
@@ -1,117 +1,45 @@
1
- import {
2
- mergeCliOverrides,
3
- parseConfigFile,
4
- resolveConfigPath,
5
- startAgent
6
- } from "./chunk-24ORBJSI.js";
7
-
8
- // src/cli.ts
9
- import { execSync } from "child_process";
10
- import { createInterface as createInterface2 } from "readline/promises";
11
- import { platform as platform2 } from "os";
12
-
13
- // src/init.ts
14
- import { createInterface } from "readline/promises";
15
- import { mkdirSync, writeFileSync } from "fs";
16
- import { resolve } from "path";
17
- import { hostname, platform, homedir } from "os";
18
- function buildConfigFromAnswers(answers) {
19
- return {
20
- deviceId: hostname(),
21
- deviceName: answers.deviceName || `${hostname()}-${platform()}`,
22
- backendUrl: answers.backendUrl,
23
- apiKey: answers.apiKey,
24
- projects: [],
25
- projectDirs: answers.projectDirs ? answers.projectDirs.split(",").map((d) => d.trim()).filter(Boolean) : []
26
- };
27
- }
28
- async function validateBackend(url) {
29
- try {
30
- const res = await fetch(`${url}/health`);
31
- return res.ok;
32
- } catch {
33
- return false;
34
- }
35
- }
36
- async function runInitWizard() {
37
- const rl = createInterface({ input: process.stdin, output: process.stdout });
38
- console.log("\nNo config found. Let's set up your agent.\n");
39
- try {
40
- const backendUrl = await rl.question("Backend URL: ");
41
- if (!backendUrl) {
42
- throw new Error("Backend URL is required");
43
- }
44
- process.stdout.write("Checking backend... ");
45
- const reachable = await validateBackend(backendUrl);
46
- if (!reachable) {
47
- console.log("unreachable (continuing anyway)");
48
- } else {
49
- console.log("ok");
50
- }
51
- const apiKey = await rl.question("API Key: ");
52
- if (!apiKey) {
53
- throw new Error("API Key is required");
54
- }
55
- const defaultName = `${hostname()}-${platform()}`;
56
- const deviceName = await rl.question(`Device name (${defaultName}): `);
57
- const projectDirs = await rl.question(
58
- "Project directories (comma-separated, optional): "
59
- );
60
- const config = buildConfigFromAnswers({
61
- backendUrl,
62
- apiKey,
63
- deviceName,
64
- projectDirs
65
- });
66
- const configDir = resolve(homedir(), ".agtd");
67
- const configPath = resolve(configDir, "agent.config.json");
68
- mkdirSync(configDir, { recursive: true });
69
- writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
70
- console.log(`
71
- Config saved to ${configPath}
72
- `);
73
- return config;
74
- } finally {
75
- rl.close();
76
- }
77
- }
78
-
79
- // src/cli.ts
80
- function parseArgs(argv) {
81
- const args = { init: false, help: false };
82
- for (let i = 2; i < argv.length; i++) {
83
- const arg = argv[i];
84
- const next = argv[i + 1];
85
- switch (arg) {
86
- case "--init":
87
- args.init = true;
88
- break;
89
- case "--backend":
90
- args.backend = next;
91
- i++;
92
- break;
93
- case "--api-key":
94
- args.apiKey = next;
95
- i++;
96
- break;
97
- case "--device-name":
98
- args.deviceName = next;
99
- i++;
100
- break;
101
- case "--config":
102
- args.configPath = next;
103
- i++;
104
- break;
105
- case "--help":
106
- case "-h":
107
- args.help = true;
108
- break;
1
+ import { execSync } from "node:child_process";
2
+ import { createInterface } from "node:readline/promises";
3
+ import { platform } from "node:os";
4
+ import { resolveConfigPath, parseConfigFile, mergeCliOverrides, } from "./config.js";
5
+ import { runInitWizard } from "./init.js";
6
+ import { startAgent } from "./agent.js";
7
+ import { buildConfigFromAnswers } from "./init.js";
8
+ export function parseArgs(argv) {
9
+ const args = { init: false, help: false };
10
+ for (let i = 2; i < argv.length; i++) {
11
+ const arg = argv[i];
12
+ const next = argv[i + 1];
13
+ switch (arg) {
14
+ case "--init":
15
+ args.init = true;
16
+ break;
17
+ case "--backend":
18
+ args.backend = next;
19
+ i++;
20
+ break;
21
+ case "--api-key":
22
+ args.apiKey = next;
23
+ i++;
24
+ break;
25
+ case "--device-name":
26
+ args.deviceName = next;
27
+ i++;
28
+ break;
29
+ case "--config":
30
+ args.configPath = next;
31
+ i++;
32
+ break;
33
+ case "--help":
34
+ case "-h":
35
+ args.help = true;
36
+ break;
37
+ }
109
38
  }
110
- }
111
- return args;
39
+ return args;
112
40
  }
113
41
  function printHelp() {
114
- console.log(`
42
+ console.log(`
115
43
  Usage: agtd-agent [options]
116
44
 
117
45
  Options:
@@ -131,86 +59,92 @@ Config is loaded from (in order):
131
59
  `);
132
60
  }
133
61
  function hasTmux() {
134
- try {
135
- execSync("which tmux", { stdio: "ignore" });
136
- return true;
137
- } catch {
138
- return false;
139
- }
62
+ try {
63
+ execSync("which tmux", { stdio: "ignore" });
64
+ return true;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
140
69
  }
141
70
  async function ensureTmux() {
142
- if (hasTmux()) return;
143
- const os = platform2();
144
- let installCmd;
145
- if (os === "darwin") {
146
- installCmd = "brew install tmux";
147
- } else if (os === "linux") {
148
- installCmd = "sudo apt install -y tmux";
149
- } else {
150
- console.error(
151
- "tmux is required but not installed. Please install it manually."
152
- );
153
- process.exit(1);
154
- }
155
- const rl = createInterface2({ input: process.stdin, output: process.stdout });
156
- try {
157
- const answer = await rl.question(
158
- `tmux is required but not installed. Install with "${installCmd}"? (Y/n) `
159
- );
160
- if (answer.toLowerCase() === "n") {
161
- console.error("tmux is required to run the agent.");
162
- process.exit(1);
71
+ if (hasTmux())
72
+ return;
73
+ const os = platform();
74
+ let installCmd;
75
+ if (os === "darwin") {
76
+ installCmd = "brew install tmux";
77
+ }
78
+ else if (os === "linux") {
79
+ installCmd = "sudo apt install -y tmux";
80
+ }
81
+ else {
82
+ console.error("tmux is required but not installed. Please install it manually.");
83
+ process.exit(1);
84
+ }
85
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
86
+ try {
87
+ const answer = await rl.question(`tmux is required but not installed. Install with "${installCmd}"? (Y/n) `);
88
+ if (answer.toLowerCase() === "n") {
89
+ console.error("tmux is required to run the agent.");
90
+ process.exit(1);
91
+ }
92
+ }
93
+ finally {
94
+ rl.close();
95
+ }
96
+ console.log(`Running: ${installCmd}`);
97
+ try {
98
+ execSync(installCmd, { stdio: "inherit" });
99
+ console.log("tmux installed successfully.\n");
100
+ }
101
+ catch {
102
+ console.error("Failed to install tmux. Please install it manually.");
103
+ process.exit(1);
163
104
  }
164
- } finally {
165
- rl.close();
166
- }
167
- console.log(`Running: ${installCmd}`);
168
- try {
169
- execSync(installCmd, { stdio: "inherit" });
170
- console.log("tmux installed successfully.\n");
171
- } catch {
172
- console.error("Failed to install tmux. Please install it manually.");
173
- process.exit(1);
174
- }
175
105
  }
176
106
  async function main() {
177
- const args = parseArgs(process.argv);
178
- if (args.help) {
179
- printHelp();
180
- return;
181
- }
182
- await ensureTmux();
183
- if (args.init) {
184
- const config = await runInitWizard();
185
- await startAgent(config);
186
- return;
187
- }
188
- const configPath = resolveConfigPath(args.configPath);
189
- if (configPath) {
190
- const overrides = {
191
- backend: args.backend,
192
- apiKey: args.apiKey,
193
- deviceName: args.deviceName
194
- };
195
- const config = mergeCliOverrides(parseConfigFile(configPath), overrides);
196
- await startAgent(config);
197
- } else if (args.backend && args.apiKey) {
198
- const config = buildConfigFromAnswers({
199
- backendUrl: args.backend,
200
- apiKey: args.apiKey,
201
- deviceName: args.deviceName ?? "",
202
- projectDirs: ""
203
- });
204
- await startAgent(config);
205
- } else {
206
- const config = await runInitWizard();
207
- await startAgent(config);
208
- }
107
+ const args = parseArgs(process.argv);
108
+ if (args.help) {
109
+ printHelp();
110
+ return;
111
+ }
112
+ await ensureTmux();
113
+ // Force init wizard
114
+ if (args.init) {
115
+ const config = await runInitWizard();
116
+ await startAgent(config);
117
+ return;
118
+ }
119
+ // Try to find existing config
120
+ const configPath = resolveConfigPath(args.configPath);
121
+ if (configPath) {
122
+ const overrides = {
123
+ backend: args.backend,
124
+ apiKey: args.apiKey,
125
+ deviceName: args.deviceName,
126
+ };
127
+ const config = mergeCliOverrides(parseConfigFile(configPath), overrides);
128
+ await startAgent(config);
129
+ }
130
+ else if (args.backend && args.apiKey) {
131
+ // No config file but CLI flags provided
132
+ const config = buildConfigFromAnswers({
133
+ backendUrl: args.backend,
134
+ apiKey: args.apiKey,
135
+ deviceName: args.deviceName ?? "",
136
+ projectDirs: "",
137
+ });
138
+ await startAgent(config);
139
+ }
140
+ else {
141
+ // No config, no flags — run wizard
142
+ const config = await runInitWizard();
143
+ await startAgent(config);
144
+ }
209
145
  }
210
146
  main().catch((e) => {
211
- console.error("Agent failed:", e);
212
- process.exit(1);
147
+ console.error("Agent failed:", e);
148
+ process.exit(1);
213
149
  });
214
- export {
215
- parseArgs
216
- };
150
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export interface AgentConfig {
2
+ deviceId: string;
3
+ deviceName: string;
4
+ backendUrl: string;
5
+ apiKey: string;
6
+ projects: Array<{
7
+ name: string;
8
+ path: string;
9
+ }>;
10
+ /** Directories to scan for projects (each subdirectory = a project) */
11
+ projectDirs: string[];
12
+ }
13
+ export interface CliOverrides {
14
+ backend?: string;
15
+ apiKey?: string;
16
+ deviceName?: string;
17
+ }
18
+ /** Find the config file path in priority order */
19
+ export declare function resolveConfigPath(cliPath?: string): string | null;
20
+ /** Parse a config file into AgentConfig */
21
+ export declare function parseConfigFile(configPath: string): AgentConfig;
22
+ /** Apply CLI flag overrides to a config */
23
+ export declare function mergeCliOverrides(config: AgentConfig, overrides: CliOverrides): AgentConfig;
24
+ /** Original loadConfig — kept for backwards compat in monorepo dev */
25
+ export declare function loadConfig(cliPath?: string): AgentConfig;
26
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,uEAAuE;IACvE,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,kDAAkD;AAClD,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAajE;AAED,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAU/D;AAED,2CAA2C;AAC3C,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,YAAY,GACtB,WAAW,CAOb;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,CAMxD"}
package/dist/config.js ADDED
@@ -0,0 +1,48 @@
1
+ import { readFileSync, existsSync } from "node:fs";
2
+ import { hostname, platform, homedir } from "node:os";
3
+ import { resolve } from "node:path";
4
+ /** Find the config file path in priority order */
5
+ export function resolveConfigPath(cliPath) {
6
+ if (cliPath)
7
+ return cliPath;
8
+ const envPath = process.env["AGENT_CONFIG"];
9
+ if (envPath && existsSync(envPath))
10
+ return envPath;
11
+ const homePath = resolve(homedir(), ".agtd", "agent.config.json");
12
+ if (existsSync(homePath))
13
+ return homePath;
14
+ const cwdPath = resolve(process.cwd(), "agent.config.json");
15
+ if (existsSync(cwdPath))
16
+ return cwdPath;
17
+ return null;
18
+ }
19
+ /** Parse a config file into AgentConfig */
20
+ export function parseConfigFile(configPath) {
21
+ const raw = JSON.parse(readFileSync(configPath, "utf-8"));
22
+ return {
23
+ deviceId: raw.deviceId ?? hostname(),
24
+ deviceName: raw.deviceName ?? `${hostname()}-${platform()}`,
25
+ backendUrl: raw.backendUrl ?? "http://localhost:3001",
26
+ apiKey: raw.apiKey ?? "",
27
+ projects: Array.isArray(raw.projects) ? raw.projects : [],
28
+ projectDirs: Array.isArray(raw.projectDirs) ? raw.projectDirs : [],
29
+ };
30
+ }
31
+ /** Apply CLI flag overrides to a config */
32
+ export function mergeCliOverrides(config, overrides) {
33
+ return {
34
+ ...config,
35
+ ...(overrides.backend && { backendUrl: overrides.backend }),
36
+ ...(overrides.apiKey && { apiKey: overrides.apiKey }),
37
+ ...(overrides.deviceName && { deviceName: overrides.deviceName }),
38
+ };
39
+ }
40
+ /** Original loadConfig — kept for backwards compat in monorepo dev */
41
+ export function loadConfig(cliPath) {
42
+ const configPath = resolveConfigPath(cliPath);
43
+ if (!configPath) {
44
+ throw new Error("No config file found");
45
+ }
46
+ return parseConfigFile(configPath);
47
+ }
48
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,kDAAkD;AAClD,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5C,IAAI,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAEnD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAClE,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE1C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAC5D,IAAI,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAExC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,OAAO;QACL,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,QAAQ,EAAE;QACpC,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,GAAG,QAAQ,EAAE,IAAI,QAAQ,EAAE,EAAE;QAC3D,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,uBAAuB;QACrD,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;QACxB,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;QACzD,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;KACnE,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,iBAAiB,CAC/B,MAAmB,EACnB,SAAuB;IAEvB,OAAO;QACL,GAAG,MAAM;QACT,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;QAC3D,GAAG,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;QACrD,GAAG,CAAC,SAAS,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function getGitInfo(cwd: string): {
2
+ repoName: string;
3
+ branch: string;
4
+ remoteUrl: string;
5
+ } | null;
6
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/enrichers/git.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAatG"}
@@ -0,0 +1,20 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync } from "node:fs";
3
+ export function getGitInfo(cwd) {
4
+ if (!existsSync(`${cwd}/.git`))
5
+ return null;
6
+ try {
7
+ const branch = execSync("git rev-parse --abbrev-ref HEAD", { cwd, encoding: "utf-8", timeout: 3000 }).trim();
8
+ const repoName = execSync("git rev-parse --show-toplevel", { cwd, encoding: "utf-8", timeout: 3000 }).trim().split("/").pop() || "";
9
+ let remoteUrl = "";
10
+ try {
11
+ remoteUrl = execSync("git remote get-url origin", { cwd, encoding: "utf-8", timeout: 3000 }).trim();
12
+ }
13
+ catch { }
14
+ return { repoName, branch, remoteUrl };
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/enrichers/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,iCAAiC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7G,MAAM,QAAQ,GAAG,QAAQ,CAAC,+BAA+B,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACpI,IAAI,SAAS,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,SAAS,GAAG,QAAQ,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtG,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function derivePrUrl(remoteUrl: string, branch: string): string | null;
2
+ //# sourceMappingURL=pr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/enrichers/pr.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM5E"}
@@ -0,0 +1,10 @@
1
+ export function derivePrUrl(remoteUrl, branch) {
2
+ if (!remoteUrl || !branch)
3
+ return null;
4
+ const match = remoteUrl.match(/github\.com[:/](.+?)\/(.+?)(?:\.git)?$/);
5
+ if (!match)
6
+ return null;
7
+ const [, owner, repo] = match;
8
+ return `https://github.com/${owner}/${repo}/pulls?q=head:${encodeURIComponent(branch)}`;
9
+ }
10
+ //# sourceMappingURL=pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr.js","sourceRoot":"","sources":["../../src/enrichers/pr.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,MAAc;IAC3D,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IAC9B,OAAO,sBAAsB,KAAK,IAAI,IAAI,iBAAiB,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface TranscriptInfo {
2
+ model: string | null;
3
+ contextPercent: number | null;
4
+ task: string | null;
5
+ mcpServers: string[] | null;
6
+ }
7
+ export declare function parseTranscript(output: string): TranscriptInfo;
8
+ //# sourceMappingURL=transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/enrichers/transcript.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC7B;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,CA8B9D"}
@@ -0,0 +1,33 @@
1
+ export function parseTranscript(output) {
2
+ const result = { model: null, contextPercent: null, task: null, mcpServers: null };
3
+ if (!output)
4
+ return result;
5
+ // Model detection
6
+ const modelPatterns = [
7
+ /model[:\s]+([a-z]+-(?:opus|sonnet|haiku)-[\d.-]+)/i,
8
+ /(claude-(?:opus|sonnet|haiku)-[\d.-]+)/i,
9
+ /(gpt-4[o\w-]*)/i,
10
+ /(o[13]-\w+)/i,
11
+ ];
12
+ for (const pattern of modelPatterns) {
13
+ const match = output.match(pattern);
14
+ if (match) {
15
+ result.model = match[1] || match[0];
16
+ break;
17
+ }
18
+ }
19
+ // Context usage
20
+ const contextMatch = output.match(/context[:\s]*(\d{1,3})%/i) || output.match(/(\d{1,3})%\s*(?:context|of context)/i);
21
+ if (contextMatch) {
22
+ const pct = parseInt(contextMatch[1]);
23
+ if (pct >= 0 && pct <= 100)
24
+ result.contextPercent = pct;
25
+ }
26
+ // MCP servers
27
+ const mcpMatch = output.match(/mcp[:\s]*\[([^\]]+)\]/i);
28
+ if (mcpMatch) {
29
+ result.mcpServers = mcpMatch[1].split(/[,\s]+/).map(s => s.trim()).filter(Boolean);
30
+ }
31
+ return result;
32
+ }
33
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/enrichers/transcript.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,MAAM,GAAmB,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACnG,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAE3B,kBAAkB;IAClB,MAAM,aAAa,GAAG;QACpB,oDAAoD;QACpD,yCAAyC;QACzC,iBAAiB;QACjB,cAAc;KACf,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,CAAC;YAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;IAC5D,CAAC;IAED,gBAAgB;IAChB,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACtH,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG;YAAE,MAAM,CAAC,cAAc,GAAG,GAAG,CAAC;IAC1D,CAAC;IAED,cAAc;IACd,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IACxD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { HeartbeatPayload } from "@agtd/shared";
2
+ import type { AgentConfig } from "./config.js";
3
+ export declare function sendHeartbeat(config: AgentConfig, payload: HeartbeatPayload): Promise<void>;
4
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAsB,aAAa,CACjC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,15 @@
1
+ export async function sendHeartbeat(config, payload) {
2
+ const res = await fetch(`${config.backendUrl}/api/session-heartbeat`, {
3
+ method: "POST",
4
+ headers: {
5
+ "Content-Type": "application/json",
6
+ "x-api-key": config.apiKey,
7
+ "x-device-id": config.deviceId,
8
+ },
9
+ body: JSON.stringify(payload),
10
+ });
11
+ if (!res.ok) {
12
+ throw new Error(`Heartbeat failed: ${res.status} ${res.statusText}`);
13
+ }
14
+ }
15
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAmB,EACnB,OAAyB;IAEzB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,wBAAwB,EAAE;QACpE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,aAAa,EAAE,MAAM,CAAC,QAAQ;SAC/B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAC9B,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import type { AgentConfig } from "./config.js";
2
+ export interface WizardAnswers {
3
+ backendUrl: string;
4
+ apiKey: string;
5
+ deviceName: string;
6
+ projectDirs: string;
7
+ }
8
+ export declare function buildConfigFromAnswers(answers: WizardAnswers): AgentConfig;
9
+ export declare function runInitWizard(): Promise<AgentConfig>;
10
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,WAAW,CAc1E;AAWD,wBAAsB,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,CAiD1D"}
package/dist/init.js ADDED
@@ -0,0 +1,70 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { mkdirSync, writeFileSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import { hostname, platform, homedir } from "node:os";
5
+ export function buildConfigFromAnswers(answers) {
6
+ return {
7
+ deviceId: hostname(),
8
+ deviceName: answers.deviceName || `${hostname()}-${platform()}`,
9
+ backendUrl: answers.backendUrl,
10
+ apiKey: answers.apiKey,
11
+ projects: [],
12
+ projectDirs: answers.projectDirs
13
+ ? answers.projectDirs
14
+ .split(",")
15
+ .map((d) => d.trim())
16
+ .filter(Boolean)
17
+ : [],
18
+ };
19
+ }
20
+ async function validateBackend(url) {
21
+ try {
22
+ const res = await fetch(`${url}/health`);
23
+ return res.ok;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ }
29
+ export async function runInitWizard() {
30
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
31
+ console.log("\nNo config found. Let's set up your agent.\n");
32
+ try {
33
+ const backendUrl = await rl.question("Backend URL: ");
34
+ if (!backendUrl) {
35
+ throw new Error("Backend URL is required");
36
+ }
37
+ process.stdout.write("Checking backend... ");
38
+ const reachable = await validateBackend(backendUrl);
39
+ if (!reachable) {
40
+ console.log("unreachable (continuing anyway)");
41
+ }
42
+ else {
43
+ console.log("ok");
44
+ }
45
+ const apiKey = await rl.question("API Key: ");
46
+ if (!apiKey) {
47
+ throw new Error("API Key is required");
48
+ }
49
+ const defaultName = `${hostname()}-${platform()}`;
50
+ const deviceName = await rl.question(`Device name (${defaultName}): `);
51
+ const projectDirs = await rl.question("Project directories (comma-separated, optional): ");
52
+ const config = buildConfigFromAnswers({
53
+ backendUrl,
54
+ apiKey,
55
+ deviceName,
56
+ projectDirs,
57
+ });
58
+ // Save config
59
+ const configDir = resolve(homedir(), ".agtd");
60
+ const configPath = resolve(configDir, "agent.config.json");
61
+ mkdirSync(configDir, { recursive: true });
62
+ writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
63
+ console.log(`\nConfig saved to ${configPath}\n`);
64
+ return config;
65
+ }
66
+ finally {
67
+ rl.close();
68
+ }
69
+ }
70
+ //# sourceMappingURL=init.js.map