@bf-meishijian/aip 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +263 -0
- package/dist/cli.js.map +1 -0
- package/dist/daemon.d.ts +5 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +166 -0
- package/dist/daemon.js.map +1 -0
- package/dist/diagnostics.d.ts +22 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +167 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/installer.d.ts +31 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +226 -0
- package/dist/installer.js.map +1 -0
- package/dist/open-browser.d.ts +2 -0
- package/dist/open-browser.d.ts.map +1 -0
- package/dist/open-browser.js +20 -0
- package/dist/open-browser.js.map +1 -0
- package/dist/paths.d.ts +16 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +23 -0
- package/dist/paths.js.map +1 -0
- package/dist/pi-model-service.d.ts +54 -0
- package/dist/pi-model-service.d.ts.map +1 -0
- package/dist/pi-model-service.js +239 -0
- package/dist/pi-model-service.js.map +1 -0
- package/dist/platform-client.d.ts +48 -0
- package/dist/platform-client.d.ts.map +1 -0
- package/dist/platform-client.js +64 -0
- package/dist/platform-client.js.map +1 -0
- package/dist/platform.d.ts +2 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +15 -0
- package/dist/platform.js.map +1 -0
- package/dist/secure-json.d.ts +4 -0
- package/dist/secure-json.d.ts.map +1 -0
- package/dist/secure-json.js +37 -0
- package/dist/secure-json.js.map +1 -0
- package/dist/self-check.d.ts +3 -0
- package/dist/self-check.d.ts.map +1 -0
- package/dist/self-check.js +9 -0
- package/dist/self-check.js.map +1 -0
- package/dist/state.d.ts +35 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +33 -0
- package/dist/state.js.map +1 -0
- package/package.json +39 -0
package/README.md
ADDED
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAoBA,wBAAsB,IAAI,CAAC,IAAI,WAAwB,iBAkBtD"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import { unlink } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { runDiagnostics } from "./diagnostics.js";
|
|
7
|
+
import { installRuntime } from "./installer.js";
|
|
8
|
+
import { openBrowser } from "./open-browser.js";
|
|
9
|
+
import { paths } from "./paths.js";
|
|
10
|
+
import { createPiModelService, isDefaultModelValid } from "./pi-model-service.js";
|
|
11
|
+
import { PlatformClient, PlatformClientError } from "./platform-client.js";
|
|
12
|
+
import { hostIdentity, readDeviceAuth, readHostState, writeDeviceAuth, writeHostState, } from "./state.js";
|
|
13
|
+
export async function main(args = process.argv.slice(2)) {
|
|
14
|
+
const [command, ...commandArgs] = args;
|
|
15
|
+
const [subcommand, ...rest] = commandArgs;
|
|
16
|
+
if (command === "login")
|
|
17
|
+
return login(commandArgs);
|
|
18
|
+
if (command === "logout")
|
|
19
|
+
return logout();
|
|
20
|
+
if (command === "host" && subcommand === "install")
|
|
21
|
+
return install();
|
|
22
|
+
if (command === "host" && subcommand === "register")
|
|
23
|
+
return register(rest);
|
|
24
|
+
if (command === "host" && subcommand === "status")
|
|
25
|
+
return status();
|
|
26
|
+
if (command === "host" && subcommand === "start")
|
|
27
|
+
return serviceAction("start");
|
|
28
|
+
if (command === "host" && subcommand === "stop")
|
|
29
|
+
return serviceAction("stop");
|
|
30
|
+
if (command === "host" && subcommand === "restart") {
|
|
31
|
+
await serviceAction("stop", true);
|
|
32
|
+
return serviceAction("start");
|
|
33
|
+
}
|
|
34
|
+
if (command === "provider" && subcommand === "login")
|
|
35
|
+
return providerLogin(rest[0]);
|
|
36
|
+
if (command === "provider" && subcommand === "logout")
|
|
37
|
+
return providerLogout(rest[0]);
|
|
38
|
+
if (command === "doctor")
|
|
39
|
+
return doctor();
|
|
40
|
+
process.stdout.write(help());
|
|
41
|
+
}
|
|
42
|
+
async function install() {
|
|
43
|
+
try {
|
|
44
|
+
print(await installRuntime());
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
48
|
+
throw new Error(`${message};请修复制品后重新执行 aip host install`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function login(args) {
|
|
52
|
+
const platformUrl = option(args, "--platform") ?? process.env.AIP_PLATFORM_URL ?? "http://127.0.0.1:3000";
|
|
53
|
+
const identity = hostIdentity();
|
|
54
|
+
const client = new PlatformClient(platformUrl);
|
|
55
|
+
const request = await client.request("/api/v1/local-coding-host/device-login/requests", {
|
|
56
|
+
method: "POST",
|
|
57
|
+
body: JSON.stringify({ hostName: identity.hostName, os: identity.os, arch: identity.arch }),
|
|
58
|
+
});
|
|
59
|
+
process.stdout.write(`设备验证码:${request.userCode}\n请在平台确认:${request.verificationUri}\n`);
|
|
60
|
+
if (process.env.AIP_NO_OPEN !== "1")
|
|
61
|
+
await openBrowser(request.verificationUri).catch(() => undefined);
|
|
62
|
+
const deadline = new Date(request.expiresAt).getTime();
|
|
63
|
+
while (Date.now() < deadline) {
|
|
64
|
+
const result = await client.request(`/api/v1/local-coding-host/device-login/requests/${request.requestId}/poll`, {
|
|
65
|
+
method: "POST",
|
|
66
|
+
body: JSON.stringify({ pollToken: request.pollToken }),
|
|
67
|
+
});
|
|
68
|
+
if (result.status === "APPROVED" && result.deviceToken && result.expiresAt && result.user) {
|
|
69
|
+
await writeDeviceAuth({
|
|
70
|
+
platformUrl,
|
|
71
|
+
deviceToken: result.deviceToken,
|
|
72
|
+
expiresAt: result.expiresAt,
|
|
73
|
+
user: result.user,
|
|
74
|
+
});
|
|
75
|
+
process.stdout.write(`已登录:${result.user.username}\n`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
if (result.status !== "PENDING")
|
|
79
|
+
throw new Error(`设备登录未完成:${result.status}`);
|
|
80
|
+
await delay(Number(process.env.AIP_LOGIN_POLL_MS ?? 2000));
|
|
81
|
+
}
|
|
82
|
+
throw new Error("设备登录请求已过期");
|
|
83
|
+
}
|
|
84
|
+
async function logout() {
|
|
85
|
+
const device = await requireDevice();
|
|
86
|
+
await new PlatformClient(device.platformUrl, device.deviceToken)
|
|
87
|
+
.request("/api/v1/local-coding-host/device-logout", { method: "POST" })
|
|
88
|
+
.catch(() => undefined);
|
|
89
|
+
await serviceAction("stop", true);
|
|
90
|
+
await unlink(paths().deviceAuth).catch(() => undefined);
|
|
91
|
+
await unlink(paths().hostState).catch(() => undefined);
|
|
92
|
+
process.stdout.write("已退出本地开发环境\n");
|
|
93
|
+
}
|
|
94
|
+
async function register(args) {
|
|
95
|
+
const device = await requireDevice();
|
|
96
|
+
const identity = hostIdentity();
|
|
97
|
+
const client = new PlatformClient(device.platformUrl, device.deviceToken);
|
|
98
|
+
let replaceHostId = option(args, "--replace-host");
|
|
99
|
+
try {
|
|
100
|
+
const registered = await client.register({
|
|
101
|
+
...identity,
|
|
102
|
+
...(replaceHostId ? { replaceHostId } : {}),
|
|
103
|
+
});
|
|
104
|
+
await writeHostState({
|
|
105
|
+
...identity,
|
|
106
|
+
hostId: registered.hostId,
|
|
107
|
+
generation: registered.generation,
|
|
108
|
+
catalogRevision: 0,
|
|
109
|
+
});
|
|
110
|
+
print(registered);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
if (!(error instanceof PlatformClientError) ||
|
|
114
|
+
error.code !== "HOST_REPLACEMENT_CONFIRMATION_REQUIRED" ||
|
|
115
|
+
option(args, "--yes") !== "true")
|
|
116
|
+
throw error;
|
|
117
|
+
const summary = error.summary;
|
|
118
|
+
replaceHostId = summary?.host?.id;
|
|
119
|
+
if (!replaceHostId)
|
|
120
|
+
throw error;
|
|
121
|
+
const registered = await client.register({ ...identity, replaceHostId });
|
|
122
|
+
await writeHostState({
|
|
123
|
+
...identity,
|
|
124
|
+
hostId: registered.hostId,
|
|
125
|
+
generation: registered.generation,
|
|
126
|
+
catalogRevision: 0,
|
|
127
|
+
});
|
|
128
|
+
print(registered);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async function status() {
|
|
132
|
+
const device = await readDeviceAuth();
|
|
133
|
+
const host = await readHostState();
|
|
134
|
+
print({ platformLogin: Boolean(device), host });
|
|
135
|
+
}
|
|
136
|
+
async function providerLogin(raw) {
|
|
137
|
+
const providerId = parseProvider(raw);
|
|
138
|
+
const result = await createPiModelService().login(providerId, "local");
|
|
139
|
+
await refreshBackgroundStatus();
|
|
140
|
+
print(result);
|
|
141
|
+
}
|
|
142
|
+
async function providerLogout(raw) {
|
|
143
|
+
const providerId = parseProvider(raw);
|
|
144
|
+
await createPiModelService().logout(providerId);
|
|
145
|
+
await refreshBackgroundStatus();
|
|
146
|
+
process.stdout.write("已退出所选 Provider\n");
|
|
147
|
+
}
|
|
148
|
+
async function refreshBackgroundStatus() {
|
|
149
|
+
await serviceAction("stop", true);
|
|
150
|
+
await serviceAction("start", true);
|
|
151
|
+
}
|
|
152
|
+
async function doctor() {
|
|
153
|
+
const pi = createPiModelService();
|
|
154
|
+
const device = await readDeviceAuth();
|
|
155
|
+
const host = await readHostState();
|
|
156
|
+
let platformReachable = false;
|
|
157
|
+
let deviceCredentialValid = false;
|
|
158
|
+
let generationValid = false;
|
|
159
|
+
let defaultRunConfig = null;
|
|
160
|
+
if (device) {
|
|
161
|
+
try {
|
|
162
|
+
const verification = await new PlatformClient(device.platformUrl, device.deviceToken).verify(host ? { hostId: host.hostId, generation: host.generation } : undefined);
|
|
163
|
+
platformReachable = true;
|
|
164
|
+
deviceCredentialValid = verification.deviceCredentialValid;
|
|
165
|
+
generationValid = verification.generationValid;
|
|
166
|
+
defaultRunConfig = verification.defaultRunConfig;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
platformReachable = error instanceof PlatformClientError;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const states = await pi.readProviderStates().catch(() => []);
|
|
173
|
+
const models = await pi.readAvailableModels().catch(() => []);
|
|
174
|
+
const checks = await runDiagnostics({
|
|
175
|
+
platformReachable,
|
|
176
|
+
deviceCredentialValid,
|
|
177
|
+
generationValid,
|
|
178
|
+
defaultModelValid: isDefaultModelValid(defaultRunConfig, models),
|
|
179
|
+
providerReady: states.some((state) => state.status === "READY"),
|
|
180
|
+
});
|
|
181
|
+
for (const check of checks)
|
|
182
|
+
process.stdout.write(`${check.status.padEnd(15)} ${check.id} ${check.code};${check.nextAction}\n`);
|
|
183
|
+
if (checks.some((check) => check.status === "FAIL"))
|
|
184
|
+
process.exitCode = 1;
|
|
185
|
+
}
|
|
186
|
+
async function serviceAction(action, ignoreFailure = false) {
|
|
187
|
+
const { spawn } = await import("node:child_process");
|
|
188
|
+
if (process.platform === "win32") {
|
|
189
|
+
const args = action === "start"
|
|
190
|
+
? ["/Run", "/TN", "AI Platform Local Coding Host"]
|
|
191
|
+
: ["/End", "/TN", "AI Platform Local Coding Host"];
|
|
192
|
+
const code = await new Promise((resolve) => {
|
|
193
|
+
const child = spawn("schtasks.exe", args, { stdio: "inherit" });
|
|
194
|
+
child.once("exit", (value) => resolve(value ?? 1));
|
|
195
|
+
});
|
|
196
|
+
if (code !== 0 && !ignoreFailure)
|
|
197
|
+
throw new Error(`后台服务操作失败 (${code})`);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (process.platform !== "darwin")
|
|
201
|
+
throw new Error("当前平台不支持后台服务管理");
|
|
202
|
+
const label = `com.ai-platform.local-coding-host${process.env.AIP_INSTANCE_SUFFIX ? `.${process.env.AIP_INSTANCE_SUFFIX}` : ""}`;
|
|
203
|
+
const domain = `gui/${process.getuid?.() ?? 0}`;
|
|
204
|
+
const launchDir = process.env.AIP_LAUNCH_AGENT_DIR || `${homedir()}/Library/LaunchAgents`;
|
|
205
|
+
const plist = `${launchDir}/${label}.plist`;
|
|
206
|
+
let code = await spawnLaunch(action === "start" ? ["bootstrap", domain, plist] : ["bootout", domain, plist]);
|
|
207
|
+
if (action === "start" && code !== 0)
|
|
208
|
+
code = await spawnLaunch(["kickstart", "-k", `${domain}/${label}`]);
|
|
209
|
+
if (code !== 0 && !ignoreFailure)
|
|
210
|
+
throw new Error(`后台服务操作失败 (${code})`);
|
|
211
|
+
function spawnLaunch(args) {
|
|
212
|
+
return new Promise((resolve) => {
|
|
213
|
+
const child = spawn("launchctl", args, { stdio: "inherit" });
|
|
214
|
+
child.once("exit", (value) => resolve(value ?? 1));
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
function parseProvider(value) {
|
|
219
|
+
if (value === "chatgpt" || value === "openai-codex")
|
|
220
|
+
return "openai-codex";
|
|
221
|
+
if (value === "claude" || value === "anthropic")
|
|
222
|
+
return "anthropic";
|
|
223
|
+
throw new Error("Provider 仅支持 chatgpt 或 claude");
|
|
224
|
+
}
|
|
225
|
+
function option(args, key) {
|
|
226
|
+
const exact = args.find((arg) => arg.startsWith(`${key}=`));
|
|
227
|
+
if (exact)
|
|
228
|
+
return exact.slice(key.length + 1);
|
|
229
|
+
return args.includes(key) ? (args[args.indexOf(key) + 1] ?? "true") : undefined;
|
|
230
|
+
}
|
|
231
|
+
function requireDevice() {
|
|
232
|
+
return readDeviceAuth().then((value) => {
|
|
233
|
+
if (!value)
|
|
234
|
+
throw new Error("请先执行 aip login");
|
|
235
|
+
return value;
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
function delay(ms) {
|
|
239
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
240
|
+
}
|
|
241
|
+
function print(value) {
|
|
242
|
+
process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
|
|
243
|
+
}
|
|
244
|
+
function help() {
|
|
245
|
+
return `用法:\n aip login [--platform URL]\n aip logout\n aip host install|register|start|stop|restart|status\n aip provider login|logout chatgpt|claude\n aip doctor\n`;
|
|
246
|
+
}
|
|
247
|
+
if (isEntrypoint()) {
|
|
248
|
+
main().catch((error) => {
|
|
249
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
250
|
+
process.exitCode = 1;
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
function isEntrypoint() {
|
|
254
|
+
if (!process.argv[1])
|
|
255
|
+
return false;
|
|
256
|
+
try {
|
|
257
|
+
return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# 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/daemon.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":";AAWA,wBAAsB,SAAS,CAAC,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,iBA0C/D"}
|
package/dist/daemon.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { runDiagnostics, workspaceCheck } from "./diagnostics.js";
|
|
5
|
+
import { paths } from "./paths.js";
|
|
6
|
+
import { createPiModelService, isDefaultModelValid } from "./pi-model-service.js";
|
|
7
|
+
import { PlatformClient, PlatformClientError } from "./platform-client.js";
|
|
8
|
+
import { writeSecureJson } from "./secure-json.js";
|
|
9
|
+
import { readDeviceAuth, readHostState, writeHostState } from "./state.js";
|
|
10
|
+
export async function runDaemon(options = {}) {
|
|
11
|
+
await writeSecureJson(paths().daemonState, {
|
|
12
|
+
pid: process.pid,
|
|
13
|
+
startedAt: new Date().toISOString(),
|
|
14
|
+
});
|
|
15
|
+
const pi = createPiModelService();
|
|
16
|
+
let stopping = false;
|
|
17
|
+
process.once("SIGTERM", () => {
|
|
18
|
+
stopping = true;
|
|
19
|
+
});
|
|
20
|
+
process.once("SIGINT", () => {
|
|
21
|
+
stopping = true;
|
|
22
|
+
});
|
|
23
|
+
let lastStatus = 0;
|
|
24
|
+
while (!stopping) {
|
|
25
|
+
const [device, host] = await Promise.all([readDeviceAuth(), readHostState()]);
|
|
26
|
+
if (!device || !host) {
|
|
27
|
+
if (options.once)
|
|
28
|
+
throw new Error("请先执行 aip login 和 aip host register");
|
|
29
|
+
await delay(5_000);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const client = new PlatformClient(device.platformUrl, device.deviceToken);
|
|
33
|
+
try {
|
|
34
|
+
const heartbeat = await client.heartbeat({
|
|
35
|
+
hostId: host.hostId,
|
|
36
|
+
generation: host.generation,
|
|
37
|
+
});
|
|
38
|
+
if (heartbeat.command) {
|
|
39
|
+
await executeCommand(client, pi, host, heartbeat.command);
|
|
40
|
+
}
|
|
41
|
+
if (Date.now() - lastStatus >= 300_000 || options.once || heartbeat.command) {
|
|
42
|
+
await reportStatus(client, pi, host);
|
|
43
|
+
lastStatus = Date.now();
|
|
44
|
+
}
|
|
45
|
+
if (options.once)
|
|
46
|
+
return;
|
|
47
|
+
await delay(heartbeat.nextHeartbeatSeconds * 1000);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
if (error instanceof PlatformClientError && error.code === "HOST_FENCED")
|
|
51
|
+
throw error;
|
|
52
|
+
if (options.once)
|
|
53
|
+
throw error;
|
|
54
|
+
await delay(5_000);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function reportStatus(client, pi, host) {
|
|
59
|
+
const { providers, models, workspaceRootStatus } = await collectLocalStatus(pi);
|
|
60
|
+
host.catalogRevision += 1;
|
|
61
|
+
await writeHostState(host);
|
|
62
|
+
await client.reportStatus({
|
|
63
|
+
hostId: host.hostId,
|
|
64
|
+
generation: host.generation,
|
|
65
|
+
workspaceRootStatus,
|
|
66
|
+
catalogRevision: host.catalogRevision,
|
|
67
|
+
providers,
|
|
68
|
+
models,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async function executeCommand(client, pi, host, command) {
|
|
72
|
+
try {
|
|
73
|
+
let resultCode = "COMMAND_SUCCEEDED";
|
|
74
|
+
let result = {};
|
|
75
|
+
if (command.kind === "PROVIDER_LOGIN" && command.providerId) {
|
|
76
|
+
resultCode = (await pi.login(command.providerId, "remote")).code;
|
|
77
|
+
result = { providerId: command.providerId, phase: "COMPLETED" };
|
|
78
|
+
}
|
|
79
|
+
else if (command.kind === "RUN_DIAGNOSTICS") {
|
|
80
|
+
const [verification, local] = await Promise.all([
|
|
81
|
+
client.verify({ hostId: host.hostId, generation: host.generation }),
|
|
82
|
+
collectLocalStatus(pi),
|
|
83
|
+
]);
|
|
84
|
+
resultCode = "DIAGNOSTICS_COMPLETED";
|
|
85
|
+
result = {
|
|
86
|
+
checks: await runDiagnostics({
|
|
87
|
+
platformReachable: true,
|
|
88
|
+
deviceCredentialValid: verification.deviceCredentialValid,
|
|
89
|
+
generationValid: verification.generationValid,
|
|
90
|
+
defaultModelValid: isDefaultModelValid(verification.defaultRunConfig, local.models),
|
|
91
|
+
providerReady: local.providers.some((state) => state.status === "READY"),
|
|
92
|
+
}),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
else
|
|
96
|
+
throw new Error("UNKNOWN_COMMAND");
|
|
97
|
+
await client.completeCommand(command.id, {
|
|
98
|
+
hostId: host.hostId,
|
|
99
|
+
generation: host.generation,
|
|
100
|
+
status: "SUCCEEDED",
|
|
101
|
+
resultCode,
|
|
102
|
+
result,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
const resultCode = error instanceof Error && /^[A-Z0-9_]+$/u.test(error.message)
|
|
107
|
+
? error.message
|
|
108
|
+
: "COMMAND_FAILED";
|
|
109
|
+
await client.completeCommand(command.id, {
|
|
110
|
+
hostId: host.hostId,
|
|
111
|
+
generation: host.generation,
|
|
112
|
+
status: "FAILED",
|
|
113
|
+
resultCode,
|
|
114
|
+
result: {},
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async function collectLocalStatus(pi) {
|
|
119
|
+
let providers;
|
|
120
|
+
try {
|
|
121
|
+
providers = await pi.readProviderStates();
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
providers = ["openai-codex", "anthropic"].map((providerId) => ({
|
|
125
|
+
providerId,
|
|
126
|
+
status: "ERROR",
|
|
127
|
+
accountHint: null,
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
let models = [];
|
|
131
|
+
try {
|
|
132
|
+
models = await pi.readAvailableModels();
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
providers = providers.map((provider) => ({
|
|
136
|
+
...provider,
|
|
137
|
+
status: provider.status === "READY" ? "ERROR" : provider.status,
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
140
|
+
const workspace = await workspaceCheck(paths().workspaceRoot);
|
|
141
|
+
return {
|
|
142
|
+
providers,
|
|
143
|
+
models,
|
|
144
|
+
workspaceRootStatus: workspace.status === "PASS" ? "PASS" : "FAIL",
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
function delay(ms) {
|
|
148
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
149
|
+
}
|
|
150
|
+
if (isEntrypoint()) {
|
|
151
|
+
runDaemon({ once: process.argv.includes("--once") }).catch((error) => {
|
|
152
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
153
|
+
process.exitCode = 1;
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
function isEntrypoint() {
|
|
157
|
+
if (!process.argv[1])
|
|
158
|
+
return false;
|
|
159
|
+
try {
|
|
160
|
+
return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { LocalCodingHostDiagnosticCheck } from "@ai-platform/api-contracts";
|
|
2
|
+
export declare function runDiagnostics(options: {
|
|
3
|
+
platformReachable: boolean;
|
|
4
|
+
deviceCredentialValid: boolean;
|
|
5
|
+
generationValid: boolean;
|
|
6
|
+
defaultModelValid: boolean;
|
|
7
|
+
providerReady: boolean;
|
|
8
|
+
}, dependencies?: {
|
|
9
|
+
captureCommand?: typeof captureCommand;
|
|
10
|
+
}): Promise<{
|
|
11
|
+
id: "RUNTIME_INTEGRITY" | "BACKGROUND_SERVICE" | "DEVICE_CREDENTIAL" | "PROVIDER_AUTH" | "PLATFORM_CONNECTIVITY" | "HOST_GENERATION" | "WORKSPACE_ROOT" | "DEFAULT_MODEL";
|
|
12
|
+
status: "PASS" | "ACTION_REQUIRED" | "FAIL";
|
|
13
|
+
code: string;
|
|
14
|
+
nextAction: string;
|
|
15
|
+
}[]>;
|
|
16
|
+
declare function captureCommand(command: string, args: string[]): Promise<{
|
|
17
|
+
code: number;
|
|
18
|
+
output: string;
|
|
19
|
+
}>;
|
|
20
|
+
export declare function workspaceCheck(root: string): Promise<LocalCodingHostDiagnosticCheck>;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAWjF,wBAAsB,cAAc,CAClC,OAAO,EAAE;IACP,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;CACxB,EACD,YAAY,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,cAAc,CAAA;CAAO;;;;;KAiC9D;AA0FD,iBAAS,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;UAC1B,MAAM;YAAU,MAAM;GAUlD;AACD,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAmB1F"}
|