pi-kot 0.1.19 → 0.1.21
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 +253 -17
- package/package.json +8 -60
- package/bin/pi-kot.mjs +0 -148
- 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-B6Hxrz4s.js +0 -448
- package/dist/client/assets/index-B6Hxrz4s.js.map +0 -1
- package/dist/client/assets/index-BPImbgFg.css +0 -1
- package/dist/client/index.html +0 -14
- package/dist/server/ask-user-question/envelope.d.ts +0 -11
- package/dist/server/ask-user-question/envelope.d.ts.map +0 -1
- package/dist/server/ask-user-question/envelope.js +0 -41
- package/dist/server/ask-user-question/envelope.js.map +0 -1
- package/dist/server/ask-user-question/plan-mode-question-tool.d.ts +0 -26
- package/dist/server/ask-user-question/plan-mode-question-tool.d.ts.map +0 -1
- package/dist/server/ask-user-question/plan-mode-question-tool.js +0 -273
- package/dist/server/ask-user-question/plan-mode-question-tool.js.map +0 -1
- package/dist/server/ask-user-question/prompt-strings.d.ts +0 -4
- package/dist/server/ask-user-question/prompt-strings.d.ts.map +0 -1
- package/dist/server/ask-user-question/prompt-strings.js +0 -18
- package/dist/server/ask-user-question/prompt-strings.js.map +0 -1
- package/dist/server/ask-user-question/registry.d.ts +0 -39
- package/dist/server/ask-user-question/registry.d.ts.map +0 -1
- package/dist/server/ask-user-question/registry.js +0 -124
- package/dist/server/ask-user-question/registry.js.map +0 -1
- package/dist/server/ask-user-question/tool.d.ts +0 -4
- package/dist/server/ask-user-question/tool.d.ts.map +0 -1
- package/dist/server/ask-user-question/tool.js +0 -68
- package/dist/server/ask-user-question/tool.js.map +0 -1
- package/dist/server/ask-user-question/types.d.ts +0 -50
- package/dist/server/ask-user-question/types.d.ts.map +0 -1
- package/dist/server/ask-user-question/types.js +0 -7
- package/dist/server/ask-user-question/types.js.map +0 -1
- package/dist/server/ask-user-question/validate.d.ts +0 -3
- package/dist/server/ask-user-question/validate.d.ts.map +0 -1
- package/dist/server/ask-user-question/validate.js +0 -67
- package/dist/server/ask-user-question/validate.js.map +0 -1
- package/dist/server/compaction-continuation.d.ts +0 -113
- package/dist/server/compaction-continuation.d.ts.map +0 -1
- package/dist/server/compaction-continuation.js +0 -65
- package/dist/server/compaction-continuation.js.map +0 -1
- package/dist/server/compaction-history.d.ts +0 -62
- package/dist/server/compaction-history.d.ts.map +0 -1
- package/dist/server/compaction-history.js +0 -180
- package/dist/server/compaction-history.js.map +0 -1
- package/dist/server/config-manager.d.ts +0 -97
- package/dist/server/config-manager.d.ts.map +0 -1
- package/dist/server/config-manager.js +0 -352
- package/dist/server/config-manager.js.map +0 -1
- package/dist/server/config.d.ts +0 -24
- package/dist/server/config.d.ts.map +0 -1
- package/dist/server/config.js +0 -67
- package/dist/server/config.js.map +0 -1
- package/dist/server/extension-manager.d.ts +0 -116
- package/dist/server/extension-manager.d.ts.map +0 -1
- package/dist/server/extension-manager.js +0 -586
- package/dist/server/extension-manager.js.map +0 -1
- package/dist/server/extension-ui-bridge.d.ts +0 -35
- package/dist/server/extension-ui-bridge.d.ts.map +0 -1
- package/dist/server/extension-ui-bridge.js +0 -228
- package/dist/server/extension-ui-bridge.js.map +0 -1
- package/dist/server/extensions-discovery.d.ts +0 -26
- package/dist/server/extensions-discovery.d.ts.map +0 -1
- package/dist/server/extensions-discovery.js +0 -107
- package/dist/server/extensions-discovery.js.map +0 -1
- package/dist/server/file-manager.d.ts +0 -79
- package/dist/server/file-manager.d.ts.map +0 -1
- package/dist/server/file-manager.js +0 -535
- package/dist/server/file-manager.js.map +0 -1
- package/dist/server/file-references.d.ts +0 -5
- package/dist/server/file-references.d.ts.map +0 -1
- package/dist/server/file-references.js +0 -249
- package/dist/server/file-references.js.map +0 -1
- package/dist/server/file-searcher.d.ts +0 -29
- package/dist/server/file-searcher.d.ts.map +0 -1
- package/dist/server/file-searcher.js +0 -318
- package/dist/server/file-searcher.js.map +0 -1
- package/dist/server/git-clone.d.ts +0 -56
- package/dist/server/git-clone.d.ts.map +0 -1
- package/dist/server/git-clone.js +0 -173
- package/dist/server/git-clone.js.map +0 -1
- package/dist/server/git-hunk-stager.d.ts +0 -56
- package/dist/server/git-hunk-stager.d.ts.map +0 -1
- package/dist/server/git-hunk-stager.js +0 -137
- package/dist/server/git-hunk-stager.js.map +0 -1
- package/dist/server/git-runner.d.ts +0 -346
- package/dist/server/git-runner.d.ts.map +0 -1
- package/dist/server/git-runner.js +0 -884
- package/dist/server/git-runner.js.map +0 -1
- package/dist/server/index.d.ts +0 -22
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -262
- package/dist/server/index.js.map +0 -1
- package/dist/server/lifecycle-notifications.d.ts +0 -28
- package/dist/server/lifecycle-notifications.d.ts.map +0 -1
- package/dist/server/lifecycle-notifications.js +0 -38
- package/dist/server/lifecycle-notifications.js.map +0 -1
- package/dist/server/mcp/config.d.ts +0 -23
- package/dist/server/mcp/config.d.ts.map +0 -1
- package/dist/server/mcp/config.js +0 -139
- package/dist/server/mcp/config.js.map +0 -1
- package/dist/server/mcp/manager.d.ts +0 -40
- package/dist/server/mcp/manager.d.ts.map +0 -1
- package/dist/server/mcp/manager.js +0 -435
- package/dist/server/mcp/manager.js.map +0 -1
- package/dist/server/mcp/stdio-trust.d.ts +0 -5
- package/dist/server/mcp/stdio-trust.d.ts.map +0 -1
- package/dist/server/mcp/stdio-trust.js +0 -78
- package/dist/server/mcp/stdio-trust.js.map +0 -1
- package/dist/server/mcp/tool-bridge.d.ts +0 -33
- package/dist/server/mcp/tool-bridge.d.ts.map +0 -1
- package/dist/server/mcp/tool-bridge.js +0 -138
- package/dist/server/mcp/tool-bridge.js.map +0 -1
- package/dist/server/orchestration/config.d.ts +0 -5
- package/dist/server/orchestration/config.d.ts.map +0 -1
- package/dist/server/orchestration/config.js +0 -35
- package/dist/server/orchestration/config.js.map +0 -1
- package/dist/server/orchestration/event-bridge.d.ts +0 -32
- package/dist/server/orchestration/event-bridge.d.ts.map +0 -1
- package/dist/server/orchestration/event-bridge.js +0 -110
- package/dist/server/orchestration/event-bridge.js.map +0 -1
- package/dist/server/orchestration/inbox.d.ts +0 -9
- package/dist/server/orchestration/inbox.d.ts.map +0 -1
- package/dist/server/orchestration/inbox.js +0 -186
- package/dist/server/orchestration/inbox.js.map +0 -1
- package/dist/server/orchestration/init.d.ts +0 -2
- package/dist/server/orchestration/init.d.ts.map +0 -1
- package/dist/server/orchestration/init.js +0 -22
- package/dist/server/orchestration/init.js.map +0 -1
- package/dist/server/orchestration/store.d.ts +0 -33
- package/dist/server/orchestration/store.d.ts.map +0 -1
- package/dist/server/orchestration/store.js +0 -331
- package/dist/server/orchestration/store.js.map +0 -1
- package/dist/server/orchestration/tools.d.ts +0 -15
- package/dist/server/orchestration/tools.d.ts.map +0 -1
- package/dist/server/orchestration/tools.js +0 -621
- package/dist/server/orchestration/tools.js.map +0 -1
- package/dist/server/orchestration/types.d.ts +0 -68
- package/dist/server/orchestration/types.d.ts.map +0 -1
- package/dist/server/orchestration/types.js +0 -43
- package/dist/server/orchestration/types.js.map +0 -1
- package/dist/server/orchestration/worker-lifecycle.d.ts +0 -15
- package/dist/server/orchestration/worker-lifecycle.d.ts.map +0 -1
- package/dist/server/orchestration/worker-lifecycle.js +0 -45
- package/dist/server/orchestration/worker-lifecycle.js.map +0 -1
- package/dist/server/project-manager.d.ts +0 -25
- package/dist/server/project-manager.d.ts.map +0 -1
- package/dist/server/project-manager.js +0 -157
- package/dist/server/project-manager.js.map +0 -1
- package/dist/server/pty-manager.d.ts +0 -54
- package/dist/server/pty-manager.d.ts.map +0 -1
- package/dist/server/pty-manager.js +0 -220
- package/dist/server/pty-manager.js.map +0 -1
- package/dist/server/routes/_schemas.d.ts +0 -16
- package/dist/server/routes/_schemas.d.ts.map +0 -1
- package/dist/server/routes/_schemas.js +0 -12
- package/dist/server/routes/_schemas.js.map +0 -1
- package/dist/server/routes/ask-user-question.d.ts +0 -3
- package/dist/server/routes/ask-user-question.d.ts.map +0 -1
- package/dist/server/routes/ask-user-question.js +0 -105
- package/dist/server/routes/ask-user-question.js.map +0 -1
- package/dist/server/routes/auth.d.ts +0 -8
- package/dist/server/routes/auth.d.ts.map +0 -1
- package/dist/server/routes/auth.js +0 -225
- package/dist/server/routes/auth.js.map +0 -1
- package/dist/server/routes/config.d.ts +0 -3
- package/dist/server/routes/config.d.ts.map +0 -1
- package/dist/server/routes/config.js +0 -568
- package/dist/server/routes/config.js.map +0 -1
- package/dist/server/routes/control.d.ts +0 -3
- package/dist/server/routes/control.d.ts.map +0 -1
- package/dist/server/routes/control.js +0 -365
- package/dist/server/routes/control.js.map +0 -1
- package/dist/server/routes/exec.d.ts +0 -3
- package/dist/server/routes/exec.d.ts.map +0 -1
- package/dist/server/routes/exec.js +0 -426
- package/dist/server/routes/exec.js.map +0 -1
- package/dist/server/routes/extension-commands.d.ts +0 -22
- package/dist/server/routes/extension-commands.d.ts.map +0 -1
- package/dist/server/routes/extension-commands.js +0 -178
- package/dist/server/routes/extension-commands.js.map +0 -1
- package/dist/server/routes/extensions.d.ts +0 -8
- package/dist/server/routes/extensions.d.ts.map +0 -1
- package/dist/server/routes/extensions.js +0 -414
- package/dist/server/routes/extensions.js.map +0 -1
- package/dist/server/routes/files.d.ts +0 -3
- package/dist/server/routes/files.d.ts.map +0 -1
- package/dist/server/routes/files.js +0 -835
- package/dist/server/routes/files.js.map +0 -1
- package/dist/server/routes/git.d.ts +0 -3
- package/dist/server/routes/git.d.ts.map +0 -1
- package/dist/server/routes/git.js +0 -1058
- package/dist/server/routes/git.js.map +0 -1
- package/dist/server/routes/mcp.d.ts +0 -3
- package/dist/server/routes/mcp.d.ts.map +0 -1
- package/dist/server/routes/mcp.js +0 -403
- package/dist/server/routes/mcp.js.map +0 -1
- package/dist/server/routes/orchestration.d.ts +0 -3
- package/dist/server/routes/orchestration.d.ts.map +0 -1
- package/dist/server/routes/orchestration.js +0 -251
- package/dist/server/routes/orchestration.js.map +0 -1
- package/dist/server/routes/projects.d.ts +0 -3
- package/dist/server/routes/projects.d.ts.map +0 -1
- package/dist/server/routes/projects.js +0 -421
- package/dist/server/routes/projects.js.map +0 -1
- package/dist/server/routes/prompt.d.ts +0 -3
- package/dist/server/routes/prompt.d.ts.map +0 -1
- package/dist/server/routes/prompt.js +0 -311
- package/dist/server/routes/prompt.js.map +0 -1
- package/dist/server/routes/session-extensions.d.ts +0 -11
- package/dist/server/routes/session-extensions.d.ts.map +0 -1
- package/dist/server/routes/session-extensions.js +0 -171
- package/dist/server/routes/session-extensions.js.map +0 -1
- package/dist/server/routes/sessions.d.ts +0 -3
- package/dist/server/routes/sessions.d.ts.map +0 -1
- package/dist/server/routes/sessions.js +0 -706
- package/dist/server/routes/sessions.js.map +0 -1
- package/dist/server/routes/skills.d.ts +0 -14
- package/dist/server/routes/skills.d.ts.map +0 -1
- package/dist/server/routes/skills.js +0 -448
- package/dist/server/routes/skills.js.map +0 -1
- package/dist/server/routes/stream.d.ts +0 -3
- package/dist/server/routes/stream.d.ts.map +0 -1
- package/dist/server/routes/stream.js +0 -112
- package/dist/server/routes/stream.js.map +0 -1
- package/dist/server/routes/terminal.d.ts +0 -28
- package/dist/server/routes/terminal.d.ts.map +0 -1
- package/dist/server/routes/terminal.js +0 -211
- package/dist/server/routes/terminal.js.map +0 -1
- package/dist/server/routes/tunnel.d.ts +0 -13
- package/dist/server/routes/tunnel.d.ts.map +0 -1
- package/dist/server/routes/tunnel.js +0 -231
- package/dist/server/routes/tunnel.js.map +0 -1
- package/dist/server/session-registry.d.ts +0 -164
- package/dist/server/session-registry.d.ts.map +0 -1
- package/dist/server/session-registry.js +0 -754
- package/dist/server/session-registry.js.map +0 -1
- package/dist/server/skill-overrides.d.ts +0 -47
- package/dist/server/skill-overrides.d.ts.map +0 -1
- package/dist/server/skill-overrides.js +0 -178
- package/dist/server/skill-overrides.js.map +0 -1
- package/dist/server/sse-bridge.d.ts +0 -31
- package/dist/server/sse-bridge.d.ts.map +0 -1
- package/dist/server/sse-bridge.js +0 -158
- package/dist/server/sse-bridge.js.map +0 -1
- package/dist/server/tool-overrides.d.ts +0 -39
- package/dist/server/tool-overrides.d.ts.map +0 -1
- package/dist/server/tool-overrides.js +0 -121
- package/dist/server/tool-overrides.js.map +0 -1
- package/dist/server/tunnel/executable-search.d.ts +0 -45
- package/dist/server/tunnel/executable-search.d.ts.map +0 -1
- package/dist/server/tunnel/executable-search.js +0 -150
- package/dist/server/tunnel/executable-search.js.map +0 -1
- package/dist/server/tunnel/install-help.d.ts +0 -19
- package/dist/server/tunnel/install-help.d.ts.map +0 -1
- package/dist/server/tunnel/install-help.js +0 -47
- package/dist/server/tunnel/install-help.js.map +0 -1
- package/dist/server/tunnel/providers/ngrok.d.ts +0 -34
- package/dist/server/tunnel/providers/ngrok.d.ts.map +0 -1
- package/dist/server/tunnel/providers/ngrok.js +0 -464
- package/dist/server/tunnel/providers/ngrok.js.map +0 -1
- package/dist/server/tunnel/registry.d.ts +0 -15
- package/dist/server/tunnel/registry.d.ts.map +0 -1
- package/dist/server/tunnel/registry.js +0 -58
- package/dist/server/tunnel/registry.js.map +0 -1
- package/dist/server/tunnel/service.d.ts +0 -15
- package/dist/server/tunnel/service.d.ts.map +0 -1
- package/dist/server/tunnel/service.js +0 -158
- package/dist/server/tunnel/service.js.map +0 -1
- package/dist/server/tunnel/types.d.ts +0 -166
- package/dist/server/tunnel/types.d.ts.map +0 -1
- package/dist/server/tunnel/types.js +0 -217
- package/dist/server/tunnel/types.js.map +0 -1
|
@@ -1,586 +0,0 @@
|
|
|
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: extension dynamic detection pattern:
|
|
7
|
-
* detect → activate — UI features light up based on what's installed.
|
|
8
|
-
*
|
|
9
|
-
* Update checking:
|
|
10
|
-
* checkExtensionUpdates() compares installed vs. npm registry latest.
|
|
11
|
-
* updateExtension() runs npm install to upgrade to latest.
|
|
12
|
-
*/
|
|
13
|
-
import { readFile, readdir } from "node:fs/promises";
|
|
14
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
-
import { join } from "node:path";
|
|
16
|
-
import { homedir } from "node:os";
|
|
17
|
-
import { execSync } from "node:child_process";
|
|
18
|
-
// ── Path helpers ────────────────────────────────────────────────────
|
|
19
|
-
function piAgentDir() {
|
|
20
|
-
// getAgentDir in pi SDK defaults to ~/.pi/agent
|
|
21
|
-
return join(homedir(), ".pi", "agent");
|
|
22
|
-
}
|
|
23
|
-
function extensionsDir() {
|
|
24
|
-
return join(piAgentDir(), "extensions");
|
|
25
|
-
}
|
|
26
|
-
function agentsDir() {
|
|
27
|
-
return join(piAgentDir(), "agents");
|
|
28
|
-
}
|
|
29
|
-
function settingsPath() {
|
|
30
|
-
return join(piAgentDir(), "settings.json");
|
|
31
|
-
}
|
|
32
|
-
function npmPackagePath() {
|
|
33
|
-
return join(piAgentDir(), "npm", "package.json");
|
|
34
|
-
}
|
|
35
|
-
// ── Known extension registry (curated) ──────────────────────────────
|
|
36
|
-
const knownExtensions = [
|
|
37
|
-
// ── Tools ──
|
|
38
|
-
{
|
|
39
|
-
id: "pi-web-access",
|
|
40
|
-
name: "pi-web-access",
|
|
41
|
-
description: "Web search, content extraction, and API interaction tools for pi. Essential for research-aware coding sessions.",
|
|
42
|
-
package: "npm:pi-web-access",
|
|
43
|
-
category: "tools",
|
|
44
|
-
verified: true,
|
|
45
|
-
enablesFeatures: ["Web search in agent sessions"],
|
|
46
|
-
icon: "🌐",
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
id: "pi-playwright",
|
|
50
|
-
name: "pi-playwright",
|
|
51
|
-
description: "Automated browser testing and web scraping via Playwright. Steer the agent through real web UI.",
|
|
52
|
-
package: "npm:pi-playwright",
|
|
53
|
-
category: "tools",
|
|
54
|
-
enablesFeatures: ["Browser automation in agent sessions"],
|
|
55
|
-
icon: "🎭",
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
id: "pi-vision-tool",
|
|
59
|
-
name: "pi-vision-tool",
|
|
60
|
-
description: "Delegates image analysis to a vision-capable model. Non-vision models can call describe_image to understand screenshots, diagrams, and photos.",
|
|
61
|
-
package: "npm:pi-vision-tool",
|
|
62
|
-
category: "tools",
|
|
63
|
-
verified: true,
|
|
64
|
-
enablesFeatures: ["Image analysis via vision model delegation"],
|
|
65
|
-
icon: "👁️",
|
|
66
|
-
},
|
|
67
|
-
// ── Productivity ──
|
|
68
|
-
{
|
|
69
|
-
id: "pi-rewind",
|
|
70
|
-
name: "pi-rewind",
|
|
71
|
-
description: "Session history navigation — checkpoint, rewind, and branch from any prior state. Like undo for your agent.",
|
|
72
|
-
package: "npm:@ayulab/pi-rewind",
|
|
73
|
-
category: "productivity",
|
|
74
|
-
verified: true,
|
|
75
|
-
enablesFeatures: ["Checkpoint/rewind in session history"],
|
|
76
|
-
icon: "⏪",
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
id: "context-mode",
|
|
80
|
-
name: "context-mode",
|
|
81
|
-
description: "⚠️ First prompt uses ~8,181 extra tokens for setup; savings start from the second turn onward. Saves ~98% of context window by capturing tool results in SQLite, sandboxed code execution (ctx_execute), session continuity across compaction, and BM25 search over indexed docs.",
|
|
82
|
-
package: "npm:context-mode",
|
|
83
|
-
category: "productivity",
|
|
84
|
-
verified: true,
|
|
85
|
-
enablesFeatures: ["⚠️ ~8,181 tokens on first prompt — then saves ~98%", "Context window savings", "Sandboxed code execution (ctx_execute)", "Session continuity after compaction", "FTS5 knowledge base with BM25 search", "Commands: /ctx-stats, /ctx-doctor"],
|
|
86
|
-
icon: "🧠",
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
id: "pi-plan-mode",
|
|
90
|
-
name: "pi-plan-mode",
|
|
91
|
-
description: "Codex-like structured planning. Blocks mutating tools, adds plan_mode_question for structured user questions, and guides the agent through explore → intent → final plan flow.",
|
|
92
|
-
package: "npm:@narumitw/pi-plan-mode",
|
|
93
|
-
category: "productivity",
|
|
94
|
-
verified: true,
|
|
95
|
-
enablesFeatures: ["Plan mode with /plan command", "Structured plan_mode_question tool", "Tool safety in planning phase"],
|
|
96
|
-
icon: "📋",
|
|
97
|
-
},
|
|
98
|
-
];
|
|
99
|
-
// ── Discovery ───────────────────────────────────────────────────────
|
|
100
|
-
/** Get installed npm packages from ~/.pi/agent/npm/package.json */
|
|
101
|
-
async function readInstalledPackages() {
|
|
102
|
-
const installed = new Set();
|
|
103
|
-
try {
|
|
104
|
-
const pkg = JSON.parse(await readFile(npmPackagePath(), "utf-8"));
|
|
105
|
-
for (const name of Object.keys(pkg.dependencies || {})) {
|
|
106
|
-
installed.add(`npm:${name}`);
|
|
107
|
-
installed.add(name);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
// No npm dir yet — that's fine
|
|
112
|
-
}
|
|
113
|
-
return installed;
|
|
114
|
-
}
|
|
115
|
-
/** Scan ~/.pi/agent/extensions/ for *.ts files and subdirectories */
|
|
116
|
-
async function scanExtensionsDir() {
|
|
117
|
-
const results = [];
|
|
118
|
-
try {
|
|
119
|
-
const dir = extensionsDir();
|
|
120
|
-
if (!existsSync(dir))
|
|
121
|
-
return results;
|
|
122
|
-
const entries = await readdir(dir, { withFileTypes: true });
|
|
123
|
-
for (const entry of entries) {
|
|
124
|
-
if (entry.name.endsWith(".ts")) {
|
|
125
|
-
const name = entry.name.replace(/\.ts$/, "");
|
|
126
|
-
const desc = await extractDescriptionFromExtension(join(dir, entry.name));
|
|
127
|
-
results.push({
|
|
128
|
-
name,
|
|
129
|
-
description: desc || `Custom extension at ~/.pi/agent/extensions/${entry.name}`,
|
|
130
|
-
source: "extensions_dir",
|
|
131
|
-
enablesFeatures: ["Custom extension loaded"],
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
else if (entry.isDirectory()) {
|
|
135
|
-
results.push({
|
|
136
|
-
name: entry.name,
|
|
137
|
-
description: `Extension directory at ~/.pi/agent/extensions/${entry.name}/`,
|
|
138
|
-
source: "extensions_dir",
|
|
139
|
-
enablesFeatures: ["Custom extension loaded"],
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
catch {
|
|
145
|
-
// No extensions dir
|
|
146
|
-
}
|
|
147
|
-
return results;
|
|
148
|
-
}
|
|
149
|
-
/** Scan ~/.pi/agent/agents/ for *.md agent definitions */
|
|
150
|
-
async function scanAgentsDir() {
|
|
151
|
-
const agents = [];
|
|
152
|
-
try {
|
|
153
|
-
const dir = agentsDir();
|
|
154
|
-
if (!existsSync(dir))
|
|
155
|
-
return agents;
|
|
156
|
-
const entries = await readdir(dir, { withFileTypes: true });
|
|
157
|
-
for (const entry of entries) {
|
|
158
|
-
if (!entry.name.endsWith(".md"))
|
|
159
|
-
continue;
|
|
160
|
-
const content = await readFile(join(dir, entry.name), "utf-8");
|
|
161
|
-
const name = entry.name.replace(/\.md$/, "");
|
|
162
|
-
// Parse YAML frontmatter (basic, no external dep)
|
|
163
|
-
const fM = parseFrontmatter(content);
|
|
164
|
-
agents.push({
|
|
165
|
-
name: fM.name || name,
|
|
166
|
-
description: fM.description || `Agent definition from ~/.pi/agent/agents/${entry.name}`,
|
|
167
|
-
model: fM.model,
|
|
168
|
-
tools: fM.tools?.split(",").map((t) => t.trim()).filter(Boolean),
|
|
169
|
-
source: "file",
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
catch {
|
|
174
|
-
// No agents dir
|
|
175
|
-
}
|
|
176
|
-
return agents;
|
|
177
|
-
}
|
|
178
|
-
/** Crude frontmatter parser — enough for YAML name/desc/model/tools */
|
|
179
|
-
function parseFrontmatter(content) {
|
|
180
|
-
const result = {};
|
|
181
|
-
const match = content.match(/^---\n([\s\S]*?)\n---/);
|
|
182
|
-
if (!match)
|
|
183
|
-
return result;
|
|
184
|
-
for (const line of match[1].split("\n")) {
|
|
185
|
-
const sep = line.indexOf(":");
|
|
186
|
-
if (sep === -1)
|
|
187
|
-
continue;
|
|
188
|
-
const key = line.slice(0, sep).trim();
|
|
189
|
-
const value = line.slice(sep + 1).trim().replace(/^["']|["']$/g, "");
|
|
190
|
-
result[key] = value;
|
|
191
|
-
}
|
|
192
|
-
return result;
|
|
193
|
-
}
|
|
194
|
-
/** Try to grab a one-liner description from an extension file */
|
|
195
|
-
async function extractDescriptionFromExtension(filePath) {
|
|
196
|
-
try {
|
|
197
|
-
const content = await readFile(filePath, "utf-8");
|
|
198
|
-
const lines = content.split("\n").slice(0, 30);
|
|
199
|
-
for (const line of lines) {
|
|
200
|
-
const trimmed = line.trim();
|
|
201
|
-
// Look for description in JSDoc
|
|
202
|
-
if (trimmed.startsWith("*") && !trimmed.startsWith("* "))
|
|
203
|
-
continue;
|
|
204
|
-
if (trimmed.startsWith("* ") && trimmed.length > 5) {
|
|
205
|
-
const text = trimmed.replace(/^\*\s?/, "");
|
|
206
|
-
if (text.length > 10)
|
|
207
|
-
return text;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
catch {
|
|
212
|
-
// ignore
|
|
213
|
-
}
|
|
214
|
-
return null;
|
|
215
|
-
}
|
|
216
|
-
/** Read settings.json for configured packages */
|
|
217
|
-
async function readConfiguredPackages() {
|
|
218
|
-
try {
|
|
219
|
-
const raw = await readFile(settingsPath(), "utf-8");
|
|
220
|
-
const settings = JSON.parse(raw);
|
|
221
|
-
return settings.packages || [];
|
|
222
|
-
}
|
|
223
|
-
catch {
|
|
224
|
-
return [];
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
// ── Main API ────────────────────────────────────────────────────────
|
|
228
|
-
export async function discoverExtensions() {
|
|
229
|
-
const installed = await readInstalledPackages();
|
|
230
|
-
const configured = new Set(await readConfiguredPackages());
|
|
231
|
-
// Scan filesystem
|
|
232
|
-
const [extFiles, agents] = await Promise.all([
|
|
233
|
-
scanExtensionsDir(),
|
|
234
|
-
scanAgentsDir(),
|
|
235
|
-
]);
|
|
236
|
-
// Build detected list from packages
|
|
237
|
-
const detectedPkgs = [];
|
|
238
|
-
for (const pkg of configured) {
|
|
239
|
-
// Look up known info
|
|
240
|
-
const known = knownExtensions.find((k) => k.package === pkg);
|
|
241
|
-
detectedPkgs.push({
|
|
242
|
-
name: known?.name ?? pkg.replace("npm:", ""),
|
|
243
|
-
description: known?.description ?? `Installed package: ${pkg}`,
|
|
244
|
-
source: "package",
|
|
245
|
-
version: known ? undefined : undefined,
|
|
246
|
-
package: pkg,
|
|
247
|
-
agentTypes: known?.providesAgentTypes,
|
|
248
|
-
enablesFeatures: known?.enablesFeatures,
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
// Build recommended list with install status
|
|
252
|
-
const allInstalled = new Set();
|
|
253
|
-
for (const pkg of configured)
|
|
254
|
-
allInstalled.add(pkg);
|
|
255
|
-
installed.forEach((p) => allInstalled.add(p));
|
|
256
|
-
// Also check if agents dir has the agent types
|
|
257
|
-
const agentNames = new Set(agents.map((a) => a.name));
|
|
258
|
-
for (const ext of extFiles)
|
|
259
|
-
allInstalled.add(ext.name);
|
|
260
|
-
const recommended = knownExtensions.map((k) => ({
|
|
261
|
-
...k,
|
|
262
|
-
installed: allInstalled.has(k.package) ||
|
|
263
|
-
allInstalled.has(k.id) ||
|
|
264
|
-
allInstalled.has(k.package.replace("npm:", "").replace("@", "")) ||
|
|
265
|
-
(k.providesAgentTypes?.some((t) => agentNames.has(t)) ?? false),
|
|
266
|
-
}));
|
|
267
|
-
return {
|
|
268
|
-
detected: [...detectedPkgs, ...extFiles],
|
|
269
|
-
recommended,
|
|
270
|
-
agents,
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
export async function uninstallExtension(packageName) {
|
|
274
|
-
try {
|
|
275
|
-
// Remove from settings.json packages array — match the EXACT spec as stored
|
|
276
|
-
const settingsRaw = await readFile(settingsPath(), "utf-8");
|
|
277
|
-
const settings = JSON.parse(settingsRaw);
|
|
278
|
-
if (settings.packages) {
|
|
279
|
-
// Remove by exact match, npm: prefixed variant, AND translated npm ref
|
|
280
|
-
const translated = packageName.startsWith("git:") ? specToNpmRef(packageName) : packageName;
|
|
281
|
-
settings.packages = settings.packages.filter((p) => p !== packageName &&
|
|
282
|
-
p !== `npm:${packageName.replace(/^npm:/, "")}` &&
|
|
283
|
-
p !== translated);
|
|
284
|
-
}
|
|
285
|
-
// Write settings back atomically
|
|
286
|
-
const tmpPath = settingsPath() + ".tmp";
|
|
287
|
-
const { writeFile, rename } = await import("node:fs/promises");
|
|
288
|
-
await writeFile(tmpPath, JSON.stringify(settings, null, 2), "utf-8");
|
|
289
|
-
await rename(tmpPath, settingsPath());
|
|
290
|
-
// Uninstall via npm in the agent dir (keep settings clean even if npm uninstall fails).
|
|
291
|
-
// For git: specs, npm stores the dependency value as the shorthand (e.g. "github:user/repo")
|
|
292
|
-
// but the key is the package name from the repo's package.json. We need the key.
|
|
293
|
-
const npmDir = join(piAgentDir(), "npm");
|
|
294
|
-
try {
|
|
295
|
-
const pkgName = findInstalledPackageName(packageName);
|
|
296
|
-
if (pkgName) {
|
|
297
|
-
execSync(`npm uninstall ${pkgName}`, {
|
|
298
|
-
cwd: npmDir,
|
|
299
|
-
stdio: "pipe",
|
|
300
|
-
timeout: 60_000,
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
catch {
|
|
305
|
-
// npm uninstall may fail if the package isn't actually installed
|
|
306
|
-
// but we already cleaned the settings — best effort
|
|
307
|
-
}
|
|
308
|
-
return { success: true };
|
|
309
|
-
}
|
|
310
|
-
catch (err) {
|
|
311
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
312
|
-
return { success: false, error: message };
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
export async function installExtension(packageName) {
|
|
316
|
-
try {
|
|
317
|
-
// Strip npm: prefix if present
|
|
318
|
-
const npmName = packageName.replace(/^npm:/, "");
|
|
319
|
-
// Add to settings.json packages array
|
|
320
|
-
const settingsRaw = await readFile(settingsPath(), "utf-8");
|
|
321
|
-
const settings = JSON.parse(settingsRaw);
|
|
322
|
-
if (!settings.packages)
|
|
323
|
-
settings.packages = [];
|
|
324
|
-
const pkgEntry = packageName.startsWith("npm:") ? packageName : `npm:${npmName}`;
|
|
325
|
-
if (!settings.packages.includes(pkgEntry)) {
|
|
326
|
-
settings.packages.push(pkgEntry);
|
|
327
|
-
}
|
|
328
|
-
// Write settings back atomically
|
|
329
|
-
const tmpPath = settingsPath() + ".tmp";
|
|
330
|
-
const { writeFile, rename } = await import("node:fs/promises");
|
|
331
|
-
await writeFile(tmpPath, JSON.stringify(settings, null, 2), "utf-8");
|
|
332
|
-
await rename(tmpPath, settingsPath());
|
|
333
|
-
// Install via npm in the agent dir
|
|
334
|
-
const npmDir = join(piAgentDir(), "npm");
|
|
335
|
-
execSync(`npm install ${npmName}`, {
|
|
336
|
-
cwd: npmDir,
|
|
337
|
-
stdio: "pipe",
|
|
338
|
-
timeout: 180_000,
|
|
339
|
-
});
|
|
340
|
-
return { success: true };
|
|
341
|
-
}
|
|
342
|
-
catch (err) {
|
|
343
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
344
|
-
return { success: false, error: message };
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Hold a short-lived cache of check results to avoid hammering npm
|
|
349
|
-
* registry on every UI render. Cleared after 60 seconds.
|
|
350
|
-
*/
|
|
351
|
-
let _updateCache;
|
|
352
|
-
/** Clear the update cache so the next `checkExtensionUpdates()` hits npm fresh. */
|
|
353
|
-
export function clearExtensionCache() {
|
|
354
|
-
_updateCache = undefined;
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* Check for updates on all installed npm packages.
|
|
358
|
-
* Reads installed versions from node_modules, then fetches latest
|
|
359
|
-
* from registry.npmjs.org. Results are cached for 60 seconds.
|
|
360
|
-
*/
|
|
361
|
-
export async function checkExtensionUpdates() {
|
|
362
|
-
const now = Date.now();
|
|
363
|
-
if (_updateCache && now - _updateCache.timestamp < 60_000) {
|
|
364
|
-
return _updateCache.data;
|
|
365
|
-
}
|
|
366
|
-
const results = [];
|
|
367
|
-
const npmDir = join(piAgentDir(), "npm");
|
|
368
|
-
// Read installed packages list
|
|
369
|
-
let packageNames = [];
|
|
370
|
-
try {
|
|
371
|
-
const pkg = JSON.parse(await readFile(join(npmDir, "package.json"), "utf-8"));
|
|
372
|
-
packageNames = Object.keys(pkg.dependencies || {});
|
|
373
|
-
}
|
|
374
|
-
catch {
|
|
375
|
-
// No npm dir or no packages yet
|
|
376
|
-
}
|
|
377
|
-
for (const name of packageNames) {
|
|
378
|
-
// Read installed version
|
|
379
|
-
let installed;
|
|
380
|
-
try {
|
|
381
|
-
const installedPkg = JSON.parse(await readFile(join(npmDir, "node_modules", name, "package.json"), "utf-8"));
|
|
382
|
-
installed = installedPkg.version;
|
|
383
|
-
}
|
|
384
|
-
catch {
|
|
385
|
-
installed = undefined;
|
|
386
|
-
}
|
|
387
|
-
// Fetch latest from npm registry
|
|
388
|
-
let latest;
|
|
389
|
-
try {
|
|
390
|
-
const controller = new AbortController();
|
|
391
|
-
const timeout = setTimeout(() => controller.abort(), 10_000);
|
|
392
|
-
const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(name)}/latest`, {
|
|
393
|
-
signal: controller.signal,
|
|
394
|
-
});
|
|
395
|
-
clearTimeout(timeout);
|
|
396
|
-
if (res.ok) {
|
|
397
|
-
const data = await res.json();
|
|
398
|
-
latest = data.version;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
catch {
|
|
402
|
-
latest = undefined;
|
|
403
|
-
}
|
|
404
|
-
// Look up display name from curated list
|
|
405
|
-
const known = knownExtensions.find((k) => k.package === `npm:${name}`);
|
|
406
|
-
results.push({
|
|
407
|
-
package: name,
|
|
408
|
-
name: known?.name ?? name,
|
|
409
|
-
installed,
|
|
410
|
-
latest,
|
|
411
|
-
updateAvailable: installed !== undefined && latest !== undefined && installed !== latest,
|
|
412
|
-
});
|
|
413
|
-
}
|
|
414
|
-
_updateCache = { data: results, timestamp: now };
|
|
415
|
-
return results;
|
|
416
|
-
}
|
|
417
|
-
/**
|
|
418
|
-
* Manual install — accepts any pi install spec through the SDK config path
|
|
419
|
-
* (settings.json + npm install). No CLI dependency.
|
|
420
|
-
*
|
|
421
|
-
* Supported formats:
|
|
422
|
-
* npm:package-name → npm install
|
|
423
|
-
* git:github.com/user/repo → npm install via git URL
|
|
424
|
-
* pi install <spec> → strips prefix first (user typed the full command)
|
|
425
|
-
*/
|
|
426
|
-
export async function installManualExtension(installSpec) {
|
|
427
|
-
// Strip leading "pi install " or "pi " if the user typed the full CLI command
|
|
428
|
-
const spec = installSpec
|
|
429
|
-
.replace(/^pi\s+install\s+/i, "")
|
|
430
|
-
.replace(/^pi\s+/i, "")
|
|
431
|
-
.trim();
|
|
432
|
-
if (spec.length === 0) {
|
|
433
|
-
return { success: false, error: "Empty install spec." };
|
|
434
|
-
}
|
|
435
|
-
try {
|
|
436
|
-
const settingsRaw = await readFile(settingsPath(), "utf-8");
|
|
437
|
-
const settings = JSON.parse(settingsRaw);
|
|
438
|
-
if (!settings.packages)
|
|
439
|
-
settings.packages = [];
|
|
440
|
-
// Add the raw spec (npm:..., git:...) to settings.json packages[]
|
|
441
|
-
if (!settings.packages.includes(spec)) {
|
|
442
|
-
settings.packages.push(spec);
|
|
443
|
-
}
|
|
444
|
-
// Write settings back atomically
|
|
445
|
-
const tmpPath = settingsPath() + ".tmp";
|
|
446
|
-
const { writeFile, rename } = await import("node:fs/promises");
|
|
447
|
-
await writeFile(tmpPath, JSON.stringify(settings, null, 2), "utf-8");
|
|
448
|
-
await rename(tmpPath, settingsPath());
|
|
449
|
-
// Translate spec to an npm-compatible package reference
|
|
450
|
-
const npmRef = specToNpmRef(spec);
|
|
451
|
-
// Install via npm in the agent dir
|
|
452
|
-
const npmDir = join(piAgentDir(), "npm");
|
|
453
|
-
execSync(`npm install ${npmRef}`, {
|
|
454
|
-
cwd: npmDir,
|
|
455
|
-
stdio: "pipe",
|
|
456
|
-
timeout: 180_000,
|
|
457
|
-
});
|
|
458
|
-
return { success: true };
|
|
459
|
-
}
|
|
460
|
-
catch (err) {
|
|
461
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
462
|
-
return { success: false, error: message };
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
/**
|
|
466
|
-
* Translate a pi install spec to an npm package reference.
|
|
467
|
-
*
|
|
468
|
-
* npm:foo → foo
|
|
469
|
-
* git:github.com/user/repo → github:user/repo (npm's GitHub shortcut)
|
|
470
|
-
* git:github.com/user/repo.git → same logic
|
|
471
|
-
* Anything else → passed through as-is
|
|
472
|
-
*/
|
|
473
|
-
function specToNpmRef(spec) {
|
|
474
|
-
if (spec.startsWith("npm:")) {
|
|
475
|
-
return spec.slice(4);
|
|
476
|
-
}
|
|
477
|
-
if (spec.startsWith("git:")) {
|
|
478
|
-
const path = spec.slice(4); // github.com/user/repo
|
|
479
|
-
// npm supports "github:user/repo" directly
|
|
480
|
-
const match = path.match(/github\.com\/([^/]+\/[^/]+?)(?:\.git)?$/);
|
|
481
|
-
if (match) {
|
|
482
|
-
return `github:${match[1]}`;
|
|
483
|
-
}
|
|
484
|
-
// For other git hosts, use the full git+https URL
|
|
485
|
-
return `git+https://${path}`;
|
|
486
|
-
}
|
|
487
|
-
// Pass through as-is (bare package name, local path, etc.)
|
|
488
|
-
return spec;
|
|
489
|
-
}
|
|
490
|
-
/**
|
|
491
|
-
* Given a pi install spec (npm:foo, git:github.com/user/repo, etc.),
|
|
492
|
-
* find the actual package name as stored in npm's package.json
|
|
493
|
-
* dependency key. Needed because git: specs get stored by their
|
|
494
|
-
* repo package.json name (e.g. "@user/repo") not the install shorthand.
|
|
495
|
-
*
|
|
496
|
-
* Returns the package name, or null if not found.
|
|
497
|
-
*/
|
|
498
|
-
function findInstalledPackageName(packageName) {
|
|
499
|
-
try {
|
|
500
|
-
const npmPkgPath = npmPackagePath();
|
|
501
|
-
const npmPkg = JSON.parse(readFileSync(npmPkgPath, "utf-8"));
|
|
502
|
-
const deps = npmPkg.dependencies ?? {};
|
|
503
|
-
if (packageName.startsWith("npm:")) {
|
|
504
|
-
const bareName = packageName.slice(4);
|
|
505
|
-
if (deps[bareName] !== undefined)
|
|
506
|
-
return bareName;
|
|
507
|
-
// Try scoped variants
|
|
508
|
-
if (deps[`@${bareName}`] !== undefined)
|
|
509
|
-
return `@${bareName}`;
|
|
510
|
-
return null;
|
|
511
|
-
}
|
|
512
|
-
// Resolve to npm shorthand / URL for matching against dependency values
|
|
513
|
-
const npmRef = specToNpmRef(packageName);
|
|
514
|
-
// First try matching by dependency value (git: specs store the shorthand as value)
|
|
515
|
-
for (const [key, val] of Object.entries(deps)) {
|
|
516
|
-
if (val === npmRef)
|
|
517
|
-
return key;
|
|
518
|
-
if (val.includes(npmRef))
|
|
519
|
-
return key;
|
|
520
|
-
}
|
|
521
|
-
// Fallback: try matching the key
|
|
522
|
-
for (const [key, val] of Object.entries(deps)) {
|
|
523
|
-
if (key === packageName || key === npmRef)
|
|
524
|
-
return key;
|
|
525
|
-
}
|
|
526
|
-
return null;
|
|
527
|
-
}
|
|
528
|
-
catch {
|
|
529
|
-
return null;
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
/**
|
|
533
|
-
* Update an installed extension to the latest version via npm install.
|
|
534
|
-
* Equivalent to re-running the install but without touching settings.json
|
|
535
|
-
* (since it's already in the packages list).
|
|
536
|
-
*/
|
|
537
|
-
export async function updateExtension(packageName) {
|
|
538
|
-
try {
|
|
539
|
-
const npmName = packageName.replace(/^npm:/, "");
|
|
540
|
-
const npmDir = join(piAgentDir(), "npm");
|
|
541
|
-
execSync(`npm install ${npmName}@latest`, {
|
|
542
|
-
cwd: npmDir,
|
|
543
|
-
stdio: "pipe",
|
|
544
|
-
timeout: 180_000,
|
|
545
|
-
});
|
|
546
|
-
// Invalidate cache so next check picks up the new version
|
|
547
|
-
_updateCache = undefined;
|
|
548
|
-
return { success: true };
|
|
549
|
-
}
|
|
550
|
-
catch (err) {
|
|
551
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
552
|
-
return { success: false, error: message };
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
/** Built-in agent definitions (builtin defaults like pi-subagents examples) */
|
|
556
|
-
export const builtinAgentDefs = [
|
|
557
|
-
{
|
|
558
|
-
name: "scout",
|
|
559
|
-
description: "Fast codebase recon — returns compressed context for handoff to other agents",
|
|
560
|
-
model: "claude-haiku-4-5",
|
|
561
|
-
tools: ["read", "grep", "find", "ls", "bash"],
|
|
562
|
-
source: "builtin",
|
|
563
|
-
},
|
|
564
|
-
{
|
|
565
|
-
name: "planner",
|
|
566
|
-
description: "Creates implementation plans with structured analysis",
|
|
567
|
-
model: "claude-sonnet-4-5",
|
|
568
|
-
tools: ["read", "grep", "find", "ls"],
|
|
569
|
-
source: "builtin",
|
|
570
|
-
},
|
|
571
|
-
{
|
|
572
|
-
name: "reviewer",
|
|
573
|
-
description: "Code review & quality assurance — checks for issues, security, and style",
|
|
574
|
-
model: "claude-sonnet-4-5",
|
|
575
|
-
tools: ["read", "grep", "find", "ls", "bash"],
|
|
576
|
-
source: "builtin",
|
|
577
|
-
},
|
|
578
|
-
{
|
|
579
|
-
name: "worker",
|
|
580
|
-
description: "General-purpose task execution with full capabilities",
|
|
581
|
-
model: "claude-sonnet-4-5",
|
|
582
|
-
tools: [],
|
|
583
|
-
source: "builtin",
|
|
584
|
-
},
|
|
585
|
-
];
|
|
586
|
-
//# sourceMappingURL=extension-manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension-manager.js","sourceRoot":"","sources":["../src/extension-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAQ,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAW,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA2D9C,uEAAuE;AAEvE,SAAS,UAAU;IACjB,gDAAgD;IAChD,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,aAAa;IACpB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,SAAS;IAChB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,YAAY;IACnB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,eAAe,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AACnD,CAAC;AAED,uEAAuE;AAEvE,MAAM,eAAe,GAA8C;IACjE,cAAc;IACd;QACE,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,iHAAiH;QACnH,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,CAAC,8BAA8B,CAAC;QACjD,IAAI,EAAE,IAAI;KACX;IACD;QACE,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,iGAAiG;QACnG,OAAO,EAAE,mBAAmB;QAC5B,QAAQ,EAAE,OAAO;QACjB,eAAe,EAAE,CAAC,sCAAsC,CAAC;QACzD,IAAI,EAAE,IAAI;KACX;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,gJAAgJ;QAClJ,OAAO,EAAE,oBAAoB;QAC7B,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,CAAC,4CAA4C,CAAC;QAC/D,IAAI,EAAE,KAAK;KACZ;IACD,qBAAqB;IACrB;QACE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,WAAW;QACjB,WAAW,EACT,6GAA6G;QAC/G,OAAO,EAAE,uBAAuB;QAChC,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,CAAC,sCAAsC,CAAC;QACzD,IAAI,EAAE,GAAG;KACV;IAED;QACE,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,mRAAmR;QACrR,OAAO,EAAE,kBAAkB;QAC3B,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,CAAC,oDAAoD,EAAE,wBAAwB,EAAE,wCAAwC,EAAE,qCAAqC,EAAE,sCAAsC,EAAE,mCAAmC,CAAC;QAC/P,IAAI,EAAE,IAAI;KACX;IACD;QACE,EAAE,EAAE,cAAc;QAClB,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,gLAAgL;QAClL,OAAO,EAAE,4BAA4B;QACrC,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,IAAI;QACd,eAAe,EAAE,CAAC,8BAA8B,EAAE,oCAAoC,EAAE,+BAA+B,CAAC;QACxH,IAAI,EAAE,IAAI;KACX;CACF,CAAC;AAEF,uEAAuE;AAEvE,mEAAmE;AACnE,KAAK,UAAU,qBAAqB;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QAClE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;YACvD,SAAS,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC7B,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qEAAqE;AACrE,KAAK,UAAU,iBAAiB;IAC9B,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,OAAO,CAAC;QACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC7C,MAAM,IAAI,GAAG,MAAM,+BAA+B,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,WAAW,EAAE,IAAI,IAAI,8CAA8C,KAAK,CAAC,IAAI,EAAE;oBAC/E,MAAM,EAAE,gBAAgB;oBACxB,eAAe,EAAE,CAAC,yBAAyB,CAAC;iBAC7C,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,WAAW,EAAE,iDAAiD,KAAK,CAAC,IAAI,GAAG;oBAC3E,MAAM,EAAE,gBAAgB;oBACxB,eAAe,EAAE,CAAC,yBAAyB,CAAC;iBAC7C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,0DAA0D;AAC1D,KAAK,UAAU,aAAa;IAC1B,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC1C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAE7C,kDAAkD;YAClD,MAAM,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAErC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI;gBACrB,WAAW,EAAE,EAAE,CAAC,WAAW,IAAI,4CAA4C,KAAK,CAAC,IAAI,EAAE;gBACvF,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBACxE,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,uEAAuE;AACvE,SAAS,gBAAgB,CACvB,OAAe;IAEf,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACrD,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAE1B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,SAAS;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iEAAiE;AACjE,KAAK,UAAU,+BAA+B,CAAC,QAAgB;IAC7D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,gCAAgC;YAChC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,SAAS;YACnE,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAC3C,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;oBAAE,OAAO,IAAI,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iDAAiD;AACjD,KAAK,UAAU,sBAAsB;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,OAAO,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,uEAAuE;AAEvE,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,SAAS,GAAG,MAAM,qBAAqB,EAAE,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,sBAAsB,EAAE,CAAC,CAAC;IAE3D,kBAAkB;IAClB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC3C,iBAAiB,EAAE;QACnB,aAAa,EAAE;KAChB,CAAC,CAAC;IAEH,oCAAoC;IACpC,MAAM,YAAY,GAA0B,EAAE,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,qBAAqB;QACrB,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC;QAC7D,YAAY,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,WAAW,EACT,KAAK,EAAE,WAAW,IAAI,sBAAsB,GAAG,EAAE;YACnD,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YACtC,OAAO,EAAE,GAAG;YACZ,UAAU,EAAE,KAAK,EAAE,kBAAkB;YACrC,eAAe,EAAE,KAAK,EAAE,eAAe;SACxC,CAAC,CAAC;IACL,CAAC;IAED,6CAA6C;IAC7C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,UAAU;QAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,+CAA+C;IAC/C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,QAAQ;QAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEvD,MAAM,WAAW,GAA2B,eAAe,CAAC,GAAG,CAC7D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACN,GAAG,CAAC;QACJ,SAAS,EACP,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,YAAY,CAAC,GAAG,CACd,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAC/C;YACD,CAAC,CAAC,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;KAClE,CAAC,CACH,CAAC;IAEF,OAAO;QACL,QAAQ,EAAE,CAAC,GAAG,YAAY,EAAE,GAAG,QAAQ,CAAC;QACxC,WAAW;QACX,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,WAAmB;IAEnB,IAAI,CAAC;QACH,4EAA4E;QAC5E,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACzC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,uEAAuE;YACvE,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;YAC5F,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAC1C,CAAC,CAAS,EAAE,EAAE,CACZ,CAAC,KAAK,WAAW;gBACjB,CAAC,KAAK,OAAO,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE;gBAC/C,CAAC,KAAK,UAAU,CACnB,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,MAAM,OAAO,GAAG,YAAY,EAAE,GAAG,MAAM,CAAC;QACxC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC/D,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QAEtC,wFAAwF;QACxF,6FAA6F;QAC7F,iFAAiF;QACjF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;YACtD,IAAI,OAAO,EAAE,CAAC;gBACZ,QAAQ,CAAC,iBAAiB,OAAO,EAAE,EAAE;oBACnC,GAAG,EAAE,MAAM;oBACX,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;YACjE,oDAAoD;QACtD,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,WAAmB;IAEnB,IAAI,CAAC;QACH,+BAA+B;QAC/B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAEjD,sCAAsC;QACtC,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAAE,QAAQ,CAAC,QAAQ,GAAG,EAAE,CAAC;QAE/C,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,OAAO,EAAE,CAAC;QACjF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1C,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QAED,iCAAiC;QACjC,MAAM,OAAO,GAAG,YAAY,EAAE,GAAG,MAAM,CAAC;QACxC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC/D,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QAEtC,mCAAmC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QACzC,QAAQ,CAAC,eAAe,OAAO,EAAE,EAAE;YACjC,GAAG,EAAE,MAAM;YACX,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAiBD;;;GAGG;AACH,IAAI,YAA4E,CAAC;AAEjF,mFAAmF;AACnF,MAAM,UAAU,mBAAmB;IACjC,YAAY,GAAG,SAAS,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,YAAY,IAAI,GAAG,GAAG,YAAY,CAAC,SAAS,GAAG,MAAM,EAAE,CAAC;QAC1D,OAAO,YAAY,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;IAEzC,+BAA+B;IAC/B,IAAI,YAAY,GAAa,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9E,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,gCAAgC;IAClC,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,yBAAyB;QACzB,IAAI,SAA6B,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAC7B,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAC5E,CAAC;YACF,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,SAAS,CAAC;QACxB,CAAC;QAED,iCAAiC;QACjC,IAAI,MAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;YAC7D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,8BAA8B,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE;gBACvF,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YACH,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA0B,CAAC;gBACtD,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;YACxB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;QAED,yCAAyC;QACzC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,EAAE,CAAC,CAAC;QAEvE,OAAO,CAAC,IAAI,CAAC;YACX,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI;YACzB,SAAS;YACT,MAAM;YACN,eAAe,EAAE,SAAS,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM;SACzF,CAAC,CAAC;IACL,CAAC;IAED,YAAY,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;IACjD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,WAAmB;IAEnB,8EAA8E;IAC9E,MAAM,IAAI,GAAG,WAAW;SACrB,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC;SAChC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,IAAI,EAAE,CAAC;IAEV,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAAE,QAAQ,CAAC,QAAQ,GAAG,EAAE,CAAC;QAE/C,kEAAkE;QAClE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED,iCAAiC;QACjC,MAAM,OAAO,GAAG,YAAY,EAAE,GAAG,MAAM,CAAC;QACxC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC/D,MAAM,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,MAAM,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QAEtC,wDAAwD;QACxD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAElC,mCAAmC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QACzC,QAAQ,CAAC,eAAe,MAAM,EAAE,EAAE;YAChC,GAAG,EAAE,MAAM;YACX,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;QACnD,2CAA2C;QAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACpE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,UAAU,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,CAAC;QACD,kDAAkD;QAClD,OAAO,eAAe,IAAI,EAAE,CAAC;IAC/B,CAAC;IACD,2DAA2D;IAC3D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,wBAAwB,CAAC,WAAmB;IACnD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,GAA2B,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;QAE/D,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS;gBAAE,OAAO,QAAQ,CAAC;YAClD,sBAAsB;YACtB,IAAI,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,KAAK,SAAS;gBAAE,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wEAAwE;QACxE,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAEzC,mFAAmF;QACnF,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,IAAI,GAAG,KAAK,MAAM;gBAAE,OAAO,GAAG,CAAC;YAC/B,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,GAAG,CAAC;QACvC,CAAC;QAED,iCAAiC;QACjC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,MAAM;gBAAE,OAAO,GAAG,CAAC;QACxD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;QACzC,QAAQ,CAAC,eAAe,OAAO,SAAS,EAAE;YACxC,GAAG,EAAE,MAAM;YACX,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QACH,0DAA0D;QAC1D,YAAY,GAAG,SAAS,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAe;IAC1C;QACE,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,8EAA8E;QAC3F,KAAK,EAAE,kBAAkB;QACzB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;QAC7C,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,uDAAuD;QACpE,KAAK,EAAE,mBAAmB;QAC1B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC;QACrC,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,0EAA0E;QACvF,KAAK,EAAE,mBAAmB;QAC1B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;QAC7C,MAAM,EAAE,SAAS;KAClB;IACD;QACE,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uDAAuD;QACpE,KAAK,EAAE,mBAAmB;QAC1B,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,SAAS;KAClB;CACF,CAAC"}
|
|
@@ -1,35 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|