@claude-flow/cli 3.32.3 → 3.32.5
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 +20 -0
- package/dist/src/commands/proxy-lifecycle.js +277 -0
- package/dist/src/commands/proxy.d.ts +21 -0
- package/dist/src/commands/proxy.js +403 -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,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advisor co-pilot tip — ADR-316. A periodic, consent-gated, budget-capped
|
|
3
|
+
* suggestion generated by ruflo's existing Fable Advisor Harness
|
|
4
|
+
* (services/fable-harness.ts, ADR-172), surfaced in the local insight
|
|
5
|
+
* ticker (insights.ts) alongside the CVE/uncommitted/power-saver signals.
|
|
6
|
+
*
|
|
7
|
+
* This is the ONE insight source that spends real money and makes a real
|
|
8
|
+
* network call — every other source in insights.ts is synchronous, local,
|
|
9
|
+
* $0 by construction. Three hard gates keep that safe:
|
|
10
|
+
* 1. consent: 'advisor-tips' domain (types.ts/consent.ts), never bundled
|
|
11
|
+
* with anything else, off by default.
|
|
12
|
+
* 2. cooldown: at most once per ADVISOR_REFRESH_TTL_MS regardless of how
|
|
13
|
+
* many sessions run in that window — a file-based TTL checked BEFORE
|
|
14
|
+
* spawning, not a per-call budget hope.
|
|
15
|
+
* 3. budget: FableHarness's own --max-budget-usd hard cap, passed through
|
|
16
|
+
* to the underlying `claude -p` call.
|
|
17
|
+
*
|
|
18
|
+
* The snapshot sent to the model is built ONLY from the same structural
|
|
19
|
+
* signals insights.ts already uses (funnel/local-signals.ts) — never raw
|
|
20
|
+
* prompts, commands, or file contents. Matches ADR-309's "no raw content,
|
|
21
|
+
* ever" bar even though ADR-309 is about telemetry and this is a different,
|
|
22
|
+
* separately-consented data flow (an opt-in advisor query, not analytics).
|
|
23
|
+
*
|
|
24
|
+
* Cheapness/latency discipline for the CALLER (never this module itself):
|
|
25
|
+
* refreshAdvisorTipIfStale performs a real network-bound `claude -p` spawn
|
|
26
|
+
* when stale — callers MUST run it from a properly-awaited, DETACHED
|
|
27
|
+
* background process (mirroring the funnel-cache fix's
|
|
28
|
+
* spawnDetachedFunnelRefresh pattern), never inline in a statusline render.
|
|
29
|
+
*/
|
|
30
|
+
import { FableHarness, type CoPilotSnapshot } from '../services/fable-harness.js';
|
|
31
|
+
/** At most one real spend per real day, regardless of session count. */
|
|
32
|
+
export declare const ADVISOR_REFRESH_TTL_MS: number;
|
|
33
|
+
/** Conservative default — one adviseCoPilotTip call is a single, unbatched
|
|
34
|
+
* item, so the ~$0.34 clean-cwd anchor (not the $0.02 batched anchor)
|
|
35
|
+
* applies. Override via RUFLO_ADVISOR_MAX_BUDGET_USD for advanced users. */
|
|
36
|
+
export declare const ADVISOR_DEFAULT_BUDGET_USD = 0.4;
|
|
37
|
+
export interface CachedAdvisorTip {
|
|
38
|
+
headline: string;
|
|
39
|
+
detail: string;
|
|
40
|
+
}
|
|
41
|
+
/** Synchronous, $0, no network — safe to call from the insight ticker's hot path. */
|
|
42
|
+
export declare function readAdvisorTip(now?: Date): CachedAdvisorTip | null;
|
|
43
|
+
export interface AdvisorRefreshResult {
|
|
44
|
+
refreshed: boolean;
|
|
45
|
+
reason?: 'not-consented' | 'fresh' | 'no-tip' | 'error';
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Refresh the cached advisor tip if consent is granted AND the cache is
|
|
49
|
+
* stale. Spends real money via FableHarness exactly once per call site,
|
|
50
|
+
* gated by the TTL check above — callers get to decide cadence (e.g.
|
|
51
|
+
* "call this on every session-restore"; the TTL makes repeated calls cheap
|
|
52
|
+
* no-ops within the same window).
|
|
53
|
+
*/
|
|
54
|
+
export declare function refreshAdvisorTipIfStale(snapshot: CoPilotSnapshot, opts?: {
|
|
55
|
+
now?: Date;
|
|
56
|
+
harness?: FableHarness;
|
|
57
|
+
}): Promise<AdvisorRefreshResult>;
|
|
58
|
+
//# sourceMappingURL=advisor-tip.d.ts.map
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advisor co-pilot tip — ADR-316. A periodic, consent-gated, budget-capped
|
|
3
|
+
* suggestion generated by ruflo's existing Fable Advisor Harness
|
|
4
|
+
* (services/fable-harness.ts, ADR-172), surfaced in the local insight
|
|
5
|
+
* ticker (insights.ts) alongside the CVE/uncommitted/power-saver signals.
|
|
6
|
+
*
|
|
7
|
+
* This is the ONE insight source that spends real money and makes a real
|
|
8
|
+
* network call — every other source in insights.ts is synchronous, local,
|
|
9
|
+
* $0 by construction. Three hard gates keep that safe:
|
|
10
|
+
* 1. consent: 'advisor-tips' domain (types.ts/consent.ts), never bundled
|
|
11
|
+
* with anything else, off by default.
|
|
12
|
+
* 2. cooldown: at most once per ADVISOR_REFRESH_TTL_MS regardless of how
|
|
13
|
+
* many sessions run in that window — a file-based TTL checked BEFORE
|
|
14
|
+
* spawning, not a per-call budget hope.
|
|
15
|
+
* 3. budget: FableHarness's own --max-budget-usd hard cap, passed through
|
|
16
|
+
* to the underlying `claude -p` call.
|
|
17
|
+
*
|
|
18
|
+
* The snapshot sent to the model is built ONLY from the same structural
|
|
19
|
+
* signals insights.ts already uses (funnel/local-signals.ts) — never raw
|
|
20
|
+
* prompts, commands, or file contents. Matches ADR-309's "no raw content,
|
|
21
|
+
* ever" bar even though ADR-309 is about telemetry and this is a different,
|
|
22
|
+
* separately-consented data flow (an opt-in advisor query, not analytics).
|
|
23
|
+
*
|
|
24
|
+
* Cheapness/latency discipline for the CALLER (never this module itself):
|
|
25
|
+
* refreshAdvisorTipIfStale performs a real network-bound `claude -p` spawn
|
|
26
|
+
* when stale — callers MUST run it from a properly-awaited, DETACHED
|
|
27
|
+
* background process (mirroring the funnel-cache fix's
|
|
28
|
+
* spawnDetachedFunnelRefresh pattern), never inline in a statusline render.
|
|
29
|
+
*/
|
|
30
|
+
import { hasConsent } from './consent.js';
|
|
31
|
+
import { readStateJson, writeStateJson } from './state.js';
|
|
32
|
+
import { FableHarness } from '../services/fable-harness.js';
|
|
33
|
+
const ADVISOR_CACHE_FILE = 'advisor-tip.json';
|
|
34
|
+
/** At most one real spend per real day, regardless of session count. */
|
|
35
|
+
export const ADVISOR_REFRESH_TTL_MS = 24 * 60 * 60 * 1000;
|
|
36
|
+
/** Conservative default — one adviseCoPilotTip call is a single, unbatched
|
|
37
|
+
* item, so the ~$0.34 clean-cwd anchor (not the $0.02 batched anchor)
|
|
38
|
+
* applies. Override via RUFLO_ADVISOR_MAX_BUDGET_USD for advanced users. */
|
|
39
|
+
export const ADVISOR_DEFAULT_BUDGET_USD = 0.4;
|
|
40
|
+
/** Synchronous, $0, no network — safe to call from the insight ticker's hot path. */
|
|
41
|
+
export function readAdvisorTip(now = new Date()) {
|
|
42
|
+
const cache = readStateJson(ADVISOR_CACHE_FILE);
|
|
43
|
+
// `!cache._ts` would wrongly treat a legitimate epoch-zero timestamp as
|
|
44
|
+
// absent (0 is falsy) — check the type explicitly instead.
|
|
45
|
+
if (!cache || !cache.headline || typeof cache._ts !== 'number')
|
|
46
|
+
return null;
|
|
47
|
+
if (now.getTime() - cache._ts >= ADVISOR_REFRESH_TTL_MS)
|
|
48
|
+
return null;
|
|
49
|
+
return { headline: cache.headline, detail: cache.detail ?? '' };
|
|
50
|
+
}
|
|
51
|
+
function isCacheStale(now) {
|
|
52
|
+
const cache = readStateJson(ADVISOR_CACHE_FILE);
|
|
53
|
+
if (!cache || typeof cache._ts !== 'number')
|
|
54
|
+
return true;
|
|
55
|
+
return now.getTime() - cache._ts >= ADVISOR_REFRESH_TTL_MS;
|
|
56
|
+
}
|
|
57
|
+
function resolveBudgetUsd() {
|
|
58
|
+
const raw = process.env.RUFLO_ADVISOR_MAX_BUDGET_USD;
|
|
59
|
+
const n = raw !== undefined ? Number(raw) : NaN;
|
|
60
|
+
return Number.isFinite(n) && n > 0 ? n : ADVISOR_DEFAULT_BUDGET_USD;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Refresh the cached advisor tip if consent is granted AND the cache is
|
|
64
|
+
* stale. Spends real money via FableHarness exactly once per call site,
|
|
65
|
+
* gated by the TTL check above — callers get to decide cadence (e.g.
|
|
66
|
+
* "call this on every session-restore"; the TTL makes repeated calls cheap
|
|
67
|
+
* no-ops within the same window).
|
|
68
|
+
*/
|
|
69
|
+
export async function refreshAdvisorTipIfStale(snapshot, opts = {}) {
|
|
70
|
+
const now = opts.now ?? new Date();
|
|
71
|
+
if (!hasConsent('advisor-tips'))
|
|
72
|
+
return { refreshed: false, reason: 'not-consented' };
|
|
73
|
+
if (!isCacheStale(now))
|
|
74
|
+
return { refreshed: false, reason: 'fresh' };
|
|
75
|
+
const harness = opts.harness ?? new FableHarness({ maxBudgetUsd: resolveBudgetUsd() });
|
|
76
|
+
try {
|
|
77
|
+
const tip = await harness.adviseCoPilotTip(snapshot);
|
|
78
|
+
if (!tip) {
|
|
79
|
+
// The model looked and found nothing worth surfacing — still stamp
|
|
80
|
+
// _ts so we don't re-spend inside the same TTL window re-asking the
|
|
81
|
+
// same question and getting the same "nothing to say" answer.
|
|
82
|
+
writeStateJson(ADVISOR_CACHE_FILE, { _ts: now.getTime() });
|
|
83
|
+
return { refreshed: true, reason: 'no-tip' };
|
|
84
|
+
}
|
|
85
|
+
writeStateJson(ADVISOR_CACHE_FILE, { _ts: now.getTime(), headline: tip.headline, detail: tip.detail });
|
|
86
|
+
return { refreshed: true };
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return { refreshed: false, reason: 'error' };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=advisor-tip.js.map
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export interface AttributionInput {
|
|
2
|
+
/** UTM `medium` — the surface (e.g. 'statusline', 'enrollment', 'exhaustion'). */
|
|
3
|
+
medium: string;
|
|
4
|
+
/** UTM `campaign` — the message kind ('disclosure' | 'promotional' | 'educational'). */
|
|
5
|
+
campaign: string;
|
|
6
|
+
/** UTM `content` — the specific message id ('promo-meta-llm-routing' etc.). */
|
|
7
|
+
content: string;
|
|
8
|
+
/** Static UTM `source` — always 'ruflo' but overridable for tests. */
|
|
9
|
+
source?: string;
|
|
10
|
+
/** Injectable for deterministic tests. Defaults to the live clock. */
|
|
11
|
+
now?: Date;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Return `url` with UTM parameters appended, and — when telemetry consent is
|
|
15
|
+
* granted — a `fid` query parameter carrying the pseudonymous funnel ID.
|
|
16
|
+
* Preserves any query parameters the base URL already carried.
|
|
17
|
+
*/
|
|
18
|
+
export declare function attributionUrl(url: string, input: AttributionInput): string;
|
|
19
|
+
/**
|
|
20
|
+
* Wrap the target URL in a server-side click-redirect so the analytics
|
|
21
|
+
* function fires a `promo_open` event + records coarse geo before 302ing to
|
|
22
|
+
* the real destination.
|
|
23
|
+
*
|
|
24
|
+
* Only applied to promotional messages (they have a real URL destination).
|
|
25
|
+
* Disclosure/educational rows call attributionUrl directly.
|
|
26
|
+
*
|
|
27
|
+
* The click endpoint URL structure is:
|
|
28
|
+
* https://funnel.ruv.io/v1/click/{messageId}?to=<utm-decorated-target>
|
|
29
|
+
*
|
|
30
|
+
* The server validates `to` against its own host allowlist, records the
|
|
31
|
+
* event, and 302s. If the click endpoint is unreachable at OSC 8 time,
|
|
32
|
+
* the browser falls back to the terminal's normal error page — but since
|
|
33
|
+
* this is a rare failure path and impressions are already recorded, the
|
|
34
|
+
* loss is bounded.
|
|
35
|
+
*/
|
|
36
|
+
export declare function clickTrackedUrl(messageId: string, targetUrl: string, input: AttributionInput): string;
|
|
37
|
+
//# sourceMappingURL=attribution.d.ts.map
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attribution URL builder — appends UTM parameters and the pseudonymous funnel
|
|
3
|
+
* ID to outbound funnel links so cognitum.one traffic analytics can attribute
|
|
4
|
+
* a landing back to the surface, message, and campaign that produced it
|
|
5
|
+
* (ADR-305 measurement plane).
|
|
6
|
+
*
|
|
7
|
+
* Failure discipline (ADR-301 no-runtime-network invariant, Phase 1):
|
|
8
|
+
* - This function is PURE — it never makes a network call. Attribution is
|
|
9
|
+
* shipped as query params on a link the user's own browser resolves; the
|
|
10
|
+
* CLI has zero runtime dependency on cognitum.one being reachable.
|
|
11
|
+
* If the whole API is down, the OSC 8 label still renders correctly, the
|
|
12
|
+
* click still leaves the terminal, and only the landing page fails (which
|
|
13
|
+
* is a browser-visible problem, not a statusline problem).
|
|
14
|
+
* - If the base URL is malformed, we return it verbatim rather than
|
|
15
|
+
* synthesizing a broken analytics endpoint. The OSC 8 renderer then
|
|
16
|
+
* re-validates the host against its allowlist and, on failure, drops
|
|
17
|
+
* the escape entirely and shows the plain label — never a raw URL.
|
|
18
|
+
*
|
|
19
|
+
* Privacy discipline (ADR-309):
|
|
20
|
+
* - `fid` (the pseudonymous funnel ID) is appended only when telemetry
|
|
21
|
+
* consent is present. Without consent, getFunnelId() returns null and
|
|
22
|
+
* the URL carries only the UTM fields — same landing page, no join key.
|
|
23
|
+
* - The base URL must already be an allowlisted https target; the OSC 8
|
|
24
|
+
* renderer re-validates the host at render time regardless.
|
|
25
|
+
*/
|
|
26
|
+
import { getFunnelId } from './events.js';
|
|
27
|
+
/**
|
|
28
|
+
* Server-side click-redirect endpoint. When set, promotional URLs route
|
|
29
|
+
* through here so the server can record a `promo_open` event + coarse
|
|
30
|
+
* geo (from CF-IPCountry / X-Appengine-Country) before 302ing to the
|
|
31
|
+
* real cognitum.one / agentics.org / etc. target.
|
|
32
|
+
*/
|
|
33
|
+
const CLICK_ENDPOINT_BASE = process.env.RUFLO_FUNNEL_CLICK_ENDPOINT ?? 'https://funnel.ruv.io/v1/click';
|
|
34
|
+
/**
|
|
35
|
+
* Return `url` with UTM parameters appended, and — when telemetry consent is
|
|
36
|
+
* granted — a `fid` query parameter carrying the pseudonymous funnel ID.
|
|
37
|
+
* Preserves any query parameters the base URL already carried.
|
|
38
|
+
*/
|
|
39
|
+
export function attributionUrl(url, input) {
|
|
40
|
+
let parsed;
|
|
41
|
+
try {
|
|
42
|
+
parsed = new URL(url);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return url;
|
|
46
|
+
}
|
|
47
|
+
// Defense in depth: reject non-https schemes at the builder stage. The OSC 8
|
|
48
|
+
// renderer allowlist would drop them at render time too, but decorating a
|
|
49
|
+
// `javascript:` or `data:` URL with a valid-looking `fid` would still be a
|
|
50
|
+
// record we don't want to emit. Fail closed by returning the input verbatim.
|
|
51
|
+
if (parsed.protocol !== 'https:')
|
|
52
|
+
return url;
|
|
53
|
+
const params = parsed.searchParams;
|
|
54
|
+
params.set('utm_source', input.source ?? 'ruflo');
|
|
55
|
+
params.set('utm_medium', input.medium);
|
|
56
|
+
params.set('utm_campaign', input.campaign);
|
|
57
|
+
params.set('utm_content', input.content);
|
|
58
|
+
const fid = getFunnelId(input.now ?? new Date());
|
|
59
|
+
if (fid)
|
|
60
|
+
params.set('fid', fid);
|
|
61
|
+
return parsed.toString();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Wrap the target URL in a server-side click-redirect so the analytics
|
|
65
|
+
* function fires a `promo_open` event + records coarse geo before 302ing to
|
|
66
|
+
* the real destination.
|
|
67
|
+
*
|
|
68
|
+
* Only applied to promotional messages (they have a real URL destination).
|
|
69
|
+
* Disclosure/educational rows call attributionUrl directly.
|
|
70
|
+
*
|
|
71
|
+
* The click endpoint URL structure is:
|
|
72
|
+
* https://funnel.ruv.io/v1/click/{messageId}?to=<utm-decorated-target>
|
|
73
|
+
*
|
|
74
|
+
* The server validates `to` against its own host allowlist, records the
|
|
75
|
+
* event, and 302s. If the click endpoint is unreachable at OSC 8 time,
|
|
76
|
+
* the browser falls back to the terminal's normal error page — but since
|
|
77
|
+
* this is a rare failure path and impressions are already recorded, the
|
|
78
|
+
* loss is bounded.
|
|
79
|
+
*/
|
|
80
|
+
export function clickTrackedUrl(messageId, targetUrl, input) {
|
|
81
|
+
const attributed = attributionUrl(targetUrl, input);
|
|
82
|
+
// If attribution rejected the URL (non-https, malformed), pass through
|
|
83
|
+
// verbatim — never smuggle a bad URL into the click endpoint.
|
|
84
|
+
if (attributed === targetUrl) {
|
|
85
|
+
try {
|
|
86
|
+
const p = new URL(targetUrl);
|
|
87
|
+
if (p.protocol !== 'https:')
|
|
88
|
+
return targetUrl;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return targetUrl;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Sanitize the message id — allowlist [a-z0-9-] so a malformed id can't
|
|
95
|
+
// shape-shift the click endpoint path.
|
|
96
|
+
if (!/^[a-z0-9][a-z0-9-]{0,63}$/i.test(messageId))
|
|
97
|
+
return attributed;
|
|
98
|
+
const params = new URLSearchParams({ to: attributed });
|
|
99
|
+
return `${CLICK_ENDPOINT_BASE}/${encodeURIComponent(messageId)}?${params.toString()}`;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=attribution.js.map
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consent domains and versioned receipts — ADR-302.
|
|
3
|
+
*
|
|
4
|
+
* Four+ distinct decisions, never bundled: account, proxy-install,
|
|
5
|
+
* telemetry, cloud-routing, hosted-memory. A receipt is written on both
|
|
6
|
+
* grant AND decline (a decline is a decision, not an absence). A stale
|
|
7
|
+
* policyVersion means the consent must be re-asked before the capability
|
|
8
|
+
* activates — never silently carried forward.
|
|
9
|
+
*/
|
|
10
|
+
import type { ConsentDomain, ConsentFile, ConsentReceipt } from './types.js';
|
|
11
|
+
export declare const CONSENT_DOMAINS: ConsentDomain[];
|
|
12
|
+
export declare function readConsents(): ConsentFile;
|
|
13
|
+
export declare function getConsent(domain: ConsentDomain): ConsentReceipt;
|
|
14
|
+
/**
|
|
15
|
+
* Effective consent: granted AND at the current policy version. A receipt
|
|
16
|
+
* from an older policy version is treated as not-consented (re-ask, never
|
|
17
|
+
* carry forward).
|
|
18
|
+
*/
|
|
19
|
+
export declare function hasConsent(domain: ConsentDomain): boolean;
|
|
20
|
+
export declare function recordConsent(domain: ConsentDomain, granted: boolean, surface: string, now?: Date): ConsentReceipt;
|
|
21
|
+
export declare function revokeConsent(domain: ConsentDomain, surface: string): ConsentReceipt;
|
|
22
|
+
//# sourceMappingURL=consent.d.ts.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consent domains and versioned receipts — ADR-302.
|
|
3
|
+
*
|
|
4
|
+
* Four+ distinct decisions, never bundled: account, proxy-install,
|
|
5
|
+
* telemetry, cloud-routing, hosted-memory. A receipt is written on both
|
|
6
|
+
* grant AND decline (a decline is a decision, not an absence). A stale
|
|
7
|
+
* policyVersion means the consent must be re-asked before the capability
|
|
8
|
+
* activates — never silently carried forward.
|
|
9
|
+
*/
|
|
10
|
+
import { CONSENT_POLICY_VERSION } from './types.js';
|
|
11
|
+
import { readStateJson, writeStateJson } from './state.js';
|
|
12
|
+
const CONSENT_FILE = 'consent.json';
|
|
13
|
+
export const CONSENT_DOMAINS = [
|
|
14
|
+
'account',
|
|
15
|
+
'proxy-install',
|
|
16
|
+
'telemetry',
|
|
17
|
+
'cloud-routing',
|
|
18
|
+
'hosted-memory',
|
|
19
|
+
'sponsored-downtime',
|
|
20
|
+
'power-saver',
|
|
21
|
+
'training-data-sharing',
|
|
22
|
+
'advisor-tips',
|
|
23
|
+
'rev-share-payout',
|
|
24
|
+
'spinner-verbs',
|
|
25
|
+
'company-announcements',
|
|
26
|
+
];
|
|
27
|
+
export function readConsents() {
|
|
28
|
+
return readStateJson(CONSENT_FILE) ?? {};
|
|
29
|
+
}
|
|
30
|
+
export function getConsent(domain) {
|
|
31
|
+
const file = readConsents();
|
|
32
|
+
return (file[domain] ?? { granted: false, policyVersion: CONSENT_POLICY_VERSION, at: null, surface: null });
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Effective consent: granted AND at the current policy version. A receipt
|
|
36
|
+
* from an older policy version is treated as not-consented (re-ask, never
|
|
37
|
+
* carry forward).
|
|
38
|
+
*/
|
|
39
|
+
export function hasConsent(domain) {
|
|
40
|
+
const r = getConsent(domain);
|
|
41
|
+
return r.granted === true && r.at !== null && r.policyVersion === CONSENT_POLICY_VERSION;
|
|
42
|
+
}
|
|
43
|
+
export function recordConsent(domain, granted, surface, now = new Date()) {
|
|
44
|
+
const file = readConsents();
|
|
45
|
+
const receipt = {
|
|
46
|
+
granted,
|
|
47
|
+
policyVersion: CONSENT_POLICY_VERSION,
|
|
48
|
+
at: now.toISOString(),
|
|
49
|
+
surface,
|
|
50
|
+
};
|
|
51
|
+
file[domain] = receipt;
|
|
52
|
+
writeStateJson(CONSENT_FILE, file);
|
|
53
|
+
return receipt;
|
|
54
|
+
}
|
|
55
|
+
export function revokeConsent(domain, surface) {
|
|
56
|
+
return recordConsent(domain, false, surface);
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=consent.js.map
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credit-error taxonomy and fail-closed classifier — ADR-303.
|
|
3
|
+
*
|
|
4
|
+
* Adapters map machine-readable provider codes into the canonical
|
|
5
|
+
* CreditErrorCode enum. Message text is NEVER parsed. Anything unmapped
|
|
6
|
+
* stays unclassified (confidence 0) and falls through to the ordinary
|
|
7
|
+
* error path. Only COGNITUM_CREDIT_EXHAUSTED — asserted by the Cognitum
|
|
8
|
+
* ledger, the single credit authority — may trigger the funnel surface.
|
|
9
|
+
*/
|
|
10
|
+
import { type NormalizedCreditError } from './types.js';
|
|
11
|
+
export interface ProviderErrorLike {
|
|
12
|
+
/** Machine-readable provider error code (e.g. `error.type` / `error.code`). */
|
|
13
|
+
providerCode?: string;
|
|
14
|
+
/** HTTP status, when the transport exposes one. */
|
|
15
|
+
status?: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function classifyCreditError(err: ProviderErrorLike): NormalizedCreditError;
|
|
18
|
+
export interface CreditPromptSession {
|
|
19
|
+
creditPromptShown: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The ADR-303 gate, fail-closed and frequency-capped: fires only for a
|
|
23
|
+
* confident, non-retryable Cognitum-ledger exhaustion, at most once per
|
|
24
|
+
* session. Everything else falls through to the ordinary error path.
|
|
25
|
+
*/
|
|
26
|
+
export declare function shouldShowCreditRecovery(error: NormalizedCreditError, session: CreditPromptSession): boolean;
|
|
27
|
+
/** Full contextual screen (interactive TTY, first occurrence). */
|
|
28
|
+
export declare function renderCreditRecovery(authenticated: boolean): string;
|
|
29
|
+
/** Single-line hint (non-TTY, CI, or repeat occurrences in a session). */
|
|
30
|
+
export declare const CREDIT_RECOVERY_HINT = "Hint: ruflo auth login enables the free local Meta LLM proxy";
|
|
31
|
+
//# sourceMappingURL=credit-errors.d.ts.map
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credit-error taxonomy and fail-closed classifier — ADR-303.
|
|
3
|
+
*
|
|
4
|
+
* Adapters map machine-readable provider codes into the canonical
|
|
5
|
+
* CreditErrorCode enum. Message text is NEVER parsed. Anything unmapped
|
|
6
|
+
* stays unclassified (confidence 0) and falls through to the ordinary
|
|
7
|
+
* error path. Only COGNITUM_CREDIT_EXHAUSTED — asserted by the Cognitum
|
|
8
|
+
* ledger, the single credit authority — may trigger the funnel surface.
|
|
9
|
+
*/
|
|
10
|
+
import { CreditErrorCode } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Provider-code → canonical-code table. Keys are exact machine-readable
|
|
13
|
+
* code strings from provider error payloads (mirrors the ADR-308 server
|
|
14
|
+
* taxonomy 1:1). Versioned by code review; unmapped codes land nowhere.
|
|
15
|
+
*/
|
|
16
|
+
const PROVIDER_CODE_TABLE = {
|
|
17
|
+
// Cognitum ledger (the single credit authority — ADR-303)
|
|
18
|
+
cognitum_credit_exhausted: { code: CreditErrorCode.COGNITUM_CREDIT_EXHAUSTED, retryable: false },
|
|
19
|
+
// Upstream provider quota/billing — NOT a Cognitum upsell moment
|
|
20
|
+
insufficient_quota: { code: CreditErrorCode.PROVIDER_QUOTA_EXHAUSTED, retryable: false },
|
|
21
|
+
billing_hard_limit_reached: { code: CreditErrorCode.PROVIDER_QUOTA_EXHAUSTED, retryable: false },
|
|
22
|
+
quota_exceeded: { code: CreditErrorCode.PROVIDER_QUOTA_EXHAUSTED, retryable: false },
|
|
23
|
+
// Retryable rate limits
|
|
24
|
+
rate_limit_exceeded: { code: CreditErrorCode.PROVIDER_RATE_LIMITED, retryable: true },
|
|
25
|
+
rate_limit_error: { code: CreditErrorCode.PROVIDER_RATE_LIMITED, retryable: true },
|
|
26
|
+
overloaded_error: { code: CreditErrorCode.SERVICE_UNAVAILABLE, retryable: true },
|
|
27
|
+
// Auth
|
|
28
|
+
authentication_error: { code: CreditErrorCode.AUTHENTICATION_FAILED, retryable: false },
|
|
29
|
+
invalid_api_key: { code: CreditErrorCode.AUTHENTICATION_FAILED, retryable: false },
|
|
30
|
+
permission_error: { code: CreditErrorCode.AUTHENTICATION_FAILED, retryable: false },
|
|
31
|
+
// Outages
|
|
32
|
+
api_error: { code: CreditErrorCode.SERVICE_UNAVAILABLE, retryable: true },
|
|
33
|
+
service_unavailable: { code: CreditErrorCode.SERVICE_UNAVAILABLE, retryable: true },
|
|
34
|
+
};
|
|
35
|
+
export function classifyCreditError(err) {
|
|
36
|
+
const key = err.providerCode?.trim().toLowerCase();
|
|
37
|
+
if (key && Object.prototype.hasOwnProperty.call(PROVIDER_CODE_TABLE, key)) {
|
|
38
|
+
const mapped = PROVIDER_CODE_TABLE[key];
|
|
39
|
+
return { code: mapped.code, confidence: 1, retryable: mapped.retryable, cause: err };
|
|
40
|
+
}
|
|
41
|
+
// Status-only signals are structural (401/403 → auth; 5xx → outage), but a
|
|
42
|
+
// bare 429 is ambiguous between rate-limit and quota — leave it unmapped.
|
|
43
|
+
if (err.status === 401 || err.status === 403) {
|
|
44
|
+
return { code: CreditErrorCode.AUTHENTICATION_FAILED, confidence: 1, retryable: false, cause: err };
|
|
45
|
+
}
|
|
46
|
+
if (err.status !== undefined && err.status >= 500) {
|
|
47
|
+
return { code: CreditErrorCode.SERVICE_UNAVAILABLE, confidence: 1, retryable: true, cause: err };
|
|
48
|
+
}
|
|
49
|
+
return { code: null, confidence: 0, retryable: false, cause: err };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The ADR-303 gate, fail-closed and frequency-capped: fires only for a
|
|
53
|
+
* confident, non-retryable Cognitum-ledger exhaustion, at most once per
|
|
54
|
+
* session. Everything else falls through to the ordinary error path.
|
|
55
|
+
*/
|
|
56
|
+
export function shouldShowCreditRecovery(error, session) {
|
|
57
|
+
return (error.code === CreditErrorCode.COGNITUM_CREDIT_EXHAUSTED &&
|
|
58
|
+
error.confidence === 1 &&
|
|
59
|
+
!error.retryable &&
|
|
60
|
+
!session.creditPromptShown);
|
|
61
|
+
}
|
|
62
|
+
/** Full contextual screen (interactive TTY, first occurrence). */
|
|
63
|
+
export function renderCreditRecovery(authenticated) {
|
|
64
|
+
const lines = [
|
|
65
|
+
'Daily hosted credits exhausted.',
|
|
66
|
+
'',
|
|
67
|
+
'Continue immediately by enabling',
|
|
68
|
+
'your free local Meta LLM Proxy.',
|
|
69
|
+
'',
|
|
70
|
+
'Benefits',
|
|
71
|
+
' ✓ Unlimited local requests',
|
|
72
|
+
' ✓ Automatic model routing',
|
|
73
|
+
' ✓ Lower latency',
|
|
74
|
+
' ✓ Privacy preserving',
|
|
75
|
+
' ✓ Cloud fallback',
|
|
76
|
+
'',
|
|
77
|
+
];
|
|
78
|
+
if (authenticated) {
|
|
79
|
+
lines.push('Start local proxy?', ' ruflo proxy enable');
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
lines.push('Sign in:', ' ruflo auth login');
|
|
83
|
+
}
|
|
84
|
+
return lines.join('\n');
|
|
85
|
+
}
|
|
86
|
+
/** Single-line hint (non-TTY, CI, or repeat occurrences in a session). */
|
|
87
|
+
export const CREDIT_RECOVERY_HINT = 'Hint: ruflo auth login enables the free local Meta LLM proxy';
|
|
88
|
+
//# sourceMappingURL=credit-errors.js.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credit-exhaustion notifier — writes a marker file so the ADR-303 recovery
|
|
3
|
+
* surface fires on the next appropriate command render, and keeps a short
|
|
4
|
+
* user-visible notification in `~/.ruflo/credit-status.json`.
|
|
5
|
+
*
|
|
6
|
+
* This is NOT the ADR-303 credit-error classifier — that lives in
|
|
7
|
+
* `credit-errors.ts` and reads provider error codes to decide when a
|
|
8
|
+
* credit surface fires *during* a command. This module is the OUT-OF-BAND
|
|
9
|
+
* signal path: the analytics transport detected a credit-exhausted
|
|
10
|
+
* response (HTTP 402 or ADR-303 machine-readable code), and we need to
|
|
11
|
+
* warn the user asynchronously.
|
|
12
|
+
*
|
|
13
|
+
* State is cheap and durable:
|
|
14
|
+
* ~/.ruflo/credit-status.json = { exhausted: bool, since: ISO, cleared: ISO|null }
|
|
15
|
+
*
|
|
16
|
+
* Cleared automatically when the user opens the enrollment / signup
|
|
17
|
+
* surface, or explicitly via `ruflo funnel credit-clear`.
|
|
18
|
+
*/
|
|
19
|
+
export declare const CREDIT_STATUS_FILE = "credit-status.json";
|
|
20
|
+
export interface CreditStatus {
|
|
21
|
+
exhausted: boolean;
|
|
22
|
+
since: string | null;
|
|
23
|
+
cleared: string | null;
|
|
24
|
+
}
|
|
25
|
+
/** Read the current credit status. Never throws. */
|
|
26
|
+
export declare function readCreditStatus(): CreditStatus;
|
|
27
|
+
/**
|
|
28
|
+
* Mark credit as exhausted — idempotent. Sets `since` on the first mark,
|
|
29
|
+
* leaves it alone on subsequent marks so the user sees a stable "since"
|
|
30
|
+
* timestamp until they clear it.
|
|
31
|
+
*/
|
|
32
|
+
export declare function markCreditExhausted(now?: Date): void;
|
|
33
|
+
/**
|
|
34
|
+
* Clear credit-exhaustion status. Called when the user completes signup or
|
|
35
|
+
* runs `ruflo funnel credit-clear`. `cleared` is stamped so the previous
|
|
36
|
+
* `since` remains inspectable for one recovery cycle.
|
|
37
|
+
*/
|
|
38
|
+
export declare function clearCreditStatus(now?: Date): void;
|
|
39
|
+
/**
|
|
40
|
+
* User-facing single-line summary — plain text, no ANSI. Callers style it
|
|
41
|
+
* themselves. Returns null when credit isn't exhausted (no surface).
|
|
42
|
+
*/
|
|
43
|
+
export declare function creditExhaustedNotice(now?: Date): string | null;
|
|
44
|
+
//# sourceMappingURL=credit-notifier.d.ts.map
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credit-exhaustion notifier — writes a marker file so the ADR-303 recovery
|
|
3
|
+
* surface fires on the next appropriate command render, and keeps a short
|
|
4
|
+
* user-visible notification in `~/.ruflo/credit-status.json`.
|
|
5
|
+
*
|
|
6
|
+
* This is NOT the ADR-303 credit-error classifier — that lives in
|
|
7
|
+
* `credit-errors.ts` and reads provider error codes to decide when a
|
|
8
|
+
* credit surface fires *during* a command. This module is the OUT-OF-BAND
|
|
9
|
+
* signal path: the analytics transport detected a credit-exhausted
|
|
10
|
+
* response (HTTP 402 or ADR-303 machine-readable code), and we need to
|
|
11
|
+
* warn the user asynchronously.
|
|
12
|
+
*
|
|
13
|
+
* State is cheap and durable:
|
|
14
|
+
* ~/.ruflo/credit-status.json = { exhausted: bool, since: ISO, cleared: ISO|null }
|
|
15
|
+
*
|
|
16
|
+
* Cleared automatically when the user opens the enrollment / signup
|
|
17
|
+
* surface, or explicitly via `ruflo funnel credit-clear`.
|
|
18
|
+
*/
|
|
19
|
+
import { readStateJson, writeStateJson } from './state.js';
|
|
20
|
+
export const CREDIT_STATUS_FILE = 'credit-status.json';
|
|
21
|
+
/** Read the current credit status. Never throws. */
|
|
22
|
+
export function readCreditStatus() {
|
|
23
|
+
const raw = readStateJson(CREDIT_STATUS_FILE);
|
|
24
|
+
return {
|
|
25
|
+
exhausted: raw?.exhausted ?? false,
|
|
26
|
+
since: raw?.since ?? null,
|
|
27
|
+
cleared: raw?.cleared ?? null,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Mark credit as exhausted — idempotent. Sets `since` on the first mark,
|
|
32
|
+
* leaves it alone on subsequent marks so the user sees a stable "since"
|
|
33
|
+
* timestamp until they clear it.
|
|
34
|
+
*/
|
|
35
|
+
export function markCreditExhausted(now = new Date()) {
|
|
36
|
+
const current = readCreditStatus();
|
|
37
|
+
if (current.exhausted && current.since)
|
|
38
|
+
return; // already flagged
|
|
39
|
+
writeStateJson(CREDIT_STATUS_FILE, {
|
|
40
|
+
exhausted: true,
|
|
41
|
+
since: current.since ?? now.toISOString(),
|
|
42
|
+
cleared: null,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Clear credit-exhaustion status. Called when the user completes signup or
|
|
47
|
+
* runs `ruflo funnel credit-clear`. `cleared` is stamped so the previous
|
|
48
|
+
* `since` remains inspectable for one recovery cycle.
|
|
49
|
+
*/
|
|
50
|
+
export function clearCreditStatus(now = new Date()) {
|
|
51
|
+
const current = readCreditStatus();
|
|
52
|
+
writeStateJson(CREDIT_STATUS_FILE, {
|
|
53
|
+
exhausted: false,
|
|
54
|
+
since: current.since,
|
|
55
|
+
cleared: now.toISOString(),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* User-facing single-line summary — plain text, no ANSI. Callers style it
|
|
60
|
+
* themselves. Returns null when credit isn't exhausted (no surface).
|
|
61
|
+
*/
|
|
62
|
+
export function creditExhaustedNotice(now = new Date()) {
|
|
63
|
+
const status = readCreditStatus();
|
|
64
|
+
if (!status.exhausted)
|
|
65
|
+
return null;
|
|
66
|
+
const since = status.since ? Date.parse(status.since) : NaN;
|
|
67
|
+
if (Number.isNaN(since)) {
|
|
68
|
+
return 'Cognitum credits exhausted · run: ruflo funnel signup';
|
|
69
|
+
}
|
|
70
|
+
const ageHours = Math.max(0, Math.round((now.getTime() - since) / (60 * 60 * 1000)));
|
|
71
|
+
const when = ageHours < 1 ? 'just now' : ageHours < 24 ? `${ageHours}h ago` : `${Math.round(ageHours / 24)}d ago`;
|
|
72
|
+
return `Cognitum credits exhausted (${when}) · run: ruflo funnel signup`;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=credit-notifier.js.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Existing-install disclosure gate — ADR-301, amended by ADR-311 to source
|
|
3
|
+
* the disclosure MESSAGE itself from the remote feed rather than hardcoding
|
|
4
|
+
* it in the CLI. Everything about WHETHER/WHEN to show a disclosure stays
|
|
5
|
+
* local (state machine below); everything about WHAT it says comes from
|
|
6
|
+
* the same remote pool as tips/promos, validated through the identical
|
|
7
|
+
* ADR-301 content pipeline (isValidMessage in messages.ts).
|
|
8
|
+
*
|
|
9
|
+
* Invariants (release-blocking, tested):
|
|
10
|
+
* - No promotional content before disclosure.
|
|
11
|
+
* - The manage instruction appears in the disclosure text itself.
|
|
12
|
+
* - Shown once per user (user-level receipt), not once per project.
|
|
13
|
+
* - Declining disables all funnel surfaces (enforced in precedence.ts).
|
|
14
|
+
* - Fail-closed: if the remote feed has never successfully populated a
|
|
15
|
+
* disclosure-class message, there is nothing to show — no local
|
|
16
|
+
* fallback text exists (ADR-311 "zero local promo content").
|
|
17
|
+
*
|
|
18
|
+
* The disclosure text stays on the promo row for a grace window after its
|
|
19
|
+
* first render so a single flash can't count as "the user was told"; only
|
|
20
|
+
* after the window do promotional messages become eligible.
|
|
21
|
+
*/
|
|
22
|
+
import type { DisclosureRecord, FunnelMessage } from './types.js';
|
|
23
|
+
/** How long the disclosure text keeps the row before promo becomes eligible. */
|
|
24
|
+
export declare const DISCLOSURE_GRACE_MS: number;
|
|
25
|
+
export declare const DISCLOSURE_ROTATION_SLOT_MS: number;
|
|
26
|
+
/**
|
|
27
|
+
* Deterministic slot-based selection over the remote disclosure pool — no
|
|
28
|
+
* RNG so the choice is reproducible for a given wall-clock instant. Returns
|
|
29
|
+
* null when the pool is empty (cold start before first fetch, or the remote
|
|
30
|
+
* feed is unreachable) — the caller must treat null as "show nothing".
|
|
31
|
+
*/
|
|
32
|
+
export declare function selectDisclosureMessage(now?: Date): FunnelMessage | null;
|
|
33
|
+
export declare function getDisclosure(): DisclosureRecord;
|
|
34
|
+
/** Record that the disclosure text was rendered (idempotent). */
|
|
35
|
+
export declare function recordDisclosureShown(now?: Date): DisclosureRecord;
|
|
36
|
+
/** User explicitly declined (e.g. `ruflo funnel disable`). */
|
|
37
|
+
export declare function recordDisclosureDeclined(now?: Date): DisclosureRecord;
|
|
38
|
+
/** Re-enable after a prior decline (explicit user action only). */
|
|
39
|
+
export declare function recordDisclosureReenabled(now?: Date): DisclosureRecord;
|
|
40
|
+
export declare function recordDisclosureAccepted(now?: Date): DisclosureRecord;
|
|
41
|
+
/**
|
|
42
|
+
* Whether promotional/educational messages may render. True only after the
|
|
43
|
+
* disclosure was shown AND its grace window has elapsed. While the window is
|
|
44
|
+
* open the row must carry the disclosure text itself.
|
|
45
|
+
*/
|
|
46
|
+
export declare function promoEligible(now?: Date): boolean;
|
|
47
|
+
//# sourceMappingURL=disclosure.d.ts.map
|