monomind 1.7.0 → 1.9.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/design/design-monodesign.md +121 -0
- package/.claude/agents/github/issue-tracker.md +12 -12
- package/.claude/agents/github/pr-manager.md +10 -10
- package/.claude/agents/github/release-manager.md +49 -105
- package/.claude/agents/github/repo-architect.md +73 -92
- package/.claude/agents/github/sync-coordinator.md +55 -123
- package/.claude/agents/marketing/marketing-competitive-content.md +155 -0
- package/.claude/agents/marketing/marketing-content-creator.md +13 -0
- package/.claude/agents/marketing/marketing-cro-specialist.md +147 -0
- package/.claude/agents/marketing/marketing-email-specialist.md +90 -0
- package/.claude/agents/marketing/marketing-launch-strategist.md +129 -0
- package/.claude/agents/marketing/marketing-pricing-strategist.md +127 -0
- package/.claude/agents/specialists/integration-architect.md +94 -0
- package/.claude/commands/agents/README.md +4 -0
- package/.claude/commands/agents/agent-capabilities.md +6 -2
- package/.claude/commands/agents/agent-coordination.md +4 -0
- package/.claude/commands/agents/agent-spawning.md +4 -0
- package/.claude/commands/agents/agent-types.md +6 -2
- package/.claude/commands/analysis/README.md +14 -5
- package/.claude/commands/analysis/bottleneck-detect.md +30 -123
- package/.claude/commands/analysis/performance-bottlenecks.md +14 -14
- package/.claude/commands/analysis/performance-report.md +38 -11
- package/.claude/commands/analysis/token-efficiency.md +13 -16
- package/.claude/commands/analysis/token-usage.md +34 -12
- package/.claude/commands/automation/README.md +15 -5
- package/.claude/commands/automation/auto-agent.md +49 -85
- package/.claude/commands/automation/self-healing.md +20 -18
- package/.claude/commands/automation/session-memory.md +28 -29
- package/.claude/commands/automation/smart-agents.md +17 -9
- package/.claude/commands/automation/smart-spawn.md +52 -11
- package/.claude/commands/automation/workflow-select.md +46 -11
- package/.claude/commands/browse.md +5 -0
- package/.claude/commands/coordination/README.md +9 -5
- package/.claude/commands/coordination/agent-spawn.md +53 -9
- package/.claude/commands/coordination/swarm-init.md +39 -42
- package/.claude/commands/coordination/task-orchestrate.md +65 -11
- package/.claude/commands/github/README.md +21 -8
- package/.claude/commands/github/github-modes.md +9 -5
- package/.claude/commands/github/issue-tracker.md +34 -33
- package/.claude/commands/github/pr-manager.md +20 -17
- package/.claude/commands/github/release-manager.md +37 -49
- package/.claude/commands/github/repo-architect.md +39 -41
- package/.claude/commands/github/sync-coordinator.md +45 -49
- package/.claude/commands/hive-mind/README.md +42 -17
- package/.claude/commands/hive-mind/hive-mind-consensus.md +68 -4
- package/.claude/commands/hive-mind/hive-mind-init.md +55 -5
- package/.claude/commands/hive-mind/hive-mind-memory.md +69 -4
- package/.claude/commands/hive-mind/hive-mind-spawn.md +71 -10
- package/.claude/commands/hive-mind/hive-mind-status.md +52 -4
- package/.claude/commands/hive-mind/hive-mind-stop.md +51 -4
- package/.claude/commands/hive-mind/hive-mind.md +74 -14
- package/.claude/commands/hooks/README.md +62 -7
- package/.claude/commands/hooks/overview.md +94 -35
- package/.claude/commands/hooks/post-edit.md +48 -87
- package/.claude/commands/hooks/post-task.md +37 -87
- package/.claude/commands/hooks/pre-edit.md +52 -84
- package/.claude/commands/hooks/pre-task.md +46 -81
- package/.claude/commands/hooks/session-end.md +49 -85
- package/.claude/commands/hooks/setup.md +87 -58
- package/.claude/commands/mastermind/_repeat.md +308 -0
- package/.claude/commands/mastermind/architect.md +49 -0
- package/.claude/commands/mastermind/brain.md +98 -0
- package/.claude/commands/mastermind/build.md +22 -0
- package/.claude/commands/mastermind/content.md +22 -0
- package/.claude/commands/mastermind/createorg.md +94 -0
- package/.claude/commands/mastermind/finance.md +22 -0
- package/.claude/commands/mastermind/idea.md +22 -0
- package/.claude/commands/mastermind/marketing.md +22 -0
- package/.claude/commands/mastermind/master.md +379 -0
- package/.claude/commands/mastermind/ops.md +22 -0
- package/.claude/commands/mastermind/release.md +22 -0
- package/.claude/commands/mastermind/research.md +22 -0
- package/.claude/commands/mastermind/review.md +22 -0
- package/.claude/commands/mastermind/runorg.md +106 -0
- package/.claude/commands/mastermind/sales.md +22 -0
- package/.claude/commands/mastermind/techport.md +17 -0
- package/.claude/commands/memory/README.md +75 -5
- package/.claude/commands/memory/memory-search.md +63 -11
- package/.claude/commands/monitoring/README.md +64 -4
- package/.claude/commands/monitoring/agent-metrics.md +50 -10
- package/.claude/commands/monitoring/agents.md +59 -32
- package/.claude/commands/monitoring/status.md +96 -34
- package/.claude/commands/monograph/README.md +102 -0
- package/.claude/commands/monograph/monograph-build.md +79 -0
- package/.claude/commands/monograph/monograph-search.md +96 -0
- package/.claude/commands/monograph/monograph-stats.md +53 -0
- package/.claude/commands/monograph/monograph-watch.md +63 -0
- package/.claude/commands/monograph/monograph-wiki.md +91 -0
- package/.claude/commands/monomind/createtask.md +277 -0
- package/.claude/commands/{monomind-do.md → monomind/do.md} +22 -9
- package/.claude/commands/monomind/help.md +118 -0
- package/.claude/commands/{monomind-idea.md → monomind/idea.md} +23 -29
- package/.claude/commands/{monomind-improve.md → monomind/improve.md} +24 -30
- package/.claude/commands/monomind/memory.md +230 -0
- package/.claude/commands/monomind/repeat.md +201 -0
- package/.claude/commands/monomind/review.md +313 -0
- package/.claude/commands/monomind/specialagents.md +125 -0
- package/.claude/commands/monomind/swarm.md +161 -0
- package/.claude/commands/monomind/understand.md +148 -0
- package/.claude/commands/optimization/README.md +69 -5
- package/.claude/commands/optimization/auto-topology.md +66 -43
- package/.claude/commands/optimization/parallel-execution.md +65 -39
- package/.claude/commands/optimization/performance-optimize.md +79 -0
- package/.claude/commands/pair/README.md +48 -230
- package/.claude/commands/pair/examples.md +85 -441
- package/.claude/commands/pair/modes.md +77 -303
- package/.claude/commands/pair/session.md +76 -359
- package/.claude/commands/sparc/analyzer.md +9 -26
- package/.claude/commands/sparc/architect.md +8 -25
- package/.claude/commands/sparc/ask.md +27 -68
- package/.claude/commands/sparc/batch-executor.md +8 -25
- package/.claude/commands/sparc/code.md +12 -53
- package/.claude/commands/sparc/coder.md +8 -25
- package/.claude/commands/sparc/debug.md +12 -53
- package/.claude/commands/sparc/debugger.md +8 -25
- package/.claude/commands/sparc/designer.md +8 -25
- package/.claude/commands/sparc/devops.md +16 -57
- package/.claude/commands/sparc/docs-writer.md +12 -53
- package/.claude/commands/sparc/documenter.md +8 -25
- package/.claude/commands/sparc/innovator.md +8 -25
- package/.claude/commands/sparc/integration.md +12 -53
- package/.claude/commands/sparc/mcp.md +12 -53
- package/.claude/commands/sparc/memory-manager.md +28 -25
- package/.claude/commands/sparc/optimizer.md +8 -25
- package/.claude/commands/sparc/orchestrator.md +35 -97
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +13 -54
- package/.claude/commands/sparc/refinement-optimization-mode.md +13 -54
- package/.claude/commands/sparc/researcher.md +8 -25
- package/.claude/commands/sparc/reviewer.md +8 -25
- package/.claude/commands/sparc/security-review.md +13 -54
- package/.claude/commands/sparc/sparc-modes.md +97 -151
- package/.claude/commands/sparc/sparc.md +16 -56
- package/.claude/commands/sparc/spec-pseudocode.md +13 -54
- package/.claude/commands/sparc/supabase-admin.md +19 -66
- package/.claude/commands/sparc/swarm-coordinator.md +21 -25
- package/.claude/commands/sparc/tdd.md +8 -25
- package/.claude/commands/sparc/tester.md +8 -25
- package/.claude/commands/sparc/tutorial.md +12 -53
- package/.claude/commands/sparc/workflow-manager.md +8 -25
- package/.claude/commands/sparc.md +76 -130
- package/.claude/commands/stream-chain/pipeline.md +72 -77
- package/.claude/commands/stream-chain/run.md +133 -47
- package/.claude/commands/swarm/README.md +37 -12
- package/.claude/commands/swarm/analysis.md +47 -69
- package/.claude/commands/swarm/development.md +45 -69
- package/.claude/commands/swarm/examples.md +77 -142
- package/.claude/commands/swarm/maintenance.md +47 -74
- package/.claude/commands/swarm/optimization.md +54 -87
- package/.claude/commands/swarm/research.md +47 -107
- package/.claude/commands/swarm/swarm-analysis.md +58 -4
- package/.claude/commands/swarm/swarm-background.md +61 -4
- package/.claude/commands/swarm/swarm-modes.md +63 -4
- package/.claude/commands/swarm/swarm-monitor.md +50 -4
- package/.claude/commands/swarm/swarm-status.md +40 -4
- package/.claude/commands/swarm/swarm-strategies.md +73 -5
- package/.claude/commands/swarm/swarm.md +70 -18
- package/.claude/commands/swarm/testing.md +51 -102
- package/.claude/commands/tokens.md +6 -1
- package/.claude/commands/training/README.md +36 -6
- package/.claude/commands/training/model-update.md +68 -15
- package/.claude/commands/training/neural-patterns.md +54 -55
- package/.claude/commands/training/neural-train.md +70 -16
- package/.claude/commands/training/pattern-learn.md +60 -16
- package/.claude/commands/training/specialization.md +78 -49
- package/.claude/commands/truth/start.md +87 -109
- package/.claude/commands/ts.md +7 -2
- package/.claude/commands/verify/check.md +90 -34
- package/.claude/commands/verify/start.md +71 -94
- package/.claude/commands/workflows/README.md +62 -6
- package/.claude/commands/workflows/development.md +69 -61
- package/.claude/commands/workflows/research.md +73 -47
- package/.claude/commands/workflows/workflow-create.md +75 -16
- package/.claude/commands/workflows/workflow-execute.md +94 -16
- package/.claude/commands/workflows/workflow-export.md +81 -16
- package/.claude/helpers/control-start.cjs +91 -0
- package/.claude/helpers/extras-registry.json +4104 -1991
- package/.claude/helpers/graphify-freshen.cjs +44 -13
- package/.claude/helpers/hook-handler.cjs +256 -1
- package/.claude/helpers/loop-tracker.cjs +107 -0
- package/.claude/helpers/router.cjs +48 -68
- package/.claude/helpers/skill-registry.json +89 -104
- package/.claude/helpers/statusline.cjs +33 -2
- package/.claude/scheduled_tasks.lock +1 -0
- package/.claude/settings.json +15 -0
- package/.claude/skills/.monomind/data/ranked-context.json +5 -0
- package/.claude/skills/.monomind/sessions/current.json +13 -0
- package/.claude/skills/.monomind/sessions/session-1777829336455.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777831614725.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777832095857.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777839814183.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777841847131.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777843309463.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777880867159.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777881884593.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777884090471.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777884808221.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777885672155.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777886852818.json +15 -0
- package/.claude/skills/.monomind/sessions/session-1777896532690.json +15 -0
- package/.claude/skills/agentdb-advanced/SKILL.md +11 -12
- package/.claude/skills/agentdb-learning/SKILL.md +20 -21
- package/.claude/skills/agentdb-memory-patterns/SKILL.md +28 -30
- package/.claude/skills/agentdb-optimization/SKILL.md +11 -12
- package/.claude/skills/agentdb-vector-search/SKILL.md +37 -41
- package/.claude/skills/{v3-integration-deep → agentic-integration}/SKILL.md +20 -13
- package/.claude/skills/agentic-jujutsu/SKILL.md +22 -22
- package/.claude/skills/{v3-cli-modernization → cli-modernization}/SKILL.md +17 -8
- package/.claude/skills/{v3-core-implementation → core-implementation}/SKILL.md +33 -8
- package/.claude/skills/{v3-ddd-architecture → ddd-architecture}/SKILL.md +18 -25
- package/.claude/skills/github-code-review/SKILL.md +82 -83
- package/.claude/skills/github-multi-repo/SKILL.md +42 -46
- package/.claude/skills/github-project-management/SKILL.md +83 -88
- package/.claude/skills/github-release-management/SKILL.md +12 -18
- package/.claude/skills/github-workflow-automation/SKILL.md +70 -74
- package/.claude/skills/hooks-automation/SKILL.md +9 -13
- package/.claude/skills/mastermind/_intake.md +83 -0
- package/.claude/skills/mastermind/_protocol.md +275 -0
- package/.claude/skills/mastermind/architect.md +847 -0
- package/.claude/skills/mastermind/build.md +158 -0
- package/.claude/skills/mastermind/content.md +185 -0
- package/.claude/skills/mastermind/createorg.md +318 -0
- package/.claude/skills/mastermind/finance.md +154 -0
- package/.claude/skills/mastermind/idea.md +158 -0
- package/.claude/skills/mastermind/marketing.md +216 -0
- package/.claude/skills/mastermind/monotask.md +350 -0
- package/.claude/skills/mastermind/ops.md +156 -0
- package/.claude/skills/mastermind/references/copywriting-frameworks.md +181 -0
- package/.claude/skills/mastermind/references/persuasion-psychology.md +158 -0
- package/.claude/skills/mastermind/release.md +156 -0
- package/.claude/skills/mastermind/research.md +156 -0
- package/.claude/skills/mastermind/review.md +157 -0
- package/.claude/skills/mastermind/runorg.md +308 -0
- package/.claude/skills/mastermind/sales.md +158 -0
- package/.claude/skills/mastermind/techport.md +743 -0
- package/.claude/skills/{v3-mcp-optimization → mcp-optimization}/SKILL.md +35 -14
- package/.claude/skills/{v3-memory-unification → memory-unification}/SKILL.md +20 -4
- package/.claude/skills/monodesign/SKILL.md +302 -0
- package/.claude/skills/monodesign/reference/adapt.md +190 -0
- package/.claude/skills/monodesign/reference/animate.md +175 -0
- package/.claude/skills/monodesign/reference/antipatterns-catalog.md +187 -0
- package/.claude/skills/monodesign/reference/audit.md +133 -0
- package/.claude/skills/monodesign/reference/bolder.md +113 -0
- package/.claude/skills/monodesign/reference/brand-workflow.md +180 -0
- package/.claude/skills/monodesign/reference/brand.md +114 -0
- package/.claude/skills/monodesign/reference/clarify.md +174 -0
- package/.claude/skills/monodesign/reference/cognitive-load.md +106 -0
- package/.claude/skills/monodesign/reference/color-and-contrast.md +105 -0
- package/.claude/skills/monodesign/reference/colorize.md +154 -0
- package/.claude/skills/monodesign/reference/component-specs.md +260 -0
- package/.claude/skills/monodesign/reference/component-states.md +274 -0
- package/.claude/skills/monodesign/reference/component-system.md +358 -0
- package/.claude/skills/monodesign/reference/copy-formulas.md +160 -0
- package/.claude/skills/monodesign/reference/craft.md +193 -0
- package/.claude/skills/monodesign/reference/critique.md +213 -0
- package/.claude/skills/monodesign/reference/delight.md +302 -0
- package/.claude/skills/monodesign/reference/design-principles.md +246 -0
- package/.claude/skills/monodesign/reference/distill.md +111 -0
- package/.claude/skills/monodesign/reference/document.md +427 -0
- package/.claude/skills/monodesign/reference/extract.md +69 -0
- package/.claude/skills/monodesign/reference/harden.md +347 -0
- package/.claude/skills/monodesign/reference/heuristics-scoring.md +234 -0
- package/.claude/skills/monodesign/reference/image-prompts.md +118 -0
- package/.claude/skills/monodesign/reference/interaction-design.md +195 -0
- package/.claude/skills/monodesign/reference/layout.md +141 -0
- package/.claude/skills/monodesign/reference/live.md +622 -0
- package/.claude/skills/monodesign/reference/motion-design.md +109 -0
- package/.claude/skills/monodesign/reference/onboard.md +234 -0
- package/.claude/skills/monodesign/reference/optimize.md +258 -0
- package/.claude/skills/monodesign/reference/overdrive.md +130 -0
- package/.claude/skills/monodesign/reference/personas.md +179 -0
- package/.claude/skills/monodesign/reference/polish.md +233 -0
- package/.claude/skills/monodesign/reference/pre-delivery-checklist.md +108 -0
- package/.claude/skills/monodesign/reference/product.md +62 -0
- package/.claude/skills/monodesign/reference/quieter.md +99 -0
- package/.claude/skills/monodesign/reference/responsive-design.md +114 -0
- package/.claude/skills/monodesign/reference/shape.md +151 -0
- package/.claude/skills/monodesign/reference/spatial-design.md +100 -0
- package/.claude/skills/monodesign/reference/teach.md +156 -0
- package/.claude/skills/monodesign/reference/token-architecture.md +222 -0
- package/.claude/skills/monodesign/reference/typeset.md +124 -0
- package/.claude/skills/monodesign/reference/typography.md +159 -0
- package/.claude/skills/monodesign/reference/ux-research.md +143 -0
- package/.claude/skills/monodesign/reference/ux-rules.md +211 -0
- package/.claude/skills/monodesign/reference/ux-writing.md +107 -0
- package/.claude/skills/monomotion/SKILL.md +145 -0
- package/.claude/skills/monomotion/rules/api-control.md +139 -0
- package/.claude/skills/monomotion/rules/effects.md +109 -0
- package/.claude/skills/monomotion/rules/integration.md +140 -0
- package/.claude/skills/monomotion/rules/scroll.md +131 -0
- package/.claude/skills/monomotion/rules/sequencing.md +105 -0
- package/.claude/skills/monomotion/rules/svg.md +101 -0
- package/.claude/skills/monomotion/rules/text.md +119 -0
- package/.claude/skills/pair-programming/SKILL.md +1 -1
- package/.claude/skills/performance-analysis/SKILL.md +3 -3
- package/.claude/skills/{v3-performance-optimization → performance-optimization}/SKILL.md +16 -8
- package/.claude/skills/reasoningbank-agentdb/SKILL.md +17 -19
- package/.claude/skills/reasoningbank-intelligence/SKILL.md +4 -6
- package/.claude/skills/{v3-security-overhaul → security-hardening}/SKILL.md +13 -3
- package/.claude/skills/skill-builder/SKILL.md +19 -19
- package/.claude/skills/sparc-methodology/SKILL.md +55 -211
- package/.claude/skills/stop-slop/SKILL.md +67 -0
- package/.claude/skills/stop-slop/references/examples.md +61 -0
- package/.claude/skills/stop-slop/references/phrases.md +130 -0
- package/.claude/skills/stop-slop/references/structures.md +136 -0
- package/.claude/skills/swarm-advanced/SKILL.md +13 -43
- package/.claude/skills/{v3-swarm-coordination → swarm-coordination}/SKILL.md +39 -21
- package/.claude/skills/swarm-orchestration/SKILL.md +12 -12
- package/.claude/skills/verification-quality/SKILL.md +5 -5
- package/README.md +5 -5
- package/package.json +1 -1
- package/packages/@monomind/cli/README.md +5 -5
- package/packages/@monomind/cli/bin/cli.js +78 -13
- package/packages/@monomind/cli/dist/src/agents/halt-signal.js +33 -7
- package/packages/@monomind/cli/dist/src/agents/managed-agent.js +5 -2
- package/packages/@monomind/cli/dist/src/agents/prompt-experiment.d.ts +3 -2
- package/packages/@monomind/cli/dist/src/agents/prompt-experiment.js +1 -1
- package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.d.ts +5 -2
- package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.js +26 -4
- package/packages/@monomind/cli/dist/src/agents/specialization-scorer.js +17 -9
- package/packages/@monomind/cli/dist/src/agents/trigger-scanner.d.ts +5 -3
- package/packages/@monomind/cli/dist/src/agents/trigger-scanner.js +58 -10
- package/packages/@monomind/cli/dist/src/agents/version-store.d.ts +0 -1
- package/packages/@monomind/cli/dist/src/agents/version-store.js +44 -21
- package/packages/@monomind/cli/dist/src/autopilot-state.js +79 -28
- package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.d.ts +7 -2
- package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.js +20 -8
- package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.d.ts +2 -1
- package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.js +25 -2
- package/packages/@monomind/cli/dist/src/commands/agent.js +6 -4
- package/packages/@monomind/cli/dist/src/commands/appliance-advanced.js +23 -0
- package/packages/@monomind/cli/dist/src/commands/autopilot.js +3 -3
- package/packages/@monomind/cli/dist/src/commands/benchmark.js +119 -8
- package/packages/@monomind/cli/dist/src/commands/claims.js +22 -14
- package/packages/@monomind/cli/dist/src/commands/config.js +32 -0
- package/packages/@monomind/cli/dist/src/commands/daemon.js +13 -11
- package/packages/@monomind/cli/dist/src/commands/deployment.js +21 -2
- package/packages/@monomind/cli/dist/src/commands/doctor.js +28 -62
- package/packages/@monomind/cli/dist/src/commands/embeddings.js +124 -48
- package/packages/@monomind/cli/dist/src/commands/hive-mind.js +15 -14
- package/packages/@monomind/cli/dist/src/commands/hooks.js +45 -41
- package/packages/@monomind/cli/dist/src/commands/index.d.ts +2 -0
- package/packages/@monomind/cli/dist/src/commands/index.js +20 -7
- package/packages/@monomind/cli/dist/src/commands/init.js +53 -19
- package/packages/@monomind/cli/dist/src/commands/mcp.js +31 -44
- package/packages/@monomind/cli/dist/src/commands/memory.js +47 -15
- package/packages/@monomind/cli/dist/src/commands/migrate.js +156 -108
- package/packages/@monomind/cli/dist/src/commands/monograph.d.ts +8 -0
- package/packages/@monomind/cli/dist/src/commands/monograph.js +526 -0
- package/packages/@monomind/cli/dist/src/commands/neural.js +96 -56
- package/packages/@monomind/cli/dist/src/commands/performance.js +30 -8
- package/packages/@monomind/cli/dist/src/commands/plugins.js +13 -37
- package/packages/@monomind/cli/dist/src/commands/process.js +25 -2
- package/packages/@monomind/cli/dist/src/commands/providers.js +37 -5
- package/packages/@monomind/cli/dist/src/commands/replay.js +4 -4
- package/packages/@monomind/cli/dist/src/commands/route.js +37 -5
- package/packages/@monomind/cli/dist/src/commands/ruvector/import.js +12 -2
- package/packages/@monomind/cli/dist/src/commands/ruvector/init.js +15 -0
- package/packages/@monomind/cli/dist/src/commands/ruvector/status.js +16 -3
- package/packages/@monomind/cli/dist/src/commands/security.js +342 -193
- package/packages/@monomind/cli/dist/src/commands/session.js +51 -8
- package/packages/@monomind/cli/dist/src/commands/start.js +18 -4
- package/packages/@monomind/cli/dist/src/commands/swarm.js +47 -36
- package/packages/@monomind/cli/dist/src/commands/tokens.js +11 -11
- package/packages/@monomind/cli/dist/src/commands/transfer-store.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/workflow.js +31 -4
- package/packages/@monomind/cli/dist/src/config-adapter.d.ts +2 -1
- package/packages/@monomind/cli/dist/src/consensus/audit-writer.js +46 -13
- package/packages/@monomind/cli/dist/src/consensus/vote-signer.d.ts +0 -3
- package/packages/@monomind/cli/dist/src/consensus/vote-signer.js +9 -1
- package/packages/@monomind/cli/dist/src/dlq/dlq-reader.d.ts +4 -2
- package/packages/@monomind/cli/dist/src/dlq/dlq-reader.js +25 -8
- package/packages/@monomind/cli/dist/src/dlq/dlq-replayer.d.ts +10 -3
- package/packages/@monomind/cli/dist/src/dlq/dlq-replayer.js +50 -16
- package/packages/@monomind/cli/dist/src/dlq/dlq-writer.js +27 -5
- package/packages/@monomind/cli/dist/src/eval/dataset-manager.d.ts +2 -2
- package/packages/@monomind/cli/dist/src/eval/dataset-manager.js +26 -16
- package/packages/@monomind/cli/dist/src/eval/trace-collector.js +23 -3
- package/packages/@monomind/cli/dist/src/index.js +12 -10
- package/packages/@monomind/cli/dist/src/init/claudemd-generator.js +8 -8
- package/packages/@monomind/cli/dist/src/init/executor.js +163 -137
- package/packages/@monomind/cli/dist/src/init/helpers-generator.js +49 -36
- package/packages/@monomind/cli/dist/src/init/mcp-generator.js +3 -3
- package/packages/@monomind/cli/dist/src/init/settings-generator.js +10 -3
- package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.js +18 -3
- package/packages/@monomind/cli/dist/src/init/statusline-generator.js +3 -1
- package/packages/@monomind/cli/dist/src/init/types.d.ts +35 -11
- package/packages/@monomind/cli/dist/src/init/types.js +5 -9
- package/packages/@monomind/cli/dist/src/interactive/interrupt.js +8 -3
- package/packages/@monomind/cli/dist/src/mcp/tool-registry.js +38 -4
- package/packages/@monomind/cli/dist/src/mcp-client.js +15 -6
- package/packages/@monomind/cli/dist/src/mcp-server.d.ts +9 -2
- package/packages/@monomind/cli/dist/src/mcp-server.js +182 -35
- package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +66 -34
- package/packages/@monomind/cli/dist/src/mcp-tools/agentdb-tools.js +34 -7
- package/packages/@monomind/cli/dist/src/mcp-tools/analyze-tools.js +25 -16
- package/packages/@monomind/cli/dist/src/mcp-tools/auto-install.js +4 -6
- package/packages/@monomind/cli/dist/src/mcp-tools/autopilot-tools.js +12 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.js +199 -20
- package/packages/@monomind/cli/dist/src/mcp-tools/claims-tools.js +68 -18
- package/packages/@monomind/cli/dist/src/mcp-tools/config-tools.js +33 -5
- package/packages/@monomind/cli/dist/src/mcp-tools/coordination-tools.js +59 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +46 -10
- package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.js +46 -5
- package/packages/@monomind/cli/dist/src/mcp-tools/github-tools.js +29 -16
- package/packages/@monomind/cli/dist/src/mcp-tools/graphify-tools.d.ts +4 -67
- package/packages/@monomind/cli/dist/src/mcp-tools/graphify-tools.js +40 -1250
- package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +38 -10
- package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +96 -33
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +70 -37
- package/packages/@monomind/cli/dist/src/mcp-tools/index.d.ts +1 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/index.js +1 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +29 -13
- package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.d.ts +9 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +6306 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +121 -37
- package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.js +21 -8
- package/packages/@monomind/cli/dist/src/mcp-tools/progress-tools.js +10 -8
- package/packages/@monomind/cli/dist/src/mcp-tools/request-tracker.js +4 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/ruvllm-tools.js +19 -8
- package/packages/@monomind/cli/dist/src/mcp-tools/session-tools.js +57 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.js +35 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.js +4 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/task-tools.js +53 -13
- package/packages/@monomind/cli/dist/src/mcp-tools/terminal-tools.js +63 -14
- package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +21 -16
- package/packages/@monomind/cli/dist/src/mcp-tools/workflow-tools.js +92 -23
- package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.js +41 -10
- package/packages/@monomind/cli/dist/src/memory/intelligence.d.ts +2 -2
- package/packages/@monomind/cli/dist/src/memory/intelligence.js +39 -13
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.d.ts +1 -0
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +149 -56
- package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +107 -45
- package/packages/@monomind/cli/dist/src/memory/sona-optimizer.d.ts +8 -1
- package/packages/@monomind/cli/dist/src/memory/sona-optimizer.js +25 -8
- package/packages/@monomind/cli/dist/src/observability/replay-reader.d.ts +40 -0
- package/packages/@monomind/cli/dist/src/observability/replay-reader.js +138 -0
- package/packages/@monomind/cli/dist/src/orchestration/routing-modes.js +35 -5
- package/packages/@monomind/cli/dist/src/parser.d.ts +8 -0
- package/packages/@monomind/cli/dist/src/parser.js +48 -14
- package/packages/@monomind/cli/dist/src/plugins/manager.js +112 -19
- package/packages/@monomind/cli/dist/src/plugins/store/discovery.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/plugins/store/discovery.js +80 -62
- package/packages/@monomind/cli/dist/src/production/circuit-breaker.js +8 -1
- package/packages/@monomind/cli/dist/src/production/error-handler.d.ts +4 -2
- package/packages/@monomind/cli/dist/src/production/error-handler.js +27 -5
- package/packages/@monomind/cli/dist/src/production/monitoring.js +8 -4
- package/packages/@monomind/cli/dist/src/production/rate-limiter.js +30 -22
- package/packages/@monomind/cli/dist/src/ruvector/agent-wasm.js +2 -2
- package/packages/@monomind/cli/dist/src/ruvector/coverage-router.js +19 -9
- package/packages/@monomind/cli/dist/src/ruvector/diff-classifier.d.ts +1 -0
- package/packages/@monomind/cli/dist/src/ruvector/diff-classifier.js +26 -6
- package/packages/@monomind/cli/dist/src/ruvector/enhanced-model-router.js +24 -2
- package/packages/@monomind/cli/dist/src/ruvector/index.d.ts +1 -2
- package/packages/@monomind/cli/dist/src/ruvector/index.js +2 -2
- package/packages/@monomind/cli/dist/src/ruvector/model-router.d.ts +4 -2
- package/packages/@monomind/cli/dist/src/ruvector/model-router.js +30 -6
- package/packages/@monomind/cli/dist/src/ruvector/moe-router.d.ts +7 -0
- package/packages/@monomind/cli/dist/src/ruvector/moe-router.js +35 -12
- package/packages/@monomind/cli/dist/src/ruvector/q-learning-router.d.ts +7 -1
- package/packages/@monomind/cli/dist/src/ruvector/q-learning-router.js +40 -9
- package/packages/@monomind/cli/dist/src/services/claim-service.d.ts +3 -1
- package/packages/@monomind/cli/dist/src/services/claim-service.js +33 -2
- package/packages/@monomind/cli/dist/src/services/config-file-manager.d.ts +16 -2
- package/packages/@monomind/cli/dist/src/services/config-file-manager.js +105 -17
- package/packages/@monomind/cli/dist/src/services/container-worker-pool.js +51 -11
- package/packages/@monomind/cli/dist/src/services/headless-worker-executor.d.ts +7 -0
- package/packages/@monomind/cli/dist/src/services/headless-worker-executor.js +188 -45
- package/packages/@monomind/cli/dist/src/services/registry-api.js +62 -9
- package/packages/@monomind/cli/dist/src/services/ruvector-training.js +8 -0
- package/packages/@monomind/cli/dist/src/services/worker-daemon.d.ts +4 -1
- package/packages/@monomind/cli/dist/src/services/worker-daemon.js +112 -28
- package/packages/@monomind/cli/dist/src/services/worker-queue.d.ts +9 -2
- package/packages/@monomind/cli/dist/src/services/worker-queue.js +86 -5
- package/packages/@monomind/cli/dist/src/suggest.js +9 -0
- package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.d.ts +5 -3
- package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.js +17 -5
- package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.js +30 -6
- package/packages/@monomind/cli/dist/src/transfer/anonymization/index.js +5 -3
- package/packages/@monomind/cli/dist/src/transfer/export.js +5 -3
- package/packages/@monomind/cli/dist/src/transfer/ipfs/client.js +84 -7
- package/packages/@monomind/cli/dist/src/transfer/ipfs/upload.js +13 -4
- package/packages/@monomind/cli/dist/src/transfer/storage/gcs.js +19 -10
- package/packages/@monomind/cli/dist/src/transfer/store/discovery.d.ts +9 -2
- package/packages/@monomind/cli/dist/src/transfer/store/discovery.js +68 -13
- package/packages/@monomind/cli/dist/src/transfer/store/download.d.ts +15 -6
- package/packages/@monomind/cli/dist/src/transfer/store/download.js +113 -24
- package/packages/@monomind/cli/dist/src/transfer/store/publish.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/transfer/store/publish.js +13 -14
- package/packages/@monomind/cli/dist/src/transfer/store/registry.d.ts +3 -3
- package/packages/@monomind/cli/dist/src/transfer/store/registry.js +32 -16
- package/packages/@monomind/cli/dist/src/update/checker.js +17 -4
- package/packages/@monomind/cli/dist/src/update/executor.js +25 -20
- package/packages/@monomind/cli/dist/src/update/rate-limiter.d.ts +11 -0
- package/packages/@monomind/cli/dist/src/update/rate-limiter.js +23 -3
- package/packages/@monomind/cli/dist/src/utils/parse-jsonl.d.ts +6 -0
- package/packages/@monomind/cli/dist/src/utils/parse-jsonl.js +22 -0
- package/packages/@monomind/cli/dist/src/workflow/condition-evaluator.js +37 -3
- package/packages/@monomind/cli/dist/src/workflow/dag-builder.js +27 -11
- package/packages/@monomind/cli/dist/src/workflow/dag-executor.js +51 -13
- package/packages/@monomind/cli/dist/src/workflow/dsl-schema.d.ts +3 -0
- package/packages/@monomind/cli/dist/src/workflow/dsl-schema.js +6 -2
- package/packages/@monomind/cli/dist/src/workflow/template-engine.js +7 -0
- package/packages/@monomind/cli/dist/src/workflow/workflow-executor.js +95 -14
- package/packages/@monomind/cli/package.json +5 -2
- package/packages/@monomind/guidance/README.md +0 -3
- package/packages/@monomind/shared/README.md +0 -1
- package/packages/@monomind/shared/dist/types/consensus-audit.d.ts +3 -1
- package/packages/README.md +15 -16
- package/.claude/agents/design/design-brand-guardian.md +0 -323
- package/.claude/agents/design/design-image-prompt-engineer.md +0 -237
- package/.claude/agents/design/design-inclusive-visuals-specialist.md +0 -72
- package/.claude/agents/design/design-ui-designer.md +0 -384
- package/.claude/agents/design/design-ux-architect.md +0 -470
- package/.claude/agents/design/design-ux-researcher.md +0 -330
- package/.claude/agents/design/design-visual-storyteller.md +0 -150
- package/.claude/agents/design/design-whimsy-injector.md +0 -439
- package/.claude/agents/v3/integration-architect.md +0 -338
- package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +0 -54
- package/.claude/commands/coordination/init.md +0 -44
- package/.claude/commands/coordination/orchestrate.md +0 -43
- package/.claude/commands/coordination/spawn.md +0 -45
- package/.claude/commands/github/code-review-swarm.md +0 -550
- package/.claude/commands/github/code-review.md +0 -25
- package/.claude/commands/github/github-swarm.md +0 -121
- package/.claude/commands/github/issue-triage.md +0 -25
- package/.claude/commands/github/multi-repo-swarm.md +0 -519
- package/.claude/commands/github/pr-enhance.md +0 -26
- package/.claude/commands/github/project-board-sync.md +0 -471
- package/.claude/commands/github/release-swarm.md +0 -590
- package/.claude/commands/github/repo-analyze.md +0 -25
- package/.claude/commands/github/swarm-issue.md +0 -482
- package/.claude/commands/github/swarm-pr.md +0 -310
- package/.claude/commands/github/workflow-automation.md +0 -468
- package/.claude/commands/hive-mind/hive-mind-metrics.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-resume.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-sessions.md +0 -8
- package/.claude/commands/hive-mind/hive-mind-wizard.md +0 -8
- package/.claude/commands/list-agents.md +0 -17
- package/.claude/commands/memory/memory-persist.md +0 -25
- package/.claude/commands/memory/memory-usage.md +0 -25
- package/.claude/commands/memory/neural.md +0 -47
- package/.claude/commands/metrics.md +0 -11
- package/.claude/commands/monitoring/real-time-view.md +0 -25
- package/.claude/commands/monitoring/swarm-monitor.md +0 -25
- package/.claude/commands/monomind-createtask.md +0 -302
- package/.claude/commands/monomind-help.md +0 -103
- package/.claude/commands/monomind-memory.md +0 -107
- package/.claude/commands/monomind-repeat.md +0 -149
- package/.claude/commands/monomind-swarm.md +0 -205
- package/.claude/commands/optimization/cache-manage.md +0 -25
- package/.claude/commands/optimization/topology-optimize.md +0 -25
- package/.claude/commands/pair/commands.md +0 -546
- package/.claude/commands/pair/config.md +0 -510
- package/.claude/commands/pair/start.md +0 -209
- package/.claude/commands/use-agent.md +0 -67
- package/.claude/skills/monomind-createtask/SKILL.md +0 -269
- package/.claude/skills/monomind-task-engine/SKILL.md +0 -358
- /package/.claude/agents/{v3 → specialists}/memory-specialist.md +0 -0
- /package/.claude/agents/{v3 → specialists}/performance-engineer.md +0 -0
- /package/.claude/agents/{v3 → specialists}/queen-coordinator.md +0 -0
- /package/.claude/agents/{v3 → specialists}/security-architect.md +0 -0
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* Implements MCP tools for ADR-016: Collaborative Issue Claims
|
|
5
5
|
* Provides programmatic access to claim operations for MCP clients.
|
|
6
6
|
*
|
|
7
|
-
* @module @
|
|
7
|
+
* @module @monomind/cli/mcp-tools/claims
|
|
8
8
|
*/
|
|
9
9
|
// File-based persistence
|
|
10
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
10
|
+
import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'fs';
|
|
11
11
|
import { join, resolve } from 'path';
|
|
12
12
|
const CLAIMS_DIR = '.monomind/claims';
|
|
13
13
|
const CLAIMS_FILE = 'claims.json';
|
|
@@ -34,7 +34,10 @@ function loadClaims() {
|
|
|
34
34
|
}
|
|
35
35
|
function saveClaims(store) {
|
|
36
36
|
ensureClaimsDir();
|
|
37
|
-
|
|
37
|
+
const dest = getClaimsPath();
|
|
38
|
+
const tmp = `${dest}.${process.pid}.${Date.now()}.tmp`;
|
|
39
|
+
writeFileSync(tmp, JSON.stringify(store, null, 2), 'utf-8');
|
|
40
|
+
renameSync(tmp, dest);
|
|
38
41
|
}
|
|
39
42
|
function formatClaimant(claimant) {
|
|
40
43
|
return claimant.type === 'human'
|
|
@@ -78,13 +81,22 @@ export const claimsTools = [
|
|
|
78
81
|
const issueId = input.issueId;
|
|
79
82
|
const claimantStr = input.claimant;
|
|
80
83
|
const context = input.context;
|
|
84
|
+
const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
85
|
+
if (!issueId || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
|
|
86
|
+
return { success: false, error: 'Invalid issueId' };
|
|
87
|
+
}
|
|
81
88
|
const claimant = parseClaimant(claimantStr);
|
|
82
89
|
if (!claimant) {
|
|
83
90
|
return { success: false, error: 'Invalid claimant format. Use "human:userId:name" or "agent:agentId:agentType"' };
|
|
84
91
|
}
|
|
85
92
|
const store = loadClaims();
|
|
86
|
-
|
|
87
|
-
if (store.claims
|
|
93
|
+
const MAX_CLAIMS = 10000;
|
|
94
|
+
if (Object.keys(store.claims).length >= MAX_CLAIMS) {
|
|
95
|
+
return { success: false, error: 'Claims store at capacity' };
|
|
96
|
+
}
|
|
97
|
+
// Check if already claimed (Object.hasOwn defends against bracket access
|
|
98
|
+
// resolving to inherited Object.prototype methods like `toString`)
|
|
99
|
+
if (Object.hasOwn(store.claims, issueId)) {
|
|
88
100
|
const existing = store.claims[issueId];
|
|
89
101
|
return {
|
|
90
102
|
success: false,
|
|
@@ -137,15 +149,19 @@ export const claimsTools = [
|
|
|
137
149
|
const issueId = input.issueId;
|
|
138
150
|
const claimantStr = input.claimant;
|
|
139
151
|
const reason = input.reason;
|
|
152
|
+
const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
153
|
+
if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
|
|
154
|
+
return { success: false, error: 'Invalid issueId' };
|
|
155
|
+
}
|
|
140
156
|
const claimant = parseClaimant(claimantStr);
|
|
141
157
|
if (!claimant) {
|
|
142
158
|
return { success: false, error: 'Invalid claimant format' };
|
|
143
159
|
}
|
|
144
160
|
const store = loadClaims();
|
|
145
|
-
|
|
146
|
-
if (!claim) {
|
|
161
|
+
if (!Object.hasOwn(store.claims, issueId)) {
|
|
147
162
|
return { success: false, error: 'Issue is not claimed' };
|
|
148
163
|
}
|
|
164
|
+
const claim = store.claims[issueId];
|
|
149
165
|
// Verify ownership
|
|
150
166
|
if (formatClaimant(claim.claimant) !== formatClaimant(claimant)) {
|
|
151
167
|
return { success: false, error: 'Only the current claimant can release' };
|
|
@@ -197,16 +213,20 @@ export const claimsTools = [
|
|
|
197
213
|
const toStr = input.to;
|
|
198
214
|
const reason = input.reason;
|
|
199
215
|
const progress = input.progress || 0;
|
|
216
|
+
const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
217
|
+
if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
|
|
218
|
+
return { success: false, error: 'Invalid issueId' };
|
|
219
|
+
}
|
|
200
220
|
const from = parseClaimant(fromStr);
|
|
201
221
|
const to = parseClaimant(toStr);
|
|
202
222
|
if (!from || !to) {
|
|
203
223
|
return { success: false, error: 'Invalid claimant format' };
|
|
204
224
|
}
|
|
205
225
|
const store = loadClaims();
|
|
206
|
-
|
|
207
|
-
if (!claim) {
|
|
226
|
+
if (!Object.hasOwn(store.claims, issueId)) {
|
|
208
227
|
return { success: false, error: 'Issue is not claimed' };
|
|
209
228
|
}
|
|
229
|
+
const claim = store.claims[issueId];
|
|
210
230
|
if (formatClaimant(claim.claimant) !== formatClaimant(from)) {
|
|
211
231
|
return { success: false, error: 'Only the current claimant can request handoff' };
|
|
212
232
|
}
|
|
@@ -246,15 +266,19 @@ export const claimsTools = [
|
|
|
246
266
|
handler: async (input) => {
|
|
247
267
|
const issueId = input.issueId;
|
|
248
268
|
const claimantStr = input.claimant;
|
|
269
|
+
const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
270
|
+
if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
|
|
271
|
+
return { success: false, error: 'Invalid issueId' };
|
|
272
|
+
}
|
|
249
273
|
const claimant = parseClaimant(claimantStr);
|
|
250
274
|
if (!claimant) {
|
|
251
275
|
return { success: false, error: 'Invalid claimant format' };
|
|
252
276
|
}
|
|
253
277
|
const store = loadClaims();
|
|
254
|
-
|
|
255
|
-
if (!claim) {
|
|
278
|
+
if (!Object.hasOwn(store.claims, issueId)) {
|
|
256
279
|
return { success: false, error: 'Issue is not claimed' };
|
|
257
280
|
}
|
|
281
|
+
const claim = store.claims[issueId];
|
|
258
282
|
if (claim.status !== 'handoff-pending') {
|
|
259
283
|
return { success: false, error: 'No pending handoff for this issue' };
|
|
260
284
|
}
|
|
@@ -294,6 +318,10 @@ export const claimsTools = [
|
|
|
294
318
|
description: 'New status',
|
|
295
319
|
enum: ['active', 'paused', 'blocked', 'review-requested', 'completed'],
|
|
296
320
|
},
|
|
321
|
+
claimant: {
|
|
322
|
+
type: 'string',
|
|
323
|
+
description: 'Claimant identifier (must match current owner)',
|
|
324
|
+
},
|
|
297
325
|
note: {
|
|
298
326
|
type: 'string',
|
|
299
327
|
description: 'Status note or reason',
|
|
@@ -308,13 +336,27 @@ export const claimsTools = [
|
|
|
308
336
|
handler: async (input) => {
|
|
309
337
|
const issueId = input.issueId;
|
|
310
338
|
const status = input.status;
|
|
339
|
+
const claimantStr = input.claimant;
|
|
311
340
|
const note = input.note;
|
|
312
341
|
const progress = input.progress;
|
|
342
|
+
const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
343
|
+
if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
|
|
344
|
+
return { success: false, error: 'Invalid issueId' };
|
|
345
|
+
}
|
|
313
346
|
const store = loadClaims();
|
|
314
|
-
|
|
315
|
-
if (!claim) {
|
|
347
|
+
if (!Object.hasOwn(store.claims, issueId)) {
|
|
316
348
|
return { success: false, error: 'Issue is not claimed' };
|
|
317
349
|
}
|
|
350
|
+
const claim = store.claims[issueId];
|
|
351
|
+
if (claimantStr) {
|
|
352
|
+
const claimant = parseClaimant(claimantStr);
|
|
353
|
+
if (!claimant) {
|
|
354
|
+
return { success: false, error: 'Invalid claimant format' };
|
|
355
|
+
}
|
|
356
|
+
if (formatClaimant(claim.claimant) !== formatClaimant(claimant)) {
|
|
357
|
+
return { success: false, error: 'Only the current claimant can update status' };
|
|
358
|
+
}
|
|
359
|
+
}
|
|
318
360
|
const now = new Date().toISOString();
|
|
319
361
|
claim.status = status;
|
|
320
362
|
claim.statusChangedAt = now;
|
|
@@ -411,11 +453,15 @@ export const claimsTools = [
|
|
|
411
453
|
const reason = input.reason;
|
|
412
454
|
const preferredTypes = input.preferredTypes;
|
|
413
455
|
const context = input.context;
|
|
456
|
+
const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
457
|
+
if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
|
|
458
|
+
return { success: false, error: 'Invalid issueId' };
|
|
459
|
+
}
|
|
414
460
|
const store = loadClaims();
|
|
415
|
-
|
|
416
|
-
if (!claim) {
|
|
461
|
+
if (!Object.hasOwn(store.claims, issueId)) {
|
|
417
462
|
return { success: false, error: 'Issue is not claimed' };
|
|
418
463
|
}
|
|
464
|
+
const claim = store.claims[issueId];
|
|
419
465
|
const now = new Date().toISOString();
|
|
420
466
|
claim.status = 'stealable';
|
|
421
467
|
claim.statusChangedAt = now;
|
|
@@ -457,16 +503,20 @@ export const claimsTools = [
|
|
|
457
503
|
handler: async (input) => {
|
|
458
504
|
const issueId = input.issueId;
|
|
459
505
|
const stealerStr = input.stealer;
|
|
506
|
+
const RESERVED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
507
|
+
if (!issueId || typeof issueId !== 'string' || issueId.length > 256 || RESERVED_KEYS.has(issueId)) {
|
|
508
|
+
return { success: false, error: 'Invalid issueId' };
|
|
509
|
+
}
|
|
460
510
|
const stealer = parseClaimant(stealerStr);
|
|
461
511
|
if (!stealer) {
|
|
462
512
|
return { success: false, error: 'Invalid claimant format' };
|
|
463
513
|
}
|
|
464
514
|
const store = loadClaims();
|
|
465
|
-
|
|
466
|
-
const stealableInfo = store.stealable[issueId];
|
|
467
|
-
if (!claim) {
|
|
515
|
+
if (!Object.hasOwn(store.claims, issueId)) {
|
|
468
516
|
return { success: false, error: 'Issue is not claimed' };
|
|
469
517
|
}
|
|
518
|
+
const claim = store.claims[issueId];
|
|
519
|
+
const stealableInfo = Object.hasOwn(store.stealable, issueId) ? store.stealable[issueId] : undefined;
|
|
470
520
|
if (!stealableInfo) {
|
|
471
521
|
return { success: false, error: 'Issue is not stealable' };
|
|
472
522
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Tool definitions for configuration management with file persistence.
|
|
5
5
|
*/
|
|
6
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync, statSync } from 'node:fs';
|
|
7
7
|
import { join } from 'node:path';
|
|
8
8
|
import { getProjectCwd } from './types.js';
|
|
9
9
|
// Storage paths
|
|
@@ -34,12 +34,22 @@ function ensureConfigDir() {
|
|
|
34
34
|
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
|
+
const MAX_CONFIG_STORE_BYTES = 5 * 1024 * 1024; // 5 MB
|
|
37
38
|
function loadConfigStore() {
|
|
38
39
|
try {
|
|
39
40
|
const path = getConfigPath();
|
|
40
41
|
if (existsSync(path)) {
|
|
42
|
+
if (statSync(path).size > MAX_CONFIG_STORE_BYTES) {
|
|
43
|
+
return { values: { ...DEFAULT_CONFIG }, scopes: {}, version: '3.0.0', updatedAt: new Date().toISOString() };
|
|
44
|
+
}
|
|
41
45
|
const data = readFileSync(path, 'utf-8');
|
|
42
|
-
|
|
46
|
+
const parsed = JSON.parse(data);
|
|
47
|
+
return {
|
|
48
|
+
values: filterDangerousKeys(parsed.values ?? {}),
|
|
49
|
+
scopes: filterDangerousKeys(parsed.scopes ?? {}),
|
|
50
|
+
version: typeof parsed.version === 'string' ? parsed.version : '3.0.0',
|
|
51
|
+
updatedAt: typeof parsed.updatedAt === 'string' ? parsed.updatedAt : new Date().toISOString(),
|
|
52
|
+
};
|
|
43
53
|
}
|
|
44
54
|
}
|
|
45
55
|
catch {
|
|
@@ -55,7 +65,10 @@ function loadConfigStore() {
|
|
|
55
65
|
function saveConfigStore(store) {
|
|
56
66
|
ensureConfigDir();
|
|
57
67
|
store.updatedAt = new Date().toISOString();
|
|
58
|
-
|
|
68
|
+
const dest = getConfigPath();
|
|
69
|
+
const tmpPath = `${dest}.${process.pid}.${Date.now()}.tmp`;
|
|
70
|
+
writeFileSync(tmpPath, JSON.stringify(store, null, 2), 'utf-8');
|
|
71
|
+
renameSync(tmpPath, dest);
|
|
59
72
|
}
|
|
60
73
|
function getNestedValue(obj, key) {
|
|
61
74
|
const parts = key.split('.');
|
|
@@ -71,11 +84,18 @@ function getNestedValue(obj, key) {
|
|
|
71
84
|
return current;
|
|
72
85
|
}
|
|
73
86
|
const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
74
|
-
function filterDangerousKeys(obj) {
|
|
87
|
+
function filterDangerousKeys(obj, depth = 0) {
|
|
75
88
|
const filtered = {};
|
|
89
|
+
if (depth > 20)
|
|
90
|
+
return filtered;
|
|
76
91
|
for (const [key, value] of Object.entries(obj)) {
|
|
77
92
|
if (!DANGEROUS_KEYS.has(key)) {
|
|
78
|
-
|
|
93
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
94
|
+
filtered[key] = filterDangerousKeys(value, depth + 1);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
filtered[key] = value;
|
|
98
|
+
}
|
|
79
99
|
}
|
|
80
100
|
}
|
|
81
101
|
return filtered;
|
|
@@ -156,6 +176,14 @@ export const configTools = [
|
|
|
156
176
|
const key = input.key;
|
|
157
177
|
const value = input.value;
|
|
158
178
|
const scope = input.scope || 'default';
|
|
179
|
+
for (const seg of key.split('.')) {
|
|
180
|
+
if (DANGEROUS_KEYS.has(seg)) {
|
|
181
|
+
return { success: false, error: `Forbidden key segment: "${seg}"` };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (DANGEROUS_KEYS.has(scope)) {
|
|
185
|
+
return { success: false, error: `Forbidden scope: "${scope}"` };
|
|
186
|
+
}
|
|
159
187
|
const previousValue = store.values[key];
|
|
160
188
|
if (scope === 'default') {
|
|
161
189
|
store.values[key] = value;
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* - Useful for single-machine workflow orchestration
|
|
10
10
|
*/
|
|
11
11
|
import { getProjectCwd } from './types.js';
|
|
12
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'node:fs';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
14
|
// Storage paths
|
|
15
15
|
const STORAGE_DIR = '.monomind';
|
|
@@ -61,7 +61,10 @@ function loadCoordStore() {
|
|
|
61
61
|
}
|
|
62
62
|
function saveCoordStore(store) {
|
|
63
63
|
ensureCoordDir();
|
|
64
|
-
|
|
64
|
+
const dest = getCoordPath();
|
|
65
|
+
const tmp = dest + '.tmp';
|
|
66
|
+
writeFileSync(tmp, JSON.stringify(store, null, 2), 'utf-8');
|
|
67
|
+
renameSync(tmp, dest);
|
|
65
68
|
}
|
|
66
69
|
export const coordinationTools = [
|
|
67
70
|
{
|
|
@@ -302,8 +305,22 @@ export const coordinationTools = [
|
|
|
302
305
|
active: nodes.filter(n => n.status === 'active').length,
|
|
303
306
|
};
|
|
304
307
|
}
|
|
308
|
+
const FORBIDDEN_NODE_IDS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
309
|
+
const MAX_NODES = 1000;
|
|
310
|
+
const MAX_NODE_ID_LEN = 200;
|
|
305
311
|
if (action === 'add') {
|
|
306
312
|
const nodeId = input.nodeId || `node-${Date.now()}`;
|
|
313
|
+
if (typeof nodeId !== 'string' || nodeId.length === 0 || nodeId.length > MAX_NODE_ID_LEN) {
|
|
314
|
+
return { success: false, error: 'Invalid nodeId' };
|
|
315
|
+
}
|
|
316
|
+
if (FORBIDDEN_NODE_IDS.has(nodeId)) {
|
|
317
|
+
return { success: false, error: 'Forbidden node ID' };
|
|
318
|
+
}
|
|
319
|
+
// Cap to prevent unbounded growth → disk exhaustion DoS via repeated
|
|
320
|
+
// add calls. Allow re-add of existing node (no growth in that case).
|
|
321
|
+
if (Object.keys(store.nodes).length >= MAX_NODES && !Object.hasOwn(store.nodes, nodeId)) {
|
|
322
|
+
return { success: false, error: `Node limit reached (${MAX_NODES})` };
|
|
323
|
+
}
|
|
307
324
|
store.nodes[nodeId] = {
|
|
308
325
|
id: nodeId,
|
|
309
326
|
status: 'active',
|
|
@@ -320,7 +337,13 @@ export const coordinationTools = [
|
|
|
320
337
|
}
|
|
321
338
|
if (action === 'remove') {
|
|
322
339
|
const nodeId = input.nodeId;
|
|
323
|
-
|
|
340
|
+
// Match the `add` denylist + Object.hasOwn so a tampered store.json
|
|
341
|
+
// can't have its inherited Object.prototype slots exposed via remove.
|
|
342
|
+
if (typeof nodeId !== 'string' || nodeId.length === 0 || nodeId.length > MAX_NODE_ID_LEN ||
|
|
343
|
+
FORBIDDEN_NODE_IDS.has(nodeId)) {
|
|
344
|
+
return { success: false, error: 'Invalid nodeId' };
|
|
345
|
+
}
|
|
346
|
+
if (!Object.hasOwn(store.nodes, nodeId)) {
|
|
324
347
|
return { success: false, error: 'Node not found' };
|
|
325
348
|
}
|
|
326
349
|
delete store.nodes[nodeId];
|
|
@@ -334,7 +357,15 @@ export const coordinationTools = [
|
|
|
334
357
|
}
|
|
335
358
|
if (action === 'heartbeat') {
|
|
336
359
|
const nodeId = input.nodeId;
|
|
337
|
-
if (
|
|
360
|
+
if (!nodeId || typeof nodeId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(nodeId)) {
|
|
361
|
+
return {
|
|
362
|
+
success: false,
|
|
363
|
+
action: 'heartbeat',
|
|
364
|
+
nodeId,
|
|
365
|
+
error: 'Invalid node ID',
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
if (Object.hasOwn(store.nodes, nodeId)) {
|
|
338
369
|
store.nodes[nodeId].lastHeartbeat = new Date().toISOString();
|
|
339
370
|
store.nodes[nodeId].status = 'active';
|
|
340
371
|
saveCoordStore(store);
|
|
@@ -441,6 +472,25 @@ export const coordinationTools = [
|
|
|
441
472
|
};
|
|
442
473
|
}
|
|
443
474
|
}
|
|
475
|
+
if (consensus.pending.length >= 200) {
|
|
476
|
+
return { success: false, error: 'Pending proposals limit (200) reached. Resolve existing proposals first.' };
|
|
477
|
+
}
|
|
478
|
+
// Validate proposal size and shape — schema only declares object,
|
|
479
|
+
// so without these checks an attacker could submit a 10MB blob 200x
|
|
480
|
+
// and inflate store.json to 2GB on every saveCoordStore.
|
|
481
|
+
if (input.proposal === null || typeof input.proposal !== 'object' || Array.isArray(input.proposal)) {
|
|
482
|
+
return { success: false, error: 'proposal must be a plain object' };
|
|
483
|
+
}
|
|
484
|
+
let proposalSerialized;
|
|
485
|
+
try {
|
|
486
|
+
proposalSerialized = JSON.stringify(input.proposal);
|
|
487
|
+
}
|
|
488
|
+
catch {
|
|
489
|
+
return { success: false, error: 'proposal contains non-serializable values' };
|
|
490
|
+
}
|
|
491
|
+
if (proposalSerialized.length > 64 * 1024) {
|
|
492
|
+
return { success: false, error: 'proposal exceeds 64KB limit' };
|
|
493
|
+
}
|
|
444
494
|
consensus.pending.push({
|
|
445
495
|
proposalId,
|
|
446
496
|
type: 'coordination',
|
|
@@ -544,6 +594,11 @@ export const coordinationTools = [
|
|
|
544
594
|
term: p.term,
|
|
545
595
|
byzantineDetected: p.byzantineVoters?.length ? p.byzantineVoters : undefined,
|
|
546
596
|
});
|
|
597
|
+
// Cap consensus history to prevent unbounded growth
|
|
598
|
+
const MAX_CONSENSUS_HISTORY = 1000;
|
|
599
|
+
if (consensus.history.length > MAX_CONSENSUS_HISTORY) {
|
|
600
|
+
consensus.history = consensus.history.slice(-MAX_CONSENSUS_HISTORY);
|
|
601
|
+
}
|
|
547
602
|
consensus.pending = consensus.pending.filter(x => x.proposalId !== p.proposalId);
|
|
548
603
|
}
|
|
549
604
|
saveCoordStore(store);
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* - Useful for workflow orchestration and state tracking
|
|
10
10
|
*/
|
|
11
11
|
import { getProjectCwd } from './types.js';
|
|
12
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
12
|
+
import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync, statSync } from 'node:fs';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
14
|
// Storage paths
|
|
15
15
|
const STORAGE_DIR = '.monomind';
|
|
@@ -31,6 +31,12 @@ function loadDAAStore() {
|
|
|
31
31
|
try {
|
|
32
32
|
const path = getDAAPath();
|
|
33
33
|
if (existsSync(path)) {
|
|
34
|
+
// Cap on disk read so a planted multi-GB store.json can't OOM the daemon
|
|
35
|
+
// on first MCP call.
|
|
36
|
+
const stat = statSync(path);
|
|
37
|
+
if (stat.size > 25 * 1024 * 1024) {
|
|
38
|
+
return { agents: {}, workflows: {}, knowledge: {}, version: '3.0.0' };
|
|
39
|
+
}
|
|
34
40
|
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
35
41
|
}
|
|
36
42
|
}
|
|
@@ -41,7 +47,11 @@ function loadDAAStore() {
|
|
|
41
47
|
}
|
|
42
48
|
function saveDAAStore(store) {
|
|
43
49
|
ensureDAADir();
|
|
44
|
-
|
|
50
|
+
// Unique tmp filename so concurrent daa_* MCP calls cannot collide on the
|
|
51
|
+
// same .tmp path mid-write.
|
|
52
|
+
const tmpPath = `${getDAAPath()}.${process.pid}.${Date.now()}.tmp`;
|
|
53
|
+
writeFileSync(tmpPath, JSON.stringify(store, null, 2), 'utf-8');
|
|
54
|
+
renameSync(tmpPath, getDAAPath());
|
|
45
55
|
}
|
|
46
56
|
export const daaTools = [
|
|
47
57
|
{
|
|
@@ -81,6 +91,9 @@ export const daaTools = [
|
|
|
81
91
|
createdAt: new Date().toISOString(),
|
|
82
92
|
lastActivity: new Date().toISOString(),
|
|
83
93
|
};
|
|
94
|
+
if (['__proto__', 'constructor', 'prototype'].includes(id)) {
|
|
95
|
+
return { success: false, error: 'Forbidden agent ID' };
|
|
96
|
+
}
|
|
84
97
|
store.agents[id] = agent;
|
|
85
98
|
saveDAAStore(store);
|
|
86
99
|
// Store agent in AgentDB for searchable agent registry
|
|
@@ -123,9 +136,12 @@ export const daaTools = [
|
|
|
123
136
|
required: ['agentId'],
|
|
124
137
|
},
|
|
125
138
|
handler: async (input) => {
|
|
126
|
-
const store = loadDAAStore();
|
|
127
139
|
const agentId = input.agentId;
|
|
128
|
-
|
|
140
|
+
if (typeof agentId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(agentId)) {
|
|
141
|
+
return { success: false, error: 'Invalid agent id' };
|
|
142
|
+
}
|
|
143
|
+
const store = loadDAAStore();
|
|
144
|
+
const agent = Object.hasOwn(store.agents, agentId) ? store.agents[agentId] : undefined;
|
|
129
145
|
if (!agent) {
|
|
130
146
|
return { success: false, error: 'Agent not found' };
|
|
131
147
|
}
|
|
@@ -179,8 +195,14 @@ export const daaTools = [
|
|
|
179
195
|
required: ['id', 'name'],
|
|
180
196
|
},
|
|
181
197
|
handler: async (input) => {
|
|
182
|
-
const store = loadDAAStore();
|
|
183
198
|
const id = input.id;
|
|
199
|
+
// Reject prototype-pollution keys: writing to store.workflows['__proto__']
|
|
200
|
+
// mutates Object.prototype for the process.
|
|
201
|
+
if (typeof id !== 'string' || id.length === 0 || id.length > 256 ||
|
|
202
|
+
['__proto__', 'constructor', 'prototype'].includes(id)) {
|
|
203
|
+
return { success: false, error: 'Invalid workflow id' };
|
|
204
|
+
}
|
|
205
|
+
const store = loadDAAStore();
|
|
184
206
|
const workflow = {
|
|
185
207
|
id,
|
|
186
208
|
name: input.name,
|
|
@@ -218,9 +240,12 @@ export const daaTools = [
|
|
|
218
240
|
required: ['workflowId'],
|
|
219
241
|
},
|
|
220
242
|
handler: async (input) => {
|
|
221
|
-
const store = loadDAAStore();
|
|
222
243
|
const workflowId = input.workflowId;
|
|
223
|
-
|
|
244
|
+
if (typeof workflowId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(workflowId)) {
|
|
245
|
+
return { success: false, error: 'Invalid workflow id' };
|
|
246
|
+
}
|
|
247
|
+
const store = loadDAAStore();
|
|
248
|
+
const workflow = Object.hasOwn(store.workflows, workflowId) ? store.workflows[workflowId] : undefined;
|
|
224
249
|
if (!workflow) {
|
|
225
250
|
return { success: false, error: 'Workflow not found' };
|
|
226
251
|
}
|
|
@@ -290,7 +315,12 @@ export const daaTools = [
|
|
|
290
315
|
_storedIn = 'agentdb';
|
|
291
316
|
}
|
|
292
317
|
catch { /* AgentDB not available */ }
|
|
293
|
-
// Backward compat: always persist in JSON store
|
|
318
|
+
// Backward compat: always persist in JSON store (cap at 1000 entries)
|
|
319
|
+
if (Object.keys(store.knowledge).length >= 1000) {
|
|
320
|
+
const oldest = Object.keys(store.knowledge)[0];
|
|
321
|
+
if (oldest)
|
|
322
|
+
delete store.knowledge[oldest];
|
|
323
|
+
}
|
|
294
324
|
store.knowledge[knowledgeId] = knowledgeEntry;
|
|
295
325
|
saveDAAStore(store);
|
|
296
326
|
return {
|
|
@@ -322,7 +352,10 @@ export const daaTools = [
|
|
|
322
352
|
const store = loadDAAStore();
|
|
323
353
|
const agentId = input.agentId;
|
|
324
354
|
if (agentId) {
|
|
325
|
-
|
|
355
|
+
if (typeof agentId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(agentId)) {
|
|
356
|
+
return { success: false, error: 'Invalid agent id' };
|
|
357
|
+
}
|
|
358
|
+
const agent = Object.hasOwn(store.agents, agentId) ? store.agents[agentId] : undefined;
|
|
326
359
|
if (!agent) {
|
|
327
360
|
return { success: false, error: 'Agent not found' };
|
|
328
361
|
}
|
|
@@ -375,7 +408,10 @@ export const daaTools = [
|
|
|
375
408
|
const agentId = input.agentId;
|
|
376
409
|
const action = input.action || 'analyze';
|
|
377
410
|
if (agentId) {
|
|
378
|
-
|
|
411
|
+
if (typeof agentId !== 'string' || ['__proto__', 'constructor', 'prototype'].includes(agentId)) {
|
|
412
|
+
return { success: false, error: 'Invalid agent id' };
|
|
413
|
+
}
|
|
414
|
+
const agent = Object.hasOwn(store.agents, agentId) ? store.agents[agentId] : undefined;
|
|
379
415
|
if (!agent) {
|
|
380
416
|
return { success: false, error: 'Agent not found' };
|
|
381
417
|
}
|
|
@@ -4,12 +4,38 @@
|
|
|
4
4
|
* Tool definitions for ONNX embeddings with hyperbolic support and neural substrate.
|
|
5
5
|
* Implements ADR-024: Embeddings MCP Tools
|
|
6
6
|
*/
|
|
7
|
-
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
|
|
7
|
+
import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'fs';
|
|
8
8
|
import { join, resolve } from 'path';
|
|
9
9
|
// Configuration paths
|
|
10
10
|
const CONFIG_DIR = '.monomind';
|
|
11
11
|
const EMBEDDINGS_CONFIG = 'embeddings.json';
|
|
12
12
|
const MODELS_DIR = 'models';
|
|
13
|
+
// Input validation caps — embeddings handlers operate on caller-supplied text and
|
|
14
|
+
// vectors. Without these caps an attacker can pass a 100M-entry array and OOM the
|
|
15
|
+
// process, or a 50MB string and saturate the hash-fallback embedding loop.
|
|
16
|
+
const MAX_TEXT_LENGTH = 64 * 1024;
|
|
17
|
+
const MAX_VECTOR_DIM = 8192;
|
|
18
|
+
function validateText(t, field) {
|
|
19
|
+
if (typeof t !== 'string')
|
|
20
|
+
throw new Error(`${field}: must be a string`);
|
|
21
|
+
if (t.length > MAX_TEXT_LENGTH)
|
|
22
|
+
throw new Error(`${field}: text too long (max ${MAX_TEXT_LENGTH})`);
|
|
23
|
+
return t;
|
|
24
|
+
}
|
|
25
|
+
function validateVector(v, field) {
|
|
26
|
+
if (!Array.isArray(v))
|
|
27
|
+
throw new Error(`${field}: must be a number[]`);
|
|
28
|
+
if (v.length === 0)
|
|
29
|
+
throw new Error(`${field}: empty vector`);
|
|
30
|
+
if (v.length > MAX_VECTOR_DIM)
|
|
31
|
+
throw new Error(`${field}: vector too large (max ${MAX_VECTOR_DIM})`);
|
|
32
|
+
for (let i = 0; i < v.length; i++) {
|
|
33
|
+
if (typeof v[i] !== 'number' || !Number.isFinite(v[i])) {
|
|
34
|
+
throw new Error(`${field}: contains non-finite value at index ${i}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return v;
|
|
38
|
+
}
|
|
13
39
|
function getConfigPath() {
|
|
14
40
|
return resolve(join(CONFIG_DIR, EMBEDDINGS_CONFIG));
|
|
15
41
|
}
|
|
@@ -33,7 +59,10 @@ function loadConfig() {
|
|
|
33
59
|
}
|
|
34
60
|
function saveConfig(config) {
|
|
35
61
|
ensureConfigDir();
|
|
36
|
-
|
|
62
|
+
const dest = getConfigPath();
|
|
63
|
+
const tmp = dest + '.tmp';
|
|
64
|
+
writeFileSync(tmp, JSON.stringify(config, null, 2), 'utf-8');
|
|
65
|
+
renameSync(tmp, dest);
|
|
37
66
|
}
|
|
38
67
|
// Real ONNX embedding generation via memory-initializer
|
|
39
68
|
let realEmbeddingFn = null;
|
|
@@ -229,7 +258,13 @@ export const embeddingsTools = [
|
|
|
229
258
|
error: 'Embeddings not initialized. Run embeddings/init first.',
|
|
230
259
|
};
|
|
231
260
|
}
|
|
232
|
-
|
|
261
|
+
let text;
|
|
262
|
+
try {
|
|
263
|
+
text = validateText(input.text, 'text');
|
|
264
|
+
}
|
|
265
|
+
catch (e) {
|
|
266
|
+
return { success: false, error: e.message };
|
|
267
|
+
}
|
|
233
268
|
const useHyperbolic = input.hyperbolic === true && config.hyperbolic.enabled;
|
|
234
269
|
// Generate real ONNX embedding
|
|
235
270
|
const embedding = await generateRealEmbedding(text, config.dimension);
|
|
@@ -289,8 +324,14 @@ export const embeddingsTools = [
|
|
|
289
324
|
error: 'Embeddings not initialized. Run embeddings/init first.',
|
|
290
325
|
};
|
|
291
326
|
}
|
|
292
|
-
|
|
293
|
-
|
|
327
|
+
let text1, text2;
|
|
328
|
+
try {
|
|
329
|
+
text1 = validateText(input.text1, 'text1');
|
|
330
|
+
text2 = validateText(input.text2, 'text2');
|
|
331
|
+
}
|
|
332
|
+
catch (e) {
|
|
333
|
+
return { success: false, error: e.message };
|
|
334
|
+
}
|
|
294
335
|
const metric = input.metric || 'cosine';
|
|
295
336
|
// Generate real ONNX embeddings for both texts
|
|
296
337
|
const [emb1, emb2] = await Promise.all([
|