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,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Settings Store — persists frontend preferences server-side.
|
|
3
|
+
*
|
|
4
|
+
* Like pi-web's server/settings.ts pattern: typed schema, atomic writes,
|
|
5
|
+
* cached reads, patch with validation.
|
|
6
|
+
*
|
|
7
|
+
* Settings survive browser cache clears and can be shared across devices.
|
|
8
|
+
*/
|
|
9
|
+
import { readFile, writeFile, rename, mkdir } from "node:fs/promises";
|
|
10
|
+
import { join, dirname } from "node:path";
|
|
11
|
+
import { config } from "./config.js";
|
|
12
|
+
// ── Defaults ──────────────────────────────────────────────────────────────
|
|
13
|
+
const DEFAULTS = {
|
|
14
|
+
version: 1,
|
|
15
|
+
theme: undefined,
|
|
16
|
+
stickyUserHeader: false,
|
|
17
|
+
showTokenUsage: false,
|
|
18
|
+
compressImages: true,
|
|
19
|
+
};
|
|
20
|
+
// ── Path ──────────────────────────────────────────────────────────────────
|
|
21
|
+
function uiSettingsPath() {
|
|
22
|
+
return join(config.piConfigDir, "ui-settings.json");
|
|
23
|
+
}
|
|
24
|
+
// ── Normalization ─────────────────────────────────────────────────────────
|
|
25
|
+
function normalize(value) {
|
|
26
|
+
const settings = structuredClone(DEFAULTS);
|
|
27
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
28
|
+
return settings;
|
|
29
|
+
const v = value;
|
|
30
|
+
if (typeof v.theme === "string")
|
|
31
|
+
settings.theme = v.theme;
|
|
32
|
+
if (typeof v.stickyUserHeader === "boolean")
|
|
33
|
+
settings.stickyUserHeader = v.stickyUserHeader;
|
|
34
|
+
if (typeof v.showTokenUsage === "boolean")
|
|
35
|
+
settings.showTokenUsage = v.showTokenUsage;
|
|
36
|
+
if (typeof v.compressImages === "boolean")
|
|
37
|
+
settings.compressImages = v.compressImages;
|
|
38
|
+
return settings;
|
|
39
|
+
}
|
|
40
|
+
// ── Store ─────────────────────────────────────────────────────────────────
|
|
41
|
+
let cached;
|
|
42
|
+
export function createUiSettingsStore() {
|
|
43
|
+
return { read, write, patch, reset };
|
|
44
|
+
}
|
|
45
|
+
async function ensureDir() {
|
|
46
|
+
await mkdir(dirname(uiSettingsPath()), { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
async function read() {
|
|
49
|
+
if (cached)
|
|
50
|
+
return structuredClone(cached);
|
|
51
|
+
try {
|
|
52
|
+
const raw = await readFile(uiSettingsPath(), "utf-8");
|
|
53
|
+
cached = normalize(JSON.parse(raw));
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
if (err.code !== "ENOENT") {
|
|
57
|
+
console.warn(`ui-settings: could not read — ${err.message}`);
|
|
58
|
+
}
|
|
59
|
+
cached = structuredClone(DEFAULTS);
|
|
60
|
+
}
|
|
61
|
+
return structuredClone(cached);
|
|
62
|
+
}
|
|
63
|
+
async function write(settings) {
|
|
64
|
+
cached = normalize(settings);
|
|
65
|
+
await ensureDir();
|
|
66
|
+
const file = uiSettingsPath();
|
|
67
|
+
const tmp = `${file}.${process.pid}.${Date.now()}.tmp`;
|
|
68
|
+
await writeFile(tmp, `${JSON.stringify(cached, null, 2)}\n`, "utf-8");
|
|
69
|
+
await rename(tmp, file);
|
|
70
|
+
return structuredClone(cached);
|
|
71
|
+
}
|
|
72
|
+
async function patch(patch) {
|
|
73
|
+
const current = await read();
|
|
74
|
+
const merged = {
|
|
75
|
+
...current,
|
|
76
|
+
...Object.fromEntries(Object.entries(patch).filter(([_, v]) => v !== undefined)),
|
|
77
|
+
};
|
|
78
|
+
return write(merged);
|
|
79
|
+
}
|
|
80
|
+
async function reset() {
|
|
81
|
+
cached = structuredClone(DEFAULTS);
|
|
82
|
+
await ensureDir();
|
|
83
|
+
const file = uiSettingsPath();
|
|
84
|
+
const tmp = `${file}.${process.pid}.${Date.now()}.tmp`;
|
|
85
|
+
await writeFile(tmp, `${JSON.stringify(DEFAULTS, null, 2)}\n`, "utf-8");
|
|
86
|
+
await rename(tmp, file);
|
|
87
|
+
return structuredClone(DEFAULTS);
|
|
88
|
+
}
|
|
89
|
+
// ── Singleton ─────────────────────────────────────────────────────────────
|
|
90
|
+
export const uiSettings = { read, write, patch, reset };
|
|
91
|
+
//# sourceMappingURL=ui-settings-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-settings-store.js","sourceRoot":"","sources":["../src/ui-settings-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface Project {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
path: string;
|
|
5
|
+
createdAt: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class ProjectNotFoundError extends Error {
|
|
8
|
+
constructor(id: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class InvalidNameError extends Error {
|
|
11
|
+
constructor(msg?: string);
|
|
12
|
+
}
|
|
13
|
+
export declare class DuplicatePathError extends Error {
|
|
14
|
+
constructor(path: string);
|
|
15
|
+
}
|
|
16
|
+
export declare function readProjects(): Promise<Project[]>;
|
|
17
|
+
export declare function listProjects(): Promise<Project[]>;
|
|
18
|
+
export declare function getProject(id: string): Promise<Project | undefined>;
|
|
19
|
+
export declare function createProject(name: string, path: string): Promise<Project>;
|
|
20
|
+
export declare function updateProject(id: string, updates: {
|
|
21
|
+
name?: string;
|
|
22
|
+
path?: string;
|
|
23
|
+
}): Promise<Project>;
|
|
24
|
+
export declare function deleteProject(id: string): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=workspace-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-store.d.ts","sourceRoot":"","sources":["../src/workspace-store.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,EAAE,EAAE,MAAM,EAGrB;CACF;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,YAAY,GAAG,SAAyB,EAGvC;CACF;AAED,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,IAAI,EAAE,MAAM,EAGvB;CACF;AA2BD,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAUvD;AAeD,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAIvD;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAGzE;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CA6ClB;AAED,wBAAsB,aAAa,CACjC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,OAAO,CAAC,CA0BlB;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7D"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { readFile, rename, unlink, writeFile, mkdir, stat } from "node:fs/promises";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { config } from "./config.js";
|
|
6
|
+
export class ProjectNotFoundError extends Error {
|
|
7
|
+
constructor(id) {
|
|
8
|
+
super(`project not found: ${id}`);
|
|
9
|
+
this.name = "ProjectNotFoundError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class InvalidNameError extends Error {
|
|
13
|
+
constructor(msg = "invalid project name") {
|
|
14
|
+
super(msg);
|
|
15
|
+
this.name = "InvalidNameError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class DuplicatePathError extends Error {
|
|
19
|
+
constructor(path) {
|
|
20
|
+
super(`a project already points at: ${path}`);
|
|
21
|
+
this.name = "DuplicatePathError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const PROJECTS_FILE = () => join(config.forgeDataDir, "projects.json");
|
|
25
|
+
async function ensureDir(dir) {
|
|
26
|
+
await mkdir(dir, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
// Simple per-process lock for read-modify-write on projects.json
|
|
29
|
+
let projectsLock = Promise.resolve();
|
|
30
|
+
function withProjectsLock(fn) {
|
|
31
|
+
const next = projectsLock.then(fn, fn);
|
|
32
|
+
projectsLock = next.catch(() => undefined);
|
|
33
|
+
return next;
|
|
34
|
+
}
|
|
35
|
+
function isProject(v) {
|
|
36
|
+
if (typeof v !== "object" || v === null)
|
|
37
|
+
return false;
|
|
38
|
+
const r = v;
|
|
39
|
+
return (typeof r.id === "string" &&
|
|
40
|
+
typeof r.name === "string" &&
|
|
41
|
+
typeof r.path === "string" &&
|
|
42
|
+
typeof r.createdAt === "string");
|
|
43
|
+
}
|
|
44
|
+
export async function readProjects() {
|
|
45
|
+
try {
|
|
46
|
+
const raw = await readFile(PROJECTS_FILE(), "utf8");
|
|
47
|
+
const parsed = JSON.parse(raw);
|
|
48
|
+
if (!Array.isArray(parsed))
|
|
49
|
+
return [];
|
|
50
|
+
return parsed.filter(isProject);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (err.code === "ENOENT")
|
|
54
|
+
return [];
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function writeProjects(projects) {
|
|
59
|
+
await ensureDir(config.forgeDataDir);
|
|
60
|
+
const target = PROJECTS_FILE();
|
|
61
|
+
const tmp = `${target}.${randomUUID()}.tmp`;
|
|
62
|
+
await writeFile(tmp, JSON.stringify(projects, null, 2), "utf8");
|
|
63
|
+
try {
|
|
64
|
+
await rename(tmp, target);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
await unlink(tmp).catch(() => undefined);
|
|
68
|
+
throw err;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
export async function listProjects() {
|
|
72
|
+
return withProjectsLock(async () => {
|
|
73
|
+
return readProjects();
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
export async function getProject(id) {
|
|
77
|
+
const projects = await readProjects();
|
|
78
|
+
return projects.find((p) => p.id === id);
|
|
79
|
+
}
|
|
80
|
+
export async function createProject(name, path) {
|
|
81
|
+
const trimmed = name.trim();
|
|
82
|
+
if (trimmed.length === 0)
|
|
83
|
+
throw new InvalidNameError("project name cannot be empty");
|
|
84
|
+
// Expand ~/ to home directory
|
|
85
|
+
const expanded = path.startsWith("~/") ? join(homedir(), path.slice(2)) : path;
|
|
86
|
+
const resolvedPath = resolve(expanded);
|
|
87
|
+
return withProjectsLock(async () => {
|
|
88
|
+
const projects = await readProjects();
|
|
89
|
+
// Check duplicate path
|
|
90
|
+
for (const p of projects) {
|
|
91
|
+
if (resolve(p.path) === resolvedPath) {
|
|
92
|
+
throw new DuplicatePathError(resolvedPath);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// Verify path exists and is a directory (warn if not, but still allow)
|
|
96
|
+
try {
|
|
97
|
+
const st = await stat(resolvedPath);
|
|
98
|
+
if (!st.isDirectory()) {
|
|
99
|
+
throw new InvalidNameError(`Path exists but is not a directory: ${resolvedPath}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
if (err.code === "ENOENT") {
|
|
104
|
+
throw new InvalidNameError(`Directory does not exist: ${resolvedPath}. Create it first or choose an existing folder.`);
|
|
105
|
+
}
|
|
106
|
+
if (err instanceof InvalidNameError)
|
|
107
|
+
throw err;
|
|
108
|
+
throw err;
|
|
109
|
+
}
|
|
110
|
+
const project = {
|
|
111
|
+
id: randomUUID(),
|
|
112
|
+
name: trimmed,
|
|
113
|
+
path: resolvedPath,
|
|
114
|
+
createdAt: new Date().toISOString(),
|
|
115
|
+
};
|
|
116
|
+
projects.push(project);
|
|
117
|
+
await writeProjects(projects);
|
|
118
|
+
return project;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
export async function updateProject(id, updates) {
|
|
122
|
+
return withProjectsLock(async () => {
|
|
123
|
+
const projects = await readProjects();
|
|
124
|
+
const idx = projects.findIndex((p) => p.id === id);
|
|
125
|
+
if (idx === -1)
|
|
126
|
+
throw new ProjectNotFoundError(id);
|
|
127
|
+
if (updates.name !== undefined) {
|
|
128
|
+
const trimmed = updates.name.trim();
|
|
129
|
+
if (trimmed.length === 0)
|
|
130
|
+
throw new InvalidNameError();
|
|
131
|
+
projects[idx].name = trimmed;
|
|
132
|
+
}
|
|
133
|
+
if (updates.path !== undefined) {
|
|
134
|
+
const resolvedPath = resolve(updates.path);
|
|
135
|
+
// Check duplicate
|
|
136
|
+
for (let i = 0; i < projects.length; i++) {
|
|
137
|
+
if (i !== idx && resolve(projects[i].path) === resolvedPath) {
|
|
138
|
+
throw new DuplicatePathError(resolvedPath);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
projects[idx].path = resolvedPath;
|
|
142
|
+
}
|
|
143
|
+
await writeProjects(projects);
|
|
144
|
+
return projects[idx];
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
export async function deleteProject(id) {
|
|
148
|
+
return withProjectsLock(async () => {
|
|
149
|
+
const projects = await readProjects();
|
|
150
|
+
const idx = projects.findIndex((p) => p.id === id);
|
|
151
|
+
if (idx === -1)
|
|
152
|
+
throw new ProjectNotFoundError(id);
|
|
153
|
+
projects.splice(idx, 1);
|
|
154
|
+
await writeProjects(projects);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=workspace-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-store.js","sourceRoot":"","sources":["../src/workspace-store.ts"],"names":[],"mappings":"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"}
|