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.
Files changed (222) hide show
  1. package/README.md +30 -0
  2. package/bin/pi-kot.mjs +125 -0
  3. package/dist/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  4. package/dist/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  5. package/dist/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  6. package/dist/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  7. package/dist/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  8. package/dist/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  9. package/dist/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  10. package/dist/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  11. package/dist/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  12. package/dist/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  13. package/dist/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  14. package/dist/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  15. package/dist/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  16. package/dist/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  17. package/dist/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  18. package/dist/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  19. package/dist/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  20. package/dist/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  21. package/dist/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  22. package/dist/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  23. package/dist/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  24. package/dist/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  25. package/dist/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  26. package/dist/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  27. package/dist/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  28. package/dist/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  29. package/dist/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  30. package/dist/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  31. package/dist/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  32. package/dist/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  33. package/dist/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  34. package/dist/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  35. package/dist/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  36. package/dist/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  37. package/dist/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  38. package/dist/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  39. package/dist/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  40. package/dist/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  41. package/dist/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  42. package/dist/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  43. package/dist/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  44. package/dist/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  45. package/dist/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  46. package/dist/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  47. package/dist/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  48. package/dist/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  49. package/dist/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  50. package/dist/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  51. package/dist/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  52. package/dist/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  53. package/dist/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  54. package/dist/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  55. package/dist/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  56. package/dist/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  57. package/dist/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  58. package/dist/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  59. package/dist/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  60. package/dist/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  61. package/dist/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  62. package/dist/client/assets/index-UJgsBs6a.js +361 -0
  63. package/dist/client/assets/index-UJgsBs6a.js.map +1 -0
  64. package/dist/client/assets/index-ZuTc_0YY.css +1 -0
  65. package/dist/client/index.html +14 -0
  66. package/dist/server/ask-user-question/envelope.d.ts +11 -0
  67. package/dist/server/ask-user-question/envelope.d.ts.map +1 -0
  68. package/dist/server/ask-user-question/envelope.js +41 -0
  69. package/dist/server/ask-user-question/envelope.js.map +1 -0
  70. package/dist/server/ask-user-question/prompt-strings.d.ts +4 -0
  71. package/dist/server/ask-user-question/prompt-strings.d.ts.map +1 -0
  72. package/dist/server/ask-user-question/prompt-strings.js +18 -0
  73. package/dist/server/ask-user-question/prompt-strings.js.map +1 -0
  74. package/dist/server/ask-user-question/registry.d.ts +39 -0
  75. package/dist/server/ask-user-question/registry.d.ts.map +1 -0
  76. package/dist/server/ask-user-question/registry.js +124 -0
  77. package/dist/server/ask-user-question/registry.js.map +1 -0
  78. package/dist/server/ask-user-question/tool.d.ts +4 -0
  79. package/dist/server/ask-user-question/tool.d.ts.map +1 -0
  80. package/dist/server/ask-user-question/tool.js +68 -0
  81. package/dist/server/ask-user-question/tool.js.map +1 -0
  82. package/dist/server/ask-user-question/types.d.ts +50 -0
  83. package/dist/server/ask-user-question/types.d.ts.map +1 -0
  84. package/dist/server/ask-user-question/types.js +7 -0
  85. package/dist/server/ask-user-question/types.js.map +1 -0
  86. package/dist/server/ask-user-question/validate.d.ts +3 -0
  87. package/dist/server/ask-user-question/validate.d.ts.map +1 -0
  88. package/dist/server/ask-user-question/validate.js +67 -0
  89. package/dist/server/ask-user-question/validate.js.map +1 -0
  90. package/dist/server/config-manager.d.ts +47 -0
  91. package/dist/server/config-manager.d.ts.map +1 -0
  92. package/dist/server/config-manager.js +182 -0
  93. package/dist/server/config-manager.js.map +1 -0
  94. package/dist/server/config.d.ts +20 -0
  95. package/dist/server/config.d.ts.map +1 -0
  96. package/dist/server/config.js +58 -0
  97. package/dist/server/config.js.map +1 -0
  98. package/dist/server/extension-manager.d.ts +70 -0
  99. package/dist/server/extension-manager.d.ts.map +1 -0
  100. package/dist/server/extension-manager.js +401 -0
  101. package/dist/server/extension-manager.js.map +1 -0
  102. package/dist/server/extension-ui-bridge.d.ts +35 -0
  103. package/dist/server/extension-ui-bridge.d.ts.map +1 -0
  104. package/dist/server/extension-ui-bridge.js +228 -0
  105. package/dist/server/extension-ui-bridge.js.map +1 -0
  106. package/dist/server/file-manager.d.ts +79 -0
  107. package/dist/server/file-manager.d.ts.map +1 -0
  108. package/dist/server/file-manager.js +526 -0
  109. package/dist/server/file-manager.js.map +1 -0
  110. package/dist/server/file-searcher.d.ts +29 -0
  111. package/dist/server/file-searcher.d.ts.map +1 -0
  112. package/dist/server/file-searcher.js +318 -0
  113. package/dist/server/file-searcher.js.map +1 -0
  114. package/dist/server/git-clone.d.ts +56 -0
  115. package/dist/server/git-clone.d.ts.map +1 -0
  116. package/dist/server/git-clone.js +173 -0
  117. package/dist/server/git-clone.js.map +1 -0
  118. package/dist/server/index.d.ts +22 -0
  119. package/dist/server/index.d.ts.map +1 -0
  120. package/dist/server/index.js +196 -0
  121. package/dist/server/index.js.map +1 -0
  122. package/dist/server/lifecycle-notifications.d.ts +28 -0
  123. package/dist/server/lifecycle-notifications.d.ts.map +1 -0
  124. package/dist/server/lifecycle-notifications.js +38 -0
  125. package/dist/server/lifecycle-notifications.js.map +1 -0
  126. package/dist/server/orchestration/config.d.ts +5 -0
  127. package/dist/server/orchestration/config.d.ts.map +1 -0
  128. package/dist/server/orchestration/config.js +35 -0
  129. package/dist/server/orchestration/config.js.map +1 -0
  130. package/dist/server/orchestration/event-bridge.d.ts +32 -0
  131. package/dist/server/orchestration/event-bridge.d.ts.map +1 -0
  132. package/dist/server/orchestration/event-bridge.js +110 -0
  133. package/dist/server/orchestration/event-bridge.js.map +1 -0
  134. package/dist/server/orchestration/inbox.d.ts +9 -0
  135. package/dist/server/orchestration/inbox.d.ts.map +1 -0
  136. package/dist/server/orchestration/inbox.js +186 -0
  137. package/dist/server/orchestration/inbox.js.map +1 -0
  138. package/dist/server/orchestration/init.d.ts +2 -0
  139. package/dist/server/orchestration/init.d.ts.map +1 -0
  140. package/dist/server/orchestration/init.js +22 -0
  141. package/dist/server/orchestration/init.js.map +1 -0
  142. package/dist/server/orchestration/store.d.ts +33 -0
  143. package/dist/server/orchestration/store.d.ts.map +1 -0
  144. package/dist/server/orchestration/store.js +331 -0
  145. package/dist/server/orchestration/store.js.map +1 -0
  146. package/dist/server/orchestration/tools.d.ts +15 -0
  147. package/dist/server/orchestration/tools.d.ts.map +1 -0
  148. package/dist/server/orchestration/tools.js +621 -0
  149. package/dist/server/orchestration/tools.js.map +1 -0
  150. package/dist/server/orchestration/types.d.ts +68 -0
  151. package/dist/server/orchestration/types.d.ts.map +1 -0
  152. package/dist/server/orchestration/types.js +43 -0
  153. package/dist/server/orchestration/types.js.map +1 -0
  154. package/dist/server/orchestration/worker-lifecycle.d.ts +15 -0
  155. package/dist/server/orchestration/worker-lifecycle.d.ts.map +1 -0
  156. package/dist/server/orchestration/worker-lifecycle.js +45 -0
  157. package/dist/server/orchestration/worker-lifecycle.js.map +1 -0
  158. package/dist/server/project-manager.d.ts +25 -0
  159. package/dist/server/project-manager.d.ts.map +1 -0
  160. package/dist/server/project-manager.js +157 -0
  161. package/dist/server/project-manager.js.map +1 -0
  162. package/dist/server/routes/_schemas.d.ts +16 -0
  163. package/dist/server/routes/_schemas.d.ts.map +1 -0
  164. package/dist/server/routes/_schemas.js +12 -0
  165. package/dist/server/routes/_schemas.js.map +1 -0
  166. package/dist/server/routes/ask-user-question.d.ts +3 -0
  167. package/dist/server/routes/ask-user-question.d.ts.map +1 -0
  168. package/dist/server/routes/ask-user-question.js +105 -0
  169. package/dist/server/routes/ask-user-question.js.map +1 -0
  170. package/dist/server/routes/auth.d.ts +7 -0
  171. package/dist/server/routes/auth.d.ts.map +1 -0
  172. package/dist/server/routes/auth.js +126 -0
  173. package/dist/server/routes/auth.js.map +1 -0
  174. package/dist/server/routes/config.d.ts +3 -0
  175. package/dist/server/routes/config.d.ts.map +1 -0
  176. package/dist/server/routes/config.js +203 -0
  177. package/dist/server/routes/config.js.map +1 -0
  178. package/dist/server/routes/control.d.ts +3 -0
  179. package/dist/server/routes/control.d.ts.map +1 -0
  180. package/dist/server/routes/control.js +180 -0
  181. package/dist/server/routes/control.js.map +1 -0
  182. package/dist/server/routes/extension-commands.d.ts +22 -0
  183. package/dist/server/routes/extension-commands.d.ts.map +1 -0
  184. package/dist/server/routes/extension-commands.js +178 -0
  185. package/dist/server/routes/extension-commands.js.map +1 -0
  186. package/dist/server/routes/extensions.d.ts +8 -0
  187. package/dist/server/routes/extensions.d.ts.map +1 -0
  188. package/dist/server/routes/extensions.js +169 -0
  189. package/dist/server/routes/extensions.js.map +1 -0
  190. package/dist/server/routes/files.d.ts +3 -0
  191. package/dist/server/routes/files.d.ts.map +1 -0
  192. package/dist/server/routes/files.js +549 -0
  193. package/dist/server/routes/files.js.map +1 -0
  194. package/dist/server/routes/orchestration.d.ts +3 -0
  195. package/dist/server/routes/orchestration.d.ts.map +1 -0
  196. package/dist/server/routes/orchestration.js +251 -0
  197. package/dist/server/routes/orchestration.js.map +1 -0
  198. package/dist/server/routes/projects.d.ts +3 -0
  199. package/dist/server/routes/projects.d.ts.map +1 -0
  200. package/dist/server/routes/projects.js +412 -0
  201. package/dist/server/routes/projects.js.map +1 -0
  202. package/dist/server/routes/prompt.d.ts +3 -0
  203. package/dist/server/routes/prompt.d.ts.map +1 -0
  204. package/dist/server/routes/prompt.js +192 -0
  205. package/dist/server/routes/prompt.js.map +1 -0
  206. package/dist/server/routes/sessions.d.ts +3 -0
  207. package/dist/server/routes/sessions.d.ts.map +1 -0
  208. package/dist/server/routes/sessions.js +581 -0
  209. package/dist/server/routes/sessions.js.map +1 -0
  210. package/dist/server/routes/stream.d.ts +3 -0
  211. package/dist/server/routes/stream.d.ts.map +1 -0
  212. package/dist/server/routes/stream.js +109 -0
  213. package/dist/server/routes/stream.js.map +1 -0
  214. package/dist/server/session-registry.d.ts +151 -0
  215. package/dist/server/session-registry.d.ts.map +1 -0
  216. package/dist/server/session-registry.js +655 -0
  217. package/dist/server/session-registry.js.map +1 -0
  218. package/dist/server/sse-bridge.d.ts +31 -0
  219. package/dist/server/sse-bridge.d.ts.map +1 -0
  220. package/dist/server/sse-bridge.js +126 -0
  221. package/dist/server/sse-bridge.js.map +1 -0
  222. 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"}