thumbgate 1.35.0 → 1.37.2

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.
Files changed (204) hide show
  1. package/.agents/skills/cobble-hot-store-compare-not-clone/SKILL.md +80 -0
  2. package/.agents/skills/colab-compute-honesty-not-clone/SKILL.md +70 -0
  3. package/.agents/skills/cyberstrike-compare-not-clone/SKILL.md +36 -0
  4. package/.agents/skills/gitlab-sandbox-allowlist-not-trust/SKILL.md +77 -0
  5. package/.agents/skills/jit-harness-compare-not-clone/SKILL.md +34 -0
  6. package/.agents/skills/openui-catalog-compose-honesty/SKILL.md +64 -0
  7. package/.agents/skills/token-shunt-honesty-not-clone/SKILL.md +67 -0
  8. package/.agents/skills/typesafe-typed-questions-not-clone/SKILL.md +82 -0
  9. package/.agents/skills/zvec-grep-compare-not-clone/SKILL.md +34 -0
  10. package/.claude-plugin/plugin.json +1 -1
  11. package/.well-known/llms.txt +1 -0
  12. package/.well-known/mcp/server-card.json +1 -1
  13. package/CONTRIBUTING.md +95 -0
  14. package/README.md +195 -632
  15. package/THIRD_PARTY_NOTICES.md +89 -0
  16. package/adapters/claude/.mcp.json +2 -2
  17. package/adapters/forge/forge.yaml +3 -3
  18. package/adapters/future-agi/.mcp.json +8 -0
  19. package/adapters/future-agi/FUTURE_AGI.md +23 -0
  20. package/adapters/future-agi/config.toml +3 -0
  21. package/adapters/future-agi/future-agi-bridge.js +9 -0
  22. package/adapters/future-agi/opencode.json +8 -0
  23. package/adapters/herdr/herdr-plugin.toml +18 -0
  24. package/adapters/mcp/server-stdio.js +238 -25
  25. package/adapters/opencode/opencode.json +1 -1
  26. package/adapters/workos/WORKOS.md +52 -0
  27. package/bin/cli.js +465 -3
  28. package/bin/futureagi-bridge +9 -0
  29. package/config/gate-templates.json +629 -4
  30. package/config/gates/actor-critic-audit.json +34 -0
  31. package/config/gates/default.json +9 -3
  32. package/config/gates/five-walls-governance.json +34 -0
  33. package/config/gates/future-agi-guardrails.json +34 -0
  34. package/config/gates/radware-threat-defense-2026.json +61 -0
  35. package/config/gates/simatree-data-governance.json +33 -0
  36. package/config/mcp-allowlists.json +4 -0
  37. package/config/merge-quality-checks.json +6 -0
  38. package/config/model-candidates.json +312 -29
  39. package/config/model-tiers.json +18 -0
  40. package/config/post-deploy-marketing-pages.json +10 -0
  41. package/config/progressive/01-wire-only.json +11 -0
  42. package/config/progressive/02-dashboard-empty-ok.json +10 -0
  43. package/config/progressive/03-one-lesson.json +10 -0
  44. package/config/progressive/04-warn-fires.json +11 -0
  45. package/config/progressive/05-strict-optional.json +11 -0
  46. package/config/progressive/README.md +15 -0
  47. package/config/schemas/broker-execution-receipt.schema.json +139 -0
  48. package/config/schemas/provider-execution-attestation-v1.schema.json +58 -0
  49. package/conformance/provider-attestation/vectors.json +320 -0
  50. package/docs/specs/provider-execution-attestation-v1.md +69 -0
  51. package/openapi/openapi.yaml +15 -0
  52. package/package.json +408 -150
  53. package/public/about.html +2 -2
  54. package/public/ai-malpractice-prevention.html +7 -7
  55. package/public/blog/a-10-dollar-vps-is-not-a-computer.html +143 -0
  56. package/public/blog/a-receipt-is-not-world-state.html +388 -0
  57. package/public/blog/git-at-agent-scale.html +374 -0
  58. package/public/blog/no-llm-in-the-gate.html +133 -0
  59. package/public/blog.html +80 -0
  60. package/public/case-studies.html +16 -1
  61. package/public/compare.html +28 -0
  62. package/public/diagnostic.html +216 -7
  63. package/public/docs/connectors.html +39 -0
  64. package/public/federal.html +2 -2
  65. package/public/founders.html +639 -0
  66. package/public/index.html +87 -9
  67. package/public/install.html +8 -8
  68. package/public/learn.html +39 -0
  69. package/public/numbers.html +2 -2
  70. package/public/peter.html +310 -0
  71. package/public/platform-partners.html +119 -0
  72. package/public/pricing.html +24 -3
  73. package/public/privacy.html +117 -0
  74. package/public/pro.html +17 -0
  75. package/public/support.html +62 -0
  76. package/public/terms.html +130 -0
  77. package/public/third-party-notices.html +95 -0
  78. package/public/yt.html +351 -0
  79. package/scripts/action-receipts.js +133 -3
  80. package/scripts/adaptive-governance-arena.js +349 -0
  81. package/scripts/admin-override.js +205 -0
  82. package/scripts/agent-action-inventory.js +869 -0
  83. package/scripts/agent-audit-trace.js +42 -2
  84. package/scripts/agent-egress-policy.js +1117 -0
  85. package/scripts/agent-memory-lifecycle.js +141 -2
  86. package/scripts/agent-operations-planner.js +441 -1
  87. package/scripts/agent-readiness.js +68 -0
  88. package/scripts/agent-security-central.js +647 -0
  89. package/scripts/allowlist-bridge-honesty.js +417 -0
  90. package/scripts/async-job-runner.js +102 -11
  91. package/scripts/audit-trail.js +212 -0
  92. package/scripts/billing.js +1 -1
  93. package/scripts/broker-execution-receipts.js +719 -0
  94. package/scripts/budget-aware-gates-proof.js +423 -0
  95. package/scripts/claude-feedback-sync.js +29 -3
  96. package/scripts/claw-harness-production.js +237 -0
  97. package/scripts/cli-schema.js +203 -1
  98. package/scripts/cobble-hot-store-split.js +600 -0
  99. package/scripts/codex-runbook-flywheel.js +318 -0
  100. package/scripts/colab-compute-honesty.js +281 -0
  101. package/scripts/context-footprint.js +186 -0
  102. package/scripts/contextfs.js +143 -61
  103. package/scripts/dashboard.js +251 -32
  104. package/scripts/deepseek-v4-runtime-guardrails.js +72 -6
  105. package/scripts/docker-sandbox-planner.js +18 -0
  106. package/scripts/double-blind-eval-protocol.js +252 -0
  107. package/scripts/edotenv-rl-gateway.js +259 -0
  108. package/scripts/ensure-production-search-corpus.js +162 -0
  109. package/scripts/eval-holdout.js +311 -0
  110. package/scripts/feedback-aggregate.js +21 -2
  111. package/scripts/feedback-loop.js +87 -5
  112. package/scripts/feedback-quality.js +9 -0
  113. package/scripts/file-ledger-lock.js +4 -1
  114. package/scripts/financial-control-plane.js +41 -1
  115. package/scripts/find-dormant-requires.js +118 -0
  116. package/scripts/fs-utils.js +84 -8
  117. package/scripts/gates-engine.js +826 -68
  118. package/scripts/generate-case-study-outreach.js +24 -15
  119. package/scripts/git-at-scale.js +628 -0
  120. package/scripts/governance-conflict-audit.js +1650 -0
  121. package/scripts/governance-difficulty-curriculum.js +328 -0
  122. package/scripts/graphrag-retrieval.js +275 -0
  123. package/scripts/gurobi-optimizer.js +324 -0
  124. package/scripts/gurobi_optimizer.py +485 -0
  125. package/scripts/harness-selector.js +82 -1
  126. package/scripts/hidden-entry-points.js +284 -0
  127. package/scripts/human-escalation.js +199 -1
  128. package/scripts/hybrid-feedback-context.js +152 -19
  129. package/scripts/intent-governed-execution.js +602 -0
  130. package/scripts/intervention-policy.js +123 -20
  131. package/scripts/jit-harness-compose.js +628 -0
  132. package/scripts/jsonl-watcher.js +10 -0
  133. package/scripts/lesson-embedding-index.js +95 -12
  134. package/scripts/lesson-retrieval.js +105 -19
  135. package/scripts/local-model-profile.js +19 -2
  136. package/scripts/mailer/resend-mailer.js +1 -1
  137. package/scripts/matryoshka-embedding.js +235 -0
  138. package/scripts/mcp-oauth.js +42 -4
  139. package/scripts/mcp-session-handles.js +1016 -0
  140. package/scripts/mcp-wiring-doctor.js +314 -0
  141. package/scripts/memory-firewall.js +115 -2
  142. package/scripts/memory-scope-readiness.js +299 -0
  143. package/scripts/memory-vs-rag-route.js +161 -0
  144. package/scripts/model-tier-router.js +148 -21
  145. package/scripts/nvidia-specdecode-al-doctor.js +536 -0
  146. package/scripts/openui-catalog-compose-honesty.js +593 -0
  147. package/scripts/operational-integrity.js +19 -1
  148. package/scripts/override-audit.js +213 -0
  149. package/scripts/package-manager-honesty-doctor.js +458 -0
  150. package/scripts/pr-manager.js +63 -1
  151. package/scripts/prove-herdr-adapter.js +52 -0
  152. package/scripts/prove-memory-pyramid-and-symbolic-canvas.js +95 -0
  153. package/scripts/prove-workos.js +73 -0
  154. package/scripts/provider-attestation-conformance.js +192 -0
  155. package/scripts/provider-receipt-contract.js +136 -0
  156. package/scripts/qwen38-max-cost-optimizer.js +401 -0
  157. package/scripts/radware-threat-defense.js +280 -0
  158. package/scripts/rag-embedding-identity.js +221 -0
  159. package/scripts/rag-precision-guardrails.js +112 -2
  160. package/scripts/remote-feedback-capture.js +159 -0
  161. package/scripts/research-agent-harness.js +256 -0
  162. package/scripts/rsi-safety-hillclimb.js +200 -0
  163. package/scripts/rule-sprawl.js +188 -0
  164. package/scripts/schedule-manager.js +147 -0
  165. package/scripts/self-heal.js +8 -0
  166. package/scripts/session-lease.js +415 -0
  167. package/scripts/simatree-data-governance.js +347 -0
  168. package/scripts/slo-alert-engine.js +172 -7
  169. package/scripts/solver-parity.js +539 -0
  170. package/scripts/stealth-memory-injection-gate.js +333 -0
  171. package/scripts/switchyard-router.js +366 -0
  172. package/scripts/telemetry-analytics.js +84 -27
  173. package/scripts/temporal-decay-weighting.js +138 -0
  174. package/scripts/test-all.js +165 -0
  175. package/scripts/token-savings.js +42 -0
  176. package/scripts/token-shunt-honesty.js +502 -0
  177. package/scripts/tool-kpi-tracker.js +108 -5
  178. package/scripts/tool-registry.js +193 -5
  179. package/scripts/typesafe-typed-questions.js +813 -0
  180. package/scripts/universal-claim-evaluator.js +14 -2
  181. package/scripts/vector-store.js +279 -9
  182. package/scripts/workflow-notebook.js +391 -0
  183. package/scripts/workflow-sentinel.js +111 -12
  184. package/scripts/workos-production-guard.js +260 -0
  185. package/scripts/workspace-search-route.js +515 -0
  186. package/server.json +2 -2
  187. package/src/agent-identity-boundary.js +76 -0
  188. package/src/agent-retrieval-cache.js +155 -0
  189. package/src/alert-noise-ledger.js +502 -0
  190. package/src/api/server.js +724 -153
  191. package/src/git-fast-cache.js +220 -0
  192. package/src/git-wal-sync.js +156 -0
  193. package/src/hash-anchored-edit.js +82 -0
  194. package/src/hermes-platform-protocol.js +475 -0
  195. package/src/hermes-sync-plane.js +241 -0
  196. package/src/index.js +30 -1
  197. package/src/iso42001-compliance-guard.js +97 -0
  198. package/src/latency-budget.js +244 -0
  199. package/src/mcp-writeguard.js +316 -0
  200. package/src/miminions-adapter.js +106 -0
  201. package/src/pipeline-compass.js +104 -0
  202. package/src/ppl-alert-pipeline.js +284 -0
  203. package/src/rendezvous-router.js +90 -0
  204. package/src/security-questionnaire.js +195 -0
@@ -0,0 +1,52 @@
1
+ # WorkOS + ThumbGate (identity vs pre-action gates)
2
+
3
+ ## Split of responsibility
4
+
5
+ | Concern | WorkOS AuthKit / MCP Auth | ThumbGate |
6
+ |---------|---------------------------|-----------|
7
+ | Who is the user/org? | SSO, social login, orgs, SCIM (paid) | — |
8
+ | OAuth for MCP servers | AuthKit as OAuth 2.1 AS; scopes → RBAC | Remote MCP OAuth 2.1 PKCE (`scripts/mcp-oauth.js`) |
9
+ | What may this tool call do *now*? | Scope admission only | Pre-action gates, lessons, prevention rules |
10
+ | Agent skill install / auth scaffold | WorkOS CLI / widget skills | Gate: `review-workos-skill-and-auth-installer-actions` |
11
+
12
+ **One line for buyers:** WorkOS (or any IdP) decides *who* the agent is. ThumbGate decides *which tool calls may run*.
13
+
14
+ ## ThumbGate production policy ($10/mo)
15
+
16
+ Public `thumbgate.app` auth uses **WorkOS Production AuthKit only**:
17
+
18
+ - AuthKit host: `progressive-mouse-13.authkit.app`
19
+ - Production client id: `client_01KY0306CYDV6QSXE43QKM2ZXW`
20
+ - Allowed under cap: email + password, **own** social OAuth apps (Google free under AuthKit MAU tier)
21
+ - **Forbidden without budget rewrite:** custom AuthKit domain (~$99/mo), enterprise SSO/SAML connections (~$125/conn), Directory Sync, public traffic on staging AuthKit
22
+
23
+ Guard (secret-free):
24
+
25
+ ```bash
26
+ node scripts/workos-production-guard.js --json
27
+ npm run prove:workos
28
+ ```
29
+
30
+ ## MCP OAuth scopes (hierarchy)
31
+
32
+ ThumbGate remote MCP supports:
33
+
34
+ | Scope | Allows |
35
+ |-------|--------|
36
+ | `mcp:read` | Tools with `readOnlyHint: true` |
37
+ | `mcp:gates` | Gate-evaluation tools (+ read) |
38
+ | `mcp:feedback` | Feedback capture tools (+ read) |
39
+ | `mcp:write` | Mutating tools **and** everything above |
40
+
41
+ `mcp:write` **implies** read/gates/feedback so operator tokens are not fail-closed on read-only tools (WorkOS-style role implication).
42
+
43
+ ## Complementary, not competitive
44
+
45
+ Do not pitch ThumbGate as “WorkOS for agents.” Pitch as the **runtime prevention layer after identity** — the same gap as claw-style enterprise agents and GDG “dark agent” demos (poisoned specs, secret egress, destructive tool use).
46
+
47
+ ## Related
48
+
49
+ - `scripts/workos-production-guard.js`
50
+ - `scripts/mcp-oauth.js`
51
+ - `scripts/prove-workos.js`
52
+ - Gate category: **Enterprise Identity & MCP Auth Governance** in `config/gate-templates.json`
package/bin/cli.js CHANGED
@@ -2627,6 +2627,234 @@ function deepseekV4RuntimeGuardrails() {
2627
2627
  process.stdout.write(formatDeepSeekV4RuntimeGuardrailsPlan(report));
2628
2628
  }
2629
2629
 
2630
+ function nvidiaSpecDecodeAlDoctor() {
2631
+ const args = parseArgs(process.argv.slice(3));
2632
+ const {
2633
+ buildNvidiaSpecDecodeAlDoctorReport,
2634
+ formatNvidiaSpecDecodeAlDoctorReport,
2635
+ } = require(path.join(PKG_ROOT, 'scripts', 'nvidia-specdecode-al-doctor'));
2636
+ const report = buildNvidiaSpecDecodeAlDoctorReport(args);
2637
+
2638
+ if (args.json) {
2639
+ console.log(JSON.stringify(report, null, 2));
2640
+ } else {
2641
+ process.stdout.write(formatNvidiaSpecDecodeAlDoctorReport(report));
2642
+ }
2643
+
2644
+ if (args.strict && report.status !== 'ready') {
2645
+ process.exitCode = 1;
2646
+ return;
2647
+ }
2648
+ if (report.status === 'fail') process.exitCode = 1;
2649
+ }
2650
+
2651
+
2652
+
2653
+ function intentGovernedExecution() {
2654
+ const args = parseArgs(process.argv.slice(3));
2655
+ const {
2656
+ buildIntentGovernedExecutionReport,
2657
+ formatIntentGovernedExecutionReport,
2658
+ } = require(path.join(PKG_ROOT, 'scripts', 'intent-governed-execution'));
2659
+ const report = buildIntentGovernedExecutionReport(args);
2660
+
2661
+ if (args.json) {
2662
+ console.log(JSON.stringify(report, null, 2));
2663
+ } else {
2664
+ process.stdout.write(formatIntentGovernedExecutionReport(report));
2665
+ }
2666
+
2667
+ if (args.strict && report.status !== 'ready') {
2668
+ process.exitCode = 1;
2669
+ return;
2670
+ }
2671
+ if (report.status === 'fail') process.exitCode = 1;
2672
+ }
2673
+
2674
+ function jitHarnessCompose() {
2675
+ const args = parseArgs(process.argv.slice(3));
2676
+ const {
2677
+ buildJitHarnessComposeReport,
2678
+ formatJitHarnessComposeReport,
2679
+ } = require(path.join(PKG_ROOT, 'scripts', 'jit-harness-compose'));
2680
+ const report = buildJitHarnessComposeReport(args);
2681
+
2682
+ if (args.json) {
2683
+ console.log(JSON.stringify(report, null, 2));
2684
+ } else {
2685
+ process.stdout.write(formatJitHarnessComposeReport(report));
2686
+ }
2687
+
2688
+ if (args.strict && report.status !== 'ready') {
2689
+ process.exitCode = 1;
2690
+ return;
2691
+ }
2692
+ if (report.status === 'fail') process.exitCode = 1;
2693
+ }
2694
+
2695
+ function tokenShuntHonesty() {
2696
+ const args = parseArgs(process.argv.slice(3));
2697
+ const {
2698
+ buildTokenShuntHonestyReport,
2699
+ formatTokenShuntHonestyReport,
2700
+ } = require(path.join(PKG_ROOT, 'scripts', 'token-shunt-honesty'));
2701
+ const report = buildTokenShuntHonestyReport(args);
2702
+ if (args.json) {
2703
+ console.log(JSON.stringify(report, null, 2));
2704
+ } else {
2705
+ process.stdout.write(formatTokenShuntHonestyReport(report));
2706
+ }
2707
+ if (args.strict && report.status !== 'ready') {
2708
+ process.exitCode = 1;
2709
+ return;
2710
+ }
2711
+ if (report.status === 'fail') process.exitCode = 1;
2712
+ }
2713
+
2714
+ function typesafeTypedQuestionsDoctor() {
2715
+ const args = parseArgs(process.argv.slice(3));
2716
+ const {
2717
+ buildTypesafeTypedQuestionsReport,
2718
+ formatTypesafeTypedQuestionsReport,
2719
+ } = require(path.join(PKG_ROOT, 'scripts', 'typesafe-typed-questions'));
2720
+ const report = buildTypesafeTypedQuestionsReport(args);
2721
+ if (args.json) {
2722
+ console.log(JSON.stringify(report, null, 2));
2723
+ } else {
2724
+ process.stdout.write(formatTypesafeTypedQuestionsReport(report));
2725
+ }
2726
+ if (args.strict && report.status !== 'ready') {
2727
+ process.exitCode = 1;
2728
+ return;
2729
+ }
2730
+ if (report.status === 'fail') process.exitCode = 1;
2731
+ }
2732
+
2733
+ function colabComputeHonestyDoctor() {
2734
+ const args = parseArgs(process.argv.slice(3));
2735
+ const {
2736
+ buildColabComputeHonestyReport,
2737
+ formatColabComputeHonestyReport,
2738
+ } = require(path.join(PKG_ROOT, 'scripts', 'colab-compute-honesty'));
2739
+ const report = buildColabComputeHonestyReport(args);
2740
+ if (args.json) {
2741
+ console.log(JSON.stringify(report, null, 2));
2742
+ } else {
2743
+ process.stdout.write(formatColabComputeHonestyReport(report));
2744
+ }
2745
+ if (args.strict && report.status !== 'ready') {
2746
+ process.exitCode = 1;
2747
+ return;
2748
+ }
2749
+ if (report.status === 'fail') process.exitCode = 1;
2750
+ }
2751
+
2752
+ function cobbleHotStoreSplit() {
2753
+ const args = parseArgs(process.argv.slice(3));
2754
+ const {
2755
+ buildCobbleHotStoreSplitReport,
2756
+ formatCobbleHotStoreSplitReport,
2757
+ } = require(path.join(PKG_ROOT, 'scripts', 'cobble-hot-store-split'));
2758
+ const report = buildCobbleHotStoreSplitReport(args);
2759
+
2760
+ if (args.json) {
2761
+ console.log(JSON.stringify(report, null, 2));
2762
+ } else {
2763
+ process.stdout.write(formatCobbleHotStoreSplitReport(report));
2764
+ }
2765
+
2766
+ if (args.strict && report.status !== 'ready') {
2767
+ process.exitCode = 1;
2768
+ return;
2769
+ }
2770
+ if (report.status === 'fail') process.exitCode = 1;
2771
+ }
2772
+
2773
+ function allowlistBridgeHonestyDoctor() {
2774
+ const args = parseArgs(process.argv.slice(3));
2775
+ const {
2776
+ buildAllowlistBridgeHonestyReport,
2777
+ formatAllowlistBridgeHonestyReport,
2778
+ } = require(path.join(PKG_ROOT, 'scripts', 'allowlist-bridge-honesty'));
2779
+ const report = buildAllowlistBridgeHonestyReport(args);
2780
+
2781
+ if (args.json) {
2782
+ console.log(JSON.stringify(report, null, 2));
2783
+ } else {
2784
+ process.stdout.write(formatAllowlistBridgeHonestyReport(report));
2785
+ }
2786
+
2787
+ if (args.strict && report.status !== 'ready') {
2788
+ process.exitCode = 1;
2789
+ return;
2790
+ }
2791
+ if (report.status === 'fail') process.exitCode = 1;
2792
+ }
2793
+
2794
+ function packageManagerHonestyDoctor() {
2795
+ const args = parseArgs(process.argv.slice(3));
2796
+ const {
2797
+ buildPackageManagerHonestyReport,
2798
+ formatPackageManagerHonestyReport,
2799
+ } = require(path.join(PKG_ROOT, 'scripts', 'package-manager-honesty-doctor'));
2800
+ const report = buildPackageManagerHonestyReport(args);
2801
+
2802
+ if (args.json) {
2803
+ console.log(JSON.stringify(report, null, 2));
2804
+ } else {
2805
+ process.stdout.write(formatPackageManagerHonestyReport(report));
2806
+ }
2807
+
2808
+ if (args.strict && report.status !== 'ready') {
2809
+ process.exitCode = 1;
2810
+ return;
2811
+ }
2812
+ if (report.status === 'fail') process.exitCode = 1;
2813
+ }
2814
+
2815
+ function openuiCatalogComposeHonestyDoctor() {
2816
+ const args = parseArgs(process.argv.slice(3));
2817
+ const {
2818
+ buildOpenuiCatalogComposeHonestyReport,
2819
+ formatOpenuiCatalogComposeHonestyReport,
2820
+ } = require(path.join(PKG_ROOT, 'scripts', 'openui-catalog-compose-honesty'));
2821
+ const report = buildOpenuiCatalogComposeHonestyReport(args);
2822
+
2823
+ if (args.json) {
2824
+ console.log(JSON.stringify(report, null, 2));
2825
+ } else {
2826
+ process.stdout.write(formatOpenuiCatalogComposeHonestyReport(report));
2827
+ }
2828
+
2829
+ if (args.strict && report.status !== 'ready') {
2830
+ process.exitCode = 1;
2831
+ return;
2832
+ }
2833
+ if (report.status === 'fail') process.exitCode = 1;
2834
+ }
2835
+
2836
+
2837
+ async function workspaceSearchRoute() {
2838
+ const args = parseArgs(process.argv.slice(3));
2839
+ const {
2840
+ buildWorkspaceSearchRouteReport,
2841
+ formatWorkspaceSearchRouteReport,
2842
+ } = require(path.join(PKG_ROOT, 'scripts', 'workspace-search-route'));
2843
+ const report = await buildWorkspaceSearchRouteReport(args);
2844
+
2845
+ if (args.json) {
2846
+ console.log(JSON.stringify(report, null, 2));
2847
+ } else {
2848
+ process.stdout.write(formatWorkspaceSearchRouteReport(report));
2849
+ }
2850
+
2851
+ if (args.strict && report.status !== 'ready') {
2852
+ process.exitCode = 1;
2853
+ return;
2854
+ }
2855
+ if (report.status === 'fail') process.exitCode = 1;
2856
+ }
2857
+
2630
2858
  function upstreamContributions() {
2631
2859
  const args = parseArgs(process.argv.slice(3));
2632
2860
  const {
@@ -2865,6 +3093,25 @@ async function gateCheck() {
2865
3093
  return;
2866
3094
  }
2867
3095
 
3096
+ const { evaluatePreToolUse } = require(path.join(PKG_ROOT, 'scripts', 'token-shunt-honesty'));
3097
+ const shunt = evaluatePreToolUse({
3098
+ toolName: input.tool_name || input.toolName,
3099
+ toolInput: input.tool_input || input.toolInput || {},
3100
+ cwd: input.cwd || process.cwd(),
3101
+ });
3102
+ if (shunt && shunt.ok === false) {
3103
+ process.stdout.write(`${JSON.stringify({
3104
+ decision: 'block',
3105
+ reason: `token-shunt: ${shunt.reason}`,
3106
+ hookSpecificOutput: {
3107
+ hookEventName: 'PreToolUse',
3108
+ permissionDecision: 'deny',
3109
+ permissionDecisionReason: `token-shunt: ${shunt.reason}`,
3110
+ },
3111
+ })}\n`);
3112
+ return;
3113
+ }
3114
+
2868
3115
  const output = await gatesEngine.runAsync(input);
2869
3116
  process.stdout.write(output + '\n');
2870
3117
  } catch (err) {
@@ -3012,6 +3259,24 @@ function sessionStart() {
3012
3259
  }
3013
3260
  } catch (_) { /* non-critical */ }
3014
3261
 
3262
+ // MCP + lessons-store wiring — make unattended RAG-loop gaps loud at boot
3263
+ try {
3264
+ const { wiringReport } = require(path.join(PKG_ROOT, 'scripts', 'mcp-wiring-doctor'));
3265
+ const wiring = wiringReport(CWD);
3266
+ if (wiring && wiring.overall !== 'ok') {
3267
+ if (reminderLines.length > 0) reminderLines.push('');
3268
+ reminderLines.push(`ThumbGate RAG wiring: ${wiring.overall.toUpperCase()}`);
3269
+ reminderLines.push(
3270
+ wiring.unattendedCaptureReady
3271
+ ? ' Capture path available (local and/or hosted).'
3272
+ : ' Capture path BROKEN for unattended runs — wire .mcp.json thumbgate server and set THUMBGATE_FEEDBACK_DIR or THUMBGATE_API_BASE_URL+THUMBGATE_API_KEY.'
3273
+ );
3274
+ (wiring.findings || []).slice(0, 4).forEach((finding) => {
3275
+ reminderLines.push(` - ${finding}`);
3276
+ });
3277
+ }
3278
+ } catch (_) { /* non-critical */ }
3279
+
3015
3280
  // Top high-risk tags — force agent to see them at session start, not opt-in
3016
3281
  try {
3017
3282
  const { getRiskSummary } = require(path.join(PKG_ROOT, 'scripts', 'risk-scorer'));
@@ -3305,6 +3570,8 @@ function help() {
3305
3570
  console.log(' ai-inventory Scan AI/ML components and export ML-BOM evidence');
3306
3571
  console.log(' verify-claims --claim="..." Recheck factual claims against configured sources');
3307
3572
  console.log(' doctor Audit runtime isolation + bootstrap context');
3573
+ console.log(' compass 6-axis pipeline: wire, lessons, rules, eval');
3574
+ console.log(' security-central Free Agent Security Central posture report');
3308
3575
  console.log(' break-glass --reason="..." Short TTL recovery if gates over-fire');
3309
3576
  console.log(' brain [--write] Build the agent-readable context brain (lessons + rules + gates)');
3310
3577
  console.log(' pro ThumbGate Pro (dashboard, exports, sync)');
@@ -3372,6 +3639,7 @@ function help() {
3372
3639
  console.log(' eval Turn feedback into reusable prompt/workflow eval proof');
3373
3640
  console.log(' optimize [PRO] Prune CLAUDE.md and migrate rules to Pre-Action Checks');
3374
3641
  console.log(' prove [--target=X] Run proof harness (adapters|automation|...)');
3642
+ console.log(' compass 6-axis pipeline check (wire → lessons → rules → eval)');
3375
3643
  console.log(' watch Watch .thumbgate/ for external signals');
3376
3644
  console.log(' status Approval trend + failure domain dashboard');
3377
3645
  console.log(' funnel Marketing and revenue conversion funnel analytics');
@@ -3386,8 +3654,21 @@ function help() {
3386
3654
  console.log(' long-running-agent-context-guardrails Map structured-memory gaps to long-running agent gates');
3387
3655
  console.log(' reasoning-efficiency-guardrails Map reasoning compression signals to efficiency gates');
3388
3656
  console.log(' deepseek-v4-runtime-guardrails Map sparse-attention runtime signals to safety gates');
3657
+ console.log(' nvidia-specdecode-al-doctor Check speculative AL/D evidence vs AL/(1+ρD) speedup math');
3658
+ console.log(' package-manager-honesty-doctor Audit lockfile/CI parity; fail-closed manager switches');
3659
+ console.log(' openui-catalog-compose-honesty Catalog-compose-only + repair-before-claim (OpenUI FORMAT)');
3660
+ console.log(' allowlist-bridge-honesty Audit allowlisted registries/proxies as hops, not trust boundaries');
3661
+ console.log(' jit-harness-compose Compose memory/planning/action/capability onto existing rails (JIT FORMAT)');
3662
+ console.log(' cobble-hot-store-split Split durable/delivery/hot lesson planes (CobbleDB FORMAT)');
3663
+ console.log(' token-shunt-honesty Intercept untargeted bulk reads (Portal FORMAT; not shunt@portal)');
3664
+ console.log(' typesafe-typed-questions Typed noul/choice/score + code-owned route (TypeSafe FORMAT; not Jev)');
3665
+ console.log(' colab-compute-honesty Compute-unit honesty from Colab /signup (not a GPU SKU)');
3666
+ console.log(' workspace-search-route Route query to rg/fts/vector/hybrid/graph (zg FORMAT)');
3667
+ console.log(' intent-governed-execution NL intent → classify/authorize/gate/HITL/evidence (CyberStrike FORMAT)');
3389
3668
  console.log(' background-governance Background-agent run report and dispatch risk check');
3390
3669
  console.log(' analytics Unified analytics snapshot (npm, GitHub, landing)');
3670
+ console.log(' inventory Agent action inventory: tool calls, gate denies, false-deny rate');
3671
+ console.log(' conflict-audit Find controls that report success but enforce nothing');
3391
3672
  console.log(' start-api Start the ThumbGate HTTPS API server');
3392
3673
  console.log('');
3393
3674
 
@@ -3420,6 +3701,17 @@ function help() {
3420
3701
  console.log(' npx thumbgate long-running-agent-context-guardrails --request-count=80 --output-mb=3 --raw-chat-only --json');
3421
3702
  console.log(' npx thumbgate reasoning-efficiency-guardrails --baseline-tokens=1200 --compressed-tokens=980 --baseline-accuracy=0.84 --compressed-accuracy=0.85 --verifier --json');
3422
3703
  console.log(' npx thumbgate deepseek-v4-runtime-guardrails --context-tokens=900000 --hybrid-attention --speculative-decoding --accept-length=1.4 --precision-mode=fp8 --json');
3704
+ console.log(' npx thumbgate nvidia-specdecode-al-doctor --speculative-decoding --accept-length=1.4 --draft-length=7 --draft-depth-ratio=0.05 --claimed-speedup=3 --json');
3705
+ console.log(' npx thumbgate package-manager-honesty-doctor --propose-switch=pnpm --json');
3706
+ console.log(' npx thumbgate openui-catalog-compose-honesty --catalog=catalog.json --stream=compose.txt --repair --json');
3707
+ console.log(' npx thumbgate allowlist-bridge-honesty --json');
3708
+ console.log(' npx thumbgate jit-harness-compose --task="implement PreToolUse gate fix" --json');
3709
+ console.log(' npx thumbgate cobble-hot-store-split --json');
3710
+ console.log(' npx thumbgate token-shunt-honesty --json --lines=800');
3711
+ console.log(' npx thumbgate typesafe-typed-questions --json --tool-name=Bash --command="git push --force origin main"');
3712
+ console.log(' npx thumbgate colab-compute-honesty --json --map-only');
3713
+ console.log(' npx thumbgate workspace-search-route --query="how does X connect" --json');
3714
+ console.log(' npx thumbgate intent-governed-execution --intent="railway deploy" --json');
3423
3715
  console.log(' npx thumbgate upstream-contributions --max-repos=10 --write');
3424
3716
  console.log(' npx thumbgate background-governance --json');
3425
3717
  console.log(' npx thumbgate background-governance --check --agent-id=builder --branch=main --files-changed=25 --json');
@@ -3459,6 +3751,8 @@ const SUBCOMMAND_HELP = {
3459
3751
  lessons: 'Usage: npx thumbgate lessons [--query="..."] [--limit=N]\n\nSearch the lesson database (Pro feature).',
3460
3752
  search: 'Usage: npx thumbgate search <query>\n\nSearch ThumbGate knowledge base (Pro feature).',
3461
3753
  'gate-check': 'Usage: npx thumbgate gate-check\n\nPreToolUse hook interface: reads tool call JSON from stdin, outputs gate verdict.',
3754
+ 'typesafe-typed-questions': 'Usage: npx thumbgate typesafe-typed-questions [--payload=path] [--tool-name=Bash] [--command="..."] [--json] [--map-only] [--clone-jev]\n\nTypeSafe FORMAT steal: typed noul/choice/score over a PreToolUse payload, code-owned pass/review/block. Does not install typesafe-sdk or call Jev.',
3755
+ 'colab-compute-honesty': 'Usage: npx thumbgate colab-compute-honesty [--claim="..."] [--plan-proof=proplus] [--json] [--map-only]\n\nColab /signup FORMAT steal: Compute Units ≠ dedicated GPU; Subscribe ≠ receipt. Does not buy Pro/Pro+.',
3462
3756
  'claim-stop-check': 'Usage: npx thumbgate claim-stop-check\n\nClaude Stop-hook interface: reads the hook payload from stdin and blocks factual claims that disagree with configured sources.',
3463
3757
  'verify-claims': 'Usage: npx thumbgate verify-claims --claim="the row count is 1,284" [--config=.thumbgate/claim-verifiers.json] [--cwd=path] [--json]\n\nRecheck supported factual claims against operator-configured SQLite, filesystem, and JSON sources. Exits non-zero on mismatch, missing verifier, or verifier error.',
3464
3758
  'hermes-gate': 'Usage: npx thumbgate hermes-gate\n\nNous Research Hermes Agent pre_tool_call shell hook: reads Hermes tool-call JSON from stdin, runs the ThumbGate gate pipeline (strict by default), and outputs {"decision":"block","reason":...} to veto or {} to allow. Gates terminal/patch/skill_manage etc. See adapters/hermes/config.yaml.',
@@ -3473,6 +3767,8 @@ const SUBCOMMAND_HELP = {
3473
3767
  compact: 'Usage: npx thumbgate compact\n\nCompact the lesson database and reclaim disk space.',
3474
3768
  'context-packs': 'Usage: npx thumbgate context-packs\n\nGenerate context packs from top failure patterns.',
3475
3769
  suggest: 'Usage: npx thumbgate suggest <gate-id>\n\nSuggest fixes for a specific gate based on lesson history.',
3770
+ inventory: 'Usage: npx thumbgate inventory [--json] [--days=N] [--data-dir=path] [--max-bytes=N]\n\nRead-only inventory of agent activity in this repo\'s ThumbGate store: agents seen, tool calls by tool, allow/deny counts, deny reasons per gate, top gates, per-day activity, and the false-deny rate.\n\nEvery source reports its own status (ok / empty / missing) so an uninstrumented store never looks like a quiet one. falseDenyRate is null with a stated reason whenever a real denominator was not observed; falseDenyNumerator and falseDenyDenominator are always emitted raw.\n\nEach source is read as a bounded tail (default 8 MiB, --max-bytes to change) so a multi-hundred-MB audit log is never loaded whole. If the tail did not reach back to the start of the window, windowFullyCovered is false and the text output says so.',
3771
+ 'conflict-audit': 'Usage: npx thumbgate conflict-audit [--json] [--offline] [--repo-root=path] [--github-repo=owner/name] [--branch=main] [--consecutive-failures=N] [--excluded-lines=N] [--commits=N]\n\nDeterministic detector for controls that report success but enforce nothing. Six detectors, no model involved:\n\n D1 gate configs declaring a `patterns` array when the engine reads `pattern` (the match block is skipped, so the gate fires on every tool in its toolNames)\n D2 gate patterns that cannot compile (an inline (?i) flag group throws; the engine swallows the throw as "no match")\n D3 checks required by NEITHER classic branch protection NOR any repository ruleset, which have failed on N or more consecutive recent commits\n D4 sonar.exclusions / sonar.coverage.exclusions entries that hide non-trivial code inside sonar.sources from scanning\n D5 modules and entry exports with zero production call sites outside their own tests (for a PUBLISHED package the entry surface is public API whose callers are downstream npm consumers, so those are reported NOT INSPECTED rather than dead)\n D6 the bare `path.resolve(process.argv[1]) === path.resolve(__filename)` main check, which no-ops under an npm bin shim\n\nEvery detector reports its own status: `ran` (inspected), `partial` (some of the surface was not inspected, and which), or `unavailable` (could not inspect at all). An unavailable detector is NEVER reported as clean. D3 needs the `gh` CLI (resolved from a fixed install location, never through $PATH) plus read access to branch protection and repository rulesets; use --offline to skip it explicitly.',
3476
3772
  cost: 'Usage: npx thumbgate cost [--json] [--stats <path>] [--mix \'{"claude-sonnet-4-5":0.8,...}\']\n\nShow cumulative $ and tokens saved by PreToolUse gate blocks. Reads ~/.thumbgate/gate-stats.json.',
3477
3773
  savings: 'Usage: npx thumbgate savings [--json] [--stats <path>] [--mix \'{"claude-sonnet-4-5":0.8,...}\']\n\nAlias for `thumbgate cost`.',
3478
3774
  'setup-vertex': 'Usage: npx thumbgate setup-vertex [--dry-run]\n\nAuto-enable Vertex AI API on GCP and write local Vertex routing config to .env. With --dry-run, only detect the active account/project and print the planned changes. This does not create or verify a Dialogflow CX agent; use the Dialogflow CX REST API or console for live-agent evidence.',
@@ -3923,14 +4219,66 @@ switch (COMMAND) {
3923
4219
  generateAgentReadinessReport,
3924
4220
  reportToText,
3925
4221
  } = require(path.join(PKG_ROOT, 'scripts', 'agent-readiness'));
4222
+ const { wiringReport, formatReport } = require(path.join(PKG_ROOT, 'scripts', 'mcp-wiring-doctor'));
3926
4223
  const args = parseArgs(process.argv.slice(3));
3927
4224
  const report = generateAgentReadinessReport({ projectRoot: CWD });
4225
+ const wiring = wiringReport(CWD);
3928
4226
  if (args.json) {
3929
- console.log(JSON.stringify(report, null, 2));
4227
+ console.log(JSON.stringify({ ...report, wiring }, null, 2));
3930
4228
  } else {
3931
4229
  process.stdout.write(reportToText(report));
4230
+ process.stdout.write(`\n${formatReport(wiring)}\n`);
3932
4231
  }
3933
- process.exit(report.overallStatus === 'ready' ? 0 : 1);
4232
+ const ready = report.overallStatus === 'ready' && wiring.overall !== 'error';
4233
+ process.exit(ready ? 0 : 1);
4234
+ break;
4235
+ }
4236
+ case 'compass':
4237
+ case 'pipeline':
4238
+ case 'pipeline-compass': {
4239
+ const { getPipelineCompass, formatPipelineCompass } = require(path.join(PKG_ROOT, 'src', 'pipeline-compass'));
4240
+ const args = parseArgs(process.argv.slice(3));
4241
+ const report = getPipelineCompass({ projectRoot: CWD });
4242
+ if (args.json) console.log(JSON.stringify(report, null, 2));
4243
+ else console.log(formatPipelineCompass(report));
4244
+ process.exit(report.ready ? 0 : 1);
4245
+ break;
4246
+ }
4247
+ case 'writeguard':
4248
+ case 'mcp-writeguard': {
4249
+ const { main } = require(path.join(PKG_ROOT, 'scripts', 'mcp-writeguard'));
4250
+ main();
4251
+ break;
4252
+ }
4253
+ case 'latency':
4254
+ case 'latency-budget': {
4255
+ const { main } = require(path.join(PKG_ROOT, 'scripts', 'latency-budget'));
4256
+ main();
4257
+ break;
4258
+ }
4259
+ case 'wiring-doctor':
4260
+ case 'mcp-wiring-doctor': {
4261
+ const { wiringReport, formatReport, applyFix } = require(path.join(PKG_ROOT, 'scripts', 'mcp-wiring-doctor'));
4262
+ const args = parseArgs(process.argv.slice(3));
4263
+ if (args.fix) applyFix(CWD);
4264
+ const wiring = wiringReport(CWD);
4265
+ if (args.json) console.log(JSON.stringify(wiring, null, 2));
4266
+ else console.log(formatReport(wiring));
4267
+ process.exit(wiring.overall === 'error' ? 2 : wiring.overall === 'warning' ? 1 : 0);
4268
+ break;
4269
+ }
4270
+ case 'security-central':
4271
+ case 'security:central':
4272
+ case 'agent-security-central': {
4273
+ const {
4274
+ buildSecurityCentralReport,
4275
+ formatSecurityCentralReport,
4276
+ } = require(path.join(PKG_ROOT, 'scripts', 'agent-security-central'));
4277
+ const args = parseArgs(process.argv.slice(3));
4278
+ const report = buildSecurityCentralReport({ projectRoot: CWD });
4279
+ if (args.json) console.log(JSON.stringify(report, null, 2));
4280
+ else console.log(formatSecurityCentralReport(report));
4281
+ process.exit(report.posture.band === 'critical' ? 2 : report.posture.band === 'at_risk' ? 1 : 0);
3934
4282
  break;
3935
4283
  }
3936
4284
  case 'export-dpo':
@@ -3994,6 +4342,73 @@ switch (COMMAND) {
3994
4342
  case 'sparse-attention-runtime-guardrails':
3995
4343
  deepseekV4RuntimeGuardrails();
3996
4344
  break;
4345
+ case 'nvidia-specdecode-al-doctor':
4346
+ case 'specdecode-al-doctor':
4347
+ case 'speculative-decoding-al-doctor':
4348
+ case 'nvidia-speculative-decoding-doctor':
4349
+ nvidiaSpecDecodeAlDoctor();
4350
+ break;
4351
+ case 'package-manager-honesty-doctor':
4352
+ case 'pm-honesty-doctor':
4353
+ case 'pnpm12-honesty-doctor':
4354
+ case 'lockfile-ci-parity-doctor':
4355
+ packageManagerHonestyDoctor();
4356
+ break;
4357
+ case 'openui-catalog-compose-honesty':
4358
+ case 'openui-honesty-doctor':
4359
+ case 'catalog-compose-honesty':
4360
+ case 'repair-before-compose-claim':
4361
+ openuiCatalogComposeHonestyDoctor();
4362
+ break;
4363
+ case 'allowlist-bridge-honesty':
4364
+ case 'gitlab-sandbox-allowlist':
4365
+ case 'allowlist-not-trust':
4366
+ case 'trust-handoff-honesty':
4367
+ allowlistBridgeHonestyDoctor();
4368
+ break;
4369
+ case 'jit-harness-compose':
4370
+ case 'jit-compose':
4371
+ case 'jit-harness':
4372
+ case 'harness-compose':
4373
+ jitHarnessCompose();
4374
+ break;
4375
+ case 'cobble-hot-store-split':
4376
+ case 'cobble-hot-store':
4377
+ case 'cobbledb-split':
4378
+ case 'hot-store-split':
4379
+ cobbleHotStoreSplit();
4380
+ break;
4381
+ case 'token-shunt-honesty':
4382
+ case 'token-shunt':
4383
+ case 'shunt-honesty':
4384
+ tokenShuntHonesty();
4385
+ break;
4386
+ case 'typesafe-typed-questions':
4387
+ case 'typesafe-hook':
4388
+ case 'typed-questions':
4389
+ case 'jev-typed-questions':
4390
+ typesafeTypedQuestionsDoctor();
4391
+ break;
4392
+ case 'colab-compute-honesty':
4393
+ case 'colab-honesty':
4394
+ case 'compute-unit-honesty':
4395
+ colabComputeHonestyDoctor();
4396
+ break;
4397
+ case 'workspace-search-route':
4398
+ case 'zg-search-route':
4399
+ case 'zvec-grep-route':
4400
+ case 'search-route':
4401
+ workspaceSearchRoute().catch((err) => {
4402
+ console.error(err && err.stack ? err.stack : err);
4403
+ process.exitCode = 1;
4404
+ });
4405
+ break;
4406
+ case 'intent-governed-execution':
4407
+ case 'governed-intent':
4408
+ case 'cyberstrike-governed':
4409
+ case 'intent-govern':
4410
+ intentGovernedExecution();
4411
+ break;
3997
4412
  case 'long-running-agent-context-guardrails':
3998
4413
  case 'agent-context-guardrails':
3999
4414
  case 'slack-context-guardrails':
@@ -4327,6 +4742,53 @@ switch (COMMAND) {
4327
4742
  runAnalytics();
4328
4743
  break;
4329
4744
  }
4745
+ case 'inventory': {
4746
+ // Read-only rollup of what agents did in this repo's ThumbGate store:
4747
+ // tool calls, allow/deny counts, deny reasons per gate, per-day activity,
4748
+ // and the false-deny rate (null when it cannot be honestly computed).
4749
+ const inventoryArgs = parseArgs(process.argv.slice(3));
4750
+ const {
4751
+ buildInventory,
4752
+ renderInventoryText,
4753
+ } = require(path.join(PKG_ROOT, 'scripts', 'agent-action-inventory'));
4754
+ const { resolveFeedbackDir } = require(path.join(PKG_ROOT, 'scripts', 'feedback-paths'));
4755
+ const inventory = buildInventory({
4756
+ dataDir: inventoryArgs['data-dir'] || resolveFeedbackDir(),
4757
+ windowDays: inventoryArgs.days,
4758
+ maxBytes: inventoryArgs['max-bytes'] ? Number(inventoryArgs['max-bytes']) : undefined,
4759
+ });
4760
+ if (inventoryArgs.json) {
4761
+ console.log(JSON.stringify(inventory, null, 2));
4762
+ } else {
4763
+ process.stdout.write(renderInventoryText(inventory));
4764
+ }
4765
+ break;
4766
+ }
4767
+ case 'conflict-audit': {
4768
+ // Deterministic sweep for controls that report success but enforce
4769
+ // nothing. Each detector reports its own status, so a surface that could
4770
+ // not be inspected is never rendered as a clean bill of health.
4771
+ const conflictArgs = parseArgs(process.argv.slice(3));
4772
+ const {
4773
+ auditGovernanceConflicts,
4774
+ renderConflictAuditText,
4775
+ } = require(path.join(PKG_ROOT, 'scripts', 'governance-conflict-audit'));
4776
+ const conflictReport = auditGovernanceConflicts({
4777
+ repoRoot: conflictArgs['repo-root'] || process.cwd(),
4778
+ gitHubRepo: conflictArgs['github-repo'],
4779
+ branch: conflictArgs.branch,
4780
+ consecutiveFailureThreshold: conflictArgs['consecutive-failures'],
4781
+ excludedLineThreshold: conflictArgs['excluded-lines'],
4782
+ commitLimit: conflictArgs.commits,
4783
+ offline: Boolean(conflictArgs.offline),
4784
+ });
4785
+ if (conflictArgs.json) {
4786
+ console.log(JSON.stringify(conflictReport, null, 2));
4787
+ } else {
4788
+ process.stdout.write(`${renderConflictAuditText(conflictReport)}\n`);
4789
+ }
4790
+ break;
4791
+ }
4330
4792
  case 'start-api':
4331
4793
  startApi();
4332
4794
  break;
@@ -4408,7 +4870,7 @@ switch (COMMAND) {
4408
4870
  });
4409
4871
  req.on('error', (err) => {
4410
4872
  console.error(`✗ Subscribe failed: ${err.message}`);
4411
- console.error(' Network issue? Try again, or email igor.ganapolsky@gmail.com directly.');
4873
+ console.error(' Network issue? Try again, or email support@thumbgate.ai directly.');
4412
4874
  process.exit(3);
4413
4875
  });
4414
4876
  req.on('timeout', () => {
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ // Requiring the module is not enough: its CLI only self-executes when the
5
+ // module itself is the entry point, so `futureagi-bridge --doctor` used to
6
+ // exit 0 having evaluated nothing.
7
+ const { mainCli } = require('../scripts/future-agi-evaluator.js');
8
+
9
+ process.exit(mainCli());