squish-memory 1.0.2 → 1.1.5
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/.env.example +130 -0
- package/CHANGELOG.md +55 -0
- package/README.md +150 -287
- package/config/hooks/claude-code-hooks.json +39 -0
- package/config/hooks/cursor-hooks.json +30 -0
- package/config/hooks/opencode-hooks.json +30 -0
- package/config/hooks/windsurf-hooks.json +30 -0
- package/config/mcp-mode-semantics.json +23 -21
- package/config/plugin-manifest.json +101 -152
- package/{plugin.json → config/plugin.json} +2 -2
- package/config/settings.json +52 -51
- package/{commands → core/commands}/init.md +39 -39
- package/dist/config.d.ts +28 -4
- package/dist/config.js +97 -29
- package/dist/core/adapters/config/claude-code.d.ts +45 -0
- package/dist/core/adapters/config/claude-code.js +113 -0
- package/dist/core/adapters/config/cursor.d.ts +26 -0
- package/dist/core/adapters/config/cursor.js +74 -0
- package/dist/core/adapters/config/opencode.d.ts +23 -0
- package/dist/core/adapters/config/opencode.js +73 -0
- package/dist/core/adapters/config/windsurf.d.ts +26 -0
- package/dist/core/adapters/config/windsurf.js +74 -0
- package/dist/core/adapters/index.d.ts +45 -0
- package/dist/core/adapters/index.js +84 -0
- package/dist/core/adapters/scripts/install-adapter.d.ts +19 -0
- package/dist/core/adapters/scripts/install-adapter.js +149 -0
- package/dist/core/adapters/timeline.d.ts +23 -0
- package/dist/core/adapters/timeline.js +88 -0
- package/dist/core/adapters/types.d.ts +157 -0
- package/dist/core/adapters/types.js +50 -0
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/analytics/token-estimator.js +3 -3
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/semantic-ranker.js +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/detection/two-stage-detector.js +7 -10
- package/dist/{algorithms → core/algorithms}/handlers/approve-merge.js +4 -4
- package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/get-stats.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/list-proposals.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/preview-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reject-merge.js +3 -3
- package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.js +3 -3
- package/dist/core/algorithms/index.d.ts +21 -0
- package/dist/core/algorithms/index.js +26 -0
- package/dist/core/algorithms/operations/cache-maintenance.d.ts +12 -0
- package/dist/core/algorithms/operations/cache-maintenance.js +157 -0
- package/dist/{algorithms → core/algorithms}/safety/safety-checks.d.ts +1 -1
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.d.ts +19 -1
- package/dist/{algorithms → core/algorithms}/strategies/merge-strategies.js +74 -123
- package/dist/core/algorithms/types.d.ts +133 -0
- package/dist/core/algorithms/types.js +5 -0
- package/dist/core/associations.d.ts +1 -2
- package/dist/core/associations.js +1 -2
- package/dist/core/autosave.d.ts +19 -0
- package/dist/core/autosave.js +16 -0
- package/dist/{commands → core/commands}/managed-sync.js +5 -5
- package/dist/core/commands/mcp-server.js +739 -0
- package/dist/core/context/agent-context.d.ts +106 -0
- package/dist/core/context/agent-context.js +274 -0
- package/dist/core/{context-paging.d.ts → context/context-paging.d.ts} +2 -12
- package/dist/core/{context-paging.js → context/context-paging.js} +19 -39
- package/dist/core/context/context-window.d.ts +40 -0
- package/dist/core/context/context-window.js +177 -0
- package/dist/core/context/context.js +22 -0
- package/dist/core/embeddings.d.ts +1 -1
- package/dist/core/embeddings.js +54 -2
- package/dist/core/error-handling.d.ts +63 -0
- package/dist/core/error-handling.js +173 -0
- package/dist/core/external-folder/index.d.ts +102 -0
- package/dist/core/external-folder/index.js +294 -0
- package/dist/core/hooks/agent-hooks.d.ts +74 -0
- package/dist/core/hooks/agent-hooks.js +244 -0
- package/dist/core/hooks/auto-tagger.d.ts +19 -0
- package/dist/core/hooks/auto-tagger.js +155 -0
- package/dist/core/hooks/capture-filter.d.ts +41 -0
- package/dist/core/hooks/capture-filter.js +128 -0
- package/dist/core/index.d.ts +6 -6
- package/dist/core/index.js +6 -6
- package/dist/core/{agent-memory.js → ingestion/agent-memory.js} +5 -7
- package/dist/core/{core-memory.js → ingestion/core-memory.js} +4 -4
- package/dist/core/ingestion/learnings.d.ts +57 -0
- package/dist/core/ingestion/learnings.js +202 -0
- package/dist/core/lib/db-client.d.ts +114 -0
- package/dist/core/lib/db-client.js +130 -0
- package/dist/core/lib/schemas.d.ts +129 -0
- package/dist/core/lib/schemas.js +87 -0
- package/dist/core/{utils.d.ts → lib/utils.d.ts} +1 -0
- package/dist/core/{utils.js → lib/utils.js} +31 -15
- package/dist/core/lib/validation.d.ts +38 -0
- package/dist/core/lib/validation.js +151 -0
- package/dist/core/lifecycle.d.ts +7 -0
- package/dist/core/lifecycle.js +140 -20
- package/dist/core/local-embeddings.d.ts +6 -1
- package/dist/core/local-embeddings.js +6 -15
- package/dist/core/logger.js +7 -1
- package/dist/core/mcp/tools.js +35 -3
- package/dist/core/memory/categorizer.js +1 -0
- package/dist/core/memory/conflict-detector.js +1 -1
- package/dist/core/memory/consolidation.d.ts +1 -10
- package/dist/core/memory/consolidation.js +2 -11
- package/dist/core/memory/context-collector.js +1 -1
- package/dist/core/memory/edit-workflow.js +1 -1
- package/dist/core/memory/entity-resolver.js +7 -7
- package/dist/core/memory/fact-extractor.js +12 -12
- package/dist/core/memory/feedback-tracker.js +1 -1
- package/dist/core/memory/hooks.d.ts +88 -0
- package/dist/core/memory/hooks.js +174 -0
- package/dist/core/memory/hybrid-retrieval.js +2 -2
- package/dist/core/memory/hybrid-search.d.ts +1 -6
- package/dist/core/memory/hybrid-search.js +70 -84
- package/dist/core/memory/importance.d.ts +8 -13
- package/dist/core/memory/importance.js +47 -74
- package/dist/core/memory/loader.d.ts +31 -0
- package/dist/core/memory/loader.js +141 -0
- package/dist/core/memory/markdown/markdown-storage.d.ts +72 -0
- package/dist/core/memory/markdown/markdown-storage.js +243 -0
- package/dist/core/memory/memories.d.ts +12 -4
- package/dist/core/memory/memories.js +192 -180
- package/dist/core/memory/memory-lifecycle.d.ts +8 -0
- package/dist/core/memory/memory-lifecycle.js +55 -0
- package/dist/core/memory/migrate.d.ts +21 -0
- package/dist/core/memory/migrate.js +134 -0
- package/dist/core/memory/normalization.d.ts +22 -0
- package/dist/core/memory/normalization.js +26 -0
- package/dist/core/memory/progressive-disclosure.js +1 -1
- package/dist/core/memory/query-rewriter.js +9 -9
- package/dist/core/memory/serialization.d.ts +4 -0
- package/dist/core/memory/serialization.js +49 -0
- package/dist/core/memory/stats.d.ts +5 -0
- package/dist/core/memory/stats.js +63 -12
- package/dist/core/memory/temporal-facts.js +21 -0
- package/dist/core/memory/write-gate.js +1 -1
- package/dist/core/obsidian-vault.d.ts +30 -0
- package/dist/core/obsidian-vault.js +94 -0
- package/dist/core/places/index.d.ts +14 -0
- package/dist/core/places/index.js +14 -0
- package/dist/core/places/memory-places.d.ts +68 -0
- package/dist/core/places/memory-places.js +261 -0
- package/dist/core/places/places.d.ts +88 -0
- package/dist/core/places/places.js +314 -0
- package/dist/core/places/rules.d.ts +74 -0
- package/dist/core/places/rules.js +240 -0
- package/dist/core/places/walking.d.ts +56 -0
- package/dist/core/places/walking.js +121 -0
- package/dist/core/projects.d.ts +5 -0
- package/dist/core/projects.js +39 -18
- package/dist/core/responses.d.ts +96 -0
- package/dist/core/responses.js +122 -0
- package/dist/core/scheduler/cron-scheduler.js +29 -7
- package/dist/core/scheduler/index.d.ts +1 -1
- package/dist/core/scheduler/index.js +1 -1
- package/dist/core/scheduler/job-runner.js +1 -1
- package/dist/core/search/conversations.js +40 -42
- package/dist/core/search/entities.js +6 -9
- package/dist/core/search/graph-boost.d.ts +7 -0
- package/dist/core/search/graph-boost.js +23 -0
- package/dist/core/search/qmd-search.js +4 -4
- package/dist/core/security/encrypt.d.ts +6 -0
- package/dist/core/security/encrypt.js +47 -0
- package/dist/core/{governance.d.ts → security/governance.d.ts} +6 -1
- package/dist/core/security/governance.js +79 -0
- package/dist/core/session/auto-load.js +6 -6
- package/dist/core/session/index.d.ts +1 -1
- package/dist/core/session/index.js +1 -1
- package/dist/core/session/self-iteration-job.d.ts +20 -0
- package/dist/core/session/self-iteration-job.js +282 -0
- package/dist/core/session/session-hooks.d.ts +18 -0
- package/dist/core/session/session-hooks.js +58 -0
- package/dist/core/session-hooks/self-iteration-job.js +35 -35
- package/dist/core/{cache.js → storage/cache.js} +2 -2
- package/dist/core/sync/qmd-sync.d.ts +1 -13
- package/dist/core/sync/qmd-sync.js +1 -13
- package/dist/core/toon.d.ts +43 -0
- package/dist/core/toon.js +160 -0
- package/dist/core/utils/memory-operations.js +1 -1
- package/dist/core/utils/vector-operations.d.ts +71 -0
- package/dist/core/utils/vector-operations.js +129 -0
- package/dist/db/adapter.d.ts +3 -3
- package/dist/db/adapter.js +99 -88
- package/dist/db/bootstrap.js +820 -522
- package/dist/{drizzle → db/drizzle}/schema-sqlite.d.ts +74 -25
- package/dist/{drizzle → db/drizzle}/schema-sqlite.js +91 -24
- package/dist/{drizzle → db/drizzle}/schema.d.ts +79 -32
- package/dist/{drizzle → db/drizzle}/schema.js +106 -35
- package/dist/db/drizzle.config.d.ts +3 -0
- package/dist/db/drizzle.config.js +12 -0
- package/dist/db/index.d.ts +1 -5
- package/dist/db/index.js +51 -8
- package/dist/db/neon.d.ts +8 -0
- package/dist/db/neon.js +20 -0
- package/dist/db/schema/index.d.ts +40 -0
- package/dist/db/schema/index.js +105 -0
- package/dist/db/schema/tables/context-sessions.d.ts +9 -0
- package/dist/db/schema/tables/context-sessions.js +37 -0
- package/dist/db/schema/tables/conversations.d.ts +9 -0
- package/dist/db/schema/tables/conversations.js +47 -0
- package/dist/db/schema/tables/core-memory.d.ts +9 -0
- package/dist/db/schema/tables/core-memory.js +41 -0
- package/dist/db/schema/tables/entities.d.ts +9 -0
- package/dist/db/schema/tables/entities.js +39 -0
- package/dist/db/schema/tables/entity-relations.d.ts +9 -0
- package/dist/db/schema/tables/entity-relations.js +31 -0
- package/dist/db/schema/tables/learnings.d.ts +9 -0
- package/dist/db/schema/tables/learnings.js +66 -0
- package/dist/db/schema/tables/memories.d.ts +9 -0
- package/dist/db/schema/tables/memories.js +161 -0
- package/dist/db/schema/tables/memory-associations.d.ts +9 -0
- package/dist/db/schema/tables/memory-associations.js +39 -0
- package/dist/db/schema/tables/memory-hash-cache.d.ts +9 -0
- package/dist/db/schema/tables/memory-hash-cache.js +29 -0
- package/dist/db/schema/tables/memory-merge-history.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-history.js +33 -0
- package/dist/db/schema/tables/memory-merge-proposals.d.ts +9 -0
- package/dist/db/schema/tables/memory-merge-proposals.js +39 -0
- package/dist/db/schema/tables/messages.d.ts +9 -0
- package/dist/db/schema/tables/messages.js +41 -0
- package/dist/db/schema/tables/namespaces.d.ts +9 -0
- package/dist/db/schema/tables/namespaces.js +37 -0
- package/dist/db/schema/tables/projects.d.ts +9 -0
- package/dist/db/schema/tables/projects.js +31 -0
- package/dist/db/schema/tables/users.d.ts +9 -0
- package/dist/db/schema/tables/users.js +27 -0
- package/dist/db/schema.d.ts +1 -1
- package/dist/db/schema.js +2 -2
- package/dist/db/supabase.d.ts +9 -0
- package/dist/db/supabase.js +24 -0
- package/dist/index.d.ts +2 -14
- package/dist/index.js +1320 -640
- package/dist/vendor/sql.js/sql-wasm.wasm +0 -0
- package/dist/webui/server.d.ts +5 -0
- package/dist/{api/web/web.js → webui/server.js} +511 -508
- package/generated/mcp/manifest.json +1 -1
- package/{.mcp.json → mcp.json.example} +1 -1
- package/package.json +159 -181
- package/scripts/README.md +60 -0
- package/scripts/copy-runtime-assets.mjs +26 -0
- package/scripts/generate-mcp.mjs +264 -264
- package/scripts/github-release.sh +4 -4
- package/scripts/install-claude-code.sh +85 -0
- package/scripts/install-cursor.sh +56 -0
- package/scripts/install-hooks.sh +73 -0
- package/scripts/install-interactive.mjs +357 -677
- package/scripts/install-opencode.sh +75 -0
- package/scripts/install-windsurf.sh +67 -0
- package/skills/squish-memory/SKILL.md +104 -114
- package/skills/squish-memory/{install.mjs → scripts/install.mjs} +2 -2
- package/skills/squish-memory/{install.sh → scripts/install.sh} +2 -2
- package/skills/squish-memory/write_skill.js +2 -0
- package/.claude-plugin/marketplace.json +0 -20
- package/.claude-plugin/plugin.json +0 -32
- package/.env.mcp.example +0 -60
- package/QUICK-START.md +0 -71
- package/bin/squish-add.mjs +0 -32
- package/bin/squish-rm.mjs +0 -21
- package/commands/observe.md +0 -5
- package/dist/api/web/index.d.ts +0 -3
- package/dist/api/web/index.js +0 -4
- package/dist/api/web/web-server.d.ts +0 -3
- package/dist/api/web/web-server.js +0 -6
- package/dist/api/web/web.d.ts +0 -4
- package/dist/commands/mcp-server.js +0 -393
- package/dist/core/context.js +0 -24
- package/dist/core/governance.js +0 -64
- package/dist/core/observations.d.ts +0 -26
- package/dist/core/observations.js +0 -110
- package/dist/core/requirements.d.ts +0 -20
- package/dist/core/requirements.js +0 -35
- package/hooks/hooks.json +0 -52
- package/hooks/post-tool-use.js +0 -26
- package/hooks/session-end.js +0 -28
- package/hooks/session-start.js +0 -33
- package/hooks/user-prompt-submit.js +0 -26
- package/hooks/utils.js +0 -153
- package/npx-installer.js +0 -208
- package/packages/plugin-claude-code/README.md +0 -73
- package/packages/plugin-claude-code/dist/plugin-wrapper.d.ts +0 -35
- package/packages/plugin-claude-code/dist/plugin-wrapper.js +0 -191
- package/packages/plugin-claude-code/package.json +0 -31
- package/packages/plugin-openclaw/README.md +0 -70
- package/packages/plugin-openclaw/dist/index.d.ts +0 -49
- package/packages/plugin-openclaw/dist/index.js +0 -262
- package/packages/plugin-openclaw/openclaw.plugin.json +0 -94
- package/packages/plugin-openclaw/package.json +0 -31
- package/packages/plugin-opencode/install.mjs +0 -217
- package/packages/plugin-opencode/package.json +0 -21
- package/scripts/db/check-db.mjs +0 -88
- package/scripts/db/fix-all-columns.mjs +0 -52
- package/scripts/db/fix-schema-all.mjs +0 -55
- package/scripts/db/fix-schema-full.mjs +0 -46
- package/scripts/db/fix-schema.mjs +0 -38
- package/scripts/db/init-db.mjs +0 -13
- package/scripts/db/recreate-db.mjs +0 -14
- package/scripts/install-mcp.mjs +0 -116
- package/scripts/install-web.sh +0 -120
- package/scripts/install.mjs +0 -340
- package/scripts/openclaw-bootstrap.mjs +0 -127
- package/scripts/package-release.sh +0 -71
- package/scripts/test/test-all-systems.mjs +0 -139
- package/scripts/test/test-memory-system.mjs +0 -139
- package/scripts/test/test-v0.5.0.mjs +0 -210
- package/skills/memory-guide/SKILL.md +0 -332
- package/skills/squish-cli/SKILL.md +0 -240
- package/skills/squish-mcp/SKILL.md +0 -355
- package/skills/squish-memory/claude-desktop.json +0 -12
- package/skills/squish-memory/openclaw.json +0 -13
- package/skills/squish-memory/opencode.json +0 -14
- package/skills/squish-memory/skill.json +0 -32
- /package/{commands → core/commands}/context-paging.md +0 -0
- /package/{commands → core/commands}/context-status.md +0 -0
- /package/{commands → core/commands}/context.md +0 -0
- /package/{commands → core/commands}/core-memory.md +0 -0
- /package/{commands → core/commands}/health.md +0 -0
- /package/{commands → core/commands}/merge.md +0 -0
- /package/{commands → core/commands}/recall.md +0 -0
- /package/{commands → core/commands}/remember.md +0 -0
- /package/{commands → core/commands}/search.md +0 -0
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/detection/hash-filters.js +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/approve-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/detect-duplicates.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/get-stats.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/list-proposals.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/preview-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reject-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/handlers/reverse-merge.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/safety/safety-checks.js +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.d.ts +0 -0
- /package/dist/{algorithms → core/algorithms}/utils/response-builder.js +0 -0
- /package/dist/{commands → core/commands}/managed-sync.d.ts +0 -0
- /package/dist/{commands → core/commands}/mcp-server.d.ts +0 -0
- /package/dist/core/{context.d.ts → context/context.d.ts} +0 -0
- /package/dist/core/{agent-memory.d.ts → ingestion/agent-memory.d.ts} +0 -0
- /package/dist/core/{core-memory.d.ts → ingestion/core-memory.d.ts} +0 -0
- /package/dist/core/{privacy.d.ts → security/privacy.d.ts} +0 -0
- /package/dist/core/{privacy.js → security/privacy.js} +0 -0
- /package/dist/core/{secret-detector.d.ts → security/secret-detector.d.ts} +0 -0
- /package/dist/core/{secret-detector.js → security/secret-detector.js} +0 -0
- /package/dist/core/{cache.d.ts → storage/cache.d.ts} +0 -0
- /package/dist/core/{database.d.ts → storage/database.d.ts} +0 -0
- /package/dist/core/{database.js → storage/database.js} +0 -0
package/dist/db/adapter.js
CHANGED
|
@@ -1,10 +1,54 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
1
4
|
import { config, getDataDir } from '../config.js';
|
|
2
5
|
import { ensurePostgresSchema, ensureSqliteSchema } from './bootstrap.js';
|
|
3
6
|
import { logger } from '../core/logger.js';
|
|
7
|
+
const SQL_JS_WASM_RELATIVE_PATH = '../vendor/sql.js/sql-wasm.wasm';
|
|
8
|
+
function isBunRuntime() {
|
|
9
|
+
return typeof globalThis.Bun !== 'undefined';
|
|
10
|
+
}
|
|
11
|
+
function formatInitializationError(label, error) {
|
|
12
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
13
|
+
return `${label}: ${message}`;
|
|
14
|
+
}
|
|
15
|
+
function shouldPersistSql(query) {
|
|
16
|
+
return /^\s*(insert|update|delete|create|alter|drop|replace|pragma|begin|commit|rollback|vacuum|reindex)\b/i.test(query);
|
|
17
|
+
}
|
|
18
|
+
function persistSqlJsDatabase(sqlite, dbPath) {
|
|
19
|
+
fs.mkdirSync(path.dirname(dbPath), { recursive: true });
|
|
20
|
+
fs.writeFileSync(dbPath, Buffer.from(sqlite.export()));
|
|
21
|
+
}
|
|
22
|
+
function resolveSqlJsWasmPath() {
|
|
23
|
+
const currentDir = path.dirname(fileURLToPath(import.meta.url));
|
|
24
|
+
const candidates = [
|
|
25
|
+
path.resolve(currentDir, SQL_JS_WASM_RELATIVE_PATH),
|
|
26
|
+
path.resolve(currentDir, '../../node_modules/sql.js/dist/sql-wasm.wasm'),
|
|
27
|
+
path.resolve(process.cwd(), 'node_modules/sql.js/dist/sql-wasm.wasm'),
|
|
28
|
+
];
|
|
29
|
+
for (const candidate of candidates) {
|
|
30
|
+
if (fs.existsSync(candidate)) {
|
|
31
|
+
return candidate;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
throw new Error(`sql.js wasm asset not found. Looked in: ${candidates.join(', ')}`);
|
|
35
|
+
}
|
|
36
|
+
function wrapSqlJsStatement(stmt, sqlite, dbPath, query) {
|
|
37
|
+
const persistAfterRun = shouldPersistSql(query);
|
|
38
|
+
if (persistAfterRun && typeof stmt.run === 'function') {
|
|
39
|
+
const originalRun = stmt.run.bind(stmt);
|
|
40
|
+
stmt.run = (...args) => {
|
|
41
|
+
const result = originalRun(...args);
|
|
42
|
+
persistSqlJsDatabase(sqlite, dbPath);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return stmt;
|
|
47
|
+
}
|
|
4
48
|
async function createBunSqliteDb(dbPath) {
|
|
5
49
|
// @ts-ignore - bun:sqlite module not found in types but works at runtime
|
|
6
50
|
const { drizzle } = await import('drizzle-orm/bun-sqlite');
|
|
7
|
-
const schemaModule = await import('
|
|
51
|
+
const schemaModule = await import('./drizzle/schema-sqlite.js');
|
|
8
52
|
// Bun SQLite doesn't need file path for in-memory, but we'll use file path for persistence
|
|
9
53
|
// @ts-ignore - bun:sqlite module not found in types but works at runtime
|
|
10
54
|
const sqlite = new (await import('bun:sqlite')).default(dbPath);
|
|
@@ -25,7 +69,7 @@ export async function createDb() {
|
|
|
25
69
|
async function createPostgresDb() {
|
|
26
70
|
const { Pool } = await import('pg');
|
|
27
71
|
const { drizzle } = await import('drizzle-orm/node-postgres');
|
|
28
|
-
const schemaModule = await import('
|
|
72
|
+
const schemaModule = await import('./drizzle/schema.js');
|
|
29
73
|
const pool = new Pool({
|
|
30
74
|
connectionString: process.env.DATABASE_URL,
|
|
31
75
|
max: 20,
|
|
@@ -35,49 +79,46 @@ async function createPostgresDb() {
|
|
|
35
79
|
}
|
|
36
80
|
async function createSqliteDb() {
|
|
37
81
|
const dbPath = `${getDataDir()}/squish.db`;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return await createBunSqliteDb(dbPath);
|
|
41
|
-
}
|
|
42
|
-
catch (bunSqliteError) {
|
|
43
|
-
logger.warn('bun:sqlite failed, trying better-sqlite3', {
|
|
44
|
-
error: bunSqliteError.message
|
|
45
|
-
});
|
|
46
|
-
// Try better-sqlite3 second (best performance)
|
|
82
|
+
const errors = [];
|
|
83
|
+
if (isBunRuntime()) {
|
|
47
84
|
try {
|
|
48
|
-
return await
|
|
85
|
+
return await createBunSqliteDb(dbPath);
|
|
49
86
|
}
|
|
50
|
-
catch (
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
try {
|
|
56
|
-
return await createSqlJsDb(dbPath);
|
|
57
|
-
}
|
|
58
|
-
catch (sqlJsError) {
|
|
59
|
-
// All failed - this is critical, Squish cannot work without DB
|
|
60
|
-
logger.error('CRITICAL: SQLite database initialization failed', {
|
|
61
|
-
bunSqliteError: bunSqliteError.message,
|
|
62
|
-
betterSqliteError: betterSqliteError.message,
|
|
63
|
-
sqlJsError: sqlJsError.message
|
|
87
|
+
catch (error) {
|
|
88
|
+
errors.push(formatInitializationError('bun:sqlite', error));
|
|
89
|
+
if (process.env.DEBUG === 'true') {
|
|
90
|
+
logger.warn('bun:sqlite failed, trying Node-compatible drivers', {
|
|
91
|
+
error: error instanceof Error ? error.message : String(error),
|
|
64
92
|
});
|
|
65
|
-
throw new Error(`Squish requires SQLite to function. Database initialization failed.\n` +
|
|
66
|
-
`Primary error (bun:sqlite): ${bunSqliteError.message}\n` +
|
|
67
|
-
`Secondary error (better-sqlite3): ${betterSqliteError.message}\n` +
|
|
68
|
-
`Fallback error (sql.js): ${sqlJsError.message}\n\n` +
|
|
69
|
-
`Solutions:\n` +
|
|
70
|
-
`1. Install build tools: npm install -g windows-build-tools (Windows)\n` +
|
|
71
|
-
`2. Or use PostgreSQL instead by setting DATABASE_URL environment variable`);
|
|
72
93
|
}
|
|
73
94
|
}
|
|
74
95
|
}
|
|
96
|
+
try {
|
|
97
|
+
return await createBetterSqliteDb(dbPath);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
errors.push(formatInitializationError('better-sqlite3', error));
|
|
101
|
+
if (process.env.DEBUG === 'true') {
|
|
102
|
+
logger.warn('better-sqlite3 failed, trying sql.js fallback', {
|
|
103
|
+
error: error instanceof Error ? error.message : String(error),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
return await createSqlJsDb(dbPath);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
errors.push(formatInitializationError('sql.js', error));
|
|
112
|
+
}
|
|
113
|
+
logger.error('CRITICAL: SQLite database initialization failed', { errors });
|
|
114
|
+
throw new Error('Squish requires a working local SQLite driver. Initialization failed.\n' +
|
|
115
|
+
errors.map((entry, index) => `${index + 1}. ${entry}`).join('\n'));
|
|
75
116
|
}
|
|
76
117
|
async function createBetterSqliteDb(dbPath) {
|
|
77
118
|
const DatabaseModule = await import('better-sqlite3');
|
|
78
119
|
const Database = DatabaseModule.default;
|
|
79
120
|
const { drizzle } = await import('drizzle-orm/better-sqlite3');
|
|
80
|
-
const schemaModule = await import('
|
|
121
|
+
const schemaModule = await import('./drizzle/schema-sqlite.js');
|
|
81
122
|
const sqlite = new Database(dbPath);
|
|
82
123
|
// Enable foreign keys
|
|
83
124
|
sqlite.pragma('foreign_keys = ON');
|
|
@@ -89,73 +130,43 @@ async function createSqlJsDb(dbPath) {
|
|
|
89
130
|
// @ts-ignore - sql.js has no types but works fine
|
|
90
131
|
const initSqlJs = await import('sql.js');
|
|
91
132
|
const { drizzle } = await import('drizzle-orm/sql-js');
|
|
92
|
-
const schemaModule = await import('
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
|
|
133
|
+
const schemaModule = await import('./drizzle/schema-sqlite.js');
|
|
134
|
+
const wasmPath = resolveSqlJsWasmPath();
|
|
135
|
+
const SQL = await initSqlJs.default({
|
|
136
|
+
locateFile: (file) => (file.endsWith('.wasm') ? wasmPath : file),
|
|
137
|
+
});
|
|
96
138
|
let data;
|
|
97
|
-
// Try to load existing database
|
|
98
139
|
if (fs.existsSync(dbPath)) {
|
|
99
140
|
data = fs.readFileSync(dbPath);
|
|
100
141
|
}
|
|
101
142
|
const sqlite = new SQL.Database(data);
|
|
102
|
-
// Enable foreign keys
|
|
103
143
|
sqlite.exec('PRAGMA foreign_keys = ON');
|
|
104
|
-
// Schema bootstrap
|
|
105
144
|
await ensureSqliteSchema(sqlite);
|
|
106
|
-
|
|
145
|
+
persistSqlJsDatabase(sqlite, dbPath);
|
|
107
146
|
const originalExec = sqlite.exec.bind(sqlite);
|
|
108
|
-
sqlite.exec =
|
|
147
|
+
sqlite.exec = (...args) => {
|
|
148
|
+
const [query] = args;
|
|
109
149
|
const result = originalExec(...args);
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
150
|
+
if (typeof query === 'string' && shouldPersistSql(query)) {
|
|
151
|
+
persistSqlJsDatabase(sqlite, dbPath);
|
|
152
|
+
}
|
|
113
153
|
return result;
|
|
114
154
|
};
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
});
|
|
123
|
-
return preparedStatement;
|
|
124
|
-
};
|
|
125
|
-
preparedStatement.step = () => {
|
|
126
|
-
return stmt.step();
|
|
127
|
-
};
|
|
128
|
-
preparedStatement.getAsObject = () => {
|
|
129
|
-
return stmt.getAsObject();
|
|
130
|
-
};
|
|
131
|
-
preparedStatement.free = () => {
|
|
132
|
-
stmt.free();
|
|
133
|
-
};
|
|
134
|
-
preparedStatement.run = () => {
|
|
135
|
-
const result = stmt.step() ? { changes: sqlite.changes() } : { changes: 0 };
|
|
136
|
-
stmt.reset();
|
|
137
|
-
return result;
|
|
138
|
-
};
|
|
139
|
-
preparedStatement.get = (bindParams = []) => {
|
|
140
|
-
if (bindParams.length > 0) {
|
|
141
|
-
preparedStatement.bind(bindParams);
|
|
155
|
+
if (typeof sqlite.run === 'function') {
|
|
156
|
+
const originalRun = sqlite.run.bind(sqlite);
|
|
157
|
+
sqlite.run = (...args) => {
|
|
158
|
+
const [query] = args;
|
|
159
|
+
const result = originalRun(...args);
|
|
160
|
+
if (typeof query === 'string' && shouldPersistSql(query)) {
|
|
161
|
+
persistSqlJsDatabase(sqlite, dbPath);
|
|
142
162
|
}
|
|
143
|
-
|
|
144
|
-
stmt.reset();
|
|
145
|
-
return row;
|
|
146
|
-
};
|
|
147
|
-
preparedStatement.all = (bindParams = []) => {
|
|
148
|
-
if (bindParams.length > 0) {
|
|
149
|
-
preparedStatement.bind(bindParams);
|
|
150
|
-
}
|
|
151
|
-
const rows = [];
|
|
152
|
-
while (stmt.step()) {
|
|
153
|
-
rows.push(stmt.getAsObject());
|
|
154
|
-
}
|
|
155
|
-
stmt.reset();
|
|
156
|
-
return rows;
|
|
163
|
+
return result;
|
|
157
164
|
};
|
|
158
|
-
|
|
165
|
+
}
|
|
166
|
+
const originalPrepare = sqlite.prepare.bind(sqlite);
|
|
167
|
+
sqlite.prepare = (query, ...args) => {
|
|
168
|
+
const stmt = originalPrepare(query, ...args);
|
|
169
|
+
return wrapSqlJsStatement(stmt, sqlite, dbPath, query);
|
|
159
170
|
};
|
|
160
171
|
logger.info('SQLite initialized with sql.js (pure JavaScript fallback)');
|
|
161
172
|
return drizzle(sqlite, { schema: schemaModule });
|