pi-forge 0.0.0 → 1.1.4
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/LICENSE +21 -0
- package/README.md +48 -4
- package/bin/pi-forge.mjs +37 -0
- package/dist/client/assets/CodeMirrorEditor-BqaaP1EE.js +34 -0
- package/dist/client/assets/CodeMirrorEditor-BqaaP1EE.js.map +1 -0
- package/dist/client/assets/index-B-529kgJ.css +32 -0
- package/dist/client/assets/index-BzKzxXFs.js +392 -0
- package/dist/client/assets/index-BzKzxXFs.js.map +1 -0
- package/dist/client/assets/workbox-window.prod.es5-BBnX5xw4.js +3 -0
- package/dist/client/assets/workbox-window.prod.es5-BBnX5xw4.js.map +1 -0
- package/dist/client/icons/icon-192.png +0 -0
- package/dist/client/icons/icon-512.png +0 -0
- package/dist/client/icons/icon-maskable-512.png +0 -0
- package/dist/client/icons/icon.svg +9 -0
- package/dist/client/index.html +24 -0
- package/dist/client/manifest.webmanifest +1 -0
- package/dist/client/offline.html +142 -0
- package/dist/client/sw.js +3 -0
- package/dist/client/sw.js.map +1 -0
- package/dist/client/workbox-6d7155ed.js +3 -0
- package/dist/client/workbox-6d7155ed.js.map +1 -0
- package/dist/server/agent-resource-loader.js +126 -0
- package/dist/server/agent-resource-loader.js.map +1 -0
- package/dist/server/attachment-converters.js +96 -0
- package/dist/server/attachment-converters.js.map +1 -0
- package/dist/server/auth.js +209 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/compaction-history.js +106 -0
- package/dist/server/compaction-history.js.map +1 -0
- package/dist/server/concurrency.js +49 -0
- package/dist/server/concurrency.js.map +1 -0
- package/dist/server/config-export.js +220 -0
- package/dist/server/config-export.js.map +1 -0
- package/dist/server/config-manager.js +528 -0
- package/dist/server/config-manager.js.map +1 -0
- package/dist/server/config.js +326 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/conversion-worker.mjs +90 -0
- package/dist/server/diagnostics.js +137 -0
- package/dist/server/diagnostics.js.map +1 -0
- package/dist/server/extensions-discovery.js +147 -0
- package/dist/server/extensions-discovery.js.map +1 -0
- package/dist/server/file-manager.js +734 -0
- package/dist/server/file-manager.js.map +1 -0
- package/dist/server/file-references.js +215 -0
- package/dist/server/file-references.js.map +1 -0
- package/dist/server/file-searcher.js +385 -0
- package/dist/server/file-searcher.js.map +1 -0
- package/dist/server/git-runner.js +684 -0
- package/dist/server/git-runner.js.map +1 -0
- package/dist/server/index.js +468 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/mcp/config.js +133 -0
- package/dist/server/mcp/config.js.map +1 -0
- package/dist/server/mcp/manager.js +351 -0
- package/dist/server/mcp/manager.js.map +1 -0
- package/dist/server/mcp/tool-bridge.js +173 -0
- package/dist/server/mcp/tool-bridge.js.map +1 -0
- package/dist/server/project-manager.js +301 -0
- package/dist/server/project-manager.js.map +1 -0
- package/dist/server/pty-manager.js +354 -0
- package/dist/server/pty-manager.js.map +1 -0
- package/dist/server/routes/_schemas.js +73 -0
- package/dist/server/routes/_schemas.js.map +1 -0
- package/dist/server/routes/auth.js +164 -0
- package/dist/server/routes/auth.js.map +1 -0
- package/dist/server/routes/config.js +1163 -0
- package/dist/server/routes/config.js.map +1 -0
- package/dist/server/routes/control.js +464 -0
- package/dist/server/routes/control.js.map +1 -0
- package/dist/server/routes/exec.js +217 -0
- package/dist/server/routes/exec.js.map +1 -0
- package/dist/server/routes/files.js +847 -0
- package/dist/server/routes/files.js.map +1 -0
- package/dist/server/routes/git.js +837 -0
- package/dist/server/routes/git.js.map +1 -0
- package/dist/server/routes/health.js +97 -0
- package/dist/server/routes/health.js.map +1 -0
- package/dist/server/routes/mcp.js +300 -0
- package/dist/server/routes/mcp.js.map +1 -0
- package/dist/server/routes/projects.js +259 -0
- package/dist/server/routes/projects.js.map +1 -0
- package/dist/server/routes/prompt.js +496 -0
- package/dist/server/routes/prompt.js.map +1 -0
- package/dist/server/routes/sessions.js +783 -0
- package/dist/server/routes/sessions.js.map +1 -0
- package/dist/server/routes/stream.js +69 -0
- package/dist/server/routes/stream.js.map +1 -0
- package/dist/server/routes/terminal.js +335 -0
- package/dist/server/routes/terminal.js.map +1 -0
- package/dist/server/session-registry.js +1197 -0
- package/dist/server/session-registry.js.map +1 -0
- package/dist/server/skill-overrides.js +151 -0
- package/dist/server/skill-overrides.js.map +1 -0
- package/dist/server/skills-export.js +257 -0
- package/dist/server/skills-export.js.map +1 -0
- package/dist/server/sse-bridge.js +220 -0
- package/dist/server/sse-bridge.js.map +1 -0
- package/dist/server/tool-overrides.js +277 -0
- package/dist/server/tool-overrides.js.map +1 -0
- package/dist/server/turn-diff-builder.js +280 -0
- package/dist/server/turn-diff-builder.js.map +1 -0
- package/package.json +53 -12
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Surface pi PACKAGE contributions (extension-registered tools +
|
|
3
|
+
* skills) to the pi-forge layer.
|
|
4
|
+
*
|
|
5
|
+
* Background: pi keeps two separate concepts. **Packages** are the
|
|
6
|
+
* install unit (npm or git, persisted in `settings.json#packages[]`,
|
|
7
|
+
* managed by `DefaultPackageManager`). A package can contribute any
|
|
8
|
+
* of `extensions`, `skills`, `prompts`, `themes` declared in its
|
|
9
|
+
* `package.json#pi` manifest. **Extensions** are the JS/TS modules
|
|
10
|
+
* that programmatically register tools at session start. So a single
|
|
11
|
+
* package (e.g. pi-subagents) can register tools via its extension
|
|
12
|
+
* entry AND ship a `skills/` dir AND ship `prompts/` — all flowing
|
|
13
|
+
* through the same package install.
|
|
14
|
+
*
|
|
15
|
+
* Pi's own `DefaultResourceLoader.reload()` does:
|
|
16
|
+
*
|
|
17
|
+
* const packageManager = new DefaultPackageManager({ cwd, agentDir, settingsManager });
|
|
18
|
+
* const resolved = await packageManager.resolve();
|
|
19
|
+
* // resolved.extensions, resolved.skills, etc. are ResolvedResource[]
|
|
20
|
+
* // with .path, .enabled, .metadata.source
|
|
21
|
+
*
|
|
22
|
+
* We mirror that. The PackageManager handles every install location —
|
|
23
|
+
* `~/.pi/agent/packages/<name>/` for npm-installed-via-pi, project
|
|
24
|
+
* `.pi/packages/`, plus any directory installs the user did manually.
|
|
25
|
+
* No hardcoded path scan.
|
|
26
|
+
*
|
|
27
|
+
* After the package manager hands us the enabled paths:
|
|
28
|
+
* - Extension paths get passed as `configuredPaths` to
|
|
29
|
+
* `discoverAndLoadExtensions(...)` so we can enumerate the tool
|
|
30
|
+
* names each extension registers.
|
|
31
|
+
* - Skill paths feed into `loadSkills(skillPaths: [...])` for
|
|
32
|
+
* enumeration in Settings → Skills.
|
|
33
|
+
*
|
|
34
|
+
* The `metadata.source` field on each ResolvedResource is the
|
|
35
|
+
* user-visible package name ("pi-subagents", "git+https://…"). We
|
|
36
|
+
* surface it as `packageSource` so the Settings UI can group tools
|
|
37
|
+
* + skills by package instead of by extension entry path.
|
|
38
|
+
*/
|
|
39
|
+
import { discoverAndLoadExtensions, DefaultPackageManager, SettingsManager, } from "@mariozechner/pi-coding-agent";
|
|
40
|
+
import { config } from "./config.js";
|
|
41
|
+
/**
|
|
42
|
+
* Resolve package-contributed resources visible to a session in `cwd`.
|
|
43
|
+
*
|
|
44
|
+
* Used by:
|
|
45
|
+
* - `session-registry.buildToolsAllowlist` to union package-extension
|
|
46
|
+
* tool names into the allowlist passed to `createAgentSession`
|
|
47
|
+
* - `routes/config.ts` `GET /config/tools` to list package-contributed
|
|
48
|
+
* tools in the Settings → Tools tab (grouped by package)
|
|
49
|
+
* - `config-manager.listSkills` to feed package skill paths into
|
|
50
|
+
* `loadSkills` so they show up in Settings → Skills
|
|
51
|
+
*
|
|
52
|
+
* Failures inside individual packages or extensions surface as
|
|
53
|
+
* `errors[]` rather than throwing. A single broken package must not
|
|
54
|
+
* block session creation or settings rendering.
|
|
55
|
+
*/
|
|
56
|
+
export async function discoverExtensionResources(cwd) {
|
|
57
|
+
const errors = [];
|
|
58
|
+
let extensionPathToPackage;
|
|
59
|
+
let skillEntries;
|
|
60
|
+
try {
|
|
61
|
+
const settingsManager = SettingsManager.create(cwd, config.piConfigDir);
|
|
62
|
+
// Some SDK paths reload settings on construction; defensively
|
|
63
|
+
// call reload here so we read the on-disk packages list fresh
|
|
64
|
+
// (matches DefaultResourceLoader.reload() ordering).
|
|
65
|
+
await settingsManager.reload?.();
|
|
66
|
+
const packageManager = new DefaultPackageManager({
|
|
67
|
+
cwd,
|
|
68
|
+
agentDir: config.piConfigDir,
|
|
69
|
+
settingsManager,
|
|
70
|
+
});
|
|
71
|
+
const resolved = await packageManager.resolve();
|
|
72
|
+
// Filter to enabled paths AND keep their source attribution. A
|
|
73
|
+
// resource without a metadata.source we can't attribute is
|
|
74
|
+
// dropped — better silently absent than rendered as "unknown".
|
|
75
|
+
extensionPathToPackage = new Map();
|
|
76
|
+
for (const r of resolved.extensions) {
|
|
77
|
+
if (!r.enabled)
|
|
78
|
+
continue;
|
|
79
|
+
const src = r.metadata.source;
|
|
80
|
+
if (typeof src !== "string" || src.length === 0)
|
|
81
|
+
continue;
|
|
82
|
+
extensionPathToPackage.set(r.path, src);
|
|
83
|
+
}
|
|
84
|
+
skillEntries = [];
|
|
85
|
+
for (const r of resolved.skills) {
|
|
86
|
+
if (!r.enabled)
|
|
87
|
+
continue;
|
|
88
|
+
// Only forward PACKAGE-origin skills. The PackageManager also
|
|
89
|
+
// surfaces auto-discovered top-level skills (the bare global
|
|
90
|
+
// skill dir, project .pi/skills, etc.) with `origin:
|
|
91
|
+
// "top-level"` — those are already loaded by the
|
|
92
|
+
// `includeDefaults: true` path in `loadSkills`, so passing
|
|
93
|
+
// them through too would double-count every default skill.
|
|
94
|
+
if (r.metadata.origin !== "package")
|
|
95
|
+
continue;
|
|
96
|
+
const src = r.metadata.source;
|
|
97
|
+
if (typeof src !== "string" || src.length === 0)
|
|
98
|
+
continue;
|
|
99
|
+
skillEntries.push({ packageSource: src, skillPath: r.path });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
errors.push({
|
|
104
|
+
path: "<package-manager>",
|
|
105
|
+
error: err instanceof Error ? err.message : String(err),
|
|
106
|
+
});
|
|
107
|
+
return { tools: [], skillPaths: [], errors };
|
|
108
|
+
}
|
|
109
|
+
// Now load each extension to enumerate its registered tools.
|
|
110
|
+
// discoverAndLoadExtensions accepts our resolved extension paths
|
|
111
|
+
// via the third (configuredPaths) arg — it'll still also scan the
|
|
112
|
+
// legacy `cwd/.pi/extensions/` and `agentDir/extensions/` dirs,
|
|
113
|
+
// which is fine for backward compat with hand-dropped extensions.
|
|
114
|
+
const tools = [];
|
|
115
|
+
if (extensionPathToPackage.size === 0) {
|
|
116
|
+
return { tools, skillPaths: skillEntries, errors };
|
|
117
|
+
}
|
|
118
|
+
let loaded;
|
|
119
|
+
try {
|
|
120
|
+
loaded = await discoverAndLoadExtensions(Array.from(extensionPathToPackage.keys()), cwd, config.piConfigDir);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
errors.push({
|
|
124
|
+
path: "<discoverAndLoadExtensions>",
|
|
125
|
+
error: err instanceof Error ? err.message : String(err),
|
|
126
|
+
});
|
|
127
|
+
return { tools, skillPaths: skillEntries, errors };
|
|
128
|
+
}
|
|
129
|
+
for (const e of loaded.errors) {
|
|
130
|
+
errors.push({ path: e.path, error: e.error });
|
|
131
|
+
}
|
|
132
|
+
for (const ext of loaded.extensions) {
|
|
133
|
+
const pkgSource = extensionPathToPackage.get(ext.path) ?? extensionPathToPackage.get(ext.resolvedPath);
|
|
134
|
+
if (pkgSource === undefined)
|
|
135
|
+
continue; // Not from a package we resolved (legacy dir scan); skip.
|
|
136
|
+
for (const [, registered] of ext.tools) {
|
|
137
|
+
const def = registered.definition;
|
|
138
|
+
const info = { name: def.name, packageSource: pkgSource };
|
|
139
|
+
if (typeof def.description === "string" && def.description.length > 0) {
|
|
140
|
+
info.description = def.description;
|
|
141
|
+
}
|
|
142
|
+
tools.push(info);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return { tools, skillPaths: skillEntries, errors };
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=extensions-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions-discovery.js","sourceRoot":"","sources":["../src/extensions-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EACL,yBAAyB,EACzB,qBAAqB,EACrB,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AA8BrC;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,GAAW;IAC1D,MAAM,MAAM,GAAsC,EAAE,CAAC;IACrD,IAAI,sBAA2C,CAAC;IAChD,IAAI,YAAoC,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACxE,8DAA8D;QAC9D,8DAA8D;QAC9D,qDAAqD;QACrD,MAAM,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,IAAI,qBAAqB,CAAC;YAC/C,GAAG;YACH,QAAQ,EAAE,MAAM,CAAC,WAAW;YAC5B,eAAe;SAChB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;QAChD,+DAA+D;QAC/D,2DAA2D;QAC3D,+DAA+D;QAC/D,sBAAsB,GAAG,IAAI,GAAG,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,CAAC,OAAO;gBAAE,SAAS;YACzB,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC1D,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;QACD,YAAY,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAChC,IAAI,CAAC,CAAC,CAAC,OAAO;gBAAE,SAAS;YACzB,8DAA8D;YAC9D,6DAA6D;YAC7D,qDAAqD;YACrD,iDAAiD;YACjD,2DAA2D;YAC3D,2DAA2D;YAC3D,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS;gBAAE,SAAS;YAC9C,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC1D,YAAY,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mBAAmB;YACzB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;IAC/C,CAAC;IAED,6DAA6D;IAC7D,iEAAiE;IACjE,kEAAkE;IAClE,gEAAgE;IAChE,kEAAkE;IAClE,MAAM,KAAK,GAAwB,EAAE,CAAC;IACtC,IAAI,sBAAsB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,MAA6D,CAAC;IAClE,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,yBAAyB,CACtC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC,EACzC,GAAG,EACH,MAAM,CAAC,WAAW,CACnB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,6BAA6B;YACnC,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IACrD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACpC,MAAM,SAAS,GACb,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACvF,IAAI,SAAS,KAAK,SAAS;YAAE,SAAS,CAAC,0DAA0D;QACjG,KAAK,MAAM,CAAC,EAAE,UAAU,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC;YAClC,MAAM,IAAI,GAAsB,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;YAC7E,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,IAAI,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtE,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;YACrC,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;AACrD,CAAC"}
|