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.
- package/.agents/skills/cobble-hot-store-compare-not-clone/SKILL.md +80 -0
- package/.agents/skills/colab-compute-honesty-not-clone/SKILL.md +70 -0
- package/.agents/skills/cyberstrike-compare-not-clone/SKILL.md +36 -0
- package/.agents/skills/gitlab-sandbox-allowlist-not-trust/SKILL.md +77 -0
- package/.agents/skills/jit-harness-compare-not-clone/SKILL.md +34 -0
- package/.agents/skills/openui-catalog-compose-honesty/SKILL.md +64 -0
- package/.agents/skills/token-shunt-honesty-not-clone/SKILL.md +67 -0
- package/.agents/skills/typesafe-typed-questions-not-clone/SKILL.md +82 -0
- package/.agents/skills/zvec-grep-compare-not-clone/SKILL.md +34 -0
- package/.claude-plugin/plugin.json +1 -1
- package/.well-known/llms.txt +1 -0
- package/.well-known/mcp/server-card.json +1 -1
- package/CONTRIBUTING.md +95 -0
- package/README.md +195 -632
- package/THIRD_PARTY_NOTICES.md +89 -0
- package/adapters/claude/.mcp.json +2 -2
- package/adapters/forge/forge.yaml +3 -3
- package/adapters/future-agi/.mcp.json +8 -0
- package/adapters/future-agi/FUTURE_AGI.md +23 -0
- package/adapters/future-agi/config.toml +3 -0
- package/adapters/future-agi/future-agi-bridge.js +9 -0
- package/adapters/future-agi/opencode.json +8 -0
- package/adapters/herdr/herdr-plugin.toml +18 -0
- package/adapters/mcp/server-stdio.js +238 -25
- package/adapters/opencode/opencode.json +1 -1
- package/adapters/workos/WORKOS.md +52 -0
- package/bin/cli.js +465 -3
- package/bin/futureagi-bridge +9 -0
- package/config/gate-templates.json +629 -4
- package/config/gates/actor-critic-audit.json +34 -0
- package/config/gates/default.json +9 -3
- package/config/gates/five-walls-governance.json +34 -0
- package/config/gates/future-agi-guardrails.json +34 -0
- package/config/gates/radware-threat-defense-2026.json +61 -0
- package/config/gates/simatree-data-governance.json +33 -0
- package/config/mcp-allowlists.json +4 -0
- package/config/merge-quality-checks.json +6 -0
- package/config/model-candidates.json +312 -29
- package/config/model-tiers.json +18 -0
- package/config/post-deploy-marketing-pages.json +10 -0
- package/config/progressive/01-wire-only.json +11 -0
- package/config/progressive/02-dashboard-empty-ok.json +10 -0
- package/config/progressive/03-one-lesson.json +10 -0
- package/config/progressive/04-warn-fires.json +11 -0
- package/config/progressive/05-strict-optional.json +11 -0
- package/config/progressive/README.md +15 -0
- package/config/schemas/broker-execution-receipt.schema.json +139 -0
- package/config/schemas/provider-execution-attestation-v1.schema.json +58 -0
- package/conformance/provider-attestation/vectors.json +320 -0
- package/docs/specs/provider-execution-attestation-v1.md +69 -0
- package/openapi/openapi.yaml +15 -0
- package/package.json +408 -150
- package/public/about.html +2 -2
- package/public/ai-malpractice-prevention.html +7 -7
- package/public/blog/a-10-dollar-vps-is-not-a-computer.html +143 -0
- package/public/blog/a-receipt-is-not-world-state.html +388 -0
- package/public/blog/git-at-agent-scale.html +374 -0
- package/public/blog/no-llm-in-the-gate.html +133 -0
- package/public/blog.html +80 -0
- package/public/case-studies.html +16 -1
- package/public/compare.html +28 -0
- package/public/diagnostic.html +216 -7
- package/public/docs/connectors.html +39 -0
- package/public/federal.html +2 -2
- package/public/founders.html +639 -0
- package/public/index.html +87 -9
- package/public/install.html +8 -8
- package/public/learn.html +39 -0
- package/public/numbers.html +2 -2
- package/public/peter.html +310 -0
- package/public/platform-partners.html +119 -0
- package/public/pricing.html +24 -3
- package/public/privacy.html +117 -0
- package/public/pro.html +17 -0
- package/public/support.html +62 -0
- package/public/terms.html +130 -0
- package/public/third-party-notices.html +95 -0
- package/public/yt.html +351 -0
- package/scripts/action-receipts.js +133 -3
- package/scripts/adaptive-governance-arena.js +349 -0
- package/scripts/admin-override.js +205 -0
- package/scripts/agent-action-inventory.js +869 -0
- package/scripts/agent-audit-trace.js +42 -2
- package/scripts/agent-egress-policy.js +1117 -0
- package/scripts/agent-memory-lifecycle.js +141 -2
- package/scripts/agent-operations-planner.js +441 -1
- package/scripts/agent-readiness.js +68 -0
- package/scripts/agent-security-central.js +647 -0
- package/scripts/allowlist-bridge-honesty.js +417 -0
- package/scripts/async-job-runner.js +102 -11
- package/scripts/audit-trail.js +212 -0
- package/scripts/billing.js +1 -1
- package/scripts/broker-execution-receipts.js +719 -0
- package/scripts/budget-aware-gates-proof.js +423 -0
- package/scripts/claude-feedback-sync.js +29 -3
- package/scripts/claw-harness-production.js +237 -0
- package/scripts/cli-schema.js +203 -1
- package/scripts/cobble-hot-store-split.js +600 -0
- package/scripts/codex-runbook-flywheel.js +318 -0
- package/scripts/colab-compute-honesty.js +281 -0
- package/scripts/context-footprint.js +186 -0
- package/scripts/contextfs.js +143 -61
- package/scripts/dashboard.js +251 -32
- package/scripts/deepseek-v4-runtime-guardrails.js +72 -6
- package/scripts/docker-sandbox-planner.js +18 -0
- package/scripts/double-blind-eval-protocol.js +252 -0
- package/scripts/edotenv-rl-gateway.js +259 -0
- package/scripts/ensure-production-search-corpus.js +162 -0
- package/scripts/eval-holdout.js +311 -0
- package/scripts/feedback-aggregate.js +21 -2
- package/scripts/feedback-loop.js +87 -5
- package/scripts/feedback-quality.js +9 -0
- package/scripts/file-ledger-lock.js +4 -1
- package/scripts/financial-control-plane.js +41 -1
- package/scripts/find-dormant-requires.js +118 -0
- package/scripts/fs-utils.js +84 -8
- package/scripts/gates-engine.js +826 -68
- package/scripts/generate-case-study-outreach.js +24 -15
- package/scripts/git-at-scale.js +628 -0
- package/scripts/governance-conflict-audit.js +1650 -0
- package/scripts/governance-difficulty-curriculum.js +328 -0
- package/scripts/graphrag-retrieval.js +275 -0
- package/scripts/gurobi-optimizer.js +324 -0
- package/scripts/gurobi_optimizer.py +485 -0
- package/scripts/harness-selector.js +82 -1
- package/scripts/hidden-entry-points.js +284 -0
- package/scripts/human-escalation.js +199 -1
- package/scripts/hybrid-feedback-context.js +152 -19
- package/scripts/intent-governed-execution.js +602 -0
- package/scripts/intervention-policy.js +123 -20
- package/scripts/jit-harness-compose.js +628 -0
- package/scripts/jsonl-watcher.js +10 -0
- package/scripts/lesson-embedding-index.js +95 -12
- package/scripts/lesson-retrieval.js +105 -19
- package/scripts/local-model-profile.js +19 -2
- package/scripts/mailer/resend-mailer.js +1 -1
- package/scripts/matryoshka-embedding.js +235 -0
- package/scripts/mcp-oauth.js +42 -4
- package/scripts/mcp-session-handles.js +1016 -0
- package/scripts/mcp-wiring-doctor.js +314 -0
- package/scripts/memory-firewall.js +115 -2
- package/scripts/memory-scope-readiness.js +299 -0
- package/scripts/memory-vs-rag-route.js +161 -0
- package/scripts/model-tier-router.js +148 -21
- package/scripts/nvidia-specdecode-al-doctor.js +536 -0
- package/scripts/openui-catalog-compose-honesty.js +593 -0
- package/scripts/operational-integrity.js +19 -1
- package/scripts/override-audit.js +213 -0
- package/scripts/package-manager-honesty-doctor.js +458 -0
- package/scripts/pr-manager.js +63 -1
- package/scripts/prove-herdr-adapter.js +52 -0
- package/scripts/prove-memory-pyramid-and-symbolic-canvas.js +95 -0
- package/scripts/prove-workos.js +73 -0
- package/scripts/provider-attestation-conformance.js +192 -0
- package/scripts/provider-receipt-contract.js +136 -0
- package/scripts/qwen38-max-cost-optimizer.js +401 -0
- package/scripts/radware-threat-defense.js +280 -0
- package/scripts/rag-embedding-identity.js +221 -0
- package/scripts/rag-precision-guardrails.js +112 -2
- package/scripts/remote-feedback-capture.js +159 -0
- package/scripts/research-agent-harness.js +256 -0
- package/scripts/rsi-safety-hillclimb.js +200 -0
- package/scripts/rule-sprawl.js +188 -0
- package/scripts/schedule-manager.js +147 -0
- package/scripts/self-heal.js +8 -0
- package/scripts/session-lease.js +415 -0
- package/scripts/simatree-data-governance.js +347 -0
- package/scripts/slo-alert-engine.js +172 -7
- package/scripts/solver-parity.js +539 -0
- package/scripts/stealth-memory-injection-gate.js +333 -0
- package/scripts/switchyard-router.js +366 -0
- package/scripts/telemetry-analytics.js +84 -27
- package/scripts/temporal-decay-weighting.js +138 -0
- package/scripts/test-all.js +165 -0
- package/scripts/token-savings.js +42 -0
- package/scripts/token-shunt-honesty.js +502 -0
- package/scripts/tool-kpi-tracker.js +108 -5
- package/scripts/tool-registry.js +193 -5
- package/scripts/typesafe-typed-questions.js +813 -0
- package/scripts/universal-claim-evaluator.js +14 -2
- package/scripts/vector-store.js +279 -9
- package/scripts/workflow-notebook.js +391 -0
- package/scripts/workflow-sentinel.js +111 -12
- package/scripts/workos-production-guard.js +260 -0
- package/scripts/workspace-search-route.js +515 -0
- package/server.json +2 -2
- package/src/agent-identity-boundary.js +76 -0
- package/src/agent-retrieval-cache.js +155 -0
- package/src/alert-noise-ledger.js +502 -0
- package/src/api/server.js +724 -153
- package/src/git-fast-cache.js +220 -0
- package/src/git-wal-sync.js +156 -0
- package/src/hash-anchored-edit.js +82 -0
- package/src/hermes-platform-protocol.js +475 -0
- package/src/hermes-sync-plane.js +241 -0
- package/src/index.js +30 -1
- package/src/iso42001-compliance-guard.js +97 -0
- package/src/latency-budget.js +244 -0
- package/src/mcp-writeguard.js +316 -0
- package/src/miminions-adapter.js +106 -0
- package/src/pipeline-compass.js +104 -0
- package/src/ppl-alert-pipeline.js +284 -0
- package/src/rendezvous-router.js +90 -0
- 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
|
-
|
|
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
|
|
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());
|