thumbgate 1.35.0 → 1.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/.agents/skills/cyberstrike-compare-not-clone/SKILL.md +36 -0
  2. package/.agents/skills/gitlab-sandbox-allowlist-not-trust/SKILL.md +77 -0
  3. package/.agents/skills/jit-harness-compare-not-clone/SKILL.md +34 -0
  4. package/.agents/skills/openui-catalog-compose-honesty/SKILL.md +64 -0
  5. package/.agents/skills/zvec-grep-compare-not-clone/SKILL.md +34 -0
  6. package/.claude-plugin/plugin.json +1 -1
  7. package/.well-known/llms.txt +1 -0
  8. package/.well-known/mcp/server-card.json +1 -1
  9. package/CONTRIBUTING.md +95 -0
  10. package/README.md +195 -632
  11. package/THIRD_PARTY_NOTICES.md +89 -0
  12. package/adapters/claude/.mcp.json +2 -2
  13. package/adapters/forge/forge.yaml +3 -3
  14. package/adapters/future-agi/.mcp.json +8 -0
  15. package/adapters/future-agi/FUTURE_AGI.md +23 -0
  16. package/adapters/future-agi/config.toml +3 -0
  17. package/adapters/future-agi/future-agi-bridge.js +9 -0
  18. package/adapters/future-agi/opencode.json +8 -0
  19. package/adapters/herdr/herdr-plugin.toml +18 -0
  20. package/adapters/mcp/server-stdio.js +238 -25
  21. package/adapters/opencode/opencode.json +1 -1
  22. package/adapters/workos/WORKOS.md +52 -0
  23. package/bin/cli.js +336 -3
  24. package/bin/futureagi-bridge +9 -0
  25. package/config/gate-templates.json +581 -4
  26. package/config/gates/actor-critic-audit.json +34 -0
  27. package/config/gates/default.json +9 -3
  28. package/config/gates/five-walls-governance.json +34 -0
  29. package/config/gates/future-agi-guardrails.json +34 -0
  30. package/config/gates/radware-threat-defense-2026.json +61 -0
  31. package/config/gates/simatree-data-governance.json +33 -0
  32. package/config/mcp-allowlists.json +4 -0
  33. package/config/merge-quality-checks.json +6 -0
  34. package/config/model-candidates.json +312 -29
  35. package/config/model-tiers.json +18 -0
  36. package/config/post-deploy-marketing-pages.json +10 -0
  37. package/config/progressive/01-wire-only.json +11 -0
  38. package/config/progressive/02-dashboard-empty-ok.json +10 -0
  39. package/config/progressive/03-one-lesson.json +10 -0
  40. package/config/progressive/04-warn-fires.json +11 -0
  41. package/config/progressive/05-strict-optional.json +11 -0
  42. package/config/progressive/README.md +15 -0
  43. package/config/schemas/broker-execution-receipt.schema.json +139 -0
  44. package/config/schemas/provider-execution-attestation-v1.schema.json +58 -0
  45. package/conformance/provider-attestation/vectors.json +320 -0
  46. package/docs/specs/provider-execution-attestation-v1.md +69 -0
  47. package/openapi/openapi.yaml +15 -0
  48. package/package.json +390 -148
  49. package/public/about.html +2 -2
  50. package/public/ai-malpractice-prevention.html +7 -7
  51. package/public/blog/a-10-dollar-vps-is-not-a-computer.html +143 -0
  52. package/public/blog/a-receipt-is-not-world-state.html +388 -0
  53. package/public/blog/git-at-agent-scale.html +374 -0
  54. package/public/blog/no-llm-in-the-gate.html +133 -0
  55. package/public/blog.html +80 -0
  56. package/public/case-studies.html +16 -1
  57. package/public/compare.html +28 -0
  58. package/public/diagnostic.html +216 -7
  59. package/public/docs/connectors.html +39 -0
  60. package/public/federal.html +2 -2
  61. package/public/founders.html +639 -0
  62. package/public/index.html +87 -9
  63. package/public/install.html +8 -8
  64. package/public/learn.html +39 -0
  65. package/public/numbers.html +2 -2
  66. package/public/peter.html +310 -0
  67. package/public/platform-partners.html +119 -0
  68. package/public/pricing.html +24 -3
  69. package/public/privacy.html +117 -0
  70. package/public/pro.html +17 -0
  71. package/public/support.html +62 -0
  72. package/public/terms.html +130 -0
  73. package/public/third-party-notices.html +95 -0
  74. package/public/yt.html +351 -0
  75. package/scripts/action-receipts.js +133 -3
  76. package/scripts/adaptive-governance-arena.js +349 -0
  77. package/scripts/admin-override.js +205 -0
  78. package/scripts/agent-action-inventory.js +869 -0
  79. package/scripts/agent-audit-trace.js +42 -2
  80. package/scripts/agent-egress-policy.js +1117 -0
  81. package/scripts/agent-memory-lifecycle.js +141 -2
  82. package/scripts/agent-operations-planner.js +441 -1
  83. package/scripts/agent-readiness.js +68 -0
  84. package/scripts/agent-security-central.js +647 -0
  85. package/scripts/allowlist-bridge-honesty.js +417 -0
  86. package/scripts/async-job-runner.js +102 -11
  87. package/scripts/audit-trail.js +212 -0
  88. package/scripts/billing.js +1 -1
  89. package/scripts/broker-execution-receipts.js +719 -0
  90. package/scripts/budget-aware-gates-proof.js +423 -0
  91. package/scripts/claude-feedback-sync.js +29 -3
  92. package/scripts/claw-harness-production.js +237 -0
  93. package/scripts/cli-schema.js +163 -1
  94. package/scripts/codex-runbook-flywheel.js +318 -0
  95. package/scripts/context-footprint.js +186 -0
  96. package/scripts/contextfs.js +143 -61
  97. package/scripts/dashboard.js +251 -32
  98. package/scripts/deepseek-v4-runtime-guardrails.js +72 -6
  99. package/scripts/docker-sandbox-planner.js +18 -0
  100. package/scripts/double-blind-eval-protocol.js +252 -0
  101. package/scripts/edotenv-rl-gateway.js +259 -0
  102. package/scripts/ensure-production-search-corpus.js +162 -0
  103. package/scripts/eval-holdout.js +311 -0
  104. package/scripts/feedback-aggregate.js +21 -2
  105. package/scripts/feedback-loop.js +87 -5
  106. package/scripts/feedback-quality.js +9 -0
  107. package/scripts/file-ledger-lock.js +4 -1
  108. package/scripts/financial-control-plane.js +41 -1
  109. package/scripts/find-dormant-requires.js +118 -0
  110. package/scripts/fs-utils.js +84 -8
  111. package/scripts/gates-engine.js +810 -63
  112. package/scripts/generate-case-study-outreach.js +24 -15
  113. package/scripts/git-at-scale.js +628 -0
  114. package/scripts/governance-conflict-audit.js +1650 -0
  115. package/scripts/governance-difficulty-curriculum.js +328 -0
  116. package/scripts/graphrag-retrieval.js +275 -0
  117. package/scripts/gurobi-optimizer.js +324 -0
  118. package/scripts/gurobi_optimizer.py +485 -0
  119. package/scripts/harness-selector.js +82 -1
  120. package/scripts/hidden-entry-points.js +284 -0
  121. package/scripts/human-escalation.js +199 -1
  122. package/scripts/hybrid-feedback-context.js +152 -19
  123. package/scripts/intent-governed-execution.js +602 -0
  124. package/scripts/intervention-policy.js +123 -20
  125. package/scripts/jit-harness-compose.js +628 -0
  126. package/scripts/jsonl-watcher.js +10 -0
  127. package/scripts/lesson-embedding-index.js +95 -12
  128. package/scripts/lesson-retrieval.js +105 -19
  129. package/scripts/local-model-profile.js +19 -2
  130. package/scripts/mailer/resend-mailer.js +1 -1
  131. package/scripts/matryoshka-embedding.js +235 -0
  132. package/scripts/mcp-oauth.js +42 -4
  133. package/scripts/mcp-session-handles.js +1016 -0
  134. package/scripts/mcp-wiring-doctor.js +314 -0
  135. package/scripts/memory-firewall.js +115 -2
  136. package/scripts/memory-scope-readiness.js +299 -0
  137. package/scripts/memory-vs-rag-route.js +161 -0
  138. package/scripts/model-tier-router.js +148 -21
  139. package/scripts/nvidia-specdecode-al-doctor.js +536 -0
  140. package/scripts/openui-catalog-compose-honesty.js +593 -0
  141. package/scripts/operational-integrity.js +19 -1
  142. package/scripts/override-audit.js +213 -0
  143. package/scripts/package-manager-honesty-doctor.js +458 -0
  144. package/scripts/pr-manager.js +63 -1
  145. package/scripts/prove-herdr-adapter.js +52 -0
  146. package/scripts/prove-memory-pyramid-and-symbolic-canvas.js +95 -0
  147. package/scripts/prove-workos.js +73 -0
  148. package/scripts/provider-attestation-conformance.js +192 -0
  149. package/scripts/provider-receipt-contract.js +136 -0
  150. package/scripts/qwen38-max-cost-optimizer.js +401 -0
  151. package/scripts/radware-threat-defense.js +280 -0
  152. package/scripts/rag-embedding-identity.js +221 -0
  153. package/scripts/rag-precision-guardrails.js +112 -2
  154. package/scripts/remote-feedback-capture.js +159 -0
  155. package/scripts/research-agent-harness.js +256 -0
  156. package/scripts/rsi-safety-hillclimb.js +200 -0
  157. package/scripts/rule-sprawl.js +188 -0
  158. package/scripts/schedule-manager.js +147 -0
  159. package/scripts/self-heal.js +8 -0
  160. package/scripts/session-lease.js +415 -0
  161. package/scripts/simatree-data-governance.js +347 -0
  162. package/scripts/slo-alert-engine.js +172 -7
  163. package/scripts/solver-parity.js +539 -0
  164. package/scripts/stealth-memory-injection-gate.js +333 -0
  165. package/scripts/switchyard-router.js +366 -0
  166. package/scripts/telemetry-analytics.js +84 -27
  167. package/scripts/temporal-decay-weighting.js +138 -0
  168. package/scripts/test-all.js +165 -0
  169. package/scripts/token-savings.js +42 -0
  170. package/scripts/tool-kpi-tracker.js +108 -5
  171. package/scripts/tool-registry.js +193 -5
  172. package/scripts/universal-claim-evaluator.js +14 -2
  173. package/scripts/vector-store.js +279 -9
  174. package/scripts/workflow-notebook.js +391 -0
  175. package/scripts/workflow-sentinel.js +111 -12
  176. package/scripts/workos-production-guard.js +260 -0
  177. package/scripts/workspace-search-route.js +515 -0
  178. package/server.json +2 -2
  179. package/src/agent-identity-boundary.js +76 -0
  180. package/src/agent-retrieval-cache.js +155 -0
  181. package/src/alert-noise-ledger.js +502 -0
  182. package/src/api/server.js +724 -153
  183. package/src/git-fast-cache.js +220 -0
  184. package/src/git-wal-sync.js +156 -0
  185. package/src/hash-anchored-edit.js +82 -0
  186. package/src/hermes-platform-protocol.js +475 -0
  187. package/src/hermes-sync-plane.js +241 -0
  188. package/src/index.js +30 -1
  189. package/src/iso42001-compliance-guard.js +97 -0
  190. package/src/latency-budget.js +244 -0
  191. package/src/mcp-writeguard.js +316 -0
  192. package/src/miminions-adapter.js +106 -0
  193. package/src/pipeline-compass.js +104 -0
  194. package/src/ppl-alert-pipeline.js +284 -0
  195. package/src/rendezvous-router.js +90 -0
  196. package/src/security-questionnaire.js +195 -0
@@ -0,0 +1,260 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ /**
5
+ * workos-production-guard.js — Public, secret-free checks that thumbgate.app
6
+ * auth is on WorkOS Production AuthKit (not staging) and ordinary login has no
7
+ * max_age step-up. Enforces the $10/mo ops policy's "no public staging auth"
8
+ * rule. Does not call WorkOS billing APIs (no secrets).
9
+ *
10
+ * Uses Node built-in fetch (no shell PATH curl) so Sonar reliability stays clean
11
+ * and unit tests can inject a fetch implementation.
12
+ *
13
+ * Usage:
14
+ * node scripts/workos-production-guard.js
15
+ * node scripts/workos-production-guard.js --json
16
+ * node scripts/workos-production-guard.js --base https://thumbgate.app
17
+ * npm run prove:workos
18
+ */
19
+
20
+ const path = require('path');
21
+
22
+ const PROD_CLIENT_ID = 'client_' + '01KY0306CYDV6QSXE43QKM2ZXW';
23
+ const STAGING_CLIENT_ID = 'client_' + '01KY0305JKQ2D3AN0DN88A8EYM';
24
+ const PROD_AUTHKIT_HOST = 'progressive-mouse-13.authkit.app';
25
+
26
+ const EXPECTED_METHODS = [
27
+ { name: 'email', marker: 'continue with email' },
28
+ { name: 'google', marker: 'continue with google' },
29
+ ];
30
+
31
+ function parseArgs(argv) {
32
+ const args = { json: false, base: 'https://thumbgate.app' };
33
+ for (let i = 0; i < argv.length; i += 1) {
34
+ if (argv[i] === '--json') args.json = true;
35
+ else if (argv[i] === '--base') args.base = String(argv[++i] || args.base).replace(/\/$/, '');
36
+ else if (argv[i] === '--help' || argv[i] === '-h') args.help = true;
37
+ }
38
+ return args;
39
+ }
40
+
41
+ function defaultFetchImpl(url, options = {}) {
42
+ return fetch(url, {
43
+ method: options.method || 'GET',
44
+ redirect: options.redirect || 'manual',
45
+ headers: options.headers,
46
+ signal: options.signal,
47
+ });
48
+ }
49
+
50
+ async function fetchHeaders(url, fetchImpl, timeoutMs = 15000) {
51
+ const controller = new AbortController();
52
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
53
+ try {
54
+ const res = await fetchImpl(url, { method: 'GET', redirect: 'manual', signal: controller.signal });
55
+ const location = res.headers.get('location') || res.headers.get('Location') || null;
56
+ return { status: res.status, location, headers: res.headers };
57
+ } finally {
58
+ clearTimeout(timer);
59
+ }
60
+ }
61
+
62
+ async function fetchBody(url, fetchImpl, timeoutMs = 15000) {
63
+ const controller = new AbortController();
64
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
65
+ try {
66
+ const res = await fetchImpl(url, { method: 'GET', redirect: 'follow', signal: controller.signal });
67
+ return await res.text();
68
+ } finally {
69
+ clearTimeout(timer);
70
+ }
71
+ }
72
+
73
+ async function checkSignInMethods(finalUrl, fetchImpl) {
74
+ const failures = [];
75
+ const warnings = [];
76
+ let body = '';
77
+ try {
78
+ body = (await fetchBody(finalUrl, fetchImpl)).toLowerCase();
79
+ } catch (error) {
80
+ warnings.push(`could not fetch AuthKit page body to verify sign-in methods: ${error.message}`);
81
+ return { failures, warnings, methodsFound: [] };
82
+ }
83
+ const methodsFound = [];
84
+ for (const method of EXPECTED_METHODS) {
85
+ if (body.includes(method.marker)) {
86
+ methodsFound.push(method.name);
87
+ } else {
88
+ failures.push(
89
+ `expected sign-in method "${method.name}" (marker "${method.marker}") not found on ` +
90
+ `the hosted AuthKit page — either it was disabled and EXPECTED_METHODS needs updating, ` +
91
+ `or this is an unintentional regression`,
92
+ );
93
+ }
94
+ }
95
+ return { failures, warnings, methodsFound };
96
+ }
97
+
98
+ async function followHosts(startUrl, fetchImpl, maxHops = 8) {
99
+ const hosts = [];
100
+ let url = startUrl;
101
+ for (let i = 0; i < maxHops; i += 1) {
102
+ let host;
103
+ try {
104
+ host = new URL(url).host;
105
+ } catch {
106
+ break;
107
+ }
108
+ hosts.push(host);
109
+ let location = null;
110
+ try {
111
+ const headers = await fetchHeaders(url, fetchImpl);
112
+ location = headers.location;
113
+ } catch {
114
+ break;
115
+ }
116
+ if (!location) break;
117
+ try {
118
+ url = new URL(location, url).toString();
119
+ } catch {
120
+ url = location;
121
+ }
122
+ }
123
+ return { hosts, finalHost: hosts[hosts.length - 1] || null, finalUrl: url };
124
+ }
125
+
126
+ async function check(base, options = {}) {
127
+ const fetchImpl = options.fetchImpl || defaultFetchImpl;
128
+ const loginUrl = `${base}/api/auth/login`;
129
+ const failures = [];
130
+ const warnings = [];
131
+
132
+ let location = null;
133
+ try {
134
+ const headers = await fetchHeaders(loginUrl, fetchImpl);
135
+ location = headers.location;
136
+ } catch (error) {
137
+ failures.push(`login request failed: ${error.message || error}`);
138
+ return { ok: false, failures, warnings, loginUrl };
139
+ }
140
+
141
+ if (!location) {
142
+ failures.push('login did not return a Location redirect');
143
+ return { ok: false, failures, warnings, loginUrl };
144
+ }
145
+
146
+ let clientId = null;
147
+ let redirectUri = null;
148
+ let hasMaxAge = false;
149
+ try {
150
+ const u = new URL(location, loginUrl);
151
+ clientId = u.searchParams.get('client_id');
152
+ redirectUri = u.searchParams.get('redirect_uri');
153
+ hasMaxAge = u.searchParams.has('max_age');
154
+ location = u.toString();
155
+ } catch {
156
+ failures.push(`invalid login Location: ${String(location).slice(0, 120)}`);
157
+ }
158
+
159
+ if (clientId !== PROD_CLIENT_ID) {
160
+ failures.push(`expected production client_id ${PROD_CLIENT_ID}, got ${clientId || 'null'}`);
161
+ }
162
+ if (clientId === STAGING_CLIENT_ID) {
163
+ failures.push('staging client_id is live on public login (hard fail)');
164
+ }
165
+ if (hasMaxAge) {
166
+ failures.push('login Location includes max_age (ordinary sign-in must not force step-up reauth)');
167
+ }
168
+ if (redirectUri !== `${base}/api/auth/callback`) {
169
+ warnings.push(`redirect_uri is ${redirectUri} (expected ${base}/api/auth/callback)`);
170
+ }
171
+
172
+ const chain = await followHosts(location, fetchImpl);
173
+ const anyStaging = chain.hosts.some((h) => /staging/i.test(h));
174
+ const anyAuthkit = chain.hosts.some((h) => /authkit\.app$/i.test(h));
175
+ const anyError = chain.hosts.some((h) => /error\.workos\.com$/i.test(h));
176
+
177
+ if (anyStaging) {
178
+ failures.push(`redirect chain hits staging host(s): ${chain.hosts.filter((h) => /staging/i.test(h)).join(', ')}`);
179
+ }
180
+ if (anyError) {
181
+ failures.push('redirect chain hits error.workos.com (often missing Production redirect URI)');
182
+ }
183
+ if (!anyAuthkit) {
184
+ failures.push(`redirect chain never reached authkit.app (hosts: ${chain.hosts.join(' -> ')})`);
185
+ }
186
+ if (chain.finalHost && chain.finalHost !== PROD_AUTHKIT_HOST && anyAuthkit && !anyStaging) {
187
+ warnings.push(
188
+ `AuthKit host is ${chain.finalHost} (documented production host is ${PROD_AUTHKIT_HOST}; update docs if intentional)`,
189
+ );
190
+ }
191
+
192
+ let methodsFound = [];
193
+ if (anyAuthkit && !anyStaging) {
194
+ const methodCheck = await checkSignInMethods(chain.finalUrl, fetchImpl);
195
+ failures.push(...methodCheck.failures);
196
+ warnings.push(...methodCheck.warnings);
197
+ methodsFound = methodCheck.methodsFound;
198
+ }
199
+
200
+ return {
201
+ ok: failures.length === 0,
202
+ base,
203
+ loginUrl,
204
+ clientId,
205
+ redirectUri,
206
+ hasMaxAge,
207
+ hosts: chain.hosts,
208
+ finalHost: chain.finalHost,
209
+ expectedMethods: EXPECTED_METHODS.map((m) => m.name),
210
+ methodsFound,
211
+ spendCapUsd: 10,
212
+ policy: 'AuthKit only; no custom domains ($99); no enterprise SSO connections; public site must not use staging',
213
+ failures,
214
+ warnings,
215
+ };
216
+ }
217
+
218
+ async function main() {
219
+ const args = parseArgs(process.argv.slice(2));
220
+ if (args.help) {
221
+ console.log('Usage: node scripts/workos-production-guard.js [--json] [--base https://thumbgate.app]');
222
+ process.exit(0);
223
+ }
224
+ let report;
225
+ try {
226
+ report = await check(args.base);
227
+ } catch (error) {
228
+ report = { ok: false, failures: [String(error.message || error)], warnings: [] };
229
+ }
230
+
231
+ if (args.json) {
232
+ console.log(JSON.stringify(report, null, 2));
233
+ } else {
234
+ console.log('=== WorkOS production guard ($10/mo policy) ===');
235
+ console.log(`ok=${report.ok} finalHost=${report.finalHost || '?'}`);
236
+ console.log(`client_id=${report.clientId || '?'} max_age=${report.hasMaxAge}`);
237
+ if (report.hosts) console.log(`chain: ${report.hosts.join(' -> ')}`);
238
+ if (report.expectedMethods) {
239
+ console.log(`sign-in methods: expected=[${report.expectedMethods.join(', ')}] found=[${(report.methodsFound || []).join(', ')}]`);
240
+ }
241
+ console.log(`policy: ${report.policy}`);
242
+ for (const w of report.warnings || []) console.log(`WARN: ${w}`);
243
+ for (const f of report.failures || []) console.log(`FAIL: ${f}`);
244
+ }
245
+ process.exit(report.ok ? 0 : 1);
246
+ }
247
+
248
+ module.exports = {
249
+ check,
250
+ parseArgs,
251
+ PROD_CLIENT_ID,
252
+ STAGING_CLIENT_ID,
253
+ PROD_AUTHKIT_HOST,
254
+ EXPECTED_METHODS,
255
+ defaultFetchImpl,
256
+ };
257
+
258
+ if (process.argv[1] && path.resolve(process.argv[1]) === path.resolve(__filename)) {
259
+ main();
260
+ }