@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
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { access, lstat, mkdir, readFile } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { launchAgentDefinition, verifyManifest, windowsTaskDefinition, } from "./installer.js";
|
|
6
|
+
import { paths } from "./paths.js";
|
|
7
|
+
import { runtimeArchitecture } from "./platform.js";
|
|
8
|
+
import { isSecureFile, readJson } from "./secure-json.js";
|
|
9
|
+
export async function runDiagnostics(options, dependencies = {}) {
|
|
10
|
+
const local = paths();
|
|
11
|
+
const checks = [];
|
|
12
|
+
checks.push(await runtimeCheck(local.runtimeCurrent));
|
|
13
|
+
checks.push(await backgroundCheck(dependencies.captureCommand ?? captureCommand));
|
|
14
|
+
checks.push(await deviceCredentialCheck(options.deviceCredentialValid));
|
|
15
|
+
checks.push({
|
|
16
|
+
id: "PROVIDER_AUTH",
|
|
17
|
+
status: options.providerReady ? "PASS" : "ACTION_REQUIRED",
|
|
18
|
+
code: options.providerReady ? "PROVIDER_AUTH_OK" : "PROVIDER_LOGIN_REQUIRED",
|
|
19
|
+
nextAction: "登录 ChatGPT 或 Claude",
|
|
20
|
+
});
|
|
21
|
+
checks.push({
|
|
22
|
+
id: "PLATFORM_CONNECTIVITY",
|
|
23
|
+
status: options.platformReachable ? "PASS" : "FAIL",
|
|
24
|
+
code: options.platformReachable ? "PLATFORM_REACHABLE" : "PLATFORM_UNREACHABLE",
|
|
25
|
+
nextAction: "检查网络后重试",
|
|
26
|
+
});
|
|
27
|
+
checks.push({
|
|
28
|
+
id: "HOST_GENERATION",
|
|
29
|
+
status: options.generationValid ? "PASS" : "FAIL",
|
|
30
|
+
code: options.generationValid ? "HOST_GENERATION_OK" : "HOST_FENCED",
|
|
31
|
+
nextAction: "执行 aip host register",
|
|
32
|
+
});
|
|
33
|
+
checks.push(await workspaceCheck(local.workspaceRoot));
|
|
34
|
+
checks.push({
|
|
35
|
+
id: "DEFAULT_MODEL",
|
|
36
|
+
status: options.defaultModelValid ? "PASS" : "ACTION_REQUIRED",
|
|
37
|
+
code: options.defaultModelValid ? "DEFAULT_MODEL_OK" : "DEFAULT_MODEL_INVALID",
|
|
38
|
+
nextAction: "在平台重新选择默认模型",
|
|
39
|
+
});
|
|
40
|
+
return checks;
|
|
41
|
+
}
|
|
42
|
+
async function runtimeCheck(path) {
|
|
43
|
+
try {
|
|
44
|
+
const manifest = JSON.parse(await readFile(join(path, "runtime-manifest.json"), "utf8"));
|
|
45
|
+
if (manifest.platform !== process.platform || manifest.arch !== runtimeArchitecture())
|
|
46
|
+
throw new Error("runtime platform mismatch");
|
|
47
|
+
await verifyManifest(path, manifest);
|
|
48
|
+
return {
|
|
49
|
+
id: "RUNTIME_INTEGRITY",
|
|
50
|
+
status: "PASS",
|
|
51
|
+
code: "RUNTIME_INTEGRITY_OK",
|
|
52
|
+
nextAction: "无需处理",
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return {
|
|
57
|
+
id: "RUNTIME_INTEGRITY",
|
|
58
|
+
status: "FAIL",
|
|
59
|
+
code: "RUNTIME_INTEGRITY_FAILED",
|
|
60
|
+
nextAction: "重新执行 aip host install",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
async function deviceCredentialCheck(platformValid) {
|
|
65
|
+
const local = paths();
|
|
66
|
+
const secure = await isSecureFile(local.deviceAuth);
|
|
67
|
+
let expired = false;
|
|
68
|
+
try {
|
|
69
|
+
const credential = await readJson(local.deviceAuth);
|
|
70
|
+
expired = !credential?.expiresAt || new Date(credential.expiresAt).getTime() <= Date.now();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
expired = true;
|
|
74
|
+
}
|
|
75
|
+
const valid = secure && !expired && platformValid;
|
|
76
|
+
return {
|
|
77
|
+
id: "DEVICE_CREDENTIAL",
|
|
78
|
+
status: valid ? "PASS" : "FAIL",
|
|
79
|
+
code: valid
|
|
80
|
+
? "DEVICE_CREDENTIAL_OK"
|
|
81
|
+
: !secure
|
|
82
|
+
? "DEVICE_CREDENTIAL_PERMISSION_INVALID"
|
|
83
|
+
: expired
|
|
84
|
+
? "DEVICE_CREDENTIAL_EXPIRED"
|
|
85
|
+
: "DEVICE_CREDENTIAL_REJECTED",
|
|
86
|
+
nextAction: valid ? "无需处理" : "执行 aip login",
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async function backgroundCheck(runCommand) {
|
|
90
|
+
const local = paths();
|
|
91
|
+
const state = await readJson(local.daemonState);
|
|
92
|
+
const processRunning = Boolean(state?.pid && processExists(state.pid));
|
|
93
|
+
let configuredAndLoaded = processRunning;
|
|
94
|
+
if (process.platform === "darwin") {
|
|
95
|
+
const expected = launchAgentDefinition(local.runtimeCurrent);
|
|
96
|
+
const configured = (await readFile(expected.plist, "utf8").catch(() => "")) === expected.xml;
|
|
97
|
+
const launchd = await runCommand("launchctl", [
|
|
98
|
+
"print",
|
|
99
|
+
`${expected.domain}/${expected.label}`,
|
|
100
|
+
]);
|
|
101
|
+
const expectedEntries = [
|
|
102
|
+
join(local.runtimeCurrent, "bin", "node"),
|
|
103
|
+
join(local.runtimeCurrent, "app", "dist", "daemon.js"),
|
|
104
|
+
local.root,
|
|
105
|
+
];
|
|
106
|
+
const loaded = launchd.code === 0 && expectedEntries.every((entry) => launchd.output.includes(entry));
|
|
107
|
+
configuredAndLoaded = configured && loaded;
|
|
108
|
+
}
|
|
109
|
+
else if (process.platform === "win32") {
|
|
110
|
+
const expected = windowsTaskDefinition(local.runtimeCurrent, local.root);
|
|
111
|
+
const configured = await readJson(join(local.root, "state", "windows-task.json"));
|
|
112
|
+
const loaded = (await runCommand("schtasks.exe", ["/Query", "/TN", "AI Platform Local Coding Host"]))
|
|
113
|
+
.code === 0;
|
|
114
|
+
configuredAndLoaded = JSON.stringify(configured) === JSON.stringify(expected) && loaded;
|
|
115
|
+
}
|
|
116
|
+
const running = processRunning && configuredAndLoaded;
|
|
117
|
+
return {
|
|
118
|
+
id: "BACKGROUND_SERVICE",
|
|
119
|
+
status: running ? "PASS" : "FAIL",
|
|
120
|
+
code: running ? "BACKGROUND_SERVICE_OK" : "BACKGROUND_SERVICE_STOPPED",
|
|
121
|
+
nextAction: "执行 aip host restart",
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function captureCommand(command, args) {
|
|
125
|
+
return new Promise((resolveResult) => {
|
|
126
|
+
let output = "";
|
|
127
|
+
const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
128
|
+
for (const stream of [child.stdout, child.stderr])
|
|
129
|
+
stream.on("data", (chunk) => {
|
|
130
|
+
output = `${output}${chunk.toString()}`.slice(-16_000);
|
|
131
|
+
});
|
|
132
|
+
child.once("error", () => resolveResult({ code: 1, output }));
|
|
133
|
+
child.once("exit", (code) => resolveResult({ code: code ?? 1, output }));
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
export async function workspaceCheck(root) {
|
|
137
|
+
try {
|
|
138
|
+
await mkdir(root, { recursive: true, mode: 0o700 });
|
|
139
|
+
if (!(await lstat(root)).isDirectory())
|
|
140
|
+
throw new Error("not directory");
|
|
141
|
+
await access(root, constants.W_OK);
|
|
142
|
+
return {
|
|
143
|
+
id: "WORKSPACE_ROOT",
|
|
144
|
+
status: "PASS",
|
|
145
|
+
code: "WORKSPACE_ROOT_OK",
|
|
146
|
+
nextAction: "无需处理",
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return {
|
|
151
|
+
id: "WORKSPACE_ROOT",
|
|
152
|
+
status: "FAIL",
|
|
153
|
+
code: "WORKSPACE_ROOT_UNAVAILABLE",
|
|
154
|
+
nextAction: "修复 ~/.aip/workspaces 目录权限",
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function processExists(pid) {
|
|
159
|
+
try {
|
|
160
|
+
process.kill(pid, 0);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface RuntimeManifest {
|
|
2
|
+
version: string;
|
|
3
|
+
platform: string;
|
|
4
|
+
arch: string;
|
|
5
|
+
nodeVersion?: string;
|
|
6
|
+
sourceSha?: string;
|
|
7
|
+
files: Array<{
|
|
8
|
+
path: string;
|
|
9
|
+
sha256: string;
|
|
10
|
+
}>;
|
|
11
|
+
}
|
|
12
|
+
export declare function installRuntime(): Promise<{
|
|
13
|
+
version: string;
|
|
14
|
+
runtime: string;
|
|
15
|
+
}>;
|
|
16
|
+
export declare function verifyManifest(root: string, manifest: RuntimeManifest): Promise<void>;
|
|
17
|
+
export declare function launchAgentDefinition(runtime: string): {
|
|
18
|
+
label: string;
|
|
19
|
+
launchDir: string;
|
|
20
|
+
plist: string;
|
|
21
|
+
xml: string;
|
|
22
|
+
domain: string;
|
|
23
|
+
};
|
|
24
|
+
export declare function windowsTaskDefinition(runtime: string, root: string): {
|
|
25
|
+
executable: string;
|
|
26
|
+
arguments: string[];
|
|
27
|
+
environment: {
|
|
28
|
+
AIP_HOME: string;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"AAqBA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChD;AAED,wBAAsB,cAAc;;;GA4DnC;AA8ED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,iBAS3E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM;;;;;;EASpD;AA6CD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;;;;;;EAMlE"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
3
|
+
import { chmod, cp, lstat, mkdir, readFile, readlink, rename, rm, stat, symlink, writeFile, } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { dirname, join, resolve, win32 } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { paths } from "./paths.js";
|
|
8
|
+
import { runtimeArchitecture } from "./platform.js";
|
|
9
|
+
export async function installRuntime() {
|
|
10
|
+
const source = await resolveRuntimePackage();
|
|
11
|
+
const manifest = JSON.parse(await readFile(join(source, "runtime-manifest.json"), "utf8"));
|
|
12
|
+
const architecture = runtimeArchitecture();
|
|
13
|
+
if (manifest.platform !== process.platform || manifest.arch !== architecture)
|
|
14
|
+
throw new Error(`Runtime 架构不匹配:需要 ${process.platform}-${architecture}`);
|
|
15
|
+
await verifyManifest(source, manifest);
|
|
16
|
+
const local = paths();
|
|
17
|
+
const versions = join(local.runtime, "versions");
|
|
18
|
+
const staging = join(versions, `${manifest.version}.staging-${randomBytes(6).toString("hex")}`);
|
|
19
|
+
const target = join(versions, manifest.version);
|
|
20
|
+
const replacedTarget = join(versions, `${manifest.version}.previous-${randomBytes(6).toString("hex")}`);
|
|
21
|
+
const previous = await readlink(local.runtimeCurrent).catch(() => null);
|
|
22
|
+
let targetWasReplaced = false;
|
|
23
|
+
let targetActivated = false;
|
|
24
|
+
await mkdir(versions, { recursive: true, mode: 0o700 });
|
|
25
|
+
try {
|
|
26
|
+
await cp(source, staging, { recursive: true });
|
|
27
|
+
await run(join(staging, "bin", process.platform === "win32" ? "node.exe" : "node"), [join(staging, "app", "dist", "self-check.js")], { AIP_RUNTIME_ROOT: staging });
|
|
28
|
+
if (await exists(target)) {
|
|
29
|
+
await rename(target, replacedTarget);
|
|
30
|
+
targetWasReplaced = true;
|
|
31
|
+
}
|
|
32
|
+
await rename(staging, target);
|
|
33
|
+
targetActivated = true;
|
|
34
|
+
const pending = `${local.runtimeCurrent}.pending`;
|
|
35
|
+
await rm(pending, { force: true });
|
|
36
|
+
await symlink(target, pending, process.platform === "win32" ? "junction" : "dir");
|
|
37
|
+
await rename(pending, local.runtimeCurrent);
|
|
38
|
+
const serviceStartedAfter = Date.now();
|
|
39
|
+
if (process.platform === "darwin")
|
|
40
|
+
await installLaunchAgent(local.runtimeCurrent);
|
|
41
|
+
else if (process.platform === "win32")
|
|
42
|
+
await installWindowsTask(local.runtimeCurrent);
|
|
43
|
+
if (process.env.AIP_SKIP_SERVICE !== "1")
|
|
44
|
+
await waitForDaemon(serviceStartedAfter, local.runtimeCurrent);
|
|
45
|
+
await installStableCli();
|
|
46
|
+
await rm(replacedTarget, { recursive: true, force: true });
|
|
47
|
+
return { version: manifest.version, runtime: target };
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
await rm(staging, { recursive: true, force: true });
|
|
51
|
+
if (targetActivated)
|
|
52
|
+
await rm(target, { recursive: true, force: true });
|
|
53
|
+
if (targetWasReplaced && !(await exists(target)))
|
|
54
|
+
await rename(replacedTarget, target);
|
|
55
|
+
if (targetActivated) {
|
|
56
|
+
if (previous) {
|
|
57
|
+
const rollback = `${local.runtimeCurrent}.rollback`;
|
|
58
|
+
await rm(rollback, { force: true });
|
|
59
|
+
await symlink(previous, rollback, process.platform === "win32" ? "junction" : "dir");
|
|
60
|
+
await rename(rollback, local.runtimeCurrent);
|
|
61
|
+
}
|
|
62
|
+
else
|
|
63
|
+
await rm(local.runtimeCurrent, { force: true });
|
|
64
|
+
}
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function installStableCli() {
|
|
69
|
+
const local = paths();
|
|
70
|
+
await mkdir(local.bin, { recursive: true, mode: 0o700 });
|
|
71
|
+
const temporary = `${local.stableCli}.${randomBytes(6).toString("hex")}.tmp`;
|
|
72
|
+
const contents = process.platform === "win32"
|
|
73
|
+
? '@echo off\r\n"%~dp0..\\runtime\\current\\bin\\node.exe" "%~dp0..\\runtime\\current\\app\\dist\\cli.js" %*\r\n'
|
|
74
|
+
: [
|
|
75
|
+
"#!/bin/sh",
|
|
76
|
+
"aip_bin_dir=$" + "{0%/*}",
|
|
77
|
+
'if [ "$aip_bin_dir" = "$0" ]; then aip_bin_dir=.; fi',
|
|
78
|
+
'exec "$aip_bin_dir/../runtime/current/bin/node" "$aip_bin_dir/../runtime/current/app/dist/cli.js" "$@"',
|
|
79
|
+
"",
|
|
80
|
+
].join("\n");
|
|
81
|
+
await writeFile(temporary, contents, { mode: process.platform === "win32" ? 0o600 : 0o700 });
|
|
82
|
+
await rename(temporary, local.stableCli);
|
|
83
|
+
if (process.platform !== "win32")
|
|
84
|
+
await chmod(local.stableCli, 0o700);
|
|
85
|
+
}
|
|
86
|
+
async function exists(path) {
|
|
87
|
+
return lstat(path)
|
|
88
|
+
.then(() => true)
|
|
89
|
+
.catch(() => false);
|
|
90
|
+
}
|
|
91
|
+
async function waitForDaemon(startedAfter, runtime) {
|
|
92
|
+
const deadline = Date.now() + 30_000;
|
|
93
|
+
while (Date.now() < deadline) {
|
|
94
|
+
const state = await import("./secure-json.js").then(({ readJson }) => readJson(paths().daemonState));
|
|
95
|
+
if (state?.pid && state.startedAt && new Date(state.startedAt).getTime() >= startedAfter) {
|
|
96
|
+
try {
|
|
97
|
+
process.kill(state.pid, 0);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
catch { }
|
|
101
|
+
}
|
|
102
|
+
await new Promise((resolveWait) => setTimeout(resolveWait, 100));
|
|
103
|
+
}
|
|
104
|
+
throw new Error(`后台 Host 未能启动;${await backgroundStartFailure(runtime)};请执行 aip doctor`);
|
|
105
|
+
}
|
|
106
|
+
async function backgroundStartFailure(runtime) {
|
|
107
|
+
const node = join(runtime, "bin", "node");
|
|
108
|
+
const executableExists = await exists(node);
|
|
109
|
+
const architecture = executableExists
|
|
110
|
+
? (await capture(node, ["-p", "process.arch"])).trim() || "unknown"
|
|
111
|
+
: "missing";
|
|
112
|
+
const label = `com.ai-platform.local-coding-host${process.env.AIP_INSTANCE_SUFFIX ? `.${process.env.AIP_INSTANCE_SUFFIX}` : ""}`;
|
|
113
|
+
const launchd = await capture("launchctl", ["print", `gui/${process.getuid?.() ?? 0}/${label}`]);
|
|
114
|
+
const launchState = /state = ([^\n]+)/u.exec(launchd)?.[1]?.trim() ?? "unavailable";
|
|
115
|
+
const launchExit = /last exit code = ([^\n]+)/u.exec(launchd)?.[1]?.trim() ?? "unavailable";
|
|
116
|
+
const log = await readFile(paths().log, "utf8").catch(() => "");
|
|
117
|
+
const logTail = log.trim().slice(-1000).replaceAll(/\s+/gu, " ") || "empty";
|
|
118
|
+
return `executable=${executableExists ? "present" : "missing"}, architecture=${architecture}, launchd state=${launchState}, launchd last exit=${launchExit}, host.log=${logTail}`;
|
|
119
|
+
}
|
|
120
|
+
async function resolveRuntimePackage() {
|
|
121
|
+
if (process.env.AIP_RUNTIME_PACKAGE_DIR)
|
|
122
|
+
return resolve(process.env.AIP_RUNTIME_PACKAGE_DIR);
|
|
123
|
+
const packageName = `@bf-meishijian/aip-runtime-${process.platform}-${runtimeArchitecture()}`;
|
|
124
|
+
const scopeDir = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", packageName.split("/")[1] ?? "");
|
|
125
|
+
const runtimeDir = join(scopeDir, "runtime");
|
|
126
|
+
try {
|
|
127
|
+
await lstat(join(runtimeDir, "runtime-manifest.json"));
|
|
128
|
+
return runtimeDir;
|
|
129
|
+
}
|
|
130
|
+
catch { }
|
|
131
|
+
throw new Error(`未安装匹配的 ${packageName},请从同一 Registry 安装对应 Runtime 包`);
|
|
132
|
+
}
|
|
133
|
+
export async function verifyManifest(root, manifest) {
|
|
134
|
+
for (const file of manifest.files) {
|
|
135
|
+
if (file.path.includes("..") || file.path.startsWith("/"))
|
|
136
|
+
throw new Error("Runtime 清单包含非法路径");
|
|
137
|
+
const digest = createHash("sha256")
|
|
138
|
+
.update(await readFile(join(root, file.path)))
|
|
139
|
+
.digest("hex");
|
|
140
|
+
if (digest !== file.sha256)
|
|
141
|
+
throw new Error(`Runtime 文件校验失败:${file.path}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export function launchAgentDefinition(runtime) {
|
|
145
|
+
const local = paths();
|
|
146
|
+
const label = `com.ai-platform.local-coding-host${process.env.AIP_INSTANCE_SUFFIX ? `.${process.env.AIP_INSTANCE_SUFFIX}` : ""}`;
|
|
147
|
+
const launchDir = process.env.AIP_LAUNCH_AGENT_DIR || join(homedir(), "Library", "LaunchAgents");
|
|
148
|
+
const plist = join(launchDir, `${label}.plist`);
|
|
149
|
+
const node = join(runtime, "bin", "node");
|
|
150
|
+
const daemon = join(runtime, "app", "dist", "daemon.js");
|
|
151
|
+
const xml = `<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0"><dict><key>Label</key><string>${label}</string><key>ProgramArguments</key><array><string>${node}</string><string>${daemon}</string></array><key>EnvironmentVariables</key><dict><key>AIP_HOME</key><string>${local.root}</string>${process.env.AIP_TEST_PI === "1" ? "<key>AIP_TEST_PI</key><string>1</string>" : ""}</dict><key>RunAtLoad</key><true/><key>KeepAlive</key><true/><key>StandardOutPath</key><string>${local.log}</string><key>StandardErrorPath</key><string>${local.log}</string></dict></plist>\n`;
|
|
152
|
+
return { label, launchDir, plist, xml, domain: `gui/${process.getuid?.() ?? 0}` };
|
|
153
|
+
}
|
|
154
|
+
async function installLaunchAgent(runtime) {
|
|
155
|
+
const local = paths();
|
|
156
|
+
const { launchDir, plist, xml, domain } = launchAgentDefinition(runtime);
|
|
157
|
+
await mkdir(launchDir, { recursive: true });
|
|
158
|
+
await mkdir(dirname(local.log), { recursive: true, mode: 0o700 });
|
|
159
|
+
await rotateLog(local.log);
|
|
160
|
+
await import("node:fs/promises").then(({ writeFile }) => writeFile(plist, xml, { mode: 0o600 }));
|
|
161
|
+
if (process.env.AIP_SKIP_SERVICE !== "1") {
|
|
162
|
+
await run("launchctl", ["bootout", domain, plist], undefined, true);
|
|
163
|
+
await run("launchctl", ["bootstrap", domain, plist]);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async function rotateLog(log) {
|
|
167
|
+
const size = await stat(log)
|
|
168
|
+
.then((value) => value.size)
|
|
169
|
+
.catch(() => 0);
|
|
170
|
+
if (size < 10 * 1024 * 1024)
|
|
171
|
+
return;
|
|
172
|
+
await rm(`${log}.3`, { force: true });
|
|
173
|
+
await rename(`${log}.2`, `${log}.3`).catch(() => undefined);
|
|
174
|
+
await rename(`${log}.1`, `${log}.2`).catch(() => undefined);
|
|
175
|
+
await rename(log, `${log}.1`).catch(() => undefined);
|
|
176
|
+
}
|
|
177
|
+
async function installWindowsTask(runtime) {
|
|
178
|
+
const task = windowsTaskDefinition(runtime, paths().root);
|
|
179
|
+
const { writeSecureJson } = await import("./secure-json.js");
|
|
180
|
+
await writeSecureJson(join(paths().root, "state", "windows-task.json"), task);
|
|
181
|
+
if (process.env.AIP_SKIP_SERVICE !== "1") {
|
|
182
|
+
await run("schtasks.exe", [
|
|
183
|
+
"/Create",
|
|
184
|
+
"/F",
|
|
185
|
+
"/SC",
|
|
186
|
+
"ONLOGON",
|
|
187
|
+
"/TN",
|
|
188
|
+
"AI Platform Local Coding Host",
|
|
189
|
+
"/TR",
|
|
190
|
+
`"${task.executable}" "${task.arguments[0]}"`,
|
|
191
|
+
]);
|
|
192
|
+
await run("schtasks.exe", ["/Run", "/TN", "AI Platform Local Coding Host"]);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
export function windowsTaskDefinition(runtime, root) {
|
|
196
|
+
return {
|
|
197
|
+
executable: win32.join(runtime, "bin", "node.exe"),
|
|
198
|
+
arguments: [win32.join(runtime, "app", "dist", "daemon.js")],
|
|
199
|
+
environment: { AIP_HOME: root },
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
async function run(command, args, env, ignoreFailure = false) {
|
|
203
|
+
const code = await new Promise((resolveCode, reject) => {
|
|
204
|
+
const child = spawn(command, args, {
|
|
205
|
+
stdio: "ignore",
|
|
206
|
+
env: env ? { ...process.env, ...env } : process.env,
|
|
207
|
+
});
|
|
208
|
+
child.once("error", reject);
|
|
209
|
+
child.once("exit", (value) => resolveCode(value ?? 1));
|
|
210
|
+
});
|
|
211
|
+
if (code !== 0 && !ignoreFailure)
|
|
212
|
+
throw new Error(`${command} 执行失败 (${code})`);
|
|
213
|
+
}
|
|
214
|
+
function capture(command, args) {
|
|
215
|
+
return new Promise((resolveOutput) => {
|
|
216
|
+
let output = "";
|
|
217
|
+
const child = spawn(command, args, { stdio: ["ignore", "pipe", "pipe"] });
|
|
218
|
+
for (const stream of [child.stdout, child.stderr])
|
|
219
|
+
stream.on("data", (chunk) => {
|
|
220
|
+
output = `${output}${chunk.toString()}`.slice(-16_000);
|
|
221
|
+
});
|
|
222
|
+
child.once("error", () => resolveOutput(output));
|
|
223
|
+
child.once("exit", () => resolveOutput(output));
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../src/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-browser.d.ts","sourceRoot":"","sources":["../src/open-browser.ts"],"names":[],"mappings":"AAEA,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,iBAiB5C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
export async function openBrowser(url) {
|
|
3
|
+
if (!/^https?:\/\//u.test(url))
|
|
4
|
+
throw new Error("只允许打开 HTTP(S) 授权地址");
|
|
5
|
+
const command = process.platform === "darwin"
|
|
6
|
+
? "open"
|
|
7
|
+
: process.platform === "win32"
|
|
8
|
+
? "rundll32.exe"
|
|
9
|
+
: "xdg-open";
|
|
10
|
+
const args = process.platform === "win32" ? ["url.dll,FileProtocolHandler", url] : [url];
|
|
11
|
+
await new Promise((resolve, reject) => {
|
|
12
|
+
const child = spawn(command, args, { detached: true, stdio: "ignore", windowsHide: true });
|
|
13
|
+
child.once("error", reject);
|
|
14
|
+
child.once("spawn", () => {
|
|
15
|
+
child.unref();
|
|
16
|
+
resolve();
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=open-browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-browser.js","sourceRoot":"","sources":["../src/open-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACtE,MAAM,OAAO,GACX,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,UAAU,CAAC;IACnB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACzF,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function aipHome(): string;
|
|
2
|
+
export declare function paths(): {
|
|
3
|
+
root: string;
|
|
4
|
+
bin: string;
|
|
5
|
+
stableCli: string;
|
|
6
|
+
deviceAuth: string;
|
|
7
|
+
providerAuth: string;
|
|
8
|
+
modelsStore: string;
|
|
9
|
+
hostState: string;
|
|
10
|
+
daemonState: string;
|
|
11
|
+
workspaceRoot: string;
|
|
12
|
+
runtime: string;
|
|
13
|
+
runtimeCurrent: string;
|
|
14
|
+
log: string;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAGA,wBAAgB,OAAO,WAEtB;AAED,wBAAgB,KAAK;;;;;;;;;;;;;EAgBpB"}
|
package/dist/paths.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export function aipHome() {
|
|
4
|
+
return process.env.AIP_HOME || join(homedir(), ".aip");
|
|
5
|
+
}
|
|
6
|
+
export function paths() {
|
|
7
|
+
const root = aipHome();
|
|
8
|
+
return {
|
|
9
|
+
root,
|
|
10
|
+
bin: join(root, "bin"),
|
|
11
|
+
stableCli: join(root, "bin", process.platform === "win32" ? "aip.cmd" : "aip"),
|
|
12
|
+
deviceAuth: join(root, "device-auth.json"),
|
|
13
|
+
providerAuth: join(root, "pi", "auth.json"),
|
|
14
|
+
modelsStore: join(root, "pi", "models-store.json"),
|
|
15
|
+
hostState: join(root, "state", "host.json"),
|
|
16
|
+
daemonState: join(root, "state", "daemon.json"),
|
|
17
|
+
workspaceRoot: join(root, "workspaces"),
|
|
18
|
+
runtime: join(root, "runtime"),
|
|
19
|
+
runtimeCurrent: join(root, "runtime", "current"),
|
|
20
|
+
log: join(root, "logs", "host.log"),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,OAAO;IACrB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,KAAK;IACnB,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,OAAO;QACL,IAAI;QACJ,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;QACtB,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9E,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC;QAC1C,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;QAC3C,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,CAAC;QAClD,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC;QAC3C,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC;QAC/C,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;QACvC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QAC9B,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC;QAChD,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC;KACpC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { LocalCodingHostDefaultRunConfig, LocalCodingHostModel, LocalCodingHostProviderId, LocalCodingHostProviderStatus, LocalCodingHostThinkingLevel } from "@ai-platform/api-contracts";
|
|
2
|
+
export interface ProviderState {
|
|
3
|
+
providerId: LocalCodingHostProviderId;
|
|
4
|
+
status: LocalCodingHostProviderStatus;
|
|
5
|
+
accountHint: string | null;
|
|
6
|
+
}
|
|
7
|
+
export interface PiModelService {
|
|
8
|
+
login(providerId: LocalCodingHostProviderId, mode: "local" | "remote"): Promise<{
|
|
9
|
+
code: string;
|
|
10
|
+
}>;
|
|
11
|
+
logout(providerId: LocalCodingHostProviderId): Promise<void>;
|
|
12
|
+
readProviderStates(): Promise<ProviderState[]>;
|
|
13
|
+
readAvailableModels(): Promise<LocalCodingHostModel[]>;
|
|
14
|
+
}
|
|
15
|
+
export declare class ProductionPiModelService implements PiModelService {
|
|
16
|
+
private runtime;
|
|
17
|
+
login(providerId: LocalCodingHostProviderId, mode: "local" | "remote"): Promise<{
|
|
18
|
+
code: string;
|
|
19
|
+
}>;
|
|
20
|
+
logout(providerId: LocalCodingHostProviderId): Promise<void>;
|
|
21
|
+
readProviderStates(): Promise<{
|
|
22
|
+
providerId: "openai-codex" | "anthropic";
|
|
23
|
+
status: "SIGNED_OUT" | "AUTHENTICATING" | "READY" | "EXPIRED" | "ERROR";
|
|
24
|
+
accountHint: string | null;
|
|
25
|
+
}[]>;
|
|
26
|
+
readAvailableModels(): Promise<{
|
|
27
|
+
providerId: LocalCodingHostProviderId;
|
|
28
|
+
modelId: string;
|
|
29
|
+
displayName: string;
|
|
30
|
+
reasoning: boolean;
|
|
31
|
+
allowedThinkingLevels: LocalCodingHostThinkingLevel[];
|
|
32
|
+
}[]>;
|
|
33
|
+
}
|
|
34
|
+
export declare class TestPiModelService implements PiModelService {
|
|
35
|
+
login(providerId: LocalCodingHostProviderId): Promise<{
|
|
36
|
+
code: string;
|
|
37
|
+
}>;
|
|
38
|
+
logout(providerId: LocalCodingHostProviderId): Promise<void>;
|
|
39
|
+
readProviderStates(): Promise<{
|
|
40
|
+
providerId: "openai-codex" | "anthropic";
|
|
41
|
+
status: "SIGNED_OUT" | "AUTHENTICATING" | "READY" | "EXPIRED" | "ERROR";
|
|
42
|
+
accountHint: string | null;
|
|
43
|
+
}[]>;
|
|
44
|
+
readAvailableModels(): Promise<{
|
|
45
|
+
providerId: import("@ai-platform/api-contracts").components["schemas"]["LocalCodingHostProviderId"];
|
|
46
|
+
modelId: string;
|
|
47
|
+
displayName: string;
|
|
48
|
+
reasoning: boolean;
|
|
49
|
+
allowedThinkingLevels: import("@ai-platform/api-contracts").components["schemas"]["LocalCodingHostThinkingLevel"][];
|
|
50
|
+
}[]>;
|
|
51
|
+
}
|
|
52
|
+
export declare function createPiModelService(): ProductionPiModelService | TestPiModelService;
|
|
53
|
+
export declare function isDefaultModelValid(saved: Omit<LocalCodingHostDefaultRunConfig, "valid"> | null, models: LocalCodingHostModel[]): boolean;
|
|
54
|
+
//# sourceMappingURL=pi-model-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-model-service.d.ts","sourceRoot":"","sources":["../src/pi-model-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,+BAA+B,EAC/B,oBAAoB,EACpB,yBAAyB,EACzB,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,4BAA4B,CAAC;AAkBpC,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,yBAAyB,CAAC;IACtC,MAAM,EAAE,6BAA6B,CAAC;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,UAAU,EAAE,yBAAyB,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClG,MAAM,CAAC,UAAU,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAC/C,mBAAmB,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC;CACxD;AAED,qBAAa,wBAAyB,YAAW,cAAc;YAC/C,OAAO;IAYf,KAAK,CAAC,UAAU,EAAE,yBAAyB,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ;;;IA6BrE,MAAM,CAAC,UAAU,EAAE,yBAAyB;IAI5C,kBAAkB;;;;;IAwBlB,mBAAmB;oBAeW,yBAAyB;;;;+BAMvC,4BAA4B,EAAE;;CAGrD;AA8BD,qBAAa,kBAAmB,YAAW,cAAc;IACjD,KAAK,CAAC,UAAU,EAAE,yBAAyB;;;IAe3C,MAAM,CAAC,UAAU,EAAE,yBAAyB;IAM5C,kBAAkB;;;;;IAQlB,mBAAmB;oBA8Gmn5D,0DAAsB;;;;+BAA+J,0DAAsB;;CA/Ex15D;AAED,wBAAgB,oBAAoB,kDAInC;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,IAAI,CAAC,+BAA+B,EAAE,OAAO,CAAC,GAAG,IAAI,EAC5D,MAAM,EAAE,oBAAoB,EAAE,WAW/B"}
|