@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.
- package/dist/__tests__/codexAdapterFindFile.test.d.ts +2 -0
- package/dist/__tests__/codexAdapterFindFile.test.d.ts.map +1 -0
- package/dist/__tests__/codexAdapterFindFile.test.js +298 -0
- package/dist/__tests__/codexAdapterFindFile.test.js.map +1 -0
- package/dist/__tests__/enrichers.test.d.ts +2 -0
- package/dist/__tests__/enrichers.test.d.ts.map +1 -0
- package/dist/__tests__/enrichers.test.js +47 -0
- package/dist/__tests__/enrichers.test.js.map +1 -0
- package/dist/__tests__/tmux.integration.test.d.ts +2 -0
- package/dist/__tests__/tmux.integration.test.d.ts.map +1 -0
- package/dist/__tests__/tmux.integration.test.js +112 -0
- package/dist/__tests__/tmux.integration.test.js.map +1 -0
- package/dist/__tests__/tmux.test.d.ts +2 -0
- package/dist/__tests__/tmux.test.d.ts.map +1 -0
- package/dist/__tests__/tmux.test.js +26 -0
- package/dist/__tests__/tmux.test.js.map +1 -0
- package/dist/__tests__/transcriptAdapters.test.d.ts +2 -0
- package/dist/__tests__/transcriptAdapters.test.d.ts.map +1 -0
- package/dist/__tests__/transcriptAdapters.test.js +133 -0
- package/dist/__tests__/transcriptAdapters.test.js.map +1 -0
- package/dist/adapters/claude-code.d.ts +3 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +48 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/codex.d.ts +3 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +33 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/generic.d.ts +3 -0
- package/dist/adapters/generic.d.ts.map +1 -0
- package/dist/adapters/generic.js +38 -0
- package/dist/adapters/generic.js.map +1 -0
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +12 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/agent.d.ts +3 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +49 -6
- package/dist/agent.js.map +1 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +125 -142
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +48 -0
- package/dist/config.js.map +1 -0
- package/dist/enrichers/git.d.ts +6 -0
- package/dist/enrichers/git.d.ts.map +1 -0
- package/dist/enrichers/git.js +20 -0
- package/dist/enrichers/git.js.map +1 -0
- package/dist/enrichers/pr.d.ts +2 -0
- package/dist/enrichers/pr.d.ts.map +1 -0
- package/dist/enrichers/pr.js +10 -0
- package/dist/enrichers/pr.js.map +1 -0
- package/dist/enrichers/transcript.d.ts +8 -0
- package/dist/enrichers/transcript.d.ts.map +1 -0
- package/dist/enrichers/transcript.js +33 -0
- package/dist/enrichers/transcript.js.map +1 -0
- package/dist/heartbeat.d.ts +4 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +15 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/init.d.ts +10 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +70 -0
- package/dist/init.js.map +1 -0
- package/dist/register.d.ts +3 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +22 -0
- package/dist/register.js.map +1 -0
- package/dist/sessionScanner.d.ts +20 -0
- package/dist/sessionScanner.d.ts.map +1 -0
- package/dist/sessionScanner.js +479 -0
- package/dist/sessionScanner.js.map +1 -0
- package/dist/spawn.d.ts +8 -0
- package/dist/spawn.d.ts.map +1 -0
- package/dist/spawn.js +73 -0
- package/dist/spawn.js.map +1 -0
- package/dist/syncProjects.d.ts +3 -0
- package/dist/syncProjects.d.ts.map +1 -0
- package/dist/syncProjects.js +91 -0
- package/dist/syncProjects.js.map +1 -0
- package/dist/terminalBridge.d.ts +4 -0
- package/dist/terminalBridge.d.ts.map +1 -0
- package/dist/terminalBridge.js +42 -0
- package/dist/terminalBridge.js.map +1 -0
- package/dist/tmux.d.ts +21 -0
- package/dist/tmux.d.ts.map +1 -0
- package/dist/tmux.js +89 -0
- package/dist/tmux.js.map +1 -0
- package/dist/transcriptAdapters/claude-code.d.ts +3 -0
- package/dist/transcriptAdapters/claude-code.d.ts.map +1 -0
- package/dist/transcriptAdapters/claude-code.js +147 -0
- package/dist/transcriptAdapters/claude-code.js.map +1 -0
- package/dist/transcriptAdapters/codex.d.ts +3 -0
- package/dist/transcriptAdapters/codex.d.ts.map +1 -0
- package/dist/transcriptAdapters/codex.js +251 -0
- package/dist/transcriptAdapters/codex.js.map +1 -0
- package/dist/transcriptAdapters/index.d.ts +17 -0
- package/dist/transcriptAdapters/index.d.ts.map +1 -0
- package/dist/transcriptAdapters/index.js +9 -0
- package/dist/transcriptAdapters/index.js.map +1 -0
- package/dist/wsClient.d.ts +6 -0
- package/dist/wsClient.d.ts.map +1 -0
- package/dist/wsClient.js +156 -0
- package/dist/wsClient.js.map +1 -0
- package/package.json +6 -2
package/dist/cli.js
CHANGED
|
@@ -1,112 +1,45 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from "./
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
163
|
-
|
|
147
|
+
console.error("Agent failed:", e);
|
|
148
|
+
process.exit(1);
|
|
164
149
|
});
|
|
165
|
-
|
|
166
|
-
parseArgs
|
|
167
|
-
};
|
|
150
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
package/dist/register.js
ADDED
|
@@ -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
|