frely-cli 0.6.0 → 0.6.2
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 +88 -5
- package/dist/agent-help.d.ts +298 -0
- package/dist/agent-help.js +50 -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/device/relay-client.d.ts +3 -0
- package/dist/device/relay-client.js +31 -21
- package/dist/device/relay-client.js.map +1 -1
- package/dist/index.js +123 -23
- 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/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 +2 -0
- package/dist/runtime/mcp.js +51 -24
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/runtime/process-manager.d.ts +3 -1
- package/dist/runtime/process-manager.js +34 -11
- package/dist/runtime/process-manager.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/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/package.json +3 -2
- package/skills/frely-cli/SKILL.md +8 -0
|
@@ -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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"}
|
|
@@ -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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access.js","sourceRoot":"","sources":["../../src/skill/access.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type SkillHost = "chatgpt" | "codex" | "claude-code" | "pi" | "generic";
|
|
2
|
+
export type SkillScope = "global" | "project";
|
|
3
|
+
export interface ManagedSkillRecord {
|
|
4
|
+
readonly version: 1;
|
|
5
|
+
readonly distributionId: string;
|
|
6
|
+
readonly manifestUrl: string;
|
|
7
|
+
readonly modelId: string;
|
|
8
|
+
readonly mcpUrl: string;
|
|
9
|
+
readonly name: string;
|
|
10
|
+
readonly slug: string;
|
|
11
|
+
readonly host: SkillHost;
|
|
12
|
+
readonly scope: SkillScope;
|
|
13
|
+
readonly authMode: "account" | "api-key";
|
|
14
|
+
readonly skillPath: string;
|
|
15
|
+
readonly sha256: string;
|
|
16
|
+
readonly installedAt: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class ManagedSkillError extends Error {
|
|
19
|
+
readonly code: "unmanaged_skill_exists" | "managed_skill_modified" | "local_state_invalid";
|
|
20
|
+
constructor(code: "unmanaged_skill_exists" | "managed_skill_modified" | "local_state_invalid", message: string);
|
|
21
|
+
}
|
|
22
|
+
export declare function managedSkillRoot(host: SkillHost, scope: SkillScope, cwd?: string, home?: string): string;
|
|
23
|
+
export declare function skillSlug(name: string, distributionId: string): string;
|
|
24
|
+
export declare function writeManagedSkill(input: {
|
|
25
|
+
readonly record: Omit<ManagedSkillRecord, "sha256" | "installedAt">;
|
|
26
|
+
readonly content: string;
|
|
27
|
+
readonly home?: string;
|
|
28
|
+
}): Promise<ManagedSkillRecord>;
|
|
29
|
+
export declare function readManagedSkill(distributionId: string, home?: string): Promise<ManagedSkillRecord | null>;
|
|
30
|
+
export declare function managedSkillState(record: ManagedSkillRecord): Promise<"managed" | "modified" | "missing">;
|
|
31
|
+
export declare function removeManagedSkill(record: ManagedSkillRecord, home?: string): Promise<void>;
|
|
32
|
+
export declare function assertManagedSkillPath(path: string): Promise<void>;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { lstat, mkdir, open, rename, unlink } from "node:fs/promises";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
import { dirname, join, resolve } from "node:path";
|
|
6
|
+
export class ManagedSkillError extends Error {
|
|
7
|
+
code;
|
|
8
|
+
constructor(code, message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.name = "ManagedSkillError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function managedSkillRoot(host, scope, cwd = process.cwd(), home = homedir()) {
|
|
15
|
+
if (scope === "project") {
|
|
16
|
+
if (host === "claude-code")
|
|
17
|
+
return join(resolve(cwd), ".claude", "skills");
|
|
18
|
+
if (host === "pi")
|
|
19
|
+
return join(resolve(cwd), ".pi", "skills");
|
|
20
|
+
return join(resolve(cwd), ".agents", "skills");
|
|
21
|
+
}
|
|
22
|
+
if (host === "claude-code")
|
|
23
|
+
return join(home, ".claude", "skills");
|
|
24
|
+
if (host === "pi")
|
|
25
|
+
return join(home, ".pi", "agent", "skills");
|
|
26
|
+
return join(home, ".agents", "skills");
|
|
27
|
+
}
|
|
28
|
+
export function skillSlug(name, distributionId) {
|
|
29
|
+
const base = name.toLowerCase().replace(/[^a-z0-9]+/gu, "-").replace(/^-+|-+$/gu, "").replace(/-+/gu, "-").slice(0, 44) || "agent";
|
|
30
|
+
return `frely-${base}-${distributionId.slice(-8)}`.slice(0, 64).replace(/-+$/u, "");
|
|
31
|
+
}
|
|
32
|
+
export async function writeManagedSkill(input) {
|
|
33
|
+
const metadataPath = join(dirname(input.record.skillPath), ".frely-managed.json");
|
|
34
|
+
const current = await readOwnedFile(input.record.skillPath);
|
|
35
|
+
const metadata = await readOwnedFile(metadataPath, 4096);
|
|
36
|
+
let marker = null;
|
|
37
|
+
if (metadata !== null) {
|
|
38
|
+
try {
|
|
39
|
+
marker = recordValue(JSON.parse(metadata));
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
marker = null;
|
|
43
|
+
}
|
|
44
|
+
if (!marker || marker.version !== 1 || marker.owner !== "frely-cli-skill" || marker.distributionId !== input.record.distributionId) {
|
|
45
|
+
throw new ManagedSkillError("unmanaged_skill_exists", "An unmanaged Skill already exists at the target path.");
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (current !== null && (!marker || (hashText(current) !== marker.sha256 && hashText(current) !== marker.pendingSha256))) {
|
|
49
|
+
throw new ManagedSkillError("managed_skill_modified", "The managed Skill was modified; refusing to overwrite it.");
|
|
50
|
+
}
|
|
51
|
+
const sha256 = hashText(input.content);
|
|
52
|
+
await atomicWrite(metadataPath, JSON.stringify({ version: 1, owner: "frely-cli-skill", distributionId: input.record.distributionId, sha256: current === null ? null : hashText(current), pendingSha256: sha256 }));
|
|
53
|
+
await atomicWrite(input.record.skillPath, input.content);
|
|
54
|
+
await atomicWrite(metadataPath, JSON.stringify({ version: 1, owner: "frely-cli-skill", distributionId: input.record.distributionId, sha256 }));
|
|
55
|
+
const record = Object.freeze({ ...input.record, sha256, installedAt: new Date().toISOString() });
|
|
56
|
+
await atomicWrite(recordPath(input.home ?? homedir(), record.distributionId), `${JSON.stringify(record, null, 2)}\n`);
|
|
57
|
+
return record;
|
|
58
|
+
}
|
|
59
|
+
export async function readManagedSkill(distributionId, home = homedir()) {
|
|
60
|
+
const text = await readOwnedFile(recordPath(home, distributionId), 64 * 1024);
|
|
61
|
+
if (text === null)
|
|
62
|
+
return null;
|
|
63
|
+
let value;
|
|
64
|
+
try {
|
|
65
|
+
value = JSON.parse(text);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new ManagedSkillError("local_state_invalid", "Installed Frely Skill metadata is invalid.");
|
|
69
|
+
}
|
|
70
|
+
const item = recordValue(value);
|
|
71
|
+
const authMode = item?.authMode === undefined ? "account" : item.authMode;
|
|
72
|
+
if (!item || item.version !== 1 || item.distributionId !== distributionId || typeof item.manifestUrl !== "string" || typeof item.modelId !== "string" || typeof item.mcpUrl !== "string" || typeof item.name !== "string" || typeof item.slug !== "string" || typeof item.skillPath !== "string" || typeof item.sha256 !== "string" || typeof item.installedAt !== "string" || !["chatgpt", "codex", "claude-code", "pi", "generic"].includes(String(item.host)) || !["global", "project"].includes(String(item.scope)) || !["account", "api-key"].includes(String(authMode))) {
|
|
73
|
+
throw new ManagedSkillError("local_state_invalid", "Installed Frely Skill metadata is invalid.");
|
|
74
|
+
}
|
|
75
|
+
return Object.freeze({ ...item, authMode });
|
|
76
|
+
}
|
|
77
|
+
export async function managedSkillState(record) {
|
|
78
|
+
const text = await readOwnedFile(record.skillPath);
|
|
79
|
+
if (text === null)
|
|
80
|
+
return "missing";
|
|
81
|
+
return hashText(text) === record.sha256 ? "managed" : "modified";
|
|
82
|
+
}
|
|
83
|
+
export async function removeManagedSkill(record, home = homedir()) {
|
|
84
|
+
const state = await managedSkillState(record);
|
|
85
|
+
if (state === "modified")
|
|
86
|
+
throw new ManagedSkillError("managed_skill_modified", "Managed Skill was modified; refusing to remove it.");
|
|
87
|
+
await unlink(record.skillPath).catch(ignoreAbsent);
|
|
88
|
+
await unlink(join(dirname(record.skillPath), ".frely-managed.json")).catch(ignoreAbsent);
|
|
89
|
+
await unlink(recordPath(home, record.distributionId)).catch(ignoreAbsent);
|
|
90
|
+
}
|
|
91
|
+
export async function assertManagedSkillPath(path) {
|
|
92
|
+
let current = resolve(path);
|
|
93
|
+
while (true) {
|
|
94
|
+
const stat = await lstat(current).catch((error) => { if (isAbsent(error))
|
|
95
|
+
return null; throw error; });
|
|
96
|
+
if (stat?.isSymbolicLink())
|
|
97
|
+
throw new ManagedSkillError("unmanaged_skill_exists", "Refusing to traverse a symbolic link while managing a Skill.");
|
|
98
|
+
const parent = dirname(current);
|
|
99
|
+
if (parent === current)
|
|
100
|
+
break;
|
|
101
|
+
current = parent;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function readOwnedFile(path, maxBytes = 512 * 1024) {
|
|
105
|
+
await assertManagedSkillPath(path);
|
|
106
|
+
let file;
|
|
107
|
+
try {
|
|
108
|
+
file = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (isAbsent(error))
|
|
112
|
+
return null;
|
|
113
|
+
throw error;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const stat = await file.stat();
|
|
117
|
+
if (!stat.isFile() || stat.size > maxBytes)
|
|
118
|
+
throw new ManagedSkillError("local_state_invalid", "Managed Skill file is invalid.");
|
|
119
|
+
return await file.readFile("utf8");
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
await file.close();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function atomicWrite(path, value) {
|
|
126
|
+
await assertManagedSkillPath(path);
|
|
127
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
128
|
+
await assertManagedSkillPath(path);
|
|
129
|
+
const temporary = `${path}.${randomUUID()}.tmp`;
|
|
130
|
+
const file = await open(temporary, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL | constants.O_NOFOLLOW, 0o600);
|
|
131
|
+
try {
|
|
132
|
+
await file.writeFile(value, "utf8");
|
|
133
|
+
await file.sync();
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
await file.close();
|
|
137
|
+
}
|
|
138
|
+
try {
|
|
139
|
+
await assertManagedSkillPath(path);
|
|
140
|
+
await rename(temporary, path);
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
await unlink(temporary).catch(() => undefined);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function recordPath(home, distributionId) { return join(home, ".config", "frely", "skills", `${distributionId}.json`); }
|
|
147
|
+
function hashText(value) { return createHash("sha256").update(value).digest("hex"); }
|
|
148
|
+
function recordValue(value) { return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null; }
|
|
149
|
+
function isAbsent(error) { return error.code === "ENOENT"; }
|
|
150
|
+
function ignoreAbsent(error) { if (!isAbsent(error))
|
|
151
|
+
throw error; }
|
|
152
|
+
//# sourceMappingURL=managed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed.js","sourceRoot":"","sources":["../../src/skill/managed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBnD,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACrB;IAArB,YAAqB,IAAiF,EAAE,OAAe;QACrH,KAAK,CAAC,OAAO,CAAC,CAAC;QADI,SAAI,GAAJ,IAAI,CAA6E;QAEpG,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAe,EAAE,KAAiB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,OAAO,EAAE;IACxG,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,IAAI,IAAI,KAAK,aAAa;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC3E,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,IAAI,KAAK,aAAa;QAAE,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnE,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,cAAsB;IAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC;IACnI,OAAO,SAAS,IAAI,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAIvC;IACC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACzD,IAAI,MAAM,GAAmC,IAAI,CAAC;IAClD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC;YAAC,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,MAAM,GAAG,IAAI,CAAC;QAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,iBAAiB,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;YACnI,MAAM,IAAI,iBAAiB,CAAC,wBAAwB,EAAE,uDAAuD,CAAC,CAAC;QACjH,CAAC;IACH,CAAC;IACD,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACzH,MAAM,IAAI,iBAAiB,CAAC,wBAAwB,EAAE,2DAA2D,CAAC,CAAC;IACrH,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACnN,MAAM,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,WAAW,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/I,MAAM,MAAM,GAAuB,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACrH,MAAM,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,MAAM,CAAC,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACtH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,cAAsB,EAAE,IAAI,GAAG,OAAO,EAAE;IAC7E,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9E,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,IAAI,iBAAiB,CAAC,qBAAqB,EAAE,4CAA4C,CAAC,CAAC;IAAC,CAAC;IAC7I,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC1E,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,cAAc,KAAK,cAAc,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9iB,MAAM,IAAI,iBAAiB,CAAC,qBAAqB,EAAE,4CAA4C,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAkC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAA0B;IAChE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAA0B,EAAE,IAAI,GAAG,OAAO,EAAE;IACnF,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,KAAK,KAAK,UAAU;QAAE,MAAM,IAAI,iBAAiB,CAAC,wBAAwB,EAAE,oDAAoD,CAAC,CAAC;IACtI,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACzF,MAAM,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAY;IACvD,IAAI,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAChH,IAAI,IAAI,EAAE,cAAc,EAAE;YAAE,MAAM,IAAI,iBAAiB,CAAC,wBAAwB,EAAE,8DAA8D,CAAC,CAAC;QAClJ,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,MAAM,KAAK,OAAO;YAAE,MAAM;QAC9B,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,QAAQ,GAAG,GAAG,GAAG,IAAI;IAC9D,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QAAC,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAAC,CAAC;IAC3E,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ;YAAE,MAAM,IAAI,iBAAiB,CAAC,qBAAqB,EAAE,gCAAgC,CAAC,CAAC;QACjI,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;YAAS,CAAC;QAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACnC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,KAAa;IACpD,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,UAAU,EAAE,MAAM,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC5H,IAAI,CAAC;QAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAAC,CAAC;YACvD,CAAC;QAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;IAC/B,IAAI,CAAC;QAAC,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;QAAC,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAAC,CAAC;YAClE,CAAC;QAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAAC,CAAC;AAC7D,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,cAAsB,IAAY,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,cAAc,OAAO,CAAC,CAAC,CAAC,CAAC;AAChJ,SAAS,QAAQ,CAAC,KAAa,IAAY,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACrG,SAAS,WAAW,CAAC,KAAc,IAAoC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/L,SAAS,QAAQ,CAAC,KAAc,IAAa,OAAQ,KAA+B,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;AACzG,SAAS,YAAY,CAAC,KAAc,IAAU,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IAAE,MAAM,KAAK,CAAC,CAAC,CAAC"}
|