@numa-tech/numa 1.12.6 → 1.12.8
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 +141 -43
- package/dist/ai-registry/bridge.d.ts +8 -0
- package/dist/ai-registry/bridge.js +63 -0
- package/dist/ai-registry/bridge.js.map +1 -0
- package/dist/ai-registry/client.d.ts +29 -3
- package/dist/ai-registry/client.js +112 -8
- package/dist/ai-registry/client.js.map +1 -1
- package/dist/ai-registry/commands.js +367 -112
- package/dist/ai-registry/commands.js.map +1 -1
- package/dist/ai-registry/errors.d.ts +2 -1
- package/dist/ai-registry/errors.js +12 -1
- package/dist/ai-registry/errors.js.map +1 -1
- package/dist/ai-registry/mcp-installer.d.ts +1 -0
- package/dist/ai-registry/mcp-installer.js +4 -0
- package/dist/ai-registry/mcp-installer.js.map +1 -1
- package/dist/ai-registry/namespace.d.ts +17 -0
- package/dist/ai-registry/namespace.js +53 -0
- package/dist/ai-registry/namespace.js.map +1 -0
- package/dist/ai-registry/schemas.d.ts +127 -2
- package/dist/ai-registry/schemas.js +42 -2
- package/dist/ai-registry/schemas.js.map +1 -1
- package/dist/ai-registry/sync.d.ts +23 -0
- package/dist/ai-registry/sync.js +276 -0
- package/dist/ai-registry/sync.js.map +1 -0
- package/dist/ai-registry/tui.d.ts +2 -0
- package/dist/ai-registry/tui.js +140 -0
- package/dist/ai-registry/tui.js.map +1 -0
- package/dist/ai-registry/workspace.d.ts +191 -0
- package/dist/ai-registry/workspace.js +167 -0
- package/dist/ai-registry/workspace.js.map +1 -0
- package/dist/app-config.d.ts +3 -2
- package/dist/app-config.js +5 -3
- package/dist/app-config.js.map +1 -1
- package/dist/chatgpt-desktop.d.ts +7 -0
- package/dist/chatgpt-desktop.js +95 -0
- package/dist/chatgpt-desktop.js.map +1 -1
- package/dist/cli.js +25 -3
- package/dist/cli.js.map +1 -1
- package/dist/command-catalog.d.ts +1 -0
- package/dist/command-catalog.js +97 -10
- package/dist/command-catalog.js.map +1 -1
- package/dist/config-page.js +2 -0
- package/dist/config-page.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/pipeline/client.d.ts +10 -6
- package/dist/pipeline/client.js +7 -4
- package/dist/pipeline/client.js.map +1 -1
- package/dist/pipeline/commands.d.ts +5 -1
- package/dist/pipeline/commands.js +89 -18
- package/dist/pipeline/commands.js.map +1 -1
- package/dist/pipeline/schemas.d.ts +7 -7
- package/dist/pipeline/schemas.js +2 -2
- package/dist/pipeline/schemas.js.map +1 -1
- package/dist/platform-profile.d.ts +8 -2
- package/dist/platform-profile.js +5 -2
- package/dist/platform-profile.js.map +1 -1
- package/dist/web-console-page.d.ts +3 -3
- package/dist/web-console-page.js +75 -20
- package/dist/web-console-page.js.map +1 -1
- package/dist/web-console.d.ts +1 -1
- package/dist/web-console.js +46 -0
- package/dist/web-console.js.map +1 -1
- package/package.json +8 -5
- package/skills/numa-ai-registry/SKILL.md +25 -19
- package/skills/numa-ai-registry/evals/evals.json +10 -10
- package/skills/numa-ai-registry/references/command-contract.md +41 -6
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { McpAgentTarget } from "./mcp-installer.js";
|
|
3
|
+
import type { InstallScope, SkillAgentTarget } from "./skill-installer.js";
|
|
4
|
+
declare const SkillEntrySchema: z.ZodObject<{
|
|
5
|
+
name: z.ZodString;
|
|
6
|
+
version: z.ZodOptional<z.ZodString>;
|
|
7
|
+
label: z.ZodOptional<z.ZodString>;
|
|
8
|
+
agent: z.ZodEnum<{
|
|
9
|
+
agents: "agents";
|
|
10
|
+
chatgpt: "chatgpt";
|
|
11
|
+
claude: "claude";
|
|
12
|
+
codex: "codex";
|
|
13
|
+
cursor: "cursor";
|
|
14
|
+
custom: "custom";
|
|
15
|
+
openclaw: "openclaw";
|
|
16
|
+
workbuddy: "workbuddy";
|
|
17
|
+
}>;
|
|
18
|
+
scope: z.ZodDefault<z.ZodEnum<{
|
|
19
|
+
project: "project";
|
|
20
|
+
user: "user";
|
|
21
|
+
}>>;
|
|
22
|
+
customRoot: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
declare const McpEntrySchema: z.ZodObject<{
|
|
25
|
+
name: z.ZodString;
|
|
26
|
+
version: z.ZodOptional<z.ZodString>;
|
|
27
|
+
label: z.ZodOptional<z.ZodString>;
|
|
28
|
+
agent: z.ZodEnum<{
|
|
29
|
+
chatgpt: "chatgpt";
|
|
30
|
+
claude: "claude";
|
|
31
|
+
codex: "codex";
|
|
32
|
+
cursor: "cursor";
|
|
33
|
+
custom: "custom";
|
|
34
|
+
openclaw: "openclaw";
|
|
35
|
+
workbuddy: "workbuddy";
|
|
36
|
+
}>;
|
|
37
|
+
scope: z.ZodDefault<z.ZodEnum<{
|
|
38
|
+
project: "project";
|
|
39
|
+
user: "user";
|
|
40
|
+
}>>;
|
|
41
|
+
transport: z.ZodDefault<z.ZodEnum<{
|
|
42
|
+
auto: "auto";
|
|
43
|
+
bridge: "bridge";
|
|
44
|
+
remote: "remote";
|
|
45
|
+
}>>;
|
|
46
|
+
customConfig: z.ZodOptional<z.ZodString>;
|
|
47
|
+
}, z.core.$strip>;
|
|
48
|
+
export declare const RegistryManifestSchema: z.ZodObject<{
|
|
49
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
50
|
+
namespaceKey: z.ZodString;
|
|
51
|
+
instanceCode: z.ZodOptional<z.ZodString>;
|
|
52
|
+
skills: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
53
|
+
name: z.ZodString;
|
|
54
|
+
version: z.ZodOptional<z.ZodString>;
|
|
55
|
+
label: z.ZodOptional<z.ZodString>;
|
|
56
|
+
agent: z.ZodEnum<{
|
|
57
|
+
agents: "agents";
|
|
58
|
+
chatgpt: "chatgpt";
|
|
59
|
+
claude: "claude";
|
|
60
|
+
codex: "codex";
|
|
61
|
+
cursor: "cursor";
|
|
62
|
+
custom: "custom";
|
|
63
|
+
openclaw: "openclaw";
|
|
64
|
+
workbuddy: "workbuddy";
|
|
65
|
+
}>;
|
|
66
|
+
scope: z.ZodDefault<z.ZodEnum<{
|
|
67
|
+
project: "project";
|
|
68
|
+
user: "user";
|
|
69
|
+
}>>;
|
|
70
|
+
customRoot: z.ZodOptional<z.ZodString>;
|
|
71
|
+
}, z.core.$strip>>>;
|
|
72
|
+
mcpServers: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
73
|
+
name: z.ZodString;
|
|
74
|
+
version: z.ZodOptional<z.ZodString>;
|
|
75
|
+
label: z.ZodOptional<z.ZodString>;
|
|
76
|
+
agent: z.ZodEnum<{
|
|
77
|
+
chatgpt: "chatgpt";
|
|
78
|
+
claude: "claude";
|
|
79
|
+
codex: "codex";
|
|
80
|
+
cursor: "cursor";
|
|
81
|
+
custom: "custom";
|
|
82
|
+
openclaw: "openclaw";
|
|
83
|
+
workbuddy: "workbuddy";
|
|
84
|
+
}>;
|
|
85
|
+
scope: z.ZodDefault<z.ZodEnum<{
|
|
86
|
+
project: "project";
|
|
87
|
+
user: "user";
|
|
88
|
+
}>>;
|
|
89
|
+
transport: z.ZodDefault<z.ZodEnum<{
|
|
90
|
+
auto: "auto";
|
|
91
|
+
bridge: "bridge";
|
|
92
|
+
remote: "remote";
|
|
93
|
+
}>>;
|
|
94
|
+
customConfig: z.ZodOptional<z.ZodString>;
|
|
95
|
+
}, z.core.$strip>>>;
|
|
96
|
+
}, z.core.$loose>;
|
|
97
|
+
export declare const RegistryLockResourceSchema: z.ZodObject<{
|
|
98
|
+
type: z.ZodEnum<{
|
|
99
|
+
MCP: "MCP";
|
|
100
|
+
SKILL: "SKILL";
|
|
101
|
+
}>;
|
|
102
|
+
name: z.ZodString;
|
|
103
|
+
version: z.ZodString;
|
|
104
|
+
trackedLabel: z.ZodOptional<z.ZodString>;
|
|
105
|
+
sha256: z.ZodString;
|
|
106
|
+
source: z.ZodObject<{
|
|
107
|
+
registry: z.ZodLiteral<"NACOS">;
|
|
108
|
+
namespaceKey: z.ZodString;
|
|
109
|
+
instanceCode: z.ZodString;
|
|
110
|
+
}, z.core.$strip>;
|
|
111
|
+
install: z.ZodObject<{
|
|
112
|
+
agent: z.ZodString;
|
|
113
|
+
scope: z.ZodEnum<{
|
|
114
|
+
project: "project";
|
|
115
|
+
user: "user";
|
|
116
|
+
}>;
|
|
117
|
+
status: z.ZodEnum<{
|
|
118
|
+
FAILED: "FAILED";
|
|
119
|
+
INSTALLED: "INSTALLED";
|
|
120
|
+
LOCKED: "LOCKED";
|
|
121
|
+
MISSING: "MISSING";
|
|
122
|
+
}>;
|
|
123
|
+
path: z.ZodOptional<z.ZodString>;
|
|
124
|
+
}, z.core.$strip>;
|
|
125
|
+
}, z.core.$strip>;
|
|
126
|
+
export declare const RegistryLockSchema: z.ZodObject<{
|
|
127
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
128
|
+
namespaceKey: z.ZodString;
|
|
129
|
+
instanceCode: z.ZodString;
|
|
130
|
+
policyRevision: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
|
|
131
|
+
resources: z.ZodArray<z.ZodObject<{
|
|
132
|
+
type: z.ZodEnum<{
|
|
133
|
+
MCP: "MCP";
|
|
134
|
+
SKILL: "SKILL";
|
|
135
|
+
}>;
|
|
136
|
+
name: z.ZodString;
|
|
137
|
+
version: z.ZodString;
|
|
138
|
+
trackedLabel: z.ZodOptional<z.ZodString>;
|
|
139
|
+
sha256: z.ZodString;
|
|
140
|
+
source: z.ZodObject<{
|
|
141
|
+
registry: z.ZodLiteral<"NACOS">;
|
|
142
|
+
namespaceKey: z.ZodString;
|
|
143
|
+
instanceCode: z.ZodString;
|
|
144
|
+
}, z.core.$strip>;
|
|
145
|
+
install: z.ZodObject<{
|
|
146
|
+
agent: z.ZodString;
|
|
147
|
+
scope: z.ZodEnum<{
|
|
148
|
+
project: "project";
|
|
149
|
+
user: "user";
|
|
150
|
+
}>;
|
|
151
|
+
status: z.ZodEnum<{
|
|
152
|
+
FAILED: "FAILED";
|
|
153
|
+
INSTALLED: "INSTALLED";
|
|
154
|
+
LOCKED: "LOCKED";
|
|
155
|
+
MISSING: "MISSING";
|
|
156
|
+
}>;
|
|
157
|
+
path: z.ZodOptional<z.ZodString>;
|
|
158
|
+
}, z.core.$strip>;
|
|
159
|
+
}, z.core.$strip>>;
|
|
160
|
+
}, z.core.$strip>;
|
|
161
|
+
export type RegistryManifest = z.infer<typeof RegistryManifestSchema>;
|
|
162
|
+
export type RegistrySkillEntry = z.infer<typeof SkillEntrySchema> & {
|
|
163
|
+
agent: SkillAgentTarget;
|
|
164
|
+
scope: InstallScope;
|
|
165
|
+
};
|
|
166
|
+
export type RegistryMcpEntry = z.infer<typeof McpEntrySchema> & {
|
|
167
|
+
agent: McpAgentTarget;
|
|
168
|
+
scope: InstallScope;
|
|
169
|
+
};
|
|
170
|
+
export type RegistryLock = z.infer<typeof RegistryLockSchema>;
|
|
171
|
+
export type RegistryLockResource = z.infer<typeof RegistryLockResourceSchema>;
|
|
172
|
+
export interface RegistryWorkspaceFiles {
|
|
173
|
+
directory: string;
|
|
174
|
+
manifestPath: string;
|
|
175
|
+
lockPath: string;
|
|
176
|
+
}
|
|
177
|
+
export declare function findRegistryWorkspace(start?: string): Promise<RegistryWorkspaceFiles | undefined>;
|
|
178
|
+
export declare function registryWorkspaceAt(start?: string): RegistryWorkspaceFiles;
|
|
179
|
+
export declare function readRegistryManifest(start?: string, required?: boolean): Promise<{
|
|
180
|
+
manifest: RegistryManifest;
|
|
181
|
+
files: RegistryWorkspaceFiles;
|
|
182
|
+
} | undefined>;
|
|
183
|
+
export declare function readRegistryLock(files: RegistryWorkspaceFiles, required?: boolean): Promise<RegistryLock | undefined>;
|
|
184
|
+
export declare function writeRegistryManifest(files: RegistryWorkspaceFiles, manifest: RegistryManifest): Promise<void>;
|
|
185
|
+
export declare function writeRegistryLock(files: RegistryWorkspaceFiles, lock: RegistryLock): Promise<void>;
|
|
186
|
+
export declare function canonicalJson(value: unknown): string;
|
|
187
|
+
export declare function canonicalSha256(value: unknown): string;
|
|
188
|
+
export declare function mergeSkillEntry(manifest: RegistryManifest, entry: RegistrySkillEntry): RegistryManifest;
|
|
189
|
+
export declare function mergeMcpEntry(manifest: RegistryManifest, entry: RegistryMcpEntry): RegistryManifest;
|
|
190
|
+
export declare function upsertLockResource(lock: RegistryLock, resource: RegistryLockResource): RegistryLock;
|
|
191
|
+
export {};
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { access, mkdir, readFile, rename, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join, parse, resolve } from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { AiRegistryError } from "./errors.js";
|
|
6
|
+
const SkillEntrySchema = z.object({
|
|
7
|
+
name: z.string().min(1),
|
|
8
|
+
version: z.string().min(1).optional(),
|
|
9
|
+
label: z.string().min(1).optional(),
|
|
10
|
+
agent: z.enum(["chatgpt", "codex", "claude", "cursor", "workbuddy", "openclaw", "agents", "custom"]),
|
|
11
|
+
scope: z.enum(["project", "user"]).default("project"),
|
|
12
|
+
customRoot: z.string().min(1).optional()
|
|
13
|
+
}).refine((entry) => !(entry.version && entry.label), "Skill entry cannot set both version and label");
|
|
14
|
+
const McpEntrySchema = z.object({
|
|
15
|
+
name: z.string().min(1),
|
|
16
|
+
version: z.string().min(1).optional(),
|
|
17
|
+
label: z.string().min(1).optional(),
|
|
18
|
+
agent: z.enum(["chatgpt", "codex", "claude", "cursor", "workbuddy", "openclaw", "custom"]),
|
|
19
|
+
scope: z.enum(["project", "user"]).default("project"),
|
|
20
|
+
transport: z.enum(["auto", "remote", "bridge"]).default("auto"),
|
|
21
|
+
customConfig: z.string().min(1).optional()
|
|
22
|
+
}).refine((entry) => !(entry.version && entry.label), "MCP entry cannot set both version and label");
|
|
23
|
+
export const RegistryManifestSchema = z.object({
|
|
24
|
+
schemaVersion: z.literal(1),
|
|
25
|
+
namespaceKey: z.string().min(1),
|
|
26
|
+
instanceCode: z.string().min(1).optional(),
|
|
27
|
+
skills: z.array(SkillEntrySchema).default([]),
|
|
28
|
+
mcpServers: z.array(McpEntrySchema).default([])
|
|
29
|
+
}).passthrough();
|
|
30
|
+
const LockInstallSchema = z.object({
|
|
31
|
+
agent: z.string().min(1),
|
|
32
|
+
scope: z.enum(["project", "user"]),
|
|
33
|
+
status: z.enum(["LOCKED", "INSTALLED", "MISSING", "FAILED"]),
|
|
34
|
+
path: z.string().min(1).optional()
|
|
35
|
+
});
|
|
36
|
+
export const RegistryLockResourceSchema = z.object({
|
|
37
|
+
type: z.enum(["SKILL", "MCP"]),
|
|
38
|
+
name: z.string().min(1),
|
|
39
|
+
version: z.string().min(1),
|
|
40
|
+
trackedLabel: z.string().min(1).optional(),
|
|
41
|
+
sha256: z.string().regex(/^[a-f0-9]{64}$/u),
|
|
42
|
+
source: z.object({
|
|
43
|
+
registry: z.literal("NACOS"),
|
|
44
|
+
namespaceKey: z.string().min(1),
|
|
45
|
+
instanceCode: z.string().min(1)
|
|
46
|
+
}),
|
|
47
|
+
install: LockInstallSchema
|
|
48
|
+
});
|
|
49
|
+
export const RegistryLockSchema = z.object({
|
|
50
|
+
schemaVersion: z.literal(1),
|
|
51
|
+
namespaceKey: z.string().min(1),
|
|
52
|
+
instanceCode: z.string().min(1),
|
|
53
|
+
policyRevision: z.union([z.string().min(1), z.number().int().nonnegative()]),
|
|
54
|
+
resources: z.array(RegistryLockResourceSchema)
|
|
55
|
+
});
|
|
56
|
+
export async function findRegistryWorkspace(start = process.cwd()) {
|
|
57
|
+
let current = resolve(start);
|
|
58
|
+
const root = parse(current).root;
|
|
59
|
+
while (true) {
|
|
60
|
+
const directory = join(current, ".numa");
|
|
61
|
+
const manifestPath = join(directory, "registry.json");
|
|
62
|
+
if (await exists(manifestPath))
|
|
63
|
+
return { directory, manifestPath, lockPath: join(directory, "registry.lock.json") };
|
|
64
|
+
if (current === root)
|
|
65
|
+
return undefined;
|
|
66
|
+
current = dirname(current);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function registryWorkspaceAt(start = process.cwd()) {
|
|
70
|
+
const directory = join(resolve(start), ".numa");
|
|
71
|
+
return { directory, manifestPath: join(directory, "registry.json"), lockPath: join(directory, "registry.lock.json") };
|
|
72
|
+
}
|
|
73
|
+
export async function readRegistryManifest(start = process.cwd(), required = true) {
|
|
74
|
+
const files = await findRegistryWorkspace(start);
|
|
75
|
+
if (!files) {
|
|
76
|
+
if (!required)
|
|
77
|
+
return undefined;
|
|
78
|
+
throw new AiRegistryError("No .numa/registry.json was found in this project.", "ai_registry_manifest_not_found");
|
|
79
|
+
}
|
|
80
|
+
return { manifest: await parseJson(files.manifestPath, RegistryManifestSchema, "registry manifest"), files };
|
|
81
|
+
}
|
|
82
|
+
export async function readRegistryLock(files, required = true) {
|
|
83
|
+
if (!(await exists(files.lockPath))) {
|
|
84
|
+
if (!required)
|
|
85
|
+
return undefined;
|
|
86
|
+
throw new AiRegistryError("No .numa/registry.lock.json exists; run `numa registry lock` first.", "ai_registry_lock_not_found");
|
|
87
|
+
}
|
|
88
|
+
return parseJson(files.lockPath, RegistryLockSchema, "registry lock");
|
|
89
|
+
}
|
|
90
|
+
export async function writeRegistryManifest(files, manifest) {
|
|
91
|
+
await writeCanonicalJson(files.manifestPath, normalizeManifest(RegistryManifestSchema.parse(manifest)));
|
|
92
|
+
}
|
|
93
|
+
export async function writeRegistryLock(files, lock) {
|
|
94
|
+
const parsed = RegistryLockSchema.parse(lock);
|
|
95
|
+
const normalized = {
|
|
96
|
+
...parsed,
|
|
97
|
+
resources: [...parsed.resources].sort((left, right) => compareText(`${left.type}\0${left.name}\0${left.install.agent}`, `${right.type}\0${right.name}\0${right.install.agent}`))
|
|
98
|
+
};
|
|
99
|
+
await writeCanonicalJson(files.lockPath, normalized);
|
|
100
|
+
}
|
|
101
|
+
export function canonicalJson(value) {
|
|
102
|
+
return JSON.stringify(sortValue(value));
|
|
103
|
+
}
|
|
104
|
+
export function canonicalSha256(value) {
|
|
105
|
+
return createHash("sha256").update(canonicalJson(value)).digest("hex");
|
|
106
|
+
}
|
|
107
|
+
export function mergeSkillEntry(manifest, entry) {
|
|
108
|
+
return normalizeManifest({
|
|
109
|
+
...manifest,
|
|
110
|
+
skills: [...manifest.skills.filter((item) => !(item.name === entry.name && item.agent === entry.agent)), entry]
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
export function mergeMcpEntry(manifest, entry) {
|
|
114
|
+
return normalizeManifest({
|
|
115
|
+
...manifest,
|
|
116
|
+
mcpServers: [...manifest.mcpServers.filter((item) => !(item.name === entry.name && item.agent === entry.agent)), entry]
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
export function upsertLockResource(lock, resource) {
|
|
120
|
+
return {
|
|
121
|
+
...lock,
|
|
122
|
+
resources: [...lock.resources.filter((item) => !(item.type === resource.type && item.name === resource.name && item.install.agent === resource.install.agent)), resource]
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function normalizeManifest(manifest) {
|
|
126
|
+
return {
|
|
127
|
+
...manifest,
|
|
128
|
+
skills: [...manifest.skills].sort((left, right) => compareText(`${left.name}\0${left.agent}`, `${right.name}\0${right.agent}`)),
|
|
129
|
+
mcpServers: [...manifest.mcpServers].sort((left, right) => compareText(`${left.name}\0${left.agent}`, `${right.name}\0${right.agent}`))
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async function parseJson(path, schema, label) {
|
|
133
|
+
try {
|
|
134
|
+
return schema.parse(JSON.parse(await readFile(path, "utf8")));
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw new AiRegistryError(`Cannot read ${label} ${path}: ${error instanceof Error ? error.message : String(error)}`, "ai_registry_manifest_invalid");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async function writeCanonicalJson(path, value) {
|
|
141
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o755 });
|
|
142
|
+
const temporary = `${path}.${process.pid}.tmp`;
|
|
143
|
+
await writeFile(temporary, `${JSON.stringify(sortValue(value), null, 2)}\n`, { mode: 0o644 });
|
|
144
|
+
await rename(temporary, path);
|
|
145
|
+
}
|
|
146
|
+
function sortValue(value) {
|
|
147
|
+
if (Array.isArray(value))
|
|
148
|
+
return value.map(sortValue);
|
|
149
|
+
if (!value || typeof value !== "object")
|
|
150
|
+
return value;
|
|
151
|
+
return Object.fromEntries(Object.entries(value)
|
|
152
|
+
.sort(([left], [right]) => compareText(left, right))
|
|
153
|
+
.map(([key, item]) => [key, sortValue(item)]));
|
|
154
|
+
}
|
|
155
|
+
function compareText(left, right) {
|
|
156
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
157
|
+
}
|
|
158
|
+
async function exists(path) {
|
|
159
|
+
try {
|
|
160
|
+
await access(path);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/ai-registry/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/app-config.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
export type OutputFormat = "text" | "json";
|
|
2
2
|
export type CliLocale = "zh-CN" | "en-US";
|
|
3
3
|
export interface AppConfig {
|
|
4
|
-
schemaVersion:
|
|
4
|
+
schemaVersion: 4;
|
|
5
5
|
locale: CliLocale;
|
|
6
6
|
output: OutputFormat;
|
|
7
7
|
apiBaseUrl: string;
|
|
8
8
|
profileUrl: string;
|
|
9
9
|
profileId: string;
|
|
10
|
+
aiRegistryDefaultNamespaceKey: string;
|
|
10
11
|
registryUrl: string;
|
|
11
12
|
checkUpdates: boolean;
|
|
12
13
|
initializedAt?: string;
|
|
@@ -25,6 +26,6 @@ export declare function loadAppConfigSync(): AppConfig;
|
|
|
25
26
|
export declare function hasAppConfig(): Promise<boolean>;
|
|
26
27
|
export declare function saveAppConfig(config: AppConfig): Promise<AppConfig>;
|
|
27
28
|
export declare function resetAppConfig(): Promise<void>;
|
|
28
|
-
export declare const CONFIG_KEYS: readonly ["locale", "output", "apiBaseUrl", "profileUrl", "profileId", "registryUrl", "checkUpdates"];
|
|
29
|
+
export declare const CONFIG_KEYS: readonly ["locale", "output", "apiBaseUrl", "profileUrl", "profileId", "aiRegistryDefaultNamespaceKey", "registryUrl", "checkUpdates"];
|
|
29
30
|
export type ConfigKey = (typeof CONFIG_KEYS)[number];
|
|
30
31
|
export declare function updateConfigValue(config: AppConfig, expression: string): AppConfig;
|
package/dist/app-config.js
CHANGED
|
@@ -9,12 +9,13 @@ export const DEFAULT_API_BASE_URL = "https://apps-gw-prd.mcisaas.com/mci-devops-
|
|
|
9
9
|
export const DEFAULT_PROFILE_URL = "https://code-inbox.mcisaas.com/public/v1/tenants/numa-realm/client-configuration";
|
|
10
10
|
export const LEGACY_OFFICIAL_PROFILE_URL = "https://mail.tokensource.top/public/v1/tenants/numa-realm/client-configuration";
|
|
11
11
|
export const DEFAULT_APP_CONFIG = {
|
|
12
|
-
schemaVersion:
|
|
12
|
+
schemaVersion: 4,
|
|
13
13
|
locale: "zh-CN",
|
|
14
14
|
output: "text",
|
|
15
15
|
apiBaseUrl: DEFAULT_API_BASE_URL,
|
|
16
16
|
profileUrl: DEFAULT_PROFILE_URL,
|
|
17
17
|
profileId: "",
|
|
18
|
+
aiRegistryDefaultNamespaceKey: "",
|
|
18
19
|
registryUrl: DEFAULT_REGISTRY_URL,
|
|
19
20
|
checkUpdates: true
|
|
20
21
|
};
|
|
@@ -30,12 +31,12 @@ export function appConfigPath() {
|
|
|
30
31
|
return join(appConfigDirectory(), "config.json");
|
|
31
32
|
}
|
|
32
33
|
function normalizeConfig(value) {
|
|
33
|
-
const migrateLegacyRegistry =
|
|
34
|
+
const migrateLegacyRegistry = ![2, 3, 4].includes(value?.schemaVersion ?? 0) &&
|
|
34
35
|
value?.registryUrl === LEGACY_PRIVATE_REGISTRY_URL;
|
|
35
36
|
const normalized = {
|
|
36
37
|
...DEFAULT_APP_CONFIG,
|
|
37
38
|
...(value ?? {}),
|
|
38
|
-
schemaVersion:
|
|
39
|
+
schemaVersion: 4,
|
|
39
40
|
...(migrateLegacyRegistry ? { registryUrl: DEFAULT_REGISTRY_URL } : {})
|
|
40
41
|
};
|
|
41
42
|
return {
|
|
@@ -100,6 +101,7 @@ export const CONFIG_KEYS = [
|
|
|
100
101
|
"apiBaseUrl",
|
|
101
102
|
"profileUrl",
|
|
102
103
|
"profileId",
|
|
104
|
+
"aiRegistryDefaultNamespaceKey",
|
|
103
105
|
"registryUrl",
|
|
104
106
|
"checkUpdates"
|
|
105
107
|
];
|
package/dist/app-config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-config.js","sourceRoot":"","sources":["../src/app-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"app-config.js","sourceRoot":"","sources":["../src/app-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,5 +34,12 @@ export interface ChatGptDesktopPreparation {
|
|
|
34
34
|
/** ChatGPT release versions use YY.MDD.build; `26.8` means the start of August 2026. */
|
|
35
35
|
export declare function requiresChatGptRollback(version: string): boolean;
|
|
36
36
|
export declare function inspectChatGptDesktop(dependencies?: ChatGptDesktopDependencies): Promise<CodexDesktopAppStatus>;
|
|
37
|
+
interface DownloadProgress {
|
|
38
|
+
start(): void;
|
|
39
|
+
update(bytes: number): void;
|
|
40
|
+
complete(bytes: number): void;
|
|
41
|
+
abort(): void;
|
|
42
|
+
}
|
|
43
|
+
export declare function createChatGptDownloadProgress(output: NodeJS.WritableStream, totalBytes: number, now?: () => number): DownloadProgress;
|
|
37
44
|
export declare function ensureManagedChatGptDesktop(dependencies?: ChatGptDesktopDependencies): Promise<ChatGptDesktopPreparation>;
|
|
38
45
|
export {};
|
package/dist/chatgpt-desktop.js
CHANGED
|
@@ -15,6 +15,8 @@ export const MANAGED_CHATGPT_ARCHIVE_SHA256 = "da88c8a15eab1ddc8efdf50182d4aca74
|
|
|
15
15
|
const CHATGPT_BUNDLE_ID = "com.openai.codex";
|
|
16
16
|
const OPENAI_TEAM_ID = "2DC432GLL2";
|
|
17
17
|
const MAX_DOWNLOAD_BYTES = 650 * 1024 * 1024;
|
|
18
|
+
const DOWNLOAD_PROGRESS_INTERVAL_MS = 200;
|
|
19
|
+
const MEBIBYTE = 1024 * 1024;
|
|
18
20
|
const execFile = promisify(execFileCallback);
|
|
19
21
|
function appCandidates(dependencies) {
|
|
20
22
|
if (dependencies.appPaths)
|
|
@@ -168,6 +170,94 @@ async function writeAll(file, value) {
|
|
|
168
170
|
offset += result.bytesWritten;
|
|
169
171
|
}
|
|
170
172
|
}
|
|
173
|
+
function formatMebibytes(bytes) {
|
|
174
|
+
return `${(bytes / MEBIBYTE).toFixed(1)} MiB`;
|
|
175
|
+
}
|
|
176
|
+
function formatRate(bytesPerSecond) {
|
|
177
|
+
if (bytesPerSecond >= MEBIBYTE)
|
|
178
|
+
return `${(bytesPerSecond / MEBIBYTE).toFixed(1)} MiB/s`;
|
|
179
|
+
return `${Math.max(0, bytesPerSecond / 1024).toFixed(0)} KiB/s`;
|
|
180
|
+
}
|
|
181
|
+
function formatDuration(seconds) {
|
|
182
|
+
if (!Number.isFinite(seconds) || seconds < 0)
|
|
183
|
+
return "--:--";
|
|
184
|
+
const rounded = Math.ceil(seconds);
|
|
185
|
+
const hours = Math.floor(rounded / 3600);
|
|
186
|
+
const minutes = Math.floor((rounded % 3600) / 60);
|
|
187
|
+
const remainder = rounded % 60;
|
|
188
|
+
return hours > 0
|
|
189
|
+
? `${hours}:${String(minutes).padStart(2, "0")}:${String(remainder).padStart(2, "0")}`
|
|
190
|
+
: `${minutes}:${String(remainder).padStart(2, "0")}`;
|
|
191
|
+
}
|
|
192
|
+
export function createChatGptDownloadProgress(output, totalBytes, now = Date.now) {
|
|
193
|
+
const terminal = output;
|
|
194
|
+
const interactive = terminal.isTTY === true;
|
|
195
|
+
const columns = Number.isFinite(terminal.columns) ? terminal.columns : 100;
|
|
196
|
+
const barWidth = Math.max(10, Math.min(30, columns - 64));
|
|
197
|
+
const startedAt = now();
|
|
198
|
+
let lastRenderedAt = Number.NEGATIVE_INFINITY;
|
|
199
|
+
let lastReportedBucket = 0;
|
|
200
|
+
let terminalLineOpen = false;
|
|
201
|
+
const snapshot = (bytes) => {
|
|
202
|
+
const bounded = Math.max(0, Math.min(bytes, totalBytes));
|
|
203
|
+
const ratio = totalBytes > 0 ? bounded / totalBytes : 0;
|
|
204
|
+
const percent = ratio * 100;
|
|
205
|
+
const elapsedSeconds = Math.max(0, (now() - startedAt) / 1000);
|
|
206
|
+
const rate = elapsedSeconds >= 0.25 && bounded > 0 ? bounded / elapsedSeconds : 0;
|
|
207
|
+
const eta = rate > 0 ? (totalBytes - bounded) / rate : Number.NaN;
|
|
208
|
+
const completed = Math.min(barWidth, Math.floor(ratio * barWidth));
|
|
209
|
+
const bar = `${"█".repeat(completed)}${"░".repeat(barWidth - completed)}`;
|
|
210
|
+
return `下载 [${bar}] ${percent.toFixed(1)}% ${formatMebibytes(bounded)}/${formatMebibytes(totalBytes)}`
|
|
211
|
+
+ ` ${rate > 0 ? formatRate(rate) : "-- KiB/s"} ETA ${formatDuration(eta)}`;
|
|
212
|
+
};
|
|
213
|
+
const renderInteractive = (bytes, force = false) => {
|
|
214
|
+
const timestamp = now();
|
|
215
|
+
if (!force && timestamp - lastRenderedAt < DOWNLOAD_PROGRESS_INTERVAL_MS)
|
|
216
|
+
return;
|
|
217
|
+
output.write(`\r\u001b[2K${snapshot(bytes)}`);
|
|
218
|
+
terminalLineOpen = true;
|
|
219
|
+
lastRenderedAt = timestamp;
|
|
220
|
+
};
|
|
221
|
+
const renderLog = (bytes, force = false) => {
|
|
222
|
+
const bounded = Math.max(0, Math.min(bytes, totalBytes));
|
|
223
|
+
const ratio = totalBytes > 0 ? bounded / totalBytes : 0;
|
|
224
|
+
const bucket = Math.min(10, Math.floor(ratio * 10));
|
|
225
|
+
if (!force && bucket <= lastReportedBucket)
|
|
226
|
+
return;
|
|
227
|
+
lastReportedBucket = Math.max(lastReportedBucket, bucket);
|
|
228
|
+
output.write(`${snapshot(bytes)}\n`);
|
|
229
|
+
};
|
|
230
|
+
return {
|
|
231
|
+
start() {
|
|
232
|
+
if (interactive)
|
|
233
|
+
renderInteractive(0, true);
|
|
234
|
+
else
|
|
235
|
+
output.write(`正在下载 ChatGPT 安装包(${formatMebibytes(totalBytes)})…\n`);
|
|
236
|
+
},
|
|
237
|
+
update(bytes) {
|
|
238
|
+
if (interactive)
|
|
239
|
+
renderInteractive(bytes, bytes >= totalBytes);
|
|
240
|
+
else
|
|
241
|
+
renderLog(bytes);
|
|
242
|
+
},
|
|
243
|
+
complete(bytes) {
|
|
244
|
+
if (interactive) {
|
|
245
|
+
renderInteractive(bytes, true);
|
|
246
|
+
output.write("\n");
|
|
247
|
+
terminalLineOpen = false;
|
|
248
|
+
}
|
|
249
|
+
else if (lastReportedBucket < 10) {
|
|
250
|
+
renderLog(bytes, true);
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
abort() {
|
|
254
|
+
if (terminalLineOpen) {
|
|
255
|
+
output.write("\n");
|
|
256
|
+
terminalLineOpen = false;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
}
|
|
171
261
|
async function downloadManagedArchive(dependencies) {
|
|
172
262
|
const env = dependencies.env ?? process.env;
|
|
173
263
|
const home = dependencies.homeDirectory ?? homedir();
|
|
@@ -196,7 +286,9 @@ async function downloadManagedArchive(dependencies) {
|
|
|
196
286
|
}
|
|
197
287
|
const digest = createHash("sha256");
|
|
198
288
|
const file = await open(temporary, "wx", 0o600);
|
|
289
|
+
const progress = createChatGptDownloadProgress(dependencies.output ?? process.stderr, MANAGED_CHATGPT_ARCHIVE_BYTES);
|
|
199
290
|
let bytes = 0;
|
|
291
|
+
progress.start();
|
|
200
292
|
try {
|
|
201
293
|
const reader = response.body.getReader();
|
|
202
294
|
while (true) {
|
|
@@ -208,9 +300,12 @@ async function downloadManagedArchive(dependencies) {
|
|
|
208
300
|
throw new Error("ChatGPT 安装包超过允许的最大大小。");
|
|
209
301
|
digest.update(item.value);
|
|
210
302
|
await writeAll(file, item.value);
|
|
303
|
+
progress.update(bytes);
|
|
211
304
|
}
|
|
305
|
+
progress.complete(bytes);
|
|
212
306
|
}
|
|
213
307
|
catch (error) {
|
|
308
|
+
progress.abort();
|
|
214
309
|
await rm(temporary, { force: true });
|
|
215
310
|
throw error;
|
|
216
311
|
}
|