pi-kot 0.1.21 → 0.1.22
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/bin/pi-kot.mjs +148 -0
- package/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/client/assets/index-CE_Na97I.js +75 -0
- package/client/assets/index-CE_Na97I.js.map +1 -0
- package/client/assets/index-QP95zkpd.css +1 -0
- package/client/assets/rolldown-runtime-QTnfLwEv.js +1 -0
- package/client/assets/vendor-codemirror-CD3uCqRj.js +48 -0
- package/client/assets/vendor-codemirror-CD3uCqRj.js.map +1 -0
- package/client/assets/vendor-icons-W8thHNMl.js +2 -0
- package/client/assets/vendor-icons-W8thHNMl.js.map +1 -0
- package/client/assets/vendor-katex-4z5K3dyr.js +260 -0
- package/client/assets/vendor-katex-4z5K3dyr.js.map +1 -0
- package/client/assets/vendor-katex-CYlHEDRF.css +1 -0
- package/client/assets/vendor-markdown-BSzxNR_7.js +35 -0
- package/client/assets/vendor-markdown-BSzxNR_7.js.map +1 -0
- package/client/assets/vendor-prism-CQGp13s2.js +4 -0
- package/client/assets/vendor-prism-CQGp13s2.js.map +1 -0
- package/client/assets/vendor-xterm-BrP-ENHg.css +1 -0
- package/client/assets/vendor-xterm-DXwh06H3.js +36 -0
- package/client/assets/vendor-xterm-DXwh06H3.js.map +1 -0
- package/client/index.html +23 -0
- package/package.json +5 -3
- package/server/ask-user-question/envelope.d.ts +11 -0
- package/server/ask-user-question/envelope.d.ts.map +1 -0
- package/server/ask-user-question/envelope.js +41 -0
- package/server/ask-user-question/envelope.js.map +1 -0
- package/server/ask-user-question/plan-mode-question-tool.d.ts +26 -0
- package/server/ask-user-question/plan-mode-question-tool.d.ts.map +1 -0
- package/server/ask-user-question/plan-mode-question-tool.js +273 -0
- package/server/ask-user-question/plan-mode-question-tool.js.map +1 -0
- package/server/ask-user-question/prompt-strings.d.ts +4 -0
- package/server/ask-user-question/prompt-strings.d.ts.map +1 -0
- package/server/ask-user-question/prompt-strings.js +18 -0
- package/server/ask-user-question/prompt-strings.js.map +1 -0
- package/server/ask-user-question/registry.d.ts +39 -0
- package/server/ask-user-question/registry.d.ts.map +1 -0
- package/server/ask-user-question/registry.js +124 -0
- package/server/ask-user-question/registry.js.map +1 -0
- package/server/ask-user-question/tool.d.ts +4 -0
- package/server/ask-user-question/tool.d.ts.map +1 -0
- package/server/ask-user-question/tool.js +68 -0
- package/server/ask-user-question/tool.js.map +1 -0
- package/server/ask-user-question/types.d.ts +50 -0
- package/server/ask-user-question/types.d.ts.map +1 -0
- package/server/ask-user-question/types.js +7 -0
- package/server/ask-user-question/types.js.map +1 -0
- package/server/ask-user-question/validate.d.ts +3 -0
- package/server/ask-user-question/validate.d.ts.map +1 -0
- package/server/ask-user-question/validate.js +67 -0
- package/server/ask-user-question/validate.js.map +1 -0
- package/server/clone-provider.d.ts +55 -0
- package/server/clone-provider.d.ts.map +1 -0
- package/server/clone-provider.js +172 -0
- package/server/clone-provider.js.map +1 -0
- package/server/compaction-cards.d.ts +62 -0
- package/server/compaction-cards.d.ts.map +1 -0
- package/server/compaction-cards.js +180 -0
- package/server/compaction-cards.js.map +1 -0
- package/server/compaction-continuation.d.ts +112 -0
- package/server/compaction-continuation.d.ts.map +1 -0
- package/server/compaction-continuation.js +65 -0
- package/server/compaction-continuation.js.map +1 -0
- package/server/config-store.d.ts +97 -0
- package/server/config-store.d.ts.map +1 -0
- package/server/config-store.js +351 -0
- package/server/config-store.js.map +1 -0
- package/server/config.d.ts +24 -0
- package/server/config.d.ts.map +1 -0
- package/server/config.js +67 -0
- package/server/config.js.map +1 -0
- package/server/event-stream.d.ts +28 -0
- package/server/event-stream.d.ts.map +1 -0
- package/server/event-stream.js +153 -0
- package/server/event-stream.js.map +1 -0
- package/server/extension-manager.d.ts +116 -0
- package/server/extension-manager.d.ts.map +1 -0
- package/server/extension-manager.js +586 -0
- package/server/extension-manager.js.map +1 -0
- package/server/extension-scanner.d.ts +26 -0
- package/server/extension-scanner.d.ts.map +1 -0
- package/server/extension-scanner.js +107 -0
- package/server/extension-scanner.js.map +1 -0
- package/server/extension-ui-bridge.d.ts +35 -0
- package/server/extension-ui-bridge.d.ts.map +1 -0
- package/server/extension-ui-bridge.js +228 -0
- package/server/extension-ui-bridge.js.map +1 -0
- package/server/file-manager.d.ts +79 -0
- package/server/file-manager.d.ts.map +1 -0
- package/server/file-manager.js +535 -0
- package/server/file-manager.js.map +1 -0
- package/server/file-searcher.d.ts +29 -0
- package/server/file-searcher.d.ts.map +1 -0
- package/server/file-searcher.js +318 -0
- package/server/file-searcher.js.map +1 -0
- package/server/git-operations.d.ts +346 -0
- package/server/git-operations.d.ts.map +1 -0
- package/server/git-operations.js +884 -0
- package/server/git-operations.js.map +1 -0
- package/server/hunk-stager.d.ts +56 -0
- package/server/hunk-stager.d.ts.map +1 -0
- package/server/hunk-stager.js +137 -0
- package/server/hunk-stager.js.map +1 -0
- package/server/index.d.ts +21 -0
- package/server/index.d.ts.map +1 -0
- package/server/index.js +262 -0
- package/server/index.js.map +1 -0
- package/server/mcp/config.d.ts +23 -0
- package/server/mcp/config.d.ts.map +1 -0
- package/server/mcp/config.js +139 -0
- package/server/mcp/config.js.map +1 -0
- package/server/mcp/manager.d.ts +40 -0
- package/server/mcp/manager.d.ts.map +1 -0
- package/server/mcp/manager.js +435 -0
- package/server/mcp/manager.js.map +1 -0
- package/server/mcp/stdio-trust.d.ts +5 -0
- package/server/mcp/stdio-trust.d.ts.map +1 -0
- package/server/mcp/stdio-trust.js +78 -0
- package/server/mcp/stdio-trust.js.map +1 -0
- package/server/mcp/tool-bridge.d.ts +33 -0
- package/server/mcp/tool-bridge.d.ts.map +1 -0
- package/server/mcp/tool-bridge.js +138 -0
- package/server/mcp/tool-bridge.js.map +1 -0
- package/server/orchestration/config.d.ts +5 -0
- package/server/orchestration/config.d.ts.map +1 -0
- package/server/orchestration/config.js +35 -0
- package/server/orchestration/config.js.map +1 -0
- package/server/orchestration/event-bridge.d.ts +32 -0
- package/server/orchestration/event-bridge.d.ts.map +1 -0
- package/server/orchestration/event-bridge.js +110 -0
- package/server/orchestration/event-bridge.js.map +1 -0
- package/server/orchestration/inbox.d.ts +9 -0
- package/server/orchestration/inbox.d.ts.map +1 -0
- package/server/orchestration/inbox.js +186 -0
- package/server/orchestration/inbox.js.map +1 -0
- package/server/orchestration/init.d.ts +2 -0
- package/server/orchestration/init.d.ts.map +1 -0
- package/server/orchestration/init.js +22 -0
- package/server/orchestration/init.js.map +1 -0
- package/server/orchestration/store.d.ts +33 -0
- package/server/orchestration/store.d.ts.map +1 -0
- package/server/orchestration/store.js +331 -0
- package/server/orchestration/store.js.map +1 -0
- package/server/orchestration/tools.d.ts +15 -0
- package/server/orchestration/tools.d.ts.map +1 -0
- package/server/orchestration/tools.js +621 -0
- package/server/orchestration/tools.js.map +1 -0
- package/server/orchestration/types.d.ts +68 -0
- package/server/orchestration/types.d.ts.map +1 -0
- package/server/orchestration/types.js +43 -0
- package/server/orchestration/types.js.map +1 -0
- package/server/orchestration/worker-lifecycle.d.ts +15 -0
- package/server/orchestration/worker-lifecycle.d.ts.map +1 -0
- package/server/orchestration/worker-lifecycle.js +45 -0
- package/server/orchestration/worker-lifecycle.js.map +1 -0
- package/server/path-refs.d.ts +5 -0
- package/server/path-refs.d.ts.map +1 -0
- package/server/path-refs.js +249 -0
- package/server/path-refs.js.map +1 -0
- package/server/routes/_schemas.d.ts +16 -0
- package/server/routes/_schemas.d.ts.map +1 -0
- package/server/routes/_schemas.js +12 -0
- package/server/routes/_schemas.js.map +1 -0
- package/server/routes/ask-user-question.d.ts +3 -0
- package/server/routes/ask-user-question.d.ts.map +1 -0
- package/server/routes/ask-user-question.js +105 -0
- package/server/routes/ask-user-question.js.map +1 -0
- package/server/routes/auth.d.ts +8 -0
- package/server/routes/auth.d.ts.map +1 -0
- package/server/routes/auth.js +225 -0
- package/server/routes/auth.js.map +1 -0
- package/server/routes/config.d.ts +3 -0
- package/server/routes/config.d.ts.map +1 -0
- package/server/routes/config.js +602 -0
- package/server/routes/config.js.map +1 -0
- package/server/routes/control.d.ts +3 -0
- package/server/routes/control.d.ts.map +1 -0
- package/server/routes/control.js +365 -0
- package/server/routes/control.js.map +1 -0
- package/server/routes/exec.d.ts +3 -0
- package/server/routes/exec.d.ts.map +1 -0
- package/server/routes/exec.js +426 -0
- package/server/routes/exec.js.map +1 -0
- package/server/routes/extension-commands.d.ts +22 -0
- package/server/routes/extension-commands.d.ts.map +1 -0
- package/server/routes/extension-commands.js +178 -0
- package/server/routes/extension-commands.js.map +1 -0
- package/server/routes/extensions.d.ts +8 -0
- package/server/routes/extensions.d.ts.map +1 -0
- package/server/routes/extensions.js +414 -0
- package/server/routes/extensions.js.map +1 -0
- package/server/routes/files.d.ts +3 -0
- package/server/routes/files.d.ts.map +1 -0
- package/server/routes/files.js +835 -0
- package/server/routes/files.js.map +1 -0
- package/server/routes/git.d.ts +3 -0
- package/server/routes/git.d.ts.map +1 -0
- package/server/routes/git.js +1058 -0
- package/server/routes/git.js.map +1 -0
- package/server/routes/mcp.d.ts +3 -0
- package/server/routes/mcp.d.ts.map +1 -0
- package/server/routes/mcp.js +403 -0
- package/server/routes/mcp.js.map +1 -0
- package/server/routes/orchestration.d.ts +3 -0
- package/server/routes/orchestration.d.ts.map +1 -0
- package/server/routes/orchestration.js +251 -0
- package/server/routes/orchestration.js.map +1 -0
- package/server/routes/projects.d.ts +3 -0
- package/server/routes/projects.d.ts.map +1 -0
- package/server/routes/projects.js +421 -0
- package/server/routes/projects.js.map +1 -0
- package/server/routes/prompt.d.ts +3 -0
- package/server/routes/prompt.d.ts.map +1 -0
- package/server/routes/prompt.js +311 -0
- package/server/routes/prompt.js.map +1 -0
- package/server/routes/session-extensions.d.ts +11 -0
- package/server/routes/session-extensions.d.ts.map +1 -0
- package/server/routes/session-extensions.js +171 -0
- package/server/routes/session-extensions.js.map +1 -0
- package/server/routes/sessions.d.ts +3 -0
- package/server/routes/sessions.d.ts.map +1 -0
- package/server/routes/sessions.js +706 -0
- package/server/routes/sessions.js.map +1 -0
- package/server/routes/skills.d.ts +14 -0
- package/server/routes/skills.d.ts.map +1 -0
- package/server/routes/skills.js +448 -0
- package/server/routes/skills.js.map +1 -0
- package/server/routes/stream.d.ts +3 -0
- package/server/routes/stream.d.ts.map +1 -0
- package/server/routes/stream.js +112 -0
- package/server/routes/stream.js.map +1 -0
- package/server/routes/terminal.d.ts +28 -0
- package/server/routes/terminal.d.ts.map +1 -0
- package/server/routes/terminal.js +211 -0
- package/server/routes/terminal.js.map +1 -0
- package/server/routes/tunnel.d.ts +13 -0
- package/server/routes/tunnel.d.ts.map +1 -0
- package/server/routes/tunnel.js +231 -0
- package/server/routes/tunnel.js.map +1 -0
- package/server/session-alerts.d.ts +28 -0
- package/server/session-alerts.d.ts.map +1 -0
- package/server/session-alerts.js +38 -0
- package/server/session-alerts.js.map +1 -0
- package/server/session-store.d.ts +164 -0
- package/server/session-store.d.ts.map +1 -0
- package/server/session-store.js +754 -0
- package/server/session-store.js.map +1 -0
- package/server/skill-policy.d.ts +47 -0
- package/server/skill-policy.d.ts.map +1 -0
- package/server/skill-policy.js +178 -0
- package/server/skill-policy.js.map +1 -0
- package/server/terminal-provider.d.ts +54 -0
- package/server/terminal-provider.d.ts.map +1 -0
- package/server/terminal-provider.js +220 -0
- package/server/terminal-provider.js.map +1 -0
- package/server/tool-policy.d.ts +39 -0
- package/server/tool-policy.d.ts.map +1 -0
- package/server/tool-policy.js +121 -0
- package/server/tool-policy.js.map +1 -0
- package/server/tunnel/executable-search.d.ts +43 -0
- package/server/tunnel/executable-search.d.ts.map +1 -0
- package/server/tunnel/executable-search.js +148 -0
- package/server/tunnel/executable-search.js.map +1 -0
- package/server/tunnel/install-help.d.ts +19 -0
- package/server/tunnel/install-help.d.ts.map +1 -0
- package/server/tunnel/install-help.js +47 -0
- package/server/tunnel/install-help.js.map +1 -0
- package/server/tunnel/providers/ngrok.d.ts +31 -0
- package/server/tunnel/providers/ngrok.d.ts.map +1 -0
- package/server/tunnel/providers/ngrok.js +461 -0
- package/server/tunnel/providers/ngrok.js.map +1 -0
- package/server/tunnel/registry.d.ts +13 -0
- package/server/tunnel/registry.d.ts.map +1 -0
- package/server/tunnel/registry.js +56 -0
- package/server/tunnel/registry.js.map +1 -0
- package/server/tunnel/service.d.ts +13 -0
- package/server/tunnel/service.d.ts.map +1 -0
- package/server/tunnel/service.js +156 -0
- package/server/tunnel/service.js.map +1 -0
- package/server/tunnel/types.d.ts +163 -0
- package/server/tunnel/types.d.ts.map +1 -0
- package/server/tunnel/types.js +214 -0
- package/server/tunnel/types.js.map +1 -0
- package/server/ui-settings-store.d.ts +25 -0
- package/server/ui-settings-store.d.ts.map +1 -0
- package/server/ui-settings-store.js +91 -0
- package/server/ui-settings-store.js.map +1 -0
- package/server/workspace-store.d.ts +25 -0
- package/server/workspace-store.d.ts.map +1 -0
- package/server/workspace-store.js +157 -0
- package/server/workspace-store.js.map +1 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Manager — wraps SDK config files (auth.json, settings.json, models.json).
|
|
3
|
+
*
|
|
4
|
+
* Lightweight: no prompt/skill/tool overrides, no export/import.
|
|
5
|
+
*/
|
|
6
|
+
import { readFile, writeFile, rename, unlink, mkdir } from "node:fs/promises";
|
|
7
|
+
import { join, dirname } from "node:path";
|
|
8
|
+
import { randomUUID } from "node:crypto";
|
|
9
|
+
import { getSupportedThinkingLevels } from "@earendil-works/pi-ai";
|
|
10
|
+
import { AuthStorage, SettingsManager, ModelRegistry, } from "@earendil-works/pi-coding-agent";
|
|
11
|
+
import { config } from "./config.js";
|
|
12
|
+
/**
|
|
13
|
+
* Probe a provider endpoint to test connectivity, detect API type,
|
|
14
|
+
* and fetch available models.
|
|
15
|
+
*/
|
|
16
|
+
export async function probeProvider(req) {
|
|
17
|
+
const baseUrl = req.baseUrl.replace(/\/+$/, "");
|
|
18
|
+
// Build headers
|
|
19
|
+
const headers = {
|
|
20
|
+
...(req.headers ?? {}),
|
|
21
|
+
};
|
|
22
|
+
if (req.apiKey) {
|
|
23
|
+
headers["Authorization"] = `Bearer ${req.apiKey}`;
|
|
24
|
+
}
|
|
25
|
+
// Detect API type if not provided
|
|
26
|
+
const urlLower = baseUrl.toLowerCase();
|
|
27
|
+
const apiType = req.apiType ??
|
|
28
|
+
(urlLower.includes("anthropic")
|
|
29
|
+
? "anthropic-messages"
|
|
30
|
+
: urlLower.includes("google")
|
|
31
|
+
? "google-generative-ai"
|
|
32
|
+
: "openai-completions");
|
|
33
|
+
// Try to fetch models — different endpoints per API type
|
|
34
|
+
let modelsEndpoint;
|
|
35
|
+
if (apiType === "google-generative-ai") {
|
|
36
|
+
// Google uses /v1beta/models or /v1/models
|
|
37
|
+
modelsEndpoint = baseUrl.endsWith("/v1beta") || baseUrl.endsWith("/v1")
|
|
38
|
+
? `${baseUrl}/models`
|
|
39
|
+
: `${baseUrl}/v1beta/models`;
|
|
40
|
+
}
|
|
41
|
+
else if (apiType === "anthropic-messages") {
|
|
42
|
+
// Anthropic doesn't have a public models endpoint — try common patterns
|
|
43
|
+
modelsEndpoint = `${baseUrl}/models`;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// OpenAI-compatible: /v1/models or /models
|
|
47
|
+
modelsEndpoint = baseUrl.endsWith("/v1")
|
|
48
|
+
? `${baseUrl}/models`
|
|
49
|
+
: `${baseUrl}/v1/models`;
|
|
50
|
+
}
|
|
51
|
+
// First test basic connectivity
|
|
52
|
+
try {
|
|
53
|
+
const controller = new AbortController();
|
|
54
|
+
const timeout = setTimeout(() => controller.abort(), 10000);
|
|
55
|
+
const res = await fetch(modelsEndpoint, {
|
|
56
|
+
method: "GET",
|
|
57
|
+
headers,
|
|
58
|
+
signal: controller.signal,
|
|
59
|
+
});
|
|
60
|
+
clearTimeout(timeout);
|
|
61
|
+
if (!res.ok) {
|
|
62
|
+
return {
|
|
63
|
+
reachable: false,
|
|
64
|
+
error: `HTTP ${res.status}: ${res.statusText}. Tried ${modelsEndpoint}`,
|
|
65
|
+
detectedApiType: apiType,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const body = (await res.json());
|
|
69
|
+
// Parse models from response
|
|
70
|
+
let models = [];
|
|
71
|
+
if (Array.isArray(body.data)) {
|
|
72
|
+
// OpenAI-compatible { data: [{ id, ... }] }
|
|
73
|
+
models = body.data.map((m) => ({
|
|
74
|
+
id: String(m.id ?? ""),
|
|
75
|
+
name: String(m.name ?? m.id ?? ""),
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
else if (Array.isArray(body.models)) {
|
|
79
|
+
// Google-style { models: [{ name, ... }] }
|
|
80
|
+
models = body.models.map((m) => {
|
|
81
|
+
const name = String(m.name ?? "");
|
|
82
|
+
const shortId = name.includes("/") ? name.split("/").pop() ?? name : name;
|
|
83
|
+
return { id: shortId, name };
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Filter out empty ids
|
|
87
|
+
models = models.filter((m) => m.id.length > 0);
|
|
88
|
+
// Derive a suggested provider name from the hostname
|
|
89
|
+
let suggestedName;
|
|
90
|
+
try {
|
|
91
|
+
const hostname = new URL(baseUrl).hostname;
|
|
92
|
+
suggestedName = hostname
|
|
93
|
+
.replace(/^api[.-]/, "")
|
|
94
|
+
.replace(/[.-]api$/, "")
|
|
95
|
+
.replace(/\./g, "-")
|
|
96
|
+
.replace(/[^a-zA-Z0-9_-]/g, "")
|
|
97
|
+
.toLowerCase()
|
|
98
|
+
.slice(0, 24) || "custom";
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
suggestedName = "custom";
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
reachable: true,
|
|
105
|
+
detectedApiType: apiType,
|
|
106
|
+
models,
|
|
107
|
+
suggestedName,
|
|
108
|
+
rawResponse: models.length > 0 ? undefined : body,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
113
|
+
return {
|
|
114
|
+
reachable: false,
|
|
115
|
+
error: `Connection failed: ${message}`,
|
|
116
|
+
detectedApiType: apiType,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Add or update a custom provider in models.json.
|
|
122
|
+
*/
|
|
123
|
+
export async function addCustomProvider(providerName, config) {
|
|
124
|
+
const current = await readModelsJsonRaw();
|
|
125
|
+
current.providers[providerName] = config;
|
|
126
|
+
await writeModelsJson(current);
|
|
127
|
+
return { providers: current.providers };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Remove a custom provider from models.json.
|
|
131
|
+
*/
|
|
132
|
+
export async function removeCustomProvider(providerName) {
|
|
133
|
+
const current = await readModelsJsonRaw();
|
|
134
|
+
delete current.providers[providerName];
|
|
135
|
+
await writeModelsJson(current);
|
|
136
|
+
return { providers: current.providers };
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Read models.json raw (without redaction).
|
|
140
|
+
*/
|
|
141
|
+
async function readModelsJsonRaw() {
|
|
142
|
+
try {
|
|
143
|
+
const raw = await readFile(MODELS_PATH, "utf-8");
|
|
144
|
+
return JSON.parse(raw);
|
|
145
|
+
}
|
|
146
|
+
catch (err) {
|
|
147
|
+
if (err.code === "ENOENT") {
|
|
148
|
+
return { providers: {} };
|
|
149
|
+
}
|
|
150
|
+
throw err;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// ── Paths ─────────────────────────────────────────────────────────────────
|
|
154
|
+
const PI_CONFIG_DIR = config.piConfigDir;
|
|
155
|
+
const AUTH_PATH = join(PI_CONFIG_DIR, "auth.json");
|
|
156
|
+
const MODELS_PATH = join(PI_CONFIG_DIR, "models.json");
|
|
157
|
+
// ── Errors ─────────────────────────────────────────────────────────────────
|
|
158
|
+
export class AuthProviderNotFoundError extends Error {
|
|
159
|
+
constructor(provider) {
|
|
160
|
+
super(`Auth provider "${provider}" not found`);
|
|
161
|
+
this.name = "AuthProviderNotFoundError";
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
export function readAuthSummary() {
|
|
165
|
+
const store = AuthStorage.create(AUTH_PATH);
|
|
166
|
+
const providers = {};
|
|
167
|
+
for (const name of store.list()) {
|
|
168
|
+
providers[name] = {
|
|
169
|
+
configured: store.has(name),
|
|
170
|
+
source: "stored",
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
return { providers };
|
|
174
|
+
}
|
|
175
|
+
export function writeApiKey(provider, apiKey) {
|
|
176
|
+
const store = AuthStorage.create(AUTH_PATH);
|
|
177
|
+
store.set(provider, { type: "api_key", key: apiKey });
|
|
178
|
+
}
|
|
179
|
+
export function removeApiKey(provider) {
|
|
180
|
+
const store = AuthStorage.create(AUTH_PATH);
|
|
181
|
+
if (!store.has(provider)) {
|
|
182
|
+
throw new AuthProviderNotFoundError(provider);
|
|
183
|
+
}
|
|
184
|
+
store.remove(provider);
|
|
185
|
+
}
|
|
186
|
+
// ── Settings (settings.json) ──────────────────────────────────────────────
|
|
187
|
+
export function readSettings() {
|
|
188
|
+
const mgr = SettingsManager.create(PI_CONFIG_DIR);
|
|
189
|
+
return mgr.getGlobalSettings();
|
|
190
|
+
}
|
|
191
|
+
export function updateSettings(patch) {
|
|
192
|
+
const mgr = SettingsManager.create(PI_CONFIG_DIR);
|
|
193
|
+
// Apply overrides for the fields that have individual setters
|
|
194
|
+
if (patch.defaultProvider !== undefined && patch.defaultProvider !== null) {
|
|
195
|
+
mgr.setDefaultProvider(String(patch.defaultProvider));
|
|
196
|
+
}
|
|
197
|
+
if (patch.defaultModel !== undefined && patch.defaultModel !== null) {
|
|
198
|
+
mgr.setDefaultModel(String(patch.defaultModel));
|
|
199
|
+
}
|
|
200
|
+
if (patch.defaultThinkingLevel !== undefined && patch.defaultThinkingLevel !== null) {
|
|
201
|
+
mgr.setDefaultThinkingLevel(patch.defaultThinkingLevel);
|
|
202
|
+
}
|
|
203
|
+
if (patch.skills !== undefined) {
|
|
204
|
+
mgr.setSkillPaths(patch.skills === null ? [] : patch.skills);
|
|
205
|
+
}
|
|
206
|
+
if (patch.enableSkillCommands !== undefined) {
|
|
207
|
+
mgr.setEnableSkillCommands(patch.enableSkillCommands === null ? false : Boolean(patch.enableSkillCommands));
|
|
208
|
+
}
|
|
209
|
+
mgr.flush();
|
|
210
|
+
// Handle orchestrator model fields (not managed by SDK SettingsManager)
|
|
211
|
+
const raw = mgr.getGlobalSettings();
|
|
212
|
+
if (patch.orchProvider !== undefined) {
|
|
213
|
+
raw.orchProvider = patch.orchProvider === null ? undefined : String(patch.orchProvider);
|
|
214
|
+
}
|
|
215
|
+
if (patch.orchModel !== undefined) {
|
|
216
|
+
raw.orchModel = patch.orchModel === null ? undefined : String(patch.orchModel);
|
|
217
|
+
}
|
|
218
|
+
// Write back to persist the extra fields
|
|
219
|
+
writeSettings(raw).catch(() => undefined);
|
|
220
|
+
return raw;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Read models.json, redacting secret fields (apiKey, apiKeyCommand).
|
|
224
|
+
*/
|
|
225
|
+
export async function readModelsJsonRedacted() {
|
|
226
|
+
try {
|
|
227
|
+
const raw = await readFile(MODELS_PATH, "utf-8");
|
|
228
|
+
const parsed = JSON.parse(raw);
|
|
229
|
+
// Redact secrets in every provider config
|
|
230
|
+
const redacted = { providers: {} };
|
|
231
|
+
for (const [key, val] of Object.entries(parsed.providers ?? {})) {
|
|
232
|
+
if (typeof val === "object" && val !== null) {
|
|
233
|
+
const v = val;
|
|
234
|
+
const redactedVal = {};
|
|
235
|
+
for (const [k, vv] of Object.entries(v)) {
|
|
236
|
+
if ((k === "apiKey" || k === "apiKeyCommand") && vv !== undefined) {
|
|
237
|
+
redactedVal[k] = "***REDACTED***";
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
redactedVal[k] = vv;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
redacted.providers[key] = redactedVal;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
redacted.providers[key] = val;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return redacted;
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
if (err.code === "ENOENT") {
|
|
253
|
+
return { providers: {} };
|
|
254
|
+
}
|
|
255
|
+
throw err;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
export async function writeModelsJson(data) {
|
|
259
|
+
await mkdir(dirname(MODELS_PATH), { recursive: true });
|
|
260
|
+
await writeFile(MODELS_PATH, JSON.stringify(data, null, 2), "utf-8");
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Atomic JSON write (tmp + rename) for config files.
|
|
264
|
+
* Pattern: crash-safe writes, no partial writes.
|
|
265
|
+
*/
|
|
266
|
+
async function atomicWriteJson(path, data) {
|
|
267
|
+
await mkdir(dirname(path), { recursive: true });
|
|
268
|
+
const tmp = `${path}.${randomUUID()}.tmp`;
|
|
269
|
+
await writeFile(tmp, JSON.stringify(data, null, 2), "utf8");
|
|
270
|
+
try {
|
|
271
|
+
await rename(tmp, path);
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
await unlink(tmp).catch(() => undefined);
|
|
275
|
+
throw err;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Write settings.json atomically. Used by the per-session setModel route
|
|
280
|
+
* to restore the global default after the SDK mutates it as a side effect
|
|
281
|
+
* of session.setModel().
|
|
282
|
+
* Uses a temp-file + rename pattern for atomic writes.
|
|
283
|
+
*/
|
|
284
|
+
export async function writeSettings(settings) {
|
|
285
|
+
const SETTINGS_FILE = join(PI_CONFIG_DIR, "settings.json");
|
|
286
|
+
await atomicWriteJson(SETTINGS_FILE, settings);
|
|
287
|
+
}
|
|
288
|
+
// ── Enabled Models (settings.json → enabledModels) ─────────────────────────
|
|
289
|
+
/**
|
|
290
|
+
* Read the enabledModels array from settings via the SDK SettingsManager.
|
|
291
|
+
* Returns undefined when no scoping is active (all models visible).
|
|
292
|
+
*/
|
|
293
|
+
export function readEnabledModels() {
|
|
294
|
+
const mgr = SettingsManager.create(PI_CONFIG_DIR);
|
|
295
|
+
return mgr.getEnabledModels();
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Persist the enabledModels array to settings. Pass undefined or null
|
|
299
|
+
* to disable scoping (all models visible).
|
|
300
|
+
*/
|
|
301
|
+
export function writeEnabledModels(patterns) {
|
|
302
|
+
const mgr = SettingsManager.create(PI_CONFIG_DIR);
|
|
303
|
+
mgr.setEnabledModels(patterns === null || patterns === undefined ? undefined : patterns);
|
|
304
|
+
}
|
|
305
|
+
// ── Live providers listing (from SDK ModelRegistry) ──────────────────────
|
|
306
|
+
function buildModelDetail(m, registry) {
|
|
307
|
+
const supportedThinkingLevels = (() => {
|
|
308
|
+
try {
|
|
309
|
+
return getSupportedThinkingLevels(m);
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
return [];
|
|
313
|
+
}
|
|
314
|
+
})();
|
|
315
|
+
return {
|
|
316
|
+
id: m.id,
|
|
317
|
+
name: m.name,
|
|
318
|
+
contextWindow: m.contextWindow,
|
|
319
|
+
maxTokens: m.maxTokens,
|
|
320
|
+
reasoning: m.reasoning,
|
|
321
|
+
input: m.input,
|
|
322
|
+
hasAuth: registry.hasConfiguredAuth(m),
|
|
323
|
+
supportedThinkingLevels,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
export function liveProvidersListing(opts) {
|
|
327
|
+
const store = AuthStorage.create(AUTH_PATH);
|
|
328
|
+
const registry = ModelRegistry.create(store, MODELS_PATH);
|
|
329
|
+
let all = registry.getAll();
|
|
330
|
+
console.log("[config] total models:", all.length);
|
|
331
|
+
// Filter to enabled models when scoped mode is on
|
|
332
|
+
if (opts?.scoped === true) {
|
|
333
|
+
const enabled = readEnabledModels();
|
|
334
|
+
if (enabled !== undefined && enabled.length > 0) {
|
|
335
|
+
// enabledModels are stored as "provider/modelId" patterns
|
|
336
|
+
all = all.filter((m) => enabled.includes(`${m.provider}/${m.id}`));
|
|
337
|
+
console.log("[config] scoped models:", all.length);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
const grouped = new Map();
|
|
341
|
+
for (const m of all) {
|
|
342
|
+
let entry = grouped.get(m.provider);
|
|
343
|
+
if (entry === undefined) {
|
|
344
|
+
entry = { provider: m.provider, models: [] };
|
|
345
|
+
grouped.set(m.provider, entry);
|
|
346
|
+
}
|
|
347
|
+
entry.models.push(buildModelDetail(m, registry));
|
|
348
|
+
}
|
|
349
|
+
return { providers: Array.from(grouped.values()) };
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=config-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-store.js","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const config: Readonly<{
|
|
2
|
+
readonly port: number;
|
|
3
|
+
readonly host: string;
|
|
4
|
+
readonly logLevel: string;
|
|
5
|
+
readonly isTest: boolean;
|
|
6
|
+
readonly trustProxy: boolean;
|
|
7
|
+
readonly workspacePath: string;
|
|
8
|
+
readonly piConfigDir: string;
|
|
9
|
+
readonly forgeDataDir: string;
|
|
10
|
+
readonly sessionDir: string;
|
|
11
|
+
readonly mcpConfigFile: string;
|
|
12
|
+
readonly mcpStdioTrustFile: string;
|
|
13
|
+
readonly toolOverridesFile: string;
|
|
14
|
+
readonly skillOverridesFile: string;
|
|
15
|
+
readonly uiPassword: string | undefined;
|
|
16
|
+
readonly apiKey: string | undefined;
|
|
17
|
+
readonly clientDistPath: string;
|
|
18
|
+
readonly serveClient: boolean;
|
|
19
|
+
readonly corsOrigin: string | true;
|
|
20
|
+
readonly orchestrationEnabled: boolean;
|
|
21
|
+
readonly orchestrationMaxWorkersPerSupervisor: number;
|
|
22
|
+
readonly minimalUi: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAsDA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;EA8BR,CAAC"}
|
package/server/config.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
function readEnv(key) {
|
|
5
|
+
const v = process.env[key];
|
|
6
|
+
return v === undefined || v === "" ? undefined : v;
|
|
7
|
+
}
|
|
8
|
+
function readInt(key, fallback) {
|
|
9
|
+
const v = readEnv(key);
|
|
10
|
+
if (v === undefined)
|
|
11
|
+
return fallback;
|
|
12
|
+
const n = Number.parseInt(v, 10);
|
|
13
|
+
if (!Number.isFinite(n) || n < 0 || String(n) !== v.trim()) {
|
|
14
|
+
throw new Error(`config: ${key} must be a non-negative integer (got ${v})`);
|
|
15
|
+
}
|
|
16
|
+
return n;
|
|
17
|
+
}
|
|
18
|
+
function readBool(key, fallback) {
|
|
19
|
+
const v = readEnv(key)?.toLowerCase();
|
|
20
|
+
if (v === undefined)
|
|
21
|
+
return fallback;
|
|
22
|
+
return ["1", "true", "yes", "on"].includes(v);
|
|
23
|
+
}
|
|
24
|
+
function modeSuffix() {
|
|
25
|
+
const mode = readEnv("PIKOT_MODE") ?? "";
|
|
26
|
+
return mode === "dev" ? "-dev" : "";
|
|
27
|
+
}
|
|
28
|
+
const HOME = homedir();
|
|
29
|
+
if (HOME === "/" || HOME === "") {
|
|
30
|
+
throw new Error("config: os.homedir() returned empty path. " +
|
|
31
|
+
"Set HOME / USERPROFILE to a real user account.");
|
|
32
|
+
}
|
|
33
|
+
const SUFFIX = modeSuffix();
|
|
34
|
+
const WORKSPACE_PATH = resolve(readEnv("WORKSPACE_PATH") ?? resolve(HOME, `.pi-kot${SUFFIX}`, "workspace", "default"));
|
|
35
|
+
const SESSION_DIR = resolve(readEnv("SESSION_DIR") ?? resolve(HOME, `.pi-kot${SUFFIX}`, "sessions"));
|
|
36
|
+
const FORGE_DATA_DIR = resolve(readEnv("FORGE_DATA_DIR") ?? resolve(HOME, `.pi-kot${SUFFIX}`));
|
|
37
|
+
/** Path to built client dist (Vite output). Resolved relative to server dist/ */
|
|
38
|
+
const CLIENT_DIST_PATH = resolve(readEnv("CLIENT_DIST_PATH") ??
|
|
39
|
+
join(dirname(fileURLToPath(import.meta.url)), "..", "..", "client", "dist"));
|
|
40
|
+
export const config = Object.freeze({
|
|
41
|
+
port: readInt("PORT", 3333),
|
|
42
|
+
host: readEnv("HOST") ?? "0.0.0.0",
|
|
43
|
+
logLevel: readEnv("LOG_LEVEL") ?? "info",
|
|
44
|
+
isTest: (readEnv("NODE_ENV") ?? "") === "test",
|
|
45
|
+
trustProxy: readBool("TRUST_PROXY", false),
|
|
46
|
+
workspacePath: WORKSPACE_PATH,
|
|
47
|
+
piConfigDir: resolve(readEnv("PI_CONFIG_DIR") ?? resolve(HOME, ".pi", `agent${SUFFIX}`)),
|
|
48
|
+
forgeDataDir: FORGE_DATA_DIR,
|
|
49
|
+
sessionDir: SESSION_DIR,
|
|
50
|
+
mcpConfigFile: resolve(readEnv("MCP_CONFIG_FILE") ?? resolve(FORGE_DATA_DIR, "mcp.json")),
|
|
51
|
+
mcpStdioTrustFile: resolve(readEnv("MCP_STDIO_TRUST_FILE") ?? resolve(FORGE_DATA_DIR, "mcp-stdio-trust.json")),
|
|
52
|
+
toolOverridesFile: resolve(readEnv("TOOL_OVERRIDES_FILE") ?? resolve(FORGE_DATA_DIR, "tool-overrides.json")),
|
|
53
|
+
skillOverridesFile: resolve(readEnv("SKILL_OVERRIDES_FILE") ?? resolve(FORGE_DATA_DIR, "skill-overrides.json")),
|
|
54
|
+
// Auth
|
|
55
|
+
uiPassword: readEnv("UI_PASSWORD"),
|
|
56
|
+
apiKey: readEnv("API_KEY"),
|
|
57
|
+
// Static client (production)
|
|
58
|
+
clientDistPath: CLIENT_DIST_PATH,
|
|
59
|
+
serveClient: readBool("SERVE_CLIENT", true),
|
|
60
|
+
// CORS
|
|
61
|
+
corsOrigin: readEnv("CORS_ORIGIN") ?? true,
|
|
62
|
+
// Orchestration
|
|
63
|
+
orchestrationEnabled: readBool("ORCHESTRATION_ENABLED", true),
|
|
64
|
+
orchestrationMaxWorkersPerSupervisor: readInt("ORCHESTRATION_MAX_WORKERS", 8),
|
|
65
|
+
minimalUi: readBool("MINIMAL_UI", false),
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { FastifyReply } from "fastify";
|
|
2
|
+
import type { LiveSession, SSEClient } from "./session-store.js";
|
|
3
|
+
/**
|
|
4
|
+
* Serialize an event into SSE wire format.
|
|
5
|
+
*/
|
|
6
|
+
export declare function serializeSSE(event: {
|
|
7
|
+
type: string;
|
|
8
|
+
[k: string]: unknown;
|
|
9
|
+
}): string;
|
|
10
|
+
/**
|
|
11
|
+
* Build a snapshot event from the current LiveSession state.
|
|
12
|
+
* Sent immediately on SSE connect so the browser can hydrate
|
|
13
|
+
* without a separate HTTP round-trip.
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildSnapshot(live: LiveSession): {
|
|
16
|
+
type: "snapshot";
|
|
17
|
+
sessionId: string;
|
|
18
|
+
projectId: string;
|
|
19
|
+
messages: unknown[];
|
|
20
|
+
isStreaming: boolean;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Hijack the Fastify reply and turn it into a long-lived SSE stream
|
|
24
|
+
* attached to `live.clients`. Sends a snapshot immediately, forwards
|
|
25
|
+
* filtered AgentSessionEvents, and unregisters on socket close.
|
|
26
|
+
*/
|
|
27
|
+
export declare function createSSEClient(reply: FastifyReply, live: LiveSession): SSEClient;
|
|
28
|
+
//# sourceMappingURL=event-stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-stream.d.ts","sourceRoot":"","sources":["../src/event-stream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAsBjE;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,MAAM,CAElF;AA2CD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG;IAChD,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB,CAQA;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,GAAG,SAAS,CAuEjF"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
/**
|
|
3
|
+
* One-shot padding flush sent right after `compaction_start` so L7
|
|
4
|
+
* proxies (notably HAProxy on OpenShift) release the event immediately
|
|
5
|
+
* rather than buffering it through the multi-second compaction LLM call.
|
|
6
|
+
*
|
|
7
|
+
* The `compaction_start` event is ~150 bytes, well below any L7 proxy's
|
|
8
|
+
* minimum-buffer-to-flush threshold (1–8 KB is common). Without padding,
|
|
9
|
+
* the proxy holds the response for the entire duration of the compaction
|
|
10
|
+
* LLM call (several seconds) — by which point `compaction_end` has also
|
|
11
|
+
* fired and been buffered. The browser receives both events together,
|
|
12
|
+
* which defeats the purpose of sending `compaction_start` at all.
|
|
13
|
+
*
|
|
14
|
+
* This padding line is ~2000 bytes of comments. We use a dedicated
|
|
15
|
+
* writeRaw path that bypasses the event filter so it's invisible to
|
|
16
|
+
* clients. An `event: ping` SSE frame is less standard-compliant than
|
|
17
|
+
* a comment-only line (comments are defined in the SSE spec and all
|
|
18
|
+
* SSE parsers must ignore them).
|
|
19
|
+
*/
|
|
20
|
+
const COMPACTION_START_PADDING_LINE = `: ${Array(80).fill("-").join("")}\n`.repeat(40);
|
|
21
|
+
/**
|
|
22
|
+
* Serialize an event into SSE wire format.
|
|
23
|
+
*/
|
|
24
|
+
export function serializeSSE(event) {
|
|
25
|
+
return `data: ${JSON.stringify(event)}\n\n`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Allowed event types forwarded to browser clients.
|
|
29
|
+
* Unknown types are silently dropped for forwards-compatibility.
|
|
30
|
+
*/
|
|
31
|
+
const ALLOWED_EVENT_TYPES = new Set([
|
|
32
|
+
"agent_start",
|
|
33
|
+
"agent_end",
|
|
34
|
+
"turn_start",
|
|
35
|
+
"turn_end",
|
|
36
|
+
"message_start",
|
|
37
|
+
"message_update",
|
|
38
|
+
"message_end",
|
|
39
|
+
"tool_execution_start",
|
|
40
|
+
"tool_execution_update",
|
|
41
|
+
"tool_execution_end",
|
|
42
|
+
"tool_call",
|
|
43
|
+
"tool_result",
|
|
44
|
+
"queue_update",
|
|
45
|
+
"compaction_start",
|
|
46
|
+
"compaction_end",
|
|
47
|
+
"auto_retry_start",
|
|
48
|
+
"auto_retry_end",
|
|
49
|
+
"snapshot",
|
|
50
|
+
"ask_user_question",
|
|
51
|
+
"ask_user_question_cancelled",
|
|
52
|
+
// Streaming exec events (!cmd / !!cmd live terminal feed)
|
|
53
|
+
"exec_start",
|
|
54
|
+
"exec_update",
|
|
55
|
+
"exec_end",
|
|
56
|
+
// Extension UI bridge events
|
|
57
|
+
"extension_ui_select",
|
|
58
|
+
"extension_ui_confirm",
|
|
59
|
+
"extension_ui_input",
|
|
60
|
+
"extension_ui_notify",
|
|
61
|
+
"extension_ui_done",
|
|
62
|
+
]);
|
|
63
|
+
function isAllowedEvent(event) {
|
|
64
|
+
return ALLOWED_EVENT_TYPES.has(event.type);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Build a snapshot event from the current LiveSession state.
|
|
68
|
+
* Sent immediately on SSE connect so the browser can hydrate
|
|
69
|
+
* without a separate HTTP round-trip.
|
|
70
|
+
*/
|
|
71
|
+
export function buildSnapshot(live) {
|
|
72
|
+
return {
|
|
73
|
+
type: "snapshot",
|
|
74
|
+
sessionId: live.sessionId,
|
|
75
|
+
projectId: live.projectId,
|
|
76
|
+
messages: live.session.messages,
|
|
77
|
+
isStreaming: live.session.isStreaming,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Hijack the Fastify reply and turn it into a long-lived SSE stream
|
|
82
|
+
* attached to `live.clients`. Sends a snapshot immediately, forwards
|
|
83
|
+
* filtered AgentSessionEvents, and unregisters on socket close.
|
|
84
|
+
*/
|
|
85
|
+
export function createSSEClient(reply, live) {
|
|
86
|
+
reply.hijack();
|
|
87
|
+
const raw = reply.raw;
|
|
88
|
+
let registeredClient;
|
|
89
|
+
let closed = false;
|
|
90
|
+
try {
|
|
91
|
+
raw.writeHead(200, {
|
|
92
|
+
"Content-Type": "text/event-stream",
|
|
93
|
+
"Cache-Control": "no-cache, no-transform",
|
|
94
|
+
Connection: "keep-alive",
|
|
95
|
+
"X-Accel-Buffering": "no",
|
|
96
|
+
});
|
|
97
|
+
const id = randomUUID();
|
|
98
|
+
const close = () => {
|
|
99
|
+
if (closed)
|
|
100
|
+
return;
|
|
101
|
+
closed = true;
|
|
102
|
+
if (registeredClient !== undefined)
|
|
103
|
+
live.clients.delete(registeredClient);
|
|
104
|
+
try {
|
|
105
|
+
raw.end();
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// socket already torn down
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const send = (event) => {
|
|
112
|
+
if (closed)
|
|
113
|
+
return;
|
|
114
|
+
if (!isAllowedEvent(event))
|
|
115
|
+
return;
|
|
116
|
+
try {
|
|
117
|
+
raw.write(serializeSSE(event));
|
|
118
|
+
// After compaction_start, follow with a padding flush so L7
|
|
119
|
+
// proxies (notably the OpenShift HAProxy router) release the
|
|
120
|
+
// event immediately rather than holding it through the
|
|
121
|
+
// multi-second compaction LLM call.
|
|
122
|
+
if (event.type === "compaction_start") {
|
|
123
|
+
raw.write(COMPACTION_START_PADDING_LINE);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
close();
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
const client = { id, send, close };
|
|
131
|
+
registeredClient = client;
|
|
132
|
+
// Snapshot must be sent BEFORE adding to live.clients so events
|
|
133
|
+
// after the snapshot never arrive before it.
|
|
134
|
+
raw.write(serializeSSE(buildSnapshot(live)));
|
|
135
|
+
live.clients.add(client);
|
|
136
|
+
raw.on("close", close);
|
|
137
|
+
raw.on("error", close);
|
|
138
|
+
return client;
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
closed = true;
|
|
142
|
+
if (registeredClient !== undefined)
|
|
143
|
+
live.clients.delete(registeredClient);
|
|
144
|
+
try {
|
|
145
|
+
raw.destroy();
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// already destroyed
|
|
149
|
+
}
|
|
150
|
+
throw err;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=event-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-stream.js","sourceRoot":"","sources":["../src/event-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,6BAA6B,GAAG,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEvF;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAA6C;IACxE,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,aAAa;IACb,WAAW;IACX,YAAY;IACZ,UAAU;IACV,eAAe;IACf,gBAAgB;IAChB,aAAa;IACb,sBAAsB;IACtB,uBAAuB;IACvB,oBAAoB;IACpB,WAAW;IACX,aAAa;IACb,cAAc;IACd,kBAAkB;IAClB,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;IAChB,UAAU;IACV,mBAAmB;IACnB,6BAA6B;IAC7B,0DAA0D;IAC1D,YAAY;IACZ,aAAa;IACb,UAAU;IACV,6BAA6B;IAC7B,qBAAqB;IACrB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;IACrB,mBAAmB;CACpB,CAAC,CAAC;AAEH,SAAS,cAAc,CAAC,KAAuB;IAC7C,OAAO,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAiB;IAO7C,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;QAC/B,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;KACtC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAmB,EAAE,IAAiB;IACpE,KAAK,CAAC,MAAM,EAAE,CAAC;IACf,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IAEtB,IAAI,gBAAuC,CAAC;IAC5C,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,IAAI,CAAC;QACH,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;YACjB,cAAc,EAAE,mBAAmB;YACnC,eAAe,EAAE,wBAAwB;YACzC,UAAU,EAAE,YAAY;YACxB,mBAAmB,EAAE,IAAI;SAC1B,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAExB,MAAM,KAAK,GAAG,GAAS,EAAE;YACvB,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,gBAAgB,KAAK,SAAS;gBAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC1E,IAAI,CAAC;gBACH,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG,CAAC,KAAiE,EAAQ,EAAE;YACvF,IAAI,MAAM;gBAAE,OAAO;YACnB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;gBAAE,OAAO;YACnC,IAAI,CAAC;gBACH,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/B,4DAA4D;gBAC5D,6DAA6D;gBAC7D,uDAAuD;gBACvD,oCAAoC;gBACpC,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;oBACtC,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,MAAM,GAAc,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;QAC9C,gBAAgB,GAAG,MAAM,CAAC;QAE1B,gEAAgE;QAChE,6CAA6C;QAC7C,GAAG,CAAC,KAAK,CACP,YAAY,CACV,aAAa,CAAC,IAAI,CAAsD,CACzE,CACF,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEzB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACvB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,IAAI,CAAC;QACd,IAAI,gBAAgB,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC;YACH,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,oBAAoB;QACtB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|