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
|
@@ -575,12 +575,18 @@ async function computeCommitsBehind(repoPath) {
|
|
|
575
575
|
closeDb(db);
|
|
576
576
|
}
|
|
577
577
|
}
|
|
578
|
+
/**
|
|
579
|
+
* Shared staleness threshold: both monograph_staleness and monograph_suggest_auto
|
|
580
|
+
* trigger a background rebuild only when the index is more than this many commits behind HEAD.
|
|
581
|
+
* Using a shared constant prevents conflicting rebuild pressure during active dev sessions.
|
|
582
|
+
*/
|
|
583
|
+
const STALENESS_THRESHOLD = 10;
|
|
578
584
|
/**
|
|
579
585
|
* Fire-and-forget background rebuild. Uses a module-level guard so concurrent
|
|
580
586
|
* MCP tool calls (e.g. repeated monograph_suggest_auto) don't pile up builds.
|
|
581
|
-
* threshold: minimum commitsBehind to trigger (default
|
|
587
|
+
* threshold: minimum commitsBehind to trigger (default STALENESS_THRESHOLD + 1).
|
|
582
588
|
*/
|
|
583
|
-
function triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, threshold = 1) {
|
|
589
|
+
function triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, threshold = STALENESS_THRESHOLD + 1) {
|
|
584
590
|
if (commitsBehind < threshold)
|
|
585
591
|
return false;
|
|
586
592
|
if (_buildInProgress)
|
|
@@ -609,8 +615,7 @@ const monographStalenessTool = {
|
|
|
609
615
|
return text(JSON.stringify({ commitsBehind: 0, status: 'unknown', triggered: false }));
|
|
610
616
|
}
|
|
611
617
|
const { commitsBehind } = result;
|
|
612
|
-
const
|
|
613
|
-
const triggered = triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, AUTO_BUILD_THRESHOLD + 1);
|
|
618
|
+
const triggered = triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, STALENESS_THRESHOLD + 1);
|
|
614
619
|
const status = triggered ? 'building' : commitsBehind === 0 ? 'fresh' : 'stale';
|
|
615
620
|
return text(JSON.stringify({ commitsBehind, status, triggered }));
|
|
616
621
|
},
|
|
@@ -895,22 +900,25 @@ const monographImpactTool = {
|
|
|
895
900
|
filePath: impactPath,
|
|
896
901
|
depth,
|
|
897
902
|
});
|
|
898
|
-
if (!result || !result.
|
|
903
|
+
if (!result || !result.node)
|
|
899
904
|
return text(`No symbol found: ${impactName}`);
|
|
900
905
|
// Format impact as structured text for direct LLM consumption
|
|
901
|
-
const root = result.
|
|
906
|
+
const root = result.node;
|
|
902
907
|
const rootLoc = root.filePath ? (root.startLine != null ? `${root.filePath}:${root.startLine}` : root.filePath) : '';
|
|
903
908
|
const lines = [
|
|
904
909
|
`[${root.label ?? '?'}] ${root.name} ${rootLoc}`,
|
|
905
910
|
'',
|
|
906
|
-
`Blast radius: ${result.
|
|
911
|
+
`Blast radius: ${result.affectedFiles?.length ?? 0} symbols affected`,
|
|
907
912
|
];
|
|
908
913
|
if (result.riskScore != null) {
|
|
909
914
|
const riskLabel = result.riskScore >= 0.8 ? 'HIGH' : result.riskScore >= 0.5 ? 'MEDIUM' : 'LOW';
|
|
910
915
|
lines.push(`Risk score: ${result.riskScore.toFixed(2)} (${riskLabel})`);
|
|
911
916
|
}
|
|
912
917
|
lines.push('');
|
|
913
|
-
const affected =
|
|
918
|
+
const affected = [
|
|
919
|
+
...(result.directCallers ?? []),
|
|
920
|
+
...(result.transitiveCallers ?? []).flatMap(t => t.nodes ?? []),
|
|
921
|
+
];
|
|
914
922
|
if (affected.length > 0) {
|
|
915
923
|
lines.push(`Affected callers (${affected.length}):`);
|
|
916
924
|
for (const sym of affected.slice(0, 20)) {
|
|
@@ -1210,11 +1218,13 @@ const monographGroupListTool = {
|
|
|
1210
1218
|
const { getGroupList } = await import('@monoes/monograph');
|
|
1211
1219
|
const configPath = input.configPath ?? join(getProjectCwd(), 'group.yaml');
|
|
1212
1220
|
const result = await getGroupList(configPath);
|
|
1213
|
-
|
|
1214
|
-
|
|
1221
|
+
const firstGroup = result.groups?.[0];
|
|
1222
|
+
const allRepos = result.groups?.flatMap((g) => g.repos ?? []) ?? [];
|
|
1223
|
+
if (!allRepos.length) {
|
|
1224
|
+
return text(`Group: ${firstGroup?.name ?? 'unknown'}\nNo repos configured. Check ${configPath}`);
|
|
1215
1225
|
}
|
|
1216
|
-
const lines = [`Group: ${
|
|
1217
|
-
for (const r of
|
|
1226
|
+
const lines = [`Group: ${firstGroup?.name ?? 'unknown'} (${allRepos.length} repos)`];
|
|
1227
|
+
for (const r of allRepos) {
|
|
1218
1228
|
const indexed = r.indexedAt ? r.indexedAt.slice(0, 10) : 'never';
|
|
1219
1229
|
lines.push(` ${r.name} nodes=${r.nodeCount} indexed=${indexed} ${r.path}`);
|
|
1220
1230
|
}
|
|
@@ -1786,10 +1796,10 @@ const monographSuggestAutoTool = {
|
|
|
1786
1796
|
},
|
|
1787
1797
|
handler: async (input) => {
|
|
1788
1798
|
const repoPath = getProjectCwd();
|
|
1789
|
-
// Check staleness and trigger rebuild if needed (threshold:
|
|
1799
|
+
// Check staleness and trigger rebuild if needed (threshold: STALENESS_THRESHOLD commits).
|
|
1790
1800
|
const stalenessResult = await computeCommitsBehind(repoPath);
|
|
1791
1801
|
const commitsBehind = stalenessResult?.commitsBehind ?? 0;
|
|
1792
|
-
const triggered = triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, 1);
|
|
1802
|
+
const triggered = triggerBackgroundBuildIfNeeded(repoPath, commitsBehind, STALENESS_THRESHOLD + 1);
|
|
1793
1803
|
const stalenessStatus = triggered ? 'building' : commitsBehind === 0 ? 'fresh' : 'stale';
|
|
1794
1804
|
// Delegate to the base suggest tool — no logic duplication.
|
|
1795
1805
|
const baseResult = await monographSuggestTool.handler(input);
|
|
@@ -75,7 +75,7 @@ const FORBIDDEN_WORKFLOW_IDS = new Set(['__proto__', 'constructor', 'prototype']
|
|
|
75
75
|
export const workflowTools = [
|
|
76
76
|
{
|
|
77
77
|
name: 'workflow_run',
|
|
78
|
-
description: '
|
|
78
|
+
description: 'Create a swarm workflow stage record from a template (feature/bugfix/refactor/security). This tracks multi-agent orchestration stages — it does NOT execute a browser automation playbook. To run a playbook use `playbook_run`.',
|
|
79
79
|
category: 'workflow',
|
|
80
80
|
inputSchema: {
|
|
81
81
|
type: 'object',
|
|
@@ -650,5 +650,58 @@ export const workflowTools = [
|
|
|
650
650
|
return { action, error: 'Unknown action' };
|
|
651
651
|
},
|
|
652
652
|
},
|
|
653
|
+
{
|
|
654
|
+
name: 'playbook_run',
|
|
655
|
+
description: 'Run a browser automation playbook (JSON file with browser/service/HTTP nodes) via @monoes/monobrowse. Executes the full playbook engine with all handlers: browser CDP nodes (browser.open, browser.click, etc.), service nodes (gmail, github, google_drive, google_sheets), and builtins (action.http, action.log, action.save_file, action.gemini_image).',
|
|
656
|
+
category: 'workflow',
|
|
657
|
+
inputSchema: {
|
|
658
|
+
type: 'object',
|
|
659
|
+
properties: {
|
|
660
|
+
file: { type: 'string', description: 'Absolute or CWD-relative path to a playbook JSON file' },
|
|
661
|
+
params: {
|
|
662
|
+
type: 'object',
|
|
663
|
+
description: 'Key/value pairs substituted as {{params.key}} in playbook node configs',
|
|
664
|
+
additionalProperties: { type: 'string' },
|
|
665
|
+
},
|
|
666
|
+
port: { type: 'number', description: 'CDP port for browser automation (default 9222)' },
|
|
667
|
+
timeoutSeconds: { type: 'number', description: 'Max run duration in seconds (default 300)' },
|
|
668
|
+
},
|
|
669
|
+
required: ['file'],
|
|
670
|
+
},
|
|
671
|
+
handler: async (input) => {
|
|
672
|
+
const filePath = input.file;
|
|
673
|
+
if (typeof filePath !== 'string' || !filePath)
|
|
674
|
+
throw new Error('playbook_run: file is required');
|
|
675
|
+
if (filePath.startsWith('-'))
|
|
676
|
+
throw new Error('playbook_run: file path must not start with "-"');
|
|
677
|
+
const { resolve } = await import('node:path');
|
|
678
|
+
const absPath = resolve(process.cwd(), filePath);
|
|
679
|
+
const timeoutMs = (input.timeoutSeconds ?? 300) * 1000;
|
|
680
|
+
const rawParams = input.params ?? {};
|
|
681
|
+
// Sanitize params — string values only
|
|
682
|
+
const params = Object.fromEntries(Object.entries(rawParams).map(([k, v]) => [k, String(v)]));
|
|
683
|
+
if (input.port !== undefined) {
|
|
684
|
+
process.env['GEMINI_CDP_PORT'] = String(input.port);
|
|
685
|
+
}
|
|
686
|
+
const { readPlaybook, runPlaybook, createDefaultHandlers } = await import('@monoes/monobrowse');
|
|
687
|
+
const def = await readPlaybook(absPath);
|
|
688
|
+
const record = await runPlaybook(def, {
|
|
689
|
+
handlers: createDefaultHandlers(),
|
|
690
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
691
|
+
params,
|
|
692
|
+
});
|
|
693
|
+
return {
|
|
694
|
+
playbookId: record.playbookId,
|
|
695
|
+
playbookName: record.playbookName,
|
|
696
|
+
status: record.status,
|
|
697
|
+
itemsProcessed: record.itemsProcessed,
|
|
698
|
+
itemsTotal: record.itemsTotal,
|
|
699
|
+
durationMs: record.completedAt && record.startedAt
|
|
700
|
+
? record.completedAt - record.startedAt
|
|
701
|
+
: undefined,
|
|
702
|
+
error: record.error,
|
|
703
|
+
};
|
|
704
|
+
},
|
|
705
|
+
},
|
|
653
706
|
];
|
|
654
707
|
//# sourceMappingURL=workflow-tools.js.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Operations
|
|
3
|
+
* ONNX model loading, embedding generation, and hash-based fallback.
|
|
4
|
+
* Extracted from memory-initializer.ts (ARCH-4)
|
|
5
|
+
*
|
|
6
|
+
* @module v1/cli/embedding-operations
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Lazy load ONNX embedding model
|
|
10
|
+
* Only loads when first embedding is requested
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadEmbeddingModel(options?: {
|
|
13
|
+
modelPath?: string;
|
|
14
|
+
verbose?: boolean;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
success: boolean;
|
|
17
|
+
dimensions: number;
|
|
18
|
+
modelName: string;
|
|
19
|
+
loadTime?: number;
|
|
20
|
+
error?: string;
|
|
21
|
+
}>;
|
|
22
|
+
/**
|
|
23
|
+
* Generate real embedding for text
|
|
24
|
+
* Uses ONNX model if available, falls back to deterministic hash
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateEmbedding(text: string): Promise<{
|
|
27
|
+
embedding: number[];
|
|
28
|
+
dimensions: number;
|
|
29
|
+
model: string;
|
|
30
|
+
}>;
|
|
31
|
+
/**
|
|
32
|
+
* Generate embeddings for multiple texts
|
|
33
|
+
* Uses parallel execution for API-based providers (2-4x faster)
|
|
34
|
+
* Note: Local ONNX inference is CPU-bound, so parallelism has limited benefit
|
|
35
|
+
*
|
|
36
|
+
* @param texts - Array of texts to embed
|
|
37
|
+
* @param options - Batch options
|
|
38
|
+
* @returns Array of embedding results with timing info
|
|
39
|
+
*/
|
|
40
|
+
export declare function generateBatchEmbeddings(texts: string[], options?: {
|
|
41
|
+
concurrency?: number;
|
|
42
|
+
onProgress?: (completed: number, total: number) => void;
|
|
43
|
+
}): Promise<{
|
|
44
|
+
results: Array<{
|
|
45
|
+
text: string;
|
|
46
|
+
embedding: number[];
|
|
47
|
+
dimensions: number;
|
|
48
|
+
model: string;
|
|
49
|
+
}>;
|
|
50
|
+
totalTime: number;
|
|
51
|
+
avgTime: number;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* Generate deterministic hash-based embedding
|
|
55
|
+
* Not semantic, but deterministic and useful for testing
|
|
56
|
+
*/
|
|
57
|
+
export declare function generateHashEmbedding(text: string, dimensions: number): number[];
|
|
58
|
+
//# sourceMappingURL=embedding-operations.d.ts.map
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding Operations
|
|
3
|
+
* ONNX model loading, embedding generation, and hash-based fallback.
|
|
4
|
+
* Extracted from memory-initializer.ts (ARCH-4)
|
|
5
|
+
*
|
|
6
|
+
* @module v1/cli/embedding-operations
|
|
7
|
+
*/
|
|
8
|
+
// ADR-053: Lazy import of AgentDB v1 bridge
|
|
9
|
+
let _bridge;
|
|
10
|
+
async function getBridge() {
|
|
11
|
+
if (_bridge === null)
|
|
12
|
+
return null;
|
|
13
|
+
if (_bridge)
|
|
14
|
+
return _bridge;
|
|
15
|
+
try {
|
|
16
|
+
_bridge = await import('./memory-bridge.js');
|
|
17
|
+
return _bridge;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
_bridge = null;
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
let embeddingModelState = null;
|
|
25
|
+
/**
|
|
26
|
+
* Lazy load ONNX embedding model
|
|
27
|
+
* Only loads when first embedding is requested
|
|
28
|
+
*/
|
|
29
|
+
export async function loadEmbeddingModel(options) {
|
|
30
|
+
const { verbose = false } = options || {};
|
|
31
|
+
const startTime = Date.now();
|
|
32
|
+
// Already loaded
|
|
33
|
+
if (embeddingModelState?.loaded) {
|
|
34
|
+
return {
|
|
35
|
+
success: true,
|
|
36
|
+
dimensions: embeddingModelState.dimensions,
|
|
37
|
+
modelName: 'cached',
|
|
38
|
+
loadTime: 0
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
// ADR-053: Try AgentDB v1 bridge first
|
|
42
|
+
const bridge = await getBridge();
|
|
43
|
+
if (bridge) {
|
|
44
|
+
const bridgeResult = await bridge.bridgeLoadEmbeddingModel();
|
|
45
|
+
if (bridgeResult && bridgeResult.success) {
|
|
46
|
+
// Mark local state as loaded too so subsequent calls use cache
|
|
47
|
+
embeddingModelState = {
|
|
48
|
+
loaded: true,
|
|
49
|
+
model: null, // Bridge handles embedding
|
|
50
|
+
tokenizer: null,
|
|
51
|
+
dimensions: bridgeResult.dimensions
|
|
52
|
+
};
|
|
53
|
+
return bridgeResult;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
// Try to import @xenova/transformers for ONNX embeddings
|
|
58
|
+
const transformers = await import('@xenova/transformers').catch(() => null);
|
|
59
|
+
if (transformers) {
|
|
60
|
+
if (verbose) {
|
|
61
|
+
console.log('Loading ONNX embedding model (all-MiniLM-L6-v2)...');
|
|
62
|
+
}
|
|
63
|
+
// Use small, fast model for local embeddings
|
|
64
|
+
const { pipeline } = transformers;
|
|
65
|
+
const embedder = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
|
|
66
|
+
embeddingModelState = {
|
|
67
|
+
loaded: true,
|
|
68
|
+
model: embedder,
|
|
69
|
+
tokenizer: null,
|
|
70
|
+
dimensions: 384 // MiniLM-L6 produces 384-dim vectors
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
success: true,
|
|
74
|
+
dimensions: 384,
|
|
75
|
+
modelName: 'Xenova/all-MiniLM-L6-v2',
|
|
76
|
+
loadTime: Date.now() - startTime
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// Fallback: Check for agentic-flow ReasoningBank embeddings (v1)
|
|
80
|
+
const reasoningBank = await import('agentic-flow/reasoningbank').catch(() => null);
|
|
81
|
+
if (reasoningBank?.computeEmbedding) {
|
|
82
|
+
if (verbose) {
|
|
83
|
+
console.log('Loading agentic-flow ReasoningBank embedding model...');
|
|
84
|
+
}
|
|
85
|
+
embeddingModelState = {
|
|
86
|
+
loaded: true,
|
|
87
|
+
model: { embed: reasoningBank.computeEmbedding },
|
|
88
|
+
tokenizer: null,
|
|
89
|
+
dimensions: 768
|
|
90
|
+
};
|
|
91
|
+
return {
|
|
92
|
+
success: true,
|
|
93
|
+
dimensions: 768,
|
|
94
|
+
modelName: 'agentic-flow/reasoningbank',
|
|
95
|
+
loadTime: Date.now() - startTime
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// Fallback: Check for monovector ONNX embedder (bundled MiniLM-L6-v2 since v0.2.15)
|
|
99
|
+
// v0.2.16: LoRA B=0 fix makes AdaptiveEmbedder safe (identity when untrained)
|
|
100
|
+
// Note: isReady() returns false until first embed() call (lazy init), so we
|
|
101
|
+
// skip the isReady() gate and verify with a probe embed instead.
|
|
102
|
+
const monovector = await import('monovector').catch(() => null);
|
|
103
|
+
if (monovector?.initOnnxEmbedder) {
|
|
104
|
+
try {
|
|
105
|
+
await monovector.initOnnxEmbedder();
|
|
106
|
+
// Fallback: OptimizedOnnxEmbedder (raw ONNX, lazy-inits on first embed)
|
|
107
|
+
const onnxEmb = monovector.getOptimizedOnnxEmbedder?.();
|
|
108
|
+
if (onnxEmb?.embed) {
|
|
109
|
+
// Probe embed to trigger lazy ONNX init and verify it works
|
|
110
|
+
const probe = await onnxEmb.embed('test');
|
|
111
|
+
if (probe && probe.length > 0 && (Array.isArray(probe) ? probe.some((v) => v !== 0) : true)) {
|
|
112
|
+
if (verbose) {
|
|
113
|
+
console.log(`Loading monovector ONNX embedder (all-MiniLM-L6-v2, ${probe.length}d)...`);
|
|
114
|
+
}
|
|
115
|
+
embeddingModelState = {
|
|
116
|
+
loaded: true,
|
|
117
|
+
model: (text) => onnxEmb.embed(text),
|
|
118
|
+
tokenizer: null,
|
|
119
|
+
dimensions: probe.length || 384
|
|
120
|
+
};
|
|
121
|
+
return {
|
|
122
|
+
success: true,
|
|
123
|
+
dimensions: probe.length || 384,
|
|
124
|
+
modelName: 'monovector/onnx',
|
|
125
|
+
loadTime: Date.now() - startTime
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// monovector ONNX init failed, continue to next fallback
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// Legacy fallback: Check for agentic-flow core embeddings
|
|
135
|
+
const agenticFlow = await import('agentic-flow').catch(() => null);
|
|
136
|
+
if (agenticFlow && agenticFlow.embeddings) {
|
|
137
|
+
if (verbose) {
|
|
138
|
+
console.log('Loading agentic-flow embedding model...');
|
|
139
|
+
}
|
|
140
|
+
embeddingModelState = {
|
|
141
|
+
loaded: true,
|
|
142
|
+
model: agenticFlow.embeddings,
|
|
143
|
+
tokenizer: null,
|
|
144
|
+
dimensions: 768
|
|
145
|
+
};
|
|
146
|
+
return {
|
|
147
|
+
success: true,
|
|
148
|
+
dimensions: 768,
|
|
149
|
+
modelName: 'agentic-flow',
|
|
150
|
+
loadTime: Date.now() - startTime
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// No ONNX model available - use fallback
|
|
154
|
+
embeddingModelState = {
|
|
155
|
+
loaded: true,
|
|
156
|
+
model: null, // Will use simple hash-based fallback
|
|
157
|
+
tokenizer: null,
|
|
158
|
+
dimensions: 128 // Smaller fallback dimensions
|
|
159
|
+
};
|
|
160
|
+
return {
|
|
161
|
+
success: true,
|
|
162
|
+
dimensions: 128,
|
|
163
|
+
modelName: 'hash-fallback',
|
|
164
|
+
loadTime: Date.now() - startTime
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
return {
|
|
169
|
+
success: false,
|
|
170
|
+
dimensions: 0,
|
|
171
|
+
modelName: 'none',
|
|
172
|
+
error: error instanceof Error ? error.message : String(error)
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Generate real embedding for text
|
|
178
|
+
* Uses ONNX model if available, falls back to deterministic hash
|
|
179
|
+
*/
|
|
180
|
+
export async function generateEmbedding(text) {
|
|
181
|
+
// Cap input text — caller may pass arbitrarily large content. Without this
|
|
182
|
+
// cap, the hash-fallback below burns O(text.length × dimension) sin() calls
|
|
183
|
+
// per call, and ONNX tokenization can saturate memory on multi-MB inputs.
|
|
184
|
+
if (typeof text !== 'string')
|
|
185
|
+
text = String(text ?? '');
|
|
186
|
+
if (text.length > 16 * 1024)
|
|
187
|
+
text = text.slice(0, 16 * 1024);
|
|
188
|
+
// ADR-053: Try AgentDB v1 bridge first
|
|
189
|
+
const bridge = await getBridge();
|
|
190
|
+
if (bridge) {
|
|
191
|
+
const bridgeResult = await bridge.bridgeGenerateEmbedding(text);
|
|
192
|
+
if (bridgeResult)
|
|
193
|
+
return bridgeResult;
|
|
194
|
+
}
|
|
195
|
+
// Ensure model is loaded
|
|
196
|
+
if (!embeddingModelState?.loaded) {
|
|
197
|
+
await loadEmbeddingModel();
|
|
198
|
+
}
|
|
199
|
+
const state = embeddingModelState;
|
|
200
|
+
// Use ONNX model if available
|
|
201
|
+
if (state.model && typeof state.model === 'function') {
|
|
202
|
+
try {
|
|
203
|
+
const output = await state.model(text, { pooling: 'mean', normalize: true });
|
|
204
|
+
// Handle both @xenova/transformers (output.data) and monovector (plain array) formats
|
|
205
|
+
const embedding = output?.data
|
|
206
|
+
? Array.from(output.data)
|
|
207
|
+
: Array.isArray(output) ? output : null;
|
|
208
|
+
if (embedding) {
|
|
209
|
+
return {
|
|
210
|
+
embedding,
|
|
211
|
+
dimensions: embedding.length,
|
|
212
|
+
model: 'onnx'
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// Fall through to fallback
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Deterministic hash-based fallback (for testing/demo without ONNX)
|
|
221
|
+
const embedding = generateHashEmbedding(text, state.dimensions);
|
|
222
|
+
return {
|
|
223
|
+
embedding,
|
|
224
|
+
dimensions: state.dimensions,
|
|
225
|
+
model: 'hash-fallback'
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Generate embeddings for multiple texts
|
|
230
|
+
* Uses parallel execution for API-based providers (2-4x faster)
|
|
231
|
+
* Note: Local ONNX inference is CPU-bound, so parallelism has limited benefit
|
|
232
|
+
*
|
|
233
|
+
* @param texts - Array of texts to embed
|
|
234
|
+
* @param options - Batch options
|
|
235
|
+
* @returns Array of embedding results with timing info
|
|
236
|
+
*/
|
|
237
|
+
export async function generateBatchEmbeddings(texts, options) {
|
|
238
|
+
const { concurrency = texts.length, onProgress } = options || {};
|
|
239
|
+
const startTime = Date.now();
|
|
240
|
+
// Ensure model is loaded first (prevents cold start in parallel)
|
|
241
|
+
if (!embeddingModelState?.loaded) {
|
|
242
|
+
await loadEmbeddingModel();
|
|
243
|
+
}
|
|
244
|
+
// Process in parallel with optional concurrency limit
|
|
245
|
+
if (concurrency >= texts.length) {
|
|
246
|
+
// Full parallelism
|
|
247
|
+
const embeddings = await Promise.all(texts.map(async (text, i) => {
|
|
248
|
+
const result = await generateEmbedding(text);
|
|
249
|
+
onProgress?.(i + 1, texts.length);
|
|
250
|
+
return { text, ...result };
|
|
251
|
+
}));
|
|
252
|
+
const totalTime = Date.now() - startTime;
|
|
253
|
+
return {
|
|
254
|
+
results: embeddings,
|
|
255
|
+
totalTime,
|
|
256
|
+
avgTime: totalTime / texts.length
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
// Limited concurrency using chunking
|
|
260
|
+
const results = [];
|
|
261
|
+
let completed = 0;
|
|
262
|
+
for (let i = 0; i < texts.length; i += concurrency) {
|
|
263
|
+
const chunk = texts.slice(i, i + concurrency);
|
|
264
|
+
const chunkResults = await Promise.all(chunk.map(async (text) => {
|
|
265
|
+
const result = await generateEmbedding(text);
|
|
266
|
+
completed++;
|
|
267
|
+
onProgress?.(completed, texts.length);
|
|
268
|
+
return { text, ...result };
|
|
269
|
+
}));
|
|
270
|
+
results.push(...chunkResults);
|
|
271
|
+
}
|
|
272
|
+
const totalTime = Date.now() - startTime;
|
|
273
|
+
return {
|
|
274
|
+
results,
|
|
275
|
+
totalTime,
|
|
276
|
+
avgTime: totalTime / texts.length
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Generate deterministic hash-based embedding
|
|
281
|
+
* Not semantic, but deterministic and useful for testing
|
|
282
|
+
*/
|
|
283
|
+
export function generateHashEmbedding(text, dimensions) {
|
|
284
|
+
const embedding = new Array(dimensions).fill(0);
|
|
285
|
+
// Simple hash-based approach for reproducibility
|
|
286
|
+
const words = text.toLowerCase().split(/\s+/);
|
|
287
|
+
for (let i = 0; i < words.length; i++) {
|
|
288
|
+
const word = words[i];
|
|
289
|
+
for (let j = 0; j < word.length; j++) {
|
|
290
|
+
const charCode = word.charCodeAt(j);
|
|
291
|
+
const idx = (charCode * (i + 1) * (j + 1)) % dimensions;
|
|
292
|
+
embedding[idx] += Math.sin(charCode * 0.1) * 0.1;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Normalize to unit vector
|
|
296
|
+
const magnitude = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0)) || 1;
|
|
297
|
+
return embedding.map(v => v / magnitude);
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=embedding-operations.js.map
|
|
@@ -49,6 +49,12 @@ export class EWCConsolidator {
|
|
|
49
49
|
globalFisher = [];
|
|
50
50
|
consolidationHistory = [];
|
|
51
51
|
initialized = false;
|
|
52
|
+
/** Dirty flag: true when in-memory state diverges from disk */
|
|
53
|
+
dirty = false;
|
|
54
|
+
/** Pending debounced write timer */
|
|
55
|
+
saveTimer = null;
|
|
56
|
+
/** Debounce window for disk writes (ms) */
|
|
57
|
+
static SAVE_DEBOUNCE_MS = 2_000;
|
|
52
58
|
constructor(config) {
|
|
53
59
|
this.config = { ...DEFAULT_EWC_CONFIG, ...config };
|
|
54
60
|
this.globalFisher = new Array(this.config.dimensions).fill(0);
|
|
@@ -207,8 +213,8 @@ export class EWCConsolidator {
|
|
|
207
213
|
if (this.consolidationHistory.length > 100) {
|
|
208
214
|
this.consolidationHistory = this.consolidationHistory.slice(-100);
|
|
209
215
|
}
|
|
210
|
-
//
|
|
211
|
-
this.
|
|
216
|
+
// Schedule debounced disk flush
|
|
217
|
+
this.scheduleSave();
|
|
212
218
|
result.success = true;
|
|
213
219
|
result.duration = performance.now() - startTime;
|
|
214
220
|
return result;
|
|
@@ -322,6 +328,8 @@ export class EWCConsolidator {
|
|
|
322
328
|
this.globalFisher[i] = (1 - decay) * this.globalFisher[i] + decay * gradients[i] * gradients[i];
|
|
323
329
|
}
|
|
324
330
|
}
|
|
331
|
+
// Schedule debounced flush so importance/Fisher updates are persisted
|
|
332
|
+
this.scheduleSave();
|
|
325
333
|
}
|
|
326
334
|
/**
|
|
327
335
|
* Get pattern weights by ID
|
|
@@ -391,7 +399,7 @@ export class EWCConsolidator {
|
|
|
391
399
|
for (let i = 0; i < this.config.dimensions; i++) {
|
|
392
400
|
this.globalFisher[i] = alpha * this.globalFisher[i] + (1 - alpha) * currentFisher[i];
|
|
393
401
|
}
|
|
394
|
-
this.
|
|
402
|
+
this.scheduleSave();
|
|
395
403
|
}
|
|
396
404
|
/**
|
|
397
405
|
* Compute consolidation penalty for a proposed confidence update.
|
|
@@ -416,6 +424,12 @@ export class EWCConsolidator {
|
|
|
416
424
|
* Clear all patterns and history (full reset)
|
|
417
425
|
*/
|
|
418
426
|
clear() {
|
|
427
|
+
// Cancel any pending debounced write before clearing
|
|
428
|
+
if (this.saveTimer) {
|
|
429
|
+
clearTimeout(this.saveTimer);
|
|
430
|
+
this.saveTimer = null;
|
|
431
|
+
}
|
|
432
|
+
this.dirty = false;
|
|
419
433
|
this.patterns.clear();
|
|
420
434
|
this.gradientHistory = [];
|
|
421
435
|
this.globalFisher = new Array(this.config.dimensions).fill(0);
|
|
@@ -485,6 +499,26 @@ export class EWCConsolidator {
|
|
|
485
499
|
this.patterns.delete(sortedPatterns[i].id);
|
|
486
500
|
}
|
|
487
501
|
}
|
|
502
|
+
/**
|
|
503
|
+
* Schedule a debounced disk flush.
|
|
504
|
+
* Multiple calls within SAVE_DEBOUNCE_MS coalesce into one write,
|
|
505
|
+
* preventing blocking I/O on every consolidation or gradient event.
|
|
506
|
+
*/
|
|
507
|
+
scheduleSave() {
|
|
508
|
+
this.dirty = true;
|
|
509
|
+
if (this.saveTimer)
|
|
510
|
+
return; // already scheduled
|
|
511
|
+
this.saveTimer = setTimeout(() => {
|
|
512
|
+
this.saveTimer = null;
|
|
513
|
+
if (this.dirty) {
|
|
514
|
+
this.dirty = false;
|
|
515
|
+
this.saveToDisk();
|
|
516
|
+
}
|
|
517
|
+
}, EWCConsolidator.SAVE_DEBOUNCE_MS);
|
|
518
|
+
// Allow the process to exit without waiting for the timer
|
|
519
|
+
if (this.saveTimer.unref)
|
|
520
|
+
this.saveTimer.unref();
|
|
521
|
+
}
|
|
488
522
|
/**
|
|
489
523
|
* Save state to disk
|
|
490
524
|
*/
|