monomind 1.14.6 → 1.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/reengineer-squad/boss.md +113 -0
- package/.claude/agents/reengineer-squad/critic-architect.md +132 -0
- package/.claude/agents/reengineer-squad/git-manager.md +145 -0
- package/.claude/agents/reengineer-squad/idea-generator.md +95 -0
- package/.claude/agents/reengineer-squad/implementer.md +112 -0
- package/.claude/agents/reengineer-squad/integration-planner.md +112 -0
- package/.claude/agents/reengineer-squad/source-analyst.md +103 -0
- package/.claude/agents/reengineer-squad/target-analyst.md +118 -0
- package/.claude/agents/reengineer-squad/tester.md +105 -0
- package/.claude/commands/mastermind/master.md +35 -14
- package/.claude/helpers/handlers/capture-handler.cjs +155 -18
- package/.claude/helpers/monolean-activate.cjs +20 -0
- package/.claude/helpers/monolean-config.cjs +76 -0
- package/.claude/helpers/monolean-instructions.cjs +109 -0
- package/.claude/helpers/monolean-propagate.cjs +9 -0
- package/.claude/helpers/monolean-tracker.cjs +18 -0
- package/.claude/helpers/skill-registry.json +2 -2
- package/.claude/settings.json +34 -2
- package/.claude/skills/agent-browser-testing/SKILL.md +301 -18
- package/.claude/skills/mastermind/runorg.md +69 -23
- package/.claude/skills/monodesign/SKILL.md +32 -1
- package/.claude/skills/monodesign/adapt.md +53 -0
- package/.claude/skills/monodesign/agents/monodesign-asset-producer.md +100 -0
- package/.claude/skills/monodesign/animate.md +65 -0
- package/.claude/skills/monodesign/audit.md +89 -0
- package/.claude/skills/monodesign/bolder.md +50 -0
- package/.claude/skills/monodesign/clarify.md +64 -0
- package/.claude/skills/monodesign/colorize.md +68 -0
- package/.claude/skills/monodesign/craft.md +51 -0
- package/.claude/skills/monodesign/critique.md +66 -0
- package/.claude/skills/monodesign/delight.md +47 -0
- package/.claude/skills/monodesign/distill.md +56 -0
- package/.claude/skills/monodesign/document.md +80 -0
- package/.claude/skills/monodesign/extract.md +74 -0
- package/.claude/skills/monodesign/harden.md +65 -0
- package/.claude/skills/monodesign/live.md +59 -0
- package/.claude/skills/monodesign/onboard.md +50 -0
- package/.claude/skills/monodesign/optimize.md +64 -0
- package/.claude/skills/monodesign/overdrive.md +56 -0
- package/.claude/skills/monodesign/polish.md +68 -0
- package/.claude/skills/monodesign/quieter.md +57 -0
- package/.claude/skills/monodesign/reference/antipatterns-catalog.md +248 -76
- package/.claude/skills/monodesign/reference/codex.md +107 -0
- package/.claude/skills/monodesign/reference/craft.md +3 -0
- package/.claude/skills/monodesign/reference/hooks.md +99 -0
- package/.claude/skills/monodesign/reference/image-prompts.md +12 -0
- package/.claude/skills/monodesign/shape.md +71 -0
- package/.claude/skills/monodesign/teach.md +69 -0
- package/.claude/skills/monodesign/typeset.md +59 -0
- package/.claude/skills/monolean/SKILL.md +118 -0
- package/.claude/skills/monolean-audit/SKILL.md +41 -0
- package/.claude/skills/monolean-debt/SKILL.md +46 -0
- package/.claude/skills/monolean-help/SKILL.md +60 -0
- package/.claude/skills/monolean-review/SKILL.md +57 -0
- package/package.json +8 -2
- package/packages/@monomind/cli/bin/cli.js +3 -1
- package/packages/@monomind/cli/dist/dashboard/server.js +137 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-adapters.test.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-adapters.test.js +51 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-analyzer.test.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-analyzer.test.js +68 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-builtin-handlers.test.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-builtin-handlers.test.js +139 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-cdp.test.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-cdp.test.js +169 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-dashboard.test.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-dashboard.test.js +179 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-engine.test.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-engine.test.js +122 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-expression.test.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-expression.test.js +54 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-store.test.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-store.test.js +99 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-workflow-types.test.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/__tests__/browse-workflow-types.test.js +33 -0
- package/packages/@monomind/cli/dist/src/browser/action-builder/analyzer.d.ts +11 -0
- package/packages/@monomind/cli/dist/src/browser/action-builder/analyzer.js +71 -0
- package/packages/@monomind/cli/dist/src/browser/action-builder/types.d.ts +47 -0
- package/packages/@monomind/cli/dist/src/browser/action-builder/types.js +2 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/gemini.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/gemini.js +16 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/google.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/google.js +17 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/index.d.ts +19 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/index.js +23 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/instagram.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/instagram.js +17 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/linkedin.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/linkedin.js +19 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/microsoft.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/microsoft.js +16 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/x.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/browser/adapters/x.js +19 -0
- package/packages/@monomind/cli/dist/src/browser/dashboard/api-types.d.ts +50 -0
- package/packages/@monomind/cli/dist/src/browser/dashboard/api-types.js +14 -0
- package/packages/@monomind/cli/dist/src/browser/dashboard/server.d.ts +9 -0
- package/packages/@monomind/cli/dist/src/browser/dashboard/server.js +62 -0
- package/packages/@monomind/cli/dist/src/browser/dashboard/ui.html +1811 -0
- package/packages/@monomind/cli/dist/src/browser/workflow/builtin-handlers.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/browser/workflow/builtin-handlers.js +343 -0
- package/packages/@monomind/cli/dist/src/browser/workflow/engine.d.ts +15 -0
- package/packages/@monomind/cli/dist/src/browser/workflow/engine.js +127 -0
- package/packages/@monomind/cli/dist/src/browser/workflow/expression.d.ts +4 -0
- package/packages/@monomind/cli/dist/src/browser/workflow/expression.js +64 -0
- package/packages/@monomind/cli/dist/src/browser/workflow/store.d.ts +24 -0
- package/packages/@monomind/cli/dist/src/browser/workflow/store.js +145 -0
- package/packages/@monomind/cli/dist/src/browser/workflow/types.d.ts +48 -0
- package/packages/@monomind/cli/dist/src/browser/workflow/types.js +2 -0
- package/packages/@monomind/cli/dist/src/commands/browse-action.d.ts +4 -0
- package/packages/@monomind/cli/dist/src/commands/browse-action.js +151 -0
- package/packages/@monomind/cli/dist/src/commands/browse-platform.d.ts +4 -0
- package/packages/@monomind/cli/dist/src/commands/browse-platform.js +117 -0
- package/packages/@monomind/cli/dist/src/commands/browse-workflow.d.ts +4 -0
- package/packages/@monomind/cli/dist/src/commands/browse-workflow.js +153 -0
- package/packages/@monomind/cli/dist/src/commands/browse.d.ts +10 -6
- package/packages/@monomind/cli/dist/src/commands/browse.js +11 -2154
- package/packages/@monomind/cli/dist/src/commands/design-detect.d.ts +21 -0
- package/packages/@monomind/cli/dist/src/commands/design-detect.js +127 -0
- package/packages/@monomind/cli/dist/src/commands/design-palette.d.ts +22 -0
- package/packages/@monomind/cli/dist/src/commands/design-palette.js +539 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-core-commands.d.ts +10 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-core-commands.js +377 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-coverage-commands.d.ts +12 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-coverage-commands.js +1217 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-coverage-utils.d.ts +42 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-coverage-utils.js +220 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-extended-commands.d.ts +14 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-extended-commands.js +579 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-formatting.d.ts +13 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-formatting.js +42 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-routing-commands.d.ts +15 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-routing-commands.js +723 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-workers.d.ts +9 -0
- package/packages/@monomind/cli/dist/src/commands/hooks-workers.js +782 -0
- package/packages/@monomind/cli/dist/src/commands/hooks.d.ts +8 -0
- package/packages/@monomind/cli/dist/src/commands/hooks.js +179 -4103
- package/packages/@monomind/cli/dist/src/commands/index.d.ts +1 -0
- package/packages/@monomind/cli/dist/src/commands/index.js +6 -0
- package/packages/@monomind/cli/dist/src/commands/org.js +14 -15
- package/packages/@monomind/cli/dist/src/commands/tokens.js +77 -1
- package/packages/@monomind/cli/dist/src/graph/enrich.mjs +362 -0
- package/packages/@monomind/cli/dist/src/init/executor.js +18 -8
- package/packages/@monomind/cli/dist/src/init/settings-generator.js +39 -5
- package/packages/@monomind/cli/dist/src/init/statusline-generator.js +25 -5
- package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.d.ts +3 -5
- package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.js +619 -326
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-embedding.d.ts +161 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-embedding.js +506 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-intelligence.d.ts +26 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-intelligence.js +1328 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.d.ts +27 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-routing.js +1591 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.d.ts +3 -38
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +5 -3393
- package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +24 -14
- package/packages/@monomind/cli/dist/src/mcp-tools/workflow-tools.js +54 -1
- package/packages/@monomind/cli/dist/src/memory/embedding-operations.d.ts +58 -0
- package/packages/@monomind/cli/dist/src/memory/embedding-operations.js +299 -0
- package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.js +37 -3
- package/packages/@monomind/cli/dist/src/memory/hnsw-operations.d.ts +130 -0
- package/packages/@monomind/cli/dist/src/memory/hnsw-operations.js +400 -0
- package/packages/@monomind/cli/dist/src/memory/intelligence.js +42 -23
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +52 -8
- package/packages/@monomind/cli/dist/src/memory/memory-crud.d.ts +67 -0
- package/packages/@monomind/cli/dist/src/memory/memory-crud.js +415 -0
- package/packages/@monomind/cli/dist/src/memory/memory-initializer.d.ts +9 -322
- package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +17 -1794
- package/packages/@monomind/cli/dist/src/memory/memory-migrations.d.ts +30 -0
- package/packages/@monomind/cli/dist/src/memory/memory-migrations.js +134 -0
- package/packages/@monomind/cli/dist/src/memory/memory-read.d.ts +78 -0
- package/packages/@monomind/cli/dist/src/memory/memory-read.js +331 -0
- package/packages/@monomind/cli/dist/src/memory/memory-schema.d.ts +13 -0
- package/packages/@monomind/cli/dist/src/memory/memory-schema.js +167 -0
- package/packages/@monomind/cli/dist/src/memory/sona-optimizer.js +37 -4
- package/packages/@monomind/cli/dist/src/monovector/route-outcomes.js +16 -6
- package/packages/@monomind/cli/dist/src/pricing/model-pricing.d.ts +41 -0
- package/packages/@monomind/cli/dist/src/pricing/model-pricing.js +61 -0
- package/packages/@monomind/cli/dist/src/ui/.monomind/capture/active-run.json +1 -0
- package/packages/@monomind/cli/dist/src/ui/collector.mjs +799 -0
- package/packages/@monomind/cli/dist/src/ui/dashboard.html +13986 -0
- package/packages/@monomind/cli/dist/src/ui/data/agent-avatars.html +763 -0
- package/packages/@monomind/cli/dist/src/ui/data/agent-avatars.json +966 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/account-strategist.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/accounts-payable.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/adaptive-coordinator.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/adaptive-coordinator2.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/ai-citation.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/ai-engineer.svg +61 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/analytics-reporter.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/api-tester.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/architecture.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/automation-governance.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/backend-dev.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/benchmarker.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/blockchain-auditor.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/byzantine-coord.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/case-analyst.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/cicd-engineer.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/cloud-architect.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/code-review-swarm.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/coder-v119.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/coder.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/collective-coord.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/compliance-auditor.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/consensus-coordinator.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/content-creator.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/crdt-synchronizer.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/cro-specialist.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/data-consolidator.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/data-engineer.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/database-optimizer.svg +61 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/deal-strategist.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/defender.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/devops-automator.svg +56 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/discovery-coach.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/email-marketing.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/embedded-firmware.svg +61 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/evidence-collector.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/experiment-tracker.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/feedback-synthesizer.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/finance-tracker.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/frontend-developer.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/game-audio-engineer.svg +59 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/game-designer.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/gossip-coordinator.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/hierarchical-coord.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/incident-commander.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/infrastructure.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/input-validator.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/ios-developer.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/issue-tracker.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/judge.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/launch-strategist.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/legal-compliance.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/level-designer.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/load-balancer.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/mcp-builder.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/memory-coordinator.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/mesh-coordinator.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/ml-developer.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/mobile-app-builder.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/mobile-dev.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/model-qa.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/narrative-designer.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/outbound-strategist.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/path-validator.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/payment-agent.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/perf-analyzer.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/pipeline-analyst.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/planner.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/pr-manager.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/pricing-strategist.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/product-manager.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/production-validator.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/project-shepherd.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/proposal-strategist.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/prosecutor.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/pseudocode.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/queen-coordinator.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/quorum-manager.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/raft-manager.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/reality-checker.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/recruitment.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/refinement.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/release-manager.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/repo-architect.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/researcher.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/resource-allocator.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/reviewer.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/safe-executor.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/sales-coach.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/sales-engineer.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/scout-explorer.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/security-architect.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/security-auditor.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/senior-developer.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/senior-pm.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/seo-specialist.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/social-media.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/solidity-engineer.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/sparc-coder.svg +58 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/sparc-coord.svg +56 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/specification.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/sprint-prioritizer.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/sre.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/studio-operations.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/studio-producer.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/support-responder.svg +56 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/system-architect.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/task-orchestrator.svg +56 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/technical-artist.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/technical-writer.svg +59 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/tester.svg +53 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/threat-detection.svg +61 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/trend-researcher.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/trial-director.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/unity-architect.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/visionos-engineer.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/worker-specialist.svg +55 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/workflow-architect.svg +57 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/workflow-automation.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/avatars/zk-steward.svg +54 -0
- package/packages/@monomind/cli/dist/src/ui/data/known-projects.json +1 -0
- package/packages/@monomind/cli/dist/src/ui/data/mastermind-sessions.json +1 -0
- package/packages/@monomind/cli/dist/src/ui/data/sessions/_index.json +1 -0
- package/packages/@monomind/cli/dist/src/ui/orgs.html +2215 -0
- package/packages/@monomind/cli/dist/src/ui/server.mjs +6175 -0
- package/packages/@monomind/cli/dist/src/ui/sse-manager.mjs +119 -0
- package/packages/@monomind/cli/dist/src/update/checker.js +1 -1
- package/packages/@monomind/cli/dist/workflow/builtin-handlers.js +321 -0
- package/packages/@monomind/cli/dist/workflow/engine.js +253 -0
- package/packages/@monomind/cli/dist/workflow/expression.js +98 -0
- package/packages/@monomind/cli/dist/workflow/types.js +2 -0
- package/packages/@monomind/cli/package.json +8 -5
|
@@ -85,7 +85,12 @@ const HNSW_RETRY_INTERVAL_MS = 60_000;
|
|
|
85
85
|
// ids in the HNSW graph that SQL filters drop at query time — wasting candidate slots.
|
|
86
86
|
// When the dirty count crosses the rebuild threshold, the next search rebuilds from DB.
|
|
87
87
|
let _hnswDirtyCount = 0;
|
|
88
|
-
|
|
88
|
+
// Ghost entries (from upserts and soft-deletes) are already filtered at query
|
|
89
|
+
// time via SQL WHERE clauses, so they don't corrupt results — they only waste
|
|
90
|
+
// candidate slots. Raising the threshold from 50→200 avoids frequent full
|
|
91
|
+
// rebuilds during busy write sessions while keeping the ghost-slot overhead
|
|
92
|
+
// bounded (at 200 ghosts the index wastes at most ~1 extra HNSW hop on average).
|
|
93
|
+
const HNSW_REBUILD_THRESHOLD = 200;
|
|
89
94
|
/**
|
|
90
95
|
* Resolve database path with path traversal protection.
|
|
91
96
|
* Only allows paths within or below the project's .swarm directory,
|
|
@@ -628,19 +633,58 @@ export async function bridgeSearchEntries(options) {
|
|
|
628
633
|
catch {
|
|
629
634
|
// Fall back to keyword search
|
|
630
635
|
}
|
|
636
|
+
// HNSW fast path: when the in-process index is warm and we have a query embedding,
|
|
637
|
+
// use HNSW to get a small candidate set instead of loading all 5000 rows.
|
|
638
|
+
// We fetch limit*10 candidates (capped at 500) so BM25 re-ranking has enough
|
|
639
|
+
// material to surface lexically-strong results that HNSW might rank lower.
|
|
640
|
+
// Falls back to the full-scan path when HNSW is unavailable or cold.
|
|
641
|
+
let hnswCandidateIds = null;
|
|
642
|
+
if (queryEmbedding && _hnswIndexBuilt && _hnswIndex) {
|
|
643
|
+
try {
|
|
644
|
+
const candidateCount = Math.min(limit * 10, 500);
|
|
645
|
+
const nsFilter = effectiveNamespace !== 'all';
|
|
646
|
+
// Over-fetch when namespace filter is active (same logic as bridgeSearchHNSW)
|
|
647
|
+
const fetchCount = nsFilter ? Math.min(candidateCount * 5, 2500) : candidateCount;
|
|
648
|
+
const hnswResults = await _hnswIndex.search(new Float32Array(queryEmbedding), fetchCount);
|
|
649
|
+
if (hnswResults && hnswResults.length > 0) {
|
|
650
|
+
hnswCandidateIds = new Set(hnswResults.map((r) => String(r.id)));
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
catch {
|
|
654
|
+
// HNSW search failed — fall through to full scan
|
|
655
|
+
hnswCandidateIds = null;
|
|
656
|
+
}
|
|
657
|
+
}
|
|
631
658
|
// better-sqlite3: .prepare().all() returns array of objects
|
|
632
659
|
const nsFilter = effectiveNamespace !== 'all'
|
|
633
660
|
? `AND namespace = ?`
|
|
634
661
|
: '';
|
|
635
662
|
let rows;
|
|
636
663
|
try {
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
664
|
+
if (hnswCandidateIds && hnswCandidateIds.size > 0) {
|
|
665
|
+
// Fetch only HNSW candidate rows — O(k) DB read instead of O(5000)
|
|
666
|
+
const placeholders = Array.from(hnswCandidateIds).map(() => '?').join(',');
|
|
667
|
+
const idList = Array.from(hnswCandidateIds);
|
|
668
|
+
const stmt = ctx.db.prepare(`
|
|
669
|
+
SELECT id, key, namespace, content, embedding
|
|
670
|
+
FROM memory_entries
|
|
671
|
+
WHERE status = 'active' AND (expires_at IS NULL OR expires_at > ?)
|
|
672
|
+
AND id IN (${placeholders}) ${nsFilter}
|
|
673
|
+
`);
|
|
674
|
+
rows = effectiveNamespace !== 'all'
|
|
675
|
+
? stmt.all(Date.now(), ...idList, effectiveNamespace)
|
|
676
|
+
: stmt.all(Date.now(), ...idList);
|
|
677
|
+
}
|
|
678
|
+
else {
|
|
679
|
+
// Full scan fallback (HNSW cold, unavailable, or BM25-only mode)
|
|
680
|
+
const stmt = ctx.db.prepare(`
|
|
681
|
+
SELECT id, key, namespace, content, embedding
|
|
682
|
+
FROM memory_entries
|
|
683
|
+
WHERE status = 'active' AND (expires_at IS NULL OR expires_at > ?) ${nsFilter}
|
|
684
|
+
LIMIT 5000
|
|
685
|
+
`);
|
|
686
|
+
rows = effectiveNamespace !== 'all' ? stmt.all(Date.now(), effectiveNamespace) : stmt.all(Date.now());
|
|
687
|
+
}
|
|
644
688
|
}
|
|
645
689
|
catch {
|
|
646
690
|
return null;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Write Operations
|
|
3
|
+
* Verify initialization, store, and delete entries.
|
|
4
|
+
* Read operations (search, list, get) live in memory-read.ts (ARCH-4b split).
|
|
5
|
+
*
|
|
6
|
+
* @module v1/cli/memory-crud
|
|
7
|
+
*/
|
|
8
|
+
export { searchEntries, listEntries, getEntry } from './memory-read.js';
|
|
9
|
+
/**
|
|
10
|
+
* Verify memory initialization works correctly
|
|
11
|
+
* Tests: write, read, search, patterns
|
|
12
|
+
*/
|
|
13
|
+
export declare function verifyMemoryInit(dbPath: string, options?: {
|
|
14
|
+
verbose?: boolean;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
success: boolean;
|
|
17
|
+
tests: {
|
|
18
|
+
name: string;
|
|
19
|
+
passed: boolean;
|
|
20
|
+
details?: string;
|
|
21
|
+
duration?: number;
|
|
22
|
+
}[];
|
|
23
|
+
summary: {
|
|
24
|
+
passed: number;
|
|
25
|
+
failed: number;
|
|
26
|
+
total: number;
|
|
27
|
+
};
|
|
28
|
+
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Store an entry directly using sql.js
|
|
31
|
+
* This bypasses MCP and writes directly to the database
|
|
32
|
+
*/
|
|
33
|
+
export declare function storeEntry(options: {
|
|
34
|
+
key: string;
|
|
35
|
+
value: string;
|
|
36
|
+
namespace?: string;
|
|
37
|
+
generateEmbeddingFlag?: boolean;
|
|
38
|
+
tags?: string[];
|
|
39
|
+
ttl?: number;
|
|
40
|
+
dbPath?: string;
|
|
41
|
+
upsert?: boolean;
|
|
42
|
+
}): Promise<{
|
|
43
|
+
success: boolean;
|
|
44
|
+
id: string;
|
|
45
|
+
embedding?: {
|
|
46
|
+
dimensions: number;
|
|
47
|
+
model: string;
|
|
48
|
+
};
|
|
49
|
+
error?: string;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* Delete a memory entry by key and namespace
|
|
53
|
+
* Issue #980: Properly supports namespaced entries
|
|
54
|
+
*/
|
|
55
|
+
export declare function deleteEntry(options: {
|
|
56
|
+
key: string;
|
|
57
|
+
namespace?: string;
|
|
58
|
+
dbPath?: string;
|
|
59
|
+
}): Promise<{
|
|
60
|
+
success: boolean;
|
|
61
|
+
deleted: boolean;
|
|
62
|
+
key: string;
|
|
63
|
+
namespace: string;
|
|
64
|
+
remainingEntries: number;
|
|
65
|
+
error?: string;
|
|
66
|
+
}>;
|
|
67
|
+
//# sourceMappingURL=memory-crud.d.ts.map
|
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Write Operations
|
|
3
|
+
* Verify initialization, store, and delete entries.
|
|
4
|
+
* Read operations (search, list, get) live in memory-read.ts (ARCH-4b split).
|
|
5
|
+
*
|
|
6
|
+
* @module v1/cli/memory-crud
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { safeParseEmbedding } from './memory-bridge.js';
|
|
11
|
+
import { ensureSchemaColumns } from './memory-migrations.js';
|
|
12
|
+
import { generateEmbedding } from './embedding-operations.js';
|
|
13
|
+
import { addToHNSWIndex, rebuildSearchIndex } from './hnsw-operations.js';
|
|
14
|
+
// Re-export read operations so existing callers keep working without changes.
|
|
15
|
+
export { searchEntries, listEntries, getEntry } from './memory-read.js';
|
|
16
|
+
/** Maximum SQLite database file size accepted before read (256 MB). */
|
|
17
|
+
const MAX_DB_FILE_BYTES = 256 * 1024 * 1024;
|
|
18
|
+
// ADR-053: Lazy import of AgentDB v1 bridge
|
|
19
|
+
let _bridge;
|
|
20
|
+
async function getBridge() {
|
|
21
|
+
if (_bridge === null)
|
|
22
|
+
return null;
|
|
23
|
+
if (_bridge)
|
|
24
|
+
return _bridge;
|
|
25
|
+
try {
|
|
26
|
+
_bridge = await import('./memory-bridge.js');
|
|
27
|
+
return _bridge;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
_bridge = null;
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Verify memory initialization works correctly
|
|
36
|
+
* Tests: write, read, search, patterns
|
|
37
|
+
*/
|
|
38
|
+
export async function verifyMemoryInit(dbPath, options) {
|
|
39
|
+
const { verbose = false } = options || {};
|
|
40
|
+
const tests = [];
|
|
41
|
+
try {
|
|
42
|
+
const initSqlJs = (await import('sql.js')).default;
|
|
43
|
+
const SQL = await initSqlJs();
|
|
44
|
+
const fs = await import('fs');
|
|
45
|
+
// Guard against excessively large DB files to prevent OOM.
|
|
46
|
+
const verifyStat = fs.statSync(dbPath);
|
|
47
|
+
if (verifyStat.size > MAX_DB_FILE_BYTES) {
|
|
48
|
+
return { success: false, tests: [{ name: 'Database access', passed: false, details: `File too large: ${verifyStat.size} bytes` }], summary: { passed: 0, failed: 1, total: 1 } };
|
|
49
|
+
}
|
|
50
|
+
// Load database
|
|
51
|
+
const fileBuffer = fs.readFileSync(dbPath);
|
|
52
|
+
const db = new SQL.Database(fileBuffer);
|
|
53
|
+
// Test 1: Schema verification
|
|
54
|
+
const schemaStart = Date.now();
|
|
55
|
+
const tables = db.exec("SELECT name FROM sqlite_master WHERE type='table'");
|
|
56
|
+
const tableNames = tables[0]?.values?.map(v => v[0]) || [];
|
|
57
|
+
const expectedTables = ['memory_entries', 'patterns', 'metadata', 'vector_indexes'];
|
|
58
|
+
const missingTables = expectedTables.filter(t => !tableNames.includes(t));
|
|
59
|
+
tests.push({
|
|
60
|
+
name: 'Schema verification',
|
|
61
|
+
passed: missingTables.length === 0,
|
|
62
|
+
details: missingTables.length > 0 ? `Missing: ${missingTables.join(', ')}` : `${tableNames.length} tables found`,
|
|
63
|
+
duration: Date.now() - schemaStart
|
|
64
|
+
});
|
|
65
|
+
// Test 2: Write entry
|
|
66
|
+
const writeStart = Date.now();
|
|
67
|
+
const testId = `test_${Date.now()}`;
|
|
68
|
+
const testKey = 'verification_test';
|
|
69
|
+
const testValue = 'This is a verification test entry for memory initialization';
|
|
70
|
+
try {
|
|
71
|
+
db.run(`
|
|
72
|
+
INSERT INTO memory_entries (id, key, namespace, content, type, created_at, updated_at)
|
|
73
|
+
VALUES (?, ?, 'test', ?, 'semantic', ?, ?)
|
|
74
|
+
`, [testId, testKey, testValue, Date.now(), Date.now()]);
|
|
75
|
+
tests.push({
|
|
76
|
+
name: 'Write entry',
|
|
77
|
+
passed: true,
|
|
78
|
+
details: 'Entry written successfully',
|
|
79
|
+
duration: Date.now() - writeStart
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
tests.push({
|
|
84
|
+
name: 'Write entry',
|
|
85
|
+
passed: false,
|
|
86
|
+
details: e instanceof Error ? e.message : 'Write failed',
|
|
87
|
+
duration: Date.now() - writeStart
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// Test 3: Read entry
|
|
91
|
+
const readStart = Date.now();
|
|
92
|
+
try {
|
|
93
|
+
const result = db.exec(`SELECT content FROM memory_entries WHERE id = ?`, [testId]);
|
|
94
|
+
const content = result[0]?.values[0]?.[0];
|
|
95
|
+
tests.push({
|
|
96
|
+
name: 'Read entry',
|
|
97
|
+
passed: content === testValue,
|
|
98
|
+
details: content === testValue ? 'Content matches' : 'Content mismatch',
|
|
99
|
+
duration: Date.now() - readStart
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
tests.push({
|
|
104
|
+
name: 'Read entry',
|
|
105
|
+
passed: false,
|
|
106
|
+
details: e instanceof Error ? e.message : 'Read failed',
|
|
107
|
+
duration: Date.now() - readStart
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Test 4: Write with embedding
|
|
111
|
+
const embeddingStart = Date.now();
|
|
112
|
+
try {
|
|
113
|
+
const { embedding, dimensions, model } = await generateEmbedding(testValue);
|
|
114
|
+
const embeddingJson = JSON.stringify(embedding);
|
|
115
|
+
db.run(`
|
|
116
|
+
UPDATE memory_entries
|
|
117
|
+
SET embedding = ?, embedding_dimensions = ?, embedding_model = ?
|
|
118
|
+
WHERE id = ?
|
|
119
|
+
`, [embeddingJson, dimensions, model, testId]);
|
|
120
|
+
tests.push({
|
|
121
|
+
name: 'Generate embedding',
|
|
122
|
+
passed: true,
|
|
123
|
+
details: `${dimensions}-dim vector (${model})`,
|
|
124
|
+
duration: Date.now() - embeddingStart
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
tests.push({
|
|
129
|
+
name: 'Generate embedding',
|
|
130
|
+
passed: false,
|
|
131
|
+
details: e instanceof Error ? e.message : 'Embedding failed',
|
|
132
|
+
duration: Date.now() - embeddingStart
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
// Test 5: Pattern storage
|
|
136
|
+
const patternStart = Date.now();
|
|
137
|
+
try {
|
|
138
|
+
const patternId = `pattern_${Date.now()}`;
|
|
139
|
+
db.run(`
|
|
140
|
+
INSERT INTO patterns (id, name, pattern_type, condition, action, confidence, created_at, updated_at)
|
|
141
|
+
VALUES (?, 'test-pattern', 'task-routing', 'test condition', 'test action', 0.5, ?, ?)
|
|
142
|
+
`, [patternId, Date.now(), Date.now()]);
|
|
143
|
+
tests.push({
|
|
144
|
+
name: 'Pattern storage',
|
|
145
|
+
passed: true,
|
|
146
|
+
details: 'Pattern stored with confidence scoring',
|
|
147
|
+
duration: Date.now() - patternStart
|
|
148
|
+
});
|
|
149
|
+
// Cleanup test pattern
|
|
150
|
+
db.run(`DELETE FROM patterns WHERE id = ?`, [patternId]);
|
|
151
|
+
}
|
|
152
|
+
catch (e) {
|
|
153
|
+
tests.push({
|
|
154
|
+
name: 'Pattern storage',
|
|
155
|
+
passed: false,
|
|
156
|
+
details: e instanceof Error ? e.message : 'Pattern storage failed',
|
|
157
|
+
duration: Date.now() - patternStart
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// Test 6: Vector index configuration
|
|
161
|
+
const indexStart = Date.now();
|
|
162
|
+
try {
|
|
163
|
+
const indexResult = db.exec(`SELECT name, dimensions, hnsw_m, hnsw_ef_construction FROM vector_indexes`);
|
|
164
|
+
const indexes = indexResult[0]?.values || [];
|
|
165
|
+
tests.push({
|
|
166
|
+
name: 'Vector index config',
|
|
167
|
+
passed: indexes.length > 0,
|
|
168
|
+
details: `${indexes.length} indexes configured (HNSW M=16, ef=200)`,
|
|
169
|
+
duration: Date.now() - indexStart
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
tests.push({
|
|
174
|
+
name: 'Vector index config',
|
|
175
|
+
passed: false,
|
|
176
|
+
details: e instanceof Error ? e.message : 'Index check failed',
|
|
177
|
+
duration: Date.now() - indexStart
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
// Cleanup test entry
|
|
181
|
+
db.run(`DELETE FROM memory_entries WHERE id = ?`, [testId]);
|
|
182
|
+
// Save changes atomically
|
|
183
|
+
const data = db.export();
|
|
184
|
+
const dbTmpHealth = dbPath + '.tmp';
|
|
185
|
+
fs.writeFileSync(dbTmpHealth, Buffer.from(data));
|
|
186
|
+
fs.renameSync(dbTmpHealth, dbPath);
|
|
187
|
+
db.close();
|
|
188
|
+
const passed = tests.filter(t => t.passed).length;
|
|
189
|
+
const failed = tests.filter(t => !t.passed).length;
|
|
190
|
+
return {
|
|
191
|
+
success: failed === 0,
|
|
192
|
+
tests,
|
|
193
|
+
summary: {
|
|
194
|
+
passed,
|
|
195
|
+
failed,
|
|
196
|
+
total: tests.length
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
return {
|
|
202
|
+
success: false,
|
|
203
|
+
tests: [{
|
|
204
|
+
name: 'Database access',
|
|
205
|
+
passed: false,
|
|
206
|
+
details: error instanceof Error ? error.message : 'Unknown error'
|
|
207
|
+
}],
|
|
208
|
+
summary: { passed: 0, failed: 1, total: 1 }
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Store an entry directly using sql.js
|
|
214
|
+
* This bypasses MCP and writes directly to the database
|
|
215
|
+
*/
|
|
216
|
+
export async function storeEntry(options) {
|
|
217
|
+
// ADR-053: Try AgentDB v1 bridge first
|
|
218
|
+
const bridge = await getBridge();
|
|
219
|
+
if (bridge) {
|
|
220
|
+
const bridgeResult = await bridge.bridgeStoreEntry(options);
|
|
221
|
+
if (bridgeResult)
|
|
222
|
+
return bridgeResult;
|
|
223
|
+
}
|
|
224
|
+
// Fallback: raw sql.js
|
|
225
|
+
const { key, value, namespace = 'default', generateEmbeddingFlag = true, tags = [], ttl, dbPath: customPath, upsert = false } = options;
|
|
226
|
+
const swarmDir = path.resolve(process.cwd(), '.swarm');
|
|
227
|
+
const dbPath = customPath ? path.resolve(customPath) : path.join(swarmDir, 'memory.db');
|
|
228
|
+
try {
|
|
229
|
+
if (!fs.existsSync(dbPath)) {
|
|
230
|
+
return { success: false, id: '', error: 'Database not initialized. Run: monomind memory init' };
|
|
231
|
+
}
|
|
232
|
+
await ensureSchemaColumns(dbPath);
|
|
233
|
+
const initSqlJs = (await import('sql.js')).default;
|
|
234
|
+
const SQL = await initSqlJs();
|
|
235
|
+
const storeStat = fs.statSync(dbPath);
|
|
236
|
+
if (storeStat.size > MAX_DB_FILE_BYTES) {
|
|
237
|
+
return { success: false, id: '', error: `Database file too large: ${storeStat.size} bytes` };
|
|
238
|
+
}
|
|
239
|
+
const fileBuffer = fs.readFileSync(dbPath);
|
|
240
|
+
const db = new SQL.Database(fileBuffer);
|
|
241
|
+
const id = `entry_${Date.now()}_${Math.random().toString(36).substring(7)}`;
|
|
242
|
+
const now = Date.now();
|
|
243
|
+
let embeddingJson = null;
|
|
244
|
+
let embeddingDimensions = null;
|
|
245
|
+
let embeddingModel = null;
|
|
246
|
+
if (generateEmbeddingFlag && value.length > 0) {
|
|
247
|
+
const embResult = await generateEmbedding(value);
|
|
248
|
+
embeddingJson = JSON.stringify(embResult.embedding);
|
|
249
|
+
embeddingDimensions = embResult.dimensions;
|
|
250
|
+
embeddingModel = embResult.model;
|
|
251
|
+
}
|
|
252
|
+
const insertSql = upsert
|
|
253
|
+
? `INSERT OR REPLACE INTO memory_entries (
|
|
254
|
+
id, key, namespace, content, type,
|
|
255
|
+
embedding, embedding_dimensions, embedding_model,
|
|
256
|
+
tags, metadata, created_at, updated_at, expires_at, status
|
|
257
|
+
) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')`
|
|
258
|
+
: `INSERT INTO memory_entries (
|
|
259
|
+
id, key, namespace, content, type,
|
|
260
|
+
embedding, embedding_dimensions, embedding_model,
|
|
261
|
+
tags, metadata, created_at, updated_at, expires_at, status
|
|
262
|
+
) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')`;
|
|
263
|
+
db.run(insertSql, [
|
|
264
|
+
id,
|
|
265
|
+
key,
|
|
266
|
+
namespace,
|
|
267
|
+
value,
|
|
268
|
+
embeddingJson,
|
|
269
|
+
embeddingDimensions,
|
|
270
|
+
embeddingModel,
|
|
271
|
+
tags.length > 0 ? JSON.stringify(tags) : null,
|
|
272
|
+
'{}',
|
|
273
|
+
now,
|
|
274
|
+
now,
|
|
275
|
+
ttl ? now + (ttl * 1000) : null
|
|
276
|
+
]);
|
|
277
|
+
// Save atomically
|
|
278
|
+
const data = db.export();
|
|
279
|
+
const dbTmpStore = dbPath + '.tmp';
|
|
280
|
+
fs.writeFileSync(dbTmpStore, Buffer.from(data));
|
|
281
|
+
fs.renameSync(dbTmpStore, dbPath);
|
|
282
|
+
db.close();
|
|
283
|
+
// Add to HNSW index for faster future searches
|
|
284
|
+
if (embeddingJson) {
|
|
285
|
+
const embResult = safeParseEmbedding(embeddingJson);
|
|
286
|
+
if (embResult) {
|
|
287
|
+
await addToHNSWIndex(id, embResult, {
|
|
288
|
+
id,
|
|
289
|
+
key,
|
|
290
|
+
namespace,
|
|
291
|
+
content: value
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return {
|
|
296
|
+
success: true,
|
|
297
|
+
id,
|
|
298
|
+
embedding: embeddingJson ? { dimensions: embeddingDimensions, model: embeddingModel } : undefined
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
catch (error) {
|
|
302
|
+
return {
|
|
303
|
+
success: false,
|
|
304
|
+
id: '',
|
|
305
|
+
error: error instanceof Error ? error.message : String(error)
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Delete a memory entry by key and namespace
|
|
311
|
+
* Issue #980: Properly supports namespaced entries
|
|
312
|
+
*/
|
|
313
|
+
export async function deleteEntry(options) {
|
|
314
|
+
// ADR-053: Try AgentDB v1 bridge first
|
|
315
|
+
const bridge = await getBridge();
|
|
316
|
+
if (bridge) {
|
|
317
|
+
const bridgeResult = await bridge.bridgeDeleteEntry(options);
|
|
318
|
+
if (bridgeResult) {
|
|
319
|
+
// #1122: Bridge path must also invalidate the in-memory HNSW index.
|
|
320
|
+
if (bridgeResult.deleted) {
|
|
321
|
+
rebuildSearchIndex();
|
|
322
|
+
}
|
|
323
|
+
return bridgeResult;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Fallback: raw sql.js
|
|
327
|
+
const { key, namespace = 'default', dbPath: customPath } = options;
|
|
328
|
+
const swarmDir = path.join(process.cwd(), '.swarm');
|
|
329
|
+
const dbPath = customPath || path.join(swarmDir, 'memory.db');
|
|
330
|
+
try {
|
|
331
|
+
if (!fs.existsSync(dbPath)) {
|
|
332
|
+
return {
|
|
333
|
+
success: false,
|
|
334
|
+
deleted: false,
|
|
335
|
+
key,
|
|
336
|
+
namespace,
|
|
337
|
+
remainingEntries: 0,
|
|
338
|
+
error: 'Database not found'
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
await ensureSchemaColumns(dbPath);
|
|
342
|
+
const initSqlJs = (await import('sql.js')).default;
|
|
343
|
+
const SQL = await initSqlJs();
|
|
344
|
+
const deleteStat = fs.statSync(dbPath);
|
|
345
|
+
if (deleteStat.size > MAX_DB_FILE_BYTES) {
|
|
346
|
+
return { success: false, deleted: false, key, namespace, remainingEntries: 0, error: `Database file too large: ${deleteStat.size} bytes` };
|
|
347
|
+
}
|
|
348
|
+
const fileBuffer = fs.readFileSync(dbPath);
|
|
349
|
+
const db = new SQL.Database(fileBuffer);
|
|
350
|
+
const checkStmt = db.prepare(`
|
|
351
|
+
SELECT id FROM memory_entries
|
|
352
|
+
WHERE status = 'active'
|
|
353
|
+
AND key = ?
|
|
354
|
+
AND namespace = ?
|
|
355
|
+
LIMIT 1
|
|
356
|
+
`);
|
|
357
|
+
checkStmt.bind([key, namespace]);
|
|
358
|
+
const checkRows = [];
|
|
359
|
+
while (checkStmt.step()) {
|
|
360
|
+
checkRows.push(checkStmt.get());
|
|
361
|
+
}
|
|
362
|
+
checkStmt.free();
|
|
363
|
+
const checkResult = checkRows.length > 0 ? [{ values: checkRows }] : [];
|
|
364
|
+
if (!checkResult[0]?.values?.[0]) {
|
|
365
|
+
const countResult = db.exec(`SELECT COUNT(*) FROM memory_entries WHERE status = 'active'`);
|
|
366
|
+
const remainingEntries = countResult[0]?.values?.[0]?.[0] || 0;
|
|
367
|
+
db.close();
|
|
368
|
+
return {
|
|
369
|
+
success: true,
|
|
370
|
+
deleted: false,
|
|
371
|
+
key,
|
|
372
|
+
namespace,
|
|
373
|
+
remainingEntries,
|
|
374
|
+
error: `Key '${key}' not found in namespace '${namespace}'`
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
db.run(`
|
|
378
|
+
UPDATE memory_entries
|
|
379
|
+
SET status = 'deleted',
|
|
380
|
+
embedding = NULL,
|
|
381
|
+
updated_at = strftime('%s', 'now') * 1000
|
|
382
|
+
WHERE key = ?
|
|
383
|
+
AND namespace = ?
|
|
384
|
+
AND status = 'active'
|
|
385
|
+
`, [key, namespace]);
|
|
386
|
+
const countResult = db.exec(`SELECT COUNT(*) FROM memory_entries WHERE status = 'active'`);
|
|
387
|
+
const remainingEntries = countResult[0]?.values?.[0]?.[0] || 0;
|
|
388
|
+
// Save updated database atomically
|
|
389
|
+
const data = db.export();
|
|
390
|
+
const dbTmpDelete = dbPath + '.tmp';
|
|
391
|
+
fs.writeFileSync(dbTmpDelete, Buffer.from(data));
|
|
392
|
+
fs.renameSync(dbTmpDelete, dbPath);
|
|
393
|
+
db.close();
|
|
394
|
+
// Invalidate the HNSW index so it rebuilds from DB on next search.
|
|
395
|
+
rebuildSearchIndex();
|
|
396
|
+
return {
|
|
397
|
+
success: true,
|
|
398
|
+
deleted: true,
|
|
399
|
+
key,
|
|
400
|
+
namespace,
|
|
401
|
+
remainingEntries
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
catch (error) {
|
|
405
|
+
return {
|
|
406
|
+
success: false,
|
|
407
|
+
deleted: false,
|
|
408
|
+
key,
|
|
409
|
+
namespace,
|
|
410
|
+
remainingEntries: 0,
|
|
411
|
+
error: error instanceof Error ? error.message : String(error)
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=memory-crud.js.map
|