@mxalbert/context-mode 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +33 -0
- package/.claude-plugin/plugin.json +31 -0
- package/.codex-plugin/hooks.json +65 -0
- package/.codex-plugin/mcp.json +13 -0
- package/.codex-plugin/plugin.json +31 -0
- package/.openclaw-plugin/index.ts +12 -0
- package/.openclaw-plugin/openclaw.plugin.json +38 -0
- package/.openclaw-plugin/package.json +28 -0
- package/LICENSE +94 -0
- package/README.md +1619 -0
- package/bin/statusline.mjs +378 -0
- package/build/adapters/antigravity/index.d.ts +51 -0
- package/build/adapters/antigravity/index.js +169 -0
- package/build/adapters/antigravity-cli/index.d.ts +51 -0
- package/build/adapters/antigravity-cli/index.js +342 -0
- package/build/adapters/base.d.ts +92 -0
- package/build/adapters/base.js +135 -0
- package/build/adapters/claude-code/config.d.ts +8 -0
- package/build/adapters/claude-code/config.js +8 -0
- package/build/adapters/claude-code/hooks.d.ts +106 -0
- package/build/adapters/claude-code/hooks.js +183 -0
- package/build/adapters/claude-code/index.d.ts +80 -0
- package/build/adapters/claude-code/index.js +569 -0
- package/build/adapters/claude-code-base.d.ts +49 -0
- package/build/adapters/claude-code-base.js +113 -0
- package/build/adapters/client-map.d.ts +10 -0
- package/build/adapters/client-map.js +42 -0
- package/build/adapters/codex/config.d.ts +8 -0
- package/build/adapters/codex/config.js +8 -0
- package/build/adapters/codex/hooks.d.ts +55 -0
- package/build/adapters/codex/hooks.js +64 -0
- package/build/adapters/codex/index.d.ts +87 -0
- package/build/adapters/codex/index.js +995 -0
- package/build/adapters/codex/paths.d.ts +1 -0
- package/build/adapters/codex/paths.js +12 -0
- package/build/adapters/codex/usage.d.ts +107 -0
- package/build/adapters/codex/usage.js +227 -0
- package/build/adapters/copilot-base.d.ts +94 -0
- package/build/adapters/copilot-base.js +297 -0
- package/build/adapters/copilot-cli/hooks.d.ts +33 -0
- package/build/adapters/copilot-cli/hooks.js +64 -0
- package/build/adapters/copilot-cli/index.d.ts +48 -0
- package/build/adapters/copilot-cli/index.js +341 -0
- package/build/adapters/cursor/config.d.ts +4 -0
- package/build/adapters/cursor/config.js +4 -0
- package/build/adapters/cursor/hooks.d.ts +55 -0
- package/build/adapters/cursor/hooks.js +82 -0
- package/build/adapters/cursor/index.d.ts +64 -0
- package/build/adapters/cursor/index.js +517 -0
- package/build/adapters/detect.d.ts +136 -0
- package/build/adapters/detect.js +623 -0
- package/build/adapters/gemini-cli/config.d.ts +8 -0
- package/build/adapters/gemini-cli/config.js +8 -0
- package/build/adapters/gemini-cli/hooks.d.ts +83 -0
- package/build/adapters/gemini-cli/hooks.js +115 -0
- package/build/adapters/gemini-cli/index.d.ts +80 -0
- package/build/adapters/gemini-cli/index.js +483 -0
- package/build/adapters/jetbrains-copilot/config.d.ts +8 -0
- package/build/adapters/jetbrains-copilot/config.js +8 -0
- package/build/adapters/jetbrains-copilot/hooks.d.ts +59 -0
- package/build/adapters/jetbrains-copilot/hooks.js +87 -0
- package/build/adapters/jetbrains-copilot/index.d.ts +31 -0
- package/build/adapters/jetbrains-copilot/index.js +131 -0
- package/build/adapters/kimi/config.d.ts +8 -0
- package/build/adapters/kimi/config.js +8 -0
- package/build/adapters/kimi/hooks.d.ts +28 -0
- package/build/adapters/kimi/hooks.js +34 -0
- package/build/adapters/kimi/index.d.ts +66 -0
- package/build/adapters/kimi/index.js +537 -0
- package/build/adapters/kimi/paths.d.ts +21 -0
- package/build/adapters/kimi/paths.js +52 -0
- package/build/adapters/kimi/usage.d.ts +82 -0
- package/build/adapters/kimi/usage.js +217 -0
- package/build/adapters/kiro/hooks.d.ts +61 -0
- package/build/adapters/kiro/hooks.js +94 -0
- package/build/adapters/kiro/index.d.ts +61 -0
- package/build/adapters/kiro/index.js +301 -0
- package/build/adapters/omp/index.d.ts +65 -0
- package/build/adapters/omp/index.js +182 -0
- package/build/adapters/omp/plugin.d.ts +81 -0
- package/build/adapters/omp/plugin.js +331 -0
- package/build/adapters/omp/usage.d.ts +49 -0
- package/build/adapters/omp/usage.js +110 -0
- package/build/adapters/openclaw/config.d.ts +8 -0
- package/build/adapters/openclaw/config.js +8 -0
- package/build/adapters/openclaw/hooks.d.ts +50 -0
- package/build/adapters/openclaw/hooks.js +61 -0
- package/build/adapters/openclaw/index.d.ts +74 -0
- package/build/adapters/openclaw/index.js +439 -0
- package/build/adapters/openclaw/mcp-tools.d.ts +54 -0
- package/build/adapters/openclaw/mcp-tools.js +207 -0
- package/build/adapters/openclaw/plugin.d.ts +141 -0
- package/build/adapters/openclaw/plugin.js +818 -0
- package/build/adapters/openclaw/session-db.d.ts +55 -0
- package/build/adapters/openclaw/session-db.js +88 -0
- package/build/adapters/openclaw/usage.d.ts +34 -0
- package/build/adapters/openclaw/usage.js +52 -0
- package/build/adapters/openclaw/workspace-router.d.ts +29 -0
- package/build/adapters/openclaw/workspace-router.js +64 -0
- package/build/adapters/opencode/config.d.ts +8 -0
- package/build/adapters/opencode/config.js +8 -0
- package/build/adapters/opencode/hooks.d.ts +38 -0
- package/build/adapters/opencode/hooks.js +50 -0
- package/build/adapters/opencode/index.d.ts +144 -0
- package/build/adapters/opencode/index.js +638 -0
- package/build/adapters/opencode/plugin.d.ts +249 -0
- package/build/adapters/opencode/plugin.js +1536 -0
- package/build/adapters/opencode/v2.d.ts +117 -0
- package/build/adapters/opencode/v2.js +224 -0
- package/build/adapters/opencode/zod3tov4.d.ts +1 -0
- package/build/adapters/opencode/zod3tov4.js +132 -0
- package/build/adapters/pi/extension.d.ts +81 -0
- package/build/adapters/pi/extension.js +861 -0
- package/build/adapters/pi/index.d.ts +57 -0
- package/build/adapters/pi/index.js +173 -0
- package/build/adapters/pi/mcp-bridge.d.ts +268 -0
- package/build/adapters/pi/mcp-bridge.js +894 -0
- package/build/adapters/qwen-code/hooks.d.ts +26 -0
- package/build/adapters/qwen-code/hooks.js +29 -0
- package/build/adapters/qwen-code/index.d.ts +40 -0
- package/build/adapters/qwen-code/index.js +361 -0
- package/build/adapters/qwen-code/usage.d.ts +90 -0
- package/build/adapters/qwen-code/usage.js +222 -0
- package/build/adapters/types.d.ts +360 -0
- package/build/adapters/types.js +118 -0
- package/build/adapters/vscode-copilot/config.d.ts +8 -0
- package/build/adapters/vscode-copilot/config.js +8 -0
- package/build/adapters/vscode-copilot/hooks.d.ts +71 -0
- package/build/adapters/vscode-copilot/hooks.js +98 -0
- package/build/adapters/vscode-copilot/index.d.ts +32 -0
- package/build/adapters/vscode-copilot/index.js +222 -0
- package/build/adapters/zed/index.d.ts +40 -0
- package/build/adapters/zed/index.js +163 -0
- package/build/cli.d.ts +34 -0
- package/build/cli.js +1828 -0
- package/build/db-base.d.ts +250 -0
- package/build/db-base.js +756 -0
- package/build/executor.d.ts +72 -0
- package/build/executor.js +678 -0
- package/build/exit-classify.d.ts +19 -0
- package/build/exit-classify.js +12 -0
- package/build/fetch/blocks.d.ts +145 -0
- package/build/fetch/blocks.js +244 -0
- package/build/fetch/extract.d.ts +68 -0
- package/build/fetch/extract.js +123 -0
- package/build/fetch/page-store.d.ts +66 -0
- package/build/fetch/page-store.js +174 -0
- package/build/fetch-cache.d.ts +13 -0
- package/build/fetch-cache.js +15 -0
- package/build/lifecycle.d.ts +124 -0
- package/build/lifecycle.js +278 -0
- package/build/package-identity.d.ts +26 -0
- package/build/package-identity.js +28 -0
- package/build/runPool.d.ts +36 -0
- package/build/runPool.js +51 -0
- package/build/runtime.d.ts +71 -0
- package/build/runtime.js +659 -0
- package/build/search/auto-memory.d.ts +47 -0
- package/build/search/auto-memory.js +170 -0
- package/build/search/ctx-search-schema.d.ts +90 -0
- package/build/search/ctx-search-schema.js +135 -0
- package/build/search/flood-guard.d.ts +57 -0
- package/build/search/flood-guard.js +80 -0
- package/build/search/unified.d.ts +56 -0
- package/build/search/unified.js +104 -0
- package/build/security.d.ts +206 -0
- package/build/security.js +780 -0
- package/build/server.d.ts +240 -0
- package/build/server.js +5034 -0
- package/build/session/analytics.d.ts +773 -0
- package/build/session/analytics.js +2420 -0
- package/build/session/db.d.ts +468 -0
- package/build/session/db.js +1330 -0
- package/build/session/error-classifier.d.ts +87 -0
- package/build/session/error-classifier.js +303 -0
- package/build/session/event-emit.d.ts +48 -0
- package/build/session/event-emit.js +101 -0
- package/build/session/extract.d.ts +333 -0
- package/build/session/extract.js +2688 -0
- package/build/session/model-prices.json +429 -0
- package/build/session/persist-tool-calls.d.ts +54 -0
- package/build/session/persist-tool-calls.js +105 -0
- package/build/session/pricing.d.ts +64 -0
- package/build/session/pricing.js +151 -0
- package/build/session/project-attribution.d.ts +73 -0
- package/build/session/project-attribution.js +245 -0
- package/build/session/purge.d.ts +138 -0
- package/build/session/purge.js +240 -0
- package/build/session/retrieval-marker.d.ts +39 -0
- package/build/session/retrieval-marker.js +65 -0
- package/build/session/snapshot.d.ts +46 -0
- package/build/session/snapshot.js +532 -0
- package/build/store-directory.d.ts +56 -0
- package/build/store-directory.js +254 -0
- package/build/store.d.ts +147 -0
- package/build/store.js +1714 -0
- package/build/truncate.d.ts +57 -0
- package/build/truncate.js +142 -0
- package/build/types.d.ts +117 -0
- package/build/types.js +20 -0
- package/build/util/claude-config.d.ts +32 -0
- package/build/util/claude-config.js +84 -0
- package/build/util/hook-config.d.ts +27 -0
- package/build/util/hook-config.js +76 -0
- package/build/util/jsonc.d.ts +14 -0
- package/build/util/jsonc.js +104 -0
- package/build/util/plugin-cache-integrity.d.ts +51 -0
- package/build/util/plugin-cache-integrity.js +146 -0
- package/build/util/project-dir.d.ts +149 -0
- package/build/util/project-dir.js +340 -0
- package/build/util/sibling-mcp.d.ts +79 -0
- package/build/util/sibling-mcp.js +181 -0
- package/cli.bundle.mjs +1495 -0
- package/configs/antigravity/GEMINI.md +68 -0
- package/configs/antigravity/mcp_config.json +7 -0
- package/configs/antigravity-cli/hooks/hooks.json +37 -0
- package/configs/antigravity-cli/hooks.json +37 -0
- package/configs/antigravity-cli/mcp_config.json +10 -0
- package/configs/antigravity-cli/plugin.json +14 -0
- package/configs/antigravity-cli/rules/context-mode.md +77 -0
- package/configs/antigravity-cli/skills/context-mode/SKILL.md +77 -0
- package/configs/claude-code/CLAUDE.md +91 -0
- package/configs/codex/AGENTS.md +99 -0
- package/configs/codex/config.toml +8 -0
- package/configs/codex/hooks.json +47 -0
- package/configs/copilot-cli/.github/plugin/plugin.json +23 -0
- package/configs/copilot-cli/.mcp.json +12 -0
- package/configs/copilot-cli/README.md +47 -0
- package/configs/copilot-cli/hooks.json +41 -0
- package/configs/copilot-cli/skills/context-mode/SKILL.md +38 -0
- package/configs/cursor/context-mode.mdc +76 -0
- package/configs/cursor/hooks.json +21 -0
- package/configs/cursor/mcp.json +7 -0
- package/configs/gemini-cli/GEMINI.md +88 -0
- package/configs/gemini-cli/mcp.json +7 -0
- package/configs/gemini-cli/settings.json +60 -0
- package/configs/jetbrains-copilot/copilot-instructions.md +80 -0
- package/configs/jetbrains-copilot/hooks.json +16 -0
- package/configs/jetbrains-copilot/mcp.json +7 -0
- package/configs/kilo/AGENTS.md +84 -0
- package/configs/kilo/kilo.json +6 -0
- package/configs/kimi/hooks.json +54 -0
- package/configs/kiro/KIRO.md +84 -0
- package/configs/kiro/agent.json +18 -0
- package/configs/kiro/mcp.json +7 -0
- package/configs/omp/SYSTEM.md +85 -0
- package/configs/omp/mcp.json +7 -0
- package/configs/openclaw/AGENTS.md +87 -0
- package/configs/openclaw/openclaw.json +13 -0
- package/configs/opencode/AGENTS.md +84 -0
- package/configs/opencode/opencode.json +6 -0
- package/configs/pi/AGENTS.md +3 -0
- package/configs/qwen-code/QWEN.md +91 -0
- package/configs/vscode-copilot/copilot-instructions.md +80 -0
- package/configs/vscode-copilot/hooks.json +16 -0
- package/configs/vscode-copilot/mcp.json +7 -0
- package/configs/zed/AGENTS.md +68 -0
- package/hooks/antigravity-cli/payload.mjs +98 -0
- package/hooks/antigravity-cli/posttooluse.mjs +138 -0
- package/hooks/antigravity-cli/pretooluse.mjs +78 -0
- package/hooks/antigravity-cli/stop.mjs +58 -0
- package/hooks/auto-injection.mjs +102 -0
- package/hooks/cache-heal-utils.mjs +379 -0
- package/hooks/codex/platform.mjs +1 -0
- package/hooks/codex/posttooluse.mjs +66 -0
- package/hooks/codex/precompact.mjs +70 -0
- package/hooks/codex/pretooluse.mjs +42 -0
- package/hooks/codex/sessionstart.mjs +121 -0
- package/hooks/codex/stop.mjs +138 -0
- package/hooks/codex/userpromptsubmit.mjs +75 -0
- package/hooks/copilot-cli/posttooluse.mjs +79 -0
- package/hooks/copilot-cli/precompact.mjs +66 -0
- package/hooks/copilot-cli/pretooluse.mjs +41 -0
- package/hooks/copilot-cli/sessionstart.mjs +121 -0
- package/hooks/copilot-cli/stop.mjs +59 -0
- package/hooks/copilot-cli/userpromptsubmit.mjs +77 -0
- package/hooks/core/codex-caps.mjs +112 -0
- package/hooks/core/formatters.mjs +356 -0
- package/hooks/core/mcp-ready.mjs +109 -0
- package/hooks/core/platform-detect.mjs +49 -0
- package/hooks/core/routing.mjs +1050 -0
- package/hooks/core/stdin.mjs +90 -0
- package/hooks/core/tool-naming.mjs +57 -0
- package/hooks/cursor/afteragentresponse.mjs +74 -0
- package/hooks/cursor/hooks.json +31 -0
- package/hooks/cursor/posttooluse.mjs +72 -0
- package/hooks/cursor/pretooluse.mjs +26 -0
- package/hooks/cursor/sessionstart.mjs +97 -0
- package/hooks/cursor/stop.mjs +48 -0
- package/hooks/ensure-deps.mjs +254 -0
- package/hooks/formatters/claude-code.mjs +113 -0
- package/hooks/formatters/cursor.mjs +37 -0
- package/hooks/formatters/gemini-cli.mjs +55 -0
- package/hooks/formatters/vscode-copilot.mjs +55 -0
- package/hooks/gemini-cli/aftermodel.mjs +70 -0
- package/hooks/gemini-cli/aftertool.mjs +61 -0
- package/hooks/gemini-cli/beforeagent.mjs +99 -0
- package/hooks/gemini-cli/beforetool.mjs +27 -0
- package/hooks/gemini-cli/precompress.mjs +55 -0
- package/hooks/gemini-cli/sessionstart.mjs +137 -0
- package/hooks/heal-partial-install.mjs +712 -0
- package/hooks/hooks.json +143 -0
- package/hooks/jetbrains-copilot/posttooluse.mjs +61 -0
- package/hooks/jetbrains-copilot/precompact.mjs +55 -0
- package/hooks/jetbrains-copilot/pretooluse.mjs +27 -0
- package/hooks/jetbrains-copilot/sessionstart.mjs +124 -0
- package/hooks/kimi/platform.mjs +1 -0
- package/hooks/kimi/posttooluse.mjs +72 -0
- package/hooks/kimi/precompact.mjs +80 -0
- package/hooks/kimi/pretooluse.mjs +42 -0
- package/hooks/kimi/sessionend.mjs +61 -0
- package/hooks/kimi/sessionstart.mjs +113 -0
- package/hooks/kimi/stop.mjs +132 -0
- package/hooks/kimi/userpromptsubmit.mjs +90 -0
- package/hooks/kiro/agentspawn.mjs +97 -0
- package/hooks/kiro/posttooluse.mjs +51 -0
- package/hooks/kiro/pretooluse.mjs +64 -0
- package/hooks/kiro/userpromptsubmit.mjs +88 -0
- package/hooks/normalize-hooks.mjs +323 -0
- package/hooks/platform-bridge.mjs +340 -0
- package/hooks/posttooluse.mjs +225 -0
- package/hooks/precompact.mjs +100 -0
- package/hooks/pretooluse.mjs +227 -0
- package/hooks/qwen-code/platform.mjs +1 -0
- package/hooks/qwen-code/stop.mjs +168 -0
- package/hooks/routing-block.mjs +105 -0
- package/hooks/run-hook.mjs +95 -0
- package/hooks/security.bundle.mjs +2 -0
- package/hooks/session-attribution.bundle.mjs +1 -0
- package/hooks/session-db.bundle.mjs +145 -0
- package/hooks/session-directive.mjs +520 -0
- package/hooks/session-extract.bundle.mjs +3 -0
- package/hooks/session-helpers.mjs +428 -0
- package/hooks/session-loaders.mjs +448 -0
- package/hooks/session-snapshot.bundle.mjs +32 -0
- package/hooks/sessionstart.mjs +464 -0
- package/hooks/stop.mjs +82 -0
- package/hooks/suppress-stderr.mjs +25 -0
- package/hooks/userpromptsubmit.mjs +108 -0
- package/hooks/vscode-copilot/posttooluse.mjs +61 -0
- package/hooks/vscode-copilot/precompact.mjs +55 -0
- package/hooks/vscode-copilot/pretooluse.mjs +27 -0
- package/hooks/vscode-copilot/sessionstart.mjs +129 -0
- package/openclaw.plugin.json +38 -0
- package/package.json +132 -0
- package/scripts/heal-better-sqlite3.mjs +430 -0
- package/scripts/heal-installed-plugins.mjs +635 -0
- package/scripts/plugin-cache-integrity.mjs +248 -0
- package/scripts/postinstall.mjs +397 -0
- package/server.bundle.mjs +1421 -0
- package/server.js +5 -0
- package/skills/.ignore +7 -0
- package/skills/context-mode/SKILL.md +300 -0
- package/skills/context-mode/references/anti-patterns.md +283 -0
- package/skills/context-mode/references/patterns-javascript.md +298 -0
- package/skills/context-mode/references/patterns-python.md +304 -0
- package/skills/context-mode/references/patterns-shell.md +277 -0
- package/skills/ctx-doctor/SKILL.md +22 -0
- package/skills/ctx-index/SKILL.md +46 -0
- package/skills/ctx-insight/SKILL.md +24 -0
- package/skills/ctx-purge/SKILL.md +49 -0
- package/skills/ctx-search/SKILL.md +35 -0
- package/skills/ctx-stats/SKILL.md +26 -0
- package/skills/ctx-upgrade/SKILL.md +31 -0
- package/start.mjs +616 -0
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionDB — Persistent per-project SQLite database for session events.
|
|
3
|
+
*
|
|
4
|
+
* Stores raw events captured by hooks during a Claude Code session,
|
|
5
|
+
* session metadata, and resume snapshots. Extends SQLiteBase from
|
|
6
|
+
* the shared package.
|
|
7
|
+
*/
|
|
8
|
+
import { SQLiteBase } from "../db-base.js";
|
|
9
|
+
import type { SessionEvent } from "../types.js";
|
|
10
|
+
import type { ProjectAttribution } from "./project-attribution.js";
|
|
11
|
+
declare const STORAGE_ROOT_ENV: "CONTEXT_MODE_DIR";
|
|
12
|
+
export type StorageDirectoryKind = "session" | "content" | "stats";
|
|
13
|
+
export type StorageOverrideEnvVar = typeof STORAGE_ROOT_ENV;
|
|
14
|
+
export type StorageDirectorySource = "default" | "override";
|
|
15
|
+
export type IgnoredStorageOverrideReason = "empty";
|
|
16
|
+
export interface ResolvedStorageDir {
|
|
17
|
+
kind: StorageDirectoryKind;
|
|
18
|
+
path: string;
|
|
19
|
+
envVar: StorageOverrideEnvVar | null;
|
|
20
|
+
source: StorageDirectorySource;
|
|
21
|
+
ignoredEnvVar?: StorageOverrideEnvVar;
|
|
22
|
+
ignoredReason?: IgnoredStorageOverrideReason;
|
|
23
|
+
}
|
|
24
|
+
export declare class StorageDirectoryError extends Error {
|
|
25
|
+
readonly kind: StorageDirectoryKind;
|
|
26
|
+
readonly path: string;
|
|
27
|
+
readonly overrideEnvVar: StorageOverrideEnvVar;
|
|
28
|
+
readonly ignoredEnvVar?: StorageOverrideEnvVar;
|
|
29
|
+
readonly ignoredReason?: IgnoredStorageOverrideReason;
|
|
30
|
+
constructor(kind: StorageDirectoryKind, path: string, overrideEnvVar?: StorageOverrideEnvVar, cause?: unknown, message?: string, metadata?: Pick<ResolvedStorageDir, "ignoredEnvVar" | "ignoredReason">);
|
|
31
|
+
}
|
|
32
|
+
export interface DefaultSessionDirOptions {
|
|
33
|
+
configDir: string;
|
|
34
|
+
configDirEnv?: string;
|
|
35
|
+
legacySessionDirEnv?: string;
|
|
36
|
+
onLegacySessionDir?: (envVar: string, dir: string) => void;
|
|
37
|
+
env?: NodeJS.ProcessEnv;
|
|
38
|
+
}
|
|
39
|
+
export declare function resolveDefaultSessionDir(opts: DefaultSessionDirOptions): string;
|
|
40
|
+
export declare function resolveSessionStorageDir(getDefaultDir: () => string): ResolvedStorageDir;
|
|
41
|
+
export declare function resolveContentStorageDir(getSessionDir: () => string): ResolvedStorageDir;
|
|
42
|
+
export declare function resolveStatsStorageDir(getDefaultSessionDir: () => string): ResolvedStorageDir;
|
|
43
|
+
export declare function formatStorageDirectoryError(err: StorageDirectoryError): string;
|
|
44
|
+
export declare function describeStorageDirectorySource(dir: ResolvedStorageDir): string;
|
|
45
|
+
export declare function clearStorageDirectoryCheckCacheForTests(): void;
|
|
46
|
+
export declare function ensureWritableStorageDir(dir: ResolvedStorageDir): string;
|
|
47
|
+
export declare function normalizeWorktreePath(path: string): string;
|
|
48
|
+
export declare function getWorktreeSuffix(projectDir?: string): string;
|
|
49
|
+
export declare function _resetWorktreeSuffixCacheForTests(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Hash a project directory the way the deployed code (≤ v1.0.111) did:
|
|
52
|
+
* normalize slashes only, preserve raw casing. Kept exported so the
|
|
53
|
+
* migration helper can locate pre-fix DB files for one-shot rename.
|
|
54
|
+
*
|
|
55
|
+
* Do NOT call this for new code paths — use {@link hashProjectDirCanonical}.
|
|
56
|
+
*/
|
|
57
|
+
export declare function hashProjectDirLegacy(projectDir: string): string;
|
|
58
|
+
/**
|
|
59
|
+
* Hash a project directory case-stably. On case-insensitive filesystems
|
|
60
|
+
* (macOS HFS+/APFS, Windows NTFS) the path is lowercased so that
|
|
61
|
+
* `/Users/Mert/proj` and `/users/mert/proj` resolve to the same DB file.
|
|
62
|
+
* On Linux (case-sensitive) casing is preserved.
|
|
63
|
+
*
|
|
64
|
+
* Used as the base half of the SessionDB filename:
|
|
65
|
+
* <baseHash><worktreeSuffix>.db
|
|
66
|
+
*/
|
|
67
|
+
export declare function hashProjectDirCanonical(projectDir: string): string;
|
|
68
|
+
/**
|
|
69
|
+
* Resolve the per-project FTS5 content store DB path, performing a one-shot
|
|
70
|
+
* migration from a legacy raw-casing filename to the canonical one when only
|
|
71
|
+
* the legacy file (with optional `-wal` / `-shm` SQLite sidecars) exists.
|
|
72
|
+
*
|
|
73
|
+
* Same dual-hash safety contract as {@link resolveSessionDbPath}:
|
|
74
|
+
* - Linux: canonical hash equals legacy hash → no migration attempted.
|
|
75
|
+
* - Mac/Win: rename legacy → canonical when canonical missing.
|
|
76
|
+
* - Both exist: leave legacy alone (data-loss safety). Caller picks
|
|
77
|
+
* canonical; reconciliation is a manual operation.
|
|
78
|
+
*
|
|
79
|
+
* Differs from `resolveSessionDbPath` in two ways:
|
|
80
|
+
* 1. No worktree suffix — the FTS5 store is per-project, not per-worktree.
|
|
81
|
+
* 2. The `-wal` / `-shm` sidecars travel with the main `.db` during
|
|
82
|
+
* migration so an active SQLite WAL checkpoint is not stranded behind.
|
|
83
|
+
*/
|
|
84
|
+
export declare function resolveContentStorePath(opts: {
|
|
85
|
+
projectDir: string;
|
|
86
|
+
contentDir: string;
|
|
87
|
+
}): string;
|
|
88
|
+
/**
|
|
89
|
+
* Resolve the SessionDB file path for a project, performing a one-shot
|
|
90
|
+
* migration from legacy raw-casing filenames to canonical ones when only
|
|
91
|
+
* the legacy file exists.
|
|
92
|
+
*
|
|
93
|
+
* Migration rules:
|
|
94
|
+
* - Linux: `legacyHash === canonicalHash` so the resolver short-circuits;
|
|
95
|
+
* no migration ever runs (case-sensitive FS, never any drift).
|
|
96
|
+
* - macOS / Windows: if the canonical path does not exist but a legacy
|
|
97
|
+
* path does, rename in place. This preserves the user's session
|
|
98
|
+
* history across the casing-fix upgrade.
|
|
99
|
+
* - When BOTH paths exist (rare — usually only if the user previously
|
|
100
|
+
* ran two terminals with different casing) the legacy file is left
|
|
101
|
+
* UNTOUCHED. The canonical path wins; manual reconciliation needed.
|
|
102
|
+
* Avoiding the rename here is the data-loss safety guarantee.
|
|
103
|
+
*
|
|
104
|
+
* Worktree separation is preserved: each call only ever migrates the ONE
|
|
105
|
+
* legacy file matching THIS projectDir's hash. Different worktrees have
|
|
106
|
+
* different physical paths → different hashes → different DB files; the
|
|
107
|
+
* migration cannot collapse worktrees.
|
|
108
|
+
*/
|
|
109
|
+
export declare function resolveSessionDbPath(opts: {
|
|
110
|
+
projectDir: string;
|
|
111
|
+
sessionsDir: string;
|
|
112
|
+
}): string;
|
|
113
|
+
/**
|
|
114
|
+
* Generalized resolver: same case-fold + one-shot legacy-rename semantics
|
|
115
|
+
* as {@link resolveSessionDbPath}, parameterised on the file extension so
|
|
116
|
+
* the SAME logic powers `.db`, `-events.md`, and `.cleanup` paths.
|
|
117
|
+
*
|
|
118
|
+
* Source of truth for hooks: `hooks/session-helpers.mjs` imports this
|
|
119
|
+
* function from the bundled output (`hooks/session-db.bundle.mjs`) so the
|
|
120
|
+
* JS hooks and the TS server can never drift again on hash, suffix, or
|
|
121
|
+
* migration policy.
|
|
122
|
+
*
|
|
123
|
+
* Optional `suffix` lets the hook layer inject its cross-process cached
|
|
124
|
+
* worktree suffix (the marker-file optimisation that amortises the
|
|
125
|
+
* `git worktree list` cost across hook forks). When omitted, falls back
|
|
126
|
+
* to {@link getWorktreeSuffix} which uses an in-process cache only.
|
|
127
|
+
*/
|
|
128
|
+
export declare function resolveSessionPath(opts: {
|
|
129
|
+
projectDir: string;
|
|
130
|
+
sessionsDir: string;
|
|
131
|
+
ext: string;
|
|
132
|
+
suffix?: string;
|
|
133
|
+
}): string;
|
|
134
|
+
/** A stored event row from the session_events table. */
|
|
135
|
+
export interface StoredEvent {
|
|
136
|
+
id: number;
|
|
137
|
+
session_id: string;
|
|
138
|
+
type: string;
|
|
139
|
+
category: string;
|
|
140
|
+
priority: number;
|
|
141
|
+
data: string;
|
|
142
|
+
project_dir: string;
|
|
143
|
+
attribution_source: string;
|
|
144
|
+
attribution_confidence: number;
|
|
145
|
+
bytes_avoided: number;
|
|
146
|
+
bytes_returned: number;
|
|
147
|
+
source_hook: string;
|
|
148
|
+
created_at: string;
|
|
149
|
+
data_hash: string;
|
|
150
|
+
}
|
|
151
|
+
/** Optional per-event byte accounting passed to {@link SessionDB.insertEvent}. */
|
|
152
|
+
export interface EventBytes {
|
|
153
|
+
/** Bytes context-mode prevented from entering the model context window. */
|
|
154
|
+
bytesAvoided?: number;
|
|
155
|
+
/** Bytes context-mode actually returned to the model. */
|
|
156
|
+
bytesReturned?: number;
|
|
157
|
+
}
|
|
158
|
+
/** Session metadata row from the session_meta table. */
|
|
159
|
+
export interface SessionMeta {
|
|
160
|
+
session_id: string;
|
|
161
|
+
project_dir: string;
|
|
162
|
+
started_at: string;
|
|
163
|
+
last_event_at: string | null;
|
|
164
|
+
event_count: number;
|
|
165
|
+
compact_count: number;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Session rollup snapshot (seed-parity aggregate).
|
|
169
|
+
*
|
|
170
|
+
* 12 fields that mirror the platform's `session_summary` + `session_metadata`
|
|
171
|
+
* stamps from src/routes/seed.ts. Each outgoing canonical event carries
|
|
172
|
+
* this snapshot computed at the moment of forward so the analytics engine
|
|
173
|
+
* can run its SUM/AVG/MAX rollups across per-event rows.
|
|
174
|
+
*/
|
|
175
|
+
export interface SessionRollup {
|
|
176
|
+
tool_calls: number;
|
|
177
|
+
errors: number;
|
|
178
|
+
unique_tools: number;
|
|
179
|
+
unique_files: number;
|
|
180
|
+
max_file_edits: number;
|
|
181
|
+
has_commit: 0 | 1;
|
|
182
|
+
commit_message: string;
|
|
183
|
+
edit_test_cycles: number;
|
|
184
|
+
duration_min: number;
|
|
185
|
+
compact_count: number;
|
|
186
|
+
sources_indexed: number;
|
|
187
|
+
total_chunks: number;
|
|
188
|
+
search_queries: number;
|
|
189
|
+
}
|
|
190
|
+
/** Resume snapshot row from the session_resume table. */
|
|
191
|
+
export interface ResumeRow {
|
|
192
|
+
snapshot: string;
|
|
193
|
+
event_count: number;
|
|
194
|
+
consumed: number;
|
|
195
|
+
}
|
|
196
|
+
/** Aggregated tool-call stats for a single session. */
|
|
197
|
+
export interface ToolCallStats {
|
|
198
|
+
totalCalls: number;
|
|
199
|
+
totalBytesReturned: number;
|
|
200
|
+
byTool: Record<string, {
|
|
201
|
+
calls: number;
|
|
202
|
+
bytesReturned: number;
|
|
203
|
+
}>;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Apply any missing post-v1.0.130 `session_events` columns to an already-
|
|
207
|
+
* open writable database handle. Idempotent — each ALTER is guarded by a
|
|
208
|
+
* PRAGMA table_xinfo check, and the project_dir index is created only
|
|
209
|
+
* when a migration actually ran. Returns true if any column was added.
|
|
210
|
+
*
|
|
211
|
+
* Used by both the SessionDB constructor (for the active DB) and the
|
|
212
|
+
* analytics aggregator (for the 100+ historical DBs that never get
|
|
213
|
+
* opened through SessionDB). ADR-0001 compatible: no EXCLUSIVE pragma,
|
|
214
|
+
* no acquireDbLock — relies on the SQLite busy_timeout + WAL semantics
|
|
215
|
+
* already provided by SQLiteBase.
|
|
216
|
+
*/
|
|
217
|
+
export declare function applyMissingSessionEventsColumns(db: {
|
|
218
|
+
pragma: (q: string) => Array<{
|
|
219
|
+
name: string;
|
|
220
|
+
}>;
|
|
221
|
+
exec: (sql: string) => void;
|
|
222
|
+
}): boolean;
|
|
223
|
+
/**
|
|
224
|
+
* Open a session DB file briefly, run any missing schema migrations,
|
|
225
|
+
* and close. Best-effort: missing tables, file-locks, corrupt files,
|
|
226
|
+
* and any DatabaseCtor error are swallowed silently — the caller
|
|
227
|
+
* (analytics aggregator) handles the readonly query that follows and
|
|
228
|
+
* will skip the DB if it remains unreadable.
|
|
229
|
+
*
|
|
230
|
+
* Lazy migration entry point for the analytics aggregator, which would
|
|
231
|
+
* otherwise read 100+ historical DBs with the old (pre-v1.0.130) schema
|
|
232
|
+
* and lose every signal (not just bytes_avoided) because the SELECT
|
|
233
|
+
* statement references columns that don't exist on legacy schemas.
|
|
234
|
+
*
|
|
235
|
+
* Two open/close cycles in the worst case (one readonly probe to detect
|
|
236
|
+
* legacy schema, one writable to migrate). For already-migrated DBs
|
|
237
|
+
* (the common case after first read), this opens writable once and
|
|
238
|
+
* exits without writing — cheaper than always-writable.
|
|
239
|
+
*/
|
|
240
|
+
export declare function ensureSessionEventsSchema(dbPath: string, DatabaseCtor: new (path: string, opts?: {
|
|
241
|
+
readonly?: boolean;
|
|
242
|
+
}) => {
|
|
243
|
+
pragma: (q: string) => Array<{
|
|
244
|
+
name: string;
|
|
245
|
+
}>;
|
|
246
|
+
exec: (sql: string) => void;
|
|
247
|
+
close: () => void;
|
|
248
|
+
}): void;
|
|
249
|
+
export declare class SessionDB extends SQLiteBase {
|
|
250
|
+
/**
|
|
251
|
+
* Cached prepared statements. Stored in a Map to avoid the JS private-field
|
|
252
|
+
* inheritance issue where `#field` declarations in a subclass are not
|
|
253
|
+
* accessible during base-class constructor calls.
|
|
254
|
+
*
|
|
255
|
+
* `declare` ensures TypeScript does NOT emit a field initializer at runtime.
|
|
256
|
+
* Without `declare`, even `stmts!: Map<...>` emits `this.stmts = undefined`
|
|
257
|
+
* after super() returns, wiping what prepareStatements() stored. The Map
|
|
258
|
+
* is created inside prepareStatements() instead.
|
|
259
|
+
*/
|
|
260
|
+
private stmts;
|
|
261
|
+
constructor(opts?: {
|
|
262
|
+
dbPath?: string;
|
|
263
|
+
});
|
|
264
|
+
/** Shorthand to retrieve a cached statement. */
|
|
265
|
+
private stmt;
|
|
266
|
+
protected initSchema(): void;
|
|
267
|
+
protected prepareStatements(): void;
|
|
268
|
+
/**
|
|
269
|
+
* Insert a session event with deduplication and FIFO eviction.
|
|
270
|
+
*
|
|
271
|
+
* Deduplication: skips if the same type + data_hash appears in the
|
|
272
|
+
* last DEDUP_WINDOW events for this session.
|
|
273
|
+
*
|
|
274
|
+
* Eviction: if session exceeds MAX_EVENTS_PER_SESSION, evicts the
|
|
275
|
+
* lowest-priority (then oldest) event.
|
|
276
|
+
*/
|
|
277
|
+
insertEvent(sessionId: string, event: Omit<SessionEvent, "data_hash"> & {
|
|
278
|
+
data_hash?: string;
|
|
279
|
+
}, sourceHook?: string, attribution?: Partial<ProjectAttribution>, bytes?: EventBytes): void;
|
|
280
|
+
/**
|
|
281
|
+
* Bulk-insert N events in a SINGLE transaction.
|
|
282
|
+
*
|
|
283
|
+
* PostToolUse hooks emit 5–15 events per tool call. Calling insertEvent()
|
|
284
|
+
* in a loop runs N transactions = N WAL commits = N fsync candidates,
|
|
285
|
+
* which is painful on Windows NTFS where commit latency dominates.
|
|
286
|
+
* One transaction = one commit, dedup/evict checks reuse cached statements.
|
|
287
|
+
*
|
|
288
|
+
* Cross-platform: uses the same WAL-mode transaction primitive as
|
|
289
|
+
* insertEvent — behavior identical on macOS / Linux / Windows.
|
|
290
|
+
*/
|
|
291
|
+
bulkInsertEvents(sessionId: string, events: SessionEvent[], sourceHook?: string, attributions?: Array<Partial<ProjectAttribution> | undefined>, bytesList?: Array<EventBytes | undefined>): void;
|
|
292
|
+
/**
|
|
293
|
+
* Retrieve events for a session with optional filtering.
|
|
294
|
+
*/
|
|
295
|
+
getEvents(sessionId: string, opts?: {
|
|
296
|
+
type?: string;
|
|
297
|
+
minPriority?: number;
|
|
298
|
+
limit?: number;
|
|
299
|
+
}): StoredEvent[];
|
|
300
|
+
/**
|
|
301
|
+
* Get the total event count for a session.
|
|
302
|
+
*/
|
|
303
|
+
getEventCount(sessionId: string): number;
|
|
304
|
+
/**
|
|
305
|
+
* Aggregate per-event byte accounting for a session.
|
|
306
|
+
*
|
|
307
|
+
* Returns the total bytes context-mode kept OUT of the model context
|
|
308
|
+
* window (`bytesAvoided`) and the total it actually returned to the
|
|
309
|
+
* model (`bytesReturned`). Both default to 0 for unknown sessions.
|
|
310
|
+
*
|
|
311
|
+
* Used by the Insight dashboard to render the "saved vs returned"
|
|
312
|
+
* panel without scanning every event row in JS.
|
|
313
|
+
*/
|
|
314
|
+
getEventBytesSummary(sessionId: string): {
|
|
315
|
+
bytesAvoided: number;
|
|
316
|
+
bytesReturned: number;
|
|
317
|
+
};
|
|
318
|
+
/**
|
|
319
|
+
* Return the most recently attributed project dir for a session.
|
|
320
|
+
*/
|
|
321
|
+
getLatestAttributedProjectDir(sessionId: string): string | null;
|
|
322
|
+
/**
|
|
323
|
+
* Look up the project_dir from session_meta as a last-resort fallback
|
|
324
|
+
* for event attribution. Prevents project_dir='' orphans when the caller
|
|
325
|
+
* (e.g. pi adapter) omits the attribution parameter.
|
|
326
|
+
*/
|
|
327
|
+
_getSessionProjectDir(sessionId: string): string;
|
|
328
|
+
/**
|
|
329
|
+
* Search events by text query scoped to a project directory.
|
|
330
|
+
*
|
|
331
|
+
* Performs a case-insensitive LIKE search across the `data` and `category`
|
|
332
|
+
* columns. An optional `source` parameter filters by exact category match.
|
|
333
|
+
* Returns results ordered by monotonic id (chronological).
|
|
334
|
+
*
|
|
335
|
+
* Best-effort: returns empty array on any error.
|
|
336
|
+
*/
|
|
337
|
+
searchEvents(query: string, limit: number, projectDir: string, source?: string): Array<{
|
|
338
|
+
id: number;
|
|
339
|
+
session_id: string;
|
|
340
|
+
category: string;
|
|
341
|
+
type: string;
|
|
342
|
+
data: string;
|
|
343
|
+
created_at: string;
|
|
344
|
+
}>;
|
|
345
|
+
/**
|
|
346
|
+
* Return the distinct list of session ids whose events were attributed
|
|
347
|
+
* to a given `project_dir`. Powers the ctx_search `project:` filter
|
|
348
|
+
* (#737) via the 2-step IN-clause strategy — ATTACH DATABASE is avoided
|
|
349
|
+
* because SQLite's WAL + ATTACH combination has known correctness
|
|
350
|
+
* trade-offs flagged in the upstream docs.
|
|
351
|
+
*
|
|
352
|
+
* Backed by the `idx_session_events_project(session_id, project_dir)`
|
|
353
|
+
* composite index, so 1000-session lookups complete in single-digit
|
|
354
|
+
* milliseconds. Best-effort: returns `[]` on any error.
|
|
355
|
+
*/
|
|
356
|
+
getSessionIdsForProject(projectDir: string): string[];
|
|
357
|
+
/**
|
|
358
|
+
* Ensure a session metadata entry exists. Idempotent (INSERT OR IGNORE).
|
|
359
|
+
* `projectDir` is the session origin directory, not per-event attribution.
|
|
360
|
+
*/
|
|
361
|
+
ensureSession(sessionId: string, projectDir: string): void;
|
|
362
|
+
/**
|
|
363
|
+
* Get session statistics/metadata.
|
|
364
|
+
*/
|
|
365
|
+
getSessionStats(sessionId: string): SessionMeta | null;
|
|
366
|
+
/**
|
|
367
|
+
* Session rollup snapshot — 12 aggregate fields the analytics platform
|
|
368
|
+
* stamps onto every outgoing event row (seed.ts shape parity).
|
|
369
|
+
*
|
|
370
|
+
* Called from session-loaders BEFORE `maybeForward`; the snapshot is
|
|
371
|
+
* computed against the LOCAL SessionDB and threaded into the canonical
|
|
372
|
+
* event so the platform-side Zod schema receives the rich shape without
|
|
373
|
+
* the bridge ever hand-mapping fields (PRD §5.4 ABI passthrough).
|
|
374
|
+
*
|
|
375
|
+
* Returns zeroed defaults for unknown sessions — callers MUST tolerate
|
|
376
|
+
* a snapshot from an empty session (first event into a fresh DB).
|
|
377
|
+
*/
|
|
378
|
+
getSessionRollup(sessionId: string): SessionRollup;
|
|
379
|
+
/**
|
|
380
|
+
* Increment the compact_count for a session (tracks snapshot rebuilds).
|
|
381
|
+
*/
|
|
382
|
+
incrementCompactCount(sessionId: string): void;
|
|
383
|
+
/**
|
|
384
|
+
* Read the per-session usage high-water cursor — the uuid of the last
|
|
385
|
+
* assistant turn already emitted by the Stop hook's main-turn capture.
|
|
386
|
+
* Returns null when unset (first Stop) or the session row is absent.
|
|
387
|
+
*/
|
|
388
|
+
getUsageCursor(sessionId: string): string | null;
|
|
389
|
+
/**
|
|
390
|
+
* Advance the per-session usage high-water cursor to `uuid`. No-op when the
|
|
391
|
+
* session_meta row does not exist yet (callers ensureSession first).
|
|
392
|
+
*/
|
|
393
|
+
setUsageCursor(sessionId: string, uuid: string): void;
|
|
394
|
+
/**
|
|
395
|
+
* Upsert a resume snapshot for a session. Resets consumed flag on update.
|
|
396
|
+
*/
|
|
397
|
+
upsertResume(sessionId: string, snapshot: string, eventCount?: number): void;
|
|
398
|
+
/**
|
|
399
|
+
* Retrieve the resume snapshot for a session.
|
|
400
|
+
*/
|
|
401
|
+
getResume(sessionId: string): ResumeRow | null;
|
|
402
|
+
/**
|
|
403
|
+
* Mark the resume snapshot as consumed (already injected into conversation).
|
|
404
|
+
*/
|
|
405
|
+
markResumeConsumed(sessionId: string): void;
|
|
406
|
+
/**
|
|
407
|
+
* Atomically claim the most recent unconsumed resume snapshot in this DB,
|
|
408
|
+
* EXCLUDING any row that belongs to `currentSessionId`.
|
|
409
|
+
*
|
|
410
|
+
* `SessionDB` is sharded per project (see `resolveSessionDbPath` — SHA-256
|
|
411
|
+
* of canonical project dir), so "this DB" already implies "this project".
|
|
412
|
+
* The atomic
|
|
413
|
+
* `UPDATE … RETURNING` ensures concurrent processes for the same project
|
|
414
|
+
* cannot both inject the same snapshot (Mickey / PR #376 race).
|
|
415
|
+
*
|
|
416
|
+
* The `currentSessionId` parameter prevents self-injection: when a session
|
|
417
|
+
* compacts mid-flight and produces its own row, that session's next chat
|
|
418
|
+
* turn must NOT claim that row back (wasted tokens AND it would consume
|
|
419
|
+
* the snapshot meant for the next fresh session).
|
|
420
|
+
*
|
|
421
|
+
* Pass an empty string to allow self-claim (legacy behaviour, only useful
|
|
422
|
+
* in tests or one-off harnesses).
|
|
423
|
+
*
|
|
424
|
+
* Returns null when no unconsumed snapshot exists for any other session.
|
|
425
|
+
*/
|
|
426
|
+
claimLatestUnconsumedResume(currentSessionId: string): {
|
|
427
|
+
sessionId: string;
|
|
428
|
+
snapshot: string;
|
|
429
|
+
} | null;
|
|
430
|
+
/**
|
|
431
|
+
* Return the most recent session_id from session_meta, or null if none.
|
|
432
|
+
* Used by the runtime to attach persistent counters to the right session
|
|
433
|
+
* after a process restart.
|
|
434
|
+
*/
|
|
435
|
+
getLatestSessionId(): string | null;
|
|
436
|
+
/**
|
|
437
|
+
* Increment the persistent tool-call counter for `tool` in `sessionId`.
|
|
438
|
+
* Adds `bytesReturned` to the cumulative total. Idempotent across
|
|
439
|
+
* SessionDB instances — counters survive process restart.
|
|
440
|
+
*/
|
|
441
|
+
incrementToolCall(sessionId: string, tool: string, bytesReturned?: number): void;
|
|
442
|
+
/**
|
|
443
|
+
* Get aggregated tool-call stats for `sessionId`. Returns zero-stats
|
|
444
|
+
* when the session has no recorded calls.
|
|
445
|
+
*/
|
|
446
|
+
getToolCallStats(sessionId: string): ToolCallStats;
|
|
447
|
+
/**
|
|
448
|
+
* Delete all data for a session (events, meta, resume).
|
|
449
|
+
*/
|
|
450
|
+
deleteSession(sessionId: string): void;
|
|
451
|
+
/**
|
|
452
|
+
* Remove sessions older than maxAgeDays. Returns the count of deleted sessions.
|
|
453
|
+
*/
|
|
454
|
+
cleanupOldSessions(maxAgeDays?: number): number;
|
|
455
|
+
/**
|
|
456
|
+
* Delete event rows whose session_id has no matching session_meta row.
|
|
457
|
+
*
|
|
458
|
+
* Orphaned events accumulate when meta rows were aged out by an older
|
|
459
|
+
* version of `cleanupOldSessions` but the matching events were left
|
|
460
|
+
* behind (or when callers wrote events without a meta upsert). The Kimi
|
|
461
|
+
* Code sessionstart hook calls this on every startup as a self-healing
|
|
462
|
+
* step; surfacing it as a SessionDB method keeps the SQL definition in
|
|
463
|
+
* one place instead of letting hook scripts reach through to
|
|
464
|
+
* `db.db.exec(...)` and re-encode schema knowledge in mjs files.
|
|
465
|
+
*/
|
|
466
|
+
pruneOrphanedEvents(): number;
|
|
467
|
+
}
|
|
468
|
+
export {};
|