@monoes/monomindcli 2.8.3 → 2.9.1
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/helpers/auto-memory-hook.mjs +0 -0
- package/.claude/helpers/handlers/route-handler.cjs +12 -0
- package/.claude/helpers/handlers/session-restore-handler.cjs +28 -7
- package/.claude/helpers/hook-handler.cjs +0 -0
- package/.claude/helpers/utils/micro-agents.cjs +22 -0
- package/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +11 -6
- package/.claude/skills/monodesign/scripts/live-inject.mjs +20 -7
- package/.claude/skills/monodesign/scripts/live-server.mjs +38 -2
- package/LICENSE +191 -0
- package/README.md +8 -6
- package/dist/src/browser/dashboard/server.d.ts +5 -0
- package/dist/src/browser/dashboard/server.d.ts.map +1 -1
- package/dist/src/browser/dashboard/server.js +59 -4
- package/dist/src/browser/dashboard/server.js.map +1 -1
- package/dist/src/browser/dashboard/ui.html +18 -8
- package/dist/src/browser/workflow/store.d.ts.map +1 -1
- package/dist/src/browser/workflow/store.js +3 -2
- package/dist/src/browser/workflow/store.js.map +1 -1
- package/dist/src/capabilities/cap-documents.d.ts.map +1 -1
- package/dist/src/capabilities/cap-documents.js +14 -9
- package/dist/src/capabilities/cap-documents.js.map +1 -1
- package/dist/src/commands/design-palette.d.ts +5 -0
- package/dist/src/commands/design-palette.d.ts.map +1 -1
- package/dist/src/commands/design-palette.js +8 -5
- package/dist/src/commands/design-palette.js.map +1 -1
- package/dist/src/commands/doctor.d.ts.map +1 -1
- package/dist/src/commands/doctor.js +22 -18
- package/dist/src/commands/doctor.js.map +1 -1
- package/dist/src/commands/download-embeddings.d.ts +8 -0
- package/dist/src/commands/download-embeddings.d.ts.map +1 -0
- package/dist/src/commands/download-embeddings.js +34 -0
- package/dist/src/commands/download-embeddings.js.map +1 -0
- package/dist/src/commands/hooks.d.ts.map +1 -1
- package/dist/src/commands/hooks.js +14 -0
- package/dist/src/commands/hooks.js.map +1 -1
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +4 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/init-wizard.js +1 -1
- package/dist/src/commands/init-wizard.js.map +1 -1
- package/dist/src/commands/init.d.ts.map +1 -1
- package/dist/src/commands/init.js +48 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/monograph.d.ts.map +1 -1
- package/dist/src/commands/monograph.js +35 -1
- package/dist/src/commands/monograph.js.map +1 -1
- package/dist/src/commands/org-observe.d.ts +10 -0
- package/dist/src/commands/org-observe.d.ts.map +1 -1
- package/dist/src/commands/org-observe.js +195 -31
- package/dist/src/commands/org-observe.js.map +1 -1
- package/dist/src/commands/org.d.ts +1 -0
- package/dist/src/commands/org.d.ts.map +1 -1
- package/dist/src/commands/org.js +139 -3
- package/dist/src/commands/org.js.map +1 -1
- package/dist/src/commands/route.d.ts +1 -9
- package/dist/src/commands/route.d.ts.map +1 -1
- package/dist/src/commands/route.js +42 -65
- package/dist/src/commands/route.js.map +1 -1
- package/dist/src/commands/security-cve.d.ts.map +1 -1
- package/dist/src/commands/security-cve.js +2 -1
- package/dist/src/commands/security-cve.js.map +1 -1
- package/dist/src/index.d.ts +0 -10
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +4 -15
- package/dist/src/index.js.map +1 -1
- package/dist/src/init/copy-assets.d.ts +17 -0
- package/dist/src/init/copy-assets.d.ts.map +1 -0
- package/dist/src/init/copy-assets.js +271 -0
- package/dist/src/init/copy-assets.js.map +1 -0
- package/dist/src/init/executor.d.ts +2 -30
- package/dist/src/init/executor.d.ts.map +1 -1
- package/dist/src/init/executor.js +56 -2493
- package/dist/src/init/executor.js.map +1 -1
- package/dist/src/init/geminimd-generator.js +2 -2
- package/dist/src/init/helpers-generator.d.ts.map +1 -1
- package/dist/src/init/helpers-generator.js +9 -0
- package/dist/src/init/helpers-generator.js.map +1 -1
- package/dist/src/init/kimi-generator.js +3 -3
- package/dist/src/init/kimi-generator.js.map +1 -1
- package/dist/src/init/settings-generator.d.ts.map +1 -1
- package/dist/src/init/settings-generator.js +0 -4
- package/dist/src/init/settings-generator.js.map +1 -1
- package/dist/src/init/shared.d.ts +112 -0
- package/dist/src/init/shared.d.ts.map +1 -0
- package/dist/src/init/shared.js +475 -0
- package/dist/src/init/shared.js.map +1 -0
- package/dist/src/init/statusline-generator.d.ts.map +1 -1
- package/dist/src/init/statusline-generator.js +37 -0
- package/dist/src/init/statusline-generator.js.map +1 -1
- package/dist/src/init/types.d.ts +1 -1
- package/dist/src/init/types.d.ts.map +1 -1
- package/dist/src/init/upgrade.d.ts +34 -0
- package/dist/src/init/upgrade.d.ts.map +1 -0
- package/dist/src/init/upgrade.js +477 -0
- package/dist/src/init/upgrade.js.map +1 -0
- package/dist/src/init/write-antigravity.d.ts +13 -0
- package/dist/src/init/write-antigravity.d.ts.map +1 -0
- package/dist/src/init/write-antigravity.js +117 -0
- package/dist/src/init/write-antigravity.js.map +1 -0
- package/dist/src/init/write-capabilities.d.ts +9 -0
- package/dist/src/init/write-capabilities.d.ts.map +1 -0
- package/dist/src/init/write-capabilities.js +392 -0
- package/dist/src/init/write-capabilities.js.map +1 -0
- package/dist/src/init/write-claude.d.ts +25 -0
- package/dist/src/init/write-claude.d.ts.map +1 -0
- package/dist/src/init/write-claude.js +279 -0
- package/dist/src/init/write-claude.js.map +1 -0
- package/dist/src/init/write-kimicode.d.ts +19 -0
- package/dist/src/init/write-kimicode.d.ts.map +1 -0
- package/dist/src/init/write-kimicode.js +223 -0
- package/dist/src/init/write-kimicode.js.map +1 -0
- package/dist/src/init/write-opencode.d.ts +14 -0
- package/dist/src/init/write-opencode.d.ts.map +1 -0
- package/dist/src/init/write-opencode.js +130 -0
- package/dist/src/init/write-opencode.js.map +1 -0
- package/dist/src/init/write-runtime-config.d.ts +14 -0
- package/dist/src/init/write-runtime-config.d.ts.map +1 -0
- package/dist/src/init/write-runtime-config.js +214 -0
- package/dist/src/init/write-runtime-config.js.map +1 -0
- package/dist/src/init/write-sample-org.d.ts +9 -0
- package/dist/src/init/write-sample-org.d.ts.map +1 -0
- package/dist/src/init/write-sample-org.js +39 -0
- package/dist/src/init/write-sample-org.js.map +1 -0
- package/dist/src/knowledge/eval/golden-set.js +1 -1
- package/dist/src/knowledge/eval/golden-set.js.map +1 -1
- package/dist/src/mcp-client.d.ts.map +1 -1
- package/dist/src/mcp-client.js +7 -3
- package/dist/src/mcp-client.js.map +1 -1
- package/dist/src/mcp-tools/analyze-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/analyze-tools.js +2 -25
- package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
- package/dist/src/mcp-tools/auto-install.d.ts.map +1 -1
- package/dist/src/mcp-tools/auto-install.js +2 -1
- package/dist/src/mcp-tools/auto-install.js.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
- package/dist/src/mcp-tools/hooks-routing.js +26 -0
- package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +2 -37
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/src/mcp-tools/monodesign-tools.d.ts +19 -0
- package/dist/src/mcp-tools/monodesign-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monodesign-tools.js +233 -0
- package/dist/src/mcp-tools/monodesign-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/agent-history-tools.d.ts +5 -0
- package/dist/src/mcp-tools/monograph/agent-history-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/agent-history-tools.js +177 -0
- package/dist/src/mcp-tools/monograph/agent-history-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/build-tools.d.ts +9 -0
- package/dist/src/mcp-tools/monograph/build-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/build-tools.js +299 -0
- package/dist/src/mcp-tools/monograph/build-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/group-tools.d.ts +10 -0
- package/dist/src/mcp-tools/monograph/group-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/group-tools.js +225 -0
- package/dist/src/mcp-tools/monograph/group-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/health-tools.d.ts +6 -0
- package/dist/src/mcp-tools/monograph/health-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/health-tools.js +113 -0
- package/dist/src/mcp-tools/monograph/health-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/impact-tools.d.ts +9 -0
- package/dist/src/mcp-tools/monograph/impact-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/impact-tools.js +532 -0
- package/dist/src/mcp-tools/monograph/impact-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/index.d.ts +10 -0
- package/dist/src/mcp-tools/monograph/index.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/index.js +73 -0
- package/dist/src/mcp-tools/monograph/index.js.map +1 -0
- package/dist/src/mcp-tools/monograph/query-tools.d.ts +11 -0
- package/dist/src/mcp-tools/monograph/query-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/query-tools.js +500 -0
- package/dist/src/mcp-tools/monograph/query-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph/shared.d.ts +64 -0
- package/dist/src/mcp-tools/monograph/shared.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/shared.js +215 -0
- package/dist/src/mcp-tools/monograph/shared.js.map +1 -0
- package/dist/src/mcp-tools/monograph/visualize-tools.d.ts +10 -0
- package/dist/src/mcp-tools/monograph/visualize-tools.d.ts.map +1 -0
- package/dist/src/mcp-tools/monograph/visualize-tools.js +382 -0
- package/dist/src/mcp-tools/monograph/visualize-tools.js.map +1 -0
- package/dist/src/mcp-tools/monograph-tools.d.ts +4 -23
- package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/monograph-tools.js +4 -2439
- package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
- package/dist/src/mcp-tools/monomind-tools.d.ts +8 -0
- package/dist/src/mcp-tools/monomind-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/monomind-tools.js +13 -1
- package/dist/src/mcp-tools/monomind-tools.js.map +1 -1
- package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts.map +1 -1
- package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.js +31 -2
- package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.js.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/terminal-tools.js +31 -1
- package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
- package/dist/src/mcp-tools/types.d.ts +8 -27
- package/dist/src/mcp-tools/types.d.ts.map +1 -1
- package/dist/src/mcp-tools/types.js +9 -91
- package/dist/src/mcp-tools/types.js.map +1 -1
- package/dist/src/memory/file-permissions.d.ts +15 -0
- package/dist/src/memory/file-permissions.d.ts.map +1 -0
- package/dist/src/memory/file-permissions.js +25 -0
- package/dist/src/memory/file-permissions.js.map +1 -0
- package/dist/src/memory/memory-bridge.d.ts.map +1 -1
- package/dist/src/memory/memory-bridge.js +94 -34
- package/dist/src/memory/memory-bridge.js.map +1 -1
- package/dist/src/memory/memory-crud.d.ts.map +1 -1
- package/dist/src/memory/memory-crud.js +298 -275
- package/dist/src/memory/memory-crud.js.map +1 -1
- package/dist/src/memory/memory-initializer.d.ts +2 -4
- package/dist/src/memory/memory-initializer.d.ts.map +1 -1
- package/dist/src/memory/memory-initializer.js +53 -76
- package/dist/src/memory/memory-initializer.js.map +1 -1
- package/dist/src/memory/memory-migrations.d.ts +1 -14
- package/dist/src/memory/memory-migrations.d.ts.map +1 -1
- package/dist/src/memory/memory-migrations.js +52 -105
- package/dist/src/memory/memory-migrations.js.map +1 -1
- package/dist/src/memory/sona-optimizer.d.ts +1 -1
- package/dist/src/memory/sona-optimizer.js +1 -1
- package/dist/src/monovector/index.d.ts +16 -19
- package/dist/src/monovector/index.d.ts.map +1 -1
- package/dist/src/monovector/index.js +50 -8
- package/dist/src/monovector/index.js.map +1 -1
- package/dist/src/orgrt/approvals.d.ts +16 -0
- package/dist/src/orgrt/approvals.d.ts.map +1 -0
- package/dist/src/orgrt/approvals.js +72 -0
- package/dist/src/orgrt/approvals.js.map +1 -0
- package/dist/src/orgrt/bus.d.ts.map +1 -1
- package/dist/src/orgrt/bus.js +21 -0
- package/dist/src/orgrt/bus.js.map +1 -1
- package/dist/src/orgrt/checkpoint-ops.d.ts +19 -0
- package/dist/src/orgrt/checkpoint-ops.d.ts.map +1 -0
- package/dist/src/orgrt/checkpoint-ops.js +219 -0
- package/dist/src/orgrt/checkpoint-ops.js.map +1 -0
- package/dist/src/orgrt/checkpoint.d.ts +33 -1
- package/dist/src/orgrt/checkpoint.d.ts.map +1 -1
- package/dist/src/orgrt/checkpoint.js +50 -6
- package/dist/src/orgrt/checkpoint.js.map +1 -1
- package/dist/src/orgrt/cross-org.d.ts +32 -0
- package/dist/src/orgrt/cross-org.d.ts.map +1 -0
- package/dist/src/orgrt/cross-org.js +256 -0
- package/dist/src/orgrt/cross-org.js.map +1 -0
- package/dist/src/orgrt/daemon.d.ts +131 -157
- package/dist/src/orgrt/daemon.d.ts.map +1 -1
- package/dist/src/orgrt/daemon.js +356 -966
- package/dist/src/orgrt/daemon.js.map +1 -1
- package/dist/src/orgrt/decisions.d.ts +33 -0
- package/dist/src/orgrt/decisions.d.ts.map +1 -0
- package/dist/src/orgrt/decisions.js +169 -0
- package/dist/src/orgrt/decisions.js.map +1 -0
- package/dist/src/orgrt/kimicode-runner.d.ts.map +1 -1
- package/dist/src/orgrt/kimicode-runner.js +5 -1
- package/dist/src/orgrt/kimicode-runner.js.map +1 -1
- package/dist/src/orgrt/opencode-runner.d.ts.map +1 -1
- package/dist/src/orgrt/opencode-runner.js +10 -2
- package/dist/src/orgrt/opencode-runner.js.map +1 -1
- package/dist/src/orgrt/org-memory.d.ts +45 -0
- package/dist/src/orgrt/org-memory.d.ts.map +1 -0
- package/dist/src/orgrt/org-memory.js +220 -0
- package/dist/src/orgrt/org-memory.js.map +1 -0
- package/dist/src/orgrt/policy.d.ts +4 -0
- package/dist/src/orgrt/policy.d.ts.map +1 -1
- package/dist/src/orgrt/policy.js +13 -1
- package/dist/src/orgrt/policy.js.map +1 -1
- package/dist/src/orgrt/prechecks.d.ts +15 -0
- package/dist/src/orgrt/prechecks.d.ts.map +1 -0
- package/dist/src/orgrt/prechecks.js +21 -0
- package/dist/src/orgrt/prechecks.js.map +1 -0
- package/dist/src/orgrt/questions.d.ts +39 -0
- package/dist/src/orgrt/questions.d.ts.map +1 -0
- package/dist/src/orgrt/questions.js +135 -0
- package/dist/src/orgrt/questions.js.map +1 -0
- package/dist/src/orgrt/remote.d.ts +25 -0
- package/dist/src/orgrt/remote.d.ts.map +1 -0
- package/dist/src/orgrt/remote.js +73 -0
- package/dist/src/orgrt/remote.js.map +1 -0
- package/dist/src/orgrt/scheduler-integration.d.ts +19 -0
- package/dist/src/orgrt/scheduler-integration.d.ts.map +1 -0
- package/dist/src/orgrt/scheduler-integration.js +90 -0
- package/dist/src/orgrt/scheduler-integration.js.map +1 -0
- package/dist/src/orgrt/server.d.ts.map +1 -1
- package/dist/src/orgrt/server.js +70 -2
- package/dist/src/orgrt/server.js.map +1 -1
- package/dist/src/orgrt/session.d.ts +30 -1
- package/dist/src/orgrt/session.d.ts.map +1 -1
- package/dist/src/orgrt/session.js +184 -53
- package/dist/src/orgrt/session.js.map +1 -1
- package/dist/src/orgrt/state-detector.d.ts +19 -0
- package/dist/src/orgrt/state-detector.d.ts.map +1 -0
- package/dist/src/orgrt/state-detector.js +59 -0
- package/dist/src/orgrt/state-detector.js.map +1 -0
- package/dist/src/orgrt/task-dag.d.ts +27 -0
- package/dist/src/orgrt/task-dag.d.ts.map +1 -0
- package/dist/src/orgrt/task-dag.js +100 -0
- package/dist/src/orgrt/task-dag.js.map +1 -0
- package/dist/src/orgrt/tool-fence.d.ts +7 -4
- package/dist/src/orgrt/tool-fence.d.ts.map +1 -1
- package/dist/src/orgrt/tool-fence.js +47 -6
- package/dist/src/orgrt/tool-fence.js.map +1 -1
- package/dist/src/orgrt/types.d.ts +57 -2
- package/dist/src/orgrt/types.d.ts.map +1 -1
- package/dist/src/orgrt/types.js +34 -3
- package/dist/src/orgrt/types.js.map +1 -1
- package/dist/src/routing/model-download.d.ts +49 -0
- package/dist/src/routing/model-download.d.ts.map +1 -0
- package/dist/src/routing/model-download.js +106 -0
- package/dist/src/routing/model-download.js.map +1 -0
- package/dist/src/services/crash-reporter.d.ts +5 -0
- package/dist/src/services/crash-reporter.d.ts.map +1 -1
- package/dist/src/services/crash-reporter.js +49 -0
- package/dist/src/services/crash-reporter.js.map +1 -1
- package/dist/src/transfer/anonymization/index.d.ts +18 -15
- package/dist/src/transfer/anonymization/index.d.ts.map +1 -1
- package/dist/src/transfer/anonymization/index.js +7 -119
- package/dist/src/transfer/anonymization/index.js.map +1 -1
- package/dist/src/ui/dashboard.html +606 -7
- package/dist/src/ui/orgs.html +7 -1
- package/dist/src/ui/routes-monograph.mjs +6 -0
- package/dist/src/ui/server.mjs +327 -7
- package/dist/src/update/checker.d.ts.map +1 -1
- package/dist/src/update/checker.js +2 -1
- package/dist/src/update/checker.js.map +1 -1
- package/dist/src/update/executor.d.ts.map +1 -1
- package/dist/src/update/executor.js +7 -3
- package/dist/src/update/executor.js.map +1 -1
- package/dist/src/update/index.d.ts +0 -1
- package/dist/src/update/index.d.ts.map +1 -1
- package/dist/src/update/index.js +5 -24
- package/dist/src/update/index.js.map +1 -1
- package/dist/src/utils/db-mutex.d.ts +11 -0
- package/dist/src/utils/db-mutex.d.ts.map +1 -0
- package/dist/src/utils/db-mutex.js +23 -0
- package/dist/src/utils/db-mutex.js.map +1 -0
- package/dist/src/utils/input-guards.d.ts +23 -0
- package/dist/src/utils/input-guards.d.ts.map +1 -1
- package/dist/src/utils/input-guards.js +72 -0
- package/dist/src/utils/input-guards.js.map +1 -1
- package/dist/src/utils/npm-command.d.ts +10 -0
- package/dist/src/utils/npm-command.d.ts.map +1 -0
- package/dist/src/utils/npm-command.js +12 -0
- package/dist/src/utils/npm-command.js.map +1 -0
- package/dist/src/utils/paths.d.ts +28 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +108 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +17 -17
- package/scripts/download-embedding-model.mjs +97 -0
- package/scripts/publish.sh +0 -0
- package/scripts/sync-claude-assets.sh +0 -0
- package/dist/src/production/circuit-breaker.d.ts +0 -121
- package/dist/src/production/circuit-breaker.d.ts.map +0 -1
- package/dist/src/production/circuit-breaker.js +0 -262
- package/dist/src/production/circuit-breaker.js.map +0 -1
- package/dist/src/production/error-handler.d.ts +0 -119
- package/dist/src/production/error-handler.d.ts.map +0 -1
- package/dist/src/production/error-handler.js +0 -324
- package/dist/src/production/error-handler.js.map +0 -1
- package/dist/src/production/index.d.ts +0 -6
- package/dist/src/production/index.d.ts.map +0 -1
- package/dist/src/production/index.js +0 -6
- package/dist/src/production/index.js.map +0 -1
- package/dist/src/production/monitoring.d.ts +0 -181
- package/dist/src/production/monitoring.d.ts.map +0 -1
- package/dist/src/production/monitoring.js +0 -375
- package/dist/src/production/monitoring.js.map +0 -1
- package/dist/src/production/rate-limiter.d.ts +0 -125
- package/dist/src/production/rate-limiter.d.ts.map +0 -1
- package/dist/src/production/rate-limiter.js +0 -218
- package/dist/src/production/rate-limiter.js.map +0 -1
- package/dist/src/production/retry.d.ts +0 -48
- package/dist/src/production/retry.d.ts.map +0 -1
- package/dist/src/production/retry.js +0 -189
- package/dist/src/production/retry.js.map +0 -1
- package/dist/src/transfer/types.d.ts +0 -245
- package/dist/src/transfer/types.d.ts.map +0 -1
- package/dist/src/transfer/types.js +0 -6
- package/dist/src/transfer/types.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@monoes/monomindcli",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.9.1",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "CLI engine for Monomind — an open-source MCP server that extends Claude Code with a codebase knowledge graph (tree-sitter + SQLite), persistent memory, multi-agent task coordination, and session hooks.
|
|
5
|
+
"description": "CLI engine for Monomind — an open-source MCP server that extends Claude Code with a codebase knowledge graph (tree-sitter + SQLite), persistent memory, multi-agent task coordination, and session hooks. Apache 2.0 licensed, fully local.",
|
|
6
6
|
"main": "dist/src/index.js",
|
|
7
7
|
"types": "dist/src/index.d.ts",
|
|
8
8
|
"sideEffects": false,
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"email": "nokhodian@gmail.com",
|
|
45
45
|
"url": "https://github.com/nokhodian"
|
|
46
46
|
},
|
|
47
|
-
"license": "
|
|
47
|
+
"license": "Apache-2.0",
|
|
48
48
|
"exports": {
|
|
49
49
|
".": {
|
|
50
50
|
"types": "./dist/src/index.d.ts",
|
|
@@ -82,17 +82,6 @@
|
|
|
82
82
|
"scripts",
|
|
83
83
|
"README.md"
|
|
84
84
|
],
|
|
85
|
-
"scripts": {
|
|
86
|
-
"prebuild": "node ../../../scripts/build-fs.mjs clean dist tsconfig.tsbuildinfo",
|
|
87
|
-
"build": "tsc && node ../../../scripts/build-fs.mjs copy-into dist/src/browser/dashboard src/browser/dashboard/ui.html && node ../../../scripts/build-fs.mjs copy-into dist/src/ui src/ui/dashboard.html src/ui/server.mjs src/ui/collector.mjs src/ui/orgs.html src/ui/orgs-files.js src/ui/sse-manager.mjs src/ui/routes-monograph.mjs src/ui/routes-org.mjs src/ui/mastermind-diagram-fallback.html && node ../../../scripts/build-fs.mjs clean dist/src/ui/data && node ../../../scripts/build-fs.mjs copy-dir src/ui/data dist/src/ui/data",
|
|
88
|
-
"build:loose": "tsc --noEmitOnError false || true && node ../../../scripts/build-fs.mjs copy-into dist/src/browser/dashboard src/browser/dashboard/ui.html && node ../../../scripts/build-fs.mjs copy-into dist/src/ui src/ui/dashboard.html src/ui/server.mjs src/ui/collector.mjs src/ui/orgs.html src/ui/orgs-files.js src/ui/sse-manager.mjs src/ui/routes-monograph.mjs src/ui/routes-org.mjs src/ui/mastermind-diagram-fallback.html && node ../../../scripts/build-fs.mjs clean dist/src/ui/data && node ../../../scripts/build-fs.mjs copy-dir src/ui/data dist/src/ui/data",
|
|
89
|
-
"test": "vitest run",
|
|
90
|
-
"test:coverage": "vitest run --coverage",
|
|
91
|
-
"test:pattern-store": "npx tsx src/transfer/store/tests/standalone-test.ts",
|
|
92
|
-
"prepublishOnly": "node ../../@monoes/monodesign/scripts/sync-skill.mjs && node ../../../scripts/build-fs.mjs copy-into . ../../../README.md && npm run build",
|
|
93
|
-
"release": "npm version prerelease --preid=alpha && npm run publish:all",
|
|
94
|
-
"publish:all": "./scripts/publish.sh"
|
|
95
|
-
},
|
|
96
85
|
"devDependencies": {
|
|
97
86
|
"tsx": "^4.21.0",
|
|
98
87
|
"typescript": "^7.0.2",
|
|
@@ -102,13 +91,13 @@
|
|
|
102
91
|
"@anthropic-ai/claude-agent-sdk": "^0.3.207",
|
|
103
92
|
"@monoes/monobrowse": "^1.0.6",
|
|
104
93
|
"@monoes/monodesign": "^1.2.2",
|
|
105
|
-
"@monoes/monograph": "^1.5.4",
|
|
106
94
|
"@noble/ed25519": "^2.1.0",
|
|
107
95
|
"mammoth": "^1.12.0",
|
|
108
96
|
"pdf-parse": "^2.4.5",
|
|
109
97
|
"ws": "^8.21.0",
|
|
110
98
|
"yaml": "^2.8.0",
|
|
111
|
-
"zod": "^4.0.0"
|
|
99
|
+
"zod": "^4.0.0",
|
|
100
|
+
"@monoes/monograph": "1.5.7"
|
|
112
101
|
},
|
|
113
102
|
"optionalDependencies": {
|
|
114
103
|
"@huggingface/transformers": "^3.8.1",
|
|
@@ -116,6 +105,7 @@
|
|
|
116
105
|
"@monoes/mcp": "^1.0.1",
|
|
117
106
|
"@monoes/memory": "^1.0.10",
|
|
118
107
|
"@monoes/routing": "^1.0.1",
|
|
108
|
+
"@opencode-ai/sdk": "^1.18.15",
|
|
119
109
|
"monofence-ai": "^1.0.2",
|
|
120
110
|
"sql.js": "^1.14.1"
|
|
121
111
|
},
|
|
@@ -125,5 +115,15 @@
|
|
|
125
115
|
},
|
|
126
116
|
"overrides": {
|
|
127
117
|
"onnxruntime-node": ">=1.27.0"
|
|
118
|
+
},
|
|
119
|
+
"scripts": {
|
|
120
|
+
"prebuild": "node ../../../scripts/build-fs.mjs clean dist tsconfig.tsbuildinfo",
|
|
121
|
+
"build": "tsc && node ../../../scripts/build-fs.mjs copy-into dist/src/browser/dashboard src/browser/dashboard/ui.html && node ../../../scripts/build-fs.mjs copy-into dist/src/ui src/ui/dashboard.html src/ui/server.mjs src/ui/collector.mjs src/ui/orgs.html src/ui/orgs-files.js src/ui/sse-manager.mjs src/ui/routes-monograph.mjs src/ui/routes-org.mjs src/ui/mastermind-diagram-fallback.html && node ../../../scripts/build-fs.mjs clean dist/src/ui/data && node ../../../scripts/build-fs.mjs copy-dir src/ui/data dist/src/ui/data",
|
|
122
|
+
"build:loose": "tsc --noEmitOnError false || true && node ../../../scripts/build-fs.mjs copy-into dist/src/browser/dashboard src/browser/dashboard/ui.html && node ../../../scripts/build-fs.mjs copy-into dist/src/ui src/ui/dashboard.html src/ui/server.mjs src/ui/collector.mjs src/ui/orgs.html src/ui/orgs-files.js src/ui/sse-manager.mjs src/ui/routes-monograph.mjs src/ui/routes-org.mjs src/ui/mastermind-diagram-fallback.html && node ../../../scripts/build-fs.mjs clean dist/src/ui/data && node ../../../scripts/build-fs.mjs copy-dir src/ui/data dist/src/ui/data",
|
|
123
|
+
"test": "vitest run",
|
|
124
|
+
"test:coverage": "vitest run --coverage",
|
|
125
|
+
"test:pattern-store": "npx tsx src/transfer/store/tests/standalone-test.ts",
|
|
126
|
+
"release": "npm version prerelease --preid=alpha && npm run publish:all",
|
|
127
|
+
"publish:all": "./scripts/publish.sh"
|
|
128
128
|
}
|
|
129
|
-
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Pre-seed the semantic-routing embedding model on a fresh install.
|
|
4
|
+
*
|
|
5
|
+
* The semantic router needs Snowflake/snowflake-arctic-embed-xs (~88 MB)
|
|
6
|
+
* cached on disk by @huggingface/transformers; without it, routing falls back
|
|
7
|
+
* to keyword mode. Nothing downloads these weights implicitly — run this
|
|
8
|
+
* script (or `monomind download-embeddings`) explicitly:
|
|
9
|
+
*
|
|
10
|
+
* node scripts/download-embedding-model.mjs
|
|
11
|
+
*
|
|
12
|
+
* Loading the pipeline once is all it takes — transformers.js populates its
|
|
13
|
+
* `.cache/` directory as a side effect. Exits 0 without downloading when the
|
|
14
|
+
* model is already cached.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { existsSync } from 'node:fs';
|
|
18
|
+
import { createRequire } from 'node:module';
|
|
19
|
+
import { dirname, join } from 'node:path';
|
|
20
|
+
|
|
21
|
+
const MODEL_ID = 'Snowflake/snowflake-arctic-embed-xs';
|
|
22
|
+
|
|
23
|
+
function findCacheDir() {
|
|
24
|
+
let entry;
|
|
25
|
+
try {
|
|
26
|
+
const require = createRequire(import.meta.url);
|
|
27
|
+
entry = require.resolve('@huggingface/transformers');
|
|
28
|
+
} catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
let dir = dirname(entry);
|
|
32
|
+
for (let i = 0; i < 5 && !existsSync(join(dir, 'package.json')); i++) {
|
|
33
|
+
const parent = dirname(dir);
|
|
34
|
+
if (parent === dir) break;
|
|
35
|
+
dir = parent;
|
|
36
|
+
}
|
|
37
|
+
return join(dir, '.cache');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function isCached(cacheDir) {
|
|
41
|
+
return (
|
|
42
|
+
existsSync(join(cacheDir, 'Snowflake')) ||
|
|
43
|
+
existsSync(join(cacheDir, 'Xenova'))
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async function main() {
|
|
48
|
+
const cacheDir = findCacheDir();
|
|
49
|
+
if (!cacheDir) {
|
|
50
|
+
console.error(
|
|
51
|
+
'Error: @huggingface/transformers is not installed (optionalDependency).\n' +
|
|
52
|
+
'Reinstall with optional dependencies enabled: npm install --include=optional',
|
|
53
|
+
);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (isCached(cacheDir)) {
|
|
58
|
+
console.log(`Embedding model already cached at ${cacheDir} — nothing to download.`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
console.log(`Downloading ${MODEL_ID} (~88 MB) into ${cacheDir} ...`);
|
|
63
|
+
|
|
64
|
+
let hf;
|
|
65
|
+
try {
|
|
66
|
+
hf = await import('@huggingface/transformers');
|
|
67
|
+
} catch (err) {
|
|
68
|
+
console.error(`Error: failed to load @huggingface/transformers: ${err.message}`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
let lastPct = -1;
|
|
73
|
+
try {
|
|
74
|
+
await hf.pipeline('feature-extraction', MODEL_ID, {
|
|
75
|
+
dtype: 'fp32',
|
|
76
|
+
progress_callback: (p) => {
|
|
77
|
+
if (!p || !p.file) return;
|
|
78
|
+
if (p.status === 'progress' && typeof p.progress === 'number') {
|
|
79
|
+
const pct = Math.floor(p.progress / 10) * 10;
|
|
80
|
+
if (pct !== lastPct) {
|
|
81
|
+
lastPct = pct;
|
|
82
|
+
console.log(` ${p.file}: ${pct}%`);
|
|
83
|
+
}
|
|
84
|
+
} else if (p.status === 'done') {
|
|
85
|
+
console.log(` ${p.file}: done`);
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
} catch (err) {
|
|
90
|
+
console.error(`Error: model download failed: ${err.message}`);
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
console.log('Embedding model cached — semantic routing is now available.');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
main();
|
package/scripts/publish.sh
CHANGED
|
File without changes
|
|
File without changes
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Production Circuit Breaker
|
|
3
|
-
*
|
|
4
|
-
* Implements the circuit breaker pattern to prevent cascading failures:
|
|
5
|
-
* - Closed: Normal operation
|
|
6
|
-
* - Open: Failing fast, not calling service
|
|
7
|
-
* - Half-Open: Testing if service recovered
|
|
8
|
-
*
|
|
9
|
-
* @module @monomind/cli/production/circuit-breaker
|
|
10
|
-
*/
|
|
11
|
-
/**
|
|
12
|
-
* Circuit breaker states.
|
|
13
|
-
* - `closed`: Normal operation, requests pass through.
|
|
14
|
-
* - `open`: Failing fast, requests are rejected immediately.
|
|
15
|
-
* - `half-open`: Testing recovery, a percentage of requests pass through.
|
|
16
|
-
*/
|
|
17
|
-
export type CircuitState = 'closed' | 'open' | 'half-open';
|
|
18
|
-
/**
|
|
19
|
-
* Circuit breaker configuration options.
|
|
20
|
-
*/
|
|
21
|
-
export interface CircuitBreakerConfig {
|
|
22
|
-
/** Number of failures within the window before opening the circuit. */
|
|
23
|
-
failureThreshold: number;
|
|
24
|
-
/** Time (ms) to wait in the open state before transitioning to half-open. */
|
|
25
|
-
resetTimeoutMs: number;
|
|
26
|
-
/** Number of consecutive successes in half-open before closing. */
|
|
27
|
-
successThreshold: number;
|
|
28
|
-
/** Sliding window (ms) over which failures are counted. */
|
|
29
|
-
failureWindowMs: number;
|
|
30
|
-
/** Fraction of requests (0-1) allowed through while half-open. */
|
|
31
|
-
halfOpenRequestPercentage: number;
|
|
32
|
-
/** Called when the circuit transitions to the open state. */
|
|
33
|
-
onOpen?: (failureCount: number) => void;
|
|
34
|
-
/** Called when the circuit transitions to the closed state. */
|
|
35
|
-
onClose?: () => void;
|
|
36
|
-
/** Called on any state transition. */
|
|
37
|
-
onStateChange?: (oldState: CircuitState, newState: CircuitState) => void;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Snapshot of circuit breaker statistics.
|
|
41
|
-
*/
|
|
42
|
-
export interface CircuitBreakerStats {
|
|
43
|
-
state: CircuitState;
|
|
44
|
-
failures: number;
|
|
45
|
-
successes: number;
|
|
46
|
-
lastFailure: Date | null;
|
|
47
|
-
lastSuccess: Date | null;
|
|
48
|
-
stateChangedAt: Date;
|
|
49
|
-
totalRequests: number;
|
|
50
|
-
totalFailures: number;
|
|
51
|
-
totalSuccesses: number;
|
|
52
|
-
}
|
|
53
|
-
export declare class CircuitBreaker {
|
|
54
|
-
private config;
|
|
55
|
-
private state;
|
|
56
|
-
private failures;
|
|
57
|
-
private successCount;
|
|
58
|
-
private stateChangedAt;
|
|
59
|
-
private totalRequests;
|
|
60
|
-
private totalFailures;
|
|
61
|
-
private totalSuccesses;
|
|
62
|
-
private lastFailure;
|
|
63
|
-
private lastSuccess;
|
|
64
|
-
constructor(config?: Partial<CircuitBreakerConfig>);
|
|
65
|
-
/**
|
|
66
|
-
* Get current circuit state
|
|
67
|
-
*/
|
|
68
|
-
getState(): CircuitState;
|
|
69
|
-
/**
|
|
70
|
-
* Check if request is allowed
|
|
71
|
-
*/
|
|
72
|
-
isAllowed(): boolean;
|
|
73
|
-
/**
|
|
74
|
-
* Execute a function through the circuit breaker
|
|
75
|
-
*/
|
|
76
|
-
execute<T>(fn: () => Promise<T>): Promise<T>;
|
|
77
|
-
/**
|
|
78
|
-
* Record a successful operation
|
|
79
|
-
*/
|
|
80
|
-
recordSuccess(): void;
|
|
81
|
-
/**
|
|
82
|
-
* Record a failed operation
|
|
83
|
-
*/
|
|
84
|
-
recordFailure(): void;
|
|
85
|
-
/**
|
|
86
|
-
* Manually open the circuit
|
|
87
|
-
*/
|
|
88
|
-
open(): void;
|
|
89
|
-
/**
|
|
90
|
-
* Manually close the circuit
|
|
91
|
-
*/
|
|
92
|
-
close(): void;
|
|
93
|
-
/**
|
|
94
|
-
* Reset the circuit breaker
|
|
95
|
-
*/
|
|
96
|
-
reset(): void;
|
|
97
|
-
/**
|
|
98
|
-
* Get circuit statistics
|
|
99
|
-
*/
|
|
100
|
-
getStats(): CircuitBreakerStats;
|
|
101
|
-
/**
|
|
102
|
-
* Get failure rate
|
|
103
|
-
*/
|
|
104
|
-
getFailureRate(): number;
|
|
105
|
-
private checkStateTransition;
|
|
106
|
-
private transitionTo;
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Get or create a circuit breaker by name
|
|
110
|
-
*/
|
|
111
|
-
export declare function getCircuitBreaker(name: string, config?: Partial<CircuitBreakerConfig>): CircuitBreaker;
|
|
112
|
-
/**
|
|
113
|
-
* Get all circuit breaker stats
|
|
114
|
-
*/
|
|
115
|
-
export declare function getAllCircuitStats(): Record<string, CircuitBreakerStats>;
|
|
116
|
-
/**
|
|
117
|
-
* Reset all circuit breakers
|
|
118
|
-
*/
|
|
119
|
-
export declare function resetAllCircuits(): void;
|
|
120
|
-
export default CircuitBreaker;
|
|
121
|
-
//# sourceMappingURL=circuit-breaker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../../src/production/circuit-breaker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,uEAAuE;IACvE,gBAAgB,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,cAAc,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,gBAAgB,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,yBAAyB,EAAE,MAAM,CAAC;IAClC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,sCAAsC;IACtC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1E;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,IAAI,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAkBD,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,WAAW,CAAqB;IAExC,YAAY,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM,EAErD;IAED;;OAEG;IACH,QAAQ,IAAI,YAAY,CAGvB;IAED;;OAEG;IACH,SAAS,IAAI,OAAO,CAiBnB;IAED;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAejD;IAED;;OAEG;IACH,aAAa,IAAI,IAAI,CAgBpB;IAED;;OAEG;IACH,aAAa,IAAI,IAAI,CAgCpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,CAIX;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAIZ;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAUZ;IAED;;OAEG;IACH,QAAQ,IAAI,mBAAmB,CAY9B;IAED;;OAEG;IACH,cAAc,IAAI,MAAM,CAGvB;IAMD,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,YAAY;CAyBrB;AAYD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,GACrC,cAAc,CAehB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAMxE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC;eAEc,cAAc"}
|
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Production Circuit Breaker
|
|
3
|
-
*
|
|
4
|
-
* Implements the circuit breaker pattern to prevent cascading failures:
|
|
5
|
-
* - Closed: Normal operation
|
|
6
|
-
* - Open: Failing fast, not calling service
|
|
7
|
-
* - Half-Open: Testing if service recovered
|
|
8
|
-
*
|
|
9
|
-
* @module @monomind/cli/production/circuit-breaker
|
|
10
|
-
*/
|
|
11
|
-
// ============================================================================
|
|
12
|
-
// Default Configuration
|
|
13
|
-
// ============================================================================
|
|
14
|
-
const DEFAULT_CONFIG = {
|
|
15
|
-
failureThreshold: 5,
|
|
16
|
-
resetTimeoutMs: 30000,
|
|
17
|
-
successThreshold: 3,
|
|
18
|
-
failureWindowMs: 60000,
|
|
19
|
-
halfOpenRequestPercentage: 0.1,
|
|
20
|
-
};
|
|
21
|
-
// ============================================================================
|
|
22
|
-
// Circuit Breaker Implementation
|
|
23
|
-
// ============================================================================
|
|
24
|
-
export class CircuitBreaker {
|
|
25
|
-
config;
|
|
26
|
-
state = 'closed';
|
|
27
|
-
failures = [];
|
|
28
|
-
successCount = 0;
|
|
29
|
-
stateChangedAt = Date.now();
|
|
30
|
-
totalRequests = 0;
|
|
31
|
-
totalFailures = 0;
|
|
32
|
-
totalSuccesses = 0;
|
|
33
|
-
lastFailure = null;
|
|
34
|
-
lastSuccess = null;
|
|
35
|
-
constructor(config = {}) {
|
|
36
|
-
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Get current circuit state
|
|
40
|
-
*/
|
|
41
|
-
getState() {
|
|
42
|
-
this.checkStateTransition();
|
|
43
|
-
return this.state;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Check if request is allowed
|
|
47
|
-
*/
|
|
48
|
-
isAllowed() {
|
|
49
|
-
this.checkStateTransition();
|
|
50
|
-
switch (this.state) {
|
|
51
|
-
case 'closed':
|
|
52
|
-
return true;
|
|
53
|
-
case 'open':
|
|
54
|
-
return false;
|
|
55
|
-
case 'half-open':
|
|
56
|
-
// Allow a percentage of requests through
|
|
57
|
-
return Math.random() < this.config.halfOpenRequestPercentage;
|
|
58
|
-
default:
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Execute a function through the circuit breaker
|
|
64
|
-
*/
|
|
65
|
-
async execute(fn) {
|
|
66
|
-
if (!this.isAllowed()) {
|
|
67
|
-
throw new Error('Circuit breaker is open. Service temporarily unavailable.');
|
|
68
|
-
}
|
|
69
|
-
this.totalRequests++;
|
|
70
|
-
try {
|
|
71
|
-
const result = await fn();
|
|
72
|
-
this.recordSuccess();
|
|
73
|
-
return result;
|
|
74
|
-
}
|
|
75
|
-
catch (error) {
|
|
76
|
-
this.recordFailure();
|
|
77
|
-
throw error;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Record a successful operation
|
|
82
|
-
*/
|
|
83
|
-
recordSuccess() {
|
|
84
|
-
this.totalSuccesses++;
|
|
85
|
-
this.lastSuccess = new Date();
|
|
86
|
-
if (this.state === 'half-open') {
|
|
87
|
-
this.successCount++;
|
|
88
|
-
if (this.successCount >= this.config.successThreshold) {
|
|
89
|
-
this.transitionTo('closed');
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// Reset failure count on success in closed state
|
|
93
|
-
if (this.state === 'closed') {
|
|
94
|
-
this.failures = [];
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Record a failed operation
|
|
99
|
-
*/
|
|
100
|
-
recordFailure() {
|
|
101
|
-
const now = Date.now();
|
|
102
|
-
this.totalFailures++;
|
|
103
|
-
this.lastFailure = new Date();
|
|
104
|
-
// Add failure timestamp
|
|
105
|
-
this.failures.push(now);
|
|
106
|
-
// Clean old failures outside window
|
|
107
|
-
this.failures = this.failures.filter(t => t > now - this.config.failureWindowMs);
|
|
108
|
-
// Hard cap: prevent unbounded growth under rapid-fire recordFailure() calls
|
|
109
|
-
// before the window filter prunes entries (e.g. clock skew or test hammering).
|
|
110
|
-
if (this.failures.length > 10_000) {
|
|
111
|
-
this.failures = this.failures.slice(-10_000);
|
|
112
|
-
}
|
|
113
|
-
// Check if we should open the circuit
|
|
114
|
-
if (this.state === 'closed' && this.failures.length >= this.config.failureThreshold) {
|
|
115
|
-
this.transitionTo('open');
|
|
116
|
-
if (this.config.onOpen) {
|
|
117
|
-
this.config.onOpen(this.failures.length);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
// If half-open and we fail, go back to open
|
|
121
|
-
if (this.state === 'half-open') {
|
|
122
|
-
this.transitionTo('open');
|
|
123
|
-
if (this.config.onOpen) {
|
|
124
|
-
this.config.onOpen(this.failures.length);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Manually open the circuit
|
|
130
|
-
*/
|
|
131
|
-
open() {
|
|
132
|
-
if (this.state !== 'open') {
|
|
133
|
-
this.transitionTo('open');
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Manually close the circuit
|
|
138
|
-
*/
|
|
139
|
-
close() {
|
|
140
|
-
if (this.state !== 'closed') {
|
|
141
|
-
this.transitionTo('closed');
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Reset the circuit breaker
|
|
146
|
-
*/
|
|
147
|
-
reset() {
|
|
148
|
-
this.state = 'closed';
|
|
149
|
-
this.failures = [];
|
|
150
|
-
this.successCount = 0;
|
|
151
|
-
this.stateChangedAt = Date.now();
|
|
152
|
-
this.totalRequests = 0;
|
|
153
|
-
this.totalFailures = 0;
|
|
154
|
-
this.totalSuccesses = 0;
|
|
155
|
-
this.lastFailure = null;
|
|
156
|
-
this.lastSuccess = null;
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Get circuit statistics
|
|
160
|
-
*/
|
|
161
|
-
getStats() {
|
|
162
|
-
return {
|
|
163
|
-
state: this.state,
|
|
164
|
-
failures: this.failures.length,
|
|
165
|
-
successes: this.successCount,
|
|
166
|
-
lastFailure: this.lastFailure,
|
|
167
|
-
lastSuccess: this.lastSuccess,
|
|
168
|
-
stateChangedAt: new Date(this.stateChangedAt),
|
|
169
|
-
totalRequests: this.totalRequests,
|
|
170
|
-
totalFailures: this.totalFailures,
|
|
171
|
-
totalSuccesses: this.totalSuccesses,
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Get failure rate
|
|
176
|
-
*/
|
|
177
|
-
getFailureRate() {
|
|
178
|
-
if (this.totalRequests === 0)
|
|
179
|
-
return 0;
|
|
180
|
-
return this.totalFailures / this.totalRequests;
|
|
181
|
-
}
|
|
182
|
-
// ============================================================================
|
|
183
|
-
// Private Methods
|
|
184
|
-
// ============================================================================
|
|
185
|
-
checkStateTransition() {
|
|
186
|
-
const now = Date.now();
|
|
187
|
-
if (this.state === 'open') {
|
|
188
|
-
// Check if we should transition to half-open
|
|
189
|
-
if (now - this.stateChangedAt >= this.config.resetTimeoutMs) {
|
|
190
|
-
this.transitionTo('half-open');
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
transitionTo(newState) {
|
|
195
|
-
const oldState = this.state;
|
|
196
|
-
if (oldState === newState)
|
|
197
|
-
return;
|
|
198
|
-
this.state = newState;
|
|
199
|
-
this.stateChangedAt = Date.now();
|
|
200
|
-
// Reset counters on state change
|
|
201
|
-
if (newState === 'half-open') {
|
|
202
|
-
this.successCount = 0;
|
|
203
|
-
}
|
|
204
|
-
if (newState === 'closed') {
|
|
205
|
-
this.failures = [];
|
|
206
|
-
this.successCount = 0;
|
|
207
|
-
if (this.config.onClose) {
|
|
208
|
-
this.config.onClose();
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
// Notify state change
|
|
212
|
-
if (this.config.onStateChange) {
|
|
213
|
-
this.config.onStateChange(oldState, newState);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
// ============================================================================
|
|
218
|
-
// Circuit Breaker Registry
|
|
219
|
-
// ============================================================================
|
|
220
|
-
const circuitBreakers = new Map();
|
|
221
|
-
const MAX_CIRCUIT_BREAKERS = 1000;
|
|
222
|
-
const MAX_CIRCUIT_BREAKER_NAME_LEN = 256;
|
|
223
|
-
const FORBIDDEN_CB_NAMES = new Set(['__proto__', 'constructor', 'prototype']);
|
|
224
|
-
/**
|
|
225
|
-
* Get or create a circuit breaker by name
|
|
226
|
-
*/
|
|
227
|
-
export function getCircuitBreaker(name, config) {
|
|
228
|
-
// Sanitize name: cap length and block prototype-pollution keys
|
|
229
|
-
const safeName = typeof name === 'string'
|
|
230
|
-
? name.slice(0, MAX_CIRCUIT_BREAKER_NAME_LEN)
|
|
231
|
-
: 'default';
|
|
232
|
-
if (FORBIDDEN_CB_NAMES.has(safeName)) {
|
|
233
|
-
throw new Error(`Invalid circuit breaker name: ${safeName}`);
|
|
234
|
-
}
|
|
235
|
-
if (!circuitBreakers.has(safeName)) {
|
|
236
|
-
if (circuitBreakers.size >= MAX_CIRCUIT_BREAKERS) {
|
|
237
|
-
throw new Error(`Circuit breaker registry full (max ${MAX_CIRCUIT_BREAKERS})`);
|
|
238
|
-
}
|
|
239
|
-
circuitBreakers.set(safeName, new CircuitBreaker(config));
|
|
240
|
-
}
|
|
241
|
-
return circuitBreakers.get(safeName);
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* Get all circuit breaker stats
|
|
245
|
-
*/
|
|
246
|
-
export function getAllCircuitStats() {
|
|
247
|
-
const stats = {};
|
|
248
|
-
for (const [name, breaker] of circuitBreakers) {
|
|
249
|
-
stats[name] = breaker.getStats();
|
|
250
|
-
}
|
|
251
|
-
return stats;
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Reset all circuit breakers
|
|
255
|
-
*/
|
|
256
|
-
export function resetAllCircuits() {
|
|
257
|
-
for (const breaker of circuitBreakers.values()) {
|
|
258
|
-
breaker.reset();
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
export default CircuitBreaker;
|
|
262
|
-
//# sourceMappingURL=circuit-breaker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../src/production/circuit-breaker.ts"],"names":[],"mappings":"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"}
|