vskill 1.0.16 → 1.0.19
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 +27 -3
- package/agents.json +3 -1
- package/dist/agents/agents-registry.d.ts +61 -0
- package/dist/agents/agents-registry.js +203 -0
- package/dist/agents/agents-registry.js.map +1 -1
- package/dist/api/client.d.ts +85 -0
- package/dist/api/client.js +193 -24
- package/dist/api/client.js.map +1 -1
- package/dist/bin.js +0 -0
- package/dist/commands/add.d.ts +7 -0
- package/dist/commands/add.js +94 -1
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/auth.d.ts +23 -0
- package/dist/commands/auth.js +136 -12
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/eval/serve.d.ts +2 -0
- package/dist/commands/eval/serve.js +126 -4
- package/dist/commands/eval/serve.js.map +1 -1
- package/dist/commands/orgs.d.ts +21 -0
- package/dist/commands/orgs.js +164 -0
- package/dist/commands/orgs.js.map +1 -0
- package/dist/commands/skill.js +14 -1
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/whoami.d.ts +29 -0
- package/dist/commands/whoami.js +119 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/eval/anthropic-catalog.js +32 -2
- package/dist/eval/anthropic-catalog.js.map +1 -1
- package/dist/eval/batch-judge.js +1 -0
- package/dist/eval/batch-judge.js.map +1 -1
- package/dist/eval/llm.d.ts +1 -1
- package/dist/eval/llm.js +104 -2
- package/dist/eval/llm.js.map +1 -1
- package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.d.ts +2 -0
- package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.js +20 -0
- package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.js.map +1 -0
- package/dist/eval-server/active-root-store.d.ts +19 -0
- package/dist/eval-server/active-root-store.js +50 -0
- package/dist/eval-server/active-root-store.js.map +1 -0
- package/dist/eval-server/active-tenant-routes.d.ts +15 -0
- package/dist/eval-server/active-tenant-routes.js +101 -0
- package/dist/eval-server/active-tenant-routes.js.map +1 -0
- package/dist/eval-server/api-routes.d.ts +1 -1
- package/dist/eval-server/api-routes.js +60 -7
- package/dist/eval-server/api-routes.js.map +1 -1
- package/dist/eval-server/authoring-routes.d.ts +1 -1
- package/dist/eval-server/authoring-routes.js +9 -7
- package/dist/eval-server/authoring-routes.js.map +1 -1
- package/dist/eval-server/desktop-open-routes.d.ts +8 -0
- package/dist/eval-server/desktop-open-routes.js +64 -0
- package/dist/eval-server/desktop-open-routes.js.map +1 -0
- package/dist/eval-server/detect-engines-route.d.ts +1 -1
- package/dist/eval-server/detect-engines-route.js +3 -1
- package/dist/eval-server/detect-engines-route.js.map +1 -1
- package/dist/eval-server/eval-server.js +108 -29
- package/dist/eval-server/eval-server.js.map +1 -1
- package/dist/eval-server/export-skill-routes.d.ts +9 -0
- package/dist/eval-server/export-skill-routes.js +81 -0
- package/dist/eval-server/export-skill-routes.js.map +1 -0
- package/dist/eval-server/git-routes.d.ts +7 -6
- package/dist/eval-server/git-routes.js +123 -15
- package/dist/eval-server/git-routes.js.map +1 -1
- package/dist/eval-server/improve-routes.d.ts +1 -1
- package/dist/eval-server/improve-routes.js +4 -1
- package/dist/eval-server/improve-routes.js.map +1 -1
- package/dist/eval-server/install-engine-routes.d.ts +4 -17
- package/dist/eval-server/install-engine-routes.js +10 -125
- package/dist/eval-server/install-engine-routes.js.map +1 -1
- package/dist/eval-server/install-jobs.d.ts +41 -0
- package/dist/eval-server/install-jobs.js +161 -0
- package/dist/eval-server/install-jobs.js.map +1 -0
- package/dist/eval-server/install-skill-routes.d.ts +74 -11
- package/dist/eval-server/install-skill-routes.js +508 -79
- package/dist/eval-server/install-skill-routes.js.map +1 -1
- package/dist/eval-server/install-state-routes.d.ts +5 -1
- package/dist/eval-server/install-state-routes.js +18 -2
- package/dist/eval-server/install-state-routes.js.map +1 -1
- package/dist/eval-server/integration-routes.d.ts +1 -1
- package/dist/eval-server/integration-routes.js +6 -1
- package/dist/eval-server/integration-routes.js.map +1 -1
- package/dist/eval-server/model-compare-routes.d.ts +1 -1
- package/dist/eval-server/model-compare-routes.js +3 -1
- package/dist/eval-server/model-compare-routes.js.map +1 -1
- package/dist/eval-server/oauth-github-routes.d.ts +2 -0
- package/dist/eval-server/oauth-github-routes.js +505 -0
- package/dist/eval-server/oauth-github-routes.js.map +1 -0
- package/dist/eval-server/platform-proxy.d.ts +22 -1
- package/dist/eval-server/platform-proxy.js +183 -22
- package/dist/eval-server/platform-proxy.js.map +1 -1
- package/dist/eval-server/plugin-cli-routes.d.ts +1 -1
- package/dist/eval-server/plugin-cli-routes.js +19 -10
- package/dist/eval-server/plugin-cli-routes.js.map +1 -1
- package/dist/eval-server/remove-skill-routes.d.ts +18 -0
- package/dist/eval-server/remove-skill-routes.js +147 -0
- package/dist/eval-server/remove-skill-routes.js.map +1 -0
- package/dist/eval-server/router.d.ts +17 -3
- package/dist/eval-server/router.js +166 -9
- package/dist/eval-server/router.js.map +1 -1
- package/dist/eval-server/settings-store.js +1 -1
- package/dist/eval-server/settings-store.js.map +1 -1
- package/dist/eval-server/skill-create-routes.d.ts +1 -1
- package/dist/eval-server/skill-create-routes.js +8 -1
- package/dist/eval-server/skill-create-routes.js.map +1 -1
- package/dist/eval-server/supported-agents-routes.d.ts +6 -0
- package/dist/eval-server/supported-agents-routes.js +41 -0
- package/dist/eval-server/supported-agents-routes.js.map +1 -0
- package/dist/eval-server/sweep-routes.d.ts +1 -1
- package/dist/eval-server/sweep-routes.js +5 -1
- package/dist/eval-server/sweep-routes.js.map +1 -1
- package/dist/eval-server/utils/spawn-env.d.ts +1 -0
- package/dist/eval-server/utils/spawn-env.js +47 -0
- package/dist/eval-server/utils/spawn-env.js.map +1 -0
- package/dist/eval-server/workspace-routes.d.ts +12 -0
- package/dist/eval-server/workspace-routes.js +57 -2
- package/dist/eval-server/workspace-routes.js.map +1 -1
- package/dist/eval-ui/assets/AdvancedTab-DOgbx7u0.js +1 -0
- package/dist/eval-ui/assets/{CreateSkillPage-CvdYq8Rr.js → CreateSkillPage-Cv93Croj.js} +3 -3
- package/dist/eval-ui/assets/FindSkillsPalette-BY9DAhHh.js +2 -0
- package/dist/eval-ui/assets/GeneralTab-AwK9sIkP.js +1 -0
- package/dist/eval-ui/assets/PrivacyTab-BtNrxpVV.js +1 -0
- package/dist/eval-ui/assets/{SearchPaletteCore-Bf3PBC64.js → SearchPaletteCore-DMVcq7UB.js} +2 -2
- package/dist/eval-ui/assets/SkillDetailPanel-B_lbhK6q.js +1 -0
- package/dist/eval-ui/assets/UpdateDropdown-4AbjZLpq.js +1 -0
- package/dist/eval-ui/assets/UpdatesTab-DTmo-vVb.js +1 -0
- package/dist/eval-ui/assets/core-DZjBCfjp.js +1 -0
- package/dist/eval-ui/assets/event-QtOCMXAv.js +1 -0
- package/dist/eval-ui/assets/globals-Dpf9KmYH.css +1 -0
- package/dist/eval-ui/assets/globals-hm1COkXX.js +49 -0
- package/dist/eval-ui/assets/index-CUEYzTVL.js +1 -0
- package/dist/eval-ui/assets/index-DDNzcrhv.js +1 -0
- package/dist/eval-ui/assets/index-DhhmQddr.js +1 -0
- package/dist/eval-ui/assets/lifecycle-d1Sm9Hts.css +1 -0
- package/dist/eval-ui/assets/lifecycle-o_IRibOa.js +1 -0
- package/dist/eval-ui/assets/main-tpOyw9SC.js +87 -0
- package/dist/eval-ui/assets/preferences-BHZXB5dL.css +1 -0
- package/dist/eval-ui/assets/preferences-DCdw0Kvu.js +2 -0
- package/dist/eval-ui/assets/useDesktopBridge-9oZFQsrw.js +2 -0
- package/dist/eval-ui/index.html +4 -2
- package/dist/eval-ui/lifecycle.html +33 -0
- package/dist/eval-ui/preferences.html +34 -0
- package/dist/index.js +47 -1
- package/dist/index.js.map +1 -1
- package/dist/installer/bundle-files.d.ts +4 -0
- package/dist/installer/bundle-files.js +97 -0
- package/dist/installer/bundle-files.js.map +1 -0
- package/dist/installer/canonical.d.ts +31 -6
- package/dist/installer/canonical.js +48 -12
- package/dist/installer/canonical.js.map +1 -1
- package/dist/installer/clipboard-export.d.ts +19 -0
- package/dist/installer/clipboard-export.js +88 -0
- package/dist/installer/clipboard-export.js.map +1 -0
- package/dist/installer/multi-install.d.ts +43 -0
- package/dist/installer/multi-install.js +237 -0
- package/dist/installer/multi-install.js.map +1 -0
- package/dist/installer/transformers/aider.d.ts +2 -0
- package/dist/installer/transformers/aider.js +32 -0
- package/dist/installer/transformers/aider.js.map +1 -0
- package/dist/installer/transformers/continue-dev.d.ts +2 -0
- package/dist/installer/transformers/continue-dev.js +6 -0
- package/dist/installer/transformers/continue-dev.js.map +1 -0
- package/dist/installer/transformers/cursor.d.ts +2 -0
- package/dist/installer/transformers/cursor.js +24 -0
- package/dist/installer/transformers/cursor.js.map +1 -0
- package/dist/installer/transformers/github-copilot.d.ts +2 -0
- package/dist/installer/transformers/github-copilot.js +17 -0
- package/dist/installer/transformers/github-copilot.js.map +1 -0
- package/dist/installer/transformers/index.d.ts +78 -0
- package/dist/installer/transformers/index.js +13 -0
- package/dist/installer/transformers/index.js.map +1 -0
- package/dist/installer/transformers/junie.d.ts +2 -0
- package/dist/installer/transformers/junie.js +6 -0
- package/dist/installer/transformers/junie.js.map +1 -0
- package/dist/installer/transformers/kiro.d.ts +2 -0
- package/dist/installer/transformers/kiro.js +6 -0
- package/dist/installer/transformers/kiro.js.map +1 -0
- package/dist/installer/transformers/trae.d.ts +2 -0
- package/dist/installer/transformers/trae.js +6 -0
- package/dist/installer/transformers/trae.js.map +1 -0
- package/dist/installer/transformers/windsurf.d.ts +2 -0
- package/dist/installer/transformers/windsurf.js +12 -0
- package/dist/installer/transformers/windsurf.js.map +1 -0
- package/dist/installer/yaml-safe-mutate.d.ts +19 -0
- package/dist/installer/yaml-safe-mutate.js +184 -0
- package/dist/installer/yaml-safe-mutate.js.map +1 -0
- package/dist/lib/active-tenant.d.ts +36 -0
- package/dist/lib/active-tenant.js +120 -0
- package/dist/lib/active-tenant.js.map +1 -0
- package/dist/lib/keychain.d.ts +15 -2
- package/dist/lib/keychain.js +173 -8
- package/dist/lib/keychain.js.map +1 -1
- package/dist/lib/migration/keychain-migration.d.ts +35 -0
- package/dist/lib/migration/keychain-migration.js +189 -0
- package/dist/lib/migration/keychain-migration.js.map +1 -0
- package/dist/lib/tenant-resolver.d.ts +38 -0
- package/dist/lib/tenant-resolver.js +79 -0
- package/dist/lib/tenant-resolver.js.map +1 -0
- package/dist/studio/lib/ops-log.js +140 -57
- package/dist/studio/lib/ops-log.js.map +1 -1
- package/dist/studio/lib/scope-transfer.d.ts +11 -1
- package/dist/studio/lib/scope-transfer.js +48 -24
- package/dist/studio/lib/scope-transfer.js.map +1 -1
- package/dist/studio/routes/index.d.ts +1 -1
- package/dist/studio/routes/index.js +18 -8
- package/dist/studio/routes/index.js.map +1 -1
- package/dist/studio/routes/ops.js +31 -7
- package/dist/studio/routes/ops.js.map +1 -1
- package/dist/studio/routes/promote.d.ts +1 -1
- package/dist/studio/routes/promote.js +18 -9
- package/dist/studio/routes/promote.js.map +1 -1
- package/dist/studio/routes/revert.d.ts +1 -1
- package/dist/studio/routes/revert.js +15 -2
- package/dist/studio/routes/revert.js.map +1 -1
- package/dist/studio/routes/test-install.d.ts +1 -1
- package/dist/studio/routes/test-install.js +16 -9
- package/dist/studio/routes/test-install.js.map +1 -1
- package/dist/studio-runtime/lockfile.d.ts +51 -0
- package/dist/studio-runtime/lockfile.js +216 -0
- package/dist/studio-runtime/lockfile.js.map +1 -0
- package/package.json +18 -1
- package/dist/eval-ui/assets/FindSkillsPalette-DsSgotS9.js +0 -2
- package/dist/eval-ui/assets/SkillDetailPanel-DAD2yJO-.js +0 -1
- package/dist/eval-ui/assets/UpdateDropdown-h5Hg3h7Z.js +0 -1
- package/dist/eval-ui/assets/index-CKLqBL52.css +0 -1
- package/dist/eval-ui/assets/index-JaDg6FlU.js +0 -124
- package/dist/eval-ui/assets/skill-studio-logo-CRyKgIrg.png +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// install-jobs — shared spawn-job runtime for install-skill / install-engine
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Both install-skill-routes and install-engine-routes were ~90% duplicate code:
|
|
5
|
+
// - InstallJob interface (proc, buffers, subscribers, pastEvents)
|
|
6
|
+
// - JOBS Map per route (UUID → job)
|
|
7
|
+
// - localhost-only guard
|
|
8
|
+
// - stdout/stderr ring-buffered into per-line "progress" events
|
|
9
|
+
// - SIGTERM on timeout, "done" event on exit/error
|
|
10
|
+
// - SSE replay-then-subscribe `/:jobId/stream` route
|
|
11
|
+
//
|
|
12
|
+
// Extracting that here means an SSE / timeout / replay bug fix lands once,
|
|
13
|
+
// not twice. Each route file now declares only:
|
|
14
|
+
// - its argv builder + body validation
|
|
15
|
+
// - its prefix and metadata shape (TMeta)
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
import { spawn } from "node:child_process";
|
|
18
|
+
import { randomUUID } from "node:crypto";
|
|
19
|
+
import { sendJson } from "./router.js";
|
|
20
|
+
import { initSSE, sendSSE, sendSSEDone } from "./sse-helpers.js";
|
|
21
|
+
import { buildSpawnEnv } from "./utils/spawn-env.js";
|
|
22
|
+
export const STDOUT_BUFFER_CAP = 1024 * 1024; // 1 MiB ring per stream.
|
|
23
|
+
export function isLocalhost(req) {
|
|
24
|
+
const addr = req.socket.remoteAddress ?? "";
|
|
25
|
+
return addr === "127.0.0.1" || addr === "::1" || addr === "::ffff:127.0.0.1";
|
|
26
|
+
}
|
|
27
|
+
export function trimRing(buf, cap) {
|
|
28
|
+
return buf.length <= cap ? buf : buf.slice(buf.length - cap);
|
|
29
|
+
}
|
|
30
|
+
function emitToJob(job, event, data) {
|
|
31
|
+
job.pastEvents.push({ event, data });
|
|
32
|
+
for (const sub of job.subscribers) {
|
|
33
|
+
try {
|
|
34
|
+
sub(event, data);
|
|
35
|
+
}
|
|
36
|
+
catch { /* subscriber failed — ignore */ }
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Spawn `command` with `args`, wire stdout/stderr to per-line "progress"
|
|
41
|
+
* events, register the job in `jobs`, and emit "done" on exit / error /
|
|
42
|
+
* timeout. Returns the registered job synchronously so the HTTP handler
|
|
43
|
+
* can reply with `{ jobId }` immediately.
|
|
44
|
+
*/
|
|
45
|
+
export function startSpawnJob(opts) {
|
|
46
|
+
const proc = spawn(opts.command, opts.args, {
|
|
47
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
48
|
+
// Scrub env — provider keys / studio overrides are not needed by the
|
|
49
|
+
// installer command and shouldn't leak to subprocess descendants.
|
|
50
|
+
env: buildSpawnEnv(),
|
|
51
|
+
});
|
|
52
|
+
const job = {
|
|
53
|
+
id: randomUUID(),
|
|
54
|
+
meta: opts.meta,
|
|
55
|
+
proc,
|
|
56
|
+
stdoutBuffer: "",
|
|
57
|
+
stderrBuffer: "",
|
|
58
|
+
exitCode: null,
|
|
59
|
+
done: false,
|
|
60
|
+
subscribers: new Set(),
|
|
61
|
+
pastEvents: [],
|
|
62
|
+
};
|
|
63
|
+
proc.stdout?.on("data", (chunk) => {
|
|
64
|
+
const text = chunk.toString();
|
|
65
|
+
job.stdoutBuffer = trimRing(job.stdoutBuffer + text, STDOUT_BUFFER_CAP);
|
|
66
|
+
for (const line of text.split(/\r?\n/)) {
|
|
67
|
+
if (line.length > 0)
|
|
68
|
+
emitToJob(job, "progress", { stream: "stdout", line });
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
proc.stderr?.on("data", (chunk) => {
|
|
72
|
+
const text = chunk.toString();
|
|
73
|
+
job.stderrBuffer = trimRing(job.stderrBuffer + text, STDOUT_BUFFER_CAP);
|
|
74
|
+
for (const line of text.split(/\r?\n/)) {
|
|
75
|
+
if (line.length > 0)
|
|
76
|
+
emitToJob(job, "progress", { stream: "stderr", line });
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
let timedOut = false;
|
|
80
|
+
const timer = setTimeout(() => {
|
|
81
|
+
timedOut = true;
|
|
82
|
+
try {
|
|
83
|
+
proc.kill("SIGTERM");
|
|
84
|
+
}
|
|
85
|
+
catch { /* process already gone */ }
|
|
86
|
+
}, opts.timeoutMs);
|
|
87
|
+
proc.on("exit", (code) => {
|
|
88
|
+
clearTimeout(timer);
|
|
89
|
+
job.exitCode = timedOut ? -1 : code;
|
|
90
|
+
job.done = true;
|
|
91
|
+
const stderr = timedOut ? "timeout" : job.stderrBuffer.trim();
|
|
92
|
+
emitToJob(job, "done", {
|
|
93
|
+
success: !timedOut && code === 0,
|
|
94
|
+
exitCode: timedOut ? -1 : code,
|
|
95
|
+
stderr,
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
proc.on("error", (err) => {
|
|
99
|
+
clearTimeout(timer);
|
|
100
|
+
job.exitCode = -1;
|
|
101
|
+
job.done = true;
|
|
102
|
+
emitToJob(job, "done", {
|
|
103
|
+
success: false,
|
|
104
|
+
exitCode: -1,
|
|
105
|
+
stderr: err.message || "spawn failed",
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
opts.jobs.set(job.id, job);
|
|
109
|
+
return job;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Mount `GET <prefix>/:jobId/stream` on `router`. The handler enforces the
|
|
113
|
+
* localhost gate, replays buffered events, then subscribes the SSE response
|
|
114
|
+
* to live "progress"/"done" events until disconnect.
|
|
115
|
+
*/
|
|
116
|
+
export function mountSpawnStreamRoute(router, prefix, jobs) {
|
|
117
|
+
router.get(`${prefix}/:jobId/stream`, async (req, res, params) => {
|
|
118
|
+
if (!isLocalhost(req)) {
|
|
119
|
+
sendJson(res, { error: "localhost-only endpoint" }, 403, req);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const job = jobs.get(params.jobId);
|
|
123
|
+
if (!job) {
|
|
124
|
+
sendJson(res, { error: "unknown jobId" }, 404, req);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
initSSE(res, req);
|
|
128
|
+
// Replay any events that fired before this stream connected.
|
|
129
|
+
for (const ev of job.pastEvents) {
|
|
130
|
+
try {
|
|
131
|
+
sendSSE(res, ev.event, ev.data);
|
|
132
|
+
}
|
|
133
|
+
catch { /* stream closed */ }
|
|
134
|
+
}
|
|
135
|
+
if (job.done) {
|
|
136
|
+
try {
|
|
137
|
+
res.end();
|
|
138
|
+
}
|
|
139
|
+
catch { /* already closed */ }
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const subscriber = (event, data) => {
|
|
143
|
+
try {
|
|
144
|
+
if (event === "done")
|
|
145
|
+
sendSSEDone(res, data);
|
|
146
|
+
else
|
|
147
|
+
sendSSE(res, event, data);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
// Stream write failed — eagerly drop this subscriber so we don't
|
|
151
|
+
// accumulate dead listeners on half-open sockets.
|
|
152
|
+
job.subscribers.delete(subscriber);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
job.subscribers.add(subscriber);
|
|
156
|
+
const cleanup = () => { job.subscribers.delete(subscriber); };
|
|
157
|
+
req.on("close", cleanup);
|
|
158
|
+
req.on("aborted", cleanup);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=install-jobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-jobs.js","sourceRoot":"","sources":["../../src/eval-server/install-jobs.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,gFAAgF;AAChF,oEAAoE;AACpE,sCAAsC;AACtC,2BAA2B;AAC3B,kEAAkE;AAClE,qDAAqD;AACrD,uDAAuD;AACvD,EAAE;AACF,2EAA2E;AAC3E,gDAAgD;AAChD,yCAAyC;AACzC,4CAA4C;AAC5C,8EAA8E;AAG9E,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,yBAAyB;AAwBvE,MAAM,UAAU,WAAW,CAAC,GAAyB;IACnD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,CAAC;IAC5C,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,kBAAkB,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,GAAW;IAC/C,OAAO,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,SAAS,CAChB,GAAoB,EACpB,KAAe,EACf,IAAa;IAEb,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACrC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC;YAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,gCAAgC,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAiC;IAEjC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;QAC1C,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;QACjC,qEAAqE;QACrE,kEAAkE;QAClE,GAAG,EAAE,aAAa,EAAE;KACrB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAoB;QAC3B,EAAE,EAAE,UAAU,EAAE;QAChB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI;QACJ,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,EAAE;QAChB,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,IAAI,GAAG,EAAE;QACtB,UAAU,EAAE,EAAE;KACf,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC9B,GAAG,CAAC,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACxE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC9B,GAAG,CAAC,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,EAAE,iBAAiB,CAAC,CAAC;QACxE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC;YAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,0BAA0B,CAAC,CAAC;IACpE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;IAEnB,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACvB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC9D,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE;YACrB,OAAO,EAAE,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC;YAChC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;YAC9B,MAAM;SACP,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACvB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAClB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE;YACrB,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,CAAC,CAAC;YACZ,MAAM,EAAG,GAAa,CAAC,OAAO,IAAI,cAAc;SACjD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAc,EACd,MAAc,EACd,IAAkC;IAElC,MAAM,CAAC,GAAG,CACR,GAAG,MAAM,gBAAgB,EACzB,KAAK,EAAE,GAAyB,EAAE,GAAwB,EAAE,MAA8B,EAAE,EAAE;QAC5F,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAC9D,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACpD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAElB,6DAA6D;QAC7D,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC;gBAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,IAAI,CAAC;gBAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;YACjD,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,KAAe,EAAE,IAAa,EAAE,EAAE;YACpD,IAAI,CAAC;gBACH,IAAI,KAAK,KAAK,MAAM;oBAAE,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;oBACxC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,iEAAiE;gBACjE,kDAAkD;gBAClD,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC;QACF,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEhC,MAAM,OAAO,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzB,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7B,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,28 +1,91 @@
|
|
|
1
|
-
import { type ChildProcess } from "node:child_process";
|
|
2
1
|
import type { Router } from "./router.js";
|
|
2
|
+
import { type SpawnJob, type JobEvent } from "./install-jobs.js";
|
|
3
|
+
import { type AgentInstallResult } from "../installer/multi-install.js";
|
|
4
|
+
import type { ParsedSkill } from "../installer/transformers/index.js";
|
|
3
5
|
type InstallScope = "project" | "user" | "global";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
+
type MultiInstallScope = "project" | "user";
|
|
7
|
+
interface SkillJobMeta {
|
|
6
8
|
skill: string;
|
|
7
9
|
scope: InstallScope;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
exitCode: number | null;
|
|
10
|
+
}
|
|
11
|
+
interface MultiInstallJob {
|
|
12
|
+
id: string;
|
|
12
13
|
done: boolean;
|
|
13
|
-
subscribers: Set<(event:
|
|
14
|
+
subscribers: Set<(event: MultiInstallJobEvent, data: unknown) => void>;
|
|
14
15
|
pastEvents: Array<{
|
|
15
|
-
event:
|
|
16
|
+
event: MultiInstallJobEvent;
|
|
16
17
|
data: unknown;
|
|
17
18
|
}>;
|
|
18
19
|
}
|
|
20
|
+
type MultiInstallJobEvent = JobEvent | "result";
|
|
19
21
|
declare function buildArgs(skill: string, scope: InstallScope): string[];
|
|
20
|
-
|
|
22
|
+
declare function normalizeInstallScope(scope: InstallScope): MultiInstallScope;
|
|
23
|
+
declare function isValidParsedSkill(s: unknown): s is ParsedSkill;
|
|
24
|
+
type FetchLike = typeof fetch;
|
|
25
|
+
interface ResolveSkillOptions {
|
|
26
|
+
cwd?: string;
|
|
27
|
+
home?: string;
|
|
28
|
+
fetchImpl?: FetchLike;
|
|
29
|
+
platformBaseUrl?: string;
|
|
30
|
+
githubTokenProvider?: () => string | null;
|
|
31
|
+
}
|
|
32
|
+
declare function fetchSkillMdFromGitHub(opts: {
|
|
33
|
+
repoUrl: string;
|
|
34
|
+
skillPath: string;
|
|
35
|
+
refs: string[];
|
|
36
|
+
fetchImpl: FetchLike;
|
|
37
|
+
token: string | null;
|
|
38
|
+
}): Promise<string | null>;
|
|
39
|
+
declare function resolveParsedSkillFromPlatform(identifier: string, opts?: ResolveSkillOptions): Promise<ParsedSkill | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Server-side fallback: when the frontend posts a multi-agent install
|
|
42
|
+
* without `parsedSkill`, locate the skill on disk (project / personal /
|
|
43
|
+
* plugin cache via {@link locateSkill}), read its SKILL.md, and build a
|
|
44
|
+
* minimal {@link ParsedSkill}. Keeps the POST payload trivial — the
|
|
45
|
+
* frontend doesn't need to fetch, parse, and re-marshal SKILL.md itself.
|
|
46
|
+
*
|
|
47
|
+
* Returns `null` when no on-disk skill matches the identifier (the route
|
|
48
|
+
* surfaces this as a 404 so the caller can retry with an explicit
|
|
49
|
+
* `parsedSkill`).
|
|
50
|
+
*/
|
|
51
|
+
export declare function resolveParsedSkillFromIdentifier(identifier: string, opts?: ResolveSkillOptions): Promise<ParsedSkill | null>;
|
|
52
|
+
declare function validateAgentIds(ids: unknown): {
|
|
53
|
+
ok: true;
|
|
54
|
+
ids: string[];
|
|
55
|
+
} | {
|
|
56
|
+
ok: false;
|
|
57
|
+
error: string;
|
|
58
|
+
};
|
|
59
|
+
declare function writeMultiInstallLockfile(opts: {
|
|
60
|
+
identifier: string;
|
|
61
|
+
skill: ParsedSkill;
|
|
62
|
+
scope: "project" | "user";
|
|
63
|
+
projectRoot: string;
|
|
64
|
+
results: AgentInstallResult[];
|
|
65
|
+
}): void;
|
|
66
|
+
declare function runMultiInstallJob(opts: {
|
|
67
|
+
identifier: string;
|
|
68
|
+
skill: ParsedSkill;
|
|
69
|
+
agentIds: string[];
|
|
70
|
+
scope: "project" | "user";
|
|
71
|
+
projectRoot: string;
|
|
72
|
+
}): Promise<MultiInstallJob>;
|
|
73
|
+
export declare function registerInstallSkillRoutes(router: Router, rootArg?: string | (() => string)): void;
|
|
21
74
|
export declare const __test__: {
|
|
22
|
-
JOBS: Map<string,
|
|
75
|
+
JOBS: Map<string, SpawnJob<SkillJobMeta>>;
|
|
76
|
+
MULTI_JOBS: Map<string, MultiInstallJob>;
|
|
23
77
|
SAFE_NAME: RegExp;
|
|
78
|
+
SAFE_AGENT_ID: RegExp;
|
|
24
79
|
VALID_SCOPES: ReadonlySet<string>;
|
|
25
80
|
INSTALL_TIMEOUT_MS: number;
|
|
26
81
|
buildArgs: typeof buildArgs;
|
|
82
|
+
normalizeInstallScope: typeof normalizeInstallScope;
|
|
83
|
+
validateAgentIds: typeof validateAgentIds;
|
|
84
|
+
isValidParsedSkill: typeof isValidParsedSkill;
|
|
85
|
+
resolveParsedSkillFromIdentifier: typeof resolveParsedSkillFromIdentifier;
|
|
86
|
+
resolveParsedSkillFromPlatform: typeof resolveParsedSkillFromPlatform;
|
|
87
|
+
fetchSkillMdFromGitHub: typeof fetchSkillMdFromGitHub;
|
|
88
|
+
runMultiInstallJob: typeof runMultiInstallJob;
|
|
89
|
+
writeMultiInstallLockfile: typeof writeMultiInstallLockfile;
|
|
27
90
|
};
|
|
28
91
|
export {};
|