@agtd/agent 0.1.0 → 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 +125 -142
  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,112 +1,45 @@
1
- import {
2
- mergeCliOverrides,
3
- parseConfigFile,
4
- resolveConfigPath,
5
- startAgent
6
- } from "./chunk-24ORBJSI.js";
7
-
8
- // src/init.ts
9
- import { createInterface } from "readline/promises";
10
- import { mkdirSync, writeFileSync } from "fs";
11
- import { resolve } from "path";
12
- import { hostname, platform, homedir } from "os";
13
- function buildConfigFromAnswers(answers) {
14
- return {
15
- deviceId: hostname(),
16
- deviceName: answers.deviceName || `${hostname()}-${platform()}`,
17
- backendUrl: answers.backendUrl,
18
- apiKey: answers.apiKey,
19
- projects: [],
20
- projectDirs: answers.projectDirs ? answers.projectDirs.split(",").map((d) => d.trim()).filter(Boolean) : []
21
- };
22
- }
23
- async function validateBackend(url) {
24
- try {
25
- const res = await fetch(`${url}/health`);
26
- return res.ok;
27
- } catch {
28
- return false;
29
- }
30
- }
31
- async function runInitWizard() {
32
- const rl = createInterface({ input: process.stdin, output: process.stdout });
33
- console.log("\nNo config found. Let's set up your agent.\n");
34
- try {
35
- const backendUrl = await rl.question("Backend URL: ");
36
- if (!backendUrl) {
37
- throw new Error("Backend URL is required");
38
- }
39
- process.stdout.write("Checking backend... ");
40
- const reachable = await validateBackend(backendUrl);
41
- if (!reachable) {
42
- console.log("unreachable (continuing anyway)");
43
- } else {
44
- console.log("ok");
45
- }
46
- const apiKey = await rl.question("API Key: ");
47
- if (!apiKey) {
48
- throw new Error("API Key is required");
49
- }
50
- const defaultName = `${hostname()}-${platform()}`;
51
- const deviceName = await rl.question(`Device name (${defaultName}): `);
52
- const projectDirs = await rl.question(
53
- "Project directories (comma-separated, optional): "
54
- );
55
- const config = buildConfigFromAnswers({
56
- backendUrl,
57
- apiKey,
58
- deviceName,
59
- projectDirs
60
- });
61
- const configDir = resolve(homedir(), ".agtd");
62
- const configPath = resolve(configDir, "agent.config.json");
63
- mkdirSync(configDir, { recursive: true });
64
- writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
65
- console.log(`
66
- Config saved to ${configPath}
67
- `);
68
- return config;
69
- } finally {
70
- rl.close();
71
- }
72
- }
73
-
74
- // src/cli.ts
75
- function parseArgs(argv) {
76
- const args = { init: false, help: false };
77
- for (let i = 2; i < argv.length; i++) {
78
- const arg = argv[i];
79
- const next = argv[i + 1];
80
- switch (arg) {
81
- case "--init":
82
- args.init = true;
83
- break;
84
- case "--backend":
85
- args.backend = next;
86
- i++;
87
- break;
88
- case "--api-key":
89
- args.apiKey = next;
90
- i++;
91
- break;
92
- case "--device-name":
93
- args.deviceName = next;
94
- i++;
95
- break;
96
- case "--config":
97
- args.configPath = next;
98
- i++;
99
- break;
100
- case "--help":
101
- case "-h":
102
- args.help = true;
103
- 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
+ }
104
38
  }
105
- }
106
- return args;
39
+ return args;
107
40
  }
108
41
  function printHelp() {
109
- console.log(`
42
+ console.log(`
110
43
  Usage: agtd-agent [options]
111
44
 
112
45
  Options:
@@ -125,43 +58,93 @@ Config is loaded from (in order):
125
58
  5. Interactive setup (if none found)
126
59
  `);
127
60
  }
61
+ function hasTmux() {
62
+ try {
63
+ execSync("which tmux", { stdio: "ignore" });
64
+ return true;
65
+ }
66
+ catch {
67
+ return false;
68
+ }
69
+ }
70
+ async function ensureTmux() {
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);
104
+ }
105
+ }
128
106
  async function main() {
129
- const args = parseArgs(process.argv);
130
- if (args.help) {
131
- printHelp();
132
- return;
133
- }
134
- if (args.init) {
135
- const config = await runInitWizard();
136
- await startAgent(config);
137
- return;
138
- }
139
- const configPath = resolveConfigPath(args.configPath);
140
- if (configPath) {
141
- const overrides = {
142
- backend: args.backend,
143
- apiKey: args.apiKey,
144
- deviceName: args.deviceName
145
- };
146
- const config = mergeCliOverrides(parseConfigFile(configPath), overrides);
147
- await startAgent(config);
148
- } else if (args.backend && args.apiKey) {
149
- const config = buildConfigFromAnswers({
150
- backendUrl: args.backend,
151
- apiKey: args.apiKey,
152
- deviceName: args.deviceName ?? "",
153
- projectDirs: ""
154
- });
155
- await startAgent(config);
156
- } else {
157
- const config = await runInitWizard();
158
- await startAgent(config);
159
- }
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
+ }
160
145
  }
161
146
  main().catch((e) => {
162
- console.error("Agent failed:", e);
163
- process.exit(1);
147
+ console.error("Agent failed:", e);
148
+ process.exit(1);
164
149
  });
165
- export {
166
- parseArgs
167
- };
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AgentConfig } from "./config.js";
2
+ export declare function registerDevice(config: AgentConfig): Promise<void>;
3
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,wBAAsB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBvE"}
@@ -0,0 +1,22 @@
1
+ import { hostname, platform } from "node:os";
2
+ export async function registerDevice(config) {
3
+ const payload = {
4
+ id: config.deviceId,
5
+ name: config.deviceName,
6
+ host: hostname(),
7
+ os: platform(),
8
+ };
9
+ const res = await fetch(`${config.backendUrl}/api/register-device`, {
10
+ method: "POST",
11
+ headers: {
12
+ "Content-Type": "application/json",
13
+ "x-api-key": config.apiKey,
14
+ },
15
+ body: JSON.stringify(payload),
16
+ });
17
+ if (!res.ok) {
18
+ throw new Error(`Register device failed: ${res.status} ${res.statusText}`);
19
+ }
20
+ console.log(`Device registered: ${config.deviceId}`);
21
+ }
22
+ //# sourceMappingURL=register.js.map