pi-kot 0.1.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/README.md +30 -0
- package/bin/pi-kot.mjs +125 -0
- package/dist/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/client/assets/index-UJgsBs6a.js +361 -0
- package/dist/client/assets/index-UJgsBs6a.js.map +1 -0
- package/dist/client/assets/index-ZuTc_0YY.css +1 -0
- package/dist/client/index.html +14 -0
- package/dist/server/ask-user-question/envelope.d.ts +11 -0
- package/dist/server/ask-user-question/envelope.d.ts.map +1 -0
- package/dist/server/ask-user-question/envelope.js +41 -0
- package/dist/server/ask-user-question/envelope.js.map +1 -0
- package/dist/server/ask-user-question/prompt-strings.d.ts +4 -0
- package/dist/server/ask-user-question/prompt-strings.d.ts.map +1 -0
- package/dist/server/ask-user-question/prompt-strings.js +18 -0
- package/dist/server/ask-user-question/prompt-strings.js.map +1 -0
- package/dist/server/ask-user-question/registry.d.ts +39 -0
- package/dist/server/ask-user-question/registry.d.ts.map +1 -0
- package/dist/server/ask-user-question/registry.js +124 -0
- package/dist/server/ask-user-question/registry.js.map +1 -0
- package/dist/server/ask-user-question/tool.d.ts +4 -0
- package/dist/server/ask-user-question/tool.d.ts.map +1 -0
- package/dist/server/ask-user-question/tool.js +68 -0
- package/dist/server/ask-user-question/tool.js.map +1 -0
- package/dist/server/ask-user-question/types.d.ts +50 -0
- package/dist/server/ask-user-question/types.d.ts.map +1 -0
- package/dist/server/ask-user-question/types.js +7 -0
- package/dist/server/ask-user-question/types.js.map +1 -0
- package/dist/server/ask-user-question/validate.d.ts +3 -0
- package/dist/server/ask-user-question/validate.d.ts.map +1 -0
- package/dist/server/ask-user-question/validate.js +67 -0
- package/dist/server/ask-user-question/validate.js.map +1 -0
- package/dist/server/config-manager.d.ts +47 -0
- package/dist/server/config-manager.d.ts.map +1 -0
- package/dist/server/config-manager.js +182 -0
- package/dist/server/config-manager.js.map +1 -0
- package/dist/server/config.d.ts +20 -0
- package/dist/server/config.d.ts.map +1 -0
- package/dist/server/config.js +58 -0
- package/dist/server/config.js.map +1 -0
- package/dist/server/extension-manager.d.ts +70 -0
- package/dist/server/extension-manager.d.ts.map +1 -0
- package/dist/server/extension-manager.js +401 -0
- package/dist/server/extension-manager.js.map +1 -0
- package/dist/server/extension-ui-bridge.d.ts +35 -0
- package/dist/server/extension-ui-bridge.d.ts.map +1 -0
- package/dist/server/extension-ui-bridge.js +228 -0
- package/dist/server/extension-ui-bridge.js.map +1 -0
- package/dist/server/file-manager.d.ts +79 -0
- package/dist/server/file-manager.d.ts.map +1 -0
- package/dist/server/file-manager.js +526 -0
- package/dist/server/file-manager.js.map +1 -0
- package/dist/server/file-searcher.d.ts +29 -0
- package/dist/server/file-searcher.d.ts.map +1 -0
- package/dist/server/file-searcher.js +318 -0
- package/dist/server/file-searcher.js.map +1 -0
- package/dist/server/git-clone.d.ts +56 -0
- package/dist/server/git-clone.d.ts.map +1 -0
- package/dist/server/git-clone.js +173 -0
- package/dist/server/git-clone.js.map +1 -0
- package/dist/server/index.d.ts +22 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +196 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lifecycle-notifications.d.ts +28 -0
- package/dist/server/lifecycle-notifications.d.ts.map +1 -0
- package/dist/server/lifecycle-notifications.js +38 -0
- package/dist/server/lifecycle-notifications.js.map +1 -0
- package/dist/server/orchestration/config.d.ts +5 -0
- package/dist/server/orchestration/config.d.ts.map +1 -0
- package/dist/server/orchestration/config.js +35 -0
- package/dist/server/orchestration/config.js.map +1 -0
- package/dist/server/orchestration/event-bridge.d.ts +32 -0
- package/dist/server/orchestration/event-bridge.d.ts.map +1 -0
- package/dist/server/orchestration/event-bridge.js +110 -0
- package/dist/server/orchestration/event-bridge.js.map +1 -0
- package/dist/server/orchestration/inbox.d.ts +9 -0
- package/dist/server/orchestration/inbox.d.ts.map +1 -0
- package/dist/server/orchestration/inbox.js +186 -0
- package/dist/server/orchestration/inbox.js.map +1 -0
- package/dist/server/orchestration/init.d.ts +2 -0
- package/dist/server/orchestration/init.d.ts.map +1 -0
- package/dist/server/orchestration/init.js +22 -0
- package/dist/server/orchestration/init.js.map +1 -0
- package/dist/server/orchestration/store.d.ts +33 -0
- package/dist/server/orchestration/store.d.ts.map +1 -0
- package/dist/server/orchestration/store.js +331 -0
- package/dist/server/orchestration/store.js.map +1 -0
- package/dist/server/orchestration/tools.d.ts +15 -0
- package/dist/server/orchestration/tools.d.ts.map +1 -0
- package/dist/server/orchestration/tools.js +621 -0
- package/dist/server/orchestration/tools.js.map +1 -0
- package/dist/server/orchestration/types.d.ts +68 -0
- package/dist/server/orchestration/types.d.ts.map +1 -0
- package/dist/server/orchestration/types.js +43 -0
- package/dist/server/orchestration/types.js.map +1 -0
- package/dist/server/orchestration/worker-lifecycle.d.ts +15 -0
- package/dist/server/orchestration/worker-lifecycle.d.ts.map +1 -0
- package/dist/server/orchestration/worker-lifecycle.js +45 -0
- package/dist/server/orchestration/worker-lifecycle.js.map +1 -0
- package/dist/server/project-manager.d.ts +25 -0
- package/dist/server/project-manager.d.ts.map +1 -0
- package/dist/server/project-manager.js +157 -0
- package/dist/server/project-manager.js.map +1 -0
- package/dist/server/routes/_schemas.d.ts +16 -0
- package/dist/server/routes/_schemas.d.ts.map +1 -0
- package/dist/server/routes/_schemas.js +12 -0
- package/dist/server/routes/_schemas.js.map +1 -0
- package/dist/server/routes/ask-user-question.d.ts +3 -0
- package/dist/server/routes/ask-user-question.d.ts.map +1 -0
- package/dist/server/routes/ask-user-question.js +105 -0
- package/dist/server/routes/ask-user-question.js.map +1 -0
- package/dist/server/routes/auth.d.ts +7 -0
- package/dist/server/routes/auth.d.ts.map +1 -0
- package/dist/server/routes/auth.js +126 -0
- package/dist/server/routes/auth.js.map +1 -0
- package/dist/server/routes/config.d.ts +3 -0
- package/dist/server/routes/config.d.ts.map +1 -0
- package/dist/server/routes/config.js +203 -0
- package/dist/server/routes/config.js.map +1 -0
- package/dist/server/routes/control.d.ts +3 -0
- package/dist/server/routes/control.d.ts.map +1 -0
- package/dist/server/routes/control.js +180 -0
- package/dist/server/routes/control.js.map +1 -0
- package/dist/server/routes/extension-commands.d.ts +22 -0
- package/dist/server/routes/extension-commands.d.ts.map +1 -0
- package/dist/server/routes/extension-commands.js +178 -0
- package/dist/server/routes/extension-commands.js.map +1 -0
- package/dist/server/routes/extensions.d.ts +8 -0
- package/dist/server/routes/extensions.d.ts.map +1 -0
- package/dist/server/routes/extensions.js +169 -0
- package/dist/server/routes/extensions.js.map +1 -0
- package/dist/server/routes/files.d.ts +3 -0
- package/dist/server/routes/files.d.ts.map +1 -0
- package/dist/server/routes/files.js +549 -0
- package/dist/server/routes/files.js.map +1 -0
- package/dist/server/routes/orchestration.d.ts +3 -0
- package/dist/server/routes/orchestration.d.ts.map +1 -0
- package/dist/server/routes/orchestration.js +251 -0
- package/dist/server/routes/orchestration.js.map +1 -0
- package/dist/server/routes/projects.d.ts +3 -0
- package/dist/server/routes/projects.d.ts.map +1 -0
- package/dist/server/routes/projects.js +412 -0
- package/dist/server/routes/projects.js.map +1 -0
- package/dist/server/routes/prompt.d.ts +3 -0
- package/dist/server/routes/prompt.d.ts.map +1 -0
- package/dist/server/routes/prompt.js +192 -0
- package/dist/server/routes/prompt.js.map +1 -0
- package/dist/server/routes/sessions.d.ts +3 -0
- package/dist/server/routes/sessions.d.ts.map +1 -0
- package/dist/server/routes/sessions.js +581 -0
- package/dist/server/routes/sessions.js.map +1 -0
- package/dist/server/routes/stream.d.ts +3 -0
- package/dist/server/routes/stream.d.ts.map +1 -0
- package/dist/server/routes/stream.js +109 -0
- package/dist/server/routes/stream.js.map +1 -0
- package/dist/server/session-registry.d.ts +151 -0
- package/dist/server/session-registry.d.ts.map +1 -0
- package/dist/server/session-registry.js +655 -0
- package/dist/server/session-registry.js.map +1 -0
- package/dist/server/sse-bridge.d.ts +31 -0
- package/dist/server/sse-bridge.d.ts.map +1 -0
- package/dist/server/sse-bridge.js +126 -0
- package/dist/server/sse-bridge.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension manager — runtime discovery + install for pi.dev extensions.
|
|
3
|
+
* Scans ~/.pi/agent/ for installed extensions, agents, and packages,
|
|
4
|
+
* and exposes a curated recommendation catalog optimised for pi-kot.
|
|
5
|
+
*
|
|
6
|
+
* Architecture adapted from pi-forge's extension dynamic detection pattern:
|
|
7
|
+
* detect → activate — UI features light up based on what's installed.
|
|
8
|
+
*/
|
|
9
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
10
|
+
import { existsSync } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { homedir } from "node:os";
|
|
13
|
+
import { execSync } from "node:child_process";
|
|
14
|
+
// ── Path helpers ────────────────────────────────────────────────────
|
|
15
|
+
function piAgentDir() {
|
|
16
|
+
// getAgentDir in pi SDK defaults to ~/.pi/agent
|
|
17
|
+
return join(homedir(), ".pi", "agent");
|
|
18
|
+
}
|
|
19
|
+
function extensionsDir() {
|
|
20
|
+
return join(piAgentDir(), "extensions");
|
|
21
|
+
}
|
|
22
|
+
function agentsDir() {
|
|
23
|
+
return join(piAgentDir(), "agents");
|
|
24
|
+
}
|
|
25
|
+
function settingsPath() {
|
|
26
|
+
return join(piAgentDir(), "settings.json");
|
|
27
|
+
}
|
|
28
|
+
function npmPackagePath() {
|
|
29
|
+
return join(piAgentDir(), "npm", "package.json");
|
|
30
|
+
}
|
|
31
|
+
// ── Known extension registry (curated) ──────────────────────────────
|
|
32
|
+
const knownExtensions = [
|
|
33
|
+
// ── Orchestration ──
|
|
34
|
+
{
|
|
35
|
+
id: "pi-subagents",
|
|
36
|
+
name: "pi-subagents",
|
|
37
|
+
description: "Delegates tasks to specialised subagents (scout, planner, worker, reviewer) with isolated context windows. The core multi-agent extension.",
|
|
38
|
+
package: "npm:pi-subagents",
|
|
39
|
+
category: "orchestration",
|
|
40
|
+
providesAgentTypes: ["scout", "planner", "worker", "reviewer"],
|
|
41
|
+
enablesFeatures: [
|
|
42
|
+
"Agent type config (planner/reviewer/scout/worker models)",
|
|
43
|
+
"Orchestration panel agent detail view",
|
|
44
|
+
],
|
|
45
|
+
icon: "🧩",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "pi-orchestration",
|
|
49
|
+
name: "pi-orchestration",
|
|
50
|
+
description: "Agnostic subagent orchestration with depth limiting, worktree isolation, and per-agent model selection. Supports chain and parallel execution.",
|
|
51
|
+
package: "npm:pi-orchestration",
|
|
52
|
+
category: "orchestration",
|
|
53
|
+
providesAgentTypes: ["scout", "specialist", "worker", "reviewer", "coordinator"],
|
|
54
|
+
enablesFeatures: [
|
|
55
|
+
"Advanced orchestration with depth limits",
|
|
56
|
+
"Worktree isolation for parallel agents",
|
|
57
|
+
],
|
|
58
|
+
icon: "⚡",
|
|
59
|
+
},
|
|
60
|
+
// ── Tools ──
|
|
61
|
+
{
|
|
62
|
+
id: "pi-web-access",
|
|
63
|
+
name: "pi-web-access",
|
|
64
|
+
description: "Web search, content extraction, and API interaction tools for pi. Essential for research-aware coding sessions.",
|
|
65
|
+
package: "npm:pi-web-access",
|
|
66
|
+
category: "tools",
|
|
67
|
+
enablesFeatures: ["Web search in agent sessions"],
|
|
68
|
+
icon: "🌐",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "pi-playwright",
|
|
72
|
+
name: "pi-playwright",
|
|
73
|
+
description: "Automated browser testing and web scraping via Playwright. Steer the agent through real web UI.",
|
|
74
|
+
package: "npm:pi-playwright",
|
|
75
|
+
category: "tools",
|
|
76
|
+
enablesFeatures: ["Browser automation in agent sessions"],
|
|
77
|
+
icon: "🎭",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: "pi-kilocode",
|
|
81
|
+
name: "pi-kilocode",
|
|
82
|
+
description: "Kilo Code integration for structured output, code analysis, and AI-powered code transformations.",
|
|
83
|
+
package: "npm:pi-kilocode",
|
|
84
|
+
category: "tools",
|
|
85
|
+
enablesFeatures: ["Structured code analysis"],
|
|
86
|
+
icon: "📐",
|
|
87
|
+
},
|
|
88
|
+
// ── Productivity ──
|
|
89
|
+
{
|
|
90
|
+
id: "pi-rewind",
|
|
91
|
+
name: "pi-rewind",
|
|
92
|
+
description: "Session history navigation — checkpoint, rewind, and branch from any prior state. Like undo for your agent.",
|
|
93
|
+
package: "npm:@ayulab/pi-rewind",
|
|
94
|
+
category: "productivity",
|
|
95
|
+
verified: true,
|
|
96
|
+
enablesFeatures: ["Checkpoint/rewind in session history"],
|
|
97
|
+
icon: "⏪",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
id: "pi-processes",
|
|
101
|
+
name: "pi-processes",
|
|
102
|
+
description: "Long-running background processes (dev servers, watchers, builds) that outlive a single turn. Log capture, regex watches, exit alerts.",
|
|
103
|
+
package: "npm:pi-processes",
|
|
104
|
+
category: "productivity",
|
|
105
|
+
enablesFeatures: ["Background process management"],
|
|
106
|
+
icon: "⚙️",
|
|
107
|
+
},
|
|
108
|
+
// ── Integration ──
|
|
109
|
+
{
|
|
110
|
+
id: "@ifi/pi-extension-subagents",
|
|
111
|
+
name: "pi-extension-subagents (ifi)",
|
|
112
|
+
description: "Alternative subagent implementation with built-in agent configs, conversation viewer, and cross-extension RPC.",
|
|
113
|
+
package: "npm:@ifi/pi-extension-subagents",
|
|
114
|
+
category: "orchestration",
|
|
115
|
+
providesAgentTypes: [
|
|
116
|
+
"scout",
|
|
117
|
+
"planner",
|
|
118
|
+
"worker",
|
|
119
|
+
"reviewer",
|
|
120
|
+
"context-builder",
|
|
121
|
+
"researcher",
|
|
122
|
+
"artist",
|
|
123
|
+
"frontend-designer",
|
|
124
|
+
],
|
|
125
|
+
enablesFeatures: ["Built-in agent configs", "Conversation overlay UI"],
|
|
126
|
+
icon: "🔧",
|
|
127
|
+
},
|
|
128
|
+
];
|
|
129
|
+
// ── Discovery ───────────────────────────────────────────────────────
|
|
130
|
+
/** Get installed npm packages from ~/.pi/agent/npm/package.json */
|
|
131
|
+
async function readInstalledPackages() {
|
|
132
|
+
const installed = new Set();
|
|
133
|
+
try {
|
|
134
|
+
const pkg = JSON.parse(await readFile(npmPackagePath(), "utf-8"));
|
|
135
|
+
for (const name of Object.keys(pkg.dependencies || {})) {
|
|
136
|
+
installed.add(`npm:${name}`);
|
|
137
|
+
installed.add(name);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// No npm dir yet — that's fine
|
|
142
|
+
}
|
|
143
|
+
return installed;
|
|
144
|
+
}
|
|
145
|
+
/** Scan ~/.pi/agent/extensions/ for *.ts files and subdirectories */
|
|
146
|
+
async function scanExtensionsDir() {
|
|
147
|
+
const results = [];
|
|
148
|
+
try {
|
|
149
|
+
const dir = extensionsDir();
|
|
150
|
+
if (!existsSync(dir))
|
|
151
|
+
return results;
|
|
152
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
153
|
+
for (const entry of entries) {
|
|
154
|
+
if (entry.name.endsWith(".ts")) {
|
|
155
|
+
const name = entry.name.replace(/\.ts$/, "");
|
|
156
|
+
const desc = await extractDescriptionFromExtension(join(dir, entry.name));
|
|
157
|
+
results.push({
|
|
158
|
+
name,
|
|
159
|
+
description: desc || `Custom extension at ~/.pi/agent/extensions/${entry.name}`,
|
|
160
|
+
source: "extensions_dir",
|
|
161
|
+
enablesFeatures: ["Custom extension loaded"],
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
else if (entry.isDirectory()) {
|
|
165
|
+
results.push({
|
|
166
|
+
name: entry.name,
|
|
167
|
+
description: `Extension directory at ~/.pi/agent/extensions/${entry.name}/`,
|
|
168
|
+
source: "extensions_dir",
|
|
169
|
+
enablesFeatures: ["Custom extension loaded"],
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// No extensions dir
|
|
176
|
+
}
|
|
177
|
+
return results;
|
|
178
|
+
}
|
|
179
|
+
/** Scan ~/.pi/agent/agents/ for *.md agent definitions */
|
|
180
|
+
async function scanAgentsDir() {
|
|
181
|
+
const agents = [];
|
|
182
|
+
try {
|
|
183
|
+
const dir = agentsDir();
|
|
184
|
+
if (!existsSync(dir))
|
|
185
|
+
return agents;
|
|
186
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
187
|
+
for (const entry of entries) {
|
|
188
|
+
if (!entry.name.endsWith(".md"))
|
|
189
|
+
continue;
|
|
190
|
+
const content = await readFile(join(dir, entry.name), "utf-8");
|
|
191
|
+
const name = entry.name.replace(/\.md$/, "");
|
|
192
|
+
// Parse YAML frontmatter (basic, no external dep)
|
|
193
|
+
const fM = parseFrontmatter(content);
|
|
194
|
+
agents.push({
|
|
195
|
+
name: fM.name || name,
|
|
196
|
+
description: fM.description || `Agent definition from ~/.pi/agent/agents/${entry.name}`,
|
|
197
|
+
model: fM.model,
|
|
198
|
+
tools: fM.tools?.split(",").map((t) => t.trim()).filter(Boolean),
|
|
199
|
+
source: "file",
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// No agents dir
|
|
205
|
+
}
|
|
206
|
+
return agents;
|
|
207
|
+
}
|
|
208
|
+
/** Crude frontmatter parser — enough for YAML name/desc/model/tools */
|
|
209
|
+
function parseFrontmatter(content) {
|
|
210
|
+
const result = {};
|
|
211
|
+
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
212
|
+
if (!match)
|
|
213
|
+
return result;
|
|
214
|
+
for (const line of match[1].split("\n")) {
|
|
215
|
+
const sep = line.indexOf(":");
|
|
216
|
+
if (sep === -1)
|
|
217
|
+
continue;
|
|
218
|
+
const key = line.slice(0, sep).trim();
|
|
219
|
+
const value = line.slice(sep + 1).trim().replace(/^["']|["']$/g, "");
|
|
220
|
+
result[key] = value;
|
|
221
|
+
}
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
/** Try to grab a one-liner description from an extension file */
|
|
225
|
+
async function extractDescriptionFromExtension(filePath) {
|
|
226
|
+
try {
|
|
227
|
+
const content = await readFile(filePath, "utf-8");
|
|
228
|
+
const lines = content.split("\n").slice(0, 30);
|
|
229
|
+
for (const line of lines) {
|
|
230
|
+
const trimmed = line.trim();
|
|
231
|
+
// Look for description in JSDoc
|
|
232
|
+
if (trimmed.startsWith("*") && !trimmed.startsWith("* "))
|
|
233
|
+
continue;
|
|
234
|
+
if (trimmed.startsWith("* ") && trimmed.length > 5) {
|
|
235
|
+
const text = trimmed.replace(/^\*\s?/, "");
|
|
236
|
+
if (text.length > 10)
|
|
237
|
+
return text;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// ignore
|
|
243
|
+
}
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
/** Read settings.json for configured packages */
|
|
247
|
+
async function readConfiguredPackages() {
|
|
248
|
+
try {
|
|
249
|
+
const raw = await readFile(settingsPath(), "utf-8");
|
|
250
|
+
const settings = JSON.parse(raw);
|
|
251
|
+
return settings.packages || [];
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
return [];
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// ── Main API ────────────────────────────────────────────────────────
|
|
258
|
+
export async function discoverExtensions() {
|
|
259
|
+
const installed = await readInstalledPackages();
|
|
260
|
+
const configured = new Set(await readConfiguredPackages());
|
|
261
|
+
// Scan filesystem
|
|
262
|
+
const [extFiles, agents] = await Promise.all([
|
|
263
|
+
scanExtensionsDir(),
|
|
264
|
+
scanAgentsDir(),
|
|
265
|
+
]);
|
|
266
|
+
// Build detected list from packages
|
|
267
|
+
const detectedPkgs = [];
|
|
268
|
+
for (const pkg of configured) {
|
|
269
|
+
// Look up known info
|
|
270
|
+
const known = knownExtensions.find((k) => k.package === pkg);
|
|
271
|
+
detectedPkgs.push({
|
|
272
|
+
name: known?.name ?? pkg.replace("npm:", ""),
|
|
273
|
+
description: known?.description ?? `Installed package: ${pkg}`,
|
|
274
|
+
source: "package",
|
|
275
|
+
version: known ? undefined : undefined,
|
|
276
|
+
package: pkg,
|
|
277
|
+
agentTypes: known?.providesAgentTypes,
|
|
278
|
+
enablesFeatures: known?.enablesFeatures,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
// Build recommended list with install status
|
|
282
|
+
const allInstalled = new Set();
|
|
283
|
+
for (const pkg of configured)
|
|
284
|
+
allInstalled.add(pkg);
|
|
285
|
+
installed.forEach((p) => allInstalled.add(p));
|
|
286
|
+
// Also check if agents dir has the agent types
|
|
287
|
+
const agentNames = new Set(agents.map((a) => a.name));
|
|
288
|
+
for (const ext of extFiles)
|
|
289
|
+
allInstalled.add(ext.name);
|
|
290
|
+
const recommended = knownExtensions.map((k) => ({
|
|
291
|
+
...k,
|
|
292
|
+
installed: allInstalled.has(k.package) ||
|
|
293
|
+
allInstalled.has(k.id) ||
|
|
294
|
+
allInstalled.has(k.package.replace("npm:", "").replace("@", "")) ||
|
|
295
|
+
(k.providesAgentTypes?.some((t) => agentNames.has(t)) ?? false),
|
|
296
|
+
}));
|
|
297
|
+
return {
|
|
298
|
+
detected: [...detectedPkgs, ...extFiles],
|
|
299
|
+
recommended,
|
|
300
|
+
agents,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
export async function uninstallExtension(packageName) {
|
|
304
|
+
try {
|
|
305
|
+
const npmName = packageName.replace(/^npm:/, "");
|
|
306
|
+
const pkgEntry = packageName.startsWith("npm:") ? packageName : `npm:${npmName}`;
|
|
307
|
+
// Remove from settings.json packages array
|
|
308
|
+
const settingsRaw = await readFile(settingsPath(), "utf-8");
|
|
309
|
+
const settings = JSON.parse(settingsRaw);
|
|
310
|
+
if (settings.packages) {
|
|
311
|
+
settings.packages = settings.packages.filter((p) => p !== pkgEntry);
|
|
312
|
+
}
|
|
313
|
+
// Write settings back atomically
|
|
314
|
+
const tmpPath = settingsPath() + ".tmp";
|
|
315
|
+
const { writeFile, rename } = await import("node:fs/promises");
|
|
316
|
+
await writeFile(tmpPath, JSON.stringify(settings, null, 2), "utf-8");
|
|
317
|
+
await rename(tmpPath, settingsPath());
|
|
318
|
+
// Uninstall via npm in the agent dir (keep settings clean even if npm uninstall fails)
|
|
319
|
+
const npmDir = join(piAgentDir(), "npm");
|
|
320
|
+
try {
|
|
321
|
+
execSync(`npm uninstall ${npmName}`, {
|
|
322
|
+
cwd: npmDir,
|
|
323
|
+
stdio: "pipe",
|
|
324
|
+
timeout: 60_000,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
// npm uninstall may fail if the package isn't actually installed
|
|
329
|
+
// but we already cleaned the settings — best effort
|
|
330
|
+
}
|
|
331
|
+
return { success: true };
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
335
|
+
return { success: false, error: message };
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
export async function installExtension(packageName) {
|
|
339
|
+
try {
|
|
340
|
+
// Strip npm: prefix if present
|
|
341
|
+
const npmName = packageName.replace(/^npm:/, "");
|
|
342
|
+
// Add to settings.json packages array
|
|
343
|
+
const settingsRaw = await readFile(settingsPath(), "utf-8");
|
|
344
|
+
const settings = JSON.parse(settingsRaw);
|
|
345
|
+
if (!settings.packages)
|
|
346
|
+
settings.packages = [];
|
|
347
|
+
const pkgEntry = packageName.startsWith("npm:") ? packageName : `npm:${npmName}`;
|
|
348
|
+
if (!settings.packages.includes(pkgEntry)) {
|
|
349
|
+
settings.packages.push(pkgEntry);
|
|
350
|
+
}
|
|
351
|
+
// Write settings back atomically
|
|
352
|
+
const tmpPath = settingsPath() + ".tmp";
|
|
353
|
+
const { writeFile, rename } = await import("node:fs/promises");
|
|
354
|
+
await writeFile(tmpPath, JSON.stringify(settings, null, 2), "utf-8");
|
|
355
|
+
await rename(tmpPath, settingsPath());
|
|
356
|
+
// Install via npm in the agent dir
|
|
357
|
+
const npmDir = join(piAgentDir(), "npm");
|
|
358
|
+
execSync(`npm install ${npmName}`, {
|
|
359
|
+
cwd: npmDir,
|
|
360
|
+
stdio: "pipe",
|
|
361
|
+
timeout: 120_000,
|
|
362
|
+
});
|
|
363
|
+
return { success: true };
|
|
364
|
+
}
|
|
365
|
+
catch (err) {
|
|
366
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
367
|
+
return { success: false, error: message };
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/** Built-in agent definitions (builtin defaults like pi-subagents examples) */
|
|
371
|
+
export const builtinAgentDefs = [
|
|
372
|
+
{
|
|
373
|
+
name: "scout",
|
|
374
|
+
description: "Fast codebase recon — returns compressed context for handoff to other agents",
|
|
375
|
+
model: "claude-haiku-4-5",
|
|
376
|
+
tools: ["read", "grep", "find", "ls", "bash"],
|
|
377
|
+
source: "builtin",
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
name: "planner",
|
|
381
|
+
description: "Creates implementation plans with structured analysis",
|
|
382
|
+
model: "claude-sonnet-4-5",
|
|
383
|
+
tools: ["read", "grep", "find", "ls"],
|
|
384
|
+
source: "builtin",
|
|
385
|
+
},
|
|
386
|
+
{
|
|
387
|
+
name: "reviewer",
|
|
388
|
+
description: "Code review & quality assurance — checks for issues, security, and style",
|
|
389
|
+
model: "claude-sonnet-4-5",
|
|
390
|
+
tools: ["read", "grep", "find", "ls", "bash"],
|
|
391
|
+
source: "builtin",
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
name: "worker",
|
|
395
|
+
description: "General-purpose task execution with full capabilities",
|
|
396
|
+
model: "claude-sonnet-4-5",
|
|
397
|
+
tools: [],
|
|
398
|
+
source: "builtin",
|
|
399
|
+
},
|
|
400
|
+
];
|
|
401
|
+
//# sourceMappingURL=extension-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-manager.js","sourceRoot":"","sources":["../src/extension-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension UI Bridge — adapts extension `ctx.ui` interactions (select, confirm,
|
|
3
|
+
* notify) to the WebSocket/SSE + REST model of pi-kot's web GUI.
|
|
4
|
+
*
|
|
5
|
+
* When the extension calls `ctx.ui.select("Rewind to checkpoint:", items)`, this
|
|
6
|
+
* bridge sends an `extension_ui_select` SSE event to the browser, creating a
|
|
7
|
+
* pending request. The browser renders the selector and responds via
|
|
8
|
+
* `POST /api/v1/sessions/:id/extension-ui/respond`, which resolves the promise
|
|
9
|
+
* and lets the extension continue.
|
|
10
|
+
*
|
|
11
|
+
* Unused TUI-specific methods (setWidget, setFooter, setHeader, custom, …) are
|
|
12
|
+
* no-ops so that any extension command works unmodified through the bridge.
|
|
13
|
+
*/
|
|
14
|
+
import type { ExtensionUIContext } from "@earendil-works/pi-coding-agent";
|
|
15
|
+
import type { SSEClient } from "./session-registry.js";
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a pending select/confirm/input request.
|
|
18
|
+
* Called from `POST /api/v1/sessions/:id/extension-ui/respond`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resolveExtensionUIRequest(requestId: string, value: unknown): boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Cancel all pending requests (e.g., when the command is aborted or session
|
|
23
|
+
* is disposed). Each pending promise rejects so the extension handler sees
|
|
24
|
+
* a cancelled/interrupted state.
|
|
25
|
+
*/
|
|
26
|
+
export declare function cancelAllPendingRequests(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Create an `ExtensionUIContext` that bridges extension UI interactions
|
|
29
|
+
* to the browser GUI via SSE events + REST callbacks.
|
|
30
|
+
*
|
|
31
|
+
* @param clients - The live session's connected SSE clients.
|
|
32
|
+
* @param sessionId - The session ID, included in SSE events for routing.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createBridgeUIContext(clients: Set<SSEClient>, sessionId: string): ExtensionUIContext;
|
|
35
|
+
//# sourceMappingURL=extension-ui-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extension-ui-bridge.d.ts","sourceRoot":"","sources":["../src/extension-ui-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,kBAAkB,EAInB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAiBvD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GACb,OAAO,CA0BT;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAiB/C;AAOD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,EACvB,SAAS,EAAE,MAAM,GAChB,kBAAkB,CAqLpB"}
|