frely-cli 0.6.1 → 0.6.6
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 +188 -38
- package/dist/agent-help.d.ts +287 -0
- package/dist/agent-help.js +64 -0
- package/dist/agent-help.js.map +1 -0
- package/dist/auth.d.ts +3 -1
- package/dist/auth.js +3 -2
- package/dist/auth.js.map +1 -1
- package/dist/cloud.d.ts +7 -0
- package/dist/cloud.js +263 -0
- package/dist/cloud.js.map +1 -0
- package/dist/device/connection-status.d.ts +42 -0
- package/dist/device/connection-status.js +112 -0
- package/dist/device/connection-status.js.map +1 -0
- package/dist/device/relay-client.d.ts +7 -0
- package/dist/device/relay-client.js +124 -56
- package/dist/device/relay-client.js.map +1 -1
- package/dist/diagnostics.d.ts +66 -4
- package/dist/diagnostics.js +133 -25
- package/dist/diagnostics.js.map +1 -1
- package/dist/index.js +157 -38
- package/dist/index.js.map +1 -1
- package/dist/key-budget.d.ts +22 -0
- package/dist/key-budget.js +97 -0
- package/dist/key-budget.js.map +1 -0
- package/dist/mcp-authorization.js +3 -3
- package/dist/mcp-authorization.js.map +1 -1
- package/dist/mcp-command.d.ts +9 -0
- package/dist/mcp-command.js +68 -0
- package/dist/mcp-command.js.map +1 -0
- package/dist/runtime/diagnostics.d.ts +17 -0
- package/dist/runtime/diagnostics.js +84 -0
- package/dist/runtime/diagnostics.js.map +1 -0
- package/dist/runtime/mcp.d.ts +3 -0
- package/dist/runtime/mcp.js +40 -23
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/runtime/relay-mcp.d.ts +9 -3
- package/dist/runtime/relay-mcp.js +66 -19
- package/dist/runtime/relay-mcp.js.map +1 -1
- package/dist/service.d.ts +4 -0
- package/dist/service.js +28 -4
- package/dist/service.js.map +1 -1
- package/dist/skill/access.d.ts +70 -0
- package/dist/skill/access.js +292 -0
- package/dist/skill/access.js.map +1 -0
- package/dist/skill/managed.d.ts +32 -0
- package/dist/skill/managed.js +152 -0
- package/dist/skill/managed.js.map +1 -0
- package/dist/upgrade/installation.d.ts +24 -0
- package/dist/upgrade/installation.js +137 -0
- package/dist/upgrade/installation.js.map +1 -0
- package/dist/upgrade/maintenance.d.ts +15 -0
- package/dist/upgrade/maintenance.js +133 -0
- package/dist/upgrade/maintenance.js.map +1 -0
- package/dist/upgrade/release.d.ts +9 -0
- package/dist/upgrade/release.js +45 -0
- package/dist/upgrade/release.js.map +1 -0
- package/dist/upgrade/service-refresh.d.ts +38 -0
- package/dist/upgrade/service-refresh.js +138 -0
- package/dist/upgrade/service-refresh.js.map +1 -0
- package/dist/upgrade/update.d.ts +49 -0
- package/dist/upgrade/update.js +228 -0
- package/dist/upgrade/update.js.map +1 -0
- package/package.json +3 -2
- package/skills/frely-cli/SKILL.md +8 -0
|
@@ -1,49 +1,92 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { diagnostic, mcpDiagnosticContext } from "./diagnostics.js";
|
|
1
3
|
import { createMcpServer } from "./mcp.js";
|
|
2
4
|
export class RelayMcpSession {
|
|
5
|
+
log;
|
|
3
6
|
pending = new Map();
|
|
4
|
-
|
|
7
|
+
relayRequests = new Map();
|
|
8
|
+
transport = new RelayMcpTransport(this.pending, this.relayRequests);
|
|
5
9
|
server;
|
|
6
|
-
constructor() {
|
|
10
|
+
constructor(log) {
|
|
11
|
+
this.log = log;
|
|
12
|
+
}
|
|
7
13
|
static async create(workspace, options = {}) {
|
|
8
|
-
const session = new RelayMcpSession();
|
|
9
|
-
const server = await createMcpServer(workspace,
|
|
14
|
+
const session = new RelayMcpSession(options.log);
|
|
15
|
+
const server = await createMcpServer(workspace, {
|
|
16
|
+
...options,
|
|
17
|
+
onToolError: (requestId, tool, error) => {
|
|
18
|
+
const pending = session.pending.get(requestId);
|
|
19
|
+
if (pending)
|
|
20
|
+
diagnostic(options.log, "mcp.tool_failed", { requestId: pending.relayId, tool }, error);
|
|
21
|
+
options.onToolError?.(requestId, tool, error);
|
|
22
|
+
},
|
|
23
|
+
});
|
|
10
24
|
session.server = server;
|
|
11
25
|
await server.connect(session.transport);
|
|
12
26
|
return session;
|
|
13
27
|
}
|
|
14
|
-
async execute(payload) {
|
|
28
|
+
async execute(payload, relayId = randomUUID()) {
|
|
29
|
+
const context = { requestId: relayId, ...mcpDiagnosticContext(payload) };
|
|
30
|
+
const started = performance.now();
|
|
31
|
+
diagnostic(this.log, "mcp.request_started", context);
|
|
32
|
+
try {
|
|
33
|
+
const response = await this.dispatch(payload, relayId);
|
|
34
|
+
const result = response;
|
|
35
|
+
diagnostic(this.log, "mcp.request_completed", {
|
|
36
|
+
...context, durationMs: performance.now() - started,
|
|
37
|
+
...(typeof result?.error?.code === "number" ? { rpcErrorCode: result.error.code } : {}),
|
|
38
|
+
outcome: result?.error ? "protocol_error" : result?.result?.isError ? "tool_error" : "ok",
|
|
39
|
+
});
|
|
40
|
+
return response;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
diagnostic(this.log, "mcp.request_failed", { ...context, durationMs: performance.now() - started }, error);
|
|
44
|
+
throw error;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async dispatch(payload, relayId) {
|
|
15
48
|
const message = parseJsonRpcMessage(payload);
|
|
16
49
|
const id = requestId(message);
|
|
17
50
|
if (id === undefined) {
|
|
18
|
-
|
|
51
|
+
// HTTP requests have no shared client namespace. Relay cancel envelopes
|
|
52
|
+
// identify the exact HTTP request; raw client IDs cannot safely do so.
|
|
53
|
+
if (message.method !== "notifications/cancelled")
|
|
54
|
+
this.transport.deliver(message);
|
|
19
55
|
return null;
|
|
20
56
|
}
|
|
21
57
|
if (isInvalidInitializeRequest(message)) {
|
|
22
58
|
return { jsonrpc: "2.0", id, error: { code: -32600, message: "Invalid Request" } };
|
|
23
59
|
}
|
|
24
|
-
if (this.
|
|
25
|
-
throw new Error("Duplicate
|
|
60
|
+
if (this.relayRequests.has(relayId))
|
|
61
|
+
throw new Error("Duplicate Device Relay request id.");
|
|
62
|
+
// A fresh internal ID also prevents a late cancelled response from settling
|
|
63
|
+
// a later request, even if the outer Relay ID were ever reused.
|
|
64
|
+
const internalId = randomUUID();
|
|
26
65
|
return new Promise((resolve, reject) => {
|
|
27
|
-
this.pending.set(
|
|
66
|
+
this.pending.set(internalId, { originalId: id, relayId, resolve, reject });
|
|
67
|
+
this.relayRequests.set(relayId, internalId);
|
|
28
68
|
try {
|
|
29
|
-
this.transport.deliver(message);
|
|
69
|
+
this.transport.deliver({ ...message, id: internalId });
|
|
30
70
|
}
|
|
31
71
|
catch (error) {
|
|
32
|
-
this.pending.delete(
|
|
72
|
+
this.pending.delete(internalId);
|
|
73
|
+
this.relayRequests.delete(relayId);
|
|
33
74
|
reject(error);
|
|
34
75
|
}
|
|
35
76
|
});
|
|
36
77
|
}
|
|
37
|
-
cancel(
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
if (id === undefined)
|
|
78
|
+
cancel(relayId) {
|
|
79
|
+
const internalId = this.relayRequests.get(relayId);
|
|
80
|
+
if (internalId === undefined)
|
|
41
81
|
return;
|
|
42
|
-
const pending = this.pending.get(
|
|
82
|
+
const pending = this.pending.get(internalId);
|
|
43
83
|
if (!pending)
|
|
44
84
|
return;
|
|
45
|
-
this.
|
|
85
|
+
diagnostic(this.log, "mcp.request_cancelled", { requestId: relayId });
|
|
86
|
+
this.pending.delete(internalId);
|
|
87
|
+
this.relayRequests.delete(relayId);
|
|
46
88
|
pending.reject(new Error("MCP request cancelled by Relay."));
|
|
89
|
+
this.transport.deliver({ jsonrpc: "2.0", method: "notifications/cancelled", params: { requestId: internalId } });
|
|
47
90
|
}
|
|
48
91
|
async close() {
|
|
49
92
|
await this.server?.close();
|
|
@@ -52,12 +95,14 @@ export class RelayMcpSession {
|
|
|
52
95
|
}
|
|
53
96
|
class RelayMcpTransport {
|
|
54
97
|
pending;
|
|
98
|
+
relayRequests;
|
|
55
99
|
onclose;
|
|
56
100
|
onerror;
|
|
57
101
|
onmessage;
|
|
58
102
|
started = false;
|
|
59
|
-
constructor(pending) {
|
|
103
|
+
constructor(pending, relayRequests) {
|
|
60
104
|
this.pending = pending;
|
|
105
|
+
this.relayRequests = relayRequests;
|
|
61
106
|
}
|
|
62
107
|
async start() {
|
|
63
108
|
if (this.started)
|
|
@@ -72,7 +117,8 @@ class RelayMcpTransport {
|
|
|
72
117
|
if (!pending)
|
|
73
118
|
return;
|
|
74
119
|
this.pending.delete(id);
|
|
75
|
-
pending.
|
|
120
|
+
this.relayRequests.delete(pending.relayId);
|
|
121
|
+
pending.resolve({ ...message, id: pending.originalId });
|
|
76
122
|
}
|
|
77
123
|
deliver(message) {
|
|
78
124
|
if (!this.started)
|
|
@@ -86,6 +132,7 @@ class RelayMcpTransport {
|
|
|
86
132
|
for (const pending of this.pending.values())
|
|
87
133
|
pending.reject(new Error("Relay MCP transport closed."));
|
|
88
134
|
this.pending.clear();
|
|
135
|
+
this.relayRequests.clear();
|
|
89
136
|
this.onclose?.();
|
|
90
137
|
}
|
|
91
138
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-mcp.js","sourceRoot":"","sources":["../../src/runtime/relay-mcp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"relay-mcp.js","sourceRoot":"","sources":["../../src/runtime/relay-mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/service.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export interface McpServiceInfo {
|
|
|
4
4
|
platform: string;
|
|
5
5
|
workspace?: string;
|
|
6
6
|
definitionPath?: string;
|
|
7
|
+
pid?: number;
|
|
7
8
|
}
|
|
8
9
|
export declare function installMcpService(workspaceInput: string): Promise<McpServiceInfo>;
|
|
9
10
|
export declare function installDeviceRelayService(workspaceInput?: string): Promise<McpServiceInfo>;
|
|
@@ -16,3 +17,6 @@ export declare function serviceLaunchArguments(entry: string, workspace?: string
|
|
|
16
17
|
export declare function systemdUnitPath(): string;
|
|
17
18
|
export declare function launchAgentPlist(command: string[], stateDir: string): string;
|
|
18
19
|
export declare function systemdUnit(command: string[]): string;
|
|
20
|
+
/** Read our existing launch definition without rewriting environment, workspace or credentials. */
|
|
21
|
+
export declare function serviceCommand(): Promise<string[] | null>;
|
|
22
|
+
export declare function parseServiceCommand(platform: string, text: string): string[] | null;
|
package/dist/service.js
CHANGED
|
@@ -89,14 +89,16 @@ export async function serviceStatus() {
|
|
|
89
89
|
return { ...common, ...await windowsService("status") };
|
|
90
90
|
if (process.platform === "darwin") {
|
|
91
91
|
const path = launchAgentPath(), installed = await fileExists(path);
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
const output = installed ? await execFile("launchctl", ["print", `gui/${process.getuid?.() ?? 0}/${LABEL}`]).then(({ stdout }) => stdout, () => "") : "";
|
|
93
|
+
const pid = Number(/\bpid = (\d+)/u.exec(output)?.[1]) || undefined;
|
|
94
|
+
const active = Boolean(pid || /\bstate = running/u.test(output));
|
|
95
|
+
return { ...common, installed, active, ...(pid ? { pid } : {}), ...(installed ? { definitionPath: path } : {}) };
|
|
95
96
|
}
|
|
96
97
|
if (process.platform === "linux") {
|
|
97
98
|
const path = systemdUnitPath(), installed = await fileExists(path);
|
|
98
99
|
const active = installed && await execFile("systemctl", ["--user", "is-active", "--quiet", "frely-mcp.service"]).then(() => true, () => false);
|
|
99
|
-
|
|
100
|
+
const pid = active ? await execFile("systemctl", ["--user", "show", "--property=MainPID", "--value", "frely-mcp.service"]).then(({ stdout }) => Number(stdout.trim()) || undefined, () => undefined) : undefined;
|
|
101
|
+
return { ...common, installed, active, ...(pid ? { pid } : {}), ...(installed ? { definitionPath: path } : {}) };
|
|
100
102
|
}
|
|
101
103
|
return { ...common, installed: false, active: false };
|
|
102
104
|
}
|
|
@@ -151,4 +153,26 @@ function systemdQuote(value) {
|
|
|
151
153
|
throw new Error("Service arguments contain control characters.");
|
|
152
154
|
return '"' + value.replace(/%/gu, "%%").replace(/\$/gu, () => "$$").replace(/\\/gu, "\\\\").replace(/"/gu, '\\"') + '"';
|
|
153
155
|
}
|
|
156
|
+
/** Read our existing launch definition without rewriting environment, workspace or credentials. */
|
|
157
|
+
export async function serviceCommand() {
|
|
158
|
+
const path = process.platform === "darwin" ? launchAgentPath() : process.platform === "linux" ? systemdUnitPath() : null;
|
|
159
|
+
return path ? parseServiceCommand(process.platform, await readFile(path, "utf8")) : null;
|
|
160
|
+
}
|
|
161
|
+
export function parseServiceCommand(platform, text) {
|
|
162
|
+
if (platform === "darwin") {
|
|
163
|
+
const array = /<key>ProgramArguments<\/key>\s*<array>([\s\S]*?)<\/array>/u.exec(text)?.[1];
|
|
164
|
+
if (!array)
|
|
165
|
+
return null;
|
|
166
|
+
return [...array.matchAll(/<string>([\s\S]*?)<\/string>/gu)].map((m) => m[1]
|
|
167
|
+
.replace(/'/gu, "'").replace(/"/gu, '\"').replace(/</gu, "<").replace(/>/gu, ">").replace(/&/gu, "&"));
|
|
168
|
+
}
|
|
169
|
+
if (platform === "linux") {
|
|
170
|
+
const line = /^ExecStart=(.*)$/mu.exec(text)?.[1];
|
|
171
|
+
if (!line || !/^(?:"(?:\\.|[^"\\])*"\s*)+$/u.test(line))
|
|
172
|
+
return null;
|
|
173
|
+
return [...line.matchAll(/"((?:\\.|[^"\\])*)"/gu)].map((m) => m[1]
|
|
174
|
+
.replace(/\\(["\\])/gu, "$1").replace(/%%/gu, "%").replace(/\$\$/gu, "$"));
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
154
178
|
//# sourceMappingURL=service.js.map
|
package/dist/service.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,QAAQ,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAC7C,MAAM,KAAK,GAAG,qBAAqB,CAAC;AAGpC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,cAAsB;IAC5D,OAAO,yBAAyB,CAAC,cAAc,CAAC,CAAC;AACnD,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,cAAuB;IACrE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC;IACjG,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACvF,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACzD,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;QAC/B,MAAM,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9E,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,MAAM,eAAe,CAAC,eAAe,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/D,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;QACzD,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;QAChF,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC1E,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,MAAM,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;;QAAM,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IAC7F,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YACrF,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;SAC1G,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;;QAChE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC5E,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;SACnJ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;SACvG,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,cAAc,CAAC,MAAM,CAAC,CAAC;;QAC/D,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC5E,OAAO,aAAa,EAAE,CAAC;AACzB,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,cAAc,CAAC,WAAW,CAAC,CAAC;SAC/D,CAAC;QACJ,MAAM,cAAc,EAAE,CAAC;QACvB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAAE,MAAM,EAAE,CAAC,eAAe,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;aAC3E,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACtC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC;YACxE,MAAM,EAAE,CAAC,eAAe,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,MAAM,EAAE,CAAC,iBAAiB,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC7G,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1F,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,eAAe,EAAE,EAAE,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,OAAO,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzJ,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACnH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,eAAe,EAAE,EAAE,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,SAAS,IAAI,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC/I,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjN,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACnH,CAAC;IACD,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACxD,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,SAAkB;IACtE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,MAAM,CAAC;IAC9H,OAAO,kBAAkB,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QAC3I,4BAA4B,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5G,CAAC;AACD,SAAS,cAAc,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AACtH,SAAS,aAAa,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;AAC5H,SAAS,iBAAiB,KAAa,OAAO,IAAI,CAAC,cAAc,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAC3F,SAAS,eAAe,KAAa,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC3G,MAAM,UAAU,eAAe,KAAa,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAC7J,KAAK,UAAU,kBAAkB,CAAC,SAAkB;IAClD,MAAM,IAAI,GAAG,iBAAiB,EAAE,CAAC;IACjC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9H,CAAC;AACD,KAAK,UAAU,iBAAiB;IAC9B,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,iBAAiB,EAAE,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAC1E,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;QAAC,OAAO,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAAC,CAAC;IACvM,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AACxB,CAAC;AACD,KAAK,UAAU,UAAU,CAAC,IAAY,IAAsB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClH,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,KAAa;IACxD,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAChD,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,OAAiB,EAAE,QAAgB;IAClE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvF,OAAO,wMAAwM,KAAK,gDAAgD,YAAY,yEAAyE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,8BAA8B,CAAC,+GAA+G,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,kDAAkD,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,8BAA8B,CAAC;AAC9oB,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,OAAiB;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjD,OAAO,4GAA4G,IAAI,+CAA+C,YAAY,CAAC,QAAQ,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,8BAA8B,EAAE,CAAC,0CAA0C,CAAC;AAC7R,CAAC;AACD,SAAS,GAAG,CAAC,KAAa;IACxB,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACrG,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACvI,CAAC;AACD,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACrG,OAAO,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC;AAC1H,CAAC;AAED,mGAAmG;AACnG,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACzH,OAAO,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,IAAY;IAChE,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,4DAA4D,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3F,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACxB,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,gCAAgC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE;aAC1E,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/H,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACrE,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE;aAChE,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type CredentialStore } from "../credential-store.js";
|
|
2
|
+
import { type RemoteAgentMcpInvoker } from "./router.js";
|
|
3
|
+
import { type SkillHost, type SkillScope } from "./managed.js";
|
|
4
|
+
export declare const SKILL_API_KEY_SERVICE = "frely-cli-skill-api-key-v1";
|
|
5
|
+
export declare class SkillAccessError extends Error {
|
|
6
|
+
readonly code: "invalid_manifest_url" | "manifest_fetch_failed" | "manifest_invalid" | "target_not_installed" | "auth_required" | "remote_authorization_failed" | "entitlement_required" | "remote_call_failed" | "input_invalid" | "host_unsupported" | "credential_store_failed";
|
|
7
|
+
constructor(code: "invalid_manifest_url" | "manifest_fetch_failed" | "manifest_invalid" | "target_not_installed" | "auth_required" | "remote_authorization_failed" | "entitlement_required" | "remote_call_failed" | "input_invalid" | "host_unsupported" | "credential_store_failed", message: string);
|
|
8
|
+
}
|
|
9
|
+
export declare function installSkillAdapter(input: {
|
|
10
|
+
readonly manifestUrl: string;
|
|
11
|
+
readonly host: SkillHost;
|
|
12
|
+
readonly scope: SkillScope;
|
|
13
|
+
readonly apiKey?: string;
|
|
14
|
+
readonly cwd?: string;
|
|
15
|
+
readonly home?: string;
|
|
16
|
+
readonly fetchFn?: typeof fetch;
|
|
17
|
+
readonly credentialStore?: CredentialStore;
|
|
18
|
+
}): Promise<Readonly<{
|
|
19
|
+
ok: true;
|
|
20
|
+
distributionId: string;
|
|
21
|
+
modelId: string;
|
|
22
|
+
name: string;
|
|
23
|
+
host: SkillHost;
|
|
24
|
+
scope: SkillScope;
|
|
25
|
+
authMode: "api-key" | "account";
|
|
26
|
+
skillPath: string;
|
|
27
|
+
state: "host_reload_needed";
|
|
28
|
+
hostAction: string;
|
|
29
|
+
}>>;
|
|
30
|
+
export declare function skillAdapterStatus(distributionId: string, home?: string): Promise<Readonly<{
|
|
31
|
+
ok: true;
|
|
32
|
+
installed: false;
|
|
33
|
+
distributionId: string;
|
|
34
|
+
state: "not_installed";
|
|
35
|
+
}> | Readonly<{
|
|
36
|
+
ok: true;
|
|
37
|
+
installed: boolean;
|
|
38
|
+
distributionId: string;
|
|
39
|
+
modelId: string;
|
|
40
|
+
name: string;
|
|
41
|
+
host: SkillHost;
|
|
42
|
+
scope: SkillScope;
|
|
43
|
+
authMode: "api-key" | "account";
|
|
44
|
+
skillPath: string;
|
|
45
|
+
state: "managed" | "modified" | "missing";
|
|
46
|
+
}>>;
|
|
47
|
+
export declare function removeSkillAdapter(distributionId: string, home?: string, store?: CredentialStore): Promise<Readonly<{
|
|
48
|
+
ok: true;
|
|
49
|
+
removed: false;
|
|
50
|
+
distributionId: string;
|
|
51
|
+
}> | Readonly<{
|
|
52
|
+
ok: true;
|
|
53
|
+
removed: true;
|
|
54
|
+
distributionId: string;
|
|
55
|
+
}>>;
|
|
56
|
+
export declare function invokeInstalledAgent(input: {
|
|
57
|
+
readonly distributionId: string;
|
|
58
|
+
readonly task: string;
|
|
59
|
+
readonly home?: string;
|
|
60
|
+
readonly signal?: AbortSignal;
|
|
61
|
+
readonly credentialStore?: CredentialStore;
|
|
62
|
+
readonly remoteInvoker?: RemoteAgentMcpInvoker;
|
|
63
|
+
}): Promise<Readonly<{
|
|
64
|
+
usage?: Readonly<Record<string, unknown>>;
|
|
65
|
+
ok: true;
|
|
66
|
+
distributionId: string;
|
|
67
|
+
modelId: string;
|
|
68
|
+
text: string;
|
|
69
|
+
}>>;
|
|
70
|
+
export declare function publicSkillAccessError(error: unknown): Readonly<Record<string, unknown>>;
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { requireLogin } from "../auth.js";
|
|
4
|
+
import { credentialStore as secureCredentialStore } from "../credential-store.js";
|
|
5
|
+
import { remoteAgentMcpInvoker, SkillInvocationError } from "./router.js";
|
|
6
|
+
import { ManagedSkillError, managedSkillRoot, managedSkillState, readManagedSkill, removeManagedSkill, skillSlug, writeManagedSkill, } from "./managed.js";
|
|
7
|
+
const MANIFEST_SCHEMA = "frely.virtual-model.public.v1";
|
|
8
|
+
const DISTRIBUTION_ID = /^creator_distribution_[a-f0-9]{24}$/u;
|
|
9
|
+
const MAX_MANIFEST_BYTES = 256 * 1024;
|
|
10
|
+
const MAX_TASK_BYTES = 128 * 1024;
|
|
11
|
+
export const SKILL_API_KEY_SERVICE = "frely-cli-skill-api-key-v1";
|
|
12
|
+
export class SkillAccessError extends Error {
|
|
13
|
+
code;
|
|
14
|
+
constructor(code, message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.name = "SkillAccessError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export async function installSkillAdapter(input) {
|
|
21
|
+
const fetchFn = input.fetchFn ?? fetch;
|
|
22
|
+
const manifest = await fetchManifest(input.manifestUrl, fetchFn);
|
|
23
|
+
const home = input.home ?? homedir();
|
|
24
|
+
const existing = await readManagedSkill(manifest.id, home);
|
|
25
|
+
const slug = existing?.slug ?? skillSlug(manifest.name, manifest.id);
|
|
26
|
+
const root = managedSkillRoot(input.host, input.scope, input.cwd, home);
|
|
27
|
+
const skillPath = existing?.skillPath ?? join(root, slug, "SKILL.md");
|
|
28
|
+
const content = renderSkill(manifest, slug);
|
|
29
|
+
const authMode = input.apiKey !== undefined ? "api-key" : existing?.authMode ?? "account";
|
|
30
|
+
const recordInput = {
|
|
31
|
+
version: 1,
|
|
32
|
+
distributionId: manifest.id,
|
|
33
|
+
manifestUrl: manifest.urls.manifest,
|
|
34
|
+
modelId: manifest.modelId,
|
|
35
|
+
mcpUrl: manifest.urls.mcp,
|
|
36
|
+
name: manifest.name,
|
|
37
|
+
slug,
|
|
38
|
+
host: input.host,
|
|
39
|
+
scope: input.scope,
|
|
40
|
+
authMode,
|
|
41
|
+
skillPath,
|
|
42
|
+
};
|
|
43
|
+
let store;
|
|
44
|
+
let previousApiKey = null;
|
|
45
|
+
if (input.apiKey !== undefined) {
|
|
46
|
+
assertApiKey(input.apiKey);
|
|
47
|
+
await verifyApiKey(manifest, input.apiKey, fetchFn);
|
|
48
|
+
store = input.credentialStore ?? secureCredentialStore;
|
|
49
|
+
try {
|
|
50
|
+
previousApiKey = await store.getPassword(SKILL_API_KEY_SERVICE, manifest.id);
|
|
51
|
+
await store.setPassword(SKILL_API_KEY_SERVICE, manifest.id, input.apiKey);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
throw new SkillAccessError("credential_store_failed", error instanceof Error ? error.message : "Could not store the model-scoped API key securely.");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
let record;
|
|
58
|
+
try {
|
|
59
|
+
record = await writeManagedSkill({ home, content, record: recordInput });
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
if (store) {
|
|
63
|
+
if (previousApiKey === null)
|
|
64
|
+
await store.deletePassword(SKILL_API_KEY_SERVICE, manifest.id).catch(() => false);
|
|
65
|
+
else
|
|
66
|
+
await store.setPassword(SKILL_API_KEY_SERVICE, manifest.id, previousApiKey).catch(() => undefined);
|
|
67
|
+
}
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
return Object.freeze({
|
|
71
|
+
ok: true,
|
|
72
|
+
distributionId: record.distributionId,
|
|
73
|
+
modelId: record.modelId,
|
|
74
|
+
name: record.name,
|
|
75
|
+
host: record.host,
|
|
76
|
+
scope: record.scope,
|
|
77
|
+
authMode: record.authMode,
|
|
78
|
+
skillPath: record.skillPath,
|
|
79
|
+
state: "host_reload_needed",
|
|
80
|
+
hostAction: hostAction(record.host),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
export async function skillAdapterStatus(distributionId, home = homedir()) {
|
|
84
|
+
assertDistributionId(distributionId);
|
|
85
|
+
const record = await readManagedSkill(distributionId, home);
|
|
86
|
+
if (!record)
|
|
87
|
+
return Object.freeze({ ok: true, installed: false, distributionId, state: "not_installed" });
|
|
88
|
+
const state = await managedSkillState(record);
|
|
89
|
+
return Object.freeze({
|
|
90
|
+
ok: true,
|
|
91
|
+
installed: state !== "missing",
|
|
92
|
+
distributionId,
|
|
93
|
+
modelId: record.modelId,
|
|
94
|
+
name: record.name,
|
|
95
|
+
host: record.host,
|
|
96
|
+
scope: record.scope,
|
|
97
|
+
authMode: record.authMode,
|
|
98
|
+
skillPath: record.skillPath,
|
|
99
|
+
state,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
export async function removeSkillAdapter(distributionId, home = homedir(), store = secureCredentialStore) {
|
|
103
|
+
assertDistributionId(distributionId);
|
|
104
|
+
const record = await readManagedSkill(distributionId, home);
|
|
105
|
+
if (!record)
|
|
106
|
+
return Object.freeze({ ok: true, removed: false, distributionId });
|
|
107
|
+
const state = await managedSkillState(record);
|
|
108
|
+
if (state === "modified")
|
|
109
|
+
await removeManagedSkill(record, home);
|
|
110
|
+
if (record.authMode === "api-key")
|
|
111
|
+
await store.deletePassword(SKILL_API_KEY_SERVICE, distributionId);
|
|
112
|
+
await removeManagedSkill(record, home);
|
|
113
|
+
return Object.freeze({ ok: true, removed: true, distributionId });
|
|
114
|
+
}
|
|
115
|
+
export async function invokeInstalledAgent(input) {
|
|
116
|
+
assertDistributionId(input.distributionId);
|
|
117
|
+
if (!input.task.trim() || Buffer.byteLength(input.task, "utf8") > MAX_TASK_BYTES)
|
|
118
|
+
throw new SkillAccessError("input_invalid", "Agent input must be non-empty and at most 128 KiB.");
|
|
119
|
+
const record = await readManagedSkill(input.distributionId, input.home ?? homedir());
|
|
120
|
+
if (!record)
|
|
121
|
+
throw new SkillAccessError("target_not_installed", "The Frely Skill target is not installed.");
|
|
122
|
+
let token;
|
|
123
|
+
let credential;
|
|
124
|
+
if (record.authMode === "api-key") {
|
|
125
|
+
const store = input.credentialStore ?? secureCredentialStore;
|
|
126
|
+
token = await store.getPassword(SKILL_API_KEY_SERVICE, record.distributionId).catch(() => null) ?? "";
|
|
127
|
+
if (!token)
|
|
128
|
+
throw new SkillAccessError("auth_required", "The model-scoped API key is unavailable. Reinstall this Skill with --api-key-stdin.");
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
const login = await requireLogin().catch(() => { throw new SkillAccessError("auth_required", "Frely login is required. Run `frely login`."); });
|
|
132
|
+
token = login.credential.value;
|
|
133
|
+
credential = login.credential;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
const result = await (input.remoteInvoker ?? remoteAgentMcpInvoker).invoke({
|
|
137
|
+
relayUrl: new URL(record.mcpUrl).origin,
|
|
138
|
+
modelId: record.modelId,
|
|
139
|
+
token,
|
|
140
|
+
...(credential ? { credential } : {}),
|
|
141
|
+
task: input.task,
|
|
142
|
+
...(input.signal ? { signal: input.signal } : {}),
|
|
143
|
+
});
|
|
144
|
+
return Object.freeze({ ok: true, distributionId: record.distributionId, modelId: record.modelId, text: result.text, ...(result.usage ? { usage: result.usage } : {}) });
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (error instanceof SkillInvocationError && error.code === "entitlement_required")
|
|
148
|
+
throw new SkillAccessError("entitlement_required", "This Frely Agent is not available to the configured credential.");
|
|
149
|
+
if (error instanceof SkillInvocationError && error.code === "remote_authorization_failed")
|
|
150
|
+
throw new SkillAccessError("remote_authorization_failed", record.authMode === "api-key" ? "The model-scoped API key was rejected. Reinstall this Skill with a valid key." : "Frely authorization failed. Run `frely login` again.");
|
|
151
|
+
throw new SkillAccessError("remote_call_failed", "The remote Frely Agent call failed.");
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function assertApiKey(value) {
|
|
155
|
+
const bytes = Buffer.byteLength(value, "utf8");
|
|
156
|
+
if (bytes < 8 || bytes > 8192 || /[\x00-\x20\x7f]/u.test(value)) {
|
|
157
|
+
throw new SkillAccessError("input_invalid", "The model-scoped API key is invalid.");
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function verifyApiKey(manifest, apiKey, fetchFn) {
|
|
161
|
+
let response;
|
|
162
|
+
try {
|
|
163
|
+
response = await fetchFn(manifest.urls.mcp, {
|
|
164
|
+
method: "POST",
|
|
165
|
+
headers: {
|
|
166
|
+
accept: "application/json",
|
|
167
|
+
"content-type": "application/json",
|
|
168
|
+
authorization: `Bearer ${apiKey}`,
|
|
169
|
+
},
|
|
170
|
+
body: JSON.stringify({ jsonrpc: "2.0", id: "frely-skill-auth-check", method: "tools/list" }),
|
|
171
|
+
redirect: "error",
|
|
172
|
+
signal: AbortSignal.timeout(15_000),
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
throw new SkillAccessError("remote_authorization_failed", "Could not verify the model-scoped API key.");
|
|
177
|
+
}
|
|
178
|
+
const payload = await response.json().catch(() => null);
|
|
179
|
+
const root = record(payload);
|
|
180
|
+
const result = record(root?.result);
|
|
181
|
+
const tools = Array.isArray(result?.tools) ? result.tools : [];
|
|
182
|
+
const hasInvoke = tools.some((tool) => record(tool)?.name === "invoke");
|
|
183
|
+
if (!response.ok || !root || root.error !== undefined || !hasInvoke) {
|
|
184
|
+
throw new SkillAccessError("remote_authorization_failed", "The model-scoped API key cannot access this Frely Agent.");
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
export function publicSkillAccessError(error) {
|
|
188
|
+
if (error instanceof SkillAccessError || error instanceof ManagedSkillError)
|
|
189
|
+
return Object.freeze({ ok: false, error: Object.freeze({ code: error.code, message: error.message }) });
|
|
190
|
+
return Object.freeze({ ok: false, error: Object.freeze({ code: "unexpected_error", message: error instanceof Error ? error.message : "Unexpected error" }) });
|
|
191
|
+
}
|
|
192
|
+
async function fetchManifest(value, fetchFn) {
|
|
193
|
+
const url = normalizedFrelyUrl(value, "invalid_manifest_url");
|
|
194
|
+
let response;
|
|
195
|
+
try {
|
|
196
|
+
response = await fetchFn(url, {
|
|
197
|
+
method: "GET",
|
|
198
|
+
headers: { accept: "application/json" },
|
|
199
|
+
redirect: "error",
|
|
200
|
+
signal: AbortSignal.timeout(15_000),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
throw new SkillAccessError("manifest_fetch_failed", "Unable to fetch the Frely manifest.");
|
|
205
|
+
}
|
|
206
|
+
if (!response.ok)
|
|
207
|
+
throw new SkillAccessError("manifest_fetch_failed", `Frely manifest request failed with HTTP ${response.status}.`);
|
|
208
|
+
const text = await response.text();
|
|
209
|
+
if (Buffer.byteLength(text, "utf8") > MAX_MANIFEST_BYTES)
|
|
210
|
+
throw new SkillAccessError("manifest_invalid", "Frely manifest is too large.");
|
|
211
|
+
let payload;
|
|
212
|
+
try {
|
|
213
|
+
payload = JSON.parse(text);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
throw new SkillAccessError("manifest_invalid", "Frely manifest is not valid JSON.");
|
|
217
|
+
}
|
|
218
|
+
return parseManifest(payload, url);
|
|
219
|
+
}
|
|
220
|
+
function parseManifest(value, sourceUrl) {
|
|
221
|
+
const root = record(value);
|
|
222
|
+
const urls = record(root?.urls);
|
|
223
|
+
if (!root || root.schemaVersion !== MANIFEST_SCHEMA || typeof root.id !== "string" || !DISTRIBUTION_ID.test(root.id) || typeof root.modelId !== "string" || root.modelId.length < 1 || root.modelId.length > 256 || typeof root.version !== "string" || typeof root.name !== "string" || root.name.length < 1 || root.name.length > 120 || !(root.description === null || typeof root.description === "string") || !Array.isArray(root.capabilities) || !urls || typeof urls.manifest !== "string" || typeof urls.mcp !== "string") {
|
|
224
|
+
throw new SkillAccessError("manifest_invalid", "Frely manifest shape is invalid.");
|
|
225
|
+
}
|
|
226
|
+
const canonical = normalizedFrelyUrl(urls.manifest, "manifest_invalid");
|
|
227
|
+
if (canonical.toString() !== sourceUrl.toString())
|
|
228
|
+
throw new SkillAccessError("manifest_invalid", "Frely manifest canonical URL does not match the requested URL.");
|
|
229
|
+
const mcp = normalizedFrelyUrl(urls.mcp, "manifest_invalid");
|
|
230
|
+
const expectedMcpPath = `/mcp/${encodeURIComponent(root.modelId)}`;
|
|
231
|
+
if (mcp.pathname !== expectedMcpPath || mcp.search)
|
|
232
|
+
throw new SkillAccessError("manifest_invalid", "Frely MCP URL does not match the published model identity.");
|
|
233
|
+
const capabilities = root.capabilities.map(parseCapability);
|
|
234
|
+
return Object.freeze({
|
|
235
|
+
schemaVersion: MANIFEST_SCHEMA,
|
|
236
|
+
id: root.id,
|
|
237
|
+
modelId: root.modelId,
|
|
238
|
+
version: root.version,
|
|
239
|
+
name: root.name,
|
|
240
|
+
description: root.description,
|
|
241
|
+
capabilities,
|
|
242
|
+
...(root.clientTrigger === undefined ? {} : { clientTrigger: parseClientTrigger(root.clientTrigger) }),
|
|
243
|
+
urls: Object.freeze({ manifest: canonical.toString(), mcp: mcp.toString() }),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
function parseCapability(value) {
|
|
247
|
+
const item = record(value);
|
|
248
|
+
if (!item || typeof item.id !== "string" || !/^[a-z][a-z0-9-]{2,62}$/u.test(item.id) || (item.level !== "base" && item.level !== "advanced") || !Array.isArray(item.entrypoints) || item.entrypoints.some((entry) => !["model", "mcp", "a2a"].includes(String(entry))) || (item.description !== undefined && typeof item.description !== "string")) {
|
|
249
|
+
throw new SkillAccessError("manifest_invalid", "Frely capability metadata is invalid.");
|
|
250
|
+
}
|
|
251
|
+
return Object.freeze({ id: item.id, level: item.level, entrypoints: Object.freeze(item.entrypoints), ...(typeof item.description === "string" ? { description: item.description } : {}) });
|
|
252
|
+
}
|
|
253
|
+
function parseClientTrigger(value) {
|
|
254
|
+
const item = record(value);
|
|
255
|
+
const validText = (text, max) => typeof text === "string" && text.trim().length > 0 && text.length <= max && !/[\x00-\x1f\x7f]/u.test(text);
|
|
256
|
+
if (!item || !validText(item.description, 900) || !Array.isArray(item.when) || item.when.length < 1 || item.when.length > 12 || !item.when.every((text) => validText(text, 300))) {
|
|
257
|
+
throw new SkillAccessError("manifest_invalid", "Frely client trigger metadata is invalid.");
|
|
258
|
+
}
|
|
259
|
+
return Object.freeze({ description: item.description, when: Object.freeze(item.when) });
|
|
260
|
+
}
|
|
261
|
+
function renderSkill(manifest, slug) {
|
|
262
|
+
const description = oneLine(manifest.clientTrigger?.description ?? manifest.description ?? `Use ${manifest.name} through Frely when the user's task matches this Agent.`).slice(0, 900);
|
|
263
|
+
const capabilities = manifest.capabilities.length === 0 ? "- Use the published Agent for tasks described by this Skill." : manifest.capabilities.map((capability) => `- ${capability.id}${capability.description ? `: ${oneLine(capability.description)}` : ""}`).join("\n");
|
|
264
|
+
const triggers = manifest.clientTrigger?.when.map((condition) => `- ${oneLine(condition)}`).join("\n") ?? `- The user explicitly asks for ${oneLine(manifest.name)} or their task matches its published capabilities.`;
|
|
265
|
+
return `---\nname: ${slug}\ndescription: ${JSON.stringify(description)}\ncompatibility: ${JSON.stringify("Requires frely-cli and network access to Frely.")}\nmetadata:\n frely-distribution-id: ${JSON.stringify(manifest.id)}\n frely-model-id: ${JSON.stringify(manifest.modelId)}\n---\n\n# ${oneLine(manifest.name)}\n\nThe Agent runs remotely on Frely; this Skill contains only trigger and invocation instructions.\n\n## When to use\n\n${triggers}\n\n## Public capabilities\n\n${capabilities}\n\n## Execute\n\nPass the user's complete relevant request to stdin of:\n\n\`frely agent invoke ${manifest.id} --input-stdin --json\`\n\nDo not put credentials in the command and do not replace the user's current model provider. Return the remote Agent's result to the user. If the remote call fails, surface the returned state instead of inventing current external facts.\n`;
|
|
266
|
+
}
|
|
267
|
+
function hostAction(host) {
|
|
268
|
+
if (host === "chatgpt")
|
|
269
|
+
return "Reload or import the installed Agent Skill in the ChatGPT surface you are using, then verify that it appears in the available Skills list.";
|
|
270
|
+
return "Restart or reload the Agent session if it was already running so it rescans Skills.";
|
|
271
|
+
}
|
|
272
|
+
function normalizedFrelyUrl(value, code) {
|
|
273
|
+
let url;
|
|
274
|
+
try {
|
|
275
|
+
url = new URL(value);
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
throw new SkillAccessError(code, "Frely URL is invalid.");
|
|
279
|
+
}
|
|
280
|
+
if (url.username || url.password || url.hash)
|
|
281
|
+
throw new SkillAccessError(code, "Frely URL is invalid.");
|
|
282
|
+
const loopback = ["localhost", "127.0.0.1", "::1"].includes(url.hostname);
|
|
283
|
+
const frely = url.hostname === "frely.cloud" || url.hostname.endsWith(".frely.cloud");
|
|
284
|
+
if (!(url.protocol === "https:" && frely) && !(url.protocol === "http:" && loopback))
|
|
285
|
+
throw new SkillAccessError(code, "Frely URL must use a Frely HTTPS host or loopback development host.");
|
|
286
|
+
return url;
|
|
287
|
+
}
|
|
288
|
+
function assertDistributionId(value) { if (!DISTRIBUTION_ID.test(value))
|
|
289
|
+
throw new SkillAccessError("target_not_installed", "Frely distribution id is invalid."); }
|
|
290
|
+
function record(value) { return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null; }
|
|
291
|
+
function oneLine(value) { return value.replace(/\s+/gu, " ").trim(); }
|
|
292
|
+
//# sourceMappingURL=access.js.map
|