monomind 1.11.13 → 1.12.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/generated/channel-intelligence-director.md +87 -0
- package/.claude/agents/generated/chief-growth-officer.md +88 -0
- package/.claude/agents/generated/content-seo-strategist.md +90 -0
- package/.claude/agents/generated/developer-community-strategist.md +91 -0
- package/.claude/agents/generated/outreach-partnership-strategist.md +90 -0
- package/.claude/agents/generated/social-media-strategist.md +91 -0
- package/.claude/agents/generated/video-visual-strategist.md +90 -0
- package/.claude/commands/mastermind/idea.md +1 -1
- package/.claude/helpers/auto-memory-hook.mjs +13 -4
- package/.claude/helpers/control-start.cjs +5 -0
- package/.claude/helpers/event-logger.cjs +114 -0
- package/.claude/helpers/handlers/adr-draft-handler.cjs +19 -5
- package/.claude/helpers/handlers/agent-start-handler.cjs +13 -4
- package/.claude/helpers/handlers/compact-handler.cjs +2 -0
- package/.claude/helpers/handlers/edit-handler.cjs +1 -1
- package/.claude/helpers/handlers/gates-handler.cjs +3 -0
- package/.claude/helpers/handlers/graph-status-handler.cjs +14 -8
- package/.claude/helpers/handlers/loops-status-handler.cjs +5 -2
- package/.claude/helpers/handlers/route-handler.cjs +13 -6
- package/.claude/helpers/handlers/session-handler.cjs +11 -4
- package/.claude/helpers/handlers/session-restore-handler.cjs +21 -11
- package/.claude/helpers/handlers/task-handler.cjs +13 -5
- package/.claude/helpers/intelligence.cjs +7 -2
- package/.claude/helpers/loop-tracker.cjs +15 -3
- package/.claude/helpers/memory.cjs +6 -1
- package/.claude/helpers/router.cjs +5 -2
- package/.claude/helpers/session.cjs +2 -0
- package/.claude/helpers/statusline.cjs +10 -2
- package/.claude/helpers/utils/micro-agents.cjs +20 -4
- package/.claude/scheduled_tasks.lock +1 -1
- package/.claude/settings.json +92 -1
- package/.claude/skills/mastermind/_protocol.md +23 -13
- package/.claude/skills/mastermind/architect.md +6 -9
- package/.claude/skills/mastermind/build.md +3 -3
- package/.claude/skills/mastermind/content.md +3 -3
- package/.claude/skills/mastermind/createorg.md +2 -2
- package/.claude/skills/mastermind/finance.md +3 -3
- package/.claude/skills/mastermind/idea.md +5 -3
- package/.claude/skills/mastermind/marketing.md +3 -3
- package/.claude/skills/mastermind/monitor.md +2 -2
- package/.claude/skills/mastermind/release.md +3 -3
- package/.claude/skills/mastermind/research.md +3 -3
- package/.claude/skills/mastermind/review.md +3 -3
- package/.claude/skills/mastermind/runorg.md +153 -86
- package/.claude/skills/mastermind/sales.md +3 -3
- package/README.md +286 -129
- package/package.json +19 -2
- package/packages/@monomind/cli/README.md +286 -129
- package/packages/@monomind/cli/bundled-graph/dist/src/build.js +73 -0
- package/packages/@monomind/cli/bundled-graph/dist/src/cluster.js +120 -0
- package/packages/@monomind/cli/bundled-graph/package.json +57 -0
- package/packages/@monomind/cli/dist/src/agents/halt-signal.d.ts +25 -0
- package/packages/@monomind/cli/dist/src/agents/halt-signal.js +76 -0
- package/packages/@monomind/cli/dist/src/agents/index.d.ts +18 -0
- package/packages/@monomind/cli/dist/src/agents/index.js +13 -0
- package/packages/@monomind/cli/dist/src/agents/managed-agent.d.ts +41 -0
- package/packages/@monomind/cli/dist/src/agents/managed-agent.js +69 -0
- package/packages/@monomind/cli/dist/src/agents/prompt-experiment.d.ts +23 -0
- package/packages/@monomind/cli/dist/src/agents/prompt-experiment.js +49 -0
- package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.d.ts +22 -0
- package/packages/@monomind/cli/dist/src/agents/prompt-version-manager.js +80 -0
- package/packages/@monomind/cli/dist/src/agents/registry-builder.js +2 -0
- package/packages/@monomind/cli/dist/src/agents/registry-query.d.ts +71 -0
- package/packages/@monomind/cli/dist/src/agents/registry-query.js +125 -0
- package/packages/@monomind/cli/dist/src/agents/score-decay.d.ts +19 -0
- package/packages/@monomind/cli/dist/src/agents/score-decay.js +22 -0
- package/packages/@monomind/cli/dist/src/agents/shared-instructions-loader.d.ts +13 -0
- package/packages/@monomind/cli/dist/src/agents/shared-instructions-loader.js +40 -0
- package/packages/@monomind/cli/dist/src/agents/specialization-scorer.d.ts +54 -0
- package/packages/@monomind/cli/dist/src/agents/specialization-scorer.js +212 -0
- package/packages/@monomind/cli/dist/src/agents/termination-watcher.d.ts +30 -0
- package/packages/@monomind/cli/dist/src/agents/termination-watcher.js +84 -0
- package/packages/@monomind/cli/dist/src/agents/trigger-index.d.ts +20 -0
- package/packages/@monomind/cli/dist/src/agents/trigger-index.js +38 -0
- package/packages/@monomind/cli/dist/src/agents/trigger-scanner.d.ts +64 -0
- package/packages/@monomind/cli/dist/src/agents/trigger-scanner.js +308 -0
- package/packages/@monomind/cli/dist/src/agents/version-diff.d.ts +18 -0
- package/packages/@monomind/cli/dist/src/agents/version-diff.js +64 -0
- package/packages/@monomind/cli/dist/src/agents/version-store.d.ts +60 -0
- package/packages/@monomind/cli/dist/src/agents/version-store.js +235 -0
- package/packages/@monomind/cli/dist/src/autopilot-state.js +10 -5
- package/packages/@monomind/cli/dist/src/benchmarks/benchmark-runner.js +13 -0
- package/packages/@monomind/cli/dist/src/benchmarks/metric-evaluators.js +20 -9
- package/packages/@monomind/cli/dist/src/benchmarks/pretrain/index.d.ts +45 -0
- package/packages/@monomind/cli/dist/src/benchmarks/pretrain/index.js +404 -0
- package/packages/@monomind/cli/dist/src/browser/actions.js +10 -3
- package/packages/@monomind/cli/dist/src/browser/browser.js +12 -2
- package/packages/@monomind/cli/dist/src/browser/cdp.js +21 -3
- package/packages/@monomind/cli/dist/src/browser/har.js +27 -5
- package/packages/@monomind/cli/dist/src/commands/agent-wasm.d.ts +14 -0
- package/packages/@monomind/cli/dist/src/commands/agent-wasm.js +333 -0
- package/packages/@monomind/cli/dist/src/commands/agent.js +11 -8
- package/packages/@monomind/cli/dist/src/commands/analyze.js +36 -21
- package/packages/@monomind/cli/dist/src/commands/autopilot.js +12 -4
- package/packages/@monomind/cli/dist/src/commands/benchmark.js +51 -8
- package/packages/@monomind/cli/dist/src/commands/browse.js +5 -2
- package/packages/@monomind/cli/dist/src/commands/claims.js +29 -11
- package/packages/@monomind/cli/dist/src/commands/cleanup.js +25 -5
- package/packages/@monomind/cli/dist/src/commands/config.js +15 -7
- package/packages/@monomind/cli/dist/src/commands/daemon.js +6 -0
- package/packages/@monomind/cli/dist/src/commands/deployment.js +34 -19
- package/packages/@monomind/cli/dist/src/commands/doctor.js +151 -20
- package/packages/@monomind/cli/dist/src/commands/guidance.js +15 -2
- package/packages/@monomind/cli/dist/src/commands/hive-mind.js +37 -14
- package/packages/@monomind/cli/dist/src/commands/hooks.js +42 -25
- package/packages/@monomind/cli/dist/src/commands/init.js +9 -4
- package/packages/@monomind/cli/dist/src/commands/issues.js +29 -26
- package/packages/@monomind/cli/dist/src/commands/mcp.js +11 -5
- package/packages/@monomind/cli/dist/src/commands/memory.js +10 -0
- package/packages/@monomind/cli/dist/src/commands/migrate.js +5 -5
- package/packages/@monomind/cli/dist/src/commands/monograph.js +18 -5
- package/packages/@monomind/cli/dist/src/commands/monovector/backup.js +8 -2
- package/packages/@monomind/cli/dist/src/commands/monovector/benchmark.js +20 -7
- package/packages/@monomind/cli/dist/src/commands/monovector/import.js +15 -0
- package/packages/@monomind/cli/dist/src/commands/monovector/migrate.js +4 -1
- package/packages/@monomind/cli/dist/src/commands/monovector/optimize.js +11 -0
- package/packages/@monomind/cli/dist/src/commands/monovector/setup.js +11 -1
- package/packages/@monomind/cli/dist/src/commands/neural.js +1 -1
- package/packages/@monomind/cli/dist/src/commands/performance.js +20 -7
- package/packages/@monomind/cli/dist/src/commands/platforms.js +90 -8
- package/packages/@monomind/cli/dist/src/commands/plugins.js +12 -5
- package/packages/@monomind/cli/dist/src/commands/process.js +33 -10
- package/packages/@monomind/cli/dist/src/commands/progress.js +5 -3
- package/packages/@monomind/cli/dist/src/commands/providers.js +5 -5
- package/packages/@monomind/cli/dist/src/commands/replay.js +8 -2
- package/packages/@monomind/cli/dist/src/commands/route.js +27 -7
- package/packages/@monomind/cli/dist/src/commands/security.js +4 -0
- package/packages/@monomind/cli/dist/src/commands/session.js +12 -1
- package/packages/@monomind/cli/dist/src/commands/start.js +11 -4
- package/packages/@monomind/cli/dist/src/commands/status.js +7 -4
- package/packages/@monomind/cli/dist/src/commands/swarm.js +27 -13
- package/packages/@monomind/cli/dist/src/commands/task.js +26 -11
- package/packages/@monomind/cli/dist/src/commands/tokens.js +7 -2
- package/packages/@monomind/cli/dist/src/commands/transfer-store.js +36 -22
- package/packages/@monomind/cli/dist/src/commands/ui.js +68 -0
- package/packages/@monomind/cli/dist/src/commands/update.js +15 -3
- package/packages/@monomind/cli/dist/src/commands/workflow.js +39 -6
- package/packages/@monomind/cli/dist/src/consensus/audit-writer.js +18 -7
- package/packages/@monomind/cli/dist/src/consensus/index.d.ts +7 -0
- package/packages/@monomind/cli/dist/src/consensus/index.js +6 -0
- package/packages/@monomind/cli/dist/src/consensus/vote-signer.js +25 -8
- package/packages/@monomind/cli/dist/src/context/context-provider.d.ts +44 -0
- package/packages/@monomind/cli/dist/src/context/context-provider.js +25 -0
- package/packages/@monomind/cli/dist/src/context/git-state-provider.d.ts +12 -0
- package/packages/@monomind/cli/dist/src/context/git-state-provider.js +34 -0
- package/packages/@monomind/cli/dist/src/context/index.d.ts +12 -0
- package/packages/@monomind/cli/dist/src/context/index.js +12 -0
- package/packages/@monomind/cli/dist/src/context/project-conventions-provider.d.ts +15 -0
- package/packages/@monomind/cli/dist/src/context/project-conventions-provider.js +19 -0
- package/packages/@monomind/cli/dist/src/context/prompt-assembler.d.ts +26 -0
- package/packages/@monomind/cli/dist/src/context/prompt-assembler.js +93 -0
- package/packages/@monomind/cli/dist/src/context/task-history-provider.d.ts +24 -0
- package/packages/@monomind/cli/dist/src/context/task-history-provider.js +32 -0
- package/packages/@monomind/cli/dist/src/context/user-preferences-provider.d.ts +14 -0
- package/packages/@monomind/cli/dist/src/context/user-preferences-provider.js +27 -0
- package/packages/@monomind/cli/dist/src/dlq/dlq-reader.d.ts +31 -0
- package/packages/@monomind/cli/dist/src/dlq/dlq-reader.js +81 -0
- package/packages/@monomind/cli/dist/src/dlq/dlq-writer.d.ts +24 -0
- package/packages/@monomind/cli/dist/src/dlq/dlq-writer.js +65 -0
- package/packages/@monomind/cli/dist/src/dlq/index.d.ts +10 -0
- package/packages/@monomind/cli/dist/src/dlq/index.js +7 -0
- package/packages/@monomind/cli/dist/src/eval/dataset-manager.d.ts +33 -0
- package/packages/@monomind/cli/dist/src/eval/dataset-manager.js +107 -0
- package/packages/@monomind/cli/dist/src/eval/dataset-runner.d.ts +23 -0
- package/packages/@monomind/cli/dist/src/eval/dataset-runner.js +59 -0
- package/packages/@monomind/cli/dist/src/eval/index.d.ts +10 -0
- package/packages/@monomind/cli/dist/src/eval/index.js +7 -0
- package/packages/@monomind/cli/dist/src/eval/trace-collector.d.ts +40 -0
- package/packages/@monomind/cli/dist/src/eval/trace-collector.js +102 -0
- package/packages/@monomind/cli/dist/src/index.js +7 -3
- package/packages/@monomind/cli/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
- package/packages/@monomind/cli/dist/src/infrastructure/in-memory-repositories.js +264 -0
- package/packages/@monomind/cli/dist/src/init/executor.js +14 -11
- package/packages/@monomind/cli/dist/src/init/shared-instructions-generator.js +20 -4
- package/packages/@monomind/cli/dist/src/init/statusline-generator.js +33 -12
- package/packages/@monomind/cli/dist/src/interactive/interrupt.d.ts +22 -0
- package/packages/@monomind/cli/dist/src/interactive/interrupt.js +71 -0
- package/packages/@monomind/cli/dist/src/mcp/deprecation-injector.d.ts +25 -0
- package/packages/@monomind/cli/dist/src/mcp/deprecation-injector.js +48 -0
- package/packages/@monomind/cli/dist/src/mcp/tool-registry.d.ts +61 -0
- package/packages/@monomind/cli/dist/src/mcp/tool-registry.js +246 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/a2a-tools.js +98 -13
- package/packages/@monomind/cli/dist/src/mcp-tools/agent-tools.js +16 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/analyze-tools.js +80 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/browser-tools.js +84 -22
- package/packages/@monomind/cli/dist/src/mcp-tools/claims-tools.js +35 -7
- package/packages/@monomind/cli/dist/src/mcp-tools/config-tools.js +82 -17
- package/packages/@monomind/cli/dist/src/mcp-tools/coordination-tools.js +37 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/daa-tools.js +49 -7
- package/packages/@monomind/cli/dist/src/mcp-tools/embeddings-tools.js +45 -18
- package/packages/@monomind/cli/dist/src/mcp-tools/github-tools.js +75 -25
- package/packages/@monomind/cli/dist/src/mcp-tools/guidance-tools.js +32 -10
- package/packages/@monomind/cli/dist/src/mcp-tools/hive-mind-tools.js +91 -20
- package/packages/@monomind/cli/dist/src/mcp-tools/hooks-tools.js +188 -29
- package/packages/@monomind/cli/dist/src/mcp-tools/memory-tools.js +25 -7
- package/packages/@monomind/cli/dist/src/mcp-tools/monograph-compat.js +11 -2
- package/packages/@monomind/cli/dist/src/mcp-tools/monograph-tools.js +148 -26
- package/packages/@monomind/cli/dist/src/mcp-tools/neural-tools.js +44 -9
- package/packages/@monomind/cli/dist/src/mcp-tools/performance-tools.js +45 -10
- package/packages/@monomind/cli/dist/src/mcp-tools/progress-tools.js +7 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/request-tracker.js +15 -1
- package/packages/@monomind/cli/dist/src/mcp-tools/security-tools.js +61 -9
- package/packages/@monomind/cli/dist/src/mcp-tools/session-tools.js +45 -14
- package/packages/@monomind/cli/dist/src/mcp-tools/swarm-tools.js +15 -3
- package/packages/@monomind/cli/dist/src/mcp-tools/system-tools.js +14 -7
- package/packages/@monomind/cli/dist/src/mcp-tools/task-tools.js +52 -10
- package/packages/@monomind/cli/dist/src/mcp-tools/terminal-tools.js +40 -6
- package/packages/@monomind/cli/dist/src/mcp-tools/transfer-tools.js +37 -4
- package/packages/@monomind/cli/dist/src/mcp-tools/wasm-agent-tools.d.ts +9 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/wasm-agent-tools.js +230 -0
- package/packages/@monomind/cli/dist/src/mcp-tools/workflow-tools.js +29 -6
- package/packages/@monomind/cli/dist/src/memory/ewc-consolidation.js +26 -10
- package/packages/@monomind/cli/dist/src/memory/intelligence.js +80 -19
- package/packages/@monomind/cli/dist/src/memory/memory-bridge.js +21 -2
- package/packages/@monomind/cli/dist/src/memory/memory-initializer.js +67 -3
- package/packages/@monomind/cli/dist/src/memory/sona-optimizer.js +14 -4
- package/packages/@monomind/cli/dist/src/model/complexity-scorer.d.ts +21 -0
- package/packages/@monomind/cli/dist/src/model/complexity-scorer.js +106 -0
- package/packages/@monomind/cli/dist/src/model/index.d.ts +4 -0
- package/packages/@monomind/cli/dist/src/model/index.js +4 -0
- package/packages/@monomind/cli/dist/src/model/model-settings.d.ts +22 -0
- package/packages/@monomind/cli/dist/src/model/model-settings.js +33 -0
- package/packages/@monomind/cli/dist/src/model/model-tier-resolver.d.ts +24 -0
- package/packages/@monomind/cli/dist/src/model/model-tier-resolver.js +65 -0
- package/packages/@monomind/cli/dist/src/monovector/capabilities.d.ts +34 -0
- package/packages/@monomind/cli/dist/src/monovector/capabilities.js +37 -0
- package/packages/@monomind/cli/dist/src/monovector/command-outcomes.js +43 -7
- package/packages/@monomind/cli/dist/src/monovector/coverage-router.js +8 -4
- package/packages/@monomind/cli/dist/src/monovector/coverage-tools.js +6 -3
- package/packages/@monomind/cli/dist/src/monovector/diff-classifier.js +13 -0
- package/packages/@monomind/cli/dist/src/monovector/route-outcomes.d.ts +2 -1
- package/packages/@monomind/cli/dist/src/monovector/route-outcomes.js +46 -4
- package/packages/@monomind/cli/dist/src/observability/replay-reader.d.ts +1 -1
- package/packages/@monomind/cli/dist/src/orchestration/index.d.ts +7 -0
- package/packages/@monomind/cli/dist/src/orchestration/index.js +6 -0
- package/packages/@monomind/cli/dist/src/orchestration/mode-dispatcher.d.ts +11 -0
- package/packages/@monomind/cli/dist/src/orchestration/mode-dispatcher.js +31 -0
- package/packages/@monomind/cli/dist/src/orchestration/routing-modes.d.ts +68 -0
- package/packages/@monomind/cli/dist/src/orchestration/routing-modes.js +180 -0
- package/packages/@monomind/cli/dist/src/plugins/manager.js +8 -3
- package/packages/@monomind/cli/dist/src/plugins/store/discovery.js +46 -2
- package/packages/@monomind/cli/dist/src/plugins/store/search.js +5 -4
- package/packages/@monomind/cli/dist/src/plugins/tests/demo-plugin-store.d.ts +7 -0
- package/packages/@monomind/cli/dist/src/plugins/tests/demo-plugin-store.js +126 -0
- package/packages/@monomind/cli/dist/src/plugins/tests/standalone-test.d.ts +12 -0
- package/packages/@monomind/cli/dist/src/plugins/tests/standalone-test.js +188 -0
- package/packages/@monomind/cli/dist/src/plugins/tests/test-plugin-store.d.ts +7 -0
- package/packages/@monomind/cli/dist/src/plugins/tests/test-plugin-store.js +206 -0
- package/packages/@monomind/cli/dist/src/production/circuit-breaker.js +17 -3
- package/packages/@monomind/cli/dist/src/production/error-handler.js +3 -0
- package/packages/@monomind/cli/dist/src/production/monitoring.js +20 -3
- package/packages/@monomind/cli/dist/src/production/rate-limiter.js +13 -4
- package/packages/@monomind/cli/dist/src/production/retry.js +17 -9
- package/packages/@monomind/cli/dist/src/routing/embed-worker.js +6 -2
- package/packages/@monomind/cli/dist/src/routing/embedder.js +0 -0
- package/packages/@monomind/cli/dist/src/routing/llm-caller.js +13 -2
- package/packages/@monomind/cli/dist/src/routing/route-layer-factory.js +18 -3
- package/packages/@monomind/cli/dist/src/runtime/headless.d.ts +60 -0
- package/packages/@monomind/cli/dist/src/runtime/headless.js +284 -0
- package/packages/@monomind/cli/dist/src/services/agentic-flow-bridge.d.ts +50 -0
- package/packages/@monomind/cli/dist/src/services/agentic-flow-bridge.js +95 -0
- package/packages/@monomind/cli/dist/src/services/claim-service.d.ts +1 -0
- package/packages/@monomind/cli/dist/src/services/claim-service.js +8 -0
- package/packages/@monomind/cli/dist/src/services/config-file-manager.js +14 -2
- package/packages/@monomind/cli/dist/src/services/container-worker-pool.d.ts +197 -0
- package/packages/@monomind/cli/dist/src/services/container-worker-pool.js +623 -0
- package/packages/@monomind/cli/dist/src/services/headless-worker-executor.js +18 -2
- package/packages/@monomind/cli/dist/src/services/index.d.ts +13 -0
- package/packages/@monomind/cli/dist/src/services/index.js +11 -0
- package/packages/@monomind/cli/dist/src/services/worker-daemon.js +53 -12
- package/packages/@monomind/cli/dist/src/services/worker-queue.d.ts +201 -0
- package/packages/@monomind/cli/dist/src/services/worker-queue.js +594 -0
- package/packages/@monomind/cli/dist/src/swarm/communication-graph.d.ts +25 -0
- package/packages/@monomind/cli/dist/src/swarm/communication-graph.js +77 -0
- package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.d.ts +31 -0
- package/packages/@monomind/cli/dist/src/swarm/flow-enforcer.js +61 -0
- package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.d.ts +19 -0
- package/packages/@monomind/cli/dist/src/swarm/flow-visualizer.js +68 -0
- package/packages/@monomind/cli/dist/src/transfer/anonymization/index.d.ts +0 -3
- package/packages/@monomind/cli/dist/src/transfer/anonymization/index.js +16 -1
- package/packages/@monomind/cli/dist/src/transfer/deploy-seraphine.d.ts +13 -0
- package/packages/@monomind/cli/dist/src/transfer/deploy-seraphine.js +205 -0
- package/packages/@monomind/cli/dist/src/transfer/export.js +8 -0
- package/packages/@monomind/cli/dist/src/transfer/ipfs/upload.js +33 -3
- package/packages/@monomind/cli/dist/src/transfer/serialization/cfp.js +9 -3
- package/packages/@monomind/cli/dist/src/transfer/storage/gcs.js +37 -3
- package/packages/@monomind/cli/dist/src/transfer/store/discovery.js +45 -3
- package/packages/@monomind/cli/dist/src/transfer/store/download.js +5 -0
- package/packages/@monomind/cli/dist/src/transfer/store/publish.js +13 -1
- package/packages/@monomind/cli/dist/src/transfer/store/registry.d.ts +8 -0
- package/packages/@monomind/cli/dist/src/transfer/store/registry.js +30 -5
- package/packages/@monomind/cli/dist/src/transfer/store/search.js +20 -5
- package/packages/@monomind/cli/dist/src/transfer/store/tests/standalone-test.d.ts +12 -0
- package/packages/@monomind/cli/dist/src/transfer/store/tests/standalone-test.js +190 -0
- package/packages/@monomind/cli/dist/src/transfer/test-seraphine.d.ts +6 -0
- package/packages/@monomind/cli/dist/src/transfer/test-seraphine.js +105 -0
- package/packages/@monomind/cli/dist/src/transfer/tests/test-store.d.ts +7 -0
- package/packages/@monomind/cli/dist/src/transfer/tests/test-store.js +214 -0
- package/packages/@monomind/cli/dist/src/update/checker.js +59 -7
- package/packages/@monomind/cli/dist/src/update/executor.js +50 -3
- package/packages/@monomind/cli/dist/src/update/index.js +18 -1
- package/packages/@monomind/cli/dist/src/update/rate-limiter.d.ts +6 -0
- package/packages/@monomind/cli/dist/src/update/rate-limiter.js +79 -7
- package/packages/@monomind/cli/dist/src/update/validator.js +52 -1
- package/packages/@monomind/cli/dist/src/workflow/condition-evaluator.d.ts +10 -0
- package/packages/@monomind/cli/dist/src/workflow/condition-evaluator.js +82 -0
- package/packages/@monomind/cli/dist/src/workflow/context-resolver.d.ts +12 -0
- package/packages/@monomind/cli/dist/src/workflow/context-resolver.js +23 -0
- package/packages/@monomind/cli/dist/src/workflow/dag-builder.d.ts +17 -0
- package/packages/@monomind/cli/dist/src/workflow/dag-builder.js +129 -0
- package/packages/@monomind/cli/dist/src/workflow/dag-executor.d.ts +9 -0
- package/packages/@monomind/cli/dist/src/workflow/dag-executor.js +116 -0
- package/packages/@monomind/cli/dist/src/workflow/dag-types.d.ts +41 -0
- package/packages/@monomind/cli/dist/src/workflow/dag-types.js +8 -0
- package/packages/@monomind/cli/dist/src/workflow/dsl-parser.d.ts +12 -0
- package/packages/@monomind/cli/dist/src/workflow/dsl-parser.js +20 -0
- package/packages/@monomind/cli/dist/src/workflow/dsl-schema.d.ts +165 -0
- package/packages/@monomind/cli/dist/src/workflow/dsl-schema.js +82 -0
- package/packages/@monomind/cli/dist/src/workflow/index.d.ts +13 -0
- package/packages/@monomind/cli/dist/src/workflow/index.js +11 -0
- package/packages/@monomind/cli/dist/src/workflow/template-engine.d.ts +11 -0
- package/packages/@monomind/cli/dist/src/workflow/template-engine.js +40 -0
- package/packages/@monomind/cli/dist/src/workflow/workflow-executor.d.ts +29 -0
- package/packages/@monomind/cli/dist/src/workflow/workflow-executor.js +227 -0
- package/packages/@monomind/cli/package.json +9 -10
- package/packages/@monomind/guidance/dist/adversarial.d.ts +284 -0
- package/packages/@monomind/guidance/dist/adversarial.js +572 -0
- package/packages/@monomind/guidance/dist/analyzer.d.ts +530 -0
- package/packages/@monomind/guidance/dist/analyzer.js +2518 -0
- package/packages/@monomind/guidance/dist/artifacts.d.ts +283 -0
- package/packages/@monomind/guidance/dist/artifacts.js +356 -0
- package/packages/@monomind/guidance/dist/authority.d.ts +290 -0
- package/packages/@monomind/guidance/dist/authority.js +558 -0
- package/packages/@monomind/guidance/dist/capabilities.d.ts +209 -0
- package/packages/@monomind/guidance/dist/capabilities.js +485 -0
- package/packages/@monomind/guidance/dist/coherence.d.ts +233 -0
- package/packages/@monomind/guidance/dist/coherence.js +372 -0
- package/packages/@monomind/guidance/dist/compiler.d.ts +87 -0
- package/packages/@monomind/guidance/dist/compiler.js +419 -0
- package/packages/@monomind/guidance/dist/conformance-kit.d.ts +225 -0
- package/packages/@monomind/guidance/dist/conformance-kit.js +629 -0
- package/packages/@monomind/guidance/dist/continue-gate.d.ts +214 -0
- package/packages/@monomind/guidance/dist/continue-gate.js +353 -0
- package/packages/@monomind/guidance/dist/crypto-utils.d.ts +17 -0
- package/packages/@monomind/guidance/dist/crypto-utils.js +24 -0
- package/packages/@monomind/guidance/dist/evolution.d.ts +282 -0
- package/packages/@monomind/guidance/dist/evolution.js +500 -0
- package/packages/@monomind/guidance/dist/gates.d.ts +79 -0
- package/packages/@monomind/guidance/dist/gates.js +302 -0
- package/packages/@monomind/guidance/dist/gateway.d.ts +206 -0
- package/packages/@monomind/guidance/dist/gateway.js +452 -0
- package/packages/@monomind/guidance/dist/generators.d.ts +153 -0
- package/packages/@monomind/guidance/dist/generators.js +682 -0
- package/packages/@monomind/guidance/dist/headless.d.ts +177 -0
- package/packages/@monomind/guidance/dist/headless.js +342 -0
- package/packages/@monomind/guidance/dist/hooks.d.ts +109 -0
- package/packages/@monomind/guidance/dist/hooks.js +347 -0
- package/packages/@monomind/guidance/dist/index.d.ts +205 -0
- package/packages/@monomind/guidance/dist/index.js +321 -0
- package/packages/@monomind/guidance/dist/ledger.d.ts +162 -0
- package/packages/@monomind/guidance/dist/ledger.js +375 -0
- package/packages/@monomind/guidance/dist/manifest-validator.d.ts +289 -0
- package/packages/@monomind/guidance/dist/manifest-validator.js +838 -0
- package/packages/@monomind/guidance/dist/memory-gate.d.ts +222 -0
- package/packages/@monomind/guidance/dist/memory-gate.js +382 -0
- package/packages/@monomind/guidance/dist/meta-governance.d.ts +265 -0
- package/packages/@monomind/guidance/dist/meta-governance.js +348 -0
- package/packages/@monomind/guidance/dist/optimizer.d.ts +104 -0
- package/packages/@monomind/guidance/dist/optimizer.js +329 -0
- package/packages/@monomind/guidance/dist/persistence.d.ts +189 -0
- package/packages/@monomind/guidance/dist/persistence.js +464 -0
- package/packages/@monomind/guidance/dist/proof.d.ts +185 -0
- package/packages/@monomind/guidance/dist/proof.js +238 -0
- package/packages/@monomind/guidance/dist/retriever.d.ts +116 -0
- package/packages/@monomind/guidance/dist/retriever.js +394 -0
- package/packages/@monomind/guidance/dist/ruvbot-integration.d.ts +370 -0
- package/packages/@monomind/guidance/dist/ruvbot-integration.js +738 -0
- package/packages/@monomind/guidance/dist/temporal.d.ts +426 -0
- package/packages/@monomind/guidance/dist/temporal.js +658 -0
- package/packages/@monomind/guidance/dist/trust.d.ts +283 -0
- package/packages/@monomind/guidance/dist/trust.js +473 -0
- package/packages/@monomind/guidance/dist/truth-anchors.d.ts +276 -0
- package/packages/@monomind/guidance/dist/truth-anchors.js +488 -0
- package/packages/@monomind/guidance/dist/types.d.ts +378 -0
- package/packages/@monomind/guidance/dist/types.js +10 -0
- package/packages/@monomind/guidance/dist/uncertainty.d.ts +372 -0
- package/packages/@monomind/guidance/dist/uncertainty.js +619 -0
- package/packages/@monomind/guidance/dist/wasm-kernel.d.ts +48 -0
- package/packages/@monomind/guidance/dist/wasm-kernel.js +158 -0
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*
|
|
11
11
|
* @module @monomind/cli/monovector/coverage-router
|
|
12
12
|
*/
|
|
13
|
-
import { existsSync, readFileSync } from 'fs';
|
|
13
|
+
import { existsSync, readFileSync, statSync } from 'fs';
|
|
14
14
|
import { join } from 'path';
|
|
15
15
|
import { getProjectCwd } from '../mcp-tools/types.js';
|
|
16
16
|
// ============================================================================
|
|
@@ -28,6 +28,10 @@ const EMPTY = {
|
|
|
28
28
|
overallStatementCoverage: 0,
|
|
29
29
|
},
|
|
30
30
|
};
|
|
31
|
+
/** Maximum bytes for a JSON coverage summary (20 MB). */
|
|
32
|
+
const MAX_COVERAGE_JSON_BYTES = 20 * 1024 * 1024;
|
|
33
|
+
/** Maximum bytes for an lcov.info file (50 MB). */
|
|
34
|
+
const MAX_COVERAGE_LCOV_BYTES = 50 * 1024 * 1024;
|
|
31
35
|
/**
|
|
32
36
|
* Read coverage data from disk. Checks, in order:
|
|
33
37
|
* 1. coverage/coverage-summary.json (Jest/Istanbul)
|
|
@@ -39,7 +43,7 @@ const EMPTY = {
|
|
|
39
43
|
export function readCoverage(cwd = getProjectCwd()) {
|
|
40
44
|
for (const rel of ['coverage/coverage-summary.json', 'coverage-summary.json']) {
|
|
41
45
|
const p = join(cwd, rel);
|
|
42
|
-
if (existsSync(p)) {
|
|
46
|
+
if (existsSync(p) && statSync(p).size <= MAX_COVERAGE_JSON_BYTES) {
|
|
43
47
|
try {
|
|
44
48
|
return parseSummaryJson(JSON.parse(readFileSync(p, 'utf-8')), rel);
|
|
45
49
|
}
|
|
@@ -50,7 +54,7 @@ export function readCoverage(cwd = getProjectCwd()) {
|
|
|
50
54
|
}
|
|
51
55
|
for (const rel of ['coverage/lcov.info', 'lcov.info']) {
|
|
52
56
|
const p = join(cwd, rel);
|
|
53
|
-
if (existsSync(p)) {
|
|
57
|
+
if (existsSync(p) && statSync(p).size <= MAX_COVERAGE_LCOV_BYTES) {
|
|
54
58
|
try {
|
|
55
59
|
return parseLcov(readFileSync(p, 'utf-8'), rel);
|
|
56
60
|
}
|
|
@@ -60,7 +64,7 @@ export function readCoverage(cwd = getProjectCwd()) {
|
|
|
60
64
|
}
|
|
61
65
|
}
|
|
62
66
|
const nyc = join(cwd, '.nyc_output', 'out.json');
|
|
63
|
-
if (existsSync(nyc)) {
|
|
67
|
+
if (existsSync(nyc) && statSync(nyc).size <= MAX_COVERAGE_JSON_BYTES) {
|
|
64
68
|
try {
|
|
65
69
|
return parseSummaryJson(JSON.parse(readFileSync(nyc, 'utf-8')), '.nyc_output/out.json');
|
|
66
70
|
}
|
|
@@ -35,7 +35,8 @@ export const coverageRouterTools = [
|
|
|
35
35
|
},
|
|
36
36
|
handler: async (input) => {
|
|
37
37
|
try {
|
|
38
|
-
const
|
|
38
|
+
const rawPath = typeof input.path === 'string' ? input.path.slice(0, 512) : '';
|
|
39
|
+
const result = await coverageRoute(rawPath, { threshold: input.threshold ?? 80 });
|
|
39
40
|
if (!result.found) {
|
|
40
41
|
return text('No coverage report found. Run your test suite with coverage enabled (e.g. `vitest run --coverage`), then retry.');
|
|
41
42
|
}
|
|
@@ -66,7 +67,7 @@ export const coverageRouterTools = [
|
|
|
66
67
|
try {
|
|
67
68
|
const result = await coverageGaps({
|
|
68
69
|
threshold: input.threshold ?? 80,
|
|
69
|
-
path: input.path
|
|
70
|
+
path: typeof input.path === 'string' ? input.path.slice(0, 512) : undefined,
|
|
70
71
|
groupByAgent: true,
|
|
71
72
|
});
|
|
72
73
|
if (!result.found)
|
|
@@ -96,7 +97,9 @@ export const coverageRouterTools = [
|
|
|
96
97
|
},
|
|
97
98
|
handler: async (input) => {
|
|
98
99
|
try {
|
|
99
|
-
const
|
|
100
|
+
const rawPath = typeof input.path === 'string' ? input.path.slice(0, 512) : '.';
|
|
101
|
+
const rawLimit = typeof input.limit === 'number' ? Math.min(Math.max(1, input.limit), 200) : 20;
|
|
102
|
+
const result = await coverageSuggest(rawPath, { threshold: input.threshold ?? 80, limit: rawLimit });
|
|
100
103
|
if (!result.found) {
|
|
101
104
|
return text('No coverage report found. Run your test suite with coverage enabled, then retry.');
|
|
102
105
|
}
|
|
@@ -626,8 +626,11 @@ export function suggestReviewers(files, fileRisks) {
|
|
|
626
626
|
return Array.from(reviewers).slice(0, 5);
|
|
627
627
|
}
|
|
628
628
|
// Analysis result cache
|
|
629
|
+
// FIFO eviction cap matches diffCache. Without a cap, repeated calls to analyzeDiff
|
|
630
|
+
// with unique refs (e.g. HEAD~0...HEAD~N) would grow this Map to GBs.
|
|
629
631
|
const analysisCache = new Map();
|
|
630
632
|
const ANALYSIS_CACHE_TTL_MS = 3000; // 3 seconds
|
|
633
|
+
const ANALYSIS_CACHE_MAX_ENTRIES = 50;
|
|
631
634
|
/**
|
|
632
635
|
* Analyze a diff with full analysis (optimized with caching)
|
|
633
636
|
*/
|
|
@@ -662,6 +665,11 @@ export async function analyzeDiff(options) {
|
|
|
662
665
|
recommendedReviewers,
|
|
663
666
|
};
|
|
664
667
|
// Cache the result
|
|
668
|
+
if (analysisCache.size >= ANALYSIS_CACHE_MAX_ENTRIES) {
|
|
669
|
+
const oldestKey = analysisCache.keys().next().value;
|
|
670
|
+
if (oldestKey !== undefined)
|
|
671
|
+
analysisCache.delete(oldestKey);
|
|
672
|
+
}
|
|
665
673
|
analysisCache.set(ref, { result, timestamp: Date.now() });
|
|
666
674
|
return result;
|
|
667
675
|
}
|
|
@@ -692,6 +700,11 @@ export function analyzeDiffSync(options) {
|
|
|
692
700
|
fileRisks,
|
|
693
701
|
recommendedReviewers,
|
|
694
702
|
};
|
|
703
|
+
if (analysisCache.size >= ANALYSIS_CACHE_MAX_ENTRIES) {
|
|
704
|
+
const oldestKey = analysisCache.keys().next().value;
|
|
705
|
+
if (oldestKey !== undefined)
|
|
706
|
+
analysisCache.delete(oldestKey);
|
|
707
|
+
}
|
|
695
708
|
analysisCache.set(ref, { result, timestamp: Date.now() });
|
|
696
709
|
return result;
|
|
697
710
|
}
|
|
@@ -10,7 +10,8 @@ export interface RouteOutcomeRecord {
|
|
|
10
10
|
measuredSuccess?: boolean;
|
|
11
11
|
quality?: number;
|
|
12
12
|
}
|
|
13
|
-
/** Append a route recommendation (pre-outcome).
|
|
13
|
+
/** Append a route recommendation (pre-outcome). Opportunistically trims the
|
|
14
|
+
* file to MAX_ROUTE_RECORDS lines to prevent unbounded growth. */
|
|
14
15
|
export declare function recordRoute(baseDir: string, rec: RouteOutcomeRecord): Promise<void>;
|
|
15
16
|
/** Join outcome data onto the most recent matching route record by routeId. */
|
|
16
17
|
export declare function joinOutcome(baseDir: string, routeId: string, outcome: {
|
|
@@ -3,16 +3,42 @@
|
|
|
3
3
|
* what actually happened. This is the foundation for routing-accuracy metrics
|
|
4
4
|
* and for giving SONA a real training label.
|
|
5
5
|
*/
|
|
6
|
-
import { promises as fs } from 'node:fs';
|
|
6
|
+
import { promises as fs, statSync } from 'node:fs';
|
|
7
7
|
import { join } from 'node:path';
|
|
8
|
+
/** Refuse to read files larger than this to prevent OOM. */
|
|
9
|
+
const MAX_FILE_BYTES = 50 * 1024 * 1024; // 50 MB
|
|
10
|
+
/** Cap string fields stored in each record to prevent file bloat. */
|
|
11
|
+
const MAX_FIELD_LEN = 500;
|
|
8
12
|
function storePath(baseDir) {
|
|
9
13
|
return join(baseDir, 'route-outcomes.jsonl');
|
|
10
14
|
}
|
|
11
|
-
/**
|
|
15
|
+
/** Maximum number of records to keep in route-outcomes.jsonl.
|
|
16
|
+
* computeRoutingAccuracy only ever reads the last 100 records, so anything
|
|
17
|
+
* older is dead weight. Keeping 500 gives a comfortable buffer while bounding
|
|
18
|
+
* the file size and keeping joinOutcome's full-file rewrite cheap. */
|
|
19
|
+
const MAX_ROUTE_RECORDS = 500;
|
|
20
|
+
/** Append a route recommendation (pre-outcome). Opportunistically trims the
|
|
21
|
+
* file to MAX_ROUTE_RECORDS lines to prevent unbounded growth. */
|
|
12
22
|
export async function recordRoute(baseDir, rec) {
|
|
13
23
|
try {
|
|
14
24
|
await fs.mkdir(baseDir, { recursive: true });
|
|
15
|
-
|
|
25
|
+
const path = storePath(baseDir);
|
|
26
|
+
// Cap string fields to prevent individual records from bloating the file.
|
|
27
|
+
const safeRec = {
|
|
28
|
+
...rec,
|
|
29
|
+
routeId: rec.routeId.slice(0, MAX_FIELD_LEN),
|
|
30
|
+
task: rec.task.slice(0, MAX_FIELD_LEN),
|
|
31
|
+
recommendedAgent: rec.recommendedAgent.slice(0, MAX_FIELD_LEN),
|
|
32
|
+
routingMethod: rec.routingMethod.slice(0, 64),
|
|
33
|
+
};
|
|
34
|
+
await fs.appendFile(path, JSON.stringify(safeRec) + '\n', 'utf8');
|
|
35
|
+
// Opportunistic trim: rewrite only when the file exceeds the cap.
|
|
36
|
+
// Avoids an extra stat() on every call by catching the overcount lazily.
|
|
37
|
+
const content = await fs.readFile(path, 'utf8').catch(() => '');
|
|
38
|
+
const lines = content.trim().split('\n').filter(Boolean);
|
|
39
|
+
if (lines.length > MAX_ROUTE_RECORDS) {
|
|
40
|
+
await fs.writeFile(path, lines.slice(-MAX_ROUTE_RECORDS).join('\n') + '\n', 'utf8');
|
|
41
|
+
}
|
|
16
42
|
}
|
|
17
43
|
catch {
|
|
18
44
|
// Non-fatal — telemetry must never break routing
|
|
@@ -22,6 +48,11 @@ export async function recordRoute(baseDir, rec) {
|
|
|
22
48
|
export async function joinOutcome(baseDir, routeId, outcome) {
|
|
23
49
|
try {
|
|
24
50
|
const path = storePath(baseDir);
|
|
51
|
+
try {
|
|
52
|
+
if (statSync(path).size > MAX_FILE_BYTES)
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
catch { /* file absent */ }
|
|
25
56
|
const content = await fs.readFile(path, 'utf8').catch(() => '');
|
|
26
57
|
if (!content)
|
|
27
58
|
return;
|
|
@@ -52,6 +83,11 @@ export async function joinLatestUnresolved(baseDir, outcome, maxAgeMs = 600_000
|
|
|
52
83
|
) {
|
|
53
84
|
try {
|
|
54
85
|
const path = storePath(baseDir);
|
|
86
|
+
try {
|
|
87
|
+
if (statSync(path).size > MAX_FILE_BYTES)
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
catch { /* file absent */ }
|
|
55
91
|
const content = await fs.readFile(path, 'utf8').catch(() => '');
|
|
56
92
|
if (!content)
|
|
57
93
|
return null;
|
|
@@ -81,7 +117,13 @@ export async function joinLatestUnresolved(baseDir, outcome, maxAgeMs = 600_000
|
|
|
81
117
|
/** Read all outcome records (for metrics). */
|
|
82
118
|
export async function readOutcomes(baseDir) {
|
|
83
119
|
try {
|
|
84
|
-
const
|
|
120
|
+
const p = storePath(baseDir);
|
|
121
|
+
try {
|
|
122
|
+
if (statSync(p).size > MAX_FILE_BYTES)
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
catch { /* file absent */ }
|
|
126
|
+
const content = await fs.readFile(p, 'utf8').catch(() => '');
|
|
85
127
|
if (!content)
|
|
86
128
|
return [];
|
|
87
129
|
return content.trim().split('\n').map(l => {
|
|
@@ -20,7 +20,7 @@ export interface SessionReplay extends SessionSummary {
|
|
|
20
20
|
}
|
|
21
21
|
export declare class ReplayReader {
|
|
22
22
|
private sessionsDir;
|
|
23
|
-
constructor(cwd?:
|
|
23
|
+
constructor(cwd?: string);
|
|
24
24
|
/**
|
|
25
25
|
* Find and return the session data for a given session ID.
|
|
26
26
|
* The ID may be a bare ID (e.g. "session-1234567890") or a timestamp number.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestration — barrel exports for Three-Mode Team Routing (Task 22)
|
|
3
|
+
*/
|
|
4
|
+
export { RouteModeExecutor, CoordinateModeExecutor, CollaborateModeExecutor, parsePlan, } from './routing-modes.js';
|
|
5
|
+
export type { OrchestrationMode, RouteModeConfig, CoordinateModeConfig, CollaborateModeConfig, ModeResult, AgentDispatcher, ModeExecutor, } from './routing-modes.js';
|
|
6
|
+
export { ModeDispatcher } from './mode-dispatcher.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestration — barrel exports for Three-Mode Team Routing (Task 22)
|
|
3
|
+
*/
|
|
4
|
+
export { RouteModeExecutor, CoordinateModeExecutor, CollaborateModeExecutor, parsePlan, } from './routing-modes.js';
|
|
5
|
+
export { ModeDispatcher } from './mode-dispatcher.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModeDispatcher — selects and executes the correct mode executor
|
|
3
|
+
* based on the requested OrchestrationMode.
|
|
4
|
+
*/
|
|
5
|
+
import type { AgentDispatcher, CollaborateModeConfig, CoordinateModeConfig, ModeResult, OrchestrationMode, RouteModeConfig } from './routing-modes.js';
|
|
6
|
+
export declare class ModeDispatcher {
|
|
7
|
+
private readonly dispatcher;
|
|
8
|
+
constructor(dispatcher: AgentDispatcher);
|
|
9
|
+
dispatchWithMode(mode: OrchestrationMode | undefined, config: RouteModeConfig | CoordinateModeConfig | CollaborateModeConfig): Promise<ModeResult>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=mode-dispatcher.d.ts.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModeDispatcher — selects and executes the correct mode executor
|
|
3
|
+
* based on the requested OrchestrationMode.
|
|
4
|
+
*/
|
|
5
|
+
import { CollaborateModeExecutor, CoordinateModeExecutor, RouteModeExecutor, } from './routing-modes.js';
|
|
6
|
+
export class ModeDispatcher {
|
|
7
|
+
dispatcher;
|
|
8
|
+
constructor(dispatcher) {
|
|
9
|
+
this.dispatcher = dispatcher;
|
|
10
|
+
}
|
|
11
|
+
async dispatchWithMode(mode = 'route', config) {
|
|
12
|
+
switch (mode) {
|
|
13
|
+
case 'route': {
|
|
14
|
+
const executor = new RouteModeExecutor(this.dispatcher);
|
|
15
|
+
return executor.execute(config);
|
|
16
|
+
}
|
|
17
|
+
case 'coordinate': {
|
|
18
|
+
const executor = new CoordinateModeExecutor(this.dispatcher);
|
|
19
|
+
return executor.execute(config);
|
|
20
|
+
}
|
|
21
|
+
case 'collaborate': {
|
|
22
|
+
const executor = new CollaborateModeExecutor(this.dispatcher);
|
|
23
|
+
return executor.execute(config);
|
|
24
|
+
}
|
|
25
|
+
default: {
|
|
26
|
+
throw new Error(`Unknown orchestration mode: ${mode}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=mode-dispatcher.js.map
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Three-Mode Team Routing — Task 22
|
|
3
|
+
*
|
|
4
|
+
* Provides three orchestration modes:
|
|
5
|
+
* - route: single-agent dispatch
|
|
6
|
+
* - coordinate: planner → fan-out → synthesizer
|
|
7
|
+
* - collaborate: iterative A↔B with shared scratchpad
|
|
8
|
+
*/
|
|
9
|
+
export type OrchestrationMode = 'route' | 'coordinate' | 'collaborate';
|
|
10
|
+
export interface RouteModeConfig {
|
|
11
|
+
agentSlug: string;
|
|
12
|
+
task: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CoordinateModeConfig {
|
|
15
|
+
plannerSlug?: string;
|
|
16
|
+
synthesizerSlug?: string;
|
|
17
|
+
task: string;
|
|
18
|
+
maxSubtasks?: number;
|
|
19
|
+
}
|
|
20
|
+
export interface CollaborateModeConfig {
|
|
21
|
+
agentA: string;
|
|
22
|
+
agentB: string;
|
|
23
|
+
task: string;
|
|
24
|
+
maxIterations?: number;
|
|
25
|
+
convergencePhrase?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ModeResult {
|
|
28
|
+
mode: OrchestrationMode;
|
|
29
|
+
output: unknown;
|
|
30
|
+
agentsInvolved: string[];
|
|
31
|
+
iterationCount: number;
|
|
32
|
+
tokenUsage: {
|
|
33
|
+
input: number;
|
|
34
|
+
output: number;
|
|
35
|
+
};
|
|
36
|
+
latencyMs: number;
|
|
37
|
+
}
|
|
38
|
+
export interface AgentDispatcher {
|
|
39
|
+
dispatch(agentSlug: string, task: string, context?: string): Promise<{
|
|
40
|
+
output: unknown;
|
|
41
|
+
tokenUsage?: {
|
|
42
|
+
input: number;
|
|
43
|
+
output: number;
|
|
44
|
+
};
|
|
45
|
+
}>;
|
|
46
|
+
}
|
|
47
|
+
export declare abstract class ModeExecutor<TConfig> {
|
|
48
|
+
protected readonly dispatcher: AgentDispatcher;
|
|
49
|
+
constructor(dispatcher: AgentDispatcher);
|
|
50
|
+
abstract execute(config: TConfig): Promise<ModeResult>;
|
|
51
|
+
}
|
|
52
|
+
export declare class RouteModeExecutor extends ModeExecutor<RouteModeConfig> {
|
|
53
|
+
execute(config: RouteModeConfig): Promise<ModeResult>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Extract a subtasks array from the planner output.
|
|
57
|
+
* Accepts either a raw array or JSON containing a `subtasks` key.
|
|
58
|
+
*/
|
|
59
|
+
export declare function parsePlan(output: unknown): string[];
|
|
60
|
+
export declare class CoordinateModeExecutor extends ModeExecutor<CoordinateModeConfig> {
|
|
61
|
+
execute(config: CoordinateModeConfig): Promise<ModeResult>;
|
|
62
|
+
private addTokens;
|
|
63
|
+
}
|
|
64
|
+
export declare class CollaborateModeExecutor extends ModeExecutor<CollaborateModeConfig> {
|
|
65
|
+
execute(config: CollaborateModeConfig): Promise<ModeResult>;
|
|
66
|
+
private addTokens;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=routing-modes.d.ts.map
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Three-Mode Team Routing — Task 22
|
|
3
|
+
*
|
|
4
|
+
* Provides three orchestration modes:
|
|
5
|
+
* - route: single-agent dispatch
|
|
6
|
+
* - coordinate: planner → fan-out → synthesizer
|
|
7
|
+
* - collaborate: iterative A↔B with shared scratchpad
|
|
8
|
+
*/
|
|
9
|
+
import { SharedScratchpad } from '../../../shared/src/scratchpad.js';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Abstract executor
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const SLUG_RE = /^[a-z0-9][a-z0-9\-]{0,63}$/;
|
|
14
|
+
const MAX_TASK_BYTES = 64 * 1024;
|
|
15
|
+
function assertSlug(value, name) {
|
|
16
|
+
if (!SLUG_RE.test(value))
|
|
17
|
+
throw new Error(`Invalid agent slug for ${name}: ${JSON.stringify(value)}`);
|
|
18
|
+
}
|
|
19
|
+
function assertTask(task) {
|
|
20
|
+
if (!task || task.trim().length === 0)
|
|
21
|
+
throw new Error('task must not be empty');
|
|
22
|
+
if (task.length > MAX_TASK_BYTES)
|
|
23
|
+
throw new Error(`task exceeds maximum length (${MAX_TASK_BYTES} bytes)`);
|
|
24
|
+
}
|
|
25
|
+
export class ModeExecutor {
|
|
26
|
+
dispatcher;
|
|
27
|
+
constructor(dispatcher) {
|
|
28
|
+
this.dispatcher = dispatcher;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Route mode — single dispatch
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
export class RouteModeExecutor extends ModeExecutor {
|
|
35
|
+
async execute(config) {
|
|
36
|
+
assertSlug(config.agentSlug, 'agentSlug');
|
|
37
|
+
assertTask(config.task);
|
|
38
|
+
const start = Date.now();
|
|
39
|
+
const result = await this.dispatcher.dispatch(config.agentSlug, config.task);
|
|
40
|
+
return {
|
|
41
|
+
mode: 'route',
|
|
42
|
+
output: result.output,
|
|
43
|
+
agentsInvolved: [config.agentSlug],
|
|
44
|
+
iterationCount: 1,
|
|
45
|
+
tokenUsage: result.tokenUsage ?? { input: 0, output: 0 },
|
|
46
|
+
latencyMs: Date.now() - start,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Coordinate mode — planner → fan-out → synthesizer
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
/**
|
|
54
|
+
* Extract a subtasks array from the planner output.
|
|
55
|
+
* Accepts either a raw array or JSON containing a `subtasks` key.
|
|
56
|
+
*/
|
|
57
|
+
export function parsePlan(output) {
|
|
58
|
+
if (Array.isArray(output))
|
|
59
|
+
return output.map(String);
|
|
60
|
+
const raw = typeof output === 'string' ? output : JSON.stringify(output);
|
|
61
|
+
try {
|
|
62
|
+
const parsed = JSON.parse(raw);
|
|
63
|
+
if (Array.isArray(parsed))
|
|
64
|
+
return parsed.map(String);
|
|
65
|
+
if (parsed !== null && typeof parsed === 'object' && Array.isArray(parsed.subtasks))
|
|
66
|
+
return parsed.subtasks.map(String);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// not JSON — treat the whole string as a single subtask
|
|
70
|
+
}
|
|
71
|
+
return [raw];
|
|
72
|
+
}
|
|
73
|
+
export class CoordinateModeExecutor extends ModeExecutor {
|
|
74
|
+
async execute(config) {
|
|
75
|
+
assertTask(config.task);
|
|
76
|
+
const start = Date.now();
|
|
77
|
+
const plannerSlug = config.plannerSlug ?? 'planner';
|
|
78
|
+
const synthesizerSlug = config.synthesizerSlug ?? 'hierarchical-coordinator';
|
|
79
|
+
assertSlug(plannerSlug, 'plannerSlug');
|
|
80
|
+
assertSlug(synthesizerSlug, 'synthesizerSlug');
|
|
81
|
+
const maxSubtasks = config.maxSubtasks ?? 8;
|
|
82
|
+
const totalTokens = { input: 0, output: 0 };
|
|
83
|
+
const agents = [plannerSlug];
|
|
84
|
+
// 1. Call planner
|
|
85
|
+
const planResult = await this.dispatcher.dispatch(plannerSlug, config.task);
|
|
86
|
+
this.addTokens(totalTokens, planResult.tokenUsage);
|
|
87
|
+
// 2. Parse subtasks & cap
|
|
88
|
+
const subtasks = parsePlan(planResult.output).slice(0, maxSubtasks);
|
|
89
|
+
// 3. Fan-out
|
|
90
|
+
const fanOutResults = await Promise.all(subtasks.map((subtask, i) => {
|
|
91
|
+
const workerSlug = `worker-${i}`;
|
|
92
|
+
agents.push(workerSlug);
|
|
93
|
+
return this.dispatcher.dispatch(workerSlug, subtask);
|
|
94
|
+
}));
|
|
95
|
+
for (const r of fanOutResults)
|
|
96
|
+
this.addTokens(totalTokens, r.tokenUsage);
|
|
97
|
+
// 4. Synthesize
|
|
98
|
+
agents.push(synthesizerSlug);
|
|
99
|
+
const synthesisContext = JSON.stringify(fanOutResults.map((r) => r.output));
|
|
100
|
+
const synthResult = await this.dispatcher.dispatch(synthesizerSlug, 'Synthesize the following results', synthesisContext);
|
|
101
|
+
this.addTokens(totalTokens, synthResult.tokenUsage);
|
|
102
|
+
return {
|
|
103
|
+
mode: 'coordinate',
|
|
104
|
+
output: synthResult.output,
|
|
105
|
+
agentsInvolved: agents,
|
|
106
|
+
iterationCount: 1 + subtasks.length + 1, // planner + workers + synthesizer
|
|
107
|
+
tokenUsage: totalTokens,
|
|
108
|
+
latencyMs: Date.now() - start,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
addTokens(total, usage) {
|
|
112
|
+
if (usage) {
|
|
113
|
+
total.input += usage.input;
|
|
114
|
+
total.output += usage.output;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
// Collaborate mode — iterative A↔B with shared scratchpad
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
export class CollaborateModeExecutor extends ModeExecutor {
|
|
122
|
+
async execute(config) {
|
|
123
|
+
assertTask(config.task);
|
|
124
|
+
assertSlug(config.agentA, 'agentA');
|
|
125
|
+
assertSlug(config.agentB, 'agentB');
|
|
126
|
+
const start = Date.now();
|
|
127
|
+
// Cap iterations: each iteration costs 2 LLM dispatches; an unbounded value
|
|
128
|
+
// turns this into an unbounded token-cost / OOM vector.
|
|
129
|
+
const maxIterations = Math.max(1, Math.min(config.maxIterations ?? 5, 20));
|
|
130
|
+
// Reject empty/short convergence phrase — empty string would make
|
|
131
|
+
// String(bResult.output).includes('') return true on iteration 1, bypassing
|
|
132
|
+
// the entire iterative review and locking in whatever Agent B produced.
|
|
133
|
+
const rawPhrase = (config.convergencePhrase ?? 'APPROVED').trim();
|
|
134
|
+
const convergencePhrase = rawPhrase.length >= 3 ? rawPhrase : 'APPROVED';
|
|
135
|
+
const pad = new SharedScratchpad();
|
|
136
|
+
const totalTokens = { input: 0, output: 0 };
|
|
137
|
+
let lastOutput;
|
|
138
|
+
for (let i = 0; i < maxIterations; i++) {
|
|
139
|
+
// Agent A
|
|
140
|
+
const aResult = await this.dispatcher.dispatch(config.agentA, config.task, pad.read());
|
|
141
|
+
pad.append(config.agentA, String(aResult.output));
|
|
142
|
+
this.addTokens(totalTokens, aResult.tokenUsage);
|
|
143
|
+
// Agent B
|
|
144
|
+
const bResult = await this.dispatcher.dispatch(config.agentB, config.task, pad.read());
|
|
145
|
+
pad.append(config.agentB, String(bResult.output));
|
|
146
|
+
this.addTokens(totalTokens, bResult.tokenUsage);
|
|
147
|
+
lastOutput = bResult.output;
|
|
148
|
+
// Convergence check — require the phrase as a stand-alone token so that
|
|
149
|
+
// an attacker who controls Agent A's output cannot embed `APPROVED` in
|
|
150
|
+
// prose and force premature convergence on iteration 1.
|
|
151
|
+
const escaped = convergencePhrase.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
152
|
+
const convergenceRe = new RegExp(`(^|\\W)${escaped}(\\W|$)`);
|
|
153
|
+
if (convergenceRe.test(String(bResult.output))) {
|
|
154
|
+
return {
|
|
155
|
+
mode: 'collaborate',
|
|
156
|
+
output: lastOutput,
|
|
157
|
+
agentsInvolved: [config.agentA, config.agentB],
|
|
158
|
+
iterationCount: i + 1,
|
|
159
|
+
tokenUsage: totalTokens,
|
|
160
|
+
latencyMs: Date.now() - start,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
mode: 'collaborate',
|
|
166
|
+
output: lastOutput,
|
|
167
|
+
agentsInvolved: [config.agentA, config.agentB],
|
|
168
|
+
iterationCount: maxIterations,
|
|
169
|
+
tokenUsage: totalTokens,
|
|
170
|
+
latencyMs: Date.now() - start,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
addTokens(total, usage) {
|
|
174
|
+
if (usage) {
|
|
175
|
+
total.input += usage.input;
|
|
176
|
+
total.output += usage.output;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=routing-modes.js.map
|
|
@@ -73,7 +73,8 @@ export class PluginManager {
|
|
|
73
73
|
}
|
|
74
74
|
async loadManifest() {
|
|
75
75
|
try {
|
|
76
|
-
|
|
76
|
+
const MAX_MANIFEST_BYTES = 10 * 1024 * 1024; // 10 MB
|
|
77
|
+
if (fs.existsSync(this.config.manifestPath) && fs.statSync(this.config.manifestPath).size <= MAX_MANIFEST_BYTES) {
|
|
77
78
|
const content = fs.readFileSync(this.config.manifestPath, 'utf-8');
|
|
78
79
|
const parsed = JSON.parse(content);
|
|
79
80
|
if (Object.prototype.hasOwnProperty.call(parsed, '__proto__') ||
|
|
@@ -148,7 +149,8 @@ export class PluginManager {
|
|
|
148
149
|
let installedVersion = version || 'latest';
|
|
149
150
|
let commands = [];
|
|
150
151
|
let hooks = [];
|
|
151
|
-
|
|
152
|
+
const MAX_PKG_JSON_BYTES = 1024 * 1024; // 1 MB
|
|
153
|
+
if (fs.existsSync(packageJsonPath) && fs.statSync(packageJsonPath).size <= MAX_PKG_JSON_BYTES) {
|
|
152
154
|
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
153
155
|
installedVersion = pkg.version;
|
|
154
156
|
// Check for monomind plugin metadata
|
|
@@ -205,6 +207,9 @@ export class PluginManager {
|
|
|
205
207
|
if (!fs.existsSync(packageJsonPath)) {
|
|
206
208
|
return { success: false, error: 'No package.json found at path' };
|
|
207
209
|
}
|
|
210
|
+
if (fs.statSync(packageJsonPath).size > 1024 * 1024) {
|
|
211
|
+
return { success: false, error: 'package.json exceeds size limit' };
|
|
212
|
+
}
|
|
208
213
|
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
209
214
|
const packageName = pkg.name;
|
|
210
215
|
if (!isValidPluginKey(packageName)) {
|
|
@@ -423,7 +428,7 @@ export class PluginManager {
|
|
|
423
428
|
// Update manifest
|
|
424
429
|
const installDir = path.join(this.config.pluginsDir, 'node_modules');
|
|
425
430
|
const packageJsonPath = path.join(installDir, packageName, 'package.json');
|
|
426
|
-
if (fs.existsSync(packageJsonPath)) {
|
|
431
|
+
if (fs.existsSync(packageJsonPath) && fs.statSync(packageJsonPath).size <= 1024 * 1024) {
|
|
427
432
|
const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
428
433
|
existing.version = pkg.version;
|
|
429
434
|
existing.commands = pkg['monomind']?.commands || existing.commands;
|
|
@@ -5,23 +5,67 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import * as crypto from 'crypto';
|
|
7
7
|
import { resolveIPNS, fetchFromIPFS } from '../../transfer/ipfs/client.js';
|
|
8
|
+
/** Maximum bytes accepted from npm API responses to prevent OOM. */
|
|
9
|
+
const NPM_RESPONSE_MAX_BYTES = 256 * 1024; // 256 KB
|
|
10
|
+
/**
|
|
11
|
+
* Read a fetch Response body up to maxBytes. AbortSignal.timeout() only
|
|
12
|
+
* bounds wall-clock time, NOT response body size; a slow-drip or large
|
|
13
|
+
* response would otherwise buffer unbounded memory here.
|
|
14
|
+
*/
|
|
15
|
+
async function readBoundedJson(res, maxBytes) {
|
|
16
|
+
const lenHdr = res.headers.get('content-length');
|
|
17
|
+
if (lenHdr) {
|
|
18
|
+
const declared = parseInt(lenHdr, 10);
|
|
19
|
+
if (Number.isFinite(declared) && declared > maxBytes) {
|
|
20
|
+
throw new Error(`npm response too large: ${declared} bytes`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (!res.body)
|
|
24
|
+
return JSON.parse('');
|
|
25
|
+
const reader = res.body.getReader();
|
|
26
|
+
const chunks = [];
|
|
27
|
+
let total = 0;
|
|
28
|
+
while (true) {
|
|
29
|
+
const { done, value } = await reader.read();
|
|
30
|
+
if (done)
|
|
31
|
+
break;
|
|
32
|
+
if (value) {
|
|
33
|
+
total += value.byteLength;
|
|
34
|
+
if (total > maxBytes) {
|
|
35
|
+
await reader.cancel();
|
|
36
|
+
throw new Error(`npm response exceeded ${maxBytes} bytes`);
|
|
37
|
+
}
|
|
38
|
+
chunks.push(value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const buf = new Uint8Array(total);
|
|
42
|
+
let off = 0;
|
|
43
|
+
for (const c of chunks) {
|
|
44
|
+
buf.set(c, off);
|
|
45
|
+
off += c.byteLength;
|
|
46
|
+
}
|
|
47
|
+
return JSON.parse(new TextDecoder('utf-8').decode(buf));
|
|
48
|
+
}
|
|
8
49
|
/**
|
|
9
50
|
* Fetch real npm download stats for a package
|
|
10
51
|
*/
|
|
11
52
|
async function fetchNpmStats(packageName) {
|
|
53
|
+
// Validate package name length to avoid constructing huge URLs
|
|
54
|
+
if (!packageName || packageName.length > 214)
|
|
55
|
+
return null;
|
|
12
56
|
try {
|
|
13
57
|
// Fetch last week downloads
|
|
14
58
|
const downloadsUrl = `https://api.npmjs.org/downloads/point/last-week/${encodeURIComponent(packageName)}`;
|
|
15
59
|
const downloadsRes = await fetch(downloadsUrl, { signal: AbortSignal.timeout(3000) });
|
|
16
60
|
if (!downloadsRes.ok)
|
|
17
61
|
return null;
|
|
18
|
-
const downloadsData = await downloadsRes
|
|
62
|
+
const downloadsData = await readBoundedJson(downloadsRes, NPM_RESPONSE_MAX_BYTES);
|
|
19
63
|
// Fetch package info for version
|
|
20
64
|
const packageUrl = `https://registry.npmjs.org/${encodeURIComponent(packageName)}/latest`;
|
|
21
65
|
const packageRes = await fetch(packageUrl, { signal: AbortSignal.timeout(3000) });
|
|
22
66
|
let version = 'unknown';
|
|
23
67
|
if (packageRes.ok) {
|
|
24
|
-
const packageData = await packageRes
|
|
68
|
+
const packageData = await readBoundedJson(packageRes, NPM_RESPONSE_MAX_BYTES);
|
|
25
69
|
version = packageData.version || 'unknown';
|
|
26
70
|
}
|
|
27
71
|
return {
|
|
@@ -9,7 +9,7 @@ export function searchPlugins(registry, options = {}) {
|
|
|
9
9
|
let plugins = [...registry.plugins];
|
|
10
10
|
// Text search (name, displayName, description, tags)
|
|
11
11
|
if (options.query) {
|
|
12
|
-
const query = options.query.toLowerCase();
|
|
12
|
+
const query = options.query.slice(0, 256).toLowerCase();
|
|
13
13
|
plugins = plugins.filter(p => p.name.toLowerCase().includes(query) ||
|
|
14
14
|
p.displayName.toLowerCase().includes(query) ||
|
|
15
15
|
p.description.toLowerCase().includes(query) ||
|
|
@@ -88,8 +88,8 @@ export function searchPlugins(registry, options = {}) {
|
|
|
88
88
|
});
|
|
89
89
|
// Pagination
|
|
90
90
|
const total = plugins.length;
|
|
91
|
-
const limit = options.limit || 20;
|
|
92
|
-
const offset = options.offset || 0;
|
|
91
|
+
const limit = Math.min(Math.max(1, options.limit || 20), 200);
|
|
92
|
+
const offset = Math.max(0, Math.min(options.offset || 0, 100_000));
|
|
93
93
|
const page = Math.floor(offset / limit) + 1;
|
|
94
94
|
plugins = plugins.slice(offset, offset + limit);
|
|
95
95
|
return {
|
|
@@ -105,7 +105,8 @@ export function searchPlugins(registry, options = {}) {
|
|
|
105
105
|
* Get search suggestions based on partial query
|
|
106
106
|
*/
|
|
107
107
|
export function getPluginSearchSuggestions(registry, partialQuery, limit = 10) {
|
|
108
|
-
const query = partialQuery.toLowerCase();
|
|
108
|
+
const query = partialQuery.slice(0, 256).toLowerCase();
|
|
109
|
+
limit = Math.min(Math.max(1, limit), 100);
|
|
109
110
|
const suggestions = new Set();
|
|
110
111
|
// Search in plugin names
|
|
111
112
|
for (const plugin of registry.plugins) {
|