@claude-flow/cli 3.32.3 → 3.32.4
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/helpers.manifest.json +2 -2
- package/catalog-manifest.json +2 -2
- package/dist/src/agenticow/speculative-exploration.d.ts +148 -0
- package/dist/src/agenticow/speculative-exploration.js +218 -0
- package/dist/src/appliance/gguf-engine.d.ts +91 -0
- package/dist/src/appliance/gguf-engine.js +425 -0
- package/dist/src/appliance/ruvllm-bridge.d.ts +102 -0
- package/dist/src/appliance/ruvllm-bridge.js +292 -0
- package/dist/src/appliance/rvfa-builder.d.ts +44 -0
- package/dist/src/appliance/rvfa-builder.js +329 -0
- package/dist/src/appliance/rvfa-distribution.d.ts +97 -0
- package/dist/src/appliance/rvfa-distribution.js +370 -0
- package/dist/src/appliance/rvfa-format.d.ts +111 -0
- package/dist/src/appliance/rvfa-format.js +393 -0
- package/dist/src/appliance/rvfa-runner.d.ts +69 -0
- package/dist/src/appliance/rvfa-runner.js +237 -0
- package/dist/src/appliance/rvfa-signing.d.ts +123 -0
- package/dist/src/appliance/rvfa-signing.js +347 -0
- package/dist/src/auth/client.d.ts +89 -0
- package/dist/src/auth/client.js +242 -0
- package/dist/src/auth/constants.d.ts +7 -0
- package/dist/src/auth/constants.js +7 -0
- package/dist/src/auth/scopes.d.ts +14 -0
- package/dist/src/auth/scopes.js +21 -0
- package/dist/src/auth/security-bridge.d.ts +36 -0
- package/dist/src/auth/security-bridge.js +42 -0
- package/dist/src/auth/session.d.ts +20 -0
- package/dist/src/auth/session.js +32 -0
- package/dist/src/auth/state.d.ts +19 -0
- package/dist/src/auth/state.js +53 -0
- package/dist/src/auth/types.d.ts +27 -0
- package/dist/src/auth/types.js +11 -0
- package/dist/src/autopilot-state.d.ts +77 -0
- package/dist/src/autopilot-state.js +271 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.d.ts +18 -0
- package/dist/src/benchmarks/gaia-agent-planning.smoke.js +253 -0
- package/dist/src/benchmarks/gaia-agent.d.ts +198 -0
- package/dist/src/benchmarks/gaia-agent.js +651 -0
- package/dist/src/benchmarks/gaia-causal-memory.d.ts +133 -0
- package/dist/src/benchmarks/gaia-causal-memory.js +281 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.d.ts +22 -0
- package/dist/src/benchmarks/gaia-causal-memory.smoke.js +300 -0
- package/dist/src/benchmarks/gaia-convergence.d.ts +138 -0
- package/dist/src/benchmarks/gaia-convergence.js +260 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.d.ts +19 -0
- package/dist/src/benchmarks/gaia-convergence.smoke.js +246 -0
- package/dist/src/benchmarks/gaia-critic.d.ts +123 -0
- package/dist/src/benchmarks/gaia-critic.js +312 -0
- package/dist/src/benchmarks/gaia-critic.smoke.d.ts +21 -0
- package/dist/src/benchmarks/gaia-critic.smoke.js +327 -0
- package/dist/src/benchmarks/gaia-decomposer.d.ts +125 -0
- package/dist/src/benchmarks/gaia-decomposer.js +350 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.d.ts +21 -0
- package/dist/src/benchmarks/gaia-decomposer.smoke.js +228 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.d.ts +27 -0
- package/dist/src/benchmarks/gaia-e2e-smoke.js +136 -0
- package/dist/src/benchmarks/gaia-extract.smoke.d.ts +45 -0
- package/dist/src/benchmarks/gaia-extract.smoke.js +242 -0
- package/dist/src/benchmarks/gaia-hardness/features.d.ts +46 -0
- package/dist/src/benchmarks/gaia-hardness/features.js +170 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.d.ts +105 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.js +260 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.d.ts +20 -0
- package/dist/src/benchmarks/gaia-hardness/predictor.smoke.js +235 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.d.ts +51 -0
- package/dist/src/benchmarks/gaia-hardness/train-data-loader.js +179 -0
- package/dist/src/benchmarks/gaia-judge.d.ts +88 -0
- package/dist/src/benchmarks/gaia-judge.js +437 -0
- package/dist/src/benchmarks/gaia-loader.d.ts +87 -0
- package/dist/src/benchmarks/gaia-loader.js +326 -0
- package/dist/src/benchmarks/gaia-tools/file_read.d.ts +35 -0
- package/dist/src/benchmarks/gaia-tools/file_read.js +403 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.d.ts +126 -0
- package/dist/src/benchmarks/gaia-tools/grounded_query.js +225 -0
- package/dist/src/benchmarks/gaia-tools/index.d.ts +32 -0
- package/dist/src/benchmarks/gaia-tools/index.js +36 -0
- package/dist/src/benchmarks/gaia-tools/types.d.ts +62 -0
- package/dist/src/benchmarks/gaia-tools/types.js +12 -0
- package/dist/src/benchmarks/gaia-tools/web_search.d.ts +30 -0
- package/dist/src/benchmarks/gaia-tools/web_search.js +210 -0
- package/dist/src/benchmarks/gaia-voting.d.ts +88 -0
- package/dist/src/benchmarks/gaia-voting.js +297 -0
- package/dist/src/benchmarks/gaia-voting.smoke.d.ts +20 -0
- package/dist/src/benchmarks/gaia-voting.smoke.js +332 -0
- package/dist/src/benchmarks/pretrain/index.d.ts +58 -0
- package/dist/src/benchmarks/pretrain/index.js +404 -0
- package/dist/src/business-pods/bbs-budget-tracker.d.ts +139 -0
- package/dist/src/business-pods/bbs-budget-tracker.js +358 -0
- package/dist/src/business-pods/domain-affinity-policy.d.ts +47 -0
- package/dist/src/business-pods/domain-affinity-policy.js +65 -0
- package/dist/src/business-pods/pod-schema.d.ts +96 -0
- package/dist/src/business-pods/pod-schema.js +225 -0
- package/dist/src/commands/advisor.d.ts +15 -0
- package/dist/src/commands/advisor.js +94 -0
- package/dist/src/commands/agent-wasm.d.ts +14 -0
- package/dist/src/commands/agent-wasm.js +333 -0
- package/dist/src/commands/agent.d.ts +8 -0
- package/dist/src/commands/agent.js +927 -0
- package/dist/src/commands/analyze.d.ts +19 -0
- package/dist/src/commands/analyze.js +2047 -0
- package/dist/src/commands/announcements.d.ts +17 -0
- package/dist/src/commands/announcements.js +0 -0
- package/dist/src/commands/appliance-advanced.d.ts +9 -0
- package/dist/src/commands/appliance-advanced.js +215 -0
- package/dist/src/commands/appliance.d.ts +8 -0
- package/dist/src/commands/appliance.js +404 -0
- package/dist/src/commands/auth.d.ts +15 -0
- package/dist/src/commands/auth.js +244 -0
- package/dist/src/commands/autopilot.d.ts +15 -0
- package/dist/src/commands/autopilot.js +407 -0
- package/dist/src/commands/benchmark.d.ts +10 -0
- package/dist/src/commands/benchmark.js +460 -0
- package/dist/src/commands/claims.d.ts +10 -0
- package/dist/src/commands/claims.js +620 -0
- package/dist/src/commands/cleanup.d.ts +13 -0
- package/dist/src/commands/cleanup.js +250 -0
- package/dist/src/commands/completions.d.ts +10 -0
- package/dist/src/commands/completions.js +539 -0
- package/dist/src/commands/config.d.ts +8 -0
- package/dist/src/commands/config.js +428 -0
- package/dist/src/commands/daemon.d.ts +59 -0
- package/dist/src/commands/daemon.js +1733 -0
- package/dist/src/commands/deployment.d.ts +10 -0
- package/dist/src/commands/deployment.js +672 -0
- package/dist/src/commands/doctor.d.ts +10 -0
- package/dist/src/commands/doctor.js +1902 -0
- package/dist/src/commands/eject.d.ts +33 -0
- package/dist/src/commands/eject.js +195 -0
- package/dist/src/commands/embeddings.d.ts +18 -0
- package/dist/src/commands/embeddings.js +1623 -0
- package/dist/src/commands/funnel.d.ts +18 -0
- package/dist/src/commands/funnel.js +302 -0
- package/dist/src/commands/gaia-bench.d.ts +40 -0
- package/dist/src/commands/gaia-bench.js +597 -0
- package/dist/src/commands/guidance.d.ts +8 -0
- package/dist/src/commands/guidance.js +556 -0
- package/dist/src/commands/hive-mind.d.ts +11 -0
- package/dist/src/commands/hive-mind.js +1319 -0
- package/dist/src/commands/hooks.d.ts +8 -0
- package/dist/src/commands/hooks.js +4606 -0
- package/dist/src/commands/index.d.ts +118 -0
- package/dist/src/commands/index.js +366 -0
- package/dist/src/commands/init.d.ts +13 -0
- package/dist/src/commands/init.js +1297 -0
- package/dist/src/commands/issues.d.ts +21 -0
- package/dist/src/commands/issues.js +567 -0
- package/dist/src/commands/mcp.d.ts +11 -0
- package/dist/src/commands/mcp.js +732 -0
- package/dist/src/commands/memory-backup.d.ts +11 -0
- package/dist/src/commands/memory-backup.js +46 -0
- package/dist/src/commands/memory-distill.d.ts +27 -0
- package/dist/src/commands/memory-distill.js +374 -0
- package/dist/src/commands/memory.d.ts +8 -0
- package/dist/src/commands/memory.js +1596 -0
- package/dist/src/commands/metaharness.d.ts +39 -0
- package/dist/src/commands/metaharness.js +215 -0
- package/dist/src/commands/migrate.d.ts +8 -0
- package/dist/src/commands/migrate.js +742 -0
- package/dist/src/commands/neural.d.ts +10 -0
- package/dist/src/commands/neural.js +4331 -0
- package/dist/src/commands/performance.d.ts +10 -0
- package/dist/src/commands/performance.js +583 -0
- package/dist/src/commands/plugins.d.ts +11 -0
- package/dist/src/commands/plugins.js +826 -0
- package/dist/src/commands/process.d.ts +10 -0
- package/dist/src/commands/process.js +694 -0
- package/dist/src/commands/progress.d.ts +11 -0
- package/dist/src/commands/progress.js +259 -0
- package/dist/src/commands/providers.d.ts +10 -0
- package/dist/src/commands/providers.js +502 -0
- package/dist/src/commands/proxy-lifecycle.d.ts +12 -0
- package/dist/src/commands/proxy-lifecycle.js +232 -0
- package/dist/src/commands/proxy.d.ts +21 -0
- package/dist/src/commands/proxy.js +398 -0
- package/dist/src/commands/route.d.ts +16 -0
- package/dist/src/commands/route.js +822 -0
- package/dist/src/commands/ruvector/backup.d.ts +11 -0
- package/dist/src/commands/ruvector/backup.js +747 -0
- package/dist/src/commands/ruvector/benchmark.d.ts +11 -0
- package/dist/src/commands/ruvector/benchmark.js +490 -0
- package/dist/src/commands/ruvector/import.d.ts +18 -0
- package/dist/src/commands/ruvector/import.js +373 -0
- package/dist/src/commands/ruvector/index.d.ts +29 -0
- package/dist/src/commands/ruvector/index.js +129 -0
- package/dist/src/commands/ruvector/init.d.ts +11 -0
- package/dist/src/commands/ruvector/init.js +467 -0
- package/dist/src/commands/ruvector/migrate.d.ts +11 -0
- package/dist/src/commands/ruvector/migrate.js +498 -0
- package/dist/src/commands/ruvector/optimize.d.ts +11 -0
- package/dist/src/commands/ruvector/optimize.js +505 -0
- package/dist/src/commands/ruvector/pg-utils.d.ts +14 -0
- package/dist/src/commands/ruvector/pg-utils.js +41 -0
- package/dist/src/commands/ruvector/setup.d.ts +18 -0
- package/dist/src/commands/ruvector/setup.js +765 -0
- package/dist/src/commands/ruvector/status.d.ts +11 -0
- package/dist/src/commands/ruvector/status.js +479 -0
- package/dist/src/commands/security.d.ts +10 -0
- package/dist/src/commands/security.js +1012 -0
- package/dist/src/commands/session.d.ts +8 -0
- package/dist/src/commands/session.js +757 -0
- package/dist/src/commands/settings.d.ts +19 -0
- package/dist/src/commands/settings.js +180 -0
- package/dist/src/commands/spinner.d.ts +16 -0
- package/dist/src/commands/spinner.js +329 -0
- package/dist/src/commands/start.d.ts +8 -0
- package/dist/src/commands/start.js +418 -0
- package/dist/src/commands/status.d.ts +8 -0
- package/dist/src/commands/status.js +608 -0
- package/dist/src/commands/swarm.d.ts +8 -0
- package/dist/src/commands/swarm.js +891 -0
- package/dist/src/commands/task.d.ts +8 -0
- package/dist/src/commands/task.js +675 -0
- package/dist/src/commands/transfer-store.d.ts +13 -0
- package/dist/src/commands/transfer-store.js +428 -0
- package/dist/src/commands/update.d.ts +8 -0
- package/dist/src/commands/update.js +276 -0
- package/dist/src/commands/verify.d.ts +19 -0
- package/dist/src/commands/verify.js +261 -0
- package/dist/src/commands/version.d.ts +42 -0
- package/dist/src/commands/version.js +106 -0
- package/dist/src/commands/workflow.d.ts +8 -0
- package/dist/src/commands/workflow.js +617 -0
- package/dist/src/config/harness-feedback-applier.d.ts +50 -0
- package/dist/src/config/harness-feedback-applier.js +122 -0
- package/dist/src/config/proven-config-refresh.d.ts +39 -0
- package/dist/src/config/proven-config-refresh.js +154 -0
- package/dist/src/config/proven-config-rvfa.d.ts +23 -0
- package/dist/src/config/proven-config-rvfa.js +73 -0
- package/dist/src/config/proven-config.d.ts +86 -0
- package/dist/src/config/proven-config.js +176 -0
- package/dist/src/config-adapter.d.ts +15 -0
- package/dist/src/config-adapter.js +186 -0
- package/dist/src/encryption/vault.d.ts +94 -0
- package/dist/src/encryption/vault.js +172 -0
- package/dist/src/fs-secure.d.ts +86 -0
- package/dist/src/fs-secure.js +133 -0
- package/dist/src/funnel/advisor-tip.d.ts +58 -0
- package/dist/src/funnel/advisor-tip.js +92 -0
- package/dist/src/funnel/attribution.d.ts +37 -0
- package/dist/src/funnel/attribution.js +101 -0
- package/dist/src/funnel/consent.d.ts +22 -0
- package/dist/src/funnel/consent.js +58 -0
- package/dist/src/funnel/credit-errors.d.ts +31 -0
- package/dist/src/funnel/credit-errors.js +88 -0
- package/dist/src/funnel/credit-notifier.d.ts +44 -0
- package/dist/src/funnel/credit-notifier.js +74 -0
- package/dist/src/funnel/disclosure.d.ts +47 -0
- package/dist/src/funnel/disclosure.js +109 -0
- package/dist/src/funnel/enrollment.d.ts +36 -0
- package/dist/src/funnel/enrollment.js +64 -0
- package/dist/src/funnel/environment.d.ts +17 -0
- package/dist/src/funnel/environment.js +39 -0
- package/dist/src/funnel/event-transport.d.ts +51 -0
- package/dist/src/funnel/event-transport.js +199 -0
- package/dist/src/funnel/events.d.ts +42 -0
- package/dist/src/funnel/events.js +150 -0
- package/dist/src/funnel/index.d.ts +21 -0
- package/dist/src/funnel/index.js +21 -0
- package/dist/src/funnel/insights.d.ts +50 -0
- package/dist/src/funnel/insights.js +120 -0
- package/dist/src/funnel/local-signals.d.ts +20 -0
- package/dist/src/funnel/local-signals.js +77 -0
- package/dist/src/funnel/message-transport.d.ts +51 -0
- package/dist/src/funnel/message-transport.js +149 -0
- package/dist/src/funnel/messages.d.ts +55 -0
- package/dist/src/funnel/messages.js +160 -0
- package/dist/src/funnel/payout.d.ts +40 -0
- package/dist/src/funnel/payout.js +60 -0
- package/dist/src/funnel/power-saver-notifier.d.ts +44 -0
- package/dist/src/funnel/power-saver-notifier.js +92 -0
- package/dist/src/funnel/precedence.d.ts +16 -0
- package/dist/src/funnel/precedence.js +85 -0
- package/dist/src/funnel/promo.d.ts +41 -0
- package/dist/src/funnel/promo.js +144 -0
- package/dist/src/funnel/rate-limit-notifier.d.ts +55 -0
- package/dist/src/funnel/rate-limit-notifier.js +102 -0
- package/dist/src/funnel/rotation.d.ts +19 -0
- package/dist/src/funnel/rotation.js +70 -0
- package/dist/src/funnel/state.d.ts +13 -0
- package/dist/src/funnel/state.js +52 -0
- package/dist/src/funnel/toggle-cooldown.d.ts +17 -0
- package/dist/src/funnel/toggle-cooldown.js +32 -0
- package/dist/src/funnel/types.d.ts +98 -0
- package/dist/src/funnel/types.js +26 -0
- package/dist/src/index.d.ts +81 -0
- package/dist/src/index.js +609 -0
- package/dist/src/infrastructure/in-memory-repositories.d.ts +68 -0
- package/dist/src/infrastructure/in-memory-repositories.js +264 -0
- package/dist/src/init/claudemd-generator.d.ts +16 -0
- package/dist/src/init/claudemd-generator.js +368 -0
- package/dist/src/init/executor.d.ts +41 -0
- package/dist/src/init/executor.js +2142 -0
- package/dist/src/init/helper-refresh.d.ts +79 -0
- package/dist/src/init/helper-refresh.js +347 -0
- package/dist/src/init/helper-signing.d.ts +37 -0
- package/dist/src/init/helper-signing.js +67 -0
- package/dist/src/init/helpers-generator.d.ts +87 -0
- package/dist/src/init/helpers-generator.js +1456 -0
- package/dist/src/init/index.d.ts +13 -0
- package/dist/src/init/index.js +15 -0
- package/dist/src/init/mcp-generator.d.ts +26 -0
- package/dist/src/init/mcp-generator.js +126 -0
- package/dist/src/init/memory-package-resolver.d.ts +53 -0
- package/dist/src/init/memory-package-resolver.js +118 -0
- package/dist/src/init/settings-generator.d.ts +14 -0
- package/dist/src/init/settings-generator.js +462 -0
- package/dist/src/init/statusline-generator.d.ts +28 -0
- package/dist/src/init/statusline-generator.js +177 -0
- package/dist/src/init/types.d.ts +331 -0
- package/dist/src/init/types.js +276 -0
- package/dist/src/log-filters.d.ts +46 -0
- package/dist/src/log-filters.js +107 -0
- package/dist/src/mcp-client.d.ts +92 -0
- package/dist/src/mcp-client.js +397 -0
- package/dist/src/mcp-server.d.ts +163 -0
- package/dist/src/mcp-server.js +751 -0
- package/dist/src/mcp-tools/agent-execute-core.d.ts +115 -0
- package/dist/src/mcp-tools/agent-execute-core.js +587 -0
- package/dist/src/mcp-tools/agent-tools.d.ts +9 -0
- package/dist/src/mcp-tools/agent-tools.js +837 -0
- package/dist/src/mcp-tools/agentbbs-tools.d.ts +28 -0
- package/dist/src/mcp-tools/agentbbs-tools.js +394 -0
- package/dist/src/mcp-tools/agentdb-tools.d.ts +35 -0
- package/dist/src/mcp-tools/agentdb-tools.js +1473 -0
- package/dist/src/mcp-tools/agenticow-loader.d.ts +59 -0
- package/dist/src/mcp-tools/agenticow-loader.js +105 -0
- package/dist/src/mcp-tools/agenticow-speculate-tools.d.ts +24 -0
- package/dist/src/mcp-tools/agenticow-speculate-tools.js +209 -0
- package/dist/src/mcp-tools/agenticow-tools.d.ts +36 -0
- package/dist/src/mcp-tools/agenticow-tools.js +360 -0
- package/dist/src/mcp-tools/analyze-tools.d.ts +38 -0
- package/dist/src/mcp-tools/analyze-tools.js +346 -0
- package/dist/src/mcp-tools/auto-install.d.ts +83 -0
- package/dist/src/mcp-tools/auto-install.js +131 -0
- package/dist/src/mcp-tools/autopilot-tools.d.ts +12 -0
- package/dist/src/mcp-tools/autopilot-tools.js +231 -0
- package/dist/src/mcp-tools/browser-intent-tools.d.ts +162 -0
- package/dist/src/mcp-tools/browser-intent-tools.js +548 -0
- package/dist/src/mcp-tools/browser-session-tools.d.ts +27 -0
- package/dist/src/mcp-tools/browser-session-tools.js +398 -0
- package/dist/src/mcp-tools/browser-tools.d.ts +21 -0
- package/dist/src/mcp-tools/browser-tools.js +760 -0
- package/dist/src/mcp-tools/business-pod-tools.d.ts +20 -0
- package/dist/src/mcp-tools/business-pod-tools.js +169 -0
- package/dist/src/mcp-tools/claims-tools.d.ts +12 -0
- package/dist/src/mcp-tools/claims-tools.js +863 -0
- package/dist/src/mcp-tools/config-tools.d.ts +8 -0
- package/dist/src/mcp-tools/config-tools.js +411 -0
- package/dist/src/mcp-tools/coordination-tools.d.ts +13 -0
- package/dist/src/mcp-tools/coordination-tools.js +729 -0
- package/dist/src/mcp-tools/daa-tools.d.ts +13 -0
- package/dist/src/mcp-tools/daa-tools.js +534 -0
- package/dist/src/mcp-tools/embeddings-tools.d.ts +9 -0
- package/dist/src/mcp-tools/embeddings-tools.js +904 -0
- package/dist/src/mcp-tools/github-tools.d.ts +9 -0
- package/dist/src/mcp-tools/github-tools.js +659 -0
- package/dist/src/mcp-tools/guidance-tools.d.ts +15 -0
- package/dist/src/mcp-tools/guidance-tools.js +639 -0
- package/dist/src/mcp-tools/hive-mind-tools.d.ts +8 -0
- package/dist/src/mcp-tools/hive-mind-tools.js +953 -0
- package/dist/src/mcp-tools/hooks-tools.d.ts +65 -0
- package/dist/src/mcp-tools/hooks-tools.js +4836 -0
- package/dist/src/mcp-tools/http-fetch-tools.d.ts +55 -0
- package/dist/src/mcp-tools/http-fetch-tools.js +329 -0
- package/dist/src/mcp-tools/index.d.ts +34 -0
- package/dist/src/mcp-tools/index.js +40 -0
- package/dist/src/mcp-tools/managed-agent-tools.d.ts +22 -0
- package/dist/src/mcp-tools/managed-agent-tools.js +357 -0
- package/dist/src/mcp-tools/memory-tools.d.ts +14 -0
- package/dist/src/mcp-tools/memory-tools.js +1330 -0
- package/dist/src/mcp-tools/metaharness-tools.d.ts +51 -0
- package/dist/src/mcp-tools/metaharness-tools.js +684 -0
- package/dist/src/mcp-tools/neural-tools.d.ts +54 -0
- package/dist/src/mcp-tools/neural-tools.js +1168 -0
- package/dist/src/mcp-tools/performance-tools.d.ts +16 -0
- package/dist/src/mcp-tools/performance-tools.js +675 -0
- package/dist/src/mcp-tools/progress-tools.d.ts +14 -0
- package/dist/src/mcp-tools/progress-tools.js +348 -0
- package/dist/src/mcp-tools/request-tracker.d.ts +17 -0
- package/dist/src/mcp-tools/request-tracker.js +27 -0
- package/dist/src/mcp-tools/ruvllm-tools.d.ts +9 -0
- package/dist/src/mcp-tools/ruvllm-tools.js +355 -0
- package/dist/src/mcp-tools/security-tools.d.ts +18 -0
- package/dist/src/mcp-tools/security-tools.js +556 -0
- package/dist/src/mcp-tools/session-tools.d.ts +8 -0
- package/dist/src/mcp-tools/session-tools.js +517 -0
- package/dist/src/mcp-tools/swarm-tools.d.ts +37 -0
- package/dist/src/mcp-tools/swarm-tools.js +390 -0
- package/dist/src/mcp-tools/system-tools.d.ts +13 -0
- package/dist/src/mcp-tools/system-tools.js +688 -0
- package/dist/src/mcp-tools/task-tools.d.ts +8 -0
- package/dist/src/mcp-tools/task-tools.js +487 -0
- package/dist/src/mcp-tools/terminal-tools.d.ts +8 -0
- package/dist/src/mcp-tools/terminal-tools.js +306 -0
- package/dist/src/mcp-tools/testgen-tools.d.ts +26 -0
- package/dist/src/mcp-tools/testgen-tools.js +168 -0
- package/dist/src/mcp-tools/tool-loop-guardrail.d.ts +31 -0
- package/dist/src/mcp-tools/tool-loop-guardrail.js +71 -0
- package/dist/src/mcp-tools/transfer-tools.d.ts +14 -0
- package/dist/src/mcp-tools/transfer-tools.js +447 -0
- package/dist/src/mcp-tools/types.d.ts +8 -0
- package/dist/src/mcp-tools/types.js +8 -0
- package/dist/src/mcp-tools/validate-input.d.ts +9 -0
- package/dist/src/mcp-tools/validate-input.js +9 -0
- package/dist/src/mcp-tools/wasm-agent-tools.d.ts +13 -0
- package/dist/src/mcp-tools/wasm-agent-tools.js +840 -0
- package/dist/src/mcp-tools/workflow-tools.d.ts +8 -0
- package/dist/src/mcp-tools/workflow-tools.js +884 -0
- package/dist/src/memory/bge-embedder.d.ts +25 -0
- package/dist/src/memory/bge-embedder.js +121 -0
- package/dist/src/memory/cross-encoder-rerank.d.ts +33 -0
- package/dist/src/memory/cross-encoder-rerank.js +123 -0
- package/dist/src/memory/embedding-policy.d.ts +21 -0
- package/dist/src/memory/embedding-policy.js +30 -0
- package/dist/src/memory/embedding-quantization.d.ts +62 -0
- package/dist/src/memory/embedding-quantization.js +156 -0
- package/dist/src/memory/ewc-consolidation.d.ts +305 -0
- package/dist/src/memory/ewc-consolidation.js +611 -0
- package/dist/src/memory/graph-edge-writer.d.ts +95 -0
- package/dist/src/memory/graph-edge-writer.js +217 -0
- package/dist/src/memory/hybrid-retrieval.d.ts +77 -0
- package/dist/src/memory/hybrid-retrieval.js +192 -0
- package/dist/src/memory/intelligence.d.ts +405 -0
- package/dist/src/memory/intelligence.js +1316 -0
- package/dist/src/memory/lucene-bm25.d.ts +19 -0
- package/dist/src/memory/lucene-bm25.js +308 -0
- package/dist/src/memory/memory-bridge.d.ts +537 -0
- package/dist/src/memory/memory-bridge.js +2460 -0
- package/dist/src/memory/memory-initializer.d.ts +556 -0
- package/dist/src/memory/memory-initializer.js +3021 -0
- package/dist/src/memory/neural-package-bridge.d.ts +48 -0
- package/dist/src/memory/neural-package-bridge.js +87 -0
- package/dist/src/memory/rabitq-index.d.ts +60 -0
- package/dist/src/memory/rabitq-index.js +242 -0
- package/dist/src/memory/sona-optimizer.d.ts +267 -0
- package/dist/src/memory/sona-optimizer.js +779 -0
- package/dist/src/memory/structured-distill.d.ts +48 -0
- package/dist/src/memory/structured-distill.js +125 -0
- package/dist/src/output.d.ts +9 -0
- package/dist/src/output.js +9 -0
- package/dist/src/parser.d.ts +89 -0
- package/dist/src/parser.js +516 -0
- package/dist/src/plugins/manager.d.ts +133 -0
- package/dist/src/plugins/manager.js +415 -0
- package/dist/src/plugins/store/discovery.d.ts +99 -0
- package/dist/src/plugins/store/discovery.js +1224 -0
- package/dist/src/plugins/store/index.d.ts +76 -0
- package/dist/src/plugins/store/index.js +141 -0
- package/dist/src/plugins/store/search.d.ts +46 -0
- package/dist/src/plugins/store/search.js +230 -0
- package/dist/src/plugins/store/types.d.ts +279 -0
- package/dist/src/plugins/store/types.js +7 -0
- package/dist/src/plugins/tests/demo-plugin-store.d.ts +7 -0
- package/dist/src/plugins/tests/demo-plugin-store.js +126 -0
- package/dist/src/plugins/tests/standalone-test.d.ts +12 -0
- package/dist/src/plugins/tests/standalone-test.js +188 -0
- package/dist/src/plugins/tests/test-plugin-store.d.ts +7 -0
- package/dist/src/plugins/tests/test-plugin-store.js +206 -0
- package/dist/src/production/circuit-breaker.d.ts +101 -0
- package/dist/src/production/circuit-breaker.js +241 -0
- package/dist/src/production/error-handler.d.ts +92 -0
- package/dist/src/production/error-handler.js +299 -0
- package/dist/src/production/index.d.ts +23 -0
- package/dist/src/production/index.js +18 -0
- package/dist/src/production/monitoring.d.ts +161 -0
- package/dist/src/production/monitoring.js +356 -0
- package/dist/src/production/rate-limiter.d.ts +80 -0
- package/dist/src/production/rate-limiter.js +201 -0
- package/dist/src/production/retry.d.ts +48 -0
- package/dist/src/production/retry.js +179 -0
- package/dist/src/prompt.d.ts +44 -0
- package/dist/src/prompt.js +501 -0
- package/dist/src/proxy/install.d.ts +29 -0
- package/dist/src/proxy/install.js +135 -0
- package/dist/src/proxy/lifecycle.d.ts +61 -0
- package/dist/src/proxy/lifecycle.js +249 -0
- package/dist/src/proxy/paths.d.ts +34 -0
- package/dist/src/proxy/paths.js +70 -0
- package/dist/src/proxy/release.d.ts +47 -0
- package/dist/src/proxy/release.js +138 -0
- package/dist/src/proxy/token-bridge.d.ts +5 -0
- package/dist/src/proxy/token-bridge.js +61 -0
- package/dist/src/proxy/verify.d.ts +44 -0
- package/dist/src/proxy/verify.js +68 -0
- package/dist/src/runtime/headless.d.ts +60 -0
- package/dist/src/runtime/headless.js +284 -0
- package/dist/src/runtime/parent-death-watchdog.d.ts +42 -0
- package/dist/src/runtime/parent-death-watchdog.js +70 -0
- package/dist/src/ruvector/agent-wasm.d.ts +228 -0
- package/dist/src/ruvector/agent-wasm.js +463 -0
- package/dist/src/ruvector/ast-analyzer.d.ts +67 -0
- package/dist/src/ruvector/ast-analyzer.js +277 -0
- package/dist/src/ruvector/codemods/engine.d.ts +45 -0
- package/dist/src/ruvector/codemods/engine.js +291 -0
- package/dist/src/ruvector/codemods/scope-analysis.d.ts +29 -0
- package/dist/src/ruvector/codemods/scope-analysis.js +162 -0
- package/dist/src/ruvector/coverage-router.d.ts +160 -0
- package/dist/src/ruvector/coverage-router.js +531 -0
- package/dist/src/ruvector/coverage-tools.d.ts +33 -0
- package/dist/src/ruvector/coverage-tools.js +157 -0
- package/dist/src/ruvector/diff-classifier.d.ts +175 -0
- package/dist/src/ruvector/diff-classifier.js +699 -0
- package/dist/src/ruvector/diskann-backend.d.ts +78 -0
- package/dist/src/ruvector/diskann-backend.js +310 -0
- package/dist/src/ruvector/enhanced-model-router.d.ts +172 -0
- package/dist/src/ruvector/enhanced-model-router.js +577 -0
- package/dist/src/ruvector/graph-analyzer.d.ts +187 -0
- package/dist/src/ruvector/graph-analyzer.js +929 -0
- package/dist/src/ruvector/graph-backend.d.ts +79 -0
- package/dist/src/ruvector/graph-backend.js +220 -0
- package/dist/src/ruvector/index.d.ts +38 -0
- package/dist/src/ruvector/index.js +86 -0
- package/dist/src/ruvector/lora-adapter.d.ts +292 -0
- package/dist/src/ruvector/lora-adapter.js +710 -0
- package/dist/src/ruvector/model-prices.d.ts +50 -0
- package/dist/src/ruvector/model-prices.js +72 -0
- package/dist/src/ruvector/model-router.d.ts +408 -0
- package/dist/src/ruvector/model-router.js +1162 -0
- package/dist/src/ruvector/neural-router.d.ts +182 -0
- package/dist/src/ruvector/neural-router.js +825 -0
- package/dist/src/ruvector/output-verifier.d.ts +83 -0
- package/dist/src/ruvector/output-verifier.js +277 -0
- package/dist/src/ruvector/q-learning-router.d.ts +227 -0
- package/dist/src/ruvector/q-learning-router.js +721 -0
- package/dist/src/ruvector/router-calibrator.d.ts +65 -0
- package/dist/src/ruvector/router-calibrator.js +120 -0
- package/dist/src/ruvector/router-parallel-recorder.d.ts +127 -0
- package/dist/src/ruvector/router-parallel-recorder.js +183 -0
- package/dist/src/ruvector/router-trajectory.d.ts +194 -0
- package/dist/src/ruvector/router-trajectory.js +281 -0
- package/dist/src/ruvector/run-transcript-recorder.d.ts +154 -0
- package/dist/src/ruvector/run-transcript-recorder.js +209 -0
- package/dist/src/ruvector/ruvllm-wasm.d.ts +179 -0
- package/dist/src/ruvector/ruvllm-wasm.js +379 -0
- package/dist/src/ruvector/semantic-router.d.ts +77 -0
- package/dist/src/ruvector/semantic-router.js +178 -0
- package/dist/src/ruvector/task-embedder.d.ts +56 -0
- package/dist/src/ruvector/task-embedder.js +237 -0
- package/dist/src/ruvector/trajectory-tree.d.ts +113 -0
- package/dist/src/ruvector/trajectory-tree.js +237 -0
- package/dist/src/ruvector/vector-db.d.ts +73 -0
- package/dist/src/ruvector/vector-db.js +301 -0
- package/dist/src/ruvector/wasm-embedder.d.ts +13 -0
- package/dist/src/ruvector/wasm-embedder.js +143 -0
- package/dist/src/security/builtin-aidefence.d.ts +34 -0
- package/dist/src/security/builtin-aidefence.js +86 -0
- package/dist/src/services/agentic-flow-bridge.d.ts +50 -0
- package/dist/src/services/agentic-flow-bridge.js +95 -0
- package/dist/src/services/ai-job-dedup.d.ts +61 -0
- package/dist/src/services/ai-job-dedup.js +136 -0
- package/dist/src/services/checkpoint-gate.d.ts +140 -0
- package/dist/src/services/checkpoint-gate.js +223 -0
- package/dist/src/services/claim-service.d.ts +204 -0
- package/dist/src/services/claim-service.js +818 -0
- package/dist/src/services/config-file-manager.d.ts +37 -0
- package/dist/src/services/config-file-manager.js +224 -0
- package/dist/src/services/container-worker-pool.d.ts +204 -0
- package/dist/src/services/container-worker-pool.js +589 -0
- package/dist/src/services/daemon-autostart.d.ts +17 -0
- package/dist/src/services/daemon-autostart.js +102 -0
- package/dist/src/services/distill-oracle.d.ts +190 -0
- package/dist/src/services/distill-oracle.js +349 -0
- package/dist/src/services/distill-tuning.d.ts +111 -0
- package/dist/src/services/distill-tuning.js +510 -0
- package/dist/src/services/evolve-proof.d.ts +253 -0
- package/dist/src/services/evolve-proof.js +343 -0
- package/dist/src/services/fable-harness.d.ts +208 -0
- package/dist/src/services/fable-harness.js +388 -0
- package/dist/src/services/git-workspace-identity.d.ts +42 -0
- package/dist/src/services/git-workspace-identity.js +99 -0
- package/dist/src/services/global-ai-budget.d.ts +135 -0
- package/dist/src/services/global-ai-budget.js +415 -0
- package/dist/src/services/harness-benchmark.d.ts +68 -0
- package/dist/src/services/harness-benchmark.js +94 -0
- package/dist/src/services/harness-canary.d.ts +60 -0
- package/dist/src/services/harness-canary.js +69 -0
- package/dist/src/services/harness-corpus-harvester.d.ts +51 -0
- package/dist/src/services/harness-corpus-harvester.js +74 -0
- package/dist/src/services/harness-flywheel-generations.d.ts +115 -0
- package/dist/src/services/harness-flywheel-generations.js +360 -0
- package/dist/src/services/harness-flywheel-runtime.d.ts +25 -0
- package/dist/src/services/harness-flywheel-runtime.js +92 -0
- package/dist/src/services/harness-flywheel.d.ts +48 -0
- package/dist/src/services/harness-flywheel.js +207 -0
- package/dist/src/services/harness-frozen-eval.d.ts +22 -0
- package/dist/src/services/harness-frozen-eval.js +66 -0
- package/dist/src/services/harness-hosts.d.ts +40 -0
- package/dist/src/services/harness-hosts.js +88 -0
- package/dist/src/services/harness-improvement-ledger.d.ts +63 -0
- package/dist/src/services/harness-improvement-ledger.js +101 -0
- package/dist/src/services/harness-loop.d.ts +53 -0
- package/dist/src/services/harness-loop.js +85 -0
- package/dist/src/services/harness-qualification.d.ts +66 -0
- package/dist/src/services/harness-qualification.js +143 -0
- package/dist/src/services/harness-replay.d.ts +37 -0
- package/dist/src/services/harness-replay.js +92 -0
- package/dist/src/services/harness-verify.d.ts +33 -0
- package/dist/src/services/harness-verify.js +26 -0
- package/dist/src/services/harness-worker.d.ts +23 -0
- package/dist/src/services/harness-worker.js +66 -0
- package/dist/src/services/headless-worker-executor.d.ts +358 -0
- package/dist/src/services/headless-worker-executor.js +1269 -0
- package/dist/src/services/index.d.ts +13 -0
- package/dist/src/services/index.js +11 -0
- package/dist/src/services/memory-backup.d.ts +53 -0
- package/dist/src/services/memory-backup.js +198 -0
- package/dist/src/services/memory-distillation.d.ts +41 -0
- package/dist/src/services/memory-distillation.js +277 -0
- package/dist/src/services/native-training.d.ts +68 -0
- package/dist/src/services/native-training.js +141 -0
- package/dist/src/services/registry-api.d.ts +58 -0
- package/dist/src/services/registry-api.js +146 -0
- package/dist/src/services/repo-supervisor.d.ts +70 -0
- package/dist/src/services/repo-supervisor.js +228 -0
- package/dist/src/services/ruvector-training.d.ts +222 -0
- package/dist/src/services/ruvector-training.js +693 -0
- package/dist/src/services/swarm-memory-branches.d.ts +135 -0
- package/dist/src/services/swarm-memory-branches.js +213 -0
- package/dist/src/services/weight-eft.d.ts +305 -0
- package/dist/src/services/weight-eft.js +296 -0
- package/dist/src/services/worker-daemon.d.ts +439 -0
- package/dist/src/services/worker-daemon.js +1865 -0
- package/dist/src/services/worker-queue.d.ts +194 -0
- package/dist/src/services/worker-queue.js +513 -0
- package/dist/src/services/workspace-lease.d.ts +55 -0
- package/dist/src/services/workspace-lease.js +191 -0
- package/dist/src/suggest.d.ts +53 -0
- package/dist/src/suggest.js +200 -0
- package/dist/src/transfer/anonymization/index.d.ts +25 -0
- package/dist/src/transfer/anonymization/index.js +175 -0
- package/dist/src/transfer/deploy-seraphine.d.ts +13 -0
- package/dist/src/transfer/deploy-seraphine.js +205 -0
- package/dist/src/transfer/export.d.ts +25 -0
- package/dist/src/transfer/export.js +113 -0
- package/dist/src/transfer/index.d.ts +12 -0
- package/dist/src/transfer/index.js +31 -0
- package/dist/src/transfer/ipfs/client.d.ts +109 -0
- package/dist/src/transfer/ipfs/client.js +307 -0
- package/dist/src/transfer/ipfs/upload.d.ts +95 -0
- package/dist/src/transfer/ipfs/upload.js +413 -0
- package/dist/src/transfer/models/seraphine.d.ts +72 -0
- package/dist/src/transfer/models/seraphine.js +373 -0
- package/dist/src/transfer/serialization/cfp.d.ts +49 -0
- package/dist/src/transfer/serialization/cfp.js +183 -0
- package/dist/src/transfer/storage/gcs.d.ts +82 -0
- package/dist/src/transfer/storage/gcs.js +272 -0
- package/dist/src/transfer/storage/index.d.ts +6 -0
- package/dist/src/transfer/storage/index.js +6 -0
- package/dist/src/transfer/store/discovery.d.ts +84 -0
- package/dist/src/transfer/store/discovery.js +382 -0
- package/dist/src/transfer/store/download.d.ts +70 -0
- package/dist/src/transfer/store/download.js +334 -0
- package/dist/src/transfer/store/index.d.ts +84 -0
- package/dist/src/transfer/store/index.js +153 -0
- package/dist/src/transfer/store/publish.d.ts +76 -0
- package/dist/src/transfer/store/publish.js +294 -0
- package/dist/src/transfer/store/registry.d.ts +58 -0
- package/dist/src/transfer/store/registry.js +285 -0
- package/dist/src/transfer/store/search.d.ts +54 -0
- package/dist/src/transfer/store/search.js +232 -0
- package/dist/src/transfer/store/tests/standalone-test.d.ts +12 -0
- package/dist/src/transfer/store/tests/standalone-test.js +190 -0
- package/dist/src/transfer/store/types.d.ts +193 -0
- package/dist/src/transfer/store/types.js +6 -0
- package/dist/src/transfer/test-seraphine.d.ts +6 -0
- package/dist/src/transfer/test-seraphine.js +105 -0
- package/dist/src/transfer/tests/test-store.d.ts +7 -0
- package/dist/src/transfer/tests/test-store.js +214 -0
- package/dist/src/transfer/types.d.ts +245 -0
- package/dist/src/transfer/types.js +6 -0
- package/dist/src/types.d.ts +13 -0
- package/dist/src/types.js +13 -0
- package/dist/src/update/checker.d.ts +34 -0
- package/dist/src/update/checker.js +191 -0
- package/dist/src/update/executor.d.ts +33 -0
- package/dist/src/update/executor.js +217 -0
- package/dist/src/update/index.d.ts +33 -0
- package/dist/src/update/index.js +64 -0
- package/dist/src/update/rate-limiter.d.ts +20 -0
- package/dist/src/update/rate-limiter.js +96 -0
- package/dist/src/update/validator.d.ts +17 -0
- package/dist/src/update/validator.js +123 -0
- package/package.json +1 -1
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional WASM embedder tier — a pluggable PRIMARY embedding tier ahead of
|
|
3
|
+
* ruvector-ONNX → hash.
|
|
4
|
+
*
|
|
5
|
+
* OPT-IN by design: there is NO default package (an earlier iteration defaulted
|
|
6
|
+
* to `@ruvector/lattice-wasm`, which does not exist — npm 404). Point
|
|
7
|
+
* `RUFLO_EMBED_WASM_PKG` at any real WASM embedder that follows the ruvnet
|
|
8
|
+
* wasm-bindgen convention (a text→vector embed export). With the env unset, this
|
|
9
|
+
* tier is INERT and everything resolves exactly as before (ruvector ONNX). Fully
|
|
10
|
+
* fail-closed; never throws.
|
|
11
|
+
*
|
|
12
|
+
* The adapter probes the module's API tolerantly and verifies a real embed
|
|
13
|
+
* succeeds before accepting the tier (guards the ADR-086 loads-but-runtime-fails
|
|
14
|
+
* trap), so an incompatible package simply reports unavailable.
|
|
15
|
+
*/
|
|
16
|
+
import { createRequire } from 'module';
|
|
17
|
+
import { readFileSync } from 'fs';
|
|
18
|
+
const require_ = createRequire(import.meta.url);
|
|
19
|
+
/**
|
|
20
|
+
* Package specifier for the optional WASM embedder. EMPTY by default (opt-in).
|
|
21
|
+
* `RUFLO_LATTICE_WASM_PKG` is accepted as a back-compat alias.
|
|
22
|
+
*/
|
|
23
|
+
export const EMBED_WASM_PKG = process.env.RUFLO_EMBED_WASM_PKG || process.env.RUFLO_LATTICE_WASM_PKG || '';
|
|
24
|
+
export const DEFAULT_EMBED_MODEL = process.env.RUFLO_EMBED_MODEL || 'default';
|
|
25
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
26
|
+
let _mod = null;
|
|
27
|
+
let _ready = false;
|
|
28
|
+
let _probed = false;
|
|
29
|
+
let _available = false;
|
|
30
|
+
let _models = [];
|
|
31
|
+
async function loadModule() {
|
|
32
|
+
if (!EMBED_WASM_PKG)
|
|
33
|
+
return null; // opt-in: no package configured ⇒ inert
|
|
34
|
+
if (_mod)
|
|
35
|
+
return _mod;
|
|
36
|
+
_mod = await import(EMBED_WASM_PKG).catch(() => null); // optional — absent ⇒ null ⇒ unavailable
|
|
37
|
+
return _mod;
|
|
38
|
+
}
|
|
39
|
+
async function ensureInit() {
|
|
40
|
+
if (_ready)
|
|
41
|
+
return true;
|
|
42
|
+
const mod = await loadModule();
|
|
43
|
+
if (!mod)
|
|
44
|
+
return false;
|
|
45
|
+
try {
|
|
46
|
+
if (typeof mod.initSync === 'function') {
|
|
47
|
+
let wasmBytes;
|
|
48
|
+
for (const cand of ['index_bg.wasm', 'embedder_bg.wasm', 'wasm_bg.wasm']) {
|
|
49
|
+
try {
|
|
50
|
+
wasmBytes = readFileSync(require_.resolve(`${EMBED_WASM_PKG}/${cand}`));
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
catch { /* try next */ }
|
|
54
|
+
}
|
|
55
|
+
mod.initSync(wasmBytes ? { module: wasmBytes } : undefined);
|
|
56
|
+
}
|
|
57
|
+
else if (typeof mod.default === 'function') {
|
|
58
|
+
await mod.default();
|
|
59
|
+
}
|
|
60
|
+
_ready = true;
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function toVec(r) {
|
|
68
|
+
const v = (r && typeof r === 'object' && 'embedding' in r) ? r.embedding : r;
|
|
69
|
+
if (!v)
|
|
70
|
+
return null;
|
|
71
|
+
if (Array.isArray(v))
|
|
72
|
+
return v;
|
|
73
|
+
if (v.length !== undefined)
|
|
74
|
+
return Array.from(v);
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
async function embedRaw(text, model) {
|
|
78
|
+
const mod = _mod;
|
|
79
|
+
if (!mod)
|
|
80
|
+
return null;
|
|
81
|
+
const attempts = [
|
|
82
|
+
() => typeof mod.embed === 'function' ? mod.embed(text, model) : undefined,
|
|
83
|
+
() => typeof mod.embed === 'function' ? mod.embed(text) : undefined,
|
|
84
|
+
() => typeof mod.embedText === 'function' ? mod.embedText(text, model) : undefined,
|
|
85
|
+
() => typeof mod.Embedder === 'function' ? new mod.Embedder(model).embed(text) : undefined,
|
|
86
|
+
];
|
|
87
|
+
for (const a of attempts) {
|
|
88
|
+
try {
|
|
89
|
+
const r = await a();
|
|
90
|
+
const v = toVec(r);
|
|
91
|
+
if (v)
|
|
92
|
+
return v;
|
|
93
|
+
}
|
|
94
|
+
catch { /* try next surface */ }
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
/** Is an optional WASM embedder configured + installed + initializable? Cached; never throws. */
|
|
99
|
+
export async function wasmEmbedderAvailable() {
|
|
100
|
+
if (_probed)
|
|
101
|
+
return _available;
|
|
102
|
+
_probed = true;
|
|
103
|
+
try {
|
|
104
|
+
if (!EMBED_WASM_PKG) {
|
|
105
|
+
_available = false;
|
|
106
|
+
return false;
|
|
107
|
+
} // opt-in; not configured
|
|
108
|
+
if (!(await ensureInit())) {
|
|
109
|
+
_available = false;
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
const mod = _mod;
|
|
113
|
+
try {
|
|
114
|
+
const list = typeof mod.listModels === 'function' ? mod.listModels() : (mod.models ?? mod.MODELS);
|
|
115
|
+
if (Array.isArray(list) && list.length)
|
|
116
|
+
_models = list;
|
|
117
|
+
}
|
|
118
|
+
catch { /* leave default */ }
|
|
119
|
+
if (!_models.length)
|
|
120
|
+
_models = [DEFAULT_EMBED_MODEL];
|
|
121
|
+
const probe = await embedRaw('probe', DEFAULT_EMBED_MODEL);
|
|
122
|
+
_available = !!probe && probe.length > 0;
|
|
123
|
+
return _available;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
_available = false;
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/** Models the configured WASM embedder reports (empty until available). */
|
|
131
|
+
export function wasmEmbedderModels() { return [..._models]; }
|
|
132
|
+
/** Embed via the optional WASM embedder, or null (caller falls through). Never throws. */
|
|
133
|
+
export async function wasmEmbed(text, model = DEFAULT_EMBED_MODEL) {
|
|
134
|
+
try {
|
|
135
|
+
if (!(await wasmEmbedderAvailable()))
|
|
136
|
+
return null;
|
|
137
|
+
return await embedRaw(text, model);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=wasm-embedder.js.map
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface BuiltinThreat {
|
|
2
|
+
type: string;
|
|
3
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
4
|
+
description: string;
|
|
5
|
+
confidence: number;
|
|
6
|
+
}
|
|
7
|
+
export interface DefenceResult {
|
|
8
|
+
safe: boolean;
|
|
9
|
+
threats: BuiltinThreat[];
|
|
10
|
+
piiFound: boolean;
|
|
11
|
+
detectionTimeMs: number;
|
|
12
|
+
inputHash: string;
|
|
13
|
+
}
|
|
14
|
+
export interface DefenceEngine {
|
|
15
|
+
detect(input: string): Promise<DefenceResult>;
|
|
16
|
+
quickScan(input: string): {
|
|
17
|
+
threat: boolean;
|
|
18
|
+
confidence: number;
|
|
19
|
+
type?: string;
|
|
20
|
+
};
|
|
21
|
+
getStats(): Promise<{
|
|
22
|
+
detectionCount: number;
|
|
23
|
+
avgDetectionTimeMs: number;
|
|
24
|
+
learnedPatterns: number;
|
|
25
|
+
mitigationStrategies: number;
|
|
26
|
+
avgMitigationEffectiveness: number;
|
|
27
|
+
}>;
|
|
28
|
+
getBestMitigation(type: string): Promise<{
|
|
29
|
+
strategy: string;
|
|
30
|
+
effectiveness: number;
|
|
31
|
+
} | null>;
|
|
32
|
+
}
|
|
33
|
+
export declare function createBuiltinAIDefence(): DefenceEngine;
|
|
34
|
+
//# sourceMappingURL=builtin-aidefence.d.ts.map
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
const THREAT_PATTERNS = [
|
|
3
|
+
{
|
|
4
|
+
type: 'prompt-injection',
|
|
5
|
+
severity: 'high',
|
|
6
|
+
confidence: 0.96,
|
|
7
|
+
description: 'Attempts to override or discard trusted instructions',
|
|
8
|
+
pattern: /\b(?:ignore|disregard|forget|override)\b[\s\S]{0,40}\b(?:previous|prior|system|developer|trusted)\b[\s\S]{0,24}\b(?:instructions?|prompts?|rules?|messages?)\b/i,
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
type: 'system-prompt-extraction',
|
|
12
|
+
severity: 'high',
|
|
13
|
+
confidence: 0.94,
|
|
14
|
+
description: 'Attempts to reveal hidden system or developer instructions',
|
|
15
|
+
pattern: /\b(?:reveal|show|print|repeat|dump|expose)\b[\s\S]{0,32}\b(?:system|developer|hidden|initial)\b[\s\S]{0,20}\b(?:prompt|message|instructions?)\b/i,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
type: 'jailbreak',
|
|
19
|
+
severity: 'high',
|
|
20
|
+
confidence: 0.91,
|
|
21
|
+
description: 'Attempts to bypass model safeguards or enter an unrestricted mode',
|
|
22
|
+
pattern: /\b(?:developer mode|DAN mode|jailbreak|bypass (?:all )?(?:safeguards|restrictions|filters)|unrestricted mode)\b/i,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
type: 'data-exfiltration',
|
|
26
|
+
severity: 'critical',
|
|
27
|
+
confidence: 0.93,
|
|
28
|
+
description: 'Attempts to transmit secrets or credentials to an external destination',
|
|
29
|
+
pattern: /\b(?:send|upload|post|exfiltrate|transmit)\b[\s\S]{0,48}\b(?:secret|credential|password|api key|token|private key)\b/i,
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
const PII_PATTERNS = [
|
|
33
|
+
/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/i,
|
|
34
|
+
/\b\d{3}-\d{2}-\d{4}\b/,
|
|
35
|
+
/\b(?:sk-|ghp_|xox[baprs]-)[A-Za-z0-9_-]{16,}\b/,
|
|
36
|
+
/\bAKIA[A-Z0-9]{16}\b/,
|
|
37
|
+
];
|
|
38
|
+
export function createBuiltinAIDefence() {
|
|
39
|
+
let detectionCount = 0;
|
|
40
|
+
let totalDetectionTimeMs = 0;
|
|
41
|
+
const scan = (input) => THREAT_PATTERNS
|
|
42
|
+
.filter(({ pattern }) => pattern.test(input))
|
|
43
|
+
.map(({ pattern: _pattern, ...threat }) => threat);
|
|
44
|
+
return {
|
|
45
|
+
async detect(input) {
|
|
46
|
+
const startedAt = performance.now();
|
|
47
|
+
const threats = scan(input);
|
|
48
|
+
const piiFound = PII_PATTERNS.some((pattern) => pattern.test(input));
|
|
49
|
+
const detectionTimeMs = performance.now() - startedAt;
|
|
50
|
+
detectionCount++;
|
|
51
|
+
totalDetectionTimeMs += detectionTimeMs;
|
|
52
|
+
return {
|
|
53
|
+
safe: threats.length === 0 && !piiFound,
|
|
54
|
+
threats,
|
|
55
|
+
piiFound,
|
|
56
|
+
detectionTimeMs,
|
|
57
|
+
inputHash: createHash('sha256').update(input).digest('hex'),
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
quickScan(input) {
|
|
61
|
+
const threat = scan(input)[0];
|
|
62
|
+
return threat
|
|
63
|
+
? { threat: true, confidence: threat.confidence, type: threat.type }
|
|
64
|
+
: { threat: false, confidence: 0 };
|
|
65
|
+
},
|
|
66
|
+
async getStats() {
|
|
67
|
+
return {
|
|
68
|
+
detectionCount,
|
|
69
|
+
avgDetectionTimeMs: detectionCount === 0 ? 0 : totalDetectionTimeMs / detectionCount,
|
|
70
|
+
learnedPatterns: 0,
|
|
71
|
+
mitigationStrategies: 4,
|
|
72
|
+
avgMitigationEffectiveness: 0.9,
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
async getBestMitigation(type) {
|
|
76
|
+
const strategies = {
|
|
77
|
+
'prompt-injection': 'Keep trusted instructions immutable and reject instruction overrides',
|
|
78
|
+
'system-prompt-extraction': 'Do not disclose system or developer messages',
|
|
79
|
+
jailbreak: 'Apply the configured policy without adopting alternate personas',
|
|
80
|
+
'data-exfiltration': 'Block external transmission and rotate exposed credentials',
|
|
81
|
+
};
|
|
82
|
+
return strategies[type] ? { strategy: strategies[type], effectiveness: 0.9 } : null;
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=builtin-aidefence.js.map
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentic-flow v3 integration bridge
|
|
3
|
+
*
|
|
4
|
+
* Provides a single lazy-loading entry point for all agentic-flow v3
|
|
5
|
+
* subpath exports. Every accessor returns `null` when agentic-flow is
|
|
6
|
+
* not installed — callers never throw on missing optional dependency.
|
|
7
|
+
*
|
|
8
|
+
* @module agentic-flow-bridge
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Load the ReasoningBank module (4-step learning pipeline).
|
|
12
|
+
* Returns null if agentic-flow is not installed.
|
|
13
|
+
* Race-safe: concurrent callers share the same import Promise.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getReasoningBank(): Promise<typeof import("agentic-flow/reasoningbank") | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Load the ModelRouter module (multi-provider LLM routing).
|
|
18
|
+
* Returns null if agentic-flow is not installed.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getRouter(): Promise<typeof import("agentic-flow/router") | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Load the Orchestration module (workflow engine).
|
|
23
|
+
* Returns null if agentic-flow is not installed.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getOrchestration(): Promise<typeof import("agentic-flow/orchestration") | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Compute an embedding vector via ReasoningBank, falling back to null.
|
|
28
|
+
*/
|
|
29
|
+
export declare function computeEmbedding(text: string): Promise<number[] | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Retrieve memories matching a query via ReasoningBank.
|
|
32
|
+
*/
|
|
33
|
+
export declare function retrieveMemories(query: string, opts?: {
|
|
34
|
+
k?: number;
|
|
35
|
+
}): Promise<any[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Check whether agentic-flow v3 is available at runtime.
|
|
38
|
+
*/
|
|
39
|
+
export declare function isAvailable(): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Return a summary of available agentic-flow v3 capabilities.
|
|
42
|
+
*/
|
|
43
|
+
export declare function capabilities(): Promise<{
|
|
44
|
+
available: boolean;
|
|
45
|
+
reasoningBank: boolean;
|
|
46
|
+
router: boolean;
|
|
47
|
+
orchestration: boolean;
|
|
48
|
+
version: string | null;
|
|
49
|
+
}>;
|
|
50
|
+
//# sourceMappingURL=agentic-flow-bridge.d.ts.map
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentic-flow v3 integration bridge
|
|
3
|
+
*
|
|
4
|
+
* Provides a single lazy-loading entry point for all agentic-flow v3
|
|
5
|
+
* subpath exports. Every accessor returns `null` when agentic-flow is
|
|
6
|
+
* not installed — callers never throw on missing optional dependency.
|
|
7
|
+
*
|
|
8
|
+
* @module agentic-flow-bridge
|
|
9
|
+
*/
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Cached module handles (Promise-based to prevent TOCTOU races)
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
let _reasoningBankP = null;
|
|
14
|
+
let _routerP = null;
|
|
15
|
+
let _orchestrationP = null;
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Public loaders
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
/**
|
|
20
|
+
* Load the ReasoningBank module (4-step learning pipeline).
|
|
21
|
+
* Returns null if agentic-flow is not installed.
|
|
22
|
+
* Race-safe: concurrent callers share the same import Promise.
|
|
23
|
+
*/
|
|
24
|
+
export function getReasoningBank() {
|
|
25
|
+
if (_reasoningBankP === null) {
|
|
26
|
+
_reasoningBankP = import('agentic-flow/reasoningbank').catch(() => null);
|
|
27
|
+
}
|
|
28
|
+
return _reasoningBankP;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Load the ModelRouter module (multi-provider LLM routing).
|
|
32
|
+
* Returns null if agentic-flow is not installed.
|
|
33
|
+
*/
|
|
34
|
+
export function getRouter() {
|
|
35
|
+
if (_routerP === null) {
|
|
36
|
+
_routerP = import('agentic-flow/router').catch(() => null);
|
|
37
|
+
}
|
|
38
|
+
return _routerP;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Load the Orchestration module (workflow engine).
|
|
42
|
+
* Returns null if agentic-flow is not installed.
|
|
43
|
+
*/
|
|
44
|
+
export function getOrchestration() {
|
|
45
|
+
if (_orchestrationP === null) {
|
|
46
|
+
_orchestrationP = import('agentic-flow/orchestration').catch(() => null);
|
|
47
|
+
}
|
|
48
|
+
return _orchestrationP;
|
|
49
|
+
}
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Convenience helpers
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
/**
|
|
54
|
+
* Compute an embedding vector via ReasoningBank, falling back to null.
|
|
55
|
+
*/
|
|
56
|
+
export async function computeEmbedding(text) {
|
|
57
|
+
const rb = await getReasoningBank();
|
|
58
|
+
if (!rb?.computeEmbedding)
|
|
59
|
+
return null;
|
|
60
|
+
return rb.computeEmbedding(text);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Retrieve memories matching a query via ReasoningBank.
|
|
64
|
+
*/
|
|
65
|
+
export async function retrieveMemories(query, opts) {
|
|
66
|
+
const rb = await getReasoningBank();
|
|
67
|
+
if (!rb?.retrieveMemories)
|
|
68
|
+
return [];
|
|
69
|
+
return rb.retrieveMemories(query, opts);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Check whether agentic-flow v3 is available at runtime.
|
|
73
|
+
*/
|
|
74
|
+
export async function isAvailable() {
|
|
75
|
+
const rb = await getReasoningBank();
|
|
76
|
+
return rb !== null;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Return a summary of available agentic-flow v3 capabilities.
|
|
80
|
+
*/
|
|
81
|
+
export async function capabilities() {
|
|
82
|
+
const [rb, router, orch] = await Promise.all([
|
|
83
|
+
getReasoningBank(),
|
|
84
|
+
getRouter(),
|
|
85
|
+
getOrchestration(),
|
|
86
|
+
]);
|
|
87
|
+
return {
|
|
88
|
+
available: rb !== null || router !== null || orch !== null,
|
|
89
|
+
reasoningBank: rb !== null,
|
|
90
|
+
router: router !== null,
|
|
91
|
+
orchestration: orch !== null,
|
|
92
|
+
version: rb?.VERSION ?? null,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=agentic-flow-bridge.js.map
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #2661 — Cross-worktree AI job dedup (issue invariant 5).
|
|
3
|
+
*
|
|
4
|
+
* N worktrees of one repository checked out at the same HEAD schedule the
|
|
5
|
+
* same analyses independently: N audits of identical content, N optimize
|
|
6
|
+
* passes, N testgap sweeps. Before a model launch, callers compute
|
|
7
|
+
*
|
|
8
|
+
* jobKey = sha256(repositoryId, head, workerType, workerConfigHash)
|
|
9
|
+
*
|
|
10
|
+
* and skip the launch when the same job succeeded within the freshness
|
|
11
|
+
* window. HEAD moves → new key → the job runs again.
|
|
12
|
+
*
|
|
13
|
+
* The registry lives next to the AI budget ledger under the user's home
|
|
14
|
+
* directory (owner-only, symlink-rejecting) so all daemons share it:
|
|
15
|
+
*
|
|
16
|
+
* ~/.claude-flow/ai-jobs.json
|
|
17
|
+
*
|
|
18
|
+
* This is a best-effort OPTIMIZATION layered under the budget: two daemons
|
|
19
|
+
* racing the same key may both miss and both attempt a launch, but the
|
|
20
|
+
* budget's atomic reservation (maxConcurrentGlobal / hourly cap) is the hard
|
|
21
|
+
* invariant that bounds actual launches. Only operational metadata is
|
|
22
|
+
* persisted — never prompts, outputs, or source content.
|
|
23
|
+
*/
|
|
24
|
+
export interface AiJobKeyParts {
|
|
25
|
+
repositoryId: string;
|
|
26
|
+
head: string;
|
|
27
|
+
workerType: string;
|
|
28
|
+
/** Hash of the effective worker config (prompt/model/sandbox/patterns). */
|
|
29
|
+
configHash: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function computeAiJobKey(parts: AiJobKeyParts): string;
|
|
32
|
+
/** Stable hash of an arbitrary config object (key-sorted JSON). */
|
|
33
|
+
export declare function hashWorkerConfig(config: unknown): string;
|
|
34
|
+
export declare class AiJobDedupRegistry {
|
|
35
|
+
private readonly dir;
|
|
36
|
+
private readonly file;
|
|
37
|
+
constructor(options?: {
|
|
38
|
+
baseDir?: string;
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* True when the job succeeded within `freshnessMs`. Any registry error
|
|
42
|
+
* reads as "not fresh" — dedup failing open only costs a (budget-capped)
|
|
43
|
+
* launch, never correctness.
|
|
44
|
+
*/
|
|
45
|
+
isFresh(jobKey: string, freshnessMs: number): {
|
|
46
|
+
fresh: boolean;
|
|
47
|
+
lastRunAt?: number;
|
|
48
|
+
};
|
|
49
|
+
/** Record a successful run of a job. Best-effort. */
|
|
50
|
+
recordSuccess(jobKey: string, meta: {
|
|
51
|
+
workerType: string;
|
|
52
|
+
repositoryId: string;
|
|
53
|
+
workspace: string;
|
|
54
|
+
}): void;
|
|
55
|
+
private read;
|
|
56
|
+
private write;
|
|
57
|
+
}
|
|
58
|
+
export declare function getAiJobDedupRegistry(): AiJobDedupRegistry;
|
|
59
|
+
/** Test hook: reset the singleton (e.g. after changing RUFLO_AI_BUDGET_DIR). */
|
|
60
|
+
export declare function resetAiJobDedupRegistryForTests(): void;
|
|
61
|
+
//# sourceMappingURL=ai-job-dedup.d.ts.map
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #2661 — Cross-worktree AI job dedup (issue invariant 5).
|
|
3
|
+
*
|
|
4
|
+
* N worktrees of one repository checked out at the same HEAD schedule the
|
|
5
|
+
* same analyses independently: N audits of identical content, N optimize
|
|
6
|
+
* passes, N testgap sweeps. Before a model launch, callers compute
|
|
7
|
+
*
|
|
8
|
+
* jobKey = sha256(repositoryId, head, workerType, workerConfigHash)
|
|
9
|
+
*
|
|
10
|
+
* and skip the launch when the same job succeeded within the freshness
|
|
11
|
+
* window. HEAD moves → new key → the job runs again.
|
|
12
|
+
*
|
|
13
|
+
* The registry lives next to the AI budget ledger under the user's home
|
|
14
|
+
* directory (owner-only, symlink-rejecting) so all daemons share it:
|
|
15
|
+
*
|
|
16
|
+
* ~/.claude-flow/ai-jobs.json
|
|
17
|
+
*
|
|
18
|
+
* This is a best-effort OPTIMIZATION layered under the budget: two daemons
|
|
19
|
+
* racing the same key may both miss and both attempt a launch, but the
|
|
20
|
+
* budget's atomic reservation (maxConcurrentGlobal / hourly cap) is the hard
|
|
21
|
+
* invariant that bounds actual launches. Only operational metadata is
|
|
22
|
+
* persisted — never prompts, outputs, or source content.
|
|
23
|
+
*/
|
|
24
|
+
import * as fs from 'fs';
|
|
25
|
+
import { join } from 'path';
|
|
26
|
+
import { homedir } from 'os';
|
|
27
|
+
import { createHash } from 'crypto';
|
|
28
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
29
|
+
export function computeAiJobKey(parts) {
|
|
30
|
+
return createHash('sha256')
|
|
31
|
+
.update([parts.repositoryId, parts.head, parts.workerType, parts.configHash].join('\n'))
|
|
32
|
+
.digest('hex');
|
|
33
|
+
}
|
|
34
|
+
/** Stable hash of an arbitrary config object (key-sorted JSON). */
|
|
35
|
+
export function hashWorkerConfig(config) {
|
|
36
|
+
const canonical = JSON.stringify(config, (_k, v) => {
|
|
37
|
+
if (v && typeof v === 'object' && !Array.isArray(v)) {
|
|
38
|
+
return Object.fromEntries(Object.entries(v).sort(([a], [b]) => a.localeCompare(b)));
|
|
39
|
+
}
|
|
40
|
+
return v;
|
|
41
|
+
});
|
|
42
|
+
return createHash('sha256').update(canonical ?? 'null').digest('hex');
|
|
43
|
+
}
|
|
44
|
+
/** Invariant 9: registry files must never be symlinks. */
|
|
45
|
+
function assertNotSymlink(path) {
|
|
46
|
+
try {
|
|
47
|
+
const st = fs.lstatSync(path);
|
|
48
|
+
if (st.isSymbolicLink()) {
|
|
49
|
+
throw new Error(`AI job registry is a symlink (refusing): ${path}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
if (e.code === 'ENOENT')
|
|
54
|
+
return;
|
|
55
|
+
throw e;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class AiJobDedupRegistry {
|
|
59
|
+
dir;
|
|
60
|
+
file;
|
|
61
|
+
constructor(options) {
|
|
62
|
+
this.dir = options?.baseDir
|
|
63
|
+
?? process.env.RUFLO_AI_BUDGET_DIR
|
|
64
|
+
?? join(homedir(), '.claude-flow');
|
|
65
|
+
this.file = join(this.dir, 'ai-jobs.json');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* True when the job succeeded within `freshnessMs`. Any registry error
|
|
69
|
+
* reads as "not fresh" — dedup failing open only costs a (budget-capped)
|
|
70
|
+
* launch, never correctness.
|
|
71
|
+
*/
|
|
72
|
+
isFresh(jobKey, freshnessMs) {
|
|
73
|
+
if (process.env.RUFLO_AI_DEDUP_DISABLE === '1')
|
|
74
|
+
return { fresh: false };
|
|
75
|
+
try {
|
|
76
|
+
const records = this.read();
|
|
77
|
+
const rec = records[jobKey];
|
|
78
|
+
if (rec && Date.now() - rec.at < freshnessMs) {
|
|
79
|
+
return { fresh: true, lastRunAt: rec.at };
|
|
80
|
+
}
|
|
81
|
+
return { fresh: false, lastRunAt: rec?.at };
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return { fresh: false };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Record a successful run of a job. Best-effort. */
|
|
88
|
+
recordSuccess(jobKey, meta) {
|
|
89
|
+
try {
|
|
90
|
+
const records = this.read();
|
|
91
|
+
records[jobKey] = { at: Date.now(), ...meta };
|
|
92
|
+
this.write(records);
|
|
93
|
+
}
|
|
94
|
+
catch { /* dedup is an optimization — never block on it */ }
|
|
95
|
+
}
|
|
96
|
+
read() {
|
|
97
|
+
assertNotSymlink(this.file);
|
|
98
|
+
if (!fs.existsSync(this.file))
|
|
99
|
+
return {};
|
|
100
|
+
const raw = JSON.parse(fs.readFileSync(this.file, 'utf-8'));
|
|
101
|
+
if (!raw || typeof raw !== 'object')
|
|
102
|
+
return {};
|
|
103
|
+
// Prune anything older than 24h — freshness windows are far shorter,
|
|
104
|
+
// and HEAD churn would otherwise grow the file without bound.
|
|
105
|
+
const now = Date.now();
|
|
106
|
+
const out = {};
|
|
107
|
+
for (const [key, rec] of Object.entries(raw)) {
|
|
108
|
+
if (rec && typeof rec.at === 'number' && now - rec.at < DAY_MS) {
|
|
109
|
+
out[key] = rec;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
write(records) {
|
|
115
|
+
if (!fs.existsSync(this.dir)) {
|
|
116
|
+
fs.mkdirSync(this.dir, { recursive: true, mode: 0o700 });
|
|
117
|
+
}
|
|
118
|
+
assertNotSymlink(this.file);
|
|
119
|
+
const tmp = `${this.file}.tmp.${process.pid}`;
|
|
120
|
+
fs.writeFileSync(tmp, JSON.stringify(records), { mode: 0o600 });
|
|
121
|
+
fs.renameSync(tmp, this.file);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Singleton — one registry per process.
|
|
125
|
+
let registryInstance = null;
|
|
126
|
+
export function getAiJobDedupRegistry() {
|
|
127
|
+
if (!registryInstance) {
|
|
128
|
+
registryInstance = new AiJobDedupRegistry();
|
|
129
|
+
}
|
|
130
|
+
return registryInstance;
|
|
131
|
+
}
|
|
132
|
+
/** Test hook: reset the singleton (e.g. after changing RUFLO_AI_BUDGET_DIR). */
|
|
133
|
+
export function resetAiJobDedupRegistryForTests() {
|
|
134
|
+
registryInstance = null;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=ai-job-dedup.js.map
|