p-spore 0.1.4 → 0.1.43
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/LICENSE +21 -0
- package/README.md +242 -67
- package/dist/agents/agent-manager.d.ts +3 -3
- package/dist/agents/agent-manager.d.ts.map +1 -1
- package/dist/agents/agent-manager.js +3 -2
- package/dist/agents/agent-manager.js.map +1 -1
- package/dist/application/agent-application.d.ts +29 -5
- package/dist/application/agent-application.d.ts.map +1 -1
- package/dist/application/agent-application.js +444 -14
- package/dist/application/agent-application.js.map +1 -1
- package/dist/articles/diff.d.ts +70 -0
- package/dist/articles/diff.d.ts.map +1 -0
- package/dist/articles/diff.js +330 -0
- package/dist/articles/diff.js.map +1 -0
- package/dist/articles/docx.d.ts +10 -0
- package/dist/articles/docx.d.ts.map +1 -0
- package/dist/articles/docx.js +219 -0
- package/dist/articles/docx.js.map +1 -0
- package/dist/articles/draft.d.ts +18 -0
- package/dist/articles/draft.d.ts.map +1 -0
- package/dist/articles/draft.js +88 -0
- package/dist/articles/draft.js.map +1 -0
- package/dist/articles/edits.d.ts +24 -0
- package/dist/articles/edits.d.ts.map +1 -0
- package/dist/articles/edits.js +54 -0
- package/dist/articles/edits.js.map +1 -0
- package/dist/articles/html.d.ts +10 -0
- package/dist/articles/html.d.ts.map +1 -0
- package/dist/articles/html.js +122 -0
- package/dist/articles/html.js.map +1 -0
- package/dist/articles/plain.d.ts +8 -0
- package/dist/articles/plain.d.ts.map +1 -0
- package/dist/articles/plain.js +69 -0
- package/dist/articles/plain.js.map +1 -0
- package/dist/articles/preview.d.ts +43 -0
- package/dist/articles/preview.d.ts.map +1 -0
- package/dist/articles/preview.js +90 -0
- package/dist/articles/preview.js.map +1 -0
- package/dist/articles/publish.d.ts +10 -0
- package/dist/articles/publish.d.ts.map +1 -0
- package/dist/articles/publish.js +54 -0
- package/dist/articles/publish.js.map +1 -0
- package/dist/articles/receipt.d.ts +16 -0
- package/dist/articles/receipt.d.ts.map +1 -0
- package/dist/articles/receipt.js +27 -0
- package/dist/articles/receipt.js.map +1 -0
- package/dist/articles/store.d.ts +78 -0
- package/dist/articles/store.d.ts.map +1 -0
- package/dist/articles/store.js +308 -0
- package/dist/articles/store.js.map +1 -0
- package/dist/articles/tool.d.ts +14 -0
- package/dist/articles/tool.d.ts.map +1 -0
- package/dist/articles/tool.js +175 -0
- package/dist/articles/tool.js.map +1 -0
- package/dist/articles/writer-context.d.ts +5 -0
- package/dist/articles/writer-context.d.ts.map +1 -0
- package/dist/articles/writer-context.js +56 -0
- package/dist/articles/writer-context.js.map +1 -0
- package/dist/articles/writer.d.ts +18 -0
- package/dist/articles/writer.d.ts.map +1 -0
- package/dist/articles/writer.js +79 -0
- package/dist/articles/writer.js.map +1 -0
- package/dist/articles/zip-write.d.ts +11 -0
- package/dist/articles/zip-write.d.ts.map +1 -0
- package/dist/articles/zip-write.js +63 -0
- package/dist/articles/zip-write.js.map +1 -0
- package/dist/bundled-skills/README.md +17 -0
- package/dist/bundled-skills/aegis-search/SKILL.md +59 -0
- package/dist/bundled-skills/aegis-search/bin/.gitkeep +0 -0
- package/dist/bundled-skills/article-canvas/SKILL.md +28 -0
- package/dist/bundled-skills/binaries.json +23 -0
- package/dist/bundled-skills/doc-extract/SKILL.md +56 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +407 -54
- package/dist/cli/main.js.map +1 -1
- package/dist/config/config.d.ts +43 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +150 -6
- package/dist/config/config.js.map +1 -1
- package/dist/daemon/daemon.d.ts.map +1 -1
- package/dist/daemon/daemon.js +80 -11
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/desktop/application.d.ts +4 -0
- package/dist/desktop/application.d.ts.map +1 -0
- package/dist/desktop/application.js +1688 -0
- package/dist/desktop/application.js.map +1 -0
- package/dist/desktop/article-export.d.ts +12 -0
- package/dist/desktop/article-export.d.ts.map +1 -0
- package/dist/desktop/article-export.js +87 -0
- package/dist/desktop/article-export.js.map +1 -0
- package/dist/desktop/assets/pspore.png +0 -0
- package/dist/desktop/assets/pspore.svg +24 -0
- package/dist/desktop/conversation-smoke.d.ts +5 -0
- package/dist/desktop/conversation-smoke.d.ts.map +1 -0
- package/dist/desktop/conversation-smoke.js +107 -0
- package/dist/desktop/conversation-smoke.js.map +1 -0
- package/dist/desktop/daemon-bridge.d.ts.map +1 -1
- package/dist/desktop/daemon-bridge.js +62 -17
- package/dist/desktop/daemon-bridge.js.map +1 -1
- package/dist/desktop/ipc-contract.d.ts +124 -0
- package/dist/desktop/ipc-contract.d.ts.map +1 -1
- package/dist/desktop/ipc-contract.js +191 -12
- package/dist/desktop/ipc-contract.js.map +1 -1
- package/dist/desktop/local-path.d.ts +15 -0
- package/dist/desktop/local-path.d.ts.map +1 -0
- package/dist/desktop/local-path.js +59 -0
- package/dist/desktop/local-path.js.map +1 -0
- package/dist/desktop/main.d.ts +10 -1
- package/dist/desktop/main.d.ts.map +1 -1
- package/dist/desktop/main.js +122 -530
- package/dist/desktop/main.js.map +1 -1
- package/dist/desktop/native-startup.d.ts +4 -0
- package/dist/desktop/native-startup.d.ts.map +1 -0
- package/dist/desktop/native-startup.js +57 -0
- package/dist/desktop/native-startup.js.map +1 -0
- package/dist/desktop/preload.cjs +28 -1
- package/dist/desktop/renderer/article-panel.d.ts +45 -0
- package/dist/desktop/renderer/article-panel.d.ts.map +1 -0
- package/dist/desktop/renderer/article-panel.js +1126 -0
- package/dist/desktop/renderer/article-panel.js.map +1 -0
- package/dist/desktop/renderer/article-split.d.ts +32 -0
- package/dist/desktop/renderer/article-split.d.ts.map +1 -0
- package/dist/desktop/renderer/article-split.js +48 -0
- package/dist/desktop/renderer/article-split.js.map +1 -0
- package/dist/desktop/renderer/composer-file-references.d.ts +23 -0
- package/dist/desktop/renderer/composer-file-references.d.ts.map +1 -0
- package/dist/desktop/renderer/composer-file-references.js +51 -0
- package/dist/desktop/renderer/composer-file-references.js.map +1 -0
- package/dist/desktop/renderer/conversation.d.ts +23 -0
- package/dist/desktop/renderer/conversation.d.ts.map +1 -0
- package/dist/desktop/renderer/conversation.js +66 -0
- package/dist/desktop/renderer/conversation.js.map +1 -0
- package/dist/desktop/renderer/dom-reconcile.d.ts +15 -0
- package/dist/desktop/renderer/dom-reconcile.d.ts.map +1 -0
- package/dist/desktop/renderer/dom-reconcile.js +33 -0
- package/dist/desktop/renderer/dom-reconcile.js.map +1 -0
- package/dist/desktop/renderer/index.html +211 -34
- package/dist/desktop/renderer/indexing-view.d.ts +22 -0
- package/dist/desktop/renderer/indexing-view.d.ts.map +1 -0
- package/dist/desktop/renderer/indexing-view.js +115 -0
- package/dist/desktop/renderer/indexing-view.js.map +1 -0
- package/dist/desktop/renderer/markdown-view.d.ts +23 -0
- package/dist/desktop/renderer/markdown-view.d.ts.map +1 -0
- package/dist/desktop/renderer/markdown-view.js +436 -0
- package/dist/desktop/renderer/markdown-view.js.map +1 -0
- package/dist/desktop/renderer/motion.d.ts +67 -0
- package/dist/desktop/renderer/motion.d.ts.map +1 -0
- package/dist/desktop/renderer/motion.js +296 -0
- package/dist/desktop/renderer/motion.js.map +1 -0
- package/dist/desktop/renderer/renderer.js +1799 -152
- package/dist/desktop/renderer/renderer.js.map +1 -1
- package/dist/desktop/renderer/session-find.d.ts +18 -0
- package/dist/desktop/renderer/session-find.d.ts.map +1 -0
- package/dist/desktop/renderer/session-find.js +29 -0
- package/dist/desktop/renderer/session-find.js.map +1 -0
- package/dist/desktop/renderer/session-search.d.ts +30 -0
- package/dist/desktop/renderer/session-search.d.ts.map +1 -0
- package/dist/desktop/renderer/session-search.js +296 -0
- package/dist/desktop/renderer/session-search.js.map +1 -0
- package/dist/desktop/renderer/store.d.ts +33 -0
- package/dist/desktop/renderer/store.d.ts.map +1 -1
- package/dist/desktop/renderer/store.js +92 -19
- package/dist/desktop/renderer/store.js.map +1 -1
- package/dist/desktop/renderer/styles.css +928 -268
- package/dist/desktop/renderer/vendor/gsap.min.js +11 -0
- package/dist/desktop/renderer-diagnostics.d.ts +5 -0
- package/dist/desktop/renderer-diagnostics.d.ts.map +1 -0
- package/dist/desktop/renderer-diagnostics.js +47 -0
- package/dist/desktop/renderer-diagnostics.js.map +1 -0
- package/dist/desktop/security.d.ts +26 -1
- package/dist/desktop/security.d.ts.map +1 -1
- package/dist/desktop/security.js +26 -6
- package/dist/desktop/security.js.map +1 -1
- package/dist/desktop/smoke-fixture.d.ts.map +1 -1
- package/dist/desktop/smoke-fixture.js +77 -3
- package/dist/desktop/smoke-fixture.js.map +1 -1
- package/dist/desktop/splash/index.html +25 -0
- package/dist/desktop/splash/splash.d.ts +2 -0
- package/dist/desktop/splash/splash.d.ts.map +1 -0
- package/dist/desktop/splash/splash.js +8 -0
- package/dist/desktop/splash/splash.js.map +1 -0
- package/dist/desktop/splash/styles.css +24 -0
- package/dist/desktop/system-open.d.ts +16 -0
- package/dist/desktop/system-open.d.ts.map +1 -0
- package/dist/desktop/system-open.js +90 -0
- package/dist/desktop/system-open.js.map +1 -0
- package/dist/desktop/validation.d.ts.map +1 -1
- package/dist/desktop/validation.js +99 -21
- package/dist/desktop/validation.js.map +1 -1
- package/dist/desktop/window-security.d.ts +4 -0
- package/dist/desktop/window-security.d.ts.map +1 -0
- package/dist/desktop/window-security.js +26 -0
- package/dist/desktop/window-security.js.map +1 -0
- package/dist/documents/errors.d.ts +12 -0
- package/dist/documents/errors.d.ts.map +1 -0
- package/dist/documents/errors.js +12 -0
- package/dist/documents/errors.js.map +1 -0
- package/dist/documents/extract.d.ts +37 -0
- package/dist/documents/extract.d.ts.map +1 -0
- package/dist/documents/extract.js +90 -0
- package/dist/documents/extract.js.map +1 -0
- package/dist/documents/legacy-office.d.ts +23 -0
- package/dist/documents/legacy-office.d.ts.map +1 -0
- package/dist/documents/legacy-office.js +439 -0
- package/dist/documents/legacy-office.js.map +1 -0
- package/dist/documents/ole.d.ts +20 -0
- package/dist/documents/ole.d.ts.map +1 -0
- package/dist/documents/ole.js +189 -0
- package/dist/documents/ole.js.map +1 -0
- package/dist/documents/ooxml.d.ts +23 -0
- package/dist/documents/ooxml.d.ts.map +1 -0
- package/dist/documents/ooxml.js +197 -0
- package/dist/documents/ooxml.js.map +1 -0
- package/dist/documents/pdf.d.ts +20 -0
- package/dist/documents/pdf.d.ts.map +1 -0
- package/dist/documents/pdf.js +95 -0
- package/dist/documents/pdf.js.map +1 -0
- package/dist/documents/plain-text.d.ts +22 -0
- package/dist/documents/plain-text.d.ts.map +1 -0
- package/dist/documents/plain-text.js +57 -0
- package/dist/documents/plain-text.js.map +1 -0
- package/dist/documents/zip.d.ts +15 -0
- package/dist/documents/zip.d.ts.map +1 -0
- package/dist/documents/zip.js +137 -0
- package/dist/documents/zip.js.map +1 -0
- package/dist/domain/indexing.d.ts +60 -0
- package/dist/domain/indexing.d.ts.map +1 -0
- package/dist/domain/indexing.js +13 -0
- package/dist/domain/indexing.js.map +1 -0
- package/dist/domain/runtime.d.ts +133 -5
- package/dist/domain/runtime.d.ts.map +1 -1
- package/dist/gateway/local-gateway.d.ts +8 -0
- package/dist/gateway/local-gateway.d.ts.map +1 -1
- package/dist/gateway/local-gateway.js +105 -21
- package/dist/gateway/local-gateway.js.map +1 -1
- package/dist/indexing/index-service.d.ts +56 -0
- package/dist/indexing/index-service.d.ts.map +1 -0
- package/dist/indexing/index-service.js +262 -0
- package/dist/indexing/index-service.js.map +1 -0
- package/dist/kernel/loop.d.ts +10 -0
- package/dist/kernel/loop.d.ts.map +1 -1
- package/dist/kernel/loop.js +6 -2
- package/dist/kernel/loop.js.map +1 -1
- package/dist/kernel/reducer.d.ts.map +1 -1
- package/dist/kernel/reducer.js +17 -1
- package/dist/kernel/reducer.js.map +1 -1
- package/dist/kernel/state.d.ts +17 -4
- package/dist/kernel/state.d.ts.map +1 -1
- package/dist/kernel/state.js +2 -0
- package/dist/kernel/state.js.map +1 -1
- package/dist/pi/context-budget.d.ts +8 -0
- package/dist/pi/context-budget.d.ts.map +1 -0
- package/dist/pi/context-budget.js +62 -0
- package/dist/pi/context-budget.js.map +1 -0
- package/dist/pi/pi-runtime-adapter.d.ts +38 -3
- package/dist/pi/pi-runtime-adapter.d.ts.map +1 -1
- package/dist/pi/pi-runtime-adapter.js +551 -56
- package/dist/pi/pi-runtime-adapter.js.map +1 -1
- package/dist/plugins/bundled-skills.d.ts +56 -0
- package/dist/plugins/bundled-skills.d.ts.map +1 -0
- package/dist/plugins/bundled-skills.js +243 -0
- package/dist/plugins/bundled-skills.js.map +1 -0
- package/dist/plugins/extension-manager.d.ts +23 -1
- package/dist/plugins/extension-manager.d.ts.map +1 -1
- package/dist/plugins/extension-manager.js +117 -0
- package/dist/plugins/extension-manager.js.map +1 -1
- package/dist/plugins/types.d.ts +29 -0
- package/dist/plugins/types.d.ts.map +1 -1
- package/dist/plugins/workspace-skills.d.ts +36 -0
- package/dist/plugins/workspace-skills.d.ts.map +1 -0
- package/dist/plugins/workspace-skills.js +309 -0
- package/dist/plugins/workspace-skills.js.map +1 -0
- package/dist/policy/policy.d.ts.map +1 -1
- package/dist/policy/policy.js +22 -3
- package/dist/policy/policy.js.map +1 -1
- package/dist/protocol/client.d.ts +1 -0
- package/dist/protocol/client.d.ts.map +1 -1
- package/dist/protocol/client.js +49 -24
- package/dist/protocol/client.js.map +1 -1
- package/dist/protocol/limits.d.ts +69 -0
- package/dist/protocol/limits.d.ts.map +1 -0
- package/dist/protocol/limits.js +166 -0
- package/dist/protocol/limits.js.map +1 -0
- package/dist/protocol/schema.d.ts +6 -0
- package/dist/protocol/schema.d.ts.map +1 -1
- package/dist/protocol/schema.js.map +1 -1
- package/dist/protocol/server-frame-codec.d.ts +18 -0
- package/dist/protocol/server-frame-codec.d.ts.map +1 -0
- package/dist/protocol/server-frame-codec.js +211 -0
- package/dist/protocol/server-frame-codec.js.map +1 -0
- package/dist/service/legacy-daemon.d.ts +6 -0
- package/dist/service/legacy-daemon.d.ts.map +1 -0
- package/dist/service/legacy-daemon.js +42 -0
- package/dist/service/legacy-daemon.js.map +1 -0
- package/dist/service/service-launch.d.ts +10 -0
- package/dist/service/service-launch.d.ts.map +1 -0
- package/dist/service/service-launch.js +56 -0
- package/dist/service/service-launch.js.map +1 -0
- package/dist/service/system-service.d.ts +57 -0
- package/dist/service/system-service.d.ts.map +1 -0
- package/dist/service/system-service.js +263 -0
- package/dist/service/system-service.js.map +1 -0
- package/dist/sessions/session-catalog.d.ts +45 -0
- package/dist/sessions/session-catalog.d.ts.map +1 -0
- package/dist/sessions/session-catalog.js +270 -0
- package/dist/sessions/session-catalog.js.map +1 -0
- package/dist/sessions/session-file.d.ts +12 -0
- package/dist/sessions/session-file.d.ts.map +1 -0
- package/dist/sessions/session-file.js +47 -0
- package/dist/sessions/session-file.js.map +1 -0
- package/dist/settings/compaction-settings.d.ts +10 -0
- package/dist/settings/compaction-settings.d.ts.map +1 -0
- package/dist/settings/compaction-settings.js +8 -0
- package/dist/settings/compaction-settings.js.map +1 -0
- package/dist/settings/indexing-settings-service.d.ts +16 -0
- package/dist/settings/indexing-settings-service.d.ts.map +1 -0
- package/dist/settings/indexing-settings-service.js +57 -0
- package/dist/settings/indexing-settings-service.js.map +1 -0
- package/dist/settings/indexing-settings.d.ts +30 -0
- package/dist/settings/indexing-settings.d.ts.map +1 -0
- package/dist/settings/indexing-settings.js +58 -0
- package/dist/settings/indexing-settings.js.map +1 -0
- package/dist/settings/llm-settings-service.d.ts +6 -0
- package/dist/settings/llm-settings-service.d.ts.map +1 -1
- package/dist/settings/llm-settings-service.js +137 -12
- package/dist/settings/llm-settings-service.js.map +1 -1
- package/dist/settings/llm-settings.d.ts +68 -2
- package/dist/settings/llm-settings.d.ts.map +1 -1
- package/dist/settings/llm-settings.js +119 -17
- package/dist/settings/llm-settings.js.map +1 -1
- package/dist/settings/model-api.d.ts +10 -0
- package/dist/settings/model-api.d.ts.map +1 -0
- package/dist/settings/model-api.js +10 -0
- package/dist/settings/model-api.js.map +1 -0
- package/dist/storage/home.d.ts +1 -0
- package/dist/storage/home.d.ts.map +1 -1
- package/dist/storage/home.js +37 -2
- package/dist/storage/home.js.map +1 -1
- package/dist/tools/core-tools.d.ts +2 -0
- package/dist/tools/core-tools.d.ts.map +1 -1
- package/dist/tools/core-tools.js +91 -1
- package/dist/tools/core-tools.js.map +1 -1
- package/dist/ui/shared/activity.d.ts +2 -0
- package/dist/ui/shared/activity.d.ts.map +1 -1
- package/dist/ui/shared/activity.js +18 -4
- package/dist/ui/shared/activity.js.map +1 -1
- package/dist/ui/shared/full-message.d.ts +22 -0
- package/dist/ui/shared/full-message.d.ts.map +1 -0
- package/dist/ui/shared/full-message.js +40 -0
- package/dist/ui/shared/full-message.js.map +1 -0
- package/dist/ui/shared/local-links.d.ts +7 -0
- package/dist/ui/shared/local-links.d.ts.map +1 -0
- package/dist/ui/shared/local-links.js +24 -0
- package/dist/ui/shared/local-links.js.map +1 -0
- package/dist/ui/shared/markdown-stream.d.ts +25 -0
- package/dist/ui/shared/markdown-stream.d.ts.map +1 -0
- package/dist/ui/shared/markdown-stream.js +35 -0
- package/dist/ui/shared/markdown-stream.js.map +1 -0
- package/dist/ui/shared/markdown.d.ts +70 -0
- package/dist/ui/shared/markdown.d.ts.map +1 -0
- package/dist/ui/shared/markdown.js +434 -0
- package/dist/ui/shared/markdown.js.map +1 -0
- package/dist/ui/shared/presentation.d.ts +10 -2
- package/dist/ui/shared/presentation.d.ts.map +1 -1
- package/dist/ui/shared/presentation.js +83 -22
- package/dist/ui/shared/presentation.js.map +1 -1
- package/dist/ui/shared/protocol-state.d.ts +19 -0
- package/dist/ui/shared/protocol-state.d.ts.map +1 -1
- package/dist/ui/shared/protocol-state.js +188 -26
- package/dist/ui/shared/protocol-state.js.map +1 -1
- package/dist/ui/shared/virtual-list.d.ts +34 -0
- package/dist/ui/shared/virtual-list.d.ts.map +1 -0
- package/dist/ui/shared/virtual-list.js +143 -0
- package/dist/ui/shared/virtual-list.js.map +1 -0
- package/dist/ui/tui/commands.d.ts +1 -1
- package/dist/ui/tui/commands.d.ts.map +1 -1
- package/dist/ui/tui/commands.js +8 -3
- package/dist/ui/tui/commands.js.map +1 -1
- package/dist/ui/tui/store.d.ts +22 -1
- package/dist/ui/tui/store.d.ts.map +1 -1
- package/dist/ui/tui/store.js +50 -3
- package/dist/ui/tui/store.js.map +1 -1
- package/dist/ui/tui/tui-app.d.ts.map +1 -1
- package/dist/ui/tui/tui-app.js +231 -31
- package/dist/ui/tui/tui-app.js.map +1 -1
- package/dist/ui/tui/view.d.ts +7 -0
- package/dist/ui/tui/view.d.ts.map +1 -1
- package/dist/ui/tui/view.js +161 -57
- package/dist/ui/tui/view.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +13 -2
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { readFile, readdir, realpath, rm, stat } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { atomicWriteJson } from "../storage/atomic.js";
|
|
4
|
+
import { resolveSessionFile } from "./session-file.js";
|
|
5
|
+
export class SessionCatalog {
|
|
6
|
+
#path;
|
|
7
|
+
#sessionsRoot;
|
|
8
|
+
#workspaceId;
|
|
9
|
+
#cwd;
|
|
10
|
+
#clock;
|
|
11
|
+
#records = new Map();
|
|
12
|
+
#tail = Promise.resolve();
|
|
13
|
+
constructor(options, sessionsRoot, cwd) {
|
|
14
|
+
this.#path = options.path;
|
|
15
|
+
this.#sessionsRoot = sessionsRoot;
|
|
16
|
+
this.#workspaceId = options.workspaceId;
|
|
17
|
+
this.#cwd = cwd;
|
|
18
|
+
this.#clock = options.clock ?? (() => new Date());
|
|
19
|
+
}
|
|
20
|
+
static async open(options) {
|
|
21
|
+
const catalog = new SessionCatalog(options, await realpath(options.sessionsRoot), await realpath(options.cwd));
|
|
22
|
+
await catalog.#initialize();
|
|
23
|
+
return catalog;
|
|
24
|
+
}
|
|
25
|
+
list() {
|
|
26
|
+
return [...this.#records.values()]
|
|
27
|
+
.sort((left, right) => left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id))
|
|
28
|
+
.map((record) => structuredClone(record));
|
|
29
|
+
}
|
|
30
|
+
get(id) {
|
|
31
|
+
const record = this.#records.get(id);
|
|
32
|
+
return record ? structuredClone(record) : undefined;
|
|
33
|
+
}
|
|
34
|
+
async idle() {
|
|
35
|
+
await this.#tail;
|
|
36
|
+
}
|
|
37
|
+
async add(input) {
|
|
38
|
+
const id = sessionId(input.id, "session.id");
|
|
39
|
+
const sessionFile = await this.#sessionFile(input.sessionFile);
|
|
40
|
+
const cwd = await realpath(input.cwd);
|
|
41
|
+
const now = this.#clock().toISOString();
|
|
42
|
+
const suppliedTitle = input.title?.trim();
|
|
43
|
+
const record = {
|
|
44
|
+
id,
|
|
45
|
+
sessionFile,
|
|
46
|
+
cwd,
|
|
47
|
+
title: suppliedTitle ? boundedTitle(suppliedTitle) : defaultTitle(id),
|
|
48
|
+
titleSource: suppliedTitle ? "user" : "default",
|
|
49
|
+
createdAt: now,
|
|
50
|
+
updatedAt: now,
|
|
51
|
+
};
|
|
52
|
+
await this.#mutate((next) => {
|
|
53
|
+
if (next.has(id))
|
|
54
|
+
throw new Error(`Root session already exists: ${id}`);
|
|
55
|
+
next.set(id, record);
|
|
56
|
+
});
|
|
57
|
+
return structuredClone(record);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Forgets a root session and deletes the transcript it owns.
|
|
61
|
+
*
|
|
62
|
+
* The stored path is re-resolved against the sessions root before anything is
|
|
63
|
+
* unlinked, so a catalog entry that points outside the root loses its record
|
|
64
|
+
* without the filesystem being touched. Deleting is the point of the command,
|
|
65
|
+
* so a transcript that is already gone is not an error.
|
|
66
|
+
*/
|
|
67
|
+
async remove(id) {
|
|
68
|
+
const existing = this.#records.get(id);
|
|
69
|
+
if (!existing)
|
|
70
|
+
return undefined;
|
|
71
|
+
const record = structuredClone(existing);
|
|
72
|
+
await this.#mutate((records) => {
|
|
73
|
+
records.delete(id);
|
|
74
|
+
});
|
|
75
|
+
let transcriptRemoved = false;
|
|
76
|
+
try {
|
|
77
|
+
const path = await this.#sessionFile(record.sessionFile);
|
|
78
|
+
await rm(path, { force: true });
|
|
79
|
+
transcriptRemoved = true;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// The record is gone either way; an unreachable or out-of-root transcript
|
|
83
|
+
// is left on disk rather than resolved through an unchecked path.
|
|
84
|
+
}
|
|
85
|
+
return { record, transcriptRemoved };
|
|
86
|
+
}
|
|
87
|
+
async touch(id, options = {}) {
|
|
88
|
+
const existing = this.#records.get(id);
|
|
89
|
+
if (!existing)
|
|
90
|
+
return undefined;
|
|
91
|
+
const nextSessionFile = options.sessionFile === undefined ? undefined : await this.#sessionFile(options.sessionFile);
|
|
92
|
+
let updated;
|
|
93
|
+
await this.#mutate((records) => {
|
|
94
|
+
const current = records.get(id);
|
|
95
|
+
if (!current)
|
|
96
|
+
return;
|
|
97
|
+
const promptTitle = current.titleSource === "default" && options.prompt
|
|
98
|
+
? titleFromPrompt(options.prompt)
|
|
99
|
+
: undefined;
|
|
100
|
+
updated = {
|
|
101
|
+
...current,
|
|
102
|
+
sessionFile: nextSessionFile ?? current.sessionFile,
|
|
103
|
+
updatedAt: this.#clock().toISOString(),
|
|
104
|
+
...(promptTitle ? { title: promptTitle, titleSource: "prompt" } : {}),
|
|
105
|
+
};
|
|
106
|
+
records.set(id, updated);
|
|
107
|
+
});
|
|
108
|
+
return updated ? structuredClone(updated) : undefined;
|
|
109
|
+
}
|
|
110
|
+
async #initialize() {
|
|
111
|
+
let value;
|
|
112
|
+
try {
|
|
113
|
+
value = JSON.parse(await readFile(this.#path, "utf8"));
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
if (!isNodeError(error) || error.code !== "ENOENT")
|
|
117
|
+
throw error;
|
|
118
|
+
const legacy = await this.#discoverLegacy();
|
|
119
|
+
if (legacy)
|
|
120
|
+
this.#records.set(legacy.id, legacy);
|
|
121
|
+
await this.#write(this.#records);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const parsed = parseCatalog(value);
|
|
125
|
+
const records = new Map();
|
|
126
|
+
for (const record of parsed.sessions) {
|
|
127
|
+
const sessionFile = await this.#sessionFile(record.sessionFile);
|
|
128
|
+
const cwd = await realpath(record.cwd);
|
|
129
|
+
if (records.has(record.id))
|
|
130
|
+
throw new Error(`Session catalog contains duplicate id: ${record.id}`);
|
|
131
|
+
records.set(record.id, { ...record, sessionFile, cwd });
|
|
132
|
+
}
|
|
133
|
+
this.#records = records;
|
|
134
|
+
}
|
|
135
|
+
async #discoverLegacy() {
|
|
136
|
+
const directory = join(this.#sessionsRoot, this.#workspaceId);
|
|
137
|
+
let entries;
|
|
138
|
+
try {
|
|
139
|
+
entries = await readdir(directory, { withFileTypes: true });
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
if (isNodeError(error) && error.code === "ENOENT")
|
|
143
|
+
return undefined;
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
const candidates = await Promise.all(entries
|
|
147
|
+
.filter((entry) => entry.isFile() && entry.name.endsWith(".jsonl"))
|
|
148
|
+
.map(async (entry) => {
|
|
149
|
+
const path = await this.#sessionFile(join(directory, entry.name));
|
|
150
|
+
return { path, stats: await stat(path) };
|
|
151
|
+
}));
|
|
152
|
+
candidates.sort((left, right) => right.stats.mtimeMs - left.stats.mtimeMs || left.path.localeCompare(right.path));
|
|
153
|
+
const latest = candidates[0];
|
|
154
|
+
if (!latest)
|
|
155
|
+
return undefined;
|
|
156
|
+
const created = latest.stats.birthtimeMs > 0 ? latest.stats.birthtime : latest.stats.mtime;
|
|
157
|
+
return {
|
|
158
|
+
id: "main",
|
|
159
|
+
sessionFile: latest.path,
|
|
160
|
+
cwd: this.#cwd,
|
|
161
|
+
title: defaultTitle("main"),
|
|
162
|
+
titleSource: "default",
|
|
163
|
+
createdAt: created.toISOString(),
|
|
164
|
+
updatedAt: latest.stats.mtime.toISOString(),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
async #sessionFile(path) {
|
|
168
|
+
return resolveSessionFile(path, { root: this.#sessionsRoot, allowMissing: true });
|
|
169
|
+
}
|
|
170
|
+
#mutate(operation) {
|
|
171
|
+
const task = this.#tail.then(async () => {
|
|
172
|
+
const next = new Map([...this.#records].map(([id, record]) => [id, structuredClone(record)]));
|
|
173
|
+
operation(next);
|
|
174
|
+
await this.#write(next);
|
|
175
|
+
this.#records = next;
|
|
176
|
+
});
|
|
177
|
+
this.#tail = task.catch(() => undefined);
|
|
178
|
+
return task;
|
|
179
|
+
}
|
|
180
|
+
async #write(records) {
|
|
181
|
+
const file = {
|
|
182
|
+
version: 1,
|
|
183
|
+
sessions: [...records.values()]
|
|
184
|
+
.sort((left, right) => left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id)),
|
|
185
|
+
};
|
|
186
|
+
await atomicWriteJson(this.#path, file, 0o600);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function parseCatalog(value) {
|
|
190
|
+
const file = object(value, "session catalog");
|
|
191
|
+
exactKeys(file, ["version", "sessions"], "session catalog");
|
|
192
|
+
if (file["version"] !== 1)
|
|
193
|
+
throw new Error("Session catalog version must be 1");
|
|
194
|
+
if (!Array.isArray(file["sessions"]) || file["sessions"].length > 1_000) {
|
|
195
|
+
throw new Error("Session catalog sessions must be an array of at most 1000 entries");
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
version: 1,
|
|
199
|
+
sessions: file["sessions"].map((value, index) => parseRecord(value, `session catalog.sessions[${index}]`)),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
function parseRecord(value, path) {
|
|
203
|
+
const record = object(value, path);
|
|
204
|
+
exactKeys(record, ["id", "sessionFile", "cwd", "title", "titleSource", "createdAt", "updatedAt"], path);
|
|
205
|
+
const titleSource = record["titleSource"];
|
|
206
|
+
if (titleSource !== "default" && titleSource !== "user" && titleSource !== "prompt") {
|
|
207
|
+
throw new Error(`${path}.titleSource is invalid`);
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
id: sessionId(record["id"], `${path}.id`),
|
|
211
|
+
sessionFile: boundedString(record["sessionFile"], `${path}.sessionFile`, 4_096),
|
|
212
|
+
cwd: boundedString(record["cwd"], `${path}.cwd`, 4_096),
|
|
213
|
+
title: boundedTitle(boundedString(record["title"], `${path}.title`, 120)),
|
|
214
|
+
titleSource,
|
|
215
|
+
createdAt: timestamp(record["createdAt"], `${path}.createdAt`),
|
|
216
|
+
updatedAt: timestamp(record["updatedAt"], `${path}.updatedAt`),
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
function object(value, path) {
|
|
220
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
221
|
+
throw new Error(`${path} must be an object`);
|
|
222
|
+
return value;
|
|
223
|
+
}
|
|
224
|
+
function exactKeys(value, expectedKeys, path) {
|
|
225
|
+
const expected = new Set(expectedKeys);
|
|
226
|
+
const actual = Object.keys(value);
|
|
227
|
+
const unknown = actual.filter((key) => !expected.has(key));
|
|
228
|
+
const missing = expectedKeys.filter((key) => !(key in value));
|
|
229
|
+
if (unknown.length > 0)
|
|
230
|
+
throw new Error(`${path} contains unknown fields: ${unknown.join(", ")}`);
|
|
231
|
+
if (missing.length > 0)
|
|
232
|
+
throw new Error(`${path} is missing fields: ${missing.join(", ")}`);
|
|
233
|
+
}
|
|
234
|
+
function sessionId(value, path) {
|
|
235
|
+
const id = boundedString(value, path, 128);
|
|
236
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._:-]*$/.test(id))
|
|
237
|
+
throw new Error(`${path} contains unsupported characters`);
|
|
238
|
+
return id;
|
|
239
|
+
}
|
|
240
|
+
function boundedString(value, path, maximum) {
|
|
241
|
+
if (typeof value !== "string" || !value || value.length > maximum || /[\u0000-\u001f]/.test(value)) {
|
|
242
|
+
throw new Error(`${path} must be a non-empty string of at most ${maximum} characters without controls`);
|
|
243
|
+
}
|
|
244
|
+
return value;
|
|
245
|
+
}
|
|
246
|
+
function boundedTitle(value) {
|
|
247
|
+
const normalized = value.replace(/\s+/g, " ").trim();
|
|
248
|
+
if (!normalized || normalized.length > 120)
|
|
249
|
+
throw new Error("Session title must contain 1-120 characters");
|
|
250
|
+
return normalized;
|
|
251
|
+
}
|
|
252
|
+
function titleFromPrompt(value) {
|
|
253
|
+
const normalized = value.replace(/\s+/g, " ").trim();
|
|
254
|
+
const chars = [...normalized];
|
|
255
|
+
return boundedTitle(chars.length > 72 ? `${chars.slice(0, 71).join("")}…` : normalized);
|
|
256
|
+
}
|
|
257
|
+
function defaultTitle(id) {
|
|
258
|
+
return id === "main" ? "Main session" : "New session";
|
|
259
|
+
}
|
|
260
|
+
function timestamp(value, path) {
|
|
261
|
+
const text = boundedString(value, path, 64);
|
|
262
|
+
const date = new Date(text);
|
|
263
|
+
if (Number.isNaN(date.valueOf()) || date.toISOString() !== text)
|
|
264
|
+
throw new Error(`${path} must be an ISO timestamp`);
|
|
265
|
+
return text;
|
|
266
|
+
}
|
|
267
|
+
function isNodeError(error) {
|
|
268
|
+
return error instanceof Error && "code" in error;
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=session-catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-catalog.js","sourceRoot":"","sources":["../../src/sessions/session-catalog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ResolveSessionFileOptions {
|
|
2
|
+
root?: string;
|
|
3
|
+
allowMissing?: boolean;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Canonicalize a Pi JSONL session path without requiring the leaf file to
|
|
7
|
+
* exist. Pi intentionally defers creating a new file until persistence starts,
|
|
8
|
+
* so callers may validate the existing canonical parent first and materialize
|
|
9
|
+
* the leaf afterwards.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveSessionFile(path: string, options?: ResolveSessionFileOptions): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=session-file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-file.d.ts","sourceRoot":"","sources":["../../src/sessions/session-file.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { realpath, stat } from "node:fs/promises";
|
|
2
|
+
import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Canonicalize a Pi JSONL session path without requiring the leaf file to
|
|
5
|
+
* exist. Pi intentionally defers creating a new file until persistence starts,
|
|
6
|
+
* so callers may validate the existing canonical parent first and materialize
|
|
7
|
+
* the leaf afterwards.
|
|
8
|
+
*/
|
|
9
|
+
export async function resolveSessionFile(path, options = {}) {
|
|
10
|
+
const requested = resolve(path);
|
|
11
|
+
if (!requested.endsWith(".jsonl"))
|
|
12
|
+
throw invalidSessionFile(path);
|
|
13
|
+
const root = options.root === undefined ? undefined : await realpath(options.root);
|
|
14
|
+
let canonical;
|
|
15
|
+
try {
|
|
16
|
+
canonical = await realpath(requested);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (!options.allowMissing || !isNodeError(error) || error.code !== "ENOENT")
|
|
20
|
+
throw error;
|
|
21
|
+
const parent = await realpath(dirname(requested));
|
|
22
|
+
assertInsideRoot(parent, root, path);
|
|
23
|
+
canonical = join(parent, basename(requested));
|
|
24
|
+
return canonical;
|
|
25
|
+
}
|
|
26
|
+
assertInsideRoot(canonical, root, path);
|
|
27
|
+
if (!canonical.endsWith(".jsonl"))
|
|
28
|
+
throw invalidSessionFile(path);
|
|
29
|
+
const info = await stat(canonical);
|
|
30
|
+
if (!info.isFile())
|
|
31
|
+
throw new Error(`Session file is not a regular file: ${path}`);
|
|
32
|
+
return canonical;
|
|
33
|
+
}
|
|
34
|
+
function assertInsideRoot(path, root, input) {
|
|
35
|
+
if (root === undefined)
|
|
36
|
+
return;
|
|
37
|
+
const rel = relative(root, path);
|
|
38
|
+
if (!rel || rel.startsWith("..") || isAbsolute(rel))
|
|
39
|
+
throw invalidSessionFile(input);
|
|
40
|
+
}
|
|
41
|
+
function invalidSessionFile(path) {
|
|
42
|
+
return new Error(`Session file must be a JSONL file inside the session root: ${path}`);
|
|
43
|
+
}
|
|
44
|
+
function isNodeError(error) {
|
|
45
|
+
return error instanceof Error && "code" in error;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=session-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-file.js","sourceRoot":"","sources":["../../src/sessions/session-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOnF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,UAAqC,EAAE;IAEvC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;QACzF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;QAClD,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACrC,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,gBAAgB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;IACnF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY,EAAE,IAAwB,EAAE,KAAa;IAC7E,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI,KAAK,CAAC,8DAA8D,IAAI,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface AutoCompactionConfig {
|
|
2
|
+
enabled: boolean;
|
|
3
|
+
/** Compact after the active model context grows beyond this many tokens. */
|
|
4
|
+
triggerTokens: number;
|
|
5
|
+
reserveTokens: number;
|
|
6
|
+
keepRecentTokens: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const DEFAULT_AUTO_COMPACTION: Readonly<AutoCompactionConfig>;
|
|
9
|
+
export declare const MAX_COMPACTION_TOKENS = 1000000;
|
|
10
|
+
//# sourceMappingURL=compaction-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-settings.d.ts","sourceRoot":"","sources":["../../src/settings/compaction-settings.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,oBAAoB,CAKlE,CAAC;AAEF,eAAO,MAAM,qBAAqB,UAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compaction-settings.js","sourceRoot":"","sources":["../../src/settings/compaction-settings.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,uBAAuB,GAAmC;IACrE,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,OAAO;IACtB,aAAa,EAAE,MAAM;IACrB,gBAAgB,EAAE,MAAM;CACzB,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type PsporePaths } from "../storage/home.js";
|
|
2
|
+
import { type IndexingSettings, type IndexingSettingsUpdate } from "./indexing-settings.js";
|
|
3
|
+
/**
|
|
4
|
+
* Reads and writes `config.indexing` on behalf of a client.
|
|
5
|
+
*
|
|
6
|
+
* Every write is re-parsed with the daemon's own `parseConfig` before it is
|
|
7
|
+
* persisted, so a client cannot leave behind a file the daemon will refuse to
|
|
8
|
+
* load.
|
|
9
|
+
*/
|
|
10
|
+
export declare class IndexingSettingsService {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(home: string, paths: PsporePaths);
|
|
13
|
+
get(): Promise<IndexingSettings>;
|
|
14
|
+
save(update: IndexingSettingsUpdate): Promise<IndexingSettings>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=indexing-settings-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexing-settings-service.d.ts","sourceRoot":"","sources":["../../src/settings/indexing-settings-service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC5B,MAAM,wBAAwB,CAAC;AAEhC;;;;;;GAMG;AACH,qBAAa,uBAAuB;;gBAItB,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW;IAKtC,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAehC,IAAI,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAYtE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { access, constants } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { parseConfig } from "../config/config.js";
|
|
4
|
+
import { bundledIndexerPath } from "../indexing/index-service.js";
|
|
5
|
+
import { atomicWriteJson } from "../storage/atomic.js";
|
|
6
|
+
import { loadConfig } from "../storage/home.js";
|
|
7
|
+
import { decodeIndexingSettingsUpdate, } from "./indexing-settings.js";
|
|
8
|
+
/**
|
|
9
|
+
* Reads and writes `config.indexing` on behalf of a client.
|
|
10
|
+
*
|
|
11
|
+
* Every write is re-parsed with the daemon's own `parseConfig` before it is
|
|
12
|
+
* persisted, so a client cannot leave behind a file the daemon will refuse to
|
|
13
|
+
* load.
|
|
14
|
+
*/
|
|
15
|
+
export class IndexingSettingsService {
|
|
16
|
+
#home;
|
|
17
|
+
#paths;
|
|
18
|
+
constructor(home, paths) {
|
|
19
|
+
this.#home = home;
|
|
20
|
+
this.#paths = paths;
|
|
21
|
+
}
|
|
22
|
+
async get() {
|
|
23
|
+
const config = await loadConfig(this.#home);
|
|
24
|
+
const indexerPath = this.#indexerPath();
|
|
25
|
+
return {
|
|
26
|
+
version: 1,
|
|
27
|
+
enabled: config.indexing.enabled,
|
|
28
|
+
directories: [...config.indexing.directories],
|
|
29
|
+
intervalMinutes: config.indexing.intervalMinutes,
|
|
30
|
+
extensions: [...config.indexing.extensions],
|
|
31
|
+
configPath: this.#paths.config,
|
|
32
|
+
indexerAvailable: await exists(indexerPath),
|
|
33
|
+
indexerPath,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
async save(update) {
|
|
37
|
+
const decoded = decodeIndexingSettingsUpdate(update);
|
|
38
|
+
const current = await loadConfig(this.#home);
|
|
39
|
+
const next = parseConfig({ ...current, indexing: { ...decoded } }, this.#home);
|
|
40
|
+
await atomicWriteJson(this.#paths.config, next, 0o600);
|
|
41
|
+
return this.get();
|
|
42
|
+
}
|
|
43
|
+
/** Path of the indexer inside the bundled skill's workspace link. */
|
|
44
|
+
#indexerPath() {
|
|
45
|
+
return bundledIndexerPath(join(this.#paths.workspace, "skills", "aegis-search"));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function exists(path) {
|
|
49
|
+
try {
|
|
50
|
+
await access(path, constants.X_OK);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=indexing-settings-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexing-settings-service.js","sourceRoot":"","sources":["../../src/settings/indexing-settings-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;AAClE,OAAO,EACL,4BAA4B,GAG7B,MAAM,wBAAwB,CAAC;AAEhC;;;;;;GAMG;AACH,MAAM,OAAO,uBAAuB;IACzB,KAAK,CAAS;IACd,MAAM,CAAc;IAE7B,YAAY,IAAY,EAAE,KAAkB;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,OAAO;YACL,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;YAChC,WAAW,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC7C,eAAe,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe;YAChD,UAAU,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC3C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC9B,gBAAgB,EAAE,MAAM,MAAM,CAAC,WAAW,CAAC;YAC3C,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAA8B;QACvC,MAAM,OAAO,GAAG,4BAA4B,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/E,MAAM,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC;IAED,qEAAqE;IACrE,YAAY;QACV,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC;IACnF,CAAC;CACF;AAED,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continuous indexing settings as edited by a client.
|
|
3
|
+
*
|
|
4
|
+
* Kept separate from the LLM settings because it is a different config section
|
|
5
|
+
* with different validation, and mixing them would make one decoder responsible
|
|
6
|
+
* for two unrelated shapes.
|
|
7
|
+
*/
|
|
8
|
+
export interface IndexingSettings {
|
|
9
|
+
version: 1;
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
directories: string[];
|
|
12
|
+
intervalMinutes: number;
|
|
13
|
+
extensions: string[];
|
|
14
|
+
/** Absolute path of the file these values are stored in, shown to the user. */
|
|
15
|
+
configPath: string;
|
|
16
|
+
/** True when the release shipped an indexer binary the daemon can run. */
|
|
17
|
+
indexerAvailable: boolean;
|
|
18
|
+
/** Absolute path of the indexer, whether or not it is present. */
|
|
19
|
+
indexerPath: string;
|
|
20
|
+
}
|
|
21
|
+
export interface IndexingSettingsUpdate {
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
directories: string[];
|
|
24
|
+
intervalMinutes: number;
|
|
25
|
+
extensions: string[];
|
|
26
|
+
}
|
|
27
|
+
export declare const MAX_INDEX_DIRECTORIES = 64;
|
|
28
|
+
export declare const MAX_INDEX_INTERVAL_MINUTES = 10080;
|
|
29
|
+
export declare function decodeIndexingSettingsUpdate(value: unknown, label?: string): IndexingSettingsUpdate;
|
|
30
|
+
//# sourceMappingURL=indexing-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexing-settings.d.ts","sourceRoot":"","sources":["../../src/settings/indexing-settings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,OAAO,EACd,KAAK,SAAsB,GAC1B,sBAAsB,CA4CxB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export const MAX_INDEX_DIRECTORIES = 64;
|
|
2
|
+
export const MAX_INDEX_INTERVAL_MINUTES = 10_080;
|
|
3
|
+
export function decodeIndexingSettingsUpdate(value, label = "indexing settings") {
|
|
4
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
5
|
+
throw new Error(`${label} must be an object`);
|
|
6
|
+
}
|
|
7
|
+
const input = value;
|
|
8
|
+
const allowed = new Set(["enabled", "directories", "intervalMinutes", "extensions"]);
|
|
9
|
+
const unknown = Object.keys(input).filter((key) => !allowed.has(key));
|
|
10
|
+
if (unknown.length > 0)
|
|
11
|
+
throw new Error(`${label} contains unknown fields: ${unknown.join(", ")}`);
|
|
12
|
+
if (typeof input["enabled"] !== "boolean")
|
|
13
|
+
throw new Error(`${label}.enabled must be boolean`);
|
|
14
|
+
const intervalMinutes = input["intervalMinutes"];
|
|
15
|
+
if (!Number.isSafeInteger(intervalMinutes)
|
|
16
|
+
|| Number(intervalMinutes) < 1
|
|
17
|
+
|| Number(intervalMinutes) > MAX_INDEX_INTERVAL_MINUTES) {
|
|
18
|
+
throw new Error(`${label}.intervalMinutes must be between 1 and ${MAX_INDEX_INTERVAL_MINUTES}`);
|
|
19
|
+
}
|
|
20
|
+
const directories = stringArray(input["directories"], `${label}.directories`, MAX_INDEX_DIRECTORIES);
|
|
21
|
+
for (const [index, directory] of directories.entries()) {
|
|
22
|
+
// Only absolute paths: the daemon resolves nothing on the client's behalf,
|
|
23
|
+
// and a relative path would silently mean a different directory to each.
|
|
24
|
+
if (!directory.startsWith("/")) {
|
|
25
|
+
throw new Error(`${label}.directories[${index}] must be an absolute path`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const extensions = stringArray(input["extensions"], `${label}.extensions`, 64);
|
|
29
|
+
if (extensions.length === 0)
|
|
30
|
+
throw new Error(`${label}.extensions requires at least one extension`);
|
|
31
|
+
const normalized = extensions.map((extension, index) => {
|
|
32
|
+
const value = (extension.startsWith(".") ? extension.slice(1) : extension).toLowerCase();
|
|
33
|
+
if (!/^[a-z0-9]{1,16}$/.test(value)) {
|
|
34
|
+
throw new Error(`${label}.extensions[${index}] must be a short alphanumeric extension`);
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
enabled: input["enabled"],
|
|
40
|
+
directories: [...new Set(directories)].sort(),
|
|
41
|
+
intervalMinutes: Number(intervalMinutes),
|
|
42
|
+
extensions: [...new Set(normalized)],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function stringArray(value, path, maximum) {
|
|
46
|
+
if (!Array.isArray(value))
|
|
47
|
+
throw new Error(`${path} must be an array`);
|
|
48
|
+
if (value.length > maximum)
|
|
49
|
+
throw new Error(`${path} cannot contain more than ${maximum} entries`);
|
|
50
|
+
return value.map((item, index) => {
|
|
51
|
+
// Control characters only: real paths routinely contain spaces and hyphens.
|
|
52
|
+
if (typeof item !== "string" || !item.trim() || /[\u0000-\u001f]/.test(item)) {
|
|
53
|
+
throw new Error(`${path}[${index}] must be a non-empty single-line string`);
|
|
54
|
+
}
|
|
55
|
+
return item.trim();
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=indexing-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexing-settings.js","sourceRoot":"","sources":["../../src/settings/indexing-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,12 @@ export declare class LlmSettingsService {
|
|
|
8
8
|
* with `model_not_configured`, so this is what "not configured yet" means to a client.
|
|
9
9
|
*/
|
|
10
10
|
isModelConfigured(): Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* `config.json` is authoritative for every field the settings panel edits.
|
|
13
|
+
* `state/pi/models.json` is a derived catalog for the Pi runtime, so it is only
|
|
14
|
+
* consulted to recover endpoint values written by a pre-0.1.15 build that had
|
|
15
|
+
* nowhere else to store them.
|
|
16
|
+
*/
|
|
11
17
|
get(): Promise<LlmSettings>;
|
|
12
18
|
save(update: LlmSettingsUpdate): Promise<LlmSettings>;
|
|
13
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-settings-service.d.ts","sourceRoot":"","sources":["../../src/settings/llm-settings-service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,
|
|
1
|
+
{"version":3,"file":"llm-settings-service.d.ts","sourceRoot":"","sources":["../../src/settings/llm-settings-service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,iBAAiB,EAGvB,MAAM,mBAAmB,CAAC;AAgB3B,qBAAa,kBAAkB;;gBAIjB,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW;IAK5C;;;OAGG;IACG,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC;IAK3C;;;;;OAKG;IACG,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;IAwD3B,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC;CA8K5D"}
|