synabun 1.3.0 → 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/CHANGELOG.md +205 -662
- package/LICENSE-COMMERCIAL.md +33 -0
- package/NOTICE +17 -0
- package/README.md +175 -853
- package/THIRD-PARTY-LICENSES.md +136 -0
- package/benchmarks/browser-live-results.json +79 -0
- package/benchmarks/browser-v2-results.json +258 -0
- package/benchmarks/fixtures/browser/README.md +57 -0
- package/benchmarks/fixtures/browser/page-state.json +132 -0
- package/benchmarks/fixtures/browser/social.json +92 -0
- package/benchmarks/fixtures/browser/target.json +319 -0
- package/benchmarks/fixtures/desktop/README.md +58 -0
- package/benchmarks/fixtures/desktop/abstention.json +59 -0
- package/benchmarks/fixtures/desktop/adversarial.json +22 -0
- package/benchmarks/fixtures/desktop/forbidden.json +93 -0
- package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
- package/benchmarks/fixtures/desktop/target.json +136 -0
- package/bin/synabun.js +30 -0
- package/docs/whatsapp.md +325 -0
- package/hooks/claude-code/post-plan.mjs +613 -391
- package/hooks/claude-code/post-remember.mjs +246 -122
- package/hooks/claude-code/pre-compact.mjs +171 -110
- package/hooks/claude-code/pre-task.mjs +133 -0
- package/hooks/claude-code/pre-websearch.mjs +15 -4
- package/hooks/claude-code/prompt-origin.mjs +94 -0
- package/hooks/claude-code/prompt-submit.mjs +1244 -861
- package/hooks/claude-code/session-start.mjs +114 -156
- package/hooks/claude-code/shared.mjs +1228 -368
- package/hooks/claude-code/state.mjs +167 -0
- package/hooks/claude-code/stop.mjs +515 -140
- package/hooks/claude-code/subagent-start.mjs +154 -0
- package/hooks/claude-code/subagent-stop.mjs +102 -0
- package/hooks/claude-code/task-gate.mjs +150 -0
- package/launcher.mjs +40 -0
- package/lib/claude-hooks.js +137 -0
- package/lib/claude-usage-audit.js +141 -0
- package/lib/client-config-repair.js +145 -0
- package/lib/data-home-migration.js +502 -0
- package/lib/desktop-pwa.js +206 -0
- package/lib/external-tools.js +221 -0
- package/lib/first-launch-protection.js +245 -0
- package/lib/packaged-runtime.js +110 -0
- package/lib/paths.d.ts +21 -0
- package/lib/paths.js +103 -0
- package/lib/start-launcher.js +1309 -0
- package/mcp-server/dist/config.d.ts +22 -0
- package/mcp-server/dist/config.d.ts.map +1 -0
- package/mcp-server/dist/config.js +109 -0
- package/mcp-server/dist/config.js.map +1 -0
- package/mcp-server/dist/http.d.ts +30 -0
- package/mcp-server/dist/http.d.ts.map +1 -0
- package/mcp-server/dist/http.js +276 -0
- package/mcp-server/dist/http.js.map +1 -0
- package/mcp-server/dist/index.d.ts +48 -0
- package/mcp-server/dist/index.d.ts.map +1 -0
- package/mcp-server/dist/index.js +538 -0
- package/mcp-server/dist/index.js.map +1 -0
- package/mcp-server/dist/preload-http.d.ts +3 -0
- package/mcp-server/dist/preload-http.d.ts.map +1 -0
- package/mcp-server/dist/preload-http.js +28 -0
- package/mcp-server/dist/preload-http.js.map +1 -0
- package/mcp-server/dist/preload.d.ts +3 -0
- package/mcp-server/dist/preload.d.ts.map +1 -0
- package/mcp-server/dist/preload.js +32 -0
- package/mcp-server/dist/preload.js.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
- package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
- package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
- package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
- package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/assistant-judgments.js +128 -0
- package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
- package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist-gate.js +344 -0
- package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/browser-assist.d.ts +104 -0
- package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-assist.js +282 -0
- package/mcp-server/dist/services/browser-assist.js.map +1 -0
- package/mcp-server/dist/services/browser-bench.d.ts +772 -0
- package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-bench.js +424 -0
- package/mcp-server/dist/services/browser-bench.js.map +1 -0
- package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
- package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-judgments.js +363 -0
- package/mcp-server/dist/services/browser-judgments.js.map +1 -0
- package/mcp-server/dist/services/browser-risk.d.ts +166 -0
- package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/browser-risk.js +458 -0
- package/mcp-server/dist/services/browser-risk.js.map +1 -0
- package/mcp-server/dist/services/categories.d.ts +61 -0
- package/mcp-server/dist/services/categories.d.ts.map +1 -0
- package/mcp-server/dist/services/categories.js +377 -0
- package/mcp-server/dist/services/categories.js.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
- package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
- package/mcp-server/dist/services/codex-config-heal.js +346 -0
- package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
- package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
- package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
- package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
- package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-assist.js +266 -0
- package/mcp-server/dist/services/desktop-assist.js.map +1 -0
- package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
- package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-bench.js +311 -0
- package/mcp-server/dist/services/desktop-bench.js.map +1 -0
- package/mcp-server/dist/services/desktop-client.d.ts +23 -0
- package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-client.js +79 -0
- package/mcp-server/dist/services/desktop-client.js.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
- package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-judgments.js +177 -0
- package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
- package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
- package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
- package/mcp-server/dist/services/desktop-risk.js +605 -0
- package/mcp-server/dist/services/desktop-risk.js.map +1 -0
- package/mcp-server/dist/services/discord.d.ts +112 -0
- package/mcp-server/dist/services/discord.d.ts.map +1 -0
- package/mcp-server/dist/services/discord.js +477 -0
- package/mcp-server/dist/services/discord.js.map +1 -0
- package/mcp-server/dist/services/edit-stale.d.ts +81 -0
- package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
- package/mcp-server/dist/services/edit-stale.js +358 -0
- package/mcp-server/dist/services/edit-stale.js.map +1 -0
- package/mcp-server/dist/services/embedding-service.d.ts +16 -0
- package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-service.js +126 -0
- package/mcp-server/dist/services/embedding-service.js.map +1 -0
- package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
- package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
- package/mcp-server/dist/services/embedding-worker.js +52 -0
- package/mcp-server/dist/services/embedding-worker.js.map +1 -0
- package/mcp-server/dist/services/fb-regions.d.ts +71 -0
- package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
- package/mcp-server/dist/services/fb-regions.js +211 -0
- package/mcp-server/dist/services/fb-regions.js.map +1 -0
- package/mcp-server/dist/services/file-checksums.d.ts +22 -0
- package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
- package/mcp-server/dist/services/file-checksums.js +55 -0
- package/mcp-server/dist/services/file-checksums.js.map +1 -0
- package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
- package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
- package/mcp-server/dist/services/file-excerpt.js +65 -0
- package/mcp-server/dist/services/file-excerpt.js.map +1 -0
- package/mcp-server/dist/services/identity.d.ts +124 -0
- package/mcp-server/dist/services/identity.d.ts.map +1 -0
- package/mcp-server/dist/services/identity.js +241 -0
- package/mcp-server/dist/services/identity.js.map +1 -0
- package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
- package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
- package/mcp-server/dist/services/local-embeddings.js +3 -0
- package/mcp-server/dist/services/local-embeddings.js.map +1 -0
- package/mcp-server/dist/services/memory-client.d.ts +4 -0
- package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-client.js +27 -0
- package/mcp-server/dist/services/memory-client.js.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
- package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
- package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
- package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
- package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-judgments.js +674 -0
- package/mcp-server/dist/services/memory-judgments.js.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
- package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-maintenance.js +403 -0
- package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
- package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-retrieval.js +412 -0
- package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
- package/mcp-server/dist/services/memory-schema.d.ts +16 -0
- package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-schema.js +282 -0
- package/mcp-server/dist/services/memory-schema.js.map +1 -0
- package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
- package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-sessions.js +110 -0
- package/mcp-server/dist/services/memory-sessions.js.map +1 -0
- package/mcp-server/dist/services/memory-triage.d.ts +60 -0
- package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-triage.js +189 -0
- package/mcp-server/dist/services/memory-triage.js.map +1 -0
- package/mcp-server/dist/services/memory-verification.d.ts +24 -0
- package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-verification.js +92 -0
- package/mcp-server/dist/services/memory-verification.js.map +1 -0
- package/mcp-server/dist/services/memory-writer.d.ts +26 -0
- package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
- package/mcp-server/dist/services/memory-writer.js +126 -0
- package/mcp-server/dist/services/memory-writer.js.map +1 -0
- package/mcp-server/dist/services/neural-interface.d.ts +439 -0
- package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
- package/mcp-server/dist/services/neural-interface.js +1135 -0
- package/mcp-server/dist/services/neural-interface.js.map +1 -0
- package/mcp-server/dist/services/profiles.d.ts +120 -0
- package/mcp-server/dist/services/profiles.d.ts.map +1 -0
- package/mcp-server/dist/services/profiles.js +387 -0
- package/mcp-server/dist/services/profiles.js.map +1 -0
- package/mcp-server/dist/services/secret-gate.d.ts +29 -0
- package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
- package/mcp-server/dist/services/secret-gate.js +43 -0
- package/mcp-server/dist/services/secret-gate.js.map +1 -0
- package/mcp-server/dist/services/server-instructions.d.ts +10 -0
- package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
- package/mcp-server/dist/services/server-instructions.js +101 -0
- package/mcp-server/dist/services/server-instructions.js.map +1 -0
- package/mcp-server/dist/services/sqlite.d.ts +235 -0
- package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
- package/mcp-server/dist/services/sqlite.js +1185 -0
- package/mcp-server/dist/services/sqlite.js.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
- package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-bench.js +218 -0
- package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
- package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
- package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe-config.js +746 -0
- package/mcp-server/dist/services/typesafe-config.js.map +1 -0
- package/mcp-server/dist/services/typesafe.d.ts +213 -0
- package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
- package/mcp-server/dist/services/typesafe.js +330 -0
- package/mcp-server/dist/services/typesafe.js.map +1 -0
- package/mcp-server/dist/services/vector-cache.d.ts +68 -0
- package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
- package/mcp-server/dist/services/vector-cache.js +271 -0
- package/mcp-server/dist/services/vector-cache.js.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
- package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
- package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
- package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
- package/mcp-server/dist/tools/agents.d.ts +212 -0
- package/mcp-server/dist/tools/agents.d.ts.map +1 -0
- package/mcp-server/dist/tools/agents.js +407 -0
- package/mcp-server/dist/tools/agents.js.map +1 -0
- package/mcp-server/dist/tools/bluesky.d.ts +39 -0
- package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
- package/mcp-server/dist/tools/bluesky.js +1144 -0
- package/mcp-server/dist/tools/bluesky.js.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
- package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-advanced.js +106 -0
- package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
- package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
- package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-batch.js +187 -0
- package/mcp-server/dist/tools/browser-batch.js.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
- package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
- package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
- package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
- package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-interact.js +300 -0
- package/mcp-server/dist/tools/browser-interact.js.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
- package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-navigate.js +142 -0
- package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
- package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
- package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser-observe.js +2009 -0
- package/mcp-server/dist/tools/browser-observe.js.map +1 -0
- package/mcp-server/dist/tools/browser.d.ts +34 -0
- package/mcp-server/dist/tools/browser.d.ts.map +1 -0
- package/mcp-server/dist/tools/browser.js +112 -0
- package/mcp-server/dist/tools/browser.js.map +1 -0
- package/mcp-server/dist/tools/card-tools.d.ts +82 -0
- package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/card-tools.js +137 -0
- package/mcp-server/dist/tools/card-tools.js.map +1 -0
- package/mcp-server/dist/tools/card.d.ts +8 -0
- package/mcp-server/dist/tools/card.d.ts.map +1 -0
- package/mcp-server/dist/tools/card.js +16 -0
- package/mcp-server/dist/tools/card.js.map +1 -0
- package/mcp-server/dist/tools/category.d.ts +32 -0
- package/mcp-server/dist/tools/category.d.ts.map +1 -0
- package/mcp-server/dist/tools/category.js +290 -0
- package/mcp-server/dist/tools/category.js.map +1 -0
- package/mcp-server/dist/tools/choice.d.ts +160 -0
- package/mcp-server/dist/tools/choice.d.ts.map +1 -0
- package/mcp-server/dist/tools/choice.js +80 -0
- package/mcp-server/dist/tools/choice.js.map +1 -0
- package/mcp-server/dist/tools/computer.d.ts +71 -0
- package/mcp-server/dist/tools/computer.d.ts.map +1 -0
- package/mcp-server/dist/tools/computer.js +174 -0
- package/mcp-server/dist/tools/computer.js.map +1 -0
- package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
- package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-channel.js +236 -0
- package/mcp-server/dist/tools/discord-channel.js.map +1 -0
- package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
- package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-guild.js +138 -0
- package/mcp-server/dist/tools/discord-guild.js.map +1 -0
- package/mcp-server/dist/tools/discord-member.d.ts +26 -0
- package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-member.js +122 -0
- package/mcp-server/dist/tools/discord-member.js.map +1 -0
- package/mcp-server/dist/tools/discord-message.d.ts +36 -0
- package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-message.js +184 -0
- package/mcp-server/dist/tools/discord-message.js.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
- package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-onboarding.js +179 -0
- package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
- package/mcp-server/dist/tools/discord-role.d.ts +34 -0
- package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-role.js +178 -0
- package/mcp-server/dist/tools/discord-role.js.map +1 -0
- package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
- package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-thread.js +88 -0
- package/mcp-server/dist/tools/discord-thread.js.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
- package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord-webhook.js +154 -0
- package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
- package/mcp-server/dist/tools/discord.d.ts +7 -0
- package/mcp-server/dist/tools/discord.d.ts.map +1 -0
- package/mcp-server/dist/tools/discord.js +25 -0
- package/mcp-server/dist/tools/discord.js.map +1 -0
- package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
- package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
- package/mcp-server/dist/tools/fb-groups.js +369 -0
- package/mcp-server/dist/tools/fb-groups.js.map +1 -0
- package/mcp-server/dist/tools/forget.d.ts +14 -0
- package/mcp-server/dist/tools/forget.d.ts.map +1 -0
- package/mcp-server/dist/tools/forget.js +26 -0
- package/mcp-server/dist/tools/forget.js.map +1 -0
- package/mcp-server/dist/tools/git-tools.d.ts +24 -0
- package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/git-tools.js +107 -0
- package/mcp-server/dist/tools/git-tools.js.map +1 -0
- package/mcp-server/dist/tools/git.d.ts +7 -0
- package/mcp-server/dist/tools/git.d.ts.map +1 -0
- package/mcp-server/dist/tools/git.js +11 -0
- package/mcp-server/dist/tools/git.js.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
- package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/experience.js +351 -0
- package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/helpers.js +258 -0
- package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
- package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/indexing.js +357 -0
- package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
- package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/inspect.js +321 -0
- package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
- package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/navigate.js +197 -0
- package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
- package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/performance.js +274 -0
- package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
- package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc/settings.js +425 -0
- package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
- package/mcp-server/dist/tools/gsc.d.ts +7 -0
- package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
- package/mcp-server/dist/tools/gsc.js +51 -0
- package/mcp-server/dist/tools/gsc.js.map +1 -0
- package/mcp-server/dist/tools/image-tools.d.ts +24 -0
- package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/image-tools.js +80 -0
- package/mcp-server/dist/tools/image-tools.js.map +1 -0
- package/mcp-server/dist/tools/image.d.ts +10 -0
- package/mcp-server/dist/tools/image.d.ts.map +1 -0
- package/mcp-server/dist/tools/image.js +14 -0
- package/mcp-server/dist/tools/image.js.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
- package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
- package/mcp-server/dist/tools/leonardo.d.ts +13 -0
- package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
- package/mcp-server/dist/tools/leonardo.js +21 -0
- package/mcp-server/dist/tools/leonardo.js.map +1 -0
- package/mcp-server/dist/tools/loop.d.ts +30 -0
- package/mcp-server/dist/tools/loop.d.ts.map +1 -0
- package/mcp-server/dist/tools/loop.js +401 -0
- package/mcp-server/dist/tools/loop.js.map +1 -0
- package/mcp-server/dist/tools/memories.d.ts +56 -0
- package/mcp-server/dist/tools/memories.d.ts.map +1 -0
- package/mcp-server/dist/tools/memories.js +171 -0
- package/mcp-server/dist/tools/memories.js.map +1 -0
- package/mcp-server/dist/tools/morelogin.d.ts +24 -0
- package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
- package/mcp-server/dist/tools/morelogin.js +79 -0
- package/mcp-server/dist/tools/morelogin.js.map +1 -0
- package/mcp-server/dist/tools/profile.d.ts +17 -0
- package/mcp-server/dist/tools/profile.d.ts.map +1 -0
- package/mcp-server/dist/tools/profile.js +114 -0
- package/mcp-server/dist/tools/profile.js.map +1 -0
- package/mcp-server/dist/tools/recall.d.ts +71 -0
- package/mcp-server/dist/tools/recall.d.ts.map +1 -0
- package/mcp-server/dist/tools/recall.js +147 -0
- package/mcp-server/dist/tools/recall.js.map +1 -0
- package/mcp-server/dist/tools/reflect.d.ts +56 -0
- package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
- package/mcp-server/dist/tools/reflect.js +157 -0
- package/mcp-server/dist/tools/reflect.js.map +1 -0
- package/mcp-server/dist/tools/remember.d.ts +62 -0
- package/mcp-server/dist/tools/remember.d.ts.map +1 -0
- package/mcp-server/dist/tools/remember.js +201 -0
- package/mcp-server/dist/tools/remember.js.map +1 -0
- package/mcp-server/dist/tools/response.d.ts +23 -0
- package/mcp-server/dist/tools/response.d.ts.map +1 -0
- package/mcp-server/dist/tools/response.js +24 -0
- package/mcp-server/dist/tools/response.js.map +1 -0
- package/mcp-server/dist/tools/restore.d.ts +14 -0
- package/mcp-server/dist/tools/restore.d.ts.map +1 -0
- package/mcp-server/dist/tools/restore.js +23 -0
- package/mcp-server/dist/tools/restore.js.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
- package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide-tools.js +231 -0
- package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
- package/mcp-server/dist/tools/style-guide.d.ts +8 -0
- package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
- package/mcp-server/dist/tools/style-guide.js +12 -0
- package/mcp-server/dist/tools/style-guide.js.map +1 -0
- package/mcp-server/dist/tools/sync.d.ts +20 -0
- package/mcp-server/dist/tools/sync.d.ts.map +1 -0
- package/mcp-server/dist/tools/sync.js +156 -0
- package/mcp-server/dist/tools/sync.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
- package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
- package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
- package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
- package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
- package/mcp-server/dist/tools/tictactoe.js +11 -0
- package/mcp-server/dist/tools/tictactoe.js.map +1 -0
- package/mcp-server/dist/tools/utils.d.ts +19 -0
- package/mcp-server/dist/tools/utils.d.ts.map +1 -0
- package/mcp-server/dist/tools/utils.js +54 -0
- package/mcp-server/dist/tools/utils.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
- package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-format.js +337 -0
- package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
- package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
- package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
- package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
- package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
- package/mcp-server/dist/tools/whiteboard.js +16 -0
- package/mcp-server/dist/tools/whiteboard.js.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
- package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/analytics.js +83 -0
- package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
- package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/dedup.js +56 -0
- package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
- package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/download.js +30 -0
- package/mcp-server/dist/tools/youtube/download.js.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
- package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/helpers.js +143 -0
- package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
- package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
- package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/media.js +97 -0
- package/mcp-server/dist/tools/youtube/media.js.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
- package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/metadata.js +106 -0
- package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
- package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/navigate.js +71 -0
- package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
- package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/playlist.js +128 -0
- package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
- package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/schedule.js +147 -0
- package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
- package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
- package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/source.js +85 -0
- package/mcp-server/dist/tools/youtube/source.js.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
- package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube/upload.js +255 -0
- package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
- package/mcp-server/dist/tools/youtube.d.ts +12 -0
- package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
- package/mcp-server/dist/tools/youtube.js +38 -0
- package/mcp-server/dist/tools/youtube.js.map +1 -0
- package/mcp-server/dist/tui.d.ts +3 -0
- package/mcp-server/dist/tui.d.ts.map +1 -0
- package/mcp-server/dist/tui.js +806 -0
- package/mcp-server/dist/tui.js.map +1 -0
- package/mcp-server/dist/types.d.ts +77 -0
- package/mcp-server/dist/types.d.ts.map +1 -0
- package/mcp-server/dist/types.js +2 -0
- package/mcp-server/dist/types.js.map +1 -0
- package/mcp-server/package-lock.json +4798 -0
- package/mcp-server/package.json +55 -38
- package/mcp-server/run.mjs +12 -2
- package/mcp-server/src/config.ts +48 -3
- package/mcp-server/src/http.ts +296 -93
- package/mcp-server/src/index.ts +546 -203
- package/mcp-server/src/preload-http.ts +19 -18
- package/mcp-server/src/preload.ts +19 -18
- package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
- package/mcp-server/src/services/assistant-judgments.ts +157 -0
- package/mcp-server/src/services/browser-assist-gate.ts +383 -0
- package/mcp-server/src/services/browser-assist.ts +267 -0
- package/mcp-server/src/services/browser-bench.ts +477 -0
- package/mcp-server/src/services/browser-judgments.ts +414 -0
- package/mcp-server/src/services/browser-risk.ts +484 -0
- package/mcp-server/src/services/categories.ts +36 -19
- package/mcp-server/src/services/codex-config-heal.ts +403 -0
- package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
- package/mcp-server/src/services/desktop-assist.ts +308 -0
- package/mcp-server/src/services/desktop-bench.ts +372 -0
- package/mcp-server/src/services/desktop-client.ts +76 -0
- package/mcp-server/src/services/desktop-judgments.ts +218 -0
- package/mcp-server/src/services/desktop-risk.ts +743 -0
- package/mcp-server/src/services/edit-stale.ts +299 -0
- package/mcp-server/src/services/embedding-service.ts +108 -0
- package/mcp-server/src/services/embedding-worker.ts +46 -0
- package/mcp-server/src/services/fb-regions.ts +221 -0
- package/mcp-server/src/services/file-checksums.ts +26 -9
- package/mcp-server/src/services/file-excerpt.ts +59 -0
- package/mcp-server/src/services/identity.ts +291 -0
- package/mcp-server/src/services/local-embeddings.ts +2 -77
- package/mcp-server/src/services/memory-client.ts +23 -0
- package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
- package/mcp-server/src/services/memory-judgments.ts +901 -0
- package/mcp-server/src/services/memory-maintenance.ts +360 -0
- package/mcp-server/src/services/memory-retrieval.ts +349 -0
- package/mcp-server/src/services/memory-schema.ts +280 -0
- package/mcp-server/src/services/memory-sessions.ts +87 -0
- package/mcp-server/src/services/memory-triage.ts +182 -0
- package/mcp-server/src/services/memory-verification.ts +68 -0
- package/mcp-server/src/services/memory-writer.ts +125 -0
- package/mcp-server/src/services/neural-interface.ts +1217 -73
- package/mcp-server/src/services/profiles.ts +428 -0
- package/mcp-server/src/services/secret-gate.ts +52 -0
- package/mcp-server/src/services/server-instructions.ts +122 -0
- package/mcp-server/src/services/sqlite.ts +1456 -823
- package/mcp-server/src/services/typesafe-bench.ts +247 -0
- package/mcp-server/src/services/typesafe-config.ts +790 -0
- package/mcp-server/src/services/typesafe.ts +390 -0
- package/mcp-server/src/services/vector-cache.ts +255 -0
- package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
- package/mcp-server/src/tools/agents.ts +539 -0
- package/mcp-server/src/tools/bluesky.ts +1186 -0
- package/mcp-server/src/tools/browser-advanced.ts +15 -6
- package/mcp-server/src/tools/browser-batch.ts +178 -0
- package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
- package/mcp-server/src/tools/browser-interact.ts +362 -255
- package/mcp-server/src/tools/browser-navigate.ts +164 -77
- package/mcp-server/src/tools/browser-observe.ts +2222 -1330
- package/mcp-server/src/tools/browser.ts +181 -107
- package/mcp-server/src/tools/card.ts +7 -5
- package/mcp-server/src/tools/choice.ts +103 -0
- package/mcp-server/src/tools/computer.ts +190 -0
- package/mcp-server/src/tools/discord.ts +10 -23
- package/mcp-server/src/tools/fb-groups.ts +387 -0
- package/mcp-server/src/tools/forget.ts +1 -1
- package/mcp-server/src/tools/git.ts +3 -1
- package/mcp-server/src/tools/gsc/experience.ts +440 -0
- package/mcp-server/src/tools/gsc/helpers.ts +288 -0
- package/mcp-server/src/tools/gsc/indexing.ts +495 -0
- package/mcp-server/src/tools/gsc/inspect.ts +391 -0
- package/mcp-server/src/tools/gsc/navigate.ts +236 -0
- package/mcp-server/src/tools/gsc/performance.ts +352 -0
- package/mcp-server/src/tools/gsc/settings.ts +564 -0
- package/mcp-server/src/tools/gsc.ts +95 -0
- package/mcp-server/src/tools/image.ts +3 -1
- package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
- package/mcp-server/src/tools/leonardo.ts +7 -5
- package/mcp-server/src/tools/loop.ts +118 -25
- package/mcp-server/src/tools/memories.ts +65 -5
- package/mcp-server/src/tools/morelogin.ts +81 -0
- package/mcp-server/src/tools/profile.ts +122 -0
- package/mcp-server/src/tools/recall.ts +105 -261
- package/mcp-server/src/tools/reflect.ts +171 -145
- package/mcp-server/src/tools/remember.ts +223 -115
- package/mcp-server/src/tools/style-guide-tools.ts +250 -0
- package/mcp-server/src/tools/style-guide.ts +16 -0
- package/mcp-server/src/tools/sync.ts +66 -9
- package/mcp-server/src/tools/tictactoe.ts +3 -1
- package/mcp-server/src/tools/utils.ts +22 -0
- package/mcp-server/src/tools/whiteboard-format.ts +394 -0
- package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
- package/mcp-server/src/tools/whiteboard.ts +7 -5
- package/mcp-server/src/tools/youtube/analytics.ts +106 -0
- package/mcp-server/src/tools/youtube/dedup.ts +57 -0
- package/mcp-server/src/tools/youtube/download.ts +41 -0
- package/mcp-server/src/tools/youtube/helpers.ts +183 -0
- package/mcp-server/src/tools/youtube/media.ts +109 -0
- package/mcp-server/src/tools/youtube/metadata.ts +112 -0
- package/mcp-server/src/tools/youtube/navigate.ts +81 -0
- package/mcp-server/src/tools/youtube/playlist.ts +134 -0
- package/mcp-server/src/tools/youtube/schedule.ts +158 -0
- package/mcp-server/src/tools/youtube/source.ts +101 -0
- package/mcp-server/src/tools/youtube/upload.ts +296 -0
- package/mcp-server/src/tools/youtube.ts +47 -0
- package/mcp-server/src/tui.ts +8 -9
- package/neural-interface/games/TicTacToe/1.svg +1 -0
- package/neural-interface/games/TicTacToe/2.svg +1 -0
- package/neural-interface/games/TicTacToe/3.svg +1 -0
- package/neural-interface/games/TicTacToe/4.svg +1 -0
- package/neural-interface/games/TicTacToe/5.svg +1 -0
- package/neural-interface/games/TicTacToe/6.svg +1 -0
- package/neural-interface/games/TicTacToe/7.svg +1 -0
- package/neural-interface/games/TicTacToe/8.svg +1 -0
- package/neural-interface/games/TicTacToe/9.svg +1 -0
- package/neural-interface/games/TicTacToe/Board.svg +1 -0
- package/neural-interface/games/TicTacToe/Circle.svg +1 -0
- package/neural-interface/games/TicTacToe/Cross.svg +1 -0
- package/neural-interface/i18n/en.json +7022 -0
- package/neural-interface/i18n/pt-BR.json +7026 -0
- package/neural-interface/lib/assistant-api.js +1005 -0
- package/neural-interface/lib/assistant-attachments.js +121 -0
- package/neural-interface/lib/assistant-brains/claude.js +207 -0
- package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
- package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
- package/neural-interface/lib/assistant-brains/codex.js +213 -0
- package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
- package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
- package/neural-interface/lib/assistant-brains/opencode.js +320 -0
- package/neural-interface/lib/assistant-budget.js +318 -0
- package/neural-interface/lib/assistant-catalog.js +731 -0
- package/neural-interface/lib/assistant-clarify.js +664 -0
- package/neural-interface/lib/assistant-config.js +232 -0
- package/neural-interface/lib/assistant-dispatch.js +2744 -0
- package/neural-interface/lib/assistant-envelope.js +582 -0
- package/neural-interface/lib/assistant-evidence.js +236 -0
- package/neural-interface/lib/assistant-hidden-models.js +272 -0
- package/neural-interface/lib/assistant-jev.js +117 -0
- package/neural-interface/lib/assistant-judgments.js +111 -0
- package/neural-interface/lib/assistant-media.js +335 -0
- package/neural-interface/lib/assistant-memory.js +398 -0
- package/neural-interface/lib/assistant-persona.js +444 -0
- package/neural-interface/lib/assistant-plan-permissions.js +448 -0
- package/neural-interface/lib/assistant-playbooks/design.md +87 -0
- package/neural-interface/lib/assistant-playbooks.js +72 -0
- package/neural-interface/lib/assistant-pricing.js +159 -0
- package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
- package/neural-interface/lib/assistant-route-gate.js +212 -0
- package/neural-interface/lib/assistant-router.js +1324 -0
- package/neural-interface/lib/assistant-runtime.js +3337 -0
- package/neural-interface/lib/assistant-task-prompt.js +472 -0
- package/neural-interface/lib/assistant-usage.js +1688 -0
- package/neural-interface/lib/augmented-path.js +70 -0
- package/neural-interface/lib/automation-storage-migration.js +54 -0
- package/neural-interface/lib/backup-service.js +851 -0
- package/neural-interface/lib/backup-zip-reader.js +262 -0
- package/neural-interface/lib/browser-assist-api.js +41 -0
- package/neural-interface/lib/browser-console.js +176 -0
- package/neural-interface/lib/browser-execution.js +241 -0
- package/neural-interface/lib/browser-extraction.js +191 -0
- package/neural-interface/lib/browser-language.js +83 -0
- package/neural-interface/lib/browser-screenshot.js +399 -0
- package/neural-interface/lib/browser-semantic-context.js +639 -0
- package/neural-interface/lib/browser-snapshots.js +192 -0
- package/neural-interface/lib/browser-tab-recovery.js +119 -0
- package/neural-interface/lib/browser-targets.js +70 -0
- package/neural-interface/lib/browser-tool-policy.js +926 -0
- package/neural-interface/lib/claude-accounts.js +230 -0
- package/neural-interface/lib/claude-agent-bridge.js +3203 -0
- package/neural-interface/lib/claude-bypass-policy.js +99 -0
- package/neural-interface/lib/claude-executable.js +241 -0
- package/neural-interface/lib/claude-history.js +429 -0
- package/neural-interface/lib/claude-model-catalog.js +444 -0
- package/neural-interface/lib/claude-panel-requests.js +165 -0
- package/neural-interface/lib/claude-panel-session.js +272 -0
- package/neural-interface/lib/claude-permission-rules.js +153 -0
- package/neural-interface/lib/claude-session-cleanup.js +71 -0
- package/neural-interface/lib/claude-session-list.js +82 -0
- package/neural-interface/lib/claude-session-ops.js +140 -0
- package/neural-interface/lib/claude-settings-view.js +51 -0
- package/neural-interface/lib/claude-skin-connect.js +79 -0
- package/neural-interface/lib/claude-stall-policy.js +7 -0
- package/neural-interface/lib/claude-temporary.js +435 -0
- package/neural-interface/lib/cli-update-planner.js +312 -0
- package/neural-interface/lib/codex-capabilities.d.ts +41 -0
- package/neural-interface/lib/codex-capabilities.js +148 -0
- package/neural-interface/lib/codex-collaboration-mode.js +17 -0
- package/neural-interface/lib/codex-compat-rpc.js +241 -0
- package/neural-interface/lib/codex-mcp-approvals.js +56 -0
- package/neural-interface/lib/codex-mcp-apps.js +47 -0
- package/neural-interface/lib/codex-model-context.js +202 -0
- package/neural-interface/lib/codex-plan-store.js +71 -0
- package/neural-interface/lib/codex-request-journal.js +242 -0
- package/neural-interface/lib/codex-runtime-path.js +213 -0
- package/neural-interface/lib/codex-session-catalog.js +231 -0
- package/neural-interface/lib/codex-session-settings.js +46 -0
- package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
- package/neural-interface/lib/codex-thread-history.js +165 -0
- package/neural-interface/lib/codex-user-verification.js +34 -0
- package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
- package/neural-interface/lib/confined-fs.js +256 -0
- package/neural-interface/lib/db.js +922 -0
- package/neural-interface/lib/design-md.js +9 -0
- package/neural-interface/lib/desktop/api.js +92 -0
- package/neural-interface/lib/desktop/audit.js +62 -0
- package/neural-interface/lib/desktop/build.js +423 -0
- package/neural-interface/lib/desktop/config.js +606 -0
- package/neural-interface/lib/desktop/coords.js +76 -0
- package/neural-interface/lib/desktop/fake-helper.js +1192 -0
- package/neural-interface/lib/desktop/frames.js +77 -0
- package/neural-interface/lib/desktop/grants.js +84 -0
- package/neural-interface/lib/desktop/guards.js +170 -0
- package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
- package/neural-interface/lib/desktop/lease.js +51 -0
- package/neural-interface/lib/desktop/manager.js +545 -0
- package/neural-interface/lib/desktop/press-contexts.js +103 -0
- package/neural-interface/lib/desktop/protocol.js +495 -0
- package/neural-interface/lib/desktop/service.js +1202 -0
- package/neural-interface/lib/effort-levels.js +148 -0
- package/neural-interface/lib/event-loop-monitor.js +67 -0
- package/neural-interface/lib/exec-loop-command.js +209 -0
- package/neural-interface/lib/folder-picker.ps1 +77 -0
- package/neural-interface/lib/http-guards.js +287 -0
- package/neural-interface/lib/jsonl-lines.js +94 -0
- package/neural-interface/lib/loop-logger.js +127 -0
- package/neural-interface/lib/mcp-client-config.js +133 -0
- package/neural-interface/lib/mcp-installer.js +487 -0
- package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
- package/neural-interface/lib/mcp-profile-servers.js +120 -0
- package/neural-interface/lib/memo-cache.js +84 -0
- package/neural-interface/lib/memory-api.js +758 -0
- package/neural-interface/lib/memory-map-api.js +1150 -0
- package/neural-interface/lib/memory-map-layout.js +872 -0
- package/neural-interface/lib/memory-map-worker.js +165 -0
- package/neural-interface/lib/memory-session-capture.js +81 -0
- package/neural-interface/lib/memory-timers.js +62 -0
- package/neural-interface/lib/morelogin.js +301 -0
- package/neural-interface/lib/native-binary-runtime.js +382 -0
- package/neural-interface/lib/native-loop-goal.js +33 -0
- package/neural-interface/lib/native-loop-providers.js +1002 -0
- package/neural-interface/lib/native-loop-runtime.js +747 -0
- package/neural-interface/lib/offline-page.js +54 -0
- package/neural-interface/lib/opencode-hidden-models.js +113 -0
- package/neural-interface/lib/opencode-history.js +253 -0
- package/neural-interface/lib/opencode-runtime-config.js +58 -0
- package/neural-interface/lib/opencode-v2-client.js +486 -0
- package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
- package/neural-interface/lib/path-confine.js +213 -0
- package/neural-interface/lib/plugin-installer.js +264 -0
- package/neural-interface/lib/project-storage.js +766 -0
- package/neural-interface/lib/pty-host/core.js +603 -0
- package/neural-interface/lib/pty-host/flow.js +43 -0
- package/neural-interface/lib/pty-host/host.js +47 -0
- package/neural-interface/lib/pty-host/manager.js +360 -0
- package/neural-interface/lib/pty-host/protocol.js +81 -0
- package/neural-interface/lib/pty-host/snapshot.js +133 -0
- package/neural-interface/lib/remote-policy.js +582 -0
- package/neural-interface/lib/rulesets/api.js +175 -0
- package/neural-interface/lib/rulesets/fs-safe.js +245 -0
- package/neural-interface/lib/rulesets/installer.js +1453 -0
- package/neural-interface/lib/rulesets/json-edit.js +186 -0
- package/neural-interface/lib/rulesets/lock.js +170 -0
- package/neural-interface/lib/rulesets/managed-text.js +314 -0
- package/neural-interface/lib/rulesets/normalise.js +24 -0
- package/neural-interface/lib/rulesets/render.js +84 -0
- package/neural-interface/lib/schedule-launch-intent.js +40 -0
- package/neural-interface/lib/session-cache-builder.js +524 -0
- package/neural-interface/lib/session-chunker.js +344 -0
- package/neural-interface/lib/session-indexer.js +327 -0
- package/neural-interface/lib/session-title-generator.js +232 -0
- package/neural-interface/lib/skill-prompt-bridge.js +11 -0
- package/neural-interface/lib/style-guide/api.js +375 -0
- package/neural-interface/lib/style-guide/color.js +352 -0
- package/neural-interface/lib/style-guide/export-css.js +99 -0
- package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
- package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
- package/neural-interface/lib/style-guide/fonts.json +227 -0
- package/neural-interface/lib/style-guide/import.js +1268 -0
- package/neural-interface/lib/style-guide/pointers.js +103 -0
- package/neural-interface/lib/style-guide/presets.js +232 -0
- package/neural-interface/lib/style-guide/render-design-md.js +319 -0
- package/neural-interface/lib/style-guide/schema.js +848 -0
- package/neural-interface/lib/style-guide/security.js +43 -0
- package/neural-interface/lib/style-guide/store.js +491 -0
- package/neural-interface/lib/style-guide/summary.js +106 -0
- package/neural-interface/lib/style-guide/tokens.js +170 -0
- package/neural-interface/lib/synabun-update-plan.js +324 -0
- package/neural-interface/lib/synabun-version.js +179 -0
- package/neural-interface/lib/system-restore.js +99 -0
- package/neural-interface/lib/terminal-env.js +86 -0
- package/neural-interface/lib/ui-blob-store.js +106 -0
- package/neural-interface/lib/vector-cache.js +2 -0
- package/neural-interface/lib/virtual-socket.js +60 -0
- package/neural-interface/lib/whatsapp/api.js +146 -0
- package/neural-interface/lib/whatsapp/auth-store.js +389 -0
- package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
- package/neural-interface/lib/whatsapp/brain.js +128 -0
- package/neural-interface/lib/whatsapp/bridge.js +1499 -0
- package/neural-interface/lib/whatsapp/cards.js +519 -0
- package/neural-interface/lib/whatsapp/commands.js +92 -0
- package/neural-interface/lib/whatsapp/config.js +291 -0
- package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
- package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
- package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
- package/neural-interface/lib/whatsapp/connector/package.json +8 -0
- package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
- package/neural-interface/lib/whatsapp/format.js +552 -0
- package/neural-interface/lib/whatsapp/host-core.js +1225 -0
- package/neural-interface/lib/whatsapp/host.js +119 -0
- package/neural-interface/lib/whatsapp/identity.js +288 -0
- package/neural-interface/lib/whatsapp/inbound.js +149 -0
- package/neural-interface/lib/whatsapp/installer.js +562 -0
- package/neural-interface/lib/whatsapp/manager.js +638 -0
- package/neural-interface/lib/whatsapp/paths.js +81 -0
- package/neural-interface/lib/whatsapp/protocol.js +327 -0
- package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
- package/neural-interface/lib/whatsapp/redact.js +130 -0
- package/neural-interface/lib/whatsapp/service.js +1305 -0
- package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
- package/neural-interface/package-lock.json +4431 -0
- package/neural-interface/package.json +58 -27
- package/neural-interface/public/apple-touch-icon.png +0 -0
- package/neural-interface/public/category-logos/synabun.png +0 -0
- package/neural-interface/public/claude.svg +1 -0
- package/neural-interface/public/favicon-16x16.png +0 -0
- package/neural-interface/public/favicon-32x32.png +0 -0
- package/neural-interface/public/icon-192.png +0 -0
- package/neural-interface/public/icon-512.png +0 -0
- package/neural-interface/public/index.html +32 -182
- package/neural-interface/public/index2d.html +2 -2
- package/neural-interface/public/install-app.html +31 -0
- package/neural-interface/public/logo-synabun.png +0 -0
- package/neural-interface/public/logoHD.png +0 -0
- package/neural-interface/public/manifest.json +2 -0
- package/neural-interface/public/mcp.svg +4 -0
- package/neural-interface/public/offline.html +670 -299
- package/neural-interface/public/onboarding.html +804 -161
- package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
- package/neural-interface/public/shared/agent-runtime-options.js +596 -0
- package/neural-interface/public/shared/api.js +339 -28
- package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
- package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
- package/neural-interface/public/shared/assistant/asst-api.js +270 -0
- package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
- package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
- package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
- package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
- package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
- package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
- package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
- package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
- package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
- package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
- package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
- package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
- package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
- package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
- package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
- package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
- package/neural-interface/public/shared/assistant/asst-state.js +727 -0
- package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
- package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
- package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
- package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
- package/neural-interface/public/shared/automation-context.js +75 -0
- package/neural-interface/public/shared/blob-store.js +99 -0
- package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
- package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
- package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
- package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
- package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
- package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
- package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
- package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
- package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
- package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
- package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
- package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
- package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
- package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
- package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
- package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
- package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
- package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
- package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
- package/neural-interface/public/shared/cli-status.js +169 -0
- package/neural-interface/public/shared/command-runner-model.js +30 -0
- package/neural-interface/public/shared/constants.js +22 -5
- package/neural-interface/public/shared/cp/cp-agents.js +186 -0
- package/neural-interface/public/shared/cp/cp-bash.js +252 -0
- package/neural-interface/public/shared/cp/cp-compose.js +159 -0
- package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
- package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
- package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
- package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
- package/neural-interface/public/shared/cp/cp-diff.js +255 -0
- package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
- package/neural-interface/public/shared/cp/cp-events.js +846 -0
- package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
- package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
- package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
- package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
- package/neural-interface/public/shared/cp/cp-restore.js +224 -0
- package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
- package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
- package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
- package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
- package/neural-interface/public/shared/cp/cp-styles.js +349 -0
- package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
- package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
- package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
- package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
- package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
- package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
- package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
- package/neural-interface/public/shared/graph-activity.js +68 -0
- package/neural-interface/public/shared/html-shell.js +116 -17
- package/neural-interface/public/shared/i18n.js +132 -34
- package/neural-interface/public/shared/node-positions-store.js +44 -0
- package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
- package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
- package/neural-interface/public/shared/provider-icons.js +30 -0
- package/neural-interface/public/shared/pwa-install-page.js +34 -0
- package/neural-interface/public/shared/pwa-install.css +12 -0
- package/neural-interface/public/shared/pwa-install.js +28 -0
- package/neural-interface/public/shared/session-title.js +100 -0
- package/neural-interface/public/shared/settings/settings-ia.js +389 -0
- package/neural-interface/public/shared/settings/settings-kit.js +234 -0
- package/neural-interface/public/shared/settings/settings-rules.js +160 -0
- package/neural-interface/public/shared/settings/settings-search.js +463 -0
- package/neural-interface/public/shared/settings/settings-shell.js +570 -0
- package/neural-interface/public/shared/start-bridge.js +583 -0
- package/neural-interface/public/shared/state.js +5 -0
- package/neural-interface/public/shared/storage.js +50 -7
- package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
- package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
- package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
- package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
- package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
- package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
- package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
- package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
- package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
- package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
- package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
- package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
- package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
- package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
- package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
- package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
- package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
- package/neural-interface/public/shared/styles.css +8614 -1477
- package/neural-interface/public/shared/synabun-mascot.js +1625 -0
- package/neural-interface/public/shared/synabun-ticker.js +376 -0
- package/neural-interface/public/shared/term-ready.js +307 -0
- package/neural-interface/public/shared/term-renderer.js +343 -0
- package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
- package/neural-interface/public/shared/ui-assistant.js +77 -0
- package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
- package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
- package/neural-interface/public/shared/ui-codex-panel.js +12 -0
- package/neural-interface/public/shared/ui-command-runner.js +251 -468
- package/neural-interface/public/shared/ui-cost-widget.js +55 -34
- package/neural-interface/public/shared/ui-detail.js +77 -14
- package/neural-interface/public/shared/ui-explorer.js +360 -181
- package/neural-interface/public/shared/ui-file-explorer.js +485 -107
- package/neural-interface/public/shared/ui-help.js +2 -2
- package/neural-interface/public/shared/ui-image-gallery.js +45 -21
- package/neural-interface/public/shared/ui-judgments.js +1346 -0
- package/neural-interface/public/shared/ui-keybinds.js +3 -2
- package/neural-interface/public/shared/ui-link.js +105 -51
- package/neural-interface/public/shared/ui-loading.js +222 -11
- package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
- package/neural-interface/public/shared/ui-menubar.js +100 -31
- package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
- package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
- package/neural-interface/public/shared/ui-native-window-id.js +7 -0
- package/neural-interface/public/shared/ui-navbar.js +357 -222
- package/neural-interface/public/shared/ui-notifications.js +58 -12
- package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
- package/neural-interface/public/shared/ui-panels.js +15 -7
- package/neural-interface/public/shared/ui-resume.js +823 -653
- package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
- package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
- package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
- package/neural-interface/public/shared/ui-sessions.js +789 -34
- package/neural-interface/public/shared/ui-settings.js +5774 -2194
- package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
- package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
- package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
- package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
- package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
- package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
- package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
- package/neural-interface/public/shared/ui-skills.js +18 -32
- package/neural-interface/public/shared/ui-styleguide.js +35 -0
- package/neural-interface/public/shared/ui-sync.js +87 -0
- package/neural-interface/public/shared/ui-terminal.js +7863 -6385
- package/neural-interface/public/shared/ui-tool-updates.js +292 -0
- package/neural-interface/public/shared/ui-tooltip.js +156 -15
- package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
- package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
- package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
- package/neural-interface/public/shared/ui-tutorial.css +102 -0
- package/neural-interface/public/shared/ui-tutorial.js +557 -1076
- package/neural-interface/public/shared/ui-update.js +420 -68
- package/neural-interface/public/shared/ui-whatsapp.js +941 -0
- package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
- package/neural-interface/public/shared/ui-workspaces.js +2 -1
- package/neural-interface/public/shared/utils.js +58 -0
- package/neural-interface/public/shared/vterm-buffer.js +15 -5
- package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
- package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
- package/neural-interface/public/sidepanel-session.html +18 -0
- package/neural-interface/public/sw.js +10 -2
- package/neural-interface/public/synabun.png +0 -0
- package/neural-interface/public/variant/2d/graph.js +1707 -1635
- package/neural-interface/public/variant/2d/lasso.js +2 -1
- package/neural-interface/public/variant/2d/layout.js +595 -594
- package/neural-interface/public/variant/2d/main.js +557 -521
- package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
- package/neural-interface/public/variant/3d/main.js +517 -500
- package/neural-interface/public/variant/3d/map-controls.js +144 -0
- package/neural-interface/public/variant/3d/map-data.js +251 -0
- package/neural-interface/public/variant/3d/map-labels.js +241 -0
- package/neural-interface/public/variant/3d/map-pick.js +90 -0
- package/neural-interface/public/variant/3d/map-renderer.js +521 -0
- package/neural-interface/public/variant/3d/map-shaders.js +158 -0
- package/neural-interface/public/variant/3d/map-view.js +618 -0
- package/neural-interface/public/vendor/three/manifest.json +3 -0
- package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
- package/neural-interface/public/vendor/xterm/manifest.json +3 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
- package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
- package/neural-interface/scripts/build-vendor.mjs +64 -0
- package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
- package/neural-interface/scripts/rebuild-pty.js +39 -22
- package/neural-interface/scripts/vendor-three-entry.js +24 -0
- package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
- package/neural-interface/server.js +33983 -15000
- package/neural-interface/skins/default/skin.css +90 -0
- package/neural-interface/skins/default/skin.json +8 -0
- package/neural-interface/templates/rulesets/README.md +9 -0
- package/neural-interface/templates/rulesets/claude.md +3 -0
- package/neural-interface/templates/rulesets/codex.md +2 -0
- package/neural-interface/templates/rulesets/coexistence.md +6 -0
- package/neural-interface/templates/rulesets/core.md +26 -0
- package/neural-interface/templates/rulesets/cursor.md +2 -0
- package/neural-interface/templates/rulesets/gemini.md +2 -0
- package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
- package/neural-interface/templates/rulesets/manifest.json +12 -0
- package/neural-interface/templates/rulesets/opencode.md +2 -0
- package/package.json +131 -53
- package/postinstall.js +55 -26
- package/preuninstall.js +187 -0
- package/scripts/restore-data-home-from-backup.mjs +239 -0
- package/setup.js +872 -260
- package/skills/leonardo/SKILL.md +19 -10
- package/skills/leonardo/modules/image-prompter.md +18 -12
- package/skills/leonardo/modules/video-prompter.md +19 -13
- package/skills/synabun/SKILL.md +209 -185
- package/skills/synabun/icon.png +0 -0
- package/skills/synabun/modules/audit.md +380 -374
- package/skills/synabun/modules/changelog.md +15 -6
- package/skills/synabun/modules/idea.md +148 -144
- package/skills/synabun/modules/memorize.md +13 -4
- package/skills/synabun/modules/schedule.md +198 -0
- package/skills/synabun/synabunicon.png +0 -0
- package/updater.cmd +31 -0
- package/updater.mjs +382 -0
- package/updater.sh +29 -0
- package/hooks/claude-code/test-user-learning.mjs +0 -531
- package/neural-interface/public/claude-chat.css +0 -878
- package/neural-interface/public/claude-chat.html +0 -92
- package/neural-interface/public/claude-chat.js +0 -1168
- package/neural-interface/public/index-legacy.html +0 -14677
- package/neural-interface/public/index2d-legacy.html +0 -8193
- package/neural-interface/public/shared/html-term-renderer.js +0 -1022
- package/neural-interface/public/variant/3d/background.js +0 -884
- package/neural-interface/public/variant/3d/camera.js +0 -661
- package/neural-interface/public/variant/3d/gfx.js +0 -116
- package/neural-interface/public/variant/3d/graph.js +0 -2399
- package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
- package/neural-interface/templates/CLAUDE-template.md +0 -211
|
@@ -0,0 +1,922 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared SQLite database layer for the Neural Interface.
|
|
3
|
+
* Uses node:sqlite (built-in since Node 22.5.0).
|
|
4
|
+
* Shares the same memory.db file as the MCP server (WAL mode for concurrent access).
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
8
|
+
import { resolve, dirname } from 'path';
|
|
9
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
10
|
+
import { getDb as sharedDb, closeDatabase, memoryVectors, chunkVectors, searchMemories as sharedSearch, searchSessionChunks as sharedSessionSearch, updatePayload as sharedUpdate, deleteMemory as sharedDelete } from '../../mcp-server/dist/services/sqlite.js';
|
|
11
|
+
import { generateEmbedding, generateEmbeddingBatch, warmupEmbeddings, EMBEDDING_MODEL, EMBEDDING_DIMENSIONS } from '../../mcp-server/dist/services/local-embeddings.js';
|
|
12
|
+
export { memoryVectors, chunkVectors, warmupEmbeddings, EMBEDDING_MODEL };
|
|
13
|
+
export const EMBEDDING_DIMS = EMBEDDING_DIMENSIONS;
|
|
14
|
+
export const getEmbedding = generateEmbedding;
|
|
15
|
+
export const getEmbeddingBatch = generateEmbeddingBatch;
|
|
16
|
+
import { getDataHome } from '../../lib/paths.js';
|
|
17
|
+
|
|
18
|
+
function getDefaultDbPath() {
|
|
19
|
+
const dataDir = process.env.MEMORY_DATA_DIR || resolve(getDataHome(), 'mcp-data');
|
|
20
|
+
return resolve(dataDir, 'memory.db');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let db = null;
|
|
24
|
+
|
|
25
|
+
// --- Embedding ---
|
|
26
|
+
|
|
27
|
+
export function getEmbeddingDims() {
|
|
28
|
+
return EMBEDDING_DIMS;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// --- Database ---
|
|
32
|
+
|
|
33
|
+
export function getDbPath() {
|
|
34
|
+
const envPath = process.env.SQLITE_DB_PATH;
|
|
35
|
+
const defaultPath = getDefaultDbPath();
|
|
36
|
+
if (!envPath) return defaultPath;
|
|
37
|
+
// If the env path's parent directory doesn't exist (e.g. Windows path on Mac),
|
|
38
|
+
// fall back to the local default so cross-OS restores work instantly
|
|
39
|
+
if (!existsSync(dirname(envPath))) return defaultPath;
|
|
40
|
+
return envPath;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function getDb() {
|
|
44
|
+
if (!db) {
|
|
45
|
+
const dbPath = getDbPath();
|
|
46
|
+
const dir = dirname(dbPath);
|
|
47
|
+
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
|
|
48
|
+
|
|
49
|
+
db = sharedDb();
|
|
50
|
+
try { db.exec(SESSION_CACHE_SQL); } catch { /* session_cache migration */ }
|
|
51
|
+
try {
|
|
52
|
+
const sessionCacheColumns = new Set(
|
|
53
|
+
db.prepare('PRAGMA table_info(session_cache)').all().map((column) => String(column?.name || '')),
|
|
54
|
+
);
|
|
55
|
+
if (!sessionCacheColumns.has('account_id')) db.exec('ALTER TABLE session_cache ADD COLUMN account_id TEXT');
|
|
56
|
+
} catch { /* additive session_cache migration */ }
|
|
57
|
+
try { db.exec(SESSION_FTS_SQL); } catch { /* FTS5 may already exist */ }
|
|
58
|
+
}
|
|
59
|
+
return db;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const SESSION_CACHE_SQL = `
|
|
63
|
+
CREATE TABLE IF NOT EXISTS session_cache (
|
|
64
|
+
session_id TEXT NOT NULL,
|
|
65
|
+
provider TEXT NOT NULL,
|
|
66
|
+
project TEXT,
|
|
67
|
+
project_path TEXT,
|
|
68
|
+
git_branch TEXT,
|
|
69
|
+
first_prompt TEXT,
|
|
70
|
+
message_count INTEGER DEFAULT 0,
|
|
71
|
+
created TEXT,
|
|
72
|
+
modified TEXT,
|
|
73
|
+
file_path TEXT,
|
|
74
|
+
file_size INTEGER,
|
|
75
|
+
file_mtime TEXT,
|
|
76
|
+
body_size INTEGER,
|
|
77
|
+
deleted INTEGER DEFAULT 0,
|
|
78
|
+
account_id TEXT,
|
|
79
|
+
PRIMARY KEY (session_id, provider)
|
|
80
|
+
);
|
|
81
|
+
CREATE INDEX IF NOT EXISTS idx_session_cache_provider_modified
|
|
82
|
+
ON session_cache(provider, modified DESC);
|
|
83
|
+
CREATE INDEX IF NOT EXISTS idx_session_cache_project
|
|
84
|
+
ON session_cache(project_path);
|
|
85
|
+
`;
|
|
86
|
+
|
|
87
|
+
const SESSION_FTS_SQL = `
|
|
88
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS session_fts USING fts5(
|
|
89
|
+
session_id UNINDEXED,
|
|
90
|
+
provider UNINDEXED,
|
|
91
|
+
project UNINDEXED,
|
|
92
|
+
first_prompt,
|
|
93
|
+
body,
|
|
94
|
+
tokenize = 'porter unicode61 remove_diacritics 2'
|
|
95
|
+
);
|
|
96
|
+
`;
|
|
97
|
+
|
|
98
|
+
export function closeDb() {
|
|
99
|
+
if (db) {
|
|
100
|
+
closeDatabase();
|
|
101
|
+
db = null;
|
|
102
|
+
}
|
|
103
|
+
memoryVectors.invalidate();
|
|
104
|
+
chunkVectors.invalidate();
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// --- In-memory vector caches (see vector-cache.js for coherence model) ---
|
|
108
|
+
// Exported so same-connection writers (session-indexer, server.js bridge
|
|
109
|
+
// import) can patch the cache — same-connection writes do NOT bump
|
|
110
|
+
// PRAGMA data_version, so they must update the cache explicitly.
|
|
111
|
+
|
|
112
|
+
// --- X/Twitter engagement ledger (cross-schedule dedup) ---
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Read the shared engagement ledger written by the X automations and return a
|
|
116
|
+
* deduped recent set of engaged handles + tweet status IDs, plus the permanent
|
|
117
|
+
* blocklist (accounts that blocked us).
|
|
118
|
+
*
|
|
119
|
+
* Templates log every reply/quote/follow/post with tags that include "x-engaged"
|
|
120
|
+
* plus "acct:<account>", "handle:<handle>" and (for replies/quotes) "status:<id>";
|
|
121
|
+
* a block is logged with "action:blocked". launchScheduledLoop() reads this to
|
|
122
|
+
* inject a "do not re-engage" skip-list into every run, so no post or author is
|
|
123
|
+
* hit twice ACROSS schedules, and blockers are never re-attempted. Deterministic —
|
|
124
|
+
* does not depend on the agent recalling memory. Account-scoped when `account` is
|
|
125
|
+
* given (each X account keeps its own ledger). Never throws (a ledger lookup
|
|
126
|
+
* failure must not block a scheduled launch).
|
|
127
|
+
*
|
|
128
|
+
* @param {{account?:string|null, days?:number, limit?:number}} opts
|
|
129
|
+
* @returns {{handles:string[], statusIds:string[], blocked:string[], error?:string}}
|
|
130
|
+
*/
|
|
131
|
+
export function getRecentXEngagements({ account = null, days = 7, limit = 200 } = {}) {
|
|
132
|
+
const acct = account ? String(account).trim().replace(/^@/, '').toLowerCase() : null;
|
|
133
|
+
const acctLike = acct ? `%"acct:${acct}"%` : null;
|
|
134
|
+
const collect = (rows, handleSet, statusSet) => {
|
|
135
|
+
for (const row of rows) {
|
|
136
|
+
let tags;
|
|
137
|
+
try { tags = JSON.parse(row.tags || '[]'); } catch { continue; }
|
|
138
|
+
if (!Array.isArray(tags)) continue;
|
|
139
|
+
for (const t of tags) {
|
|
140
|
+
if (typeof t !== 'string') continue;
|
|
141
|
+
if (t.startsWith('handle:')) {
|
|
142
|
+
const h = t.slice(7).trim().replace(/^@/, '').toLowerCase();
|
|
143
|
+
if (h) handleSet.add(h);
|
|
144
|
+
} else if (statusSet && t.startsWith('status:')) {
|
|
145
|
+
const s = t.slice(7).trim();
|
|
146
|
+
if (s) statusSet.add(s);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
try {
|
|
152
|
+
const db = getDb();
|
|
153
|
+
const since = new Date(Date.now() - days * 86400000).toISOString();
|
|
154
|
+
const handles = new Set();
|
|
155
|
+
const statusIds = new Set();
|
|
156
|
+
const blocked = new Set();
|
|
157
|
+
|
|
158
|
+
// Recent engagements (windowed), excluding permanent blocks.
|
|
159
|
+
let engSql = `SELECT tags FROM memories
|
|
160
|
+
WHERE trashed_at IS NULL
|
|
161
|
+
AND tags LIKE '%x-engaged%'
|
|
162
|
+
AND tags NOT LIKE '%action:blocked%'
|
|
163
|
+
AND created_at >= ?`;
|
|
164
|
+
const engParams = [since];
|
|
165
|
+
if (acctLike) { engSql += ` AND tags LIKE ?`; engParams.push(acctLike); }
|
|
166
|
+
engSql += ` ORDER BY created_at DESC LIMIT ?`;
|
|
167
|
+
engParams.push(limit);
|
|
168
|
+
collect(db.prepare(engSql).all(...engParams), handles, statusIds);
|
|
169
|
+
|
|
170
|
+
// Permanent blocklist (accounts that blocked us) — no time window.
|
|
171
|
+
let blkSql = `SELECT tags FROM memories
|
|
172
|
+
WHERE trashed_at IS NULL
|
|
173
|
+
AND tags LIKE '%action:blocked%'`;
|
|
174
|
+
const blkParams = [];
|
|
175
|
+
if (acctLike) { blkSql += ` AND tags LIKE ?`; blkParams.push(acctLike); }
|
|
176
|
+
blkSql += ` ORDER BY created_at DESC LIMIT ?`;
|
|
177
|
+
blkParams.push(limit);
|
|
178
|
+
collect(db.prepare(blkSql).all(...blkParams), blocked, null);
|
|
179
|
+
|
|
180
|
+
return { handles: [...handles], statusIds: [...statusIds], blocked: [...blocked] };
|
|
181
|
+
} catch (err) {
|
|
182
|
+
return { handles: [], statusIds: [], blocked: [], error: err.message };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export const X_ACTION_TYPES = ['reply', 'like', 'quote', 'follow', 'repost'];
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Count the X actions already spent by an account since `sinceIso`, bucketed by type.
|
|
190
|
+
*
|
|
191
|
+
* Companion to getRecentXEngagements(): that one answers "who have we already hit",
|
|
192
|
+
* this one answers "how much have we already done today". The engagement templates
|
|
193
|
+
* tag every mutation with "x-engaged" + "acct:<account>" + "action:<type>", so the
|
|
194
|
+
* count is deterministic rather than the model's recollection of its own run. The
|
|
195
|
+
* launcher turns this into a per-run budget line, which is the only thing stopping
|
|
196
|
+
* six independent lanes from each spending a full day's quota.
|
|
197
|
+
*
|
|
198
|
+
* `action:blocked` rows are engagement *outcomes*, not actions we took, so they are
|
|
199
|
+
* excluded — matching the blocklist carve-out in getRecentXEngagements().
|
|
200
|
+
* Never throws (a budget lookup failure must not block a scheduled launch); on error
|
|
201
|
+
* every counter reads 0 so a broken ledger fails open rather than freezing all lanes.
|
|
202
|
+
*
|
|
203
|
+
* @param {{account?:string|null, sinceIso?:string, limit?:number}} opts
|
|
204
|
+
* @returns {{reply:number, like:number, quote:number, follow:number, repost:number, total:number, error?:string}}
|
|
205
|
+
*/
|
|
206
|
+
export function getXActionBudget({ account = null, sinceIso, limit = 500 } = {}) {
|
|
207
|
+
const counts = Object.fromEntries(X_ACTION_TYPES.map(t => [t, 0]));
|
|
208
|
+
const empty = { ...counts, total: 0 };
|
|
209
|
+
const acct = account ? String(account).trim().replace(/^@/, '').toLowerCase() : null;
|
|
210
|
+
try {
|
|
211
|
+
const db = getDb();
|
|
212
|
+
const since = sinceIso || new Date(Date.now() - 86400000).toISOString();
|
|
213
|
+
let sql = `SELECT tags FROM memories
|
|
214
|
+
WHERE trashed_at IS NULL
|
|
215
|
+
AND tags LIKE '%x-engaged%'
|
|
216
|
+
AND tags NOT LIKE '%action:blocked%'
|
|
217
|
+
AND created_at >= ?`;
|
|
218
|
+
const params = [since];
|
|
219
|
+
if (acct) { sql += ` AND tags LIKE ?`; params.push(`%"acct:${acct}"%`); }
|
|
220
|
+
sql += ` ORDER BY created_at DESC LIMIT ?`;
|
|
221
|
+
params.push(limit);
|
|
222
|
+
|
|
223
|
+
let total = 0;
|
|
224
|
+
for (const row of db.prepare(sql).all(...params)) {
|
|
225
|
+
let tags;
|
|
226
|
+
try { tags = JSON.parse(row.tags || '[]'); } catch { continue; }
|
|
227
|
+
if (!Array.isArray(tags)) continue;
|
|
228
|
+
// One memory logs one action. Count the first recognised action tag only, so a
|
|
229
|
+
// ledger entry that also mentions a sibling action does not double-charge.
|
|
230
|
+
for (const t of tags) {
|
|
231
|
+
if (typeof t !== 'string' || !t.startsWith('action:')) continue;
|
|
232
|
+
const kind = t.slice(7).trim().toLowerCase();
|
|
233
|
+
if (!Object.hasOwn(counts, kind)) continue;
|
|
234
|
+
counts[kind]++;
|
|
235
|
+
total++;
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return { ...counts, total };
|
|
240
|
+
} catch (err) {
|
|
241
|
+
return { ...empty, error: err.message };
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Per-day ceilings for each engagement ramp tier, shared by every X lane of an account.
|
|
247
|
+
* The tier is STATE (written by the daily metrics run after it checks the account is
|
|
248
|
+
* clean); the ceilings are CODE, so a model cannot talk itself into a wider budget by
|
|
249
|
+
* rewriting a memory. Tier 1 is the most conservative starting point.
|
|
250
|
+
*/
|
|
251
|
+
export const X_ENGAGEMENT_TIERS = {
|
|
252
|
+
1: { reply: 12, like: 30, quote: 0, follow: 6, repost: 2 },
|
|
253
|
+
2: { reply: 24, like: 45, quote: 1, follow: 8, repost: 3 },
|
|
254
|
+
3: { reply: 36, like: 60, quote: 2, follow: 12, repost: 4 },
|
|
255
|
+
};
|
|
256
|
+
export const X_DEFAULT_TIER = 1;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Read the current engagement ramp tier from the account's canonical
|
|
260
|
+
* `<program>-x-engagement-caps` memory (for example `acme-x-engagement-caps`; when
|
|
261
|
+
* several accounts keep one, the acct: tag picks the account).
|
|
262
|
+
* Falls back to the most conservative tier whenever the memory is missing,
|
|
263
|
+
* unparseable, or names a tier that does not exist — an unreadable ledger must narrow
|
|
264
|
+
* the budget, never widen it.
|
|
265
|
+
*
|
|
266
|
+
* @param {{account?:string|null}} opts
|
|
267
|
+
* @returns {{tier:number, caps:{reply:number,like:number,quote:number,follow:number,repost:number}, source:'memory'|'default', error?:string}}
|
|
268
|
+
*/
|
|
269
|
+
export function getXEngagementTier({ account = null } = {}) {
|
|
270
|
+
const fallback = { tier: X_DEFAULT_TIER, caps: X_ENGAGEMENT_TIERS[X_DEFAULT_TIER], source: 'default' };
|
|
271
|
+
const acct = account ? String(account).trim().replace(/^@/, '').toLowerCase() : null;
|
|
272
|
+
try {
|
|
273
|
+
const db = getDb();
|
|
274
|
+
let sql = `SELECT content FROM memories
|
|
275
|
+
WHERE trashed_at IS NULL
|
|
276
|
+
AND tags LIKE '%-x-engagement-caps"%'`;
|
|
277
|
+
const params = [];
|
|
278
|
+
if (acct) { sql += ` AND (tags LIKE ? OR tags NOT LIKE '%"acct:%')`; params.push(`%"acct:${acct}"%`); }
|
|
279
|
+
sql += ` ORDER BY created_at DESC LIMIT 1`;
|
|
280
|
+
const row = db.prepare(sql).all(...params)[0];
|
|
281
|
+
if (!row?.content) return fallback;
|
|
282
|
+
const m = /\btier\s*[:=]\s*(\d+)/i.exec(row.content);
|
|
283
|
+
const tier = m ? Number(m[1]) : NaN;
|
|
284
|
+
if (!Object.hasOwn(X_ENGAGEMENT_TIERS, tier)) return fallback;
|
|
285
|
+
return { tier, caps: X_ENGAGEMENT_TIERS[tier], source: 'memory' };
|
|
286
|
+
} catch (err) {
|
|
287
|
+
return { ...fallback, error: err.message };
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// ── Facebook shared action budget (same contract as the X budget above) ──
|
|
292
|
+
|
|
293
|
+
export const FB_ACTION_TYPES = ['page_post', 'group_post', 'comment', 'invite', 'join'];
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Per-day ceilings for each Facebook ramp tier, shared by every Facebook lane on the
|
|
297
|
+
* box (every Facebook schedule group posts through the same Page, profile and
|
|
298
|
+
* browser). The tier is STATE (written by the metrics run after it checks the account
|
|
299
|
+
* is clean); the ceilings are CODE, so a model cannot talk itself into a wider budget
|
|
300
|
+
* by rewriting a memory. Tier 1 is the most conservative starting point; page_post is
|
|
301
|
+
* what replaced the old 20-hour Page cap.
|
|
302
|
+
*/
|
|
303
|
+
export const FB_ENGAGEMENT_TIERS = {
|
|
304
|
+
1: { page_post: 3, group_post: 12, comment: 8, invite: 20, join: 3 },
|
|
305
|
+
2: { page_post: 3, group_post: 12, comment: 14, invite: 40, join: 5 },
|
|
306
|
+
3: { page_post: 4, group_post: 16, comment: 20, invite: 60, join: 8 },
|
|
307
|
+
};
|
|
308
|
+
export const FB_DEFAULT_TIER = 1;
|
|
309
|
+
|
|
310
|
+
/**
|
|
311
|
+
* Count the Facebook actions already spent since `sinceIso`, bucketed by type.
|
|
312
|
+
*
|
|
313
|
+
* page_post / comment / invite / join come from memories tagged "fb-action" +
|
|
314
|
+
* "action:<type>" (one memory = one action, unless the row also carries "count:<n>",
|
|
315
|
+
* which charges n — the invite lane logs one memory per batch). group_post comes from
|
|
316
|
+
* the fb_post_log ledger (visible-post + pending-approval rows) because every group
|
|
317
|
+
* lane already ticks `fb_groups mark` after each submission, so that table is the
|
|
318
|
+
* authoritative count rather than the model's recollection of its own run.
|
|
319
|
+
*
|
|
320
|
+
* Never throws (a budget lookup failure must not block a scheduled launch); on error
|
|
321
|
+
* every counter reads 0 so a broken ledger fails open rather than freezing all lanes.
|
|
322
|
+
*
|
|
323
|
+
* @param {{account?:string|null, sinceIso?:string, limit?:number}} opts
|
|
324
|
+
* @returns {{page_post:number, group_post:number, comment:number, invite:number, join:number, total:number, error?:string}}
|
|
325
|
+
*/
|
|
326
|
+
export function getFbActionBudget({ account = null, sinceIso, limit = 500 } = {}) {
|
|
327
|
+
const counts = Object.fromEntries(FB_ACTION_TYPES.map(t => [t, 0]));
|
|
328
|
+
const empty = { ...counts, total: 0 };
|
|
329
|
+
const acct = account ? String(account).trim().replace(/^@/, '').toLowerCase() : null;
|
|
330
|
+
try {
|
|
331
|
+
const db = getDb();
|
|
332
|
+
const since = sinceIso || new Date(Date.now() - 86400000).toISOString();
|
|
333
|
+
let sql = `SELECT tags FROM memories
|
|
334
|
+
WHERE trashed_at IS NULL
|
|
335
|
+
AND tags LIKE '%"fb-action"%'
|
|
336
|
+
AND tags NOT LIKE '%action:blocked%'
|
|
337
|
+
AND created_at >= ?`;
|
|
338
|
+
const params = [since];
|
|
339
|
+
if (acct) { sql += ` AND tags LIKE ?`; params.push(`%"acct:${acct}"%`); }
|
|
340
|
+
sql += ` ORDER BY created_at DESC LIMIT ?`;
|
|
341
|
+
params.push(limit);
|
|
342
|
+
|
|
343
|
+
let total = 0;
|
|
344
|
+
for (const row of db.prepare(sql).all(...params)) {
|
|
345
|
+
let tags;
|
|
346
|
+
try { tags = JSON.parse(row.tags || '[]'); } catch { continue; }
|
|
347
|
+
if (!Array.isArray(tags)) continue;
|
|
348
|
+
// One memory logs one action (first recognised action tag wins, so a row that
|
|
349
|
+
// also mentions a sibling action is not double-charged). A "count:<n>" tag
|
|
350
|
+
// charges n instead — used by invite batches.
|
|
351
|
+
let kind = null;
|
|
352
|
+
let n = 1;
|
|
353
|
+
for (const t of tags) {
|
|
354
|
+
if (typeof t !== 'string') continue;
|
|
355
|
+
if (!kind && t.startsWith('action:')) {
|
|
356
|
+
const k = t.slice(7).trim().toLowerCase();
|
|
357
|
+
if (Object.hasOwn(counts, k)) kind = k;
|
|
358
|
+
} else if (t.startsWith('count:')) {
|
|
359
|
+
const c = parseInt(t.slice(6), 10);
|
|
360
|
+
if (Number.isFinite(c) && c > 0) n = Math.min(c, 500);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (!kind) continue;
|
|
364
|
+
counts[kind] += n;
|
|
365
|
+
total += n;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// group_post: the fb_groups posting ledger. Guarded — the table is owned by the
|
|
369
|
+
// MCP server's schema, so a brand-new database may not have it yet (reads 0).
|
|
370
|
+
try {
|
|
371
|
+
const row = db.prepare(
|
|
372
|
+
`SELECT COUNT(*) AS n FROM fb_post_log
|
|
373
|
+
WHERE posted_at >= ?
|
|
374
|
+
AND status IN ('visible-post', 'pending-approval', 'posted', 'pending')`,
|
|
375
|
+
).get(since);
|
|
376
|
+
const n = Number(row?.n || 0);
|
|
377
|
+
counts.group_post += n;
|
|
378
|
+
total += n;
|
|
379
|
+
} catch { /* no ledger table yet */ }
|
|
380
|
+
|
|
381
|
+
return { ...counts, total };
|
|
382
|
+
} catch (err) {
|
|
383
|
+
return { ...empty, error: err.message };
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Read the current Facebook ramp tier from the newest caps memory (the tag in the
|
|
389
|
+
* query below). Falls back to the most conservative tier whenever the memory is missing,
|
|
390
|
+
* unparseable, or names a tier that does not exist — an unreadable ledger must narrow
|
|
391
|
+
* the budget, never widen it.
|
|
392
|
+
*
|
|
393
|
+
* @returns {{tier:number, caps:{page_post:number, group_post:number, comment:number, invite:number, join:number}, source:'memory'|'default', error?:string}}
|
|
394
|
+
*/
|
|
395
|
+
export function getFbEngagementTier() {
|
|
396
|
+
const fallback = { tier: FB_DEFAULT_TIER, caps: FB_ENGAGEMENT_TIERS[FB_DEFAULT_TIER], source: 'default' };
|
|
397
|
+
try {
|
|
398
|
+
const db = getDb();
|
|
399
|
+
const row = db.prepare(
|
|
400
|
+
`SELECT content FROM memories
|
|
401
|
+
WHERE trashed_at IS NULL
|
|
402
|
+
AND tags LIKE '%critpix-fb-engagement-caps%'
|
|
403
|
+
ORDER BY created_at DESC LIMIT 1`,
|
|
404
|
+
).all()[0];
|
|
405
|
+
if (!row?.content) return fallback;
|
|
406
|
+
const m = /\btier\s*[:=]\s*(\d+)/i.exec(row.content);
|
|
407
|
+
const tier = m ? Number(m[1]) : NaN;
|
|
408
|
+
if (!Object.hasOwn(FB_ENGAGEMENT_TIERS, tier)) return fallback;
|
|
409
|
+
return { tier, caps: FB_ENGAGEMENT_TIERS[tier], source: 'memory' };
|
|
410
|
+
} catch (err) {
|
|
411
|
+
return { ...fallback, error: err.message };
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// --- KV Config ---
|
|
416
|
+
|
|
417
|
+
const KV_DDL = 'CREATE TABLE IF NOT EXISTS kv_config (key TEXT PRIMARY KEY, value TEXT NOT NULL)';
|
|
418
|
+
|
|
419
|
+
export function getKvConfig(key) {
|
|
420
|
+
const d = getDb();
|
|
421
|
+
d.exec(KV_DDL);
|
|
422
|
+
const row = d.prepare('SELECT value FROM kv_config WHERE key = ?').get(key);
|
|
423
|
+
return row ? row.value : null;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
export function setKvConfig(key, value) {
|
|
427
|
+
const d = getDb();
|
|
428
|
+
d.exec(KV_DDL);
|
|
429
|
+
d.prepare('INSERT OR REPLACE INTO kv_config (key, value) VALUES (?, ?)').run(key, String(value));
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// --- Vector helpers ---
|
|
433
|
+
|
|
434
|
+
export function encodeVector(vector) {
|
|
435
|
+
return new Uint8Array(new Float32Array(vector).buffer);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
export function decodeVector(blob) {
|
|
439
|
+
return Array.from(new Float32Array(blob.buffer, blob.byteOffset, blob.byteLength / 4));
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
export function cosineSimilarity(a, b) {
|
|
443
|
+
let dot = 0;
|
|
444
|
+
for (let i = 0; i < a.length; i++) dot += a[i] * b[i];
|
|
445
|
+
return dot;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// --- Memory queries ---
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Search memories by vector similarity.
|
|
452
|
+
* Optionally filter by category/project/tags. Excludes trashed and system_metadata.
|
|
453
|
+
*/
|
|
454
|
+
export function searchMemories(vector, limit = 10, { category, project, tags, minImportance, scoreThreshold = 0.3, includeTrash = false } = {}) {
|
|
455
|
+
const d = getDb();
|
|
456
|
+
const clauses = [];
|
|
457
|
+
const params = [];
|
|
458
|
+
|
|
459
|
+
if (category) {
|
|
460
|
+
clauses.push('category = ?');
|
|
461
|
+
params.push(category);
|
|
462
|
+
}
|
|
463
|
+
if (project) {
|
|
464
|
+
clauses.push('project = ?');
|
|
465
|
+
params.push(project);
|
|
466
|
+
}
|
|
467
|
+
if (tags && tags.length > 0) {
|
|
468
|
+
for (const tag of tags) {
|
|
469
|
+
clauses.push(`EXISTS (SELECT 1 FROM json_each(tags) WHERE json_each.value = ?)`);
|
|
470
|
+
params.push(tag);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
if (minImportance) {
|
|
474
|
+
clauses.push('importance >= ?');
|
|
475
|
+
params.push(minImportance);
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
// Trash search is a rare admin path — the cache only holds live rows,
|
|
479
|
+
// so fall back to a direct scan when trash must be included.
|
|
480
|
+
if (includeTrash) {
|
|
481
|
+
const where = clauses.length > 0 ? 'WHERE ' + clauses.join(' AND ') : '';
|
|
482
|
+
const rows = d.prepare(`
|
|
483
|
+
SELECT id, vector, content, category, subcategory, project, tags, importance, source,
|
|
484
|
+
created_at, updated_at, accessed_at, access_count, related_files,
|
|
485
|
+
related_memory_ids, file_checksums, trashed_at, source_session_chunks
|
|
486
|
+
FROM memories ${where}
|
|
487
|
+
`).all(...params);
|
|
488
|
+
|
|
489
|
+
const scored = rows.map(row => {
|
|
490
|
+
const rowVec = decodeVector(row.vector);
|
|
491
|
+
const score = cosineSimilarity(vector, rowVec);
|
|
492
|
+
return { ...rowToPayload(row), id: row.id, score, vector: rowVec };
|
|
493
|
+
}).filter(r => r.score >= scoreThreshold);
|
|
494
|
+
|
|
495
|
+
scored.sort((a, b) => b.score - a.score);
|
|
496
|
+
return scored.slice(0, limit);
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
const must = [];
|
|
500
|
+
if (category) must.push({key:'category',match:{value:category}});
|
|
501
|
+
if (project) must.push({key:'project',match:{value:project}});
|
|
502
|
+
if (minImportance) must.push({key:'importance',range:{gte:minImportance}});
|
|
503
|
+
const should = (tags || []).map(tag=>({key:'tags',match:{value:tag}}));
|
|
504
|
+
return sharedSearch(vector,limit,{must,should},scoreThreshold).map(r=>({
|
|
505
|
+
id:r.id,score:r.score,...r.payload,vector:decodeVector(d.prepare('SELECT vector FROM memories WHERE id=?').get(r.id).vector),
|
|
506
|
+
}));
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Get all memories (for graph view, links computation, etc.)
|
|
511
|
+
*/
|
|
512
|
+
export function getAllMemories({ includeVectors = false, includeTrash = false } = {}) {
|
|
513
|
+
const d = getDb();
|
|
514
|
+
const vectorCol = includeVectors ? ', vector' : '';
|
|
515
|
+
const where = includeTrash ? '' : 'WHERE trashed_at IS NULL';
|
|
516
|
+
|
|
517
|
+
const rows = d.prepare(`
|
|
518
|
+
SELECT id, content, category, subcategory, project, tags, importance, source,
|
|
519
|
+
created_at, updated_at, accessed_at, access_count, related_files,
|
|
520
|
+
related_memory_ids, file_checksums, trashed_at, source_session_chunks
|
|
521
|
+
${vectorCol}
|
|
522
|
+
FROM memories ${where}
|
|
523
|
+
ORDER BY created_at DESC
|
|
524
|
+
`).all();
|
|
525
|
+
|
|
526
|
+
return rows.map(row => {
|
|
527
|
+
const payload = rowToPayload(row);
|
|
528
|
+
const result = { id: row.id, ...payload };
|
|
529
|
+
if (includeVectors && row.vector) {
|
|
530
|
+
result.vector = decodeVector(row.vector);
|
|
531
|
+
}
|
|
532
|
+
return result;
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* Get all memories with vectors for link computation.
|
|
538
|
+
*/
|
|
539
|
+
export function getAllMemoriesWithVectors() {
|
|
540
|
+
const d = getDb();
|
|
541
|
+
const rows = d.prepare(`
|
|
542
|
+
SELECT id, vector, content, category, subcategory, project, tags, importance, source,
|
|
543
|
+
created_at, updated_at, accessed_at, access_count, related_files,
|
|
544
|
+
related_memory_ids, file_checksums, trashed_at, source_session_chunks
|
|
545
|
+
FROM memories WHERE trashed_at IS NULL
|
|
546
|
+
`).all();
|
|
547
|
+
|
|
548
|
+
return rows.map(row => ({
|
|
549
|
+
id: row.id,
|
|
550
|
+
vector: decodeVector(row.vector),
|
|
551
|
+
...rowToPayload(row),
|
|
552
|
+
}));
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
export function getMemoryById(id) {
|
|
556
|
+
const d = getDb();
|
|
557
|
+
const row = d.prepare(`
|
|
558
|
+
SELECT id, content, category, subcategory, project, tags, importance, source,
|
|
559
|
+
created_at, updated_at, accessed_at, access_count, related_files,
|
|
560
|
+
related_memory_ids, file_checksums, trashed_at, source_session_chunks
|
|
561
|
+
FROM memories WHERE id = ?
|
|
562
|
+
`).get(id);
|
|
563
|
+
|
|
564
|
+
if (!row) return null;
|
|
565
|
+
return { id: row.id, ...rowToPayload(row) };
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
export function getMemoryWithVector(id) {
|
|
569
|
+
const d = getDb();
|
|
570
|
+
const row = d.prepare(`
|
|
571
|
+
SELECT id, vector, content, category, subcategory, project, tags, importance, source,
|
|
572
|
+
created_at, updated_at, accessed_at, access_count, related_files,
|
|
573
|
+
related_memory_ids, file_checksums, trashed_at, source_session_chunks
|
|
574
|
+
FROM memories WHERE id = ?
|
|
575
|
+
`).get(id);
|
|
576
|
+
|
|
577
|
+
if (!row) return null;
|
|
578
|
+
return { id: row.id, vector: decodeVector(row.vector), ...rowToPayload(row) };
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
export function updateMemoryPayload(id, updates) {
|
|
582
|
+
return sharedUpdate(id, updates);
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
export function softDeleteMemory(id) {
|
|
586
|
+
const d = getDb();
|
|
587
|
+
d.prepare('UPDATE memories SET trashed_at = ? WHERE id = ?').run(new Date().toISOString(), id);
|
|
588
|
+
memoryVectors.remove(id);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
export function hardDeleteMemory(id) {
|
|
592
|
+
return sharedDelete(id);
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
export function restoreMemory(id) {
|
|
596
|
+
const d = getDb();
|
|
597
|
+
d.prepare('UPDATE memories SET trashed_at = NULL WHERE id = ?').run(id);
|
|
598
|
+
memoryVectors.setFromDb(id);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
export function getTrashedMemories() {
|
|
602
|
+
const d = getDb();
|
|
603
|
+
const rows = d.prepare(`
|
|
604
|
+
SELECT id, content, category, subcategory, project, tags, importance, source,
|
|
605
|
+
created_at, updated_at, accessed_at, access_count, related_files,
|
|
606
|
+
related_memory_ids, file_checksums, trashed_at, source_session_chunks
|
|
607
|
+
FROM memories WHERE trashed_at IS NOT NULL
|
|
608
|
+
ORDER BY trashed_at DESC
|
|
609
|
+
`).all();
|
|
610
|
+
|
|
611
|
+
return rows.map(row => ({ id: row.id, ...rowToPayload(row) }));
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
export function purgeTrash() {
|
|
615
|
+
const d = getDb();
|
|
616
|
+
const rows = d.prepare('SELECT id FROM memories WHERE trashed_at IS NOT NULL').all();
|
|
617
|
+
d.exec('BEGIN IMMEDIATE');
|
|
618
|
+
try { for(const row of rows)sharedDelete(row.id);d.exec('COMMIT'); } catch(error){d.exec('ROLLBACK');memoryVectors.invalidate();throw error;}
|
|
619
|
+
return rows.map(r => r.id);
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
export function countMemories(filter = {}) {
|
|
623
|
+
const d = getDb();
|
|
624
|
+
const clauses = ['trashed_at IS NULL'];
|
|
625
|
+
const params = [];
|
|
626
|
+
|
|
627
|
+
if (filter.category) {
|
|
628
|
+
clauses.push('category = ?');
|
|
629
|
+
params.push(filter.category);
|
|
630
|
+
}
|
|
631
|
+
if (filter.project) {
|
|
632
|
+
clauses.push('project = ?');
|
|
633
|
+
params.push(filter.project);
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
const result = d.prepare(`SELECT COUNT(*) as cnt FROM memories WHERE ${clauses.join(' AND ')}`).get(...params);
|
|
637
|
+
return result.cnt;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
export function getMemoryStats() {
|
|
641
|
+
const d = getDb();
|
|
642
|
+
|
|
643
|
+
const total = d.prepare('SELECT COUNT(*) as cnt FROM memories WHERE trashed_at IS NULL').get().cnt;
|
|
644
|
+
const trashedCount = d.prepare('SELECT COUNT(*) as cnt FROM memories WHERE trashed_at IS NOT NULL').get().cnt;
|
|
645
|
+
|
|
646
|
+
const catRows = d.prepare('SELECT category, COUNT(*) as cnt FROM memories WHERE trashed_at IS NULL GROUP BY category').all();
|
|
647
|
+
const by_category = {};
|
|
648
|
+
for (const row of catRows) by_category[row.category] = row.cnt;
|
|
649
|
+
|
|
650
|
+
const projRows = d.prepare('SELECT project, COUNT(*) as cnt FROM memories WHERE trashed_at IS NULL GROUP BY project').all();
|
|
651
|
+
const by_project = {};
|
|
652
|
+
for (const row of projRows) by_project[row.project || 'global'] = row.cnt;
|
|
653
|
+
|
|
654
|
+
const dateRow = d.prepare('SELECT MIN(created_at) as oldest, MAX(created_at) as newest FROM memories WHERE trashed_at IS NULL').get();
|
|
655
|
+
|
|
656
|
+
return {
|
|
657
|
+
total,
|
|
658
|
+
trashedCount,
|
|
659
|
+
by_category,
|
|
660
|
+
by_project,
|
|
661
|
+
oldest: dateRow.oldest,
|
|
662
|
+
newest: dateRow.newest,
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
/**
|
|
667
|
+
* Get memories by category for export.
|
|
668
|
+
*/
|
|
669
|
+
export function getMemoriesByCategory(category) {
|
|
670
|
+
const d = getDb();
|
|
671
|
+
const rows = d.prepare(`
|
|
672
|
+
SELECT id, content, category, subcategory, project, tags, importance, source,
|
|
673
|
+
created_at, updated_at, accessed_at, access_count, related_files,
|
|
674
|
+
related_memory_ids, file_checksums, trashed_at, source_session_chunks
|
|
675
|
+
FROM memories WHERE category = ? AND trashed_at IS NULL
|
|
676
|
+
ORDER BY created_at DESC
|
|
677
|
+
`).all(category);
|
|
678
|
+
|
|
679
|
+
return rows.map(row => ({ id: row.id, ...rowToPayload(row) }));
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
/**
|
|
683
|
+
* Batch update category for memories.
|
|
684
|
+
*/
|
|
685
|
+
export function updateMemoriesCategory(ids, newCategory) {
|
|
686
|
+
const d = getDb();
|
|
687
|
+
d.exec('BEGIN');
|
|
688
|
+
try {
|
|
689
|
+
const stmt = d.prepare('UPDATE memories SET category = ? WHERE id = ?');
|
|
690
|
+
for (const id of ids) {
|
|
691
|
+
stmt.run(newCategory, id);
|
|
692
|
+
}
|
|
693
|
+
d.exec('COMMIT');
|
|
694
|
+
} catch (err) {
|
|
695
|
+
d.exec('ROLLBACK');
|
|
696
|
+
throw err;
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
// --- Categories ---
|
|
701
|
+
|
|
702
|
+
export function getCategories() {
|
|
703
|
+
const d = getDb();
|
|
704
|
+
return d.prepare('SELECT name, description, created_at, parent, color, is_parent FROM categories ORDER BY name').all();
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
export function saveCategories(categories) {
|
|
708
|
+
const d = getDb();
|
|
709
|
+
d.exec('BEGIN');
|
|
710
|
+
try {
|
|
711
|
+
const existing = new Set(d.prepare('SELECT name FROM categories').all().map(r => r.name));
|
|
712
|
+
const incoming = new Set(categories.map(c => c.name));
|
|
713
|
+
|
|
714
|
+
for (const name of existing) {
|
|
715
|
+
if (!incoming.has(name)) {
|
|
716
|
+
d.prepare('DELETE FROM categories WHERE name = ?').run(name);
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
const stmt = d.prepare('INSERT OR REPLACE INTO categories (name, description, created_at, parent, color, is_parent) VALUES (?, ?, ?, ?, ?, ?)');
|
|
721
|
+
for (const cat of categories) {
|
|
722
|
+
stmt.run(cat.name, cat.description, cat.created_at, cat.parent || null, cat.color || null, cat.is_parent ? 1 : 0);
|
|
723
|
+
}
|
|
724
|
+
d.exec('COMMIT');
|
|
725
|
+
} catch (err) {
|
|
726
|
+
d.exec('ROLLBACK');
|
|
727
|
+
throw err;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
// --- Session Chunks ---
|
|
732
|
+
|
|
733
|
+
export function countSessionChunks() {
|
|
734
|
+
const d = getDb();
|
|
735
|
+
return d.prepare('SELECT COUNT(*) as cnt FROM session_chunks').get().cnt;
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
export function searchSessionChunks(vector, limit = 10, { project, scoreThreshold = 0.3 } = {}) {
|
|
739
|
+
return sharedSessionSearch(vector,limit,project ? {must:[{key:'project',match:{value:project}}]} : undefined,scoreThreshold);
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
// --- Row conversion helpers ---
|
|
743
|
+
|
|
744
|
+
function parseJson(val, fallback) {
|
|
745
|
+
if (val == null || val === '') return fallback;
|
|
746
|
+
if (typeof val === 'string') {
|
|
747
|
+
try { return JSON.parse(val); } catch { return fallback; }
|
|
748
|
+
}
|
|
749
|
+
return val;
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
function rowToPayload(row) {
|
|
753
|
+
return {
|
|
754
|
+
content: row.content,
|
|
755
|
+
category: row.category,
|
|
756
|
+
subcategory: row.subcategory || undefined,
|
|
757
|
+
project: row.project,
|
|
758
|
+
tags: parseJson(row.tags, []),
|
|
759
|
+
importance: row.importance ?? 5,
|
|
760
|
+
source: row.source || 'self-discovered',
|
|
761
|
+
created_at: row.created_at,
|
|
762
|
+
updated_at: row.updated_at,
|
|
763
|
+
accessed_at: row.accessed_at,
|
|
764
|
+
access_count: row.access_count ?? 0,
|
|
765
|
+
related_files: parseJson(row.related_files, undefined),
|
|
766
|
+
related_memory_ids: parseJson(row.related_memory_ids, undefined),
|
|
767
|
+
file_checksums: parseJson(row.file_checksums, undefined),
|
|
768
|
+
trashed_at: row.trashed_at || null,
|
|
769
|
+
source_session_chunks: parseJson(row.source_session_chunks, undefined),
|
|
770
|
+
};
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
// --- Session cache + FTS helpers ---
|
|
774
|
+
|
|
775
|
+
export function upsertSessionCache(entry) {
|
|
776
|
+
const d = getDb();
|
|
777
|
+
d.prepare(`INSERT OR REPLACE INTO session_cache
|
|
778
|
+
(session_id, provider, project, project_path, git_branch, first_prompt, message_count,
|
|
779
|
+
created, modified, file_path, file_size, file_mtime, body_size, deleted, account_id)
|
|
780
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(
|
|
781
|
+
entry.session_id, entry.provider, entry.project || null, entry.project_path || null,
|
|
782
|
+
entry.git_branch || null, entry.first_prompt || null, entry.message_count || 0,
|
|
783
|
+
entry.created || null, entry.modified || null, entry.file_path || null,
|
|
784
|
+
entry.file_size || null, entry.file_mtime || null, entry.body_size || 0,
|
|
785
|
+
entry.deleted ? 1 : 0, entry.account_id || null,
|
|
786
|
+
);
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
export function upsertSessionFts(entry) {
|
|
790
|
+
const d = getDb();
|
|
791
|
+
d.prepare('DELETE FROM session_fts WHERE session_id = ? AND provider = ?')
|
|
792
|
+
.run(entry.session_id, entry.provider);
|
|
793
|
+
d.prepare(`INSERT INTO session_fts
|
|
794
|
+
(session_id, provider, project, first_prompt, body)
|
|
795
|
+
VALUES (?, ?, ?, ?, ?)`).run(
|
|
796
|
+
entry.session_id, entry.provider, entry.project || null,
|
|
797
|
+
entry.first_prompt || '', entry.body || '',
|
|
798
|
+
);
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
export function getSessionCacheEntry(sessionId, provider) {
|
|
802
|
+
const d = getDb();
|
|
803
|
+
return d.prepare('SELECT * FROM session_cache WHERE session_id = ? AND provider = ?')
|
|
804
|
+
.get(sessionId, provider) || null;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
export function getSessionCacheFileMeta(filePath, provider) {
|
|
808
|
+
const d = getDb();
|
|
809
|
+
return d.prepare('SELECT file_size, file_mtime FROM session_cache WHERE file_path = ? AND provider = ?')
|
|
810
|
+
.get(filePath, provider) || null;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
export function markSessionDeleted(sessionId, provider, deleted = true) {
|
|
814
|
+
const d = getDb();
|
|
815
|
+
d.prepare('UPDATE session_cache SET deleted = ? WHERE session_id = ? AND provider = ?')
|
|
816
|
+
.run(deleted ? 1 : 0, sessionId, provider);
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
export function listSessionCache(provider, { projectPath, limit = 100, offset = 0 } = {}) {
|
|
820
|
+
const d = getDb();
|
|
821
|
+
const clauses = ['provider = ?'];
|
|
822
|
+
const params = [provider];
|
|
823
|
+
if (projectPath) {
|
|
824
|
+
clauses.push('project_path = ?');
|
|
825
|
+
params.push(projectPath);
|
|
826
|
+
}
|
|
827
|
+
const sql = `SELECT * FROM session_cache WHERE ${clauses.join(' AND ')}
|
|
828
|
+
ORDER BY modified DESC LIMIT ? OFFSET ?`;
|
|
829
|
+
params.push(limit, offset);
|
|
830
|
+
return d.prepare(sql).all(...params);
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
/** Remove only a provider's derived Resume/search cache. Source histories live
|
|
834
|
+
* outside memory.db and are intentionally unaffected by this helper. */
|
|
835
|
+
export function clearSessionCacheProvider(provider) {
|
|
836
|
+
const normalized = String(provider || '').trim();
|
|
837
|
+
if (!normalized) throw new Error('Session cache provider is required');
|
|
838
|
+
const d = getDb();
|
|
839
|
+
const cached = Number(d.prepare('SELECT COUNT(*) AS count FROM session_cache WHERE provider = ?')
|
|
840
|
+
.get(normalized)?.count || 0);
|
|
841
|
+
const fts = Number(d.prepare('SELECT COUNT(*) AS count FROM session_fts WHERE provider = ?')
|
|
842
|
+
.get(normalized)?.count || 0);
|
|
843
|
+
d.exec('BEGIN IMMEDIATE');
|
|
844
|
+
try {
|
|
845
|
+
d.prepare('DELETE FROM session_fts WHERE provider = ?').run(normalized);
|
|
846
|
+
d.prepare('DELETE FROM session_cache WHERE provider = ?').run(normalized);
|
|
847
|
+
d.exec('COMMIT');
|
|
848
|
+
} catch (error) {
|
|
849
|
+
try { d.exec('ROLLBACK'); } catch {}
|
|
850
|
+
throw error;
|
|
851
|
+
}
|
|
852
|
+
return { cached, fts };
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
/** Escape a user-provided query for safe FTS5 MATCH.
|
|
856
|
+
* Strips control chars, wraps each token in quotes, joins with AND. */
|
|
857
|
+
export function buildFtsQuery(raw) {
|
|
858
|
+
if (!raw) return '';
|
|
859
|
+
const cleaned = String(raw)
|
|
860
|
+
.replace(/["'()]/g, ' ')
|
|
861
|
+
.replace(/[\r\n\t]+/g, ' ')
|
|
862
|
+
.trim();
|
|
863
|
+
if (!cleaned) return '';
|
|
864
|
+
const tokens = cleaned.split(/\s+/).filter(t => t.length >= 2);
|
|
865
|
+
if (tokens.length === 0) return '';
|
|
866
|
+
return tokens.map(t => `"${t}"*`).join(' AND ');
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
/** Run FTS5 search over session_fts. Returns array of { session_id, provider, rank, snippet }. */
|
|
870
|
+
export function searchSessionFts(query, { provider, project, limit = 50 } = {}) {
|
|
871
|
+
const d = getDb();
|
|
872
|
+
const matchQuery = buildFtsQuery(query);
|
|
873
|
+
if (!matchQuery) return [];
|
|
874
|
+
|
|
875
|
+
const clauses = ['session_fts MATCH ?'];
|
|
876
|
+
const params = [matchQuery];
|
|
877
|
+
|
|
878
|
+
if (provider) {
|
|
879
|
+
clauses.push('provider = ?');
|
|
880
|
+
params.push(provider);
|
|
881
|
+
}
|
|
882
|
+
if (project) {
|
|
883
|
+
clauses.push('project = ?');
|
|
884
|
+
params.push(project);
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
const sql = `SELECT session_id, provider, project,
|
|
888
|
+
snippet(session_fts, 4, '<mark>', '</mark>', '…', 16) AS snippet,
|
|
889
|
+
bm25(session_fts) AS rank
|
|
890
|
+
FROM session_fts
|
|
891
|
+
WHERE ${clauses.join(' AND ')}
|
|
892
|
+
ORDER BY rank
|
|
893
|
+
LIMIT ?`;
|
|
894
|
+
params.push(limit);
|
|
895
|
+
try {
|
|
896
|
+
return d.prepare(sql).all(...params);
|
|
897
|
+
} catch {
|
|
898
|
+
return [];
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
function rowToSessionPayload(row) {
|
|
903
|
+
return {
|
|
904
|
+
content: row.content,
|
|
905
|
+
summary: row.summary || '',
|
|
906
|
+
session_id: row.session_id || '',
|
|
907
|
+
project: row.project || '',
|
|
908
|
+
git_branch: row.git_branch || null,
|
|
909
|
+
cwd: row.cwd || null,
|
|
910
|
+
chunk_index: row.chunk_index ?? 0,
|
|
911
|
+
start_timestamp: row.start_timestamp || '',
|
|
912
|
+
end_timestamp: row.end_timestamp || '',
|
|
913
|
+
tools_used: parseJson(row.tools_used, []),
|
|
914
|
+
files_modified: parseJson(row.files_modified, []),
|
|
915
|
+
files_read: parseJson(row.files_read, []),
|
|
916
|
+
user_messages: parseJson(row.user_messages, []),
|
|
917
|
+
turn_count: row.turn_count ?? 0,
|
|
918
|
+
related_memory_ids: parseJson(row.related_memory_ids, []),
|
|
919
|
+
dedup_memory_id: row.dedup_memory_id || null,
|
|
920
|
+
indexed_at: row.indexed_at || '',
|
|
921
|
+
};
|
|
922
|
+
}
|