@hold-rein/plugin-server 0.0.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/dist/index.cjs +109 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +700 -0
- package/dist/index.js.map +1 -0
- package/package.json +34 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("node:fs/promises"),o=require("node:path"),U=require("node:url"),h=require("node:os"),G=require("node:child_process"),q=require("node:util"),v=require("node:fs");function P(e,t){const r=e[t];if(typeof r!="string")throw new Error(`Plugin package "${t}" must be a string.`);return r}function E(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Plugin package manifest must be an object.");const t=e,r=P(t,"name"),n=P(t,"version"),s=b(t.exports,"./server")??b(t.exports,"."),i=b(t.exports,"./web"),c=L(t.exports,"./web");if(!s)throw new Error('Plugin package "exports" must define a server entry.');return{id:r,name:r,packageName:r,serverEntry:s,version:n,...i===void 0?{}:{webEntry:i},...c===void 0?{}:{webStyle:c}}}async function N(e){const t=await a.readdir(e,{withFileTypes:!0}).catch(()=>[]),r=[];for(const n of t)!n.isDirectory()||n.name==="node_modules"||r.push(o.join(e,n.name,"package.json"));return J(r)}async function J(e){const t=[];for(const r of e)try{await a.access(r),t.push(r)}catch{}return t}function b(e,t){if(typeof e=="string")return t==="."?e:void 0;if(!e||typeof e!="object"||Array.isArray(e))return;const r=e,n=t==="."&&!Object.keys(r).some(s=>s.startsWith("."))?r:r[t];return C(n)}function L(e,t){if(!e||typeof e!="object"||Array.isArray(e))return;const n=e[t];if(!n||typeof n!="object"||Array.isArray(n))return;const i=n.style;return typeof i=="string"?i:void 0}function C(e){if(typeof e=="string")return e;if(!e||typeof e!="object"||Array.isArray(e))return;const t=e,r=["import","default","module"];for(const n of r){const s=C(t[n]);if(s)return s}}const A=["@hold-rein/plugin-server","@earendil-works/pi-agent-core","@earendil-works/pi-ai","express"];async function D(e){var t;for(const r of e.packages??A){const n=o.join(e.pluginRoot,"node_modules",...r.split("/")),s=((t=e.resolvePackageTarget)==null?void 0:t.call(e,r))??o.join(e.hostNodeModules,...r.split("/"));await a.mkdir(o.dirname(n),{recursive:!0}),await a.rm(n,{force:!0,recursive:!0}),await a.symlink(s,n,"junction")}}async function T(e){await D({hostNodeModules:e.hostNodeModules,pluginRoot:e.pluginRoot,...e.resolvePackageTarget===void 0?{}:{resolvePackageTarget:e.resolvePackageTarget}});const t=await N(e.pluginRoot),r=[],n=[];for(const s of t){const i=E(JSON.parse(await a.readFile(s,"utf8"))),c=o.dirname(s),d=o.resolve(c,i.serverEntry),f=await import((e.toImportUrl??(u=>U.pathToFileURL(u).href))(d));if(!f.default)throw new Error(`Plugin "${i.id}" does not export a default plugin.`);if(r.push(f.default),i.webEntry){const u=o.basename(c);n.push({id:i.id,name:i.name,packageName:i.packageName,version:i.version,webEntry:j(u,i.webEntry),...i.webStyle===void 0?{}:{webStyle:j(u,i.webStyle)}})}}return{plugins:r,webPlugins:n}}function j(e,t){return`/plugin-assets/${encodeURIComponent(e)}/${W(t)}`}function W(e){return e.replace(/^\.\//,"").replace(/^dist\//,"")}function V(e){const t=e.trim(),r=/^https:\/\/github\.com\/(?<owner>[^/\s]+)\/(?<repo>[^/\s]+?)(?:\.git)?\/?$/u.exec(t)??/^git@github\.com:(?<owner>[^/\s]+)\/(?<repo>[^/\s]+?)(?:\.git)?$/u.exec(t);if(r!=null&&r.groups){const{owner:m,repo:k}=r.groups;return!m||!k?void 0:{repositoryUrl:S(m,k,t.startsWith("git@github.com:"))}}const n=/^https:\/\/github\.com\/(?<owner>[^/\s]+)\/(?<repo>[^/\s]+)\/(?<kind>tree|blob)\/(?<ref>[^/\s]+)(?:\/(?<path>.*))?\/?$/u.exec(t);if(!(n!=null&&n.groups))return;const{kind:s,owner:i,path:c,ref:d,repo:f}=n.groups;if(!s||!i||!d||!f)return;const u=B(c),l=s==="blob"&&u.at(-1)==="package.json"?u.slice(0,-1).join("/"):u.join("/");return{ref:d,repositoryUrl:S(i,f),...l.length===0?{}:{subdirectory:l}}}function B(e){if(!e)return[];const t=e.split("/").filter(r=>r.length>0);return t.some(r=>r==="."||r==="..")?[]:t}function S(e,t,r=!1){return r?`git@github.com:${e}/${t}.git`:`https://github.com/${e}/${t}.git`}const F=q.promisify(G.execFile);async function g(e,t,r,n,s){s==null||s(`Running: ${H(t,r)}
|
|
2
|
+
`);const i=e?await e(t,r,n):await F(t,[...r],{cwd:n});i!=null&&i.stdout&&(s==null||s(x(i.stdout))),i!=null&&i.stderr&&(s==null||s(x(i.stderr)))}function H(e,t){return[e,...t].join(" ")}function x(e){return e.endsWith(`
|
|
3
|
+
`)?e:`${e}
|
|
4
|
+
`}async function p(e){const t=JSON.parse(await a.readFile(o.join(e,"package.json"),"utf8"));if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Plugin package manifest must be an object.");const r=t,n=r.name;if(typeof n!="string"||n.length===0)throw new Error('Plugin package "name" must be a string.');if(!Q(r.exports))throw new Error('Plugin package "exports" must define "./server".');return{exports:r.exports,name:n,packageJson:r,publishConfig:r.publishConfig}}function K(e){return e.publishConfig&&typeof e.publishConfig=="object"&&!Array.isArray(e.publishConfig)?{...R(e.packageJson),...e.publishConfig,name:e.name}:R(e.packageJson)}function z(e){const t=w(e.exports["./server"]);return!!(t&&!X(t))}function Q(e){return!e||typeof e!="object"||Array.isArray(e)?!1:Object.hasOwn(e,"./server")}function R(e){const t={...e};return delete t.publishConfig,t}function X(e){return e.startsWith("./src/")||e.includes("/src/")||e.endsWith(".ts")||e.endsWith(".tsx")}function w(e){if(typeof e=="string")return e;if(!e||typeof e!="object"||Array.isArray(e))return;const t=e;return w(t.import)??w(t.default)??w(t.module)}function M(e){return e.replaceAll("/","__")}async function y(e){var r;const t=o.join(e.pluginRoot,M(e.packageName));return await a.mkdir(e.pluginRoot,{recursive:!0}),await a.rm(t,{force:!0,recursive:!0}),(r=e.write)==null||r.call(e,`Copying plugin files: ${e.sourcePackageDir} -> ${t}
|
|
5
|
+
`),await a.cp(e.sourcePackageDir,t,{recursive:!0}),t}async function _(e){const t=e.tempRoot??await a.mkdtemp(o.join(h.tmpdir(),"hold-rein-plugin-"));await a.mkdir(t,{recursive:!0});const r=await a.mkdtemp(o.join(t,"install-"));await a.writeFile(o.join(r,"package.json"),JSON.stringify({private:!0,type:"module"},null,2)),await g(e.runCommand,"npm",["install",e.packageName,"--ignore-scripts"],r,e.write);const n=o.join(r,"node_modules",...e.packageName.split("/"));return await p(n),y({packageName:e.packageName,pluginRoot:e.pluginRoot,sourcePackageDir:n,write:e.write})}async function Y(e){const t=V(e.source);if(t)return ee(e,t);const r=await O(e.source,e.currentWorkingDirectory);return r?Z(e,r):_({packageName:e.source,pluginRoot:e.pluginRoot,...e.runCommand===void 0?{}:{runCommand:e.runCommand},...e.tempRoot===void 0?{}:{tempRoot:e.tempRoot},...e.write===void 0?{}:{write:e.write}})}async function Z(e,t){return await p(t),await $(e.runCommand,t,e.write),await g(e.runCommand,"pnpm",["install"],t,e.write),await g(e.runCommand,"pnpm",["build"],t,e.write),I(t,e.pluginRoot,e.write)}async function ee(e,t){const r=e.tempRoot??await a.mkdtemp(o.join(h.tmpdir(),"hold-rein-plugin-"));await a.mkdir(r,{recursive:!0});const n=await a.mkdtemp(o.join(r,"github-")),s=e.installGitRepository??re;try{t.ref?await s(t.repositoryUrl,n,t.ref):await s(t.repositoryUrl,n);const i=t.subdirectory===void 0?n:o.join(n,t.subdirectory),c=await p(i);return z(c)?await y({packageName:c.name,pluginRoot:e.pluginRoot,sourcePackageDir:i,write:e.write}):(await $(e.runCommand,i,e.write),await g(e.runCommand,"pnpm",["install"],i,e.write),await g(e.runCommand,"pnpm",["build"],i,e.write),await I(i,e.pluginRoot,e.write))}finally{await a.rm(n,{force:!0,recursive:!0})}}async function I(e,t,r){const n=await O(o.join(e,"dist"));if(n&&await te(n)){const c=await p(n);return y({packageName:c.name,pluginRoot:t,sourcePackageDir:n,write:r})}const s=await p(e),i=await a.mkdtemp(o.join(h.tmpdir(),"hold-rein-plugin-package-"));try{return await a.writeFile(o.join(i,"package.json"),`${JSON.stringify(K(s),null,2)}
|
|
6
|
+
`),await a.cp(o.join(e,"dist"),o.join(i,"dist"),{recursive:!0}),await p(i),await y({packageName:s.name,pluginRoot:t,sourcePackageDir:i,write:r})}finally{await a.rm(i,{force:!0,recursive:!0})}}async function te(e){try{return await a.stat(o.join(e,"package.json")),!0}catch{return!1}}async function $(e,t,r){try{await g(e,"pnpm",["--version"],t,r)}catch{try{await g(e,"npm",["install","--global","pnpm"],t,r)}catch{throw new Error("pnpm is required to build plugin sources")}}}async function O(e,t=process.cwd()){const r=o.isAbsolute(e)?e:o.resolve(t,e);try{return(await a.stat(r)).isDirectory()?r:void 0}catch{return}}async function re(e,t){await g(void 0,"git",["clone","--depth","1",e,t],process.cwd())}const ne={name:"@hold-rein/plugins-base",version:"0.0.0",private:!0,type:"module",main:"./src/server.ts",module:"./src/server.ts",types:"./src/server.ts",exports:{"./server":{types:"./src/server.ts",import:"./src/server.ts",require:"./src/server.ts"},"./web":{types:"./src/web.ts",style:"./dist/style.css",import:"./src/web.ts",require:"./src/web.ts"}},files:["dist"],publishConfig:{access:"restricted",main:"./dist/server.cjs",module:"./dist/server.js",types:"./dist/server.d.ts",exports:{"./server":{types:"./dist/server.d.ts",import:"./dist/server.js",require:"./dist/server.cjs"},"./web":{types:"./dist/web.d.ts",style:"./dist/style.css",default:"./dist/web.umd.cjs",require:"./dist/web.umd.cjs"}}},scripts:{build:"vite build --config vite.config.ts && vite build --config vite.web.config.ts && tsc -p tsconfig.json --emitDeclarationOnly",typecheck:"tsc -p tsconfig.json --noEmit"},peerDependencies:{"@earendil-works/pi-agent-core":"0.75.4","@earendil-works/pi-ai":"0.76.0","@hold-rein/plugin-server":"workspace:^",express:"5.2.1","@ant-design/icons":"6.2.5","@hold-rein/plugin-web":"workspace:^","@monaco-editor/react":"4.7.0",antd:"6.4.3","monaco-editor":"0.55.1",react:"19.2.6","react-dom":"19.2.6"},devDependencies:{"@earendil-works/pi-agent-core":"0.75.4","@earendil-works/pi-ai":"0.76.0","@hold-rein/plugin-server":"workspace:^",express:"5.2.1",vite:"6.3.5","@ant-design/icons":"6.2.5","@hold-rein/plugin-web":"workspace:^","@monaco-editor/react":"4.7.0","@types/react":"19.2.15",antd:"6.4.3","monaco-editor":"0.55.1",react:"19.2.6","react-dom":"19.2.6"}},ie=`{
|
|
7
|
+
"compilerOptions": {
|
|
8
|
+
"declaration": true,
|
|
9
|
+
"declarationMap": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"exactOptionalPropertyTypes": true,
|
|
12
|
+
"forceConsistentCasingInFileNames": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"module": "ESNext",
|
|
15
|
+
"moduleResolution": "Bundler",
|
|
16
|
+
"noFallthroughCasesInSwitch": true,
|
|
17
|
+
"noImplicitOverride": true,
|
|
18
|
+
"noUncheckedIndexedAccess": true,
|
|
19
|
+
"resolveJsonModule": true,
|
|
20
|
+
"skipLibCheck": true,
|
|
21
|
+
"strict": true,
|
|
22
|
+
"target": "ES2022",
|
|
23
|
+
"useDefineForClassFields": true,
|
|
24
|
+
"verbatimModuleSyntax": true,
|
|
25
|
+
"jsx": "react-jsx",
|
|
26
|
+
"lib": ["DOM", "DOM.Iterable", "ES2022"],
|
|
27
|
+
"outDir": "dist",
|
|
28
|
+
"rootDir": "src"
|
|
29
|
+
},
|
|
30
|
+
"include": ["src/**/*.ts", "src/**/*.tsx"],
|
|
31
|
+
"exclude": ["src/**/*.test.ts", "src/**/*.test.tsx"]
|
|
32
|
+
}
|
|
33
|
+
`,se=`import { builtinModules } from "node:module";
|
|
34
|
+
|
|
35
|
+
import { defineConfig } from "vite";
|
|
36
|
+
|
|
37
|
+
const nodeBuiltins = builtinModules.flatMap((name) => [
|
|
38
|
+
name,
|
|
39
|
+
\`node:\${name}\`
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
export default defineConfig({
|
|
43
|
+
build: {
|
|
44
|
+
lib: {
|
|
45
|
+
entry: "src/server.ts",
|
|
46
|
+
fileName: (format) => \`server.\${format === "cjs" ? "cjs" : "js"}\`,
|
|
47
|
+
formats: ["es", "cjs"]
|
|
48
|
+
},
|
|
49
|
+
rollupOptions: {
|
|
50
|
+
external: [
|
|
51
|
+
...nodeBuiltins,
|
|
52
|
+
"@hold-rein/plugin-server",
|
|
53
|
+
"@earendil-works/pi-agent-core",
|
|
54
|
+
"@earendil-works/pi-ai",
|
|
55
|
+
"express"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
sourcemap: true
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
`,oe=`import { defineConfig } from "vite";
|
|
62
|
+
|
|
63
|
+
export default defineConfig({
|
|
64
|
+
build: {
|
|
65
|
+
emptyOutDir: false,
|
|
66
|
+
lib: {
|
|
67
|
+
cssFileName: "style",
|
|
68
|
+
entry: "src/web.ts",
|
|
69
|
+
fileName: () => "web.umd.cjs",
|
|
70
|
+
formats: ["umd"],
|
|
71
|
+
name: "HoldReinPlugin"
|
|
72
|
+
},
|
|
73
|
+
sourcemap: true,
|
|
74
|
+
rollupOptions: {
|
|
75
|
+
external: [
|
|
76
|
+
"@ant-design/icons",
|
|
77
|
+
"@hold-rein/plugin-web",
|
|
78
|
+
"@monaco-editor/react",
|
|
79
|
+
"antd",
|
|
80
|
+
"monaco-editor",
|
|
81
|
+
"react",
|
|
82
|
+
"react-dom",
|
|
83
|
+
"react/jsx-runtime"
|
|
84
|
+
]
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
`,ae=(e,t={})=>{const r=t.path??e,n=t.name===void 0?r:o.join(r,t.name),s=o.basename(n),i=`hold-rein-plugin-${s}`,c={...ne,name:i};return ce(n,{"package.json":`${JSON.stringify(c,null,2)}
|
|
89
|
+
`,"tsconfig.json":ie,"vite.config.ts":se,"vite.web.config.ts":oe,"src/plugin-id.ts":`export const PLUGIN_ID = "__${s}__plugin";
|
|
90
|
+
`,"src/server.ts":ue(),"src/web.ts":le()}),{packageName:i}};function ce(e,t){for(const r of Object.keys(t)){const n=o.join(e,r);if(v.existsSync(n))throw new Error(`Refusing to overwrite existing file: ${r}`)}v.mkdirSync(o.join(e,"src"),{recursive:!0});for(const[r,n]of Object.entries(t))v.writeFileSync(o.join(e,r),n)}function ue(){return`import type { ServerPlugin } from "@hold-rein/plugin-server";
|
|
91
|
+
|
|
92
|
+
import { PLUGIN_ID } from "./plugin-id";
|
|
93
|
+
|
|
94
|
+
const serverPlugin: ServerPlugin.Plugin = {
|
|
95
|
+
id: PLUGIN_ID
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export default serverPlugin;
|
|
99
|
+
`}function le(){return`import type { WebPlugin } from "@hold-rein/plugin-web";
|
|
100
|
+
|
|
101
|
+
import { PLUGIN_ID } from "./plugin-id";
|
|
102
|
+
|
|
103
|
+
const webPlugin: WebPlugin.Plugin = {
|
|
104
|
+
id: PLUGIN_ID
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export default webPlugin;
|
|
108
|
+
`}async function de(e,t){return typeof e=="function"?e(t):e}function ge(){const e=new Map;return{register(t){if(e.has(t.id))throw new Error(`Server plugin "${t.id}" is already registered.`);e.set(t.id,t)},list(){return[...e.values()]},get(t){return e.get(t)},has(t){return e.has(t)},async registerRoutes(t,r){for(const n of e.values()){if(!n.registerRoutes)continue;const s=await n.registerRoutes(r);t.use(`/${n.id}`,s)}},async resolveContributions(t){const r=[],n=[],s=[],i=[],c=[],d=[];for(const u of e.values()){if(!u.contributionResolver)continue;const l=await de(u.contributionResolver,t);r.push(...l.tools??[]),n.push(...l.skills??[]),s.push(...l.skillDirs??[]),i.push(...l.systemPrompts??[]),l.subscribe&&c.push(l.subscribe),l.onAgentEnd&&d.push(l.onAgentEnd)}return{...{tools:r,skills:n,skillDirs:s,systemPrompts:i},...c.length>0?{subscribe(u){for(const l of c)l(u)}}:{},...d.length>0?{async onAgentEnd(u){for(const l of d){const m=await l(u);if(m)return m}}}:{}}}}}exports.SERVER_PLUGIN_SHARED_PACKAGES=A;exports.copyInstalledPluginPackage=y;exports.createServerPluginRegistry=ge;exports.discoverServerPluginManifests=N;exports.encodePluginDirectoryName=M;exports.initPluginPackage=ae;exports.installNpmPluginPackage=_;exports.installPluginPackage=Y;exports.linkServerPluginSharedPackages=D;exports.loadInstalledServerPlugins=T;exports.parseServerPluginManifest=E;
|
|
109
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/runtime/manifest/index.ts","../src/runtime/shared/packages.ts","../src/runtime/shared/symlinks.ts","../src/runtime/loader/index.ts","../src/runtime/installer/github-source.ts","../src/runtime/installer/command.ts","../src/runtime/manifest/package.ts","../src/runtime/installer/index.ts","../src/runtime/init/index.ts","../src/index.ts"],"sourcesContent":["import { access, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport type { PackageEntryManifest } from \"../../type\";\n\nfunction requirePackageString(\n input: Record<string, unknown>,\n key: string\n): string {\n const value = input[key];\n if (typeof value !== \"string\") {\n throw new Error(`Plugin package \"${key}\" must be a string.`);\n }\n\n return value;\n}\n\nexport function parseServerPluginManifest(\n input: unknown\n): PackageEntryManifest {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"Plugin package manifest must be an object.\");\n }\n\n const packageManifest = input as Record<string, unknown>;\n const packageName = requirePackageString(packageManifest, \"name\");\n const version = requirePackageString(packageManifest, \"version\");\n const serverEntry = resolvePackageExport(\n packageManifest.exports,\n \"./server\"\n ) ?? resolvePackageExport(packageManifest.exports, \".\");\n const webEntry = resolvePackageExport(packageManifest.exports, \"./web\");\n const webStyle = resolvePackageStyleExport(packageManifest.exports, \"./web\");\n\n if (!serverEntry) {\n throw new Error('Plugin package \"exports\" must define a server entry.');\n }\n\n return {\n id: packageName,\n name: packageName,\n packageName,\n serverEntry,\n version,\n ...(webEntry === undefined ? {} : { webEntry }),\n ...(webStyle === undefined ? {} : { webStyle })\n };\n}\n\nexport async function discoverServerPluginManifests(\n pluginRoot: string\n): Promise<string[]> {\n const entries = await readdir(pluginRoot, { withFileTypes: true }).catch(\n () => []\n );\n const manifests: string[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name === \"node_modules\") {\n continue;\n }\n\n manifests.push(join(pluginRoot, entry.name, \"package.json\"));\n }\n\n return existingFiles(manifests);\n}\n\nasync function existingFiles(paths: readonly string[]): Promise<string[]> {\n const existing: string[] = [];\n\n for (const path of paths) {\n try {\n await access(path);\n existing.push(path);\n } catch {\n // Missing package manifests are ignored during discovery.\n }\n }\n\n return existing;\n}\n\nfunction resolvePackageExport(\n exportsField: unknown,\n subpath: \".\" | \"./server\" | \"./web\"\n): string | undefined {\n if (typeof exportsField === \"string\") {\n return subpath === \".\" ? exportsField : undefined;\n }\n if (\n !exportsField ||\n typeof exportsField !== \"object\" ||\n Array.isArray(exportsField)\n ) {\n return undefined;\n }\n\n const exportMap = exportsField as Record<string, unknown>;\n const exportValue =\n subpath === \".\" && !Object.keys(exportMap).some((key) => key.startsWith(\".\"))\n ? exportMap\n : exportMap[subpath];\n\n return resolveExportValue(exportValue);\n}\n\nfunction resolvePackageStyleExport(\n exportsField: unknown,\n subpath: \"./web\"\n): string | undefined {\n if (\n !exportsField ||\n typeof exportsField !== \"object\" ||\n Array.isArray(exportsField)\n ) {\n return undefined;\n }\n\n const exportMap = exportsField as Record<string, unknown>;\n const exportValue = exportMap[subpath];\n\n if (\n !exportValue ||\n typeof exportValue !== \"object\" ||\n Array.isArray(exportValue)\n ) {\n return undefined;\n }\n\n const conditions = exportValue as Record<string, unknown>;\n const style = conditions.style;\n\n return typeof style === \"string\" ? style : undefined;\n}\n\nfunction resolveExportValue(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return value;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n const conditions = value as Record<string, unknown>;\n const preferredConditions = [\"import\", \"default\", \"module\"] as const;\n\n for (const condition of preferredConditions) {\n const resolved = resolveExportValue(conditions[condition]);\n if (resolved) {\n return resolved;\n }\n }\n\n return undefined;\n}\n","export const SERVER_PLUGIN_SHARED_PACKAGES = [\n \"@hold-rein/plugin-server\",\n \"@earendil-works/pi-agent-core\",\n \"@earendil-works/pi-ai\",\n \"express\"\n] as const;\n","import { mkdir, rm, symlink } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport { SERVER_PLUGIN_SHARED_PACKAGES } from \"./packages\";\n\nexport interface LinkServerPluginSharedPackagesOptions {\n readonly hostNodeModules: string;\n readonly packages?: readonly string[];\n readonly pluginRoot: string;\n readonly resolvePackageTarget?: (packageName: string) => string;\n}\n\nexport async function linkServerPluginSharedPackages(\n options: LinkServerPluginSharedPackagesOptions\n): Promise<void> {\n for (const packageName of options.packages ?? SERVER_PLUGIN_SHARED_PACKAGES) {\n const linkPath = join(\n options.pluginRoot,\n \"node_modules\",\n ...packageName.split(\"/\")\n );\n const targetPath =\n options.resolvePackageTarget?.(packageName) ??\n join(options.hostNodeModules, ...packageName.split(\"/\"));\n\n await mkdir(dirname(linkPath), { recursive: true });\n await rm(linkPath, { force: true, recursive: true });\n await symlink(targetPath, linkPath, \"junction\");\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, dirname, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { RuntimePluginManifest, ServerPlugin } from \"../../type\";\nimport {\n discoverServerPluginManifests,\n parseServerPluginManifest\n} from \"../manifest\";\nimport { linkServerPluginSharedPackages } from \"../shared/symlinks\";\n\nexport interface LoadInstalledServerPluginsOptions {\n readonly hostNodeModules: string;\n readonly pluginRoot: string;\n readonly resolvePackageTarget?: (packageName: string) => string;\n readonly toImportUrl?: (path: string) => string;\n}\n\nexport interface LoadedServerPlugins {\n readonly plugins: ServerPlugin.Plugin[];\n readonly webPlugins: RuntimePluginManifest[];\n}\n\nexport async function loadInstalledServerPlugins(\n options: LoadInstalledServerPluginsOptions\n): Promise<LoadedServerPlugins> {\n await linkServerPluginSharedPackages({\n hostNodeModules: options.hostNodeModules,\n pluginRoot: options.pluginRoot,\n ...(options.resolvePackageTarget === undefined\n ? {}\n : { resolvePackageTarget: options.resolvePackageTarget })\n });\n\n const manifests = await discoverServerPluginManifests(options.pluginRoot);\n const plugins: ServerPlugin.Plugin[] = [];\n const webPlugins: RuntimePluginManifest[] = [];\n\n for (const manifestPath of manifests) {\n const manifest = parseServerPluginManifest(\n JSON.parse(await readFile(manifestPath, \"utf8\"))\n );\n const packageDir = dirname(manifestPath);\n const entryPath = resolve(packageDir, manifest.serverEntry);\n const module = await import(\n (options.toImportUrl ?? ((path) => pathToFileURL(path).href))(entryPath)\n );\n\n if (!module.default) {\n throw new Error(\n `Plugin \"${manifest.id}\" does not export a default plugin.`\n );\n }\n\n plugins.push(module.default as ServerPlugin.Plugin);\n\n if (manifest.webEntry) {\n const pluginDir = basename(packageDir);\n webPlugins.push({\n id: manifest.id,\n name: manifest.name,\n packageName: manifest.packageName,\n version: manifest.version,\n webEntry: toPluginAssetUrl(pluginDir, manifest.webEntry),\n ...(manifest.webStyle === undefined\n ? {}\n : { webStyle: toPluginAssetUrl(pluginDir, manifest.webStyle) })\n });\n }\n }\n\n return { plugins, webPlugins };\n}\n\nfunction toPluginAssetUrl(pluginDir: string, entry: string): string {\n return `/plugin-assets/${encodeURIComponent(pluginDir)}/${toPluginAssetPath(\n entry\n )}`;\n}\n\nfunction toPluginAssetPath(entry: string): string {\n return entry.replace(/^\\.\\//, \"\").replace(/^dist\\//, \"\");\n}\n","export interface GithubPluginSource {\n readonly ref?: string;\n readonly repositoryUrl: string;\n readonly subdirectory?: string;\n}\n\nexport function parseGithubPluginSource(\n source: string\n): GithubPluginSource | undefined {\n const trimmedSource = source.trim();\n const rootMatch =\n /^https:\\/\\/github\\.com\\/(?<owner>[^/\\s]+)\\/(?<repo>[^/\\s]+?)(?:\\.git)?\\/?$/u.exec(\n trimmedSource\n ) ??\n /^git@github\\.com:(?<owner>[^/\\s]+)\\/(?<repo>[^/\\s]+?)(?:\\.git)?$/u.exec(\n trimmedSource\n );\n\n if (rootMatch?.groups) {\n const { owner, repo } = rootMatch.groups;\n\n if (!owner || !repo) {\n return undefined;\n }\n\n return {\n repositoryUrl: toGitRepositoryUrl(\n owner,\n repo,\n trimmedSource.startsWith(\"git@github.com:\")\n )\n };\n }\n\n const webMatch =\n /^https:\\/\\/github\\.com\\/(?<owner>[^/\\s]+)\\/(?<repo>[^/\\s]+)\\/(?<kind>tree|blob)\\/(?<ref>[^/\\s]+)(?:\\/(?<path>.*))?\\/?$/u.exec(\n trimmedSource\n );\n\n if (!webMatch?.groups) {\n return undefined;\n }\n\n const { kind, owner, path, ref, repo } = webMatch.groups;\n\n if (!kind || !owner || !ref || !repo) {\n return undefined;\n }\n\n const pathSegments = normalizeGithubPathSegments(path);\n const subdirectory =\n kind === \"blob\" && pathSegments.at(-1) === \"package.json\"\n ? pathSegments.slice(0, -1).join(\"/\")\n : pathSegments.join(\"/\");\n\n return {\n ref,\n repositoryUrl: toGitRepositoryUrl(owner, repo),\n ...(subdirectory.length === 0 ? {} : { subdirectory })\n };\n}\n\nfunction normalizeGithubPathSegments(path: string | undefined): string[] {\n if (!path) {\n return [];\n }\n\n const segments = path.split(\"/\").filter((segment) => segment.length > 0);\n\n if (segments.some((segment) => segment === \".\" || segment === \"..\")) {\n return [];\n }\n\n return segments;\n}\n\nfunction toGitRepositoryUrl(\n owner: string,\n repo: string,\n useSsh = false\n): string {\n return useSsh\n ? `git@github.com:${owner}/${repo}.git`\n : `https://github.com/${owner}/${repo}.git`;\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport interface PluginInstallCommandResult {\n readonly stderr?: string;\n readonly stdout?: string;\n}\n\nexport type PluginInstallCommandRunner = (\n command: string,\n args: readonly string[],\n cwd: string\n) => Promise<PluginInstallCommandResult> | Promise<void>;\n\nexport type PluginInstallWriter = (value: string) => void;\n\nexport async function runInstallCommand(\n runner: PluginInstallCommandRunner | undefined,\n command: string,\n args: readonly string[],\n cwd: string,\n write?: PluginInstallWriter\n): Promise<void> {\n write?.(`Running: ${formatCommand(command, args)}\\n`);\n\n const result = runner\n ? ((await runner(command, args, cwd)) as PluginInstallCommandResult | undefined)\n : await execFileAsync(command, [...args], { cwd });\n\n if (result?.stdout) {\n write?.(ensureTrailingNewline(result.stdout));\n }\n if (result?.stderr) {\n write?.(ensureTrailingNewline(result.stderr));\n }\n}\n\nfunction formatCommand(command: string, args: readonly string[]): string {\n return [command, ...args].join(\" \");\n}\n\nfunction ensureTrailingNewline(value: string): string {\n return value.endsWith(\"\\n\") ? value : `${value}\\n`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface PluginPackageManifest {\n readonly name: string;\n readonly exports?: unknown;\n readonly packageJson: Record<string, unknown>;\n readonly publishConfig?: unknown;\n}\n\nexport async function readValidPluginPackageManifest(\n packageDirectory: string\n): Promise<PluginPackageManifest> {\n const manifest = JSON.parse(\n await readFile(join(packageDirectory, \"package.json\"), \"utf8\")\n ) as unknown;\n\n if (!manifest || typeof manifest !== \"object\" || Array.isArray(manifest)) {\n throw new Error(\"Plugin package manifest must be an object.\");\n }\n\n const packageManifest = manifest as Record<string, unknown>;\n const name = packageManifest.name;\n\n if (typeof name !== \"string\" || name.length === 0) {\n throw new Error('Plugin package \"name\" must be a string.');\n }\n\n if (!hasServerExport(packageManifest.exports)) {\n throw new Error('Plugin package \"exports\" must define \"./server\".');\n }\n\n return {\n exports: packageManifest.exports,\n name,\n packageJson: packageManifest,\n publishConfig: packageManifest.publishConfig\n };\n}\n\nexport function createPublishedManifest(\n manifest: PluginPackageManifest\n): Record<string, unknown> {\n if (\n manifest.publishConfig &&\n typeof manifest.publishConfig === \"object\" &&\n !Array.isArray(manifest.publishConfig)\n ) {\n return {\n ...withoutPublishConfig(manifest.packageJson),\n ...(manifest.publishConfig as Record<string, unknown>),\n name: manifest.name\n };\n }\n\n return withoutPublishConfig(manifest.packageJson);\n}\n\nexport function isBuiltPackageManifest(\n manifest: PluginPackageManifest\n): boolean {\n const serverEntry = resolveExportValue(\n (manifest.exports as Record<string, unknown>)[\"./server\"]\n );\n\n return Boolean(serverEntry && !isSourceEntry(serverEntry));\n}\n\nfunction hasServerExport(exportsField: unknown): boolean {\n if (!exportsField || typeof exportsField !== \"object\" || Array.isArray(exportsField)) {\n return false;\n }\n\n return Object.hasOwn(exportsField, \"./server\");\n}\n\nfunction withoutPublishConfig(\n packageJson: Record<string, unknown>\n): Record<string, unknown> {\n const publishedManifest = { ...packageJson };\n delete publishedManifest.publishConfig;\n\n return publishedManifest;\n}\n\nfunction isSourceEntry(entry: string): boolean {\n return (\n entry.startsWith(\"./src/\") ||\n entry.includes(\"/src/\") ||\n entry.endsWith(\".ts\") ||\n entry.endsWith(\".tsx\")\n );\n}\n\nfunction resolveExportValue(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return value;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n const conditions = value as Record<string, unknown>;\n\n return (\n resolveExportValue(conditions.import) ??\n resolveExportValue(conditions.default) ??\n resolveExportValue(conditions.module)\n );\n}\n","import { cp, mkdir, mkdtemp, rm, stat, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { isAbsolute, join, resolve } from \"node:path\";\n\nimport {\n type GithubPluginSource,\n parseGithubPluginSource\n} from \"./github-source\";\nimport {\n type PluginInstallCommandRunner,\n type PluginInstallWriter,\n runInstallCommand\n} from \"./command\";\nimport {\n createPublishedManifest,\n isBuiltPackageManifest,\n readValidPluginPackageManifest\n} from \"../manifest/package\";\n\nexport interface CopyInstalledPluginPackageOptions {\n readonly packageName: string;\n readonly pluginRoot: string;\n readonly sourcePackageDir: string;\n readonly write?: PluginInstallWriter | undefined;\n}\n\nexport interface InstallNpmPluginPackageOptions {\n readonly packageName: string;\n readonly pluginRoot: string;\n readonly tempRoot?: string;\n readonly runCommand?: PluginInstallCommandRunner;\n readonly write?: PluginInstallWriter | undefined;\n}\n\nexport interface InstallPluginPackageOptions {\n readonly currentWorkingDirectory?: string;\n readonly installGitRepository?: (\n repositoryUrl: string,\n targetDir: string,\n ref?: string\n ) => Promise<void>;\n readonly pluginRoot: string;\n readonly runCommand?: PluginInstallCommandRunner;\n readonly source: string;\n readonly tempRoot?: string;\n readonly write?: PluginInstallWriter | undefined;\n}\n\nexport function encodePluginDirectoryName(packageName: string): string {\n return packageName.replaceAll(\"/\", \"__\");\n}\n\nexport async function copyInstalledPluginPackage(\n options: CopyInstalledPluginPackageOptions\n): Promise<string> {\n const destination = join(\n options.pluginRoot,\n encodePluginDirectoryName(options.packageName)\n );\n\n await mkdir(options.pluginRoot, { recursive: true });\n await rm(destination, { force: true, recursive: true });\n options.write?.(\n `Copying plugin files: ${options.sourcePackageDir} -> ${destination}\\n`\n );\n await cp(options.sourcePackageDir, destination, { recursive: true });\n\n return destination;\n}\n\nexport async function installNpmPluginPackage(\n options: InstallNpmPluginPackageOptions\n): Promise<string> {\n const tempRoot =\n options.tempRoot ?? (await mkdtemp(join(tmpdir(), \"hold-rein-plugin-\")));\n\n await mkdir(tempRoot, { recursive: true });\n\n const installDir = await mkdtemp(join(tempRoot, \"install-\"));\n\n await writeFile(\n join(installDir, \"package.json\"),\n JSON.stringify({ private: true, type: \"module\" }, null, 2)\n );\n await runInstallCommand(\n options.runCommand,\n \"npm\",\n [\"install\", options.packageName, \"--ignore-scripts\"],\n installDir,\n options.write\n );\n\n const sourcePackageDir = join(\n installDir,\n \"node_modules\",\n ...options.packageName.split(\"/\")\n );\n\n await readValidPluginPackageManifest(sourcePackageDir);\n\n return copyInstalledPluginPackage({\n packageName: options.packageName,\n pluginRoot: options.pluginRoot,\n sourcePackageDir,\n write: options.write\n });\n}\n\nexport async function installPluginPackage(\n options: InstallPluginPackageOptions\n): Promise<string> {\n const githubSource = parseGithubPluginSource(options.source);\n\n if (githubSource) {\n return installGithubPluginPackage(options, githubSource);\n }\n\n const localDirectory = await resolveLocalDirectory(\n options.source,\n options.currentWorkingDirectory\n );\n\n if (localDirectory) {\n return installLocalPluginPackage(options, localDirectory);\n }\n\n return installNpmPluginPackage({\n packageName: options.source,\n pluginRoot: options.pluginRoot,\n ...(options.runCommand === undefined\n ? {}\n : { runCommand: options.runCommand }),\n ...(options.tempRoot === undefined ? {} : { tempRoot: options.tempRoot }),\n ...(options.write === undefined ? {} : { write: options.write })\n });\n}\n\nasync function installLocalPluginPackage(\n options: InstallPluginPackageOptions,\n sourceDirectory: string\n): Promise<string> {\n await readValidPluginPackageManifest(sourceDirectory);\n await ensurePnpmAvailable(options.runCommand, sourceDirectory, options.write);\n await runInstallCommand(\n options.runCommand,\n \"pnpm\",\n [\"install\"],\n sourceDirectory,\n options.write\n );\n await runInstallCommand(\n options.runCommand,\n \"pnpm\",\n [\"build\"],\n sourceDirectory,\n options.write\n );\n\n return installBuiltSourcePackage(sourceDirectory, options.pluginRoot, options.write);\n}\n\nasync function installGithubPluginPackage(\n options: InstallPluginPackageOptions,\n githubSource: GithubPluginSource\n): Promise<string> {\n const tempRoot =\n options.tempRoot ?? (await mkdtemp(join(tmpdir(), \"hold-rein-plugin-\")));\n await mkdir(tempRoot, { recursive: true });\n const cloneDir = await mkdtemp(join(tempRoot, \"github-\"));\n const installGitRepository = options.installGitRepository ?? cloneGitRepository;\n\n try {\n if (githubSource.ref) {\n await installGitRepository(\n githubSource.repositoryUrl,\n cloneDir,\n githubSource.ref\n );\n } else {\n await installGitRepository(githubSource.repositoryUrl, cloneDir);\n }\n\n const sourceDirectory =\n githubSource.subdirectory === undefined\n ? cloneDir\n : join(cloneDir, githubSource.subdirectory);\n\n const manifest = await readValidPluginPackageManifest(sourceDirectory);\n\n if (isBuiltPackageManifest(manifest)) {\n return await copyInstalledPluginPackage({\n packageName: manifest.name,\n pluginRoot: options.pluginRoot,\n sourcePackageDir: sourceDirectory,\n write: options.write\n });\n }\n\n await ensurePnpmAvailable(options.runCommand, sourceDirectory, options.write);\n await runInstallCommand(\n options.runCommand,\n \"pnpm\",\n [\"install\"],\n sourceDirectory,\n options.write\n );\n await runInstallCommand(\n options.runCommand,\n \"pnpm\",\n [\"build\"],\n sourceDirectory,\n options.write\n );\n\n return await installBuiltSourcePackage(\n sourceDirectory,\n options.pluginRoot,\n options.write\n );\n } finally {\n await rm(cloneDir, { force: true, recursive: true });\n }\n}\n\nasync function installBuiltSourcePackage(\n sourceDirectory: string,\n pluginRoot: string,\n write: PluginInstallWriter | undefined\n): Promise<string> {\n const directDistPackage = await resolveLocalDirectory(\n join(sourceDirectory, \"dist\")\n );\n\n if (directDistPackage && (await hasPackageManifest(directDistPackage))) {\n const manifest = await readValidPluginPackageManifest(directDistPackage);\n\n return copyInstalledPluginPackage({\n packageName: manifest.name,\n pluginRoot,\n sourcePackageDir: directDistPackage,\n write\n });\n }\n\n const manifest = await readValidPluginPackageManifest(sourceDirectory);\n const stagingDir = await mkdtemp(join(tmpdir(), \"hold-rein-plugin-package-\"));\n\n try {\n await writeFile(\n join(stagingDir, \"package.json\"),\n `${JSON.stringify(createPublishedManifest(manifest), null, 2)}\\n`\n );\n await cp(join(sourceDirectory, \"dist\"), join(stagingDir, \"dist\"), {\n recursive: true\n });\n await readValidPluginPackageManifest(stagingDir);\n\n return await copyInstalledPluginPackage({\n packageName: manifest.name,\n pluginRoot,\n sourcePackageDir: stagingDir,\n write\n });\n } finally {\n await rm(stagingDir, { force: true, recursive: true });\n }\n}\n\nasync function hasPackageManifest(directory: string): Promise<boolean> {\n try {\n await stat(join(directory, \"package.json\"));\n return true;\n } catch {\n return false;\n }\n}\n\nasync function ensurePnpmAvailable(\n runCommand: PluginInstallCommandRunner | undefined,\n cwd: string,\n write: PluginInstallWriter | undefined\n): Promise<void> {\n try {\n await runInstallCommand(runCommand, \"pnpm\", [\"--version\"], cwd, write);\n } catch {\n try {\n await runInstallCommand(\n runCommand,\n \"npm\",\n [\"install\", \"--global\", \"pnpm\"],\n cwd,\n write\n );\n } catch {\n throw new Error(\"pnpm is required to build plugin sources\");\n }\n }\n}\n\nasync function resolveLocalDirectory(\n source: string,\n currentWorkingDirectory = process.cwd()\n): Promise<string | undefined> {\n const directory = isAbsolute(source)\n ? source\n : resolve(currentWorkingDirectory, source);\n\n try {\n const stats = await stat(directory);\n return stats.isDirectory() ? directory : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function cloneGitRepository(\n repositoryUrl: string,\n targetDir: string\n): Promise<void> {\n await runInstallCommand(\n undefined,\n \"git\",\n [\"clone\", \"--depth\", \"1\", repositoryUrl, targetDir],\n process.cwd()\n );\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\n\nexport interface InitPluginPackageResult {\n readonly packageName: string;\n}\n\nexport interface InitPluginPackageOptions {\n readonly name?: string;\n readonly path?: string;\n}\n\nconst basePackageJson = {\n name: \"@hold-rein/plugins-base\",\n version: \"0.0.0\",\n private: true,\n type: \"module\",\n main: \"./src/server.ts\",\n module: \"./src/server.ts\",\n types: \"./src/server.ts\",\n exports: {\n \"./server\": {\n types: \"./src/server.ts\",\n import: \"./src/server.ts\",\n require: \"./src/server.ts\"\n },\n \"./web\": {\n types: \"./src/web.ts\",\n style: \"./dist/style.css\",\n import: \"./src/web.ts\",\n require: \"./src/web.ts\"\n }\n },\n files: [\"dist\"],\n publishConfig: {\n access: \"restricted\",\n main: \"./dist/server.cjs\",\n module: \"./dist/server.js\",\n types: \"./dist/server.d.ts\",\n exports: {\n \"./server\": {\n types: \"./dist/server.d.ts\",\n import: \"./dist/server.js\",\n require: \"./dist/server.cjs\"\n },\n \"./web\": {\n types: \"./dist/web.d.ts\",\n style: \"./dist/style.css\",\n default: \"./dist/web.umd.cjs\",\n require: \"./dist/web.umd.cjs\"\n }\n }\n },\n scripts: {\n build:\n \"vite build --config vite.config.ts && vite build --config vite.web.config.ts && tsc -p tsconfig.json --emitDeclarationOnly\",\n typecheck: \"tsc -p tsconfig.json --noEmit\"\n },\n peerDependencies: {\n \"@earendil-works/pi-agent-core\": \"0.75.4\",\n \"@earendil-works/pi-ai\": \"0.76.0\",\n \"@hold-rein/plugin-server\": \"workspace:^\",\n express: \"5.2.1\",\n \"@ant-design/icons\": \"6.2.5\",\n \"@hold-rein/plugin-web\": \"workspace:^\",\n \"@monaco-editor/react\": \"4.7.0\",\n antd: \"6.4.3\",\n \"monaco-editor\": \"0.55.1\",\n react: \"19.2.6\",\n \"react-dom\": \"19.2.6\"\n },\n devDependencies: {\n \"@earendil-works/pi-agent-core\": \"0.75.4\",\n \"@earendil-works/pi-ai\": \"0.76.0\",\n \"@hold-rein/plugin-server\": \"workspace:^\",\n express: \"5.2.1\",\n vite: \"6.3.5\",\n \"@ant-design/icons\": \"6.2.5\",\n \"@hold-rein/plugin-web\": \"workspace:^\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@types/react\": \"19.2.15\",\n antd: \"6.4.3\",\n \"monaco-editor\": \"0.55.1\",\n react: \"19.2.6\",\n \"react-dom\": \"19.2.6\"\n }\n} as const;\n\nconst tsconfigJson = `{\n \"compilerOptions\": {\n \"declaration\": true,\n \"declarationMap\": true,\n \"esModuleInterop\": true,\n \"exactOptionalPropertyTypes\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"isolatedModules\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"noFallthroughCasesInSwitch\": true,\n \"noImplicitOverride\": true,\n \"noUncheckedIndexedAccess\": true,\n \"resolveJsonModule\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"target\": \"ES2022\",\n \"useDefineForClassFields\": true,\n \"verbatimModuleSyntax\": true,\n \"jsx\": \"react-jsx\",\n \"lib\": [\"DOM\", \"DOM.Iterable\", \"ES2022\"],\n \"outDir\": \"dist\",\n \"rootDir\": \"src\"\n },\n \"include\": [\"src/**/*.ts\", \"src/**/*.tsx\"],\n \"exclude\": [\"src/**/*.test.ts\", \"src/**/*.test.tsx\"]\n}\n`;\n\nconst viteConfigTs = `import { builtinModules } from \"node:module\";\n\nimport { defineConfig } from \"vite\";\n\nconst nodeBuiltins = builtinModules.flatMap((name) => [\n name,\n \\`node:\\${name}\\`\n]);\n\nexport default defineConfig({\n build: {\n lib: {\n entry: \"src/server.ts\",\n fileName: (format) => \\`server.\\${format === \"cjs\" ? \"cjs\" : \"js\"}\\`,\n formats: [\"es\", \"cjs\"]\n },\n rollupOptions: {\n external: [\n ...nodeBuiltins,\n \"@hold-rein/plugin-server\",\n \"@earendil-works/pi-agent-core\",\n \"@earendil-works/pi-ai\",\n \"express\"\n ]\n },\n sourcemap: true\n }\n});\n`;\n\nconst viteWebConfigTs = `import { defineConfig } from \"vite\";\n\nexport default defineConfig({\n build: {\n emptyOutDir: false,\n lib: {\n cssFileName: \"style\",\n entry: \"src/web.ts\",\n fileName: () => \"web.umd.cjs\",\n formats: [\"umd\"],\n name: \"HoldReinPlugin\"\n },\n sourcemap: true,\n rollupOptions: {\n external: [\n \"@ant-design/icons\",\n \"@hold-rein/plugin-web\",\n \"@monaco-editor/react\",\n \"antd\",\n \"monaco-editor\",\n \"react\",\n \"react-dom\",\n \"react/jsx-runtime\"\n ]\n }\n }\n});\n`;\n\nexport const initPluginPackage = (\n currentWorkingDirectory: string,\n options: InitPluginPackageOptions = {}\n): InitPluginPackageResult => {\n const targetRootDirectory = options.path ?? currentWorkingDirectory;\n const targetDirectory =\n options.name === undefined\n ? targetRootDirectory\n : join(targetRootDirectory, options.name);\n const folderName = basename(targetDirectory);\n const packageName = `hold-rein-plugin-${folderName}`;\n const packageJson = {\n ...basePackageJson,\n name: packageName\n };\n\n writeFiles(targetDirectory, {\n \"package.json\": `${JSON.stringify(packageJson, null, 2)}\\n`,\n \"tsconfig.json\": tsconfigJson,\n \"vite.config.ts\": viteConfigTs,\n \"vite.web.config.ts\": viteWebConfigTs,\n \"src/plugin-id.ts\": `export const PLUGIN_ID = \"__${folderName}__plugin\";\\n`,\n \"src/server.ts\": createServerPluginSource(),\n \"src/web.ts\": createWebPluginSource()\n });\n\n return { packageName };\n};\n\nfunction writeFiles(\n currentWorkingDirectory: string,\n files: Readonly<Record<string, string>>\n): void {\n for (const relativePath of Object.keys(files)) {\n const path = join(currentWorkingDirectory, relativePath);\n\n if (existsSync(path)) {\n throw new Error(`Refusing to overwrite existing file: ${relativePath}`);\n }\n }\n\n mkdirSync(join(currentWorkingDirectory, \"src\"), { recursive: true });\n\n for (const [relativePath, contents] of Object.entries(files)) {\n writeFileSync(join(currentWorkingDirectory, relativePath), contents);\n }\n}\n\nfunction createServerPluginSource(): string {\n return `import type { ServerPlugin } from \"@hold-rein/plugin-server\";\n\nimport { PLUGIN_ID } from \"./plugin-id\";\n\nconst serverPlugin: ServerPlugin.Plugin = {\n id: PLUGIN_ID\n};\n\nexport default serverPlugin;\n`;\n}\n\nfunction createWebPluginSource(): string {\n return `import type { WebPlugin } from \"@hold-rein/plugin-web\";\n\nimport { PLUGIN_ID } from \"./plugin-id\";\n\nconst webPlugin: WebPlugin.Plugin = {\n id: PLUGIN_ID\n};\n\nexport default webPlugin;\n`;\n}\n","import type { Router } from 'express'\nimport type { ServerPlugin } from './type'\n\nexport * from \"./type\";\nexport { loadInstalledServerPlugins } from \"./runtime/loader\";\nexport type {\n LoadedServerPlugins,\n LoadInstalledServerPluginsOptions\n} from \"./runtime/loader\";\nexport {\n copyInstalledPluginPackage,\n encodePluginDirectoryName,\n installPluginPackage,\n installNpmPluginPackage\n} from \"./runtime/installer\";\nexport type {\n CopyInstalledPluginPackageOptions,\n InstallPluginPackageOptions,\n InstallNpmPluginPackageOptions\n} from \"./runtime/installer\";\nexport { initPluginPackage } from \"./runtime/init\";\nexport type {\n InitPluginPackageOptions,\n InitPluginPackageResult\n} from \"./runtime/init\";\nexport type {\n PluginInstallCommandResult,\n PluginInstallCommandRunner,\n PluginInstallWriter\n} from \"./runtime/installer/command\";\nexport {\n discoverServerPluginManifests,\n parseServerPluginManifest\n} from \"./runtime/manifest\";\nexport { SERVER_PLUGIN_SHARED_PACKAGES } from \"./runtime/shared/packages\";\nexport { linkServerPluginSharedPackages } from \"./runtime/shared/symlinks\";\nexport type { LinkServerPluginSharedPackagesOptions } from \"./runtime/shared/symlinks\";\n\nexport interface ServerPluginRegistry {\n register: (plugin: ServerPlugin.Plugin) => void;\n list: () => ServerPlugin.Plugin[];\n get: (id: string) => ServerPlugin.Plugin | undefined;\n has: (id: string) => boolean;\n registerRoutes: (prefixRouter: Router, context: ServerPlugin.RouteContext) => Promise<void>;\n resolveContributions: (\n context: ServerPlugin.RuntimeContext\n ) => Promise<ServerPlugin.Contribution>;\n}\n\nasync function resolveContribution(\n resolver: ServerPlugin.ContributionResolver,\n context: ServerPlugin.RuntimeContext\n): Promise<ServerPlugin.Contribution> {\n if (typeof resolver === \"function\") {\n return resolver(context);\n }\n\n return resolver;\n}\n\nexport function createServerPluginRegistry(): ServerPluginRegistry {\n const plugins = new Map<string, ServerPlugin.Plugin>();\n\n return {\n register(plugin) {\n if (plugins.has(plugin.id)) {\n throw new Error(`Server plugin \"${plugin.id}\" is already registered.`);\n }\n\n plugins.set(plugin.id, plugin);\n },\n list() {\n return [...plugins.values()];\n },\n get(id) {\n return plugins.get(id);\n },\n has(id) {\n return plugins.has(id);\n },\n\n async registerRoutes(prefixRouter: Router, context: ServerPlugin.RouteContext) {\n for (const plugin of plugins.values()) {\n if (!plugin.registerRoutes) continue\n\n const route = await plugin.registerRoutes(context)\n prefixRouter.use(`/${plugin.id}`, route)\n }\n },\n\n async resolveContributions(context: ServerPlugin.RuntimeContext) {\n const tools: ServerPlugin.PluginTool[] = [];\n const skills: NonNullable<ServerPlugin.Contribution[\"skills\"]>[number][] = [];\n const skillDirs: string[] = [];\n const systemPrompts: string[] = [];\n const subscribes: NonNullable<ServerPlugin.Contribution[\"subscribe\"]>[] = [];\n const agentEndHandlers: NonNullable<ServerPlugin.Contribution[\"onAgentEnd\"]>[] = [];\n\n for (const plugin of plugins.values()) {\n if (!plugin.contributionResolver) {\n continue;\n }\n\n const contribution = await resolveContribution(\n plugin.contributionResolver,\n context\n );\n\n tools.push(...(contribution.tools ?? []));\n skills.push(...(contribution.skills ?? []));\n skillDirs.push(...(contribution.skillDirs ?? []));\n systemPrompts.push(...(contribution.systemPrompts ?? []));\n\n if (contribution.subscribe) {\n subscribes.push(contribution.subscribe);\n }\n if (contribution.onAgentEnd) {\n agentEndHandlers.push(contribution.onAgentEnd);\n }\n }\n\n const contribution: ServerPlugin.Contribution = {\n tools,\n skills,\n skillDirs,\n systemPrompts\n };\n\n return {\n ...contribution,\n ...(subscribes.length > 0\n ? {\n subscribe(event: Parameters<NonNullable<ServerPlugin.Contribution[\"subscribe\"]>>[0]) {\n for (const subscribe of subscribes) {\n subscribe(event);\n }\n }\n }\n : {}),\n ...(agentEndHandlers.length > 0\n ? {\n async onAgentEnd(input: ServerPlugin.AgentEndInput) {\n for (const onAgentEnd of agentEndHandlers) {\n const continuation = await onAgentEnd(input);\n if (continuation) {\n return continuation;\n }\n }\n\n return undefined;\n }\n }\n : {})\n };\n }\n };\n}\n"],"names":["requirePackageString","input","key","value","parseServerPluginManifest","packageManifest","packageName","version","serverEntry","resolvePackageExport","webEntry","webStyle","resolvePackageStyleExport","discoverServerPluginManifests","pluginRoot","entries","readdir","manifests","entry","join","existingFiles","paths","existing","path","access","exportsField","subpath","exportMap","exportValue","resolveExportValue","style","conditions","preferredConditions","condition","resolved","SERVER_PLUGIN_SHARED_PACKAGES","linkServerPluginSharedPackages","options","linkPath","targetPath","_a","mkdir","dirname","rm","symlink","loadInstalledServerPlugins","plugins","webPlugins","manifestPath","manifest","readFile","packageDir","entryPath","resolve","module","pathToFileURL","pluginDir","basename","toPluginAssetUrl","toPluginAssetPath","parseGithubPluginSource","source","trimmedSource","rootMatch","owner","repo","toGitRepositoryUrl","webMatch","kind","ref","pathSegments","normalizeGithubPathSegments","subdirectory","segments","segment","useSsh","execFileAsync","promisify","execFile","runInstallCommand","runner","command","args","cwd","write","formatCommand","result","ensureTrailingNewline","readValidPluginPackageManifest","packageDirectory","name","hasServerExport","createPublishedManifest","withoutPublishConfig","isBuiltPackageManifest","isSourceEntry","packageJson","publishedManifest","encodePluginDirectoryName","copyInstalledPluginPackage","destination","cp","installNpmPluginPackage","tempRoot","mkdtemp","tmpdir","installDir","writeFile","sourcePackageDir","installPluginPackage","githubSource","installGithubPluginPackage","localDirectory","resolveLocalDirectory","installLocalPluginPackage","sourceDirectory","ensurePnpmAvailable","installBuiltSourcePackage","cloneDir","installGitRepository","cloneGitRepository","directDistPackage","hasPackageManifest","stagingDir","directory","stat","runCommand","currentWorkingDirectory","isAbsolute","repositoryUrl","targetDir","basePackageJson","tsconfigJson","viteConfigTs","viteWebConfigTs","initPluginPackage","targetRootDirectory","targetDirectory","folderName","writeFiles","createServerPluginSource","createWebPluginSource","files","relativePath","existsSync","mkdirSync","contents","writeFileSync","resolveContribution","resolver","context","createServerPluginRegistry","plugin","id","prefixRouter","route","tools","skills","skillDirs","systemPrompts","subscribes","agentEndHandlers","contribution","event","subscribe","onAgentEnd","continuation"],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,700 @@
|
|
|
1
|
+
import { readdir as J, access as L, mkdir as b, rm as v, symlink as T, readFile as S, cp as E, mkdtemp as m, writeFile as A, stat as D } from "node:fs/promises";
|
|
2
|
+
import { join as o, dirname as $, resolve as M, basename as I, isAbsolute as W } from "node:path";
|
|
3
|
+
import { pathToFileURL as q } from "node:url";
|
|
4
|
+
import { tmpdir as k } from "node:os";
|
|
5
|
+
import { execFile as B } from "node:child_process";
|
|
6
|
+
import { promisify as V } from "node:util";
|
|
7
|
+
import { existsSync as F, mkdirSync as H, writeFileSync as z } from "node:fs";
|
|
8
|
+
function j(e, t) {
|
|
9
|
+
const r = e[t];
|
|
10
|
+
if (typeof r != "string")
|
|
11
|
+
throw new Error(`Plugin package "${t}" must be a string.`);
|
|
12
|
+
return r;
|
|
13
|
+
}
|
|
14
|
+
function K(e) {
|
|
15
|
+
if (!e || typeof e != "object" || Array.isArray(e))
|
|
16
|
+
throw new Error("Plugin package manifest must be an object.");
|
|
17
|
+
const t = e, r = j(t, "name"), n = j(t, "version"), s = h(
|
|
18
|
+
t.exports,
|
|
19
|
+
"./server"
|
|
20
|
+
) ?? h(t.exports, "."), i = h(t.exports, "./web"), a = Y(t.exports, "./web");
|
|
21
|
+
if (!s)
|
|
22
|
+
throw new Error('Plugin package "exports" must define a server entry.');
|
|
23
|
+
return {
|
|
24
|
+
id: r,
|
|
25
|
+
name: r,
|
|
26
|
+
packageName: r,
|
|
27
|
+
serverEntry: s,
|
|
28
|
+
version: n,
|
|
29
|
+
...i === void 0 ? {} : { webEntry: i },
|
|
30
|
+
...a === void 0 ? {} : { webStyle: a }
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
async function Q(e) {
|
|
34
|
+
const t = await J(e, { withFileTypes: !0 }).catch(
|
|
35
|
+
() => []
|
|
36
|
+
), r = [];
|
|
37
|
+
for (const n of t)
|
|
38
|
+
!n.isDirectory() || n.name === "node_modules" || r.push(o(e, n.name, "package.json"));
|
|
39
|
+
return X(r);
|
|
40
|
+
}
|
|
41
|
+
async function X(e) {
|
|
42
|
+
const t = [];
|
|
43
|
+
for (const r of e)
|
|
44
|
+
try {
|
|
45
|
+
await L(r), t.push(r);
|
|
46
|
+
} catch {
|
|
47
|
+
}
|
|
48
|
+
return t;
|
|
49
|
+
}
|
|
50
|
+
function h(e, t) {
|
|
51
|
+
if (typeof e == "string")
|
|
52
|
+
return t === "." ? e : void 0;
|
|
53
|
+
if (!e || typeof e != "object" || Array.isArray(e))
|
|
54
|
+
return;
|
|
55
|
+
const r = e, n = t === "." && !Object.keys(r).some((s) => s.startsWith(".")) ? r : r[t];
|
|
56
|
+
return O(n);
|
|
57
|
+
}
|
|
58
|
+
function Y(e, t) {
|
|
59
|
+
if (!e || typeof e != "object" || Array.isArray(e))
|
|
60
|
+
return;
|
|
61
|
+
const n = e[t];
|
|
62
|
+
if (!n || typeof n != "object" || Array.isArray(n))
|
|
63
|
+
return;
|
|
64
|
+
const i = n.style;
|
|
65
|
+
return typeof i == "string" ? i : void 0;
|
|
66
|
+
}
|
|
67
|
+
function O(e) {
|
|
68
|
+
if (typeof e == "string")
|
|
69
|
+
return e;
|
|
70
|
+
if (!e || typeof e != "object" || Array.isArray(e))
|
|
71
|
+
return;
|
|
72
|
+
const t = e, r = ["import", "default", "module"];
|
|
73
|
+
for (const n of r) {
|
|
74
|
+
const s = O(t[n]);
|
|
75
|
+
if (s)
|
|
76
|
+
return s;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const Z = [
|
|
80
|
+
"@hold-rein/plugin-server",
|
|
81
|
+
"@earendil-works/pi-agent-core",
|
|
82
|
+
"@earendil-works/pi-ai",
|
|
83
|
+
"express"
|
|
84
|
+
];
|
|
85
|
+
async function ee(e) {
|
|
86
|
+
var t;
|
|
87
|
+
for (const r of e.packages ?? Z) {
|
|
88
|
+
const n = o(
|
|
89
|
+
e.pluginRoot,
|
|
90
|
+
"node_modules",
|
|
91
|
+
...r.split("/")
|
|
92
|
+
), s = ((t = e.resolvePackageTarget) == null ? void 0 : t.call(e, r)) ?? o(e.hostNodeModules, ...r.split("/"));
|
|
93
|
+
await b($(n), { recursive: !0 }), await v(n, { force: !0, recursive: !0 }), await T(s, n, "junction");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
async function De(e) {
|
|
97
|
+
await ee({
|
|
98
|
+
hostNodeModules: e.hostNodeModules,
|
|
99
|
+
pluginRoot: e.pluginRoot,
|
|
100
|
+
...e.resolvePackageTarget === void 0 ? {} : { resolvePackageTarget: e.resolvePackageTarget }
|
|
101
|
+
});
|
|
102
|
+
const t = await Q(e.pluginRoot), r = [], n = [];
|
|
103
|
+
for (const s of t) {
|
|
104
|
+
const i = K(
|
|
105
|
+
JSON.parse(await S(s, "utf8"))
|
|
106
|
+
), a = $(s), l = M(a, i.serverEntry), d = await import((e.toImportUrl ?? ((c) => q(c).href))(l));
|
|
107
|
+
if (!d.default)
|
|
108
|
+
throw new Error(
|
|
109
|
+
`Plugin "${i.id}" does not export a default plugin.`
|
|
110
|
+
);
|
|
111
|
+
if (r.push(d.default), i.webEntry) {
|
|
112
|
+
const c = I(a);
|
|
113
|
+
n.push({
|
|
114
|
+
id: i.id,
|
|
115
|
+
name: i.name,
|
|
116
|
+
packageName: i.packageName,
|
|
117
|
+
version: i.version,
|
|
118
|
+
webEntry: x(c, i.webEntry),
|
|
119
|
+
...i.webStyle === void 0 ? {} : { webStyle: x(c, i.webStyle) }
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return { plugins: r, webPlugins: n };
|
|
124
|
+
}
|
|
125
|
+
function x(e, t) {
|
|
126
|
+
return `/plugin-assets/${encodeURIComponent(e)}/${te(
|
|
127
|
+
t
|
|
128
|
+
)}`;
|
|
129
|
+
}
|
|
130
|
+
function te(e) {
|
|
131
|
+
return e.replace(/^\.\//, "").replace(/^dist\//, "");
|
|
132
|
+
}
|
|
133
|
+
function re(e) {
|
|
134
|
+
const t = e.trim(), r = /^https:\/\/github\.com\/(?<owner>[^/\s]+)\/(?<repo>[^/\s]+?)(?:\.git)?\/?$/u.exec(
|
|
135
|
+
t
|
|
136
|
+
) ?? /^git@github\.com:(?<owner>[^/\s]+)\/(?<repo>[^/\s]+?)(?:\.git)?$/u.exec(
|
|
137
|
+
t
|
|
138
|
+
);
|
|
139
|
+
if (r != null && r.groups) {
|
|
140
|
+
const { owner: p, repo: P } = r.groups;
|
|
141
|
+
return !p || !P ? void 0 : {
|
|
142
|
+
repositoryUrl: R(
|
|
143
|
+
p,
|
|
144
|
+
P,
|
|
145
|
+
t.startsWith("git@github.com:")
|
|
146
|
+
)
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const n = /^https:\/\/github\.com\/(?<owner>[^/\s]+)\/(?<repo>[^/\s]+)\/(?<kind>tree|blob)\/(?<ref>[^/\s]+)(?:\/(?<path>.*))?\/?$/u.exec(
|
|
150
|
+
t
|
|
151
|
+
);
|
|
152
|
+
if (!(n != null && n.groups))
|
|
153
|
+
return;
|
|
154
|
+
const { kind: s, owner: i, path: a, ref: l, repo: d } = n.groups;
|
|
155
|
+
if (!s || !i || !l || !d)
|
|
156
|
+
return;
|
|
157
|
+
const c = ne(a), u = s === "blob" && c.at(-1) === "package.json" ? c.slice(0, -1).join("/") : c.join("/");
|
|
158
|
+
return {
|
|
159
|
+
ref: l,
|
|
160
|
+
repositoryUrl: R(i, d),
|
|
161
|
+
...u.length === 0 ? {} : { subdirectory: u }
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function ne(e) {
|
|
165
|
+
if (!e)
|
|
166
|
+
return [];
|
|
167
|
+
const t = e.split("/").filter((r) => r.length > 0);
|
|
168
|
+
return t.some((r) => r === "." || r === "..") ? [] : t;
|
|
169
|
+
}
|
|
170
|
+
function R(e, t, r = !1) {
|
|
171
|
+
return r ? `git@github.com:${e}/${t}.git` : `https://github.com/${e}/${t}.git`;
|
|
172
|
+
}
|
|
173
|
+
const ie = V(B);
|
|
174
|
+
async function g(e, t, r, n, s) {
|
|
175
|
+
s == null || s(`Running: ${se(t, r)}
|
|
176
|
+
`);
|
|
177
|
+
const i = e ? await e(t, r, n) : await ie(t, [...r], { cwd: n });
|
|
178
|
+
i != null && i.stdout && (s == null || s(C(i.stdout))), i != null && i.stderr && (s == null || s(C(i.stderr)));
|
|
179
|
+
}
|
|
180
|
+
function se(e, t) {
|
|
181
|
+
return [e, ...t].join(" ");
|
|
182
|
+
}
|
|
183
|
+
function C(e) {
|
|
184
|
+
return e.endsWith(`
|
|
185
|
+
`) ? e : `${e}
|
|
186
|
+
`;
|
|
187
|
+
}
|
|
188
|
+
async function f(e) {
|
|
189
|
+
const t = JSON.parse(
|
|
190
|
+
await S(o(e, "package.json"), "utf8")
|
|
191
|
+
);
|
|
192
|
+
if (!t || typeof t != "object" || Array.isArray(t))
|
|
193
|
+
throw new Error("Plugin package manifest must be an object.");
|
|
194
|
+
const r = t, n = r.name;
|
|
195
|
+
if (typeof n != "string" || n.length === 0)
|
|
196
|
+
throw new Error('Plugin package "name" must be a string.');
|
|
197
|
+
if (!ce(r.exports))
|
|
198
|
+
throw new Error('Plugin package "exports" must define "./server".');
|
|
199
|
+
return {
|
|
200
|
+
exports: r.exports,
|
|
201
|
+
name: n,
|
|
202
|
+
packageJson: r,
|
|
203
|
+
publishConfig: r.publishConfig
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
function oe(e) {
|
|
207
|
+
return e.publishConfig && typeof e.publishConfig == "object" && !Array.isArray(e.publishConfig) ? {
|
|
208
|
+
...N(e.packageJson),
|
|
209
|
+
...e.publishConfig,
|
|
210
|
+
name: e.name
|
|
211
|
+
} : N(e.packageJson);
|
|
212
|
+
}
|
|
213
|
+
function ae(e) {
|
|
214
|
+
const t = w(
|
|
215
|
+
e.exports["./server"]
|
|
216
|
+
);
|
|
217
|
+
return !!(t && !ue(t));
|
|
218
|
+
}
|
|
219
|
+
function ce(e) {
|
|
220
|
+
return !e || typeof e != "object" || Array.isArray(e) ? !1 : Object.hasOwn(e, "./server");
|
|
221
|
+
}
|
|
222
|
+
function N(e) {
|
|
223
|
+
const t = { ...e };
|
|
224
|
+
return delete t.publishConfig, t;
|
|
225
|
+
}
|
|
226
|
+
function ue(e) {
|
|
227
|
+
return e.startsWith("./src/") || e.includes("/src/") || e.endsWith(".ts") || e.endsWith(".tsx");
|
|
228
|
+
}
|
|
229
|
+
function w(e) {
|
|
230
|
+
if (typeof e == "string")
|
|
231
|
+
return e;
|
|
232
|
+
if (!e || typeof e != "object" || Array.isArray(e))
|
|
233
|
+
return;
|
|
234
|
+
const t = e;
|
|
235
|
+
return w(t.import) ?? w(t.default) ?? w(t.module);
|
|
236
|
+
}
|
|
237
|
+
function le(e) {
|
|
238
|
+
return e.replaceAll("/", "__");
|
|
239
|
+
}
|
|
240
|
+
async function y(e) {
|
|
241
|
+
var r;
|
|
242
|
+
const t = o(
|
|
243
|
+
e.pluginRoot,
|
|
244
|
+
le(e.packageName)
|
|
245
|
+
);
|
|
246
|
+
return await b(e.pluginRoot, { recursive: !0 }), await v(t, { force: !0, recursive: !0 }), (r = e.write) == null || r.call(
|
|
247
|
+
e,
|
|
248
|
+
`Copying plugin files: ${e.sourcePackageDir} -> ${t}
|
|
249
|
+
`
|
|
250
|
+
), await E(e.sourcePackageDir, t, { recursive: !0 }), t;
|
|
251
|
+
}
|
|
252
|
+
async function ge(e) {
|
|
253
|
+
const t = e.tempRoot ?? await m(o(k(), "hold-rein-plugin-"));
|
|
254
|
+
await b(t, { recursive: !0 });
|
|
255
|
+
const r = await m(o(t, "install-"));
|
|
256
|
+
await A(
|
|
257
|
+
o(r, "package.json"),
|
|
258
|
+
JSON.stringify({ private: !0, type: "module" }, null, 2)
|
|
259
|
+
), await g(
|
|
260
|
+
e.runCommand,
|
|
261
|
+
"npm",
|
|
262
|
+
["install", e.packageName, "--ignore-scripts"],
|
|
263
|
+
r,
|
|
264
|
+
e.write
|
|
265
|
+
);
|
|
266
|
+
const n = o(
|
|
267
|
+
r,
|
|
268
|
+
"node_modules",
|
|
269
|
+
...e.packageName.split("/")
|
|
270
|
+
);
|
|
271
|
+
return await f(n), y({
|
|
272
|
+
packageName: e.packageName,
|
|
273
|
+
pluginRoot: e.pluginRoot,
|
|
274
|
+
sourcePackageDir: n,
|
|
275
|
+
write: e.write
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
async function $e(e) {
|
|
279
|
+
const t = re(e.source);
|
|
280
|
+
if (t)
|
|
281
|
+
return fe(e, t);
|
|
282
|
+
const r = await G(
|
|
283
|
+
e.source,
|
|
284
|
+
e.currentWorkingDirectory
|
|
285
|
+
);
|
|
286
|
+
return r ? de(e, r) : ge({
|
|
287
|
+
packageName: e.source,
|
|
288
|
+
pluginRoot: e.pluginRoot,
|
|
289
|
+
...e.runCommand === void 0 ? {} : { runCommand: e.runCommand },
|
|
290
|
+
...e.tempRoot === void 0 ? {} : { tempRoot: e.tempRoot },
|
|
291
|
+
...e.write === void 0 ? {} : { write: e.write }
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
async function de(e, t) {
|
|
295
|
+
return await f(t), await U(e.runCommand, t, e.write), await g(
|
|
296
|
+
e.runCommand,
|
|
297
|
+
"pnpm",
|
|
298
|
+
["install"],
|
|
299
|
+
t,
|
|
300
|
+
e.write
|
|
301
|
+
), await g(
|
|
302
|
+
e.runCommand,
|
|
303
|
+
"pnpm",
|
|
304
|
+
["build"],
|
|
305
|
+
t,
|
|
306
|
+
e.write
|
|
307
|
+
), _(t, e.pluginRoot, e.write);
|
|
308
|
+
}
|
|
309
|
+
async function fe(e, t) {
|
|
310
|
+
const r = e.tempRoot ?? await m(o(k(), "hold-rein-plugin-"));
|
|
311
|
+
await b(r, { recursive: !0 });
|
|
312
|
+
const n = await m(o(r, "github-")), s = e.installGitRepository ?? me;
|
|
313
|
+
try {
|
|
314
|
+
t.ref ? await s(
|
|
315
|
+
t.repositoryUrl,
|
|
316
|
+
n,
|
|
317
|
+
t.ref
|
|
318
|
+
) : await s(t.repositoryUrl, n);
|
|
319
|
+
const i = t.subdirectory === void 0 ? n : o(n, t.subdirectory), a = await f(i);
|
|
320
|
+
return ae(a) ? await y({
|
|
321
|
+
packageName: a.name,
|
|
322
|
+
pluginRoot: e.pluginRoot,
|
|
323
|
+
sourcePackageDir: i,
|
|
324
|
+
write: e.write
|
|
325
|
+
}) : (await U(e.runCommand, i, e.write), await g(
|
|
326
|
+
e.runCommand,
|
|
327
|
+
"pnpm",
|
|
328
|
+
["install"],
|
|
329
|
+
i,
|
|
330
|
+
e.write
|
|
331
|
+
), await g(
|
|
332
|
+
e.runCommand,
|
|
333
|
+
"pnpm",
|
|
334
|
+
["build"],
|
|
335
|
+
i,
|
|
336
|
+
e.write
|
|
337
|
+
), await _(
|
|
338
|
+
i,
|
|
339
|
+
e.pluginRoot,
|
|
340
|
+
e.write
|
|
341
|
+
));
|
|
342
|
+
} finally {
|
|
343
|
+
await v(n, { force: !0, recursive: !0 });
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
async function _(e, t, r) {
|
|
347
|
+
const n = await G(
|
|
348
|
+
o(e, "dist")
|
|
349
|
+
);
|
|
350
|
+
if (n && await pe(n)) {
|
|
351
|
+
const a = await f(n);
|
|
352
|
+
return y({
|
|
353
|
+
packageName: a.name,
|
|
354
|
+
pluginRoot: t,
|
|
355
|
+
sourcePackageDir: n,
|
|
356
|
+
write: r
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
const s = await f(e), i = await m(o(k(), "hold-rein-plugin-package-"));
|
|
360
|
+
try {
|
|
361
|
+
return await A(
|
|
362
|
+
o(i, "package.json"),
|
|
363
|
+
`${JSON.stringify(oe(s), null, 2)}
|
|
364
|
+
`
|
|
365
|
+
), await E(o(e, "dist"), o(i, "dist"), {
|
|
366
|
+
recursive: !0
|
|
367
|
+
}), await f(i), await y({
|
|
368
|
+
packageName: s.name,
|
|
369
|
+
pluginRoot: t,
|
|
370
|
+
sourcePackageDir: i,
|
|
371
|
+
write: r
|
|
372
|
+
});
|
|
373
|
+
} finally {
|
|
374
|
+
await v(i, { force: !0, recursive: !0 });
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
async function pe(e) {
|
|
378
|
+
try {
|
|
379
|
+
return await D(o(e, "package.json")), !0;
|
|
380
|
+
} catch {
|
|
381
|
+
return !1;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
async function U(e, t, r) {
|
|
385
|
+
try {
|
|
386
|
+
await g(e, "pnpm", ["--version"], t, r);
|
|
387
|
+
} catch {
|
|
388
|
+
try {
|
|
389
|
+
await g(
|
|
390
|
+
e,
|
|
391
|
+
"npm",
|
|
392
|
+
["install", "--global", "pnpm"],
|
|
393
|
+
t,
|
|
394
|
+
r
|
|
395
|
+
);
|
|
396
|
+
} catch {
|
|
397
|
+
throw new Error("pnpm is required to build plugin sources");
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
async function G(e, t = process.cwd()) {
|
|
402
|
+
const r = W(e) ? e : M(t, e);
|
|
403
|
+
try {
|
|
404
|
+
return (await D(r)).isDirectory() ? r : void 0;
|
|
405
|
+
} catch {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
async function me(e, t) {
|
|
410
|
+
await g(
|
|
411
|
+
void 0,
|
|
412
|
+
"git",
|
|
413
|
+
["clone", "--depth", "1", e, t],
|
|
414
|
+
process.cwd()
|
|
415
|
+
);
|
|
416
|
+
}
|
|
417
|
+
const we = {
|
|
418
|
+
name: "@hold-rein/plugins-base",
|
|
419
|
+
version: "0.0.0",
|
|
420
|
+
private: !0,
|
|
421
|
+
type: "module",
|
|
422
|
+
main: "./src/server.ts",
|
|
423
|
+
module: "./src/server.ts",
|
|
424
|
+
types: "./src/server.ts",
|
|
425
|
+
exports: {
|
|
426
|
+
"./server": {
|
|
427
|
+
types: "./src/server.ts",
|
|
428
|
+
import: "./src/server.ts",
|
|
429
|
+
require: "./src/server.ts"
|
|
430
|
+
},
|
|
431
|
+
"./web": {
|
|
432
|
+
types: "./src/web.ts",
|
|
433
|
+
style: "./dist/style.css",
|
|
434
|
+
import: "./src/web.ts",
|
|
435
|
+
require: "./src/web.ts"
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
files: ["dist"],
|
|
439
|
+
publishConfig: {
|
|
440
|
+
access: "restricted",
|
|
441
|
+
main: "./dist/server.cjs",
|
|
442
|
+
module: "./dist/server.js",
|
|
443
|
+
types: "./dist/server.d.ts",
|
|
444
|
+
exports: {
|
|
445
|
+
"./server": {
|
|
446
|
+
types: "./dist/server.d.ts",
|
|
447
|
+
import: "./dist/server.js",
|
|
448
|
+
require: "./dist/server.cjs"
|
|
449
|
+
},
|
|
450
|
+
"./web": {
|
|
451
|
+
types: "./dist/web.d.ts",
|
|
452
|
+
style: "./dist/style.css",
|
|
453
|
+
default: "./dist/web.umd.cjs",
|
|
454
|
+
require: "./dist/web.umd.cjs"
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
},
|
|
458
|
+
scripts: {
|
|
459
|
+
build: "vite build --config vite.config.ts && vite build --config vite.web.config.ts && tsc -p tsconfig.json --emitDeclarationOnly",
|
|
460
|
+
typecheck: "tsc -p tsconfig.json --noEmit"
|
|
461
|
+
},
|
|
462
|
+
peerDependencies: {
|
|
463
|
+
"@earendil-works/pi-agent-core": "0.75.4",
|
|
464
|
+
"@earendil-works/pi-ai": "0.76.0",
|
|
465
|
+
"@hold-rein/plugin-server": "workspace:^",
|
|
466
|
+
express: "5.2.1",
|
|
467
|
+
"@ant-design/icons": "6.2.5",
|
|
468
|
+
"@hold-rein/plugin-web": "workspace:^",
|
|
469
|
+
"@monaco-editor/react": "4.7.0",
|
|
470
|
+
antd: "6.4.3",
|
|
471
|
+
"monaco-editor": "0.55.1",
|
|
472
|
+
react: "19.2.6",
|
|
473
|
+
"react-dom": "19.2.6"
|
|
474
|
+
},
|
|
475
|
+
devDependencies: {
|
|
476
|
+
"@earendil-works/pi-agent-core": "0.75.4",
|
|
477
|
+
"@earendil-works/pi-ai": "0.76.0",
|
|
478
|
+
"@hold-rein/plugin-server": "workspace:^",
|
|
479
|
+
express: "5.2.1",
|
|
480
|
+
vite: "6.3.5",
|
|
481
|
+
"@ant-design/icons": "6.2.5",
|
|
482
|
+
"@hold-rein/plugin-web": "workspace:^",
|
|
483
|
+
"@monaco-editor/react": "4.7.0",
|
|
484
|
+
"@types/react": "19.2.15",
|
|
485
|
+
antd: "6.4.3",
|
|
486
|
+
"monaco-editor": "0.55.1",
|
|
487
|
+
react: "19.2.6",
|
|
488
|
+
"react-dom": "19.2.6"
|
|
489
|
+
}
|
|
490
|
+
}, ye = `{
|
|
491
|
+
"compilerOptions": {
|
|
492
|
+
"declaration": true,
|
|
493
|
+
"declarationMap": true,
|
|
494
|
+
"esModuleInterop": true,
|
|
495
|
+
"exactOptionalPropertyTypes": true,
|
|
496
|
+
"forceConsistentCasingInFileNames": true,
|
|
497
|
+
"isolatedModules": true,
|
|
498
|
+
"module": "ESNext",
|
|
499
|
+
"moduleResolution": "Bundler",
|
|
500
|
+
"noFallthroughCasesInSwitch": true,
|
|
501
|
+
"noImplicitOverride": true,
|
|
502
|
+
"noUncheckedIndexedAccess": true,
|
|
503
|
+
"resolveJsonModule": true,
|
|
504
|
+
"skipLibCheck": true,
|
|
505
|
+
"strict": true,
|
|
506
|
+
"target": "ES2022",
|
|
507
|
+
"useDefineForClassFields": true,
|
|
508
|
+
"verbatimModuleSyntax": true,
|
|
509
|
+
"jsx": "react-jsx",
|
|
510
|
+
"lib": ["DOM", "DOM.Iterable", "ES2022"],
|
|
511
|
+
"outDir": "dist",
|
|
512
|
+
"rootDir": "src"
|
|
513
|
+
},
|
|
514
|
+
"include": ["src/**/*.ts", "src/**/*.tsx"],
|
|
515
|
+
"exclude": ["src/**/*.test.ts", "src/**/*.test.tsx"]
|
|
516
|
+
}
|
|
517
|
+
`, be = `import { builtinModules } from "node:module";
|
|
518
|
+
|
|
519
|
+
import { defineConfig } from "vite";
|
|
520
|
+
|
|
521
|
+
const nodeBuiltins = builtinModules.flatMap((name) => [
|
|
522
|
+
name,
|
|
523
|
+
\`node:\${name}\`
|
|
524
|
+
]);
|
|
525
|
+
|
|
526
|
+
export default defineConfig({
|
|
527
|
+
build: {
|
|
528
|
+
lib: {
|
|
529
|
+
entry: "src/server.ts",
|
|
530
|
+
fileName: (format) => \`server.\${format === "cjs" ? "cjs" : "js"}\`,
|
|
531
|
+
formats: ["es", "cjs"]
|
|
532
|
+
},
|
|
533
|
+
rollupOptions: {
|
|
534
|
+
external: [
|
|
535
|
+
...nodeBuiltins,
|
|
536
|
+
"@hold-rein/plugin-server",
|
|
537
|
+
"@earendil-works/pi-agent-core",
|
|
538
|
+
"@earendil-works/pi-ai",
|
|
539
|
+
"express"
|
|
540
|
+
]
|
|
541
|
+
},
|
|
542
|
+
sourcemap: true
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
`, ve = `import { defineConfig } from "vite";
|
|
546
|
+
|
|
547
|
+
export default defineConfig({
|
|
548
|
+
build: {
|
|
549
|
+
emptyOutDir: false,
|
|
550
|
+
lib: {
|
|
551
|
+
cssFileName: "style",
|
|
552
|
+
entry: "src/web.ts",
|
|
553
|
+
fileName: () => "web.umd.cjs",
|
|
554
|
+
formats: ["umd"],
|
|
555
|
+
name: "HoldReinPlugin"
|
|
556
|
+
},
|
|
557
|
+
sourcemap: true,
|
|
558
|
+
rollupOptions: {
|
|
559
|
+
external: [
|
|
560
|
+
"@ant-design/icons",
|
|
561
|
+
"@hold-rein/plugin-web",
|
|
562
|
+
"@monaco-editor/react",
|
|
563
|
+
"antd",
|
|
564
|
+
"monaco-editor",
|
|
565
|
+
"react",
|
|
566
|
+
"react-dom",
|
|
567
|
+
"react/jsx-runtime"
|
|
568
|
+
]
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
});
|
|
572
|
+
`, Me = (e, t = {}) => {
|
|
573
|
+
const r = t.path ?? e, n = t.name === void 0 ? r : o(r, t.name), s = I(n), i = `hold-rein-plugin-${s}`, a = {
|
|
574
|
+
...we,
|
|
575
|
+
name: i
|
|
576
|
+
};
|
|
577
|
+
return he(n, {
|
|
578
|
+
"package.json": `${JSON.stringify(a, null, 2)}
|
|
579
|
+
`,
|
|
580
|
+
"tsconfig.json": ye,
|
|
581
|
+
"vite.config.ts": be,
|
|
582
|
+
"vite.web.config.ts": ve,
|
|
583
|
+
"src/plugin-id.ts": `export const PLUGIN_ID = "__${s}__plugin";
|
|
584
|
+
`,
|
|
585
|
+
"src/server.ts": ke(),
|
|
586
|
+
"src/web.ts": Pe()
|
|
587
|
+
}), { packageName: i };
|
|
588
|
+
};
|
|
589
|
+
function he(e, t) {
|
|
590
|
+
for (const r of Object.keys(t)) {
|
|
591
|
+
const n = o(e, r);
|
|
592
|
+
if (F(n))
|
|
593
|
+
throw new Error(`Refusing to overwrite existing file: ${r}`);
|
|
594
|
+
}
|
|
595
|
+
H(o(e, "src"), { recursive: !0 });
|
|
596
|
+
for (const [r, n] of Object.entries(t))
|
|
597
|
+
z(o(e, r), n);
|
|
598
|
+
}
|
|
599
|
+
function ke() {
|
|
600
|
+
return `import type { ServerPlugin } from "@hold-rein/plugin-server";
|
|
601
|
+
|
|
602
|
+
import { PLUGIN_ID } from "./plugin-id";
|
|
603
|
+
|
|
604
|
+
const serverPlugin: ServerPlugin.Plugin = {
|
|
605
|
+
id: PLUGIN_ID
|
|
606
|
+
};
|
|
607
|
+
|
|
608
|
+
export default serverPlugin;
|
|
609
|
+
`;
|
|
610
|
+
}
|
|
611
|
+
function Pe() {
|
|
612
|
+
return `import type { WebPlugin } from "@hold-rein/plugin-web";
|
|
613
|
+
|
|
614
|
+
import { PLUGIN_ID } from "./plugin-id";
|
|
615
|
+
|
|
616
|
+
const webPlugin: WebPlugin.Plugin = {
|
|
617
|
+
id: PLUGIN_ID
|
|
618
|
+
};
|
|
619
|
+
|
|
620
|
+
export default webPlugin;
|
|
621
|
+
`;
|
|
622
|
+
}
|
|
623
|
+
async function je(e, t) {
|
|
624
|
+
return typeof e == "function" ? e(t) : e;
|
|
625
|
+
}
|
|
626
|
+
function Ie() {
|
|
627
|
+
const e = /* @__PURE__ */ new Map();
|
|
628
|
+
return {
|
|
629
|
+
register(t) {
|
|
630
|
+
if (e.has(t.id))
|
|
631
|
+
throw new Error(`Server plugin "${t.id}" is already registered.`);
|
|
632
|
+
e.set(t.id, t);
|
|
633
|
+
},
|
|
634
|
+
list() {
|
|
635
|
+
return [...e.values()];
|
|
636
|
+
},
|
|
637
|
+
get(t) {
|
|
638
|
+
return e.get(t);
|
|
639
|
+
},
|
|
640
|
+
has(t) {
|
|
641
|
+
return e.has(t);
|
|
642
|
+
},
|
|
643
|
+
async registerRoutes(t, r) {
|
|
644
|
+
for (const n of e.values()) {
|
|
645
|
+
if (!n.registerRoutes) continue;
|
|
646
|
+
const s = await n.registerRoutes(r);
|
|
647
|
+
t.use(`/${n.id}`, s);
|
|
648
|
+
}
|
|
649
|
+
},
|
|
650
|
+
async resolveContributions(t) {
|
|
651
|
+
const r = [], n = [], s = [], i = [], a = [], l = [];
|
|
652
|
+
for (const c of e.values()) {
|
|
653
|
+
if (!c.contributionResolver)
|
|
654
|
+
continue;
|
|
655
|
+
const u = await je(
|
|
656
|
+
c.contributionResolver,
|
|
657
|
+
t
|
|
658
|
+
);
|
|
659
|
+
r.push(...u.tools ?? []), n.push(...u.skills ?? []), s.push(...u.skillDirs ?? []), i.push(...u.systemPrompts ?? []), u.subscribe && a.push(u.subscribe), u.onAgentEnd && l.push(u.onAgentEnd);
|
|
660
|
+
}
|
|
661
|
+
return {
|
|
662
|
+
...{
|
|
663
|
+
tools: r,
|
|
664
|
+
skills: n,
|
|
665
|
+
skillDirs: s,
|
|
666
|
+
systemPrompts: i
|
|
667
|
+
},
|
|
668
|
+
...a.length > 0 ? {
|
|
669
|
+
subscribe(c) {
|
|
670
|
+
for (const u of a)
|
|
671
|
+
u(c);
|
|
672
|
+
}
|
|
673
|
+
} : {},
|
|
674
|
+
...l.length > 0 ? {
|
|
675
|
+
async onAgentEnd(c) {
|
|
676
|
+
for (const u of l) {
|
|
677
|
+
const p = await u(c);
|
|
678
|
+
if (p)
|
|
679
|
+
return p;
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
} : {}
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
};
|
|
686
|
+
}
|
|
687
|
+
export {
|
|
688
|
+
Z as SERVER_PLUGIN_SHARED_PACKAGES,
|
|
689
|
+
y as copyInstalledPluginPackage,
|
|
690
|
+
Ie as createServerPluginRegistry,
|
|
691
|
+
Q as discoverServerPluginManifests,
|
|
692
|
+
le as encodePluginDirectoryName,
|
|
693
|
+
Me as initPluginPackage,
|
|
694
|
+
ge as installNpmPluginPackage,
|
|
695
|
+
$e as installPluginPackage,
|
|
696
|
+
ee as linkServerPluginSharedPackages,
|
|
697
|
+
De as loadInstalledServerPlugins,
|
|
698
|
+
K as parseServerPluginManifest
|
|
699
|
+
};
|
|
700
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/runtime/manifest/index.ts","../src/runtime/shared/packages.ts","../src/runtime/shared/symlinks.ts","../src/runtime/loader/index.ts","../src/runtime/installer/github-source.ts","../src/runtime/installer/command.ts","../src/runtime/manifest/package.ts","../src/runtime/installer/index.ts","../src/runtime/init/index.ts","../src/index.ts"],"sourcesContent":["import { access, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport type { PackageEntryManifest } from \"../../type\";\n\nfunction requirePackageString(\n input: Record<string, unknown>,\n key: string\n): string {\n const value = input[key];\n if (typeof value !== \"string\") {\n throw new Error(`Plugin package \"${key}\" must be a string.`);\n }\n\n return value;\n}\n\nexport function parseServerPluginManifest(\n input: unknown\n): PackageEntryManifest {\n if (!input || typeof input !== \"object\" || Array.isArray(input)) {\n throw new Error(\"Plugin package manifest must be an object.\");\n }\n\n const packageManifest = input as Record<string, unknown>;\n const packageName = requirePackageString(packageManifest, \"name\");\n const version = requirePackageString(packageManifest, \"version\");\n const serverEntry = resolvePackageExport(\n packageManifest.exports,\n \"./server\"\n ) ?? resolvePackageExport(packageManifest.exports, \".\");\n const webEntry = resolvePackageExport(packageManifest.exports, \"./web\");\n const webStyle = resolvePackageStyleExport(packageManifest.exports, \"./web\");\n\n if (!serverEntry) {\n throw new Error('Plugin package \"exports\" must define a server entry.');\n }\n\n return {\n id: packageName,\n name: packageName,\n packageName,\n serverEntry,\n version,\n ...(webEntry === undefined ? {} : { webEntry }),\n ...(webStyle === undefined ? {} : { webStyle })\n };\n}\n\nexport async function discoverServerPluginManifests(\n pluginRoot: string\n): Promise<string[]> {\n const entries = await readdir(pluginRoot, { withFileTypes: true }).catch(\n () => []\n );\n const manifests: string[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name === \"node_modules\") {\n continue;\n }\n\n manifests.push(join(pluginRoot, entry.name, \"package.json\"));\n }\n\n return existingFiles(manifests);\n}\n\nasync function existingFiles(paths: readonly string[]): Promise<string[]> {\n const existing: string[] = [];\n\n for (const path of paths) {\n try {\n await access(path);\n existing.push(path);\n } catch {\n // Missing package manifests are ignored during discovery.\n }\n }\n\n return existing;\n}\n\nfunction resolvePackageExport(\n exportsField: unknown,\n subpath: \".\" | \"./server\" | \"./web\"\n): string | undefined {\n if (typeof exportsField === \"string\") {\n return subpath === \".\" ? exportsField : undefined;\n }\n if (\n !exportsField ||\n typeof exportsField !== \"object\" ||\n Array.isArray(exportsField)\n ) {\n return undefined;\n }\n\n const exportMap = exportsField as Record<string, unknown>;\n const exportValue =\n subpath === \".\" && !Object.keys(exportMap).some((key) => key.startsWith(\".\"))\n ? exportMap\n : exportMap[subpath];\n\n return resolveExportValue(exportValue);\n}\n\nfunction resolvePackageStyleExport(\n exportsField: unknown,\n subpath: \"./web\"\n): string | undefined {\n if (\n !exportsField ||\n typeof exportsField !== \"object\" ||\n Array.isArray(exportsField)\n ) {\n return undefined;\n }\n\n const exportMap = exportsField as Record<string, unknown>;\n const exportValue = exportMap[subpath];\n\n if (\n !exportValue ||\n typeof exportValue !== \"object\" ||\n Array.isArray(exportValue)\n ) {\n return undefined;\n }\n\n const conditions = exportValue as Record<string, unknown>;\n const style = conditions.style;\n\n return typeof style === \"string\" ? style : undefined;\n}\n\nfunction resolveExportValue(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return value;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n const conditions = value as Record<string, unknown>;\n const preferredConditions = [\"import\", \"default\", \"module\"] as const;\n\n for (const condition of preferredConditions) {\n const resolved = resolveExportValue(conditions[condition]);\n if (resolved) {\n return resolved;\n }\n }\n\n return undefined;\n}\n","export const SERVER_PLUGIN_SHARED_PACKAGES = [\n \"@hold-rein/plugin-server\",\n \"@earendil-works/pi-agent-core\",\n \"@earendil-works/pi-ai\",\n \"express\"\n] as const;\n","import { mkdir, rm, symlink } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport { SERVER_PLUGIN_SHARED_PACKAGES } from \"./packages\";\n\nexport interface LinkServerPluginSharedPackagesOptions {\n readonly hostNodeModules: string;\n readonly packages?: readonly string[];\n readonly pluginRoot: string;\n readonly resolvePackageTarget?: (packageName: string) => string;\n}\n\nexport async function linkServerPluginSharedPackages(\n options: LinkServerPluginSharedPackagesOptions\n): Promise<void> {\n for (const packageName of options.packages ?? SERVER_PLUGIN_SHARED_PACKAGES) {\n const linkPath = join(\n options.pluginRoot,\n \"node_modules\",\n ...packageName.split(\"/\")\n );\n const targetPath =\n options.resolvePackageTarget?.(packageName) ??\n join(options.hostNodeModules, ...packageName.split(\"/\"));\n\n await mkdir(dirname(linkPath), { recursive: true });\n await rm(linkPath, { force: true, recursive: true });\n await symlink(targetPath, linkPath, \"junction\");\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, dirname, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type { RuntimePluginManifest, ServerPlugin } from \"../../type\";\nimport {\n discoverServerPluginManifests,\n parseServerPluginManifest\n} from \"../manifest\";\nimport { linkServerPluginSharedPackages } from \"../shared/symlinks\";\n\nexport interface LoadInstalledServerPluginsOptions {\n readonly hostNodeModules: string;\n readonly pluginRoot: string;\n readonly resolvePackageTarget?: (packageName: string) => string;\n readonly toImportUrl?: (path: string) => string;\n}\n\nexport interface LoadedServerPlugins {\n readonly plugins: ServerPlugin.Plugin[];\n readonly webPlugins: RuntimePluginManifest[];\n}\n\nexport async function loadInstalledServerPlugins(\n options: LoadInstalledServerPluginsOptions\n): Promise<LoadedServerPlugins> {\n await linkServerPluginSharedPackages({\n hostNodeModules: options.hostNodeModules,\n pluginRoot: options.pluginRoot,\n ...(options.resolvePackageTarget === undefined\n ? {}\n : { resolvePackageTarget: options.resolvePackageTarget })\n });\n\n const manifests = await discoverServerPluginManifests(options.pluginRoot);\n const plugins: ServerPlugin.Plugin[] = [];\n const webPlugins: RuntimePluginManifest[] = [];\n\n for (const manifestPath of manifests) {\n const manifest = parseServerPluginManifest(\n JSON.parse(await readFile(manifestPath, \"utf8\"))\n );\n const packageDir = dirname(manifestPath);\n const entryPath = resolve(packageDir, manifest.serverEntry);\n const module = await import(\n (options.toImportUrl ?? ((path) => pathToFileURL(path).href))(entryPath)\n );\n\n if (!module.default) {\n throw new Error(\n `Plugin \"${manifest.id}\" does not export a default plugin.`\n );\n }\n\n plugins.push(module.default as ServerPlugin.Plugin);\n\n if (manifest.webEntry) {\n const pluginDir = basename(packageDir);\n webPlugins.push({\n id: manifest.id,\n name: manifest.name,\n packageName: manifest.packageName,\n version: manifest.version,\n webEntry: toPluginAssetUrl(pluginDir, manifest.webEntry),\n ...(manifest.webStyle === undefined\n ? {}\n : { webStyle: toPluginAssetUrl(pluginDir, manifest.webStyle) })\n });\n }\n }\n\n return { plugins, webPlugins };\n}\n\nfunction toPluginAssetUrl(pluginDir: string, entry: string): string {\n return `/plugin-assets/${encodeURIComponent(pluginDir)}/${toPluginAssetPath(\n entry\n )}`;\n}\n\nfunction toPluginAssetPath(entry: string): string {\n return entry.replace(/^\\.\\//, \"\").replace(/^dist\\//, \"\");\n}\n","export interface GithubPluginSource {\n readonly ref?: string;\n readonly repositoryUrl: string;\n readonly subdirectory?: string;\n}\n\nexport function parseGithubPluginSource(\n source: string\n): GithubPluginSource | undefined {\n const trimmedSource = source.trim();\n const rootMatch =\n /^https:\\/\\/github\\.com\\/(?<owner>[^/\\s]+)\\/(?<repo>[^/\\s]+?)(?:\\.git)?\\/?$/u.exec(\n trimmedSource\n ) ??\n /^git@github\\.com:(?<owner>[^/\\s]+)\\/(?<repo>[^/\\s]+?)(?:\\.git)?$/u.exec(\n trimmedSource\n );\n\n if (rootMatch?.groups) {\n const { owner, repo } = rootMatch.groups;\n\n if (!owner || !repo) {\n return undefined;\n }\n\n return {\n repositoryUrl: toGitRepositoryUrl(\n owner,\n repo,\n trimmedSource.startsWith(\"git@github.com:\")\n )\n };\n }\n\n const webMatch =\n /^https:\\/\\/github\\.com\\/(?<owner>[^/\\s]+)\\/(?<repo>[^/\\s]+)\\/(?<kind>tree|blob)\\/(?<ref>[^/\\s]+)(?:\\/(?<path>.*))?\\/?$/u.exec(\n trimmedSource\n );\n\n if (!webMatch?.groups) {\n return undefined;\n }\n\n const { kind, owner, path, ref, repo } = webMatch.groups;\n\n if (!kind || !owner || !ref || !repo) {\n return undefined;\n }\n\n const pathSegments = normalizeGithubPathSegments(path);\n const subdirectory =\n kind === \"blob\" && pathSegments.at(-1) === \"package.json\"\n ? pathSegments.slice(0, -1).join(\"/\")\n : pathSegments.join(\"/\");\n\n return {\n ref,\n repositoryUrl: toGitRepositoryUrl(owner, repo),\n ...(subdirectory.length === 0 ? {} : { subdirectory })\n };\n}\n\nfunction normalizeGithubPathSegments(path: string | undefined): string[] {\n if (!path) {\n return [];\n }\n\n const segments = path.split(\"/\").filter((segment) => segment.length > 0);\n\n if (segments.some((segment) => segment === \".\" || segment === \"..\")) {\n return [];\n }\n\n return segments;\n}\n\nfunction toGitRepositoryUrl(\n owner: string,\n repo: string,\n useSsh = false\n): string {\n return useSsh\n ? `git@github.com:${owner}/${repo}.git`\n : `https://github.com/${owner}/${repo}.git`;\n}\n","import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport interface PluginInstallCommandResult {\n readonly stderr?: string;\n readonly stdout?: string;\n}\n\nexport type PluginInstallCommandRunner = (\n command: string,\n args: readonly string[],\n cwd: string\n) => Promise<PluginInstallCommandResult> | Promise<void>;\n\nexport type PluginInstallWriter = (value: string) => void;\n\nexport async function runInstallCommand(\n runner: PluginInstallCommandRunner | undefined,\n command: string,\n args: readonly string[],\n cwd: string,\n write?: PluginInstallWriter\n): Promise<void> {\n write?.(`Running: ${formatCommand(command, args)}\\n`);\n\n const result = runner\n ? ((await runner(command, args, cwd)) as PluginInstallCommandResult | undefined)\n : await execFileAsync(command, [...args], { cwd });\n\n if (result?.stdout) {\n write?.(ensureTrailingNewline(result.stdout));\n }\n if (result?.stderr) {\n write?.(ensureTrailingNewline(result.stderr));\n }\n}\n\nfunction formatCommand(command: string, args: readonly string[]): string {\n return [command, ...args].join(\" \");\n}\n\nfunction ensureTrailingNewline(value: string): string {\n return value.endsWith(\"\\n\") ? value : `${value}\\n`;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface PluginPackageManifest {\n readonly name: string;\n readonly exports?: unknown;\n readonly packageJson: Record<string, unknown>;\n readonly publishConfig?: unknown;\n}\n\nexport async function readValidPluginPackageManifest(\n packageDirectory: string\n): Promise<PluginPackageManifest> {\n const manifest = JSON.parse(\n await readFile(join(packageDirectory, \"package.json\"), \"utf8\")\n ) as unknown;\n\n if (!manifest || typeof manifest !== \"object\" || Array.isArray(manifest)) {\n throw new Error(\"Plugin package manifest must be an object.\");\n }\n\n const packageManifest = manifest as Record<string, unknown>;\n const name = packageManifest.name;\n\n if (typeof name !== \"string\" || name.length === 0) {\n throw new Error('Plugin package \"name\" must be a string.');\n }\n\n if (!hasServerExport(packageManifest.exports)) {\n throw new Error('Plugin package \"exports\" must define \"./server\".');\n }\n\n return {\n exports: packageManifest.exports,\n name,\n packageJson: packageManifest,\n publishConfig: packageManifest.publishConfig\n };\n}\n\nexport function createPublishedManifest(\n manifest: PluginPackageManifest\n): Record<string, unknown> {\n if (\n manifest.publishConfig &&\n typeof manifest.publishConfig === \"object\" &&\n !Array.isArray(manifest.publishConfig)\n ) {\n return {\n ...withoutPublishConfig(manifest.packageJson),\n ...(manifest.publishConfig as Record<string, unknown>),\n name: manifest.name\n };\n }\n\n return withoutPublishConfig(manifest.packageJson);\n}\n\nexport function isBuiltPackageManifest(\n manifest: PluginPackageManifest\n): boolean {\n const serverEntry = resolveExportValue(\n (manifest.exports as Record<string, unknown>)[\"./server\"]\n );\n\n return Boolean(serverEntry && !isSourceEntry(serverEntry));\n}\n\nfunction hasServerExport(exportsField: unknown): boolean {\n if (!exportsField || typeof exportsField !== \"object\" || Array.isArray(exportsField)) {\n return false;\n }\n\n return Object.hasOwn(exportsField, \"./server\");\n}\n\nfunction withoutPublishConfig(\n packageJson: Record<string, unknown>\n): Record<string, unknown> {\n const publishedManifest = { ...packageJson };\n delete publishedManifest.publishConfig;\n\n return publishedManifest;\n}\n\nfunction isSourceEntry(entry: string): boolean {\n return (\n entry.startsWith(\"./src/\") ||\n entry.includes(\"/src/\") ||\n entry.endsWith(\".ts\") ||\n entry.endsWith(\".tsx\")\n );\n}\n\nfunction resolveExportValue(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return value;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n const conditions = value as Record<string, unknown>;\n\n return (\n resolveExportValue(conditions.import) ??\n resolveExportValue(conditions.default) ??\n resolveExportValue(conditions.module)\n );\n}\n","import { cp, mkdir, mkdtemp, rm, stat, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { isAbsolute, join, resolve } from \"node:path\";\n\nimport {\n type GithubPluginSource,\n parseGithubPluginSource\n} from \"./github-source\";\nimport {\n type PluginInstallCommandRunner,\n type PluginInstallWriter,\n runInstallCommand\n} from \"./command\";\nimport {\n createPublishedManifest,\n isBuiltPackageManifest,\n readValidPluginPackageManifest\n} from \"../manifest/package\";\n\nexport interface CopyInstalledPluginPackageOptions {\n readonly packageName: string;\n readonly pluginRoot: string;\n readonly sourcePackageDir: string;\n readonly write?: PluginInstallWriter | undefined;\n}\n\nexport interface InstallNpmPluginPackageOptions {\n readonly packageName: string;\n readonly pluginRoot: string;\n readonly tempRoot?: string;\n readonly runCommand?: PluginInstallCommandRunner;\n readonly write?: PluginInstallWriter | undefined;\n}\n\nexport interface InstallPluginPackageOptions {\n readonly currentWorkingDirectory?: string;\n readonly installGitRepository?: (\n repositoryUrl: string,\n targetDir: string,\n ref?: string\n ) => Promise<void>;\n readonly pluginRoot: string;\n readonly runCommand?: PluginInstallCommandRunner;\n readonly source: string;\n readonly tempRoot?: string;\n readonly write?: PluginInstallWriter | undefined;\n}\n\nexport function encodePluginDirectoryName(packageName: string): string {\n return packageName.replaceAll(\"/\", \"__\");\n}\n\nexport async function copyInstalledPluginPackage(\n options: CopyInstalledPluginPackageOptions\n): Promise<string> {\n const destination = join(\n options.pluginRoot,\n encodePluginDirectoryName(options.packageName)\n );\n\n await mkdir(options.pluginRoot, { recursive: true });\n await rm(destination, { force: true, recursive: true });\n options.write?.(\n `Copying plugin files: ${options.sourcePackageDir} -> ${destination}\\n`\n );\n await cp(options.sourcePackageDir, destination, { recursive: true });\n\n return destination;\n}\n\nexport async function installNpmPluginPackage(\n options: InstallNpmPluginPackageOptions\n): Promise<string> {\n const tempRoot =\n options.tempRoot ?? (await mkdtemp(join(tmpdir(), \"hold-rein-plugin-\")));\n\n await mkdir(tempRoot, { recursive: true });\n\n const installDir = await mkdtemp(join(tempRoot, \"install-\"));\n\n await writeFile(\n join(installDir, \"package.json\"),\n JSON.stringify({ private: true, type: \"module\" }, null, 2)\n );\n await runInstallCommand(\n options.runCommand,\n \"npm\",\n [\"install\", options.packageName, \"--ignore-scripts\"],\n installDir,\n options.write\n );\n\n const sourcePackageDir = join(\n installDir,\n \"node_modules\",\n ...options.packageName.split(\"/\")\n );\n\n await readValidPluginPackageManifest(sourcePackageDir);\n\n return copyInstalledPluginPackage({\n packageName: options.packageName,\n pluginRoot: options.pluginRoot,\n sourcePackageDir,\n write: options.write\n });\n}\n\nexport async function installPluginPackage(\n options: InstallPluginPackageOptions\n): Promise<string> {\n const githubSource = parseGithubPluginSource(options.source);\n\n if (githubSource) {\n return installGithubPluginPackage(options, githubSource);\n }\n\n const localDirectory = await resolveLocalDirectory(\n options.source,\n options.currentWorkingDirectory\n );\n\n if (localDirectory) {\n return installLocalPluginPackage(options, localDirectory);\n }\n\n return installNpmPluginPackage({\n packageName: options.source,\n pluginRoot: options.pluginRoot,\n ...(options.runCommand === undefined\n ? {}\n : { runCommand: options.runCommand }),\n ...(options.tempRoot === undefined ? {} : { tempRoot: options.tempRoot }),\n ...(options.write === undefined ? {} : { write: options.write })\n });\n}\n\nasync function installLocalPluginPackage(\n options: InstallPluginPackageOptions,\n sourceDirectory: string\n): Promise<string> {\n await readValidPluginPackageManifest(sourceDirectory);\n await ensurePnpmAvailable(options.runCommand, sourceDirectory, options.write);\n await runInstallCommand(\n options.runCommand,\n \"pnpm\",\n [\"install\"],\n sourceDirectory,\n options.write\n );\n await runInstallCommand(\n options.runCommand,\n \"pnpm\",\n [\"build\"],\n sourceDirectory,\n options.write\n );\n\n return installBuiltSourcePackage(sourceDirectory, options.pluginRoot, options.write);\n}\n\nasync function installGithubPluginPackage(\n options: InstallPluginPackageOptions,\n githubSource: GithubPluginSource\n): Promise<string> {\n const tempRoot =\n options.tempRoot ?? (await mkdtemp(join(tmpdir(), \"hold-rein-plugin-\")));\n await mkdir(tempRoot, { recursive: true });\n const cloneDir = await mkdtemp(join(tempRoot, \"github-\"));\n const installGitRepository = options.installGitRepository ?? cloneGitRepository;\n\n try {\n if (githubSource.ref) {\n await installGitRepository(\n githubSource.repositoryUrl,\n cloneDir,\n githubSource.ref\n );\n } else {\n await installGitRepository(githubSource.repositoryUrl, cloneDir);\n }\n\n const sourceDirectory =\n githubSource.subdirectory === undefined\n ? cloneDir\n : join(cloneDir, githubSource.subdirectory);\n\n const manifest = await readValidPluginPackageManifest(sourceDirectory);\n\n if (isBuiltPackageManifest(manifest)) {\n return await copyInstalledPluginPackage({\n packageName: manifest.name,\n pluginRoot: options.pluginRoot,\n sourcePackageDir: sourceDirectory,\n write: options.write\n });\n }\n\n await ensurePnpmAvailable(options.runCommand, sourceDirectory, options.write);\n await runInstallCommand(\n options.runCommand,\n \"pnpm\",\n [\"install\"],\n sourceDirectory,\n options.write\n );\n await runInstallCommand(\n options.runCommand,\n \"pnpm\",\n [\"build\"],\n sourceDirectory,\n options.write\n );\n\n return await installBuiltSourcePackage(\n sourceDirectory,\n options.pluginRoot,\n options.write\n );\n } finally {\n await rm(cloneDir, { force: true, recursive: true });\n }\n}\n\nasync function installBuiltSourcePackage(\n sourceDirectory: string,\n pluginRoot: string,\n write: PluginInstallWriter | undefined\n): Promise<string> {\n const directDistPackage = await resolveLocalDirectory(\n join(sourceDirectory, \"dist\")\n );\n\n if (directDistPackage && (await hasPackageManifest(directDistPackage))) {\n const manifest = await readValidPluginPackageManifest(directDistPackage);\n\n return copyInstalledPluginPackage({\n packageName: manifest.name,\n pluginRoot,\n sourcePackageDir: directDistPackage,\n write\n });\n }\n\n const manifest = await readValidPluginPackageManifest(sourceDirectory);\n const stagingDir = await mkdtemp(join(tmpdir(), \"hold-rein-plugin-package-\"));\n\n try {\n await writeFile(\n join(stagingDir, \"package.json\"),\n `${JSON.stringify(createPublishedManifest(manifest), null, 2)}\\n`\n );\n await cp(join(sourceDirectory, \"dist\"), join(stagingDir, \"dist\"), {\n recursive: true\n });\n await readValidPluginPackageManifest(stagingDir);\n\n return await copyInstalledPluginPackage({\n packageName: manifest.name,\n pluginRoot,\n sourcePackageDir: stagingDir,\n write\n });\n } finally {\n await rm(stagingDir, { force: true, recursive: true });\n }\n}\n\nasync function hasPackageManifest(directory: string): Promise<boolean> {\n try {\n await stat(join(directory, \"package.json\"));\n return true;\n } catch {\n return false;\n }\n}\n\nasync function ensurePnpmAvailable(\n runCommand: PluginInstallCommandRunner | undefined,\n cwd: string,\n write: PluginInstallWriter | undefined\n): Promise<void> {\n try {\n await runInstallCommand(runCommand, \"pnpm\", [\"--version\"], cwd, write);\n } catch {\n try {\n await runInstallCommand(\n runCommand,\n \"npm\",\n [\"install\", \"--global\", \"pnpm\"],\n cwd,\n write\n );\n } catch {\n throw new Error(\"pnpm is required to build plugin sources\");\n }\n }\n}\n\nasync function resolveLocalDirectory(\n source: string,\n currentWorkingDirectory = process.cwd()\n): Promise<string | undefined> {\n const directory = isAbsolute(source)\n ? source\n : resolve(currentWorkingDirectory, source);\n\n try {\n const stats = await stat(directory);\n return stats.isDirectory() ? directory : undefined;\n } catch {\n return undefined;\n }\n}\n\nasync function cloneGitRepository(\n repositoryUrl: string,\n targetDir: string\n): Promise<void> {\n await runInstallCommand(\n undefined,\n \"git\",\n [\"clone\", \"--depth\", \"1\", repositoryUrl, targetDir],\n process.cwd()\n );\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, join } from \"node:path\";\n\nexport interface InitPluginPackageResult {\n readonly packageName: string;\n}\n\nexport interface InitPluginPackageOptions {\n readonly name?: string;\n readonly path?: string;\n}\n\nconst basePackageJson = {\n name: \"@hold-rein/plugins-base\",\n version: \"0.0.0\",\n private: true,\n type: \"module\",\n main: \"./src/server.ts\",\n module: \"./src/server.ts\",\n types: \"./src/server.ts\",\n exports: {\n \"./server\": {\n types: \"./src/server.ts\",\n import: \"./src/server.ts\",\n require: \"./src/server.ts\"\n },\n \"./web\": {\n types: \"./src/web.ts\",\n style: \"./dist/style.css\",\n import: \"./src/web.ts\",\n require: \"./src/web.ts\"\n }\n },\n files: [\"dist\"],\n publishConfig: {\n access: \"restricted\",\n main: \"./dist/server.cjs\",\n module: \"./dist/server.js\",\n types: \"./dist/server.d.ts\",\n exports: {\n \"./server\": {\n types: \"./dist/server.d.ts\",\n import: \"./dist/server.js\",\n require: \"./dist/server.cjs\"\n },\n \"./web\": {\n types: \"./dist/web.d.ts\",\n style: \"./dist/style.css\",\n default: \"./dist/web.umd.cjs\",\n require: \"./dist/web.umd.cjs\"\n }\n }\n },\n scripts: {\n build:\n \"vite build --config vite.config.ts && vite build --config vite.web.config.ts && tsc -p tsconfig.json --emitDeclarationOnly\",\n typecheck: \"tsc -p tsconfig.json --noEmit\"\n },\n peerDependencies: {\n \"@earendil-works/pi-agent-core\": \"0.75.4\",\n \"@earendil-works/pi-ai\": \"0.76.0\",\n \"@hold-rein/plugin-server\": \"workspace:^\",\n express: \"5.2.1\",\n \"@ant-design/icons\": \"6.2.5\",\n \"@hold-rein/plugin-web\": \"workspace:^\",\n \"@monaco-editor/react\": \"4.7.0\",\n antd: \"6.4.3\",\n \"monaco-editor\": \"0.55.1\",\n react: \"19.2.6\",\n \"react-dom\": \"19.2.6\"\n },\n devDependencies: {\n \"@earendil-works/pi-agent-core\": \"0.75.4\",\n \"@earendil-works/pi-ai\": \"0.76.0\",\n \"@hold-rein/plugin-server\": \"workspace:^\",\n express: \"5.2.1\",\n vite: \"6.3.5\",\n \"@ant-design/icons\": \"6.2.5\",\n \"@hold-rein/plugin-web\": \"workspace:^\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@types/react\": \"19.2.15\",\n antd: \"6.4.3\",\n \"monaco-editor\": \"0.55.1\",\n react: \"19.2.6\",\n \"react-dom\": \"19.2.6\"\n }\n} as const;\n\nconst tsconfigJson = `{\n \"compilerOptions\": {\n \"declaration\": true,\n \"declarationMap\": true,\n \"esModuleInterop\": true,\n \"exactOptionalPropertyTypes\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"isolatedModules\": true,\n \"module\": \"ESNext\",\n \"moduleResolution\": \"Bundler\",\n \"noFallthroughCasesInSwitch\": true,\n \"noImplicitOverride\": true,\n \"noUncheckedIndexedAccess\": true,\n \"resolveJsonModule\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"target\": \"ES2022\",\n \"useDefineForClassFields\": true,\n \"verbatimModuleSyntax\": true,\n \"jsx\": \"react-jsx\",\n \"lib\": [\"DOM\", \"DOM.Iterable\", \"ES2022\"],\n \"outDir\": \"dist\",\n \"rootDir\": \"src\"\n },\n \"include\": [\"src/**/*.ts\", \"src/**/*.tsx\"],\n \"exclude\": [\"src/**/*.test.ts\", \"src/**/*.test.tsx\"]\n}\n`;\n\nconst viteConfigTs = `import { builtinModules } from \"node:module\";\n\nimport { defineConfig } from \"vite\";\n\nconst nodeBuiltins = builtinModules.flatMap((name) => [\n name,\n \\`node:\\${name}\\`\n]);\n\nexport default defineConfig({\n build: {\n lib: {\n entry: \"src/server.ts\",\n fileName: (format) => \\`server.\\${format === \"cjs\" ? \"cjs\" : \"js\"}\\`,\n formats: [\"es\", \"cjs\"]\n },\n rollupOptions: {\n external: [\n ...nodeBuiltins,\n \"@hold-rein/plugin-server\",\n \"@earendil-works/pi-agent-core\",\n \"@earendil-works/pi-ai\",\n \"express\"\n ]\n },\n sourcemap: true\n }\n});\n`;\n\nconst viteWebConfigTs = `import { defineConfig } from \"vite\";\n\nexport default defineConfig({\n build: {\n emptyOutDir: false,\n lib: {\n cssFileName: \"style\",\n entry: \"src/web.ts\",\n fileName: () => \"web.umd.cjs\",\n formats: [\"umd\"],\n name: \"HoldReinPlugin\"\n },\n sourcemap: true,\n rollupOptions: {\n external: [\n \"@ant-design/icons\",\n \"@hold-rein/plugin-web\",\n \"@monaco-editor/react\",\n \"antd\",\n \"monaco-editor\",\n \"react\",\n \"react-dom\",\n \"react/jsx-runtime\"\n ]\n }\n }\n});\n`;\n\nexport const initPluginPackage = (\n currentWorkingDirectory: string,\n options: InitPluginPackageOptions = {}\n): InitPluginPackageResult => {\n const targetRootDirectory = options.path ?? currentWorkingDirectory;\n const targetDirectory =\n options.name === undefined\n ? targetRootDirectory\n : join(targetRootDirectory, options.name);\n const folderName = basename(targetDirectory);\n const packageName = `hold-rein-plugin-${folderName}`;\n const packageJson = {\n ...basePackageJson,\n name: packageName\n };\n\n writeFiles(targetDirectory, {\n \"package.json\": `${JSON.stringify(packageJson, null, 2)}\\n`,\n \"tsconfig.json\": tsconfigJson,\n \"vite.config.ts\": viteConfigTs,\n \"vite.web.config.ts\": viteWebConfigTs,\n \"src/plugin-id.ts\": `export const PLUGIN_ID = \"__${folderName}__plugin\";\\n`,\n \"src/server.ts\": createServerPluginSource(),\n \"src/web.ts\": createWebPluginSource()\n });\n\n return { packageName };\n};\n\nfunction writeFiles(\n currentWorkingDirectory: string,\n files: Readonly<Record<string, string>>\n): void {\n for (const relativePath of Object.keys(files)) {\n const path = join(currentWorkingDirectory, relativePath);\n\n if (existsSync(path)) {\n throw new Error(`Refusing to overwrite existing file: ${relativePath}`);\n }\n }\n\n mkdirSync(join(currentWorkingDirectory, \"src\"), { recursive: true });\n\n for (const [relativePath, contents] of Object.entries(files)) {\n writeFileSync(join(currentWorkingDirectory, relativePath), contents);\n }\n}\n\nfunction createServerPluginSource(): string {\n return `import type { ServerPlugin } from \"@hold-rein/plugin-server\";\n\nimport { PLUGIN_ID } from \"./plugin-id\";\n\nconst serverPlugin: ServerPlugin.Plugin = {\n id: PLUGIN_ID\n};\n\nexport default serverPlugin;\n`;\n}\n\nfunction createWebPluginSource(): string {\n return `import type { WebPlugin } from \"@hold-rein/plugin-web\";\n\nimport { PLUGIN_ID } from \"./plugin-id\";\n\nconst webPlugin: WebPlugin.Plugin = {\n id: PLUGIN_ID\n};\n\nexport default webPlugin;\n`;\n}\n","import type { Router } from 'express'\nimport type { ServerPlugin } from './type'\n\nexport * from \"./type\";\nexport { loadInstalledServerPlugins } from \"./runtime/loader\";\nexport type {\n LoadedServerPlugins,\n LoadInstalledServerPluginsOptions\n} from \"./runtime/loader\";\nexport {\n copyInstalledPluginPackage,\n encodePluginDirectoryName,\n installPluginPackage,\n installNpmPluginPackage\n} from \"./runtime/installer\";\nexport type {\n CopyInstalledPluginPackageOptions,\n InstallPluginPackageOptions,\n InstallNpmPluginPackageOptions\n} from \"./runtime/installer\";\nexport { initPluginPackage } from \"./runtime/init\";\nexport type {\n InitPluginPackageOptions,\n InitPluginPackageResult\n} from \"./runtime/init\";\nexport type {\n PluginInstallCommandResult,\n PluginInstallCommandRunner,\n PluginInstallWriter\n} from \"./runtime/installer/command\";\nexport {\n discoverServerPluginManifests,\n parseServerPluginManifest\n} from \"./runtime/manifest\";\nexport { SERVER_PLUGIN_SHARED_PACKAGES } from \"./runtime/shared/packages\";\nexport { linkServerPluginSharedPackages } from \"./runtime/shared/symlinks\";\nexport type { LinkServerPluginSharedPackagesOptions } from \"./runtime/shared/symlinks\";\n\nexport interface ServerPluginRegistry {\n register: (plugin: ServerPlugin.Plugin) => void;\n list: () => ServerPlugin.Plugin[];\n get: (id: string) => ServerPlugin.Plugin | undefined;\n has: (id: string) => boolean;\n registerRoutes: (prefixRouter: Router, context: ServerPlugin.RouteContext) => Promise<void>;\n resolveContributions: (\n context: ServerPlugin.RuntimeContext\n ) => Promise<ServerPlugin.Contribution>;\n}\n\nasync function resolveContribution(\n resolver: ServerPlugin.ContributionResolver,\n context: ServerPlugin.RuntimeContext\n): Promise<ServerPlugin.Contribution> {\n if (typeof resolver === \"function\") {\n return resolver(context);\n }\n\n return resolver;\n}\n\nexport function createServerPluginRegistry(): ServerPluginRegistry {\n const plugins = new Map<string, ServerPlugin.Plugin>();\n\n return {\n register(plugin) {\n if (plugins.has(plugin.id)) {\n throw new Error(`Server plugin \"${plugin.id}\" is already registered.`);\n }\n\n plugins.set(plugin.id, plugin);\n },\n list() {\n return [...plugins.values()];\n },\n get(id) {\n return plugins.get(id);\n },\n has(id) {\n return plugins.has(id);\n },\n\n async registerRoutes(prefixRouter: Router, context: ServerPlugin.RouteContext) {\n for (const plugin of plugins.values()) {\n if (!plugin.registerRoutes) continue\n\n const route = await plugin.registerRoutes(context)\n prefixRouter.use(`/${plugin.id}`, route)\n }\n },\n\n async resolveContributions(context: ServerPlugin.RuntimeContext) {\n const tools: ServerPlugin.PluginTool[] = [];\n const skills: NonNullable<ServerPlugin.Contribution[\"skills\"]>[number][] = [];\n const skillDirs: string[] = [];\n const systemPrompts: string[] = [];\n const subscribes: NonNullable<ServerPlugin.Contribution[\"subscribe\"]>[] = [];\n const agentEndHandlers: NonNullable<ServerPlugin.Contribution[\"onAgentEnd\"]>[] = [];\n\n for (const plugin of plugins.values()) {\n if (!plugin.contributionResolver) {\n continue;\n }\n\n const contribution = await resolveContribution(\n plugin.contributionResolver,\n context\n );\n\n tools.push(...(contribution.tools ?? []));\n skills.push(...(contribution.skills ?? []));\n skillDirs.push(...(contribution.skillDirs ?? []));\n systemPrompts.push(...(contribution.systemPrompts ?? []));\n\n if (contribution.subscribe) {\n subscribes.push(contribution.subscribe);\n }\n if (contribution.onAgentEnd) {\n agentEndHandlers.push(contribution.onAgentEnd);\n }\n }\n\n const contribution: ServerPlugin.Contribution = {\n tools,\n skills,\n skillDirs,\n systemPrompts\n };\n\n return {\n ...contribution,\n ...(subscribes.length > 0\n ? {\n subscribe(event: Parameters<NonNullable<ServerPlugin.Contribution[\"subscribe\"]>>[0]) {\n for (const subscribe of subscribes) {\n subscribe(event);\n }\n }\n }\n : {}),\n ...(agentEndHandlers.length > 0\n ? {\n async onAgentEnd(input: ServerPlugin.AgentEndInput) {\n for (const onAgentEnd of agentEndHandlers) {\n const continuation = await onAgentEnd(input);\n if (continuation) {\n return continuation;\n }\n }\n\n return undefined;\n }\n }\n : {})\n };\n }\n };\n}\n"],"names":["requirePackageString","input","key","value","parseServerPluginManifest","packageManifest","packageName","version","serverEntry","resolvePackageExport","webEntry","webStyle","resolvePackageStyleExport","discoverServerPluginManifests","pluginRoot","entries","readdir","manifests","entry","join","existingFiles","paths","existing","path","access","exportsField","subpath","exportMap","exportValue","resolveExportValue","style","conditions","preferredConditions","condition","resolved","SERVER_PLUGIN_SHARED_PACKAGES","linkServerPluginSharedPackages","options","linkPath","targetPath","_a","mkdir","dirname","rm","symlink","loadInstalledServerPlugins","plugins","webPlugins","manifestPath","manifest","readFile","packageDir","entryPath","resolve","module","pathToFileURL","pluginDir","basename","toPluginAssetUrl","toPluginAssetPath","parseGithubPluginSource","source","trimmedSource","rootMatch","owner","repo","toGitRepositoryUrl","webMatch","kind","ref","pathSegments","normalizeGithubPathSegments","subdirectory","segments","segment","useSsh","execFileAsync","promisify","execFile","runInstallCommand","runner","command","args","cwd","write","formatCommand","result","ensureTrailingNewline","readValidPluginPackageManifest","packageDirectory","name","hasServerExport","createPublishedManifest","withoutPublishConfig","isBuiltPackageManifest","isSourceEntry","packageJson","publishedManifest","encodePluginDirectoryName","copyInstalledPluginPackage","destination","cp","installNpmPluginPackage","tempRoot","mkdtemp","tmpdir","installDir","writeFile","sourcePackageDir","installPluginPackage","githubSource","installGithubPluginPackage","localDirectory","resolveLocalDirectory","installLocalPluginPackage","sourceDirectory","ensurePnpmAvailable","installBuiltSourcePackage","cloneDir","installGitRepository","cloneGitRepository","directDistPackage","hasPackageManifest","stagingDir","directory","stat","runCommand","currentWorkingDirectory","isAbsolute","repositoryUrl","targetDir","basePackageJson","tsconfigJson","viteConfigTs","viteWebConfigTs","initPluginPackage","targetRootDirectory","targetDirectory","folderName","writeFiles","createServerPluginSource","createWebPluginSource","files","relativePath","existsSync","mkdirSync","contents","writeFileSync","resolveContribution","resolver","context","createServerPluginRegistry","plugin","id","prefixRouter","route","tools","skills","skillDirs","systemPrompts","subscribes","agentEndHandlers","contribution","event","subscribe","onAgentEnd","continuation"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@hold-rein/plugin-server",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@earendil-works/pi-agent-core": "0.75.4",
|
|
24
|
+
"@earendil-works/pi-ai": "0.76.0",
|
|
25
|
+
"express": "5.2.1"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"vite": "6.3.5"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc -p tsconfig.json --emitDeclarationOnly && vite build",
|
|
32
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
33
|
+
}
|
|
34
|
+
}
|