@plurnk/plurnk-service 1.24.0 → 1.26.0
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/.env.defaults +17 -15
- package/INSTALL.md +96 -20
- package/README.md +2 -2
- package/SPEC.md +517 -193
- package/dist/Paths.d.ts +1 -0
- package/dist/Paths.d.ts.map +1 -1
- package/dist/Paths.js +1 -0
- package/dist/Paths.js.map +1 -1
- package/dist/build-info.json +1 -1
- package/dist/content/read-projector.d.ts.map +1 -1
- package/dist/content/read-projector.js +19 -0
- package/dist/content/read-projector.js.map +1 -1
- package/dist/core/AdministrativeLoop.d.ts +1 -1
- package/dist/core/AdministrativeLoop.d.ts.map +1 -1
- package/dist/core/AdministrativeLoop.js +5 -5
- package/dist/core/AdministrativeLoop.js.map +1 -1
- package/dist/core/AdmittedTurnExecutor.d.ts.map +1 -1
- package/dist/core/AdmittedTurnExecutor.js +1 -0
- package/dist/core/AdmittedTurnExecutor.js.map +1 -1
- package/dist/core/CapabilityResolver.js +1 -1
- package/dist/core/CapabilityResolver.js.map +1 -1
- package/dist/core/DataStatementRunner.d.ts.map +1 -1
- package/dist/core/DataStatementRunner.js +1 -3
- package/dist/core/DataStatementRunner.js.map +1 -1
- package/dist/core/Dispatcher.d.ts +1 -1
- package/dist/core/Dispatcher.d.ts.map +1 -1
- package/dist/core/Dispatcher.js +76 -21
- package/dist/core/Dispatcher.js.map +1 -1
- package/dist/core/Dispatcher.sql +0 -7
- package/dist/core/Engine.d.ts +2 -2
- package/dist/core/Engine.d.ts.map +1 -1
- package/dist/core/ExecutorRegistry.d.ts +16 -4
- package/dist/core/ExecutorRegistry.d.ts.map +1 -1
- package/dist/core/ExecutorRegistry.js +31 -31
- package/dist/core/ExecutorRegistry.js.map +1 -1
- package/dist/core/HostPaths.d.ts +7 -1
- package/dist/core/HostPaths.d.ts.map +1 -1
- package/dist/core/HostPaths.js +25 -12
- package/dist/core/HostPaths.js.map +1 -1
- package/dist/core/LoopDriver.d.ts.map +1 -1
- package/dist/core/LoopDriver.js +11 -2
- package/dist/core/LoopDriver.js.map +1 -1
- package/dist/core/LoopLifecycle.d.ts +1 -1
- package/dist/core/LoopLifecycle.js +1 -1
- package/dist/core/LoopLifecycle.sql +2 -2
- package/dist/core/LoopPolicies.d.ts.map +1 -1
- package/dist/core/LoopPolicies.js +12 -7
- package/dist/core/LoopPolicies.js.map +1 -1
- package/dist/core/MembershipMaterialization.js +1 -1
- package/dist/core/MembershipMaterialization.js.map +1 -1
- package/dist/core/OperatorConfig.d.ts.map +1 -1
- package/dist/core/OperatorConfig.js +97 -51
- package/dist/core/OperatorConfig.js.map +1 -1
- package/dist/core/PacketBuilder.d.ts +1 -0
- package/dist/core/PacketBuilder.d.ts.map +1 -1
- package/dist/core/PacketBuilder.js +27 -25
- package/dist/core/PacketBuilder.js.map +1 -1
- package/dist/core/ReasoningView.d.ts +1 -1
- package/dist/core/ReasoningView.d.ts.map +1 -1
- package/dist/core/ReasoningView.js +4 -5
- package/dist/core/ReasoningView.js.map +1 -1
- package/dist/core/SchemeRegistry.d.ts.map +1 -1
- package/dist/core/SchemeRegistry.js +3 -2
- package/dist/core/SchemeRegistry.js.map +1 -1
- package/dist/core/Turn.d.ts +1 -1
- package/dist/core/Turn.d.ts.map +1 -1
- package/dist/core/Turn.js +2 -2
- package/dist/core/Turn.js.map +1 -1
- package/dist/core/Turn.sql +1 -1
- package/dist/core/TurnDispositionHandler.d.ts +1 -1
- package/dist/core/TurnDispositionHandler.d.ts.map +1 -1
- package/dist/core/TurnDispositionHandler.js +6 -15
- package/dist/core/TurnDispositionHandler.js.map +1 -1
- package/dist/core/TurnMaterialization.js +1 -1
- package/dist/core/TurnMaterialization.js.map +1 -1
- package/dist/core/TurnOps.d.ts +1 -0
- package/dist/core/TurnOps.d.ts.map +1 -1
- package/dist/core/TurnOps.js +18 -0
- package/dist/core/TurnOps.js.map +1 -1
- package/dist/core/TurnRunner.d.ts.map +1 -1
- package/dist/core/TurnRunner.js +53 -32
- package/dist/core/TurnRunner.js.map +1 -1
- package/dist/core/env-defaults.d.ts +12 -1
- package/dist/core/env-defaults.d.ts.map +1 -1
- package/dist/core/env-defaults.js +50 -7
- package/dist/core/env-defaults.js.map +1 -1
- package/dist/core/file-creation-policy.d.ts.map +1 -1
- package/dist/core/file-creation-policy.js +2 -1
- package/dist/core/file-creation-policy.js.map +1 -1
- package/dist/core/git-membership.d.ts.map +1 -1
- package/dist/core/git-membership.js +0 -3
- package/dist/core/git-membership.js.map +1 -1
- package/dist/core/namespace.d.ts +1 -0
- package/dist/core/namespace.d.ts.map +1 -1
- package/dist/core/namespace.js +21 -75
- package/dist/core/namespace.js.map +1 -1
- package/dist/core/notifications.d.ts +2 -0
- package/dist/core/notifications.d.ts.map +1 -1
- package/dist/core/packet-wire.d.ts +1 -0
- package/dist/core/packet-wire.d.ts.map +1 -1
- package/dist/core/packet-wire.js +28 -7
- package/dist/core/packet-wire.js.map +1 -1
- package/dist/core/results.d.ts +2 -0
- package/dist/core/results.d.ts.map +1 -1
- package/dist/core/results.js +7 -0
- package/dist/core/results.js.map +1 -1
- package/dist/digest/Digest.d.ts.map +1 -1
- package/dist/digest/Digest.js +1 -2
- package/dist/digest/Digest.js.map +1 -1
- package/dist/digest/DigestEvidence.d.ts +1 -0
- package/dist/digest/DigestEvidence.d.ts.map +1 -1
- package/dist/digest/DigestEvidence.js +8 -0
- package/dist/digest/DigestEvidence.js.map +1 -1
- package/dist/digest/DigestRender.d.ts.map +1 -1
- package/dist/digest/DigestRender.js +23 -21
- package/dist/digest/DigestRender.js.map +1 -1
- package/dist/digest/digest-rows.d.ts +2 -1
- package/dist/digest/digest-rows.d.ts.map +1 -1
- package/dist/digest/digest.sql +4 -0
- package/dist/observe/init.d.ts +1 -0
- package/dist/observe/init.d.ts.map +1 -1
- package/dist/observe/init.js +5 -1
- package/dist/observe/init.js.map +1 -1
- package/dist/schemes/EffectPolicy.d.ts.map +1 -1
- package/dist/schemes/EffectPolicy.js +4 -4
- package/dist/schemes/EffectPolicy.js.map +1 -1
- package/dist/schemes/Exec.d.ts +1 -0
- package/dist/schemes/Exec.d.ts.map +1 -1
- package/dist/schemes/Exec.js +30 -14
- package/dist/schemes/Exec.js.map +1 -1
- package/dist/schemes/ExecScheduler.d.ts.map +1 -1
- package/dist/schemes/ExecScheduler.js +4 -3
- package/dist/schemes/ExecScheduler.js.map +1 -1
- package/dist/schemes/ExecScratch.d.ts.map +1 -1
- package/dist/schemes/ExecScratch.js +2 -1
- package/dist/schemes/ExecScratch.js.map +1 -1
- package/dist/schemes/File.d.ts.map +1 -1
- package/dist/schemes/File.js +21 -22
- package/dist/schemes/File.js.map +1 -1
- package/dist/schemes/_entry-find.d.ts +1 -0
- package/dist/schemes/_entry-find.d.ts.map +1 -1
- package/dist/schemes/_entry-find.js +4 -3
- package/dist/schemes/_entry-find.js.map +1 -1
- package/dist/schemes/_path-scope.d.ts +2 -2
- package/dist/schemes/_path-scope.d.ts.map +1 -1
- package/dist/schemes/_path-scope.js +23 -2
- package/dist/schemes/_path-scope.js.map +1 -1
- package/dist/server/AgentRoots.d.ts +6 -0
- package/dist/server/AgentRoots.d.ts.map +1 -0
- package/dist/server/AgentRoots.js +25 -0
- package/dist/server/AgentRoots.js.map +1 -0
- package/dist/server/ConfigurationDiagnostics.d.ts +12 -0
- package/dist/server/ConfigurationDiagnostics.d.ts.map +1 -0
- package/dist/server/ConfigurationDiagnostics.js +40 -0
- package/dist/server/ConfigurationDiagnostics.js.map +1 -0
- package/dist/server/Daemon.d.ts +11 -5
- package/dist/server/Daemon.d.ts.map +1 -1
- package/dist/server/Daemon.js +125 -48
- package/dist/server/Daemon.js.map +1 -1
- package/dist/server/DaemonModule.d.ts +11 -4
- package/dist/server/DaemonModule.d.ts.map +1 -1
- package/dist/server/EnvFunctionality.d.ts.map +1 -1
- package/dist/server/EnvFunctionality.js +5 -2
- package/dist/server/EnvFunctionality.js.map +1 -1
- package/dist/server/Functionality.d.ts +6 -0
- package/dist/server/Functionality.d.ts.map +1 -1
- package/dist/server/Functionality.js +173 -37
- package/dist/server/Functionality.js.map +1 -1
- package/dist/server/FunctionalityManager.js +6 -6
- package/dist/server/FunctionalityManager.js.map +1 -1
- package/dist/server/MembersFunctionality.d.ts.map +1 -1
- package/dist/server/MembersFunctionality.js +13 -41
- package/dist/server/MembersFunctionality.js.map +1 -1
- package/dist/server/PluginSources.d.ts +20 -0
- package/dist/server/PluginSources.d.ts.map +1 -0
- package/dist/server/PluginSources.js +52 -0
- package/dist/server/PluginSources.js.map +1 -0
- package/dist/server/PlurnkSkill.js +1 -1
- package/dist/server/PlurnkSkill.js.map +1 -1
- package/dist/server/Retention.d.ts.map +1 -1
- package/dist/server/Retention.js +11 -30
- package/dist/server/Retention.js.map +1 -1
- package/dist/server/ServiceModules.d.ts +1 -0
- package/dist/server/ServiceModules.d.ts.map +1 -1
- package/dist/server/ServiceModules.js +9 -3
- package/dist/server/ServiceModules.js.map +1 -1
- package/dist/server/SkillSource.d.ts +37 -0
- package/dist/server/SkillSource.d.ts.map +1 -0
- package/dist/server/SkillSource.js +267 -0
- package/dist/server/SkillSource.js.map +1 -0
- package/dist/server/SkillsFunctionality.d.ts +8 -27
- package/dist/server/SkillsFunctionality.d.ts.map +1 -1
- package/dist/server/SkillsFunctionality.js +218 -270
- package/dist/server/SkillsFunctionality.js.map +1 -1
- package/dist/server/WorkerModelResolver.d.ts +1 -2
- package/dist/server/WorkerModelResolver.d.ts.map +1 -1
- package/dist/server/WorkerModelResolver.js +18 -19
- package/dist/server/WorkerModelResolver.js.map +1 -1
- package/dist/server/WorkspacePlugins.d.ts +25 -0
- package/dist/server/WorkspacePlugins.d.ts.map +1 -0
- package/dist/server/WorkspacePlugins.js +43 -0
- package/dist/server/WorkspacePlugins.js.map +1 -0
- package/dist/server/dispatch-as-plurnk.d.ts.map +1 -1
- package/dist/server/dispatch-as-plurnk.js +2 -1
- package/dist/server/dispatch-as-plurnk.js.map +1 -1
- package/dist/server/envelope.js +1 -1
- package/dist/server/envelope.js.map +1 -1
- package/dist/server/loop-model.d.ts.map +1 -1
- package/dist/server/loop-model.js +1 -2
- package/dist/server/loop-model.js.map +1 -1
- package/dist/server/module-discovery.d.ts +6 -0
- package/dist/server/module-discovery.d.ts.map +1 -1
- package/dist/server/module-discovery.js +46 -24
- package/dist/server/module-discovery.js.map +1 -1
- package/dist/server/skills-problems.d.ts +8 -0
- package/dist/server/skills-problems.d.ts.map +1 -0
- package/dist/server/skills-problems.js +18 -0
- package/dist/server/skills-problems.js.map +1 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +55 -45
- package/dist/service.js.map +1 -1
- package/docs/env.md +7 -8
- package/docs/members.md +4 -3
- package/docs/skills.md +45 -22
- package/package.json +37 -35
- package/plurnk.service +29 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
// {§skills-sources} — where an added Agent Skill comes from: a git remote on any forge, a folder, a
|
|
2
|
+
// lone SKILL.md, or a zip or tar archive, read with git, tar and unzip. Fetching runs nothing it
|
|
3
|
+
// fetched, and an installed skill holds nothing that points out of it.
|
|
4
|
+
import { execFile } from "node:child_process";
|
|
5
|
+
import { cp, mkdir, mkdtemp, readdir, readFile, readlink, realpath, rename, rm, stat } from "node:fs/promises";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
8
|
+
import { promisify } from "node:util";
|
|
9
|
+
import { parseSkill, skillName } from "@plurnk/plurnk-agent-skills";
|
|
10
|
+
import { Knob } from "@plurnk/plurnk-meta";
|
|
11
|
+
import ExecEnv from "../schemes/exec-env.js";
|
|
12
|
+
import { actionError, messageOf } from "./skills-problems.js";
|
|
13
|
+
const execFileP = promisify(execFile);
|
|
14
|
+
// The ceiling of one tool run's captured output: a bound on a child process, not a choice.
|
|
15
|
+
const TOOL_OUTPUT_BYTES = 8 * 1024 * 1024;
|
|
16
|
+
const ARCHIVE = /\.(?:zip|tar|tgz|tbz2|txz|tar\.(?:gz|bz2|xz|zst))$/iu;
|
|
17
|
+
const SCP_REMOTE = /^[\w.~-]+@[\w.-]+:(?!\/\/)\S/u;
|
|
18
|
+
const URL_SCHEME = /^[a-z][a-z0-9+.-]*:\/\//iu;
|
|
19
|
+
const SHORTHAND = /^[\w.-]+\/[\w.-]+$/u;
|
|
20
|
+
const inside = (root, candidate) => {
|
|
21
|
+
const path = relative(root, candidate);
|
|
22
|
+
return path !== ".." && !path.startsWith(`..${sep}`) && !isAbsolute(path);
|
|
23
|
+
};
|
|
24
|
+
const isFile = (path) => stat(path).then((info) => info.isFile(), (cause) => {
|
|
25
|
+
if (cause.code === "ENOENT" || cause.code === "ENOTDIR")
|
|
26
|
+
return false;
|
|
27
|
+
throw cause;
|
|
28
|
+
});
|
|
29
|
+
// The reason a tool gave: its last stderr line, or that it outran its deadline.
|
|
30
|
+
const reason = (cause) => {
|
|
31
|
+
const failure = cause;
|
|
32
|
+
if (failure.killed === true)
|
|
33
|
+
return "it outran PLURNK_SERVICE_SKILLS_FETCH_TIMEOUT_MS";
|
|
34
|
+
const text = typeof failure.stderr === "string" && failure.stderr.trim().length > 0 ? failure.stderr : messageOf(cause);
|
|
35
|
+
return text.split(/\r?\n/u).map((line) => line.trim()).filter((line) => line.length > 0).at(-1) ?? messageOf(cause);
|
|
36
|
+
};
|
|
37
|
+
const tool = async (command, args) => {
|
|
38
|
+
const env = ExecEnv.withoutOwnSecrets();
|
|
39
|
+
const { stdout } = await execFileP(command, [...args], {
|
|
40
|
+
// {§exec-env-scoped} — the operator's git configuration, credentials and SSH agent reach the
|
|
41
|
+
// fetch; plurnk's own secrets never do, and neither git nor ssh ever prompts.
|
|
42
|
+
env: {
|
|
43
|
+
...env,
|
|
44
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
45
|
+
...(env.GIT_SSH_COMMAND === undefined && env.GIT_SSH === undefined ? { GIT_SSH_COMMAND: "ssh -o BatchMode=yes" } : {}),
|
|
46
|
+
},
|
|
47
|
+
timeout: Knob.integer("PLURNK_SERVICE_SKILLS_FETCH_TIMEOUT_MS", 1),
|
|
48
|
+
maxBuffer: TOOL_OUTPUT_BYTES,
|
|
49
|
+
});
|
|
50
|
+
return stdout;
|
|
51
|
+
};
|
|
52
|
+
export default class SkillSource {
|
|
53
|
+
// URL admission is independent of filesystem and network availability.
|
|
54
|
+
static remote(source) {
|
|
55
|
+
if (/^(?:https|ssh):\/\//iu.test(source)) {
|
|
56
|
+
let url = null;
|
|
57
|
+
try {
|
|
58
|
+
url = new URL(source);
|
|
59
|
+
}
|
|
60
|
+
catch { /* reported below */ }
|
|
61
|
+
if (url === null || url.hostname.length === 0) {
|
|
62
|
+
throw actionError("source-invalid", 400, `'${source}' is not a valid git remote URL.`, { source, retryable: false });
|
|
63
|
+
}
|
|
64
|
+
// A recorded source is listed to every client: credentials belong to git's credential helper.
|
|
65
|
+
if (url.protocol === "https:" && (url.username.length > 0 || url.password.length > 0)) {
|
|
66
|
+
throw actionError("source-invalid", 400, "An https source carries no credentials; git's credential helper supplies them.", { retryable: false });
|
|
67
|
+
}
|
|
68
|
+
return { kind: "git", location: source };
|
|
69
|
+
}
|
|
70
|
+
if (SCP_REMOTE.test(source))
|
|
71
|
+
return { kind: "git", location: source };
|
|
72
|
+
if (URL_SCHEME.test(source)) {
|
|
73
|
+
throw actionError("source-invalid", 400, `'${source}' is not a source: a git remote is a full https or ssh URL.`, { source, retryable: false });
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
// Reads a source's form without fetching it. A relative path is the project's.
|
|
78
|
+
static async locate(source, context) {
|
|
79
|
+
const remote = SkillSource.remote(source);
|
|
80
|
+
if (remote !== null)
|
|
81
|
+
return remote;
|
|
82
|
+
const expanded = source === "~" || source.startsWith("~/") ? join(context.home, source.slice(1)) : source;
|
|
83
|
+
if (!isAbsolute(expanded) && context.projectRoot === null) {
|
|
84
|
+
throw actionError("source-invalid", 400, `'${source}' is relative, and this workspace has no project root to resolve it against.`, { source, retryable: false });
|
|
85
|
+
}
|
|
86
|
+
const location = resolve(context.projectRoot ?? "/", expanded);
|
|
87
|
+
let info;
|
|
88
|
+
try {
|
|
89
|
+
info = await stat(location);
|
|
90
|
+
}
|
|
91
|
+
catch (cause) {
|
|
92
|
+
if (cause.code === "ENOENT") {
|
|
93
|
+
const hint = SHORTHAND.test(source) ? "; owner/repo shorthand names no forge, so give the repository's full https or ssh URL" : "";
|
|
94
|
+
throw actionError("source-missing", 404, `No folder or file is at '${source}'${hint}.`, { source, path: location, retryable: false });
|
|
95
|
+
}
|
|
96
|
+
throw actionError("source-unreadable", 422, `'${source}' cannot be read: ${messageOf(cause)}`, { source, path: location, retryable: false }, cause);
|
|
97
|
+
}
|
|
98
|
+
if (info.isDirectory())
|
|
99
|
+
return { kind: "folder", location };
|
|
100
|
+
if (info.isFile() && basename(location) === "SKILL.md")
|
|
101
|
+
return { kind: "skill-file", location };
|
|
102
|
+
if (info.isFile() && ARCHIVE.test(location))
|
|
103
|
+
return { kind: "archive", location };
|
|
104
|
+
throw actionError("source-invalid", 400, `'${source}' is neither a folder, a SKILL.md, nor a zip or tar archive.`, { source, path: location, retryable: false });
|
|
105
|
+
}
|
|
106
|
+
// The commit a git remote's branch or tag names now; its default branch when no ref is given.
|
|
107
|
+
static async resolveCommit(remote, ref) {
|
|
108
|
+
let listing;
|
|
109
|
+
try {
|
|
110
|
+
// Exact refnames: a bare pattern tail-matches (`v1` finds `feature/v1`) and omits a tag's peeled commit.
|
|
111
|
+
listing = await tool("git", ref === undefined
|
|
112
|
+
? ["ls-remote", "--", remote, "HEAD"]
|
|
113
|
+
: ["ls-remote", "--", remote, `refs/heads/${ref}`, `refs/tags/${ref}`, `refs/tags/${ref}^{}`]);
|
|
114
|
+
}
|
|
115
|
+
catch (cause) {
|
|
116
|
+
throw actionError("source-unreachable", 502, `git could not reach '${remote}': ${reason(cause)}`, { source: remote, retryable: true }, cause);
|
|
117
|
+
}
|
|
118
|
+
const refs = new Map(listing.split("\n").filter((line) => line.includes("\t")).map((line) => {
|
|
119
|
+
const [commit, name] = line.split("\t");
|
|
120
|
+
return [name, commit];
|
|
121
|
+
}));
|
|
122
|
+
const commit = ref === undefined
|
|
123
|
+
? refs.get("HEAD")
|
|
124
|
+
: refs.get(`refs/heads/${ref}`) ?? refs.get(`refs/tags/${ref}^{}`) ?? refs.get(`refs/tags/${ref}`);
|
|
125
|
+
if (commit === undefined) {
|
|
126
|
+
throw actionError("ref-missing", 404, ref === undefined ? `'${remote}' names no default branch.` : `'${remote}' has no branch or tag '${ref}'.`, {
|
|
127
|
+
source: remote, ...(ref === undefined ? {} : { ref }), retryable: false,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return commit;
|
|
131
|
+
}
|
|
132
|
+
// Local trees stay in place; fetched sources own private staging released by close().
|
|
133
|
+
static async open(located, pin = {}) {
|
|
134
|
+
if (located.kind === "folder" || located.kind === "skill-file") {
|
|
135
|
+
const root = located.kind === "folder" ? located.location : dirname(located.location);
|
|
136
|
+
await SkillSource.#assertSkillSource(root, located.location);
|
|
137
|
+
return { ...await SkillSource.#find(root, false), close: async () => { } };
|
|
138
|
+
}
|
|
139
|
+
const staging = await mkdtemp(join(tmpdir(), "plurnk-skill-source-"));
|
|
140
|
+
const close = () => rm(staging, { recursive: true, force: true });
|
|
141
|
+
try {
|
|
142
|
+
let root;
|
|
143
|
+
let commit;
|
|
144
|
+
switch (located.kind) {
|
|
145
|
+
case "git": {
|
|
146
|
+
root = join(staging, "checkout");
|
|
147
|
+
try {
|
|
148
|
+
// No hook runs on the checkout: an operator's global post-checkout would run fetched content.
|
|
149
|
+
await tool("git", ["-c", "core.hooksPath=/dev/null", "clone", "--depth", "1", "--single-branch", "--no-recurse-submodules",
|
|
150
|
+
...(pin.ref === undefined ? [] : ["--branch", pin.ref]), "--", located.location, root]);
|
|
151
|
+
commit = (await tool("git", ["-C", root, "rev-parse", "HEAD"])).trim();
|
|
152
|
+
}
|
|
153
|
+
catch (cause) {
|
|
154
|
+
const at = pin.ref === undefined ? "" : ` at '${pin.ref}'`;
|
|
155
|
+
throw actionError("source-unreachable", 502, `git could not fetch '${located.location}'${at}: ${reason(cause)}`, {
|
|
156
|
+
source: located.location, ...(pin.ref === undefined ? {} : { ref: pin.ref }), retryable: true,
|
|
157
|
+
}, cause);
|
|
158
|
+
}
|
|
159
|
+
if (pin.commit !== undefined && commit !== pin.commit) {
|
|
160
|
+
throw actionError("source-moved", 409, `'${located.location}' ${pin.ref ?? "HEAD"} now names ${commit}; this skill was added at ${pin.commit}.`, {
|
|
161
|
+
source: located.location, ...(pin.ref === undefined ? {} : { ref: pin.ref }), commit: pin.commit, current: commit,
|
|
162
|
+
recovery: "Remove the skill and add it again to take the current commit.", retryable: false,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
case "archive": {
|
|
168
|
+
const into = join(staging, "archive");
|
|
169
|
+
await mkdir(into);
|
|
170
|
+
try {
|
|
171
|
+
// Both tools strip absolute and parent-relative member names and create an
|
|
172
|
+
// archive's links only after its files, so no member lands outside staging.
|
|
173
|
+
if (/\.zip$/iu.test(located.location))
|
|
174
|
+
await tool("unzip", ["-qq", "-n", located.location, "-d", into]);
|
|
175
|
+
else
|
|
176
|
+
await tool("tar", ["-x", "-f", located.location, "-C", into]);
|
|
177
|
+
}
|
|
178
|
+
catch (cause) {
|
|
179
|
+
throw actionError("source-unreadable", 422, `'${located.location}' could not be unpacked: ${reason(cause)}`, { path: located.location, retryable: false }, cause);
|
|
180
|
+
}
|
|
181
|
+
const entries = await readdir(into, { withFileTypes: true });
|
|
182
|
+
root = entries.length === 1 && entries[0].isDirectory() ? join(into, entries[0].name) : into;
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
await SkillSource.#assertSkillSource(root, located.location);
|
|
187
|
+
const { skills, invalid } = await SkillSource.#find(root, true);
|
|
188
|
+
return { skills, invalid, ...(commit === undefined ? {} : { commit }), close };
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
await close();
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
static async #assertSkillSource(root, source) {
|
|
196
|
+
if (await isFile(join(root, "plugin.json"))) {
|
|
197
|
+
throw actionError("source-is-plugin", 422, `'${source}' is an Agent Plugin; install it as a plugin, so its skills keep the plugin's identity and servers.`, {
|
|
198
|
+
source, retryable: false,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Every directory holding a SKILL.md, not descending into a skill or into .git. A skill at the
|
|
203
|
+
// fetched root is named by its frontmatter; live folders retain the standard folder rule.
|
|
204
|
+
static async #find(root, fetched) {
|
|
205
|
+
const canonicalRoot = await realpath(root);
|
|
206
|
+
const skills = [];
|
|
207
|
+
const invalid = [];
|
|
208
|
+
const visit = async (dir, atRoot) => {
|
|
209
|
+
const file = join(dir, "SKILL.md");
|
|
210
|
+
if (await isFile(file)) {
|
|
211
|
+
try {
|
|
212
|
+
if (!inside(canonicalRoot, await realpath(file)))
|
|
213
|
+
throw new Error(`${file} resolves outside the source`);
|
|
214
|
+
const document = await readFile(file, "utf8");
|
|
215
|
+
const parsed = parseSkill(file, atRoot && fetched ? skillName(file, document) : basename(dir), document);
|
|
216
|
+
skills.push({ name: parsed.name, description: parsed.description, dir });
|
|
217
|
+
}
|
|
218
|
+
catch (cause) {
|
|
219
|
+
invalid.push({ dir, reason: messageOf(cause) });
|
|
220
|
+
}
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
for (const entry of await readdir(dir, { withFileTypes: true })) {
|
|
224
|
+
if (entry.isDirectory() && entry.name !== ".git")
|
|
225
|
+
await visit(join(dir, entry.name), false);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
await visit(root, true);
|
|
229
|
+
return { skills: skills.toSorted((left, right) => left.name.localeCompare(right.name) || left.dir.localeCompare(right.dir)), invalid };
|
|
230
|
+
}
|
|
231
|
+
// Copies one found skill to <root>/<name>: staged beside its destination, refused when it holds
|
|
232
|
+
// a link out of itself or anything but files, directories and inward links, then renamed in.
|
|
233
|
+
static async install(skill, root) {
|
|
234
|
+
await mkdir(root, { recursive: true });
|
|
235
|
+
const holding = await mkdtemp(join(root, ".plurnk-install-"));
|
|
236
|
+
try {
|
|
237
|
+
const staged = join(holding, skill.name);
|
|
238
|
+
await cp(skill.dir, staged, { recursive: true, verbatimSymlinks: true, errorOnExist: true, force: false, filter: (path) => basename(path) !== ".git" });
|
|
239
|
+
await SkillSource.assertInward(staged);
|
|
240
|
+
const target = join(root, skill.name);
|
|
241
|
+
await rename(staged, target);
|
|
242
|
+
return target;
|
|
243
|
+
}
|
|
244
|
+
finally {
|
|
245
|
+
await rm(holding, { recursive: true, force: true });
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
static async assertInward(root) {
|
|
249
|
+
const walk = async (dir) => {
|
|
250
|
+
for (const entry of await readdir(dir, { withFileTypes: true })) {
|
|
251
|
+
const path = join(dir, entry.name);
|
|
252
|
+
if (entry.isDirectory()) {
|
|
253
|
+
await walk(path);
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
if (entry.isFile())
|
|
257
|
+
continue;
|
|
258
|
+
if (entry.isSymbolicLink() && inside(root, resolve(dir, await readlink(path))))
|
|
259
|
+
continue;
|
|
260
|
+
const what = entry.isSymbolicLink() ? "links outside its skill" : "is neither a file, a directory, nor an inward link";
|
|
261
|
+
throw actionError("source-unsafe", 422, `'${relative(root, path)}' ${what}.`, { path: relative(root, path), retryable: false });
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
await walk(root);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=SkillSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillSource.js","sourceRoot":"","sources":["../../src/server/SkillSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,12 @@
|
|
|
1
1
|
import { type SkillTree } from "@plurnk/plurnk-agent-skills";
|
|
2
|
-
import { type FunctionalityCandidate, type FunctionalityDiscoverQuery, type JsonSchema } from "@plurnk/plurnk-contracts";
|
|
2
|
+
import { type FunctionalityCandidate, type FunctionalityDiscoverQuery, type JsonSchema, type SkillDefinition } from "@plurnk/plurnk-contracts";
|
|
3
3
|
import type { Db } from "../core/Db.ts";
|
|
4
4
|
import HostPaths from "../core/HostPaths.ts";
|
|
5
5
|
import type { FunctionalityDefinitionSource, FunctionalityFamilyHandle, FunctionalityPreparation, FunctionalityPrepared, FunctionalityServiceDefinition, WorkspaceCapabilityIdentity } from "@plurnk/plurnk-contracts";
|
|
6
6
|
import type { FunctionalityAdapter } from "./DaemonModule.ts";
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
readonly source: string;
|
|
11
|
-
readonly installs: number | null;
|
|
12
|
-
readonly reference: string;
|
|
13
|
-
}
|
|
14
|
-
export interface SkillsToolchain {
|
|
15
|
-
run(args: readonly string[], cwd: string, home: string): Promise<string>;
|
|
16
|
-
search(query: string): Promise<readonly RegistrySkill[]>;
|
|
17
|
-
}
|
|
18
|
-
export declare const parseListing: (output: string) => Array<{
|
|
19
|
-
name: string;
|
|
20
|
-
description: string;
|
|
21
|
-
}>;
|
|
22
|
-
export declare class StandardSkillsToolchain implements SkillsToolchain {
|
|
23
|
-
#private;
|
|
24
|
-
constructor(env?: NodeJS.ProcessEnv);
|
|
25
|
-
get registry(): string | null;
|
|
26
|
-
run(args: readonly string[], cwd: string, home: string): Promise<string>;
|
|
27
|
-
search(query: string): Promise<readonly RegistrySkill[]>;
|
|
28
|
-
}
|
|
7
|
+
import type WorkspaceStorage from "./WorkspaceStorage.ts";
|
|
8
|
+
import WorkspacePlugins from "./WorkspacePlugins.ts";
|
|
9
|
+
export declare const serviceSkills: (env?: NodeJS.ProcessEnv) => ReadonlyMap<string, SkillDefinition>;
|
|
29
10
|
export default class SkillsFunctionality implements FunctionalityAdapter {
|
|
30
11
|
#private;
|
|
31
12
|
readonly family = "skills";
|
|
@@ -37,7 +18,6 @@ export default class SkillsFunctionality implements FunctionalityAdapter {
|
|
|
37
18
|
alias: string;
|
|
38
19
|
definition: {
|
|
39
20
|
name: string;
|
|
40
|
-
scope: string;
|
|
41
21
|
source: string;
|
|
42
22
|
};
|
|
43
23
|
};
|
|
@@ -45,19 +25,20 @@ export default class SkillsFunctionality implements FunctionalityAdapter {
|
|
|
45
25
|
readonly discovery: {
|
|
46
26
|
details: string;
|
|
47
27
|
};
|
|
48
|
-
constructor({ db,
|
|
28
|
+
constructor({ db, storage, hostPaths, provided, plugins }: {
|
|
49
29
|
readonly db: Db;
|
|
30
|
+
readonly storage: WorkspaceStorage;
|
|
50
31
|
readonly hostPaths?: HostPaths;
|
|
51
|
-
readonly toolchain?: SkillsToolchain;
|
|
52
32
|
readonly provided?: () => Promise<ReadonlyMap<string, SkillTree>>;
|
|
33
|
+
readonly plugins?: WorkspacePlugins;
|
|
53
34
|
});
|
|
35
|
+
static validateConfiguration(): void;
|
|
54
36
|
attach(handle: FunctionalityFamilyHandle): void;
|
|
55
37
|
trees(workspaceId: number): ReadonlyMap<string, SkillTree>;
|
|
56
38
|
refreshIfChanged(identity: WorkspaceCapabilityIdentity): Promise<void>;
|
|
57
39
|
available(identity: WorkspaceCapabilityIdentity): Promise<readonly FunctionalityServiceDefinition[]>;
|
|
58
40
|
discover(query: FunctionalityDiscoverQuery, identity: WorkspaceCapabilityIdentity): Promise<readonly FunctionalityCandidate[]>;
|
|
59
41
|
admit(input: unknown, identity: WorkspaceCapabilityIdentity): Promise<FunctionalityDefinitionSource>;
|
|
60
|
-
forget(source: FunctionalityDefinitionSource, identity: WorkspaceCapabilityIdentity): Promise<void>;
|
|
61
42
|
prepare(preparation: FunctionalityPreparation): Promise<FunctionalityPrepared>;
|
|
62
43
|
teardown(_snapshot: unknown, identity: WorkspaceCapabilityIdentity): Promise<void>;
|
|
63
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SkillsFunctionality.d.ts","sourceRoot":"","sources":["../../src/server/SkillsFunctionality.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SkillsFunctionality.d.ts","sourceRoot":"","sources":["../../src/server/SkillsFunctionality.ts"],"names":[],"mappings":"AAMA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAGH,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAC/B,KAAK,UAAU,EACf,KAAK,eAAe,EACvB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,SAAS,MAAM,sBAAsB,CAAC;AAG7C,OAAO,KAAK,EACR,6BAA6B,EAC7B,yBAAyB,EAEzB,wBAAwB,EACxB,qBAAqB,EACrB,8BAA8B,EAC9B,2BAA2B,EAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACR,oBAAoB,EACvB,MAAM,mBAAmB,CAAC;AAI3B,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAC;AAC1D,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AA6CrD,eAAO,MAAM,aAAa,SAAS,MAAM,CAAC,UAAU,KAAiB,WAAW,CAAC,MAAM,EAAE,eAAe,CAqBvG,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,mBAAoB,YAAW,oBAAoB;;IACpE,QAAQ,CAAC,MAAM,YAAiB;IAChC,QAAQ,CAAC,YAAY,SAAc;IACnC,QAAQ,CAAC,cAAc,gCAAgB;IACvC,QAAQ,CAAC,OAAO,yBAAyB;IACzC,QAAQ,CAAC,gBAAgB,EAAE,UAAU,CAAc;IACnD,QAAQ,CAAC,OAAO;QAAK,KAAK;QAAmB,UAAU;YAAI,IAAI;YAAmB,MAAM;;MAA4C;IACpI,QAAQ,CAAC,OAAO,SAAqB;IACrC,QAAQ,CAAC,SAAS;QACd,OAAO;MACT;IAUF,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,SAA2B,EAAE,QAAgC,EAAE,OAAO,EAAE,EAAE;QACjG,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;QAChB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;QACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;QAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QAClE,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;KACvC,EAMA;IAGD,MAAM,CAAC,qBAAqB,IAAI,IAAI,CAOnC;IAED,MAAM,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI,CAE9C;IAED,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAEzD;IA4FK,gBAAgB,CAAC,QAAQ,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAM3E;IAEK,SAAS,CAAC,QAAQ,EAAE,2BAA2B,GAAG,OAAO,CAAC,SAAS,8BAA8B,EAAE,CAAC,CAqBzG;IAEK,QAAQ,CAAC,KAAK,EAAE,0BAA0B,EAAE,QAAQ,EAAE,2BAA2B,GAAG,OAAO,CAAC,SAAS,sBAAsB,EAAE,CAAC,CAqBnI;IAEK,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,2BAA2B,GAAG,OAAO,CAAC,6BAA6B,CAAC,CAyBzG;IA6DK,OAAO,CAAC,WAAW,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA4CnF;IAEK,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvF;CACJ"}
|