vibecheck-ai 2.0.1 → 5.0.0

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 (456) hide show
  1. package/bin/.generated +25 -0
  2. package/bin/_deprecations.js +463 -0
  3. package/bin/_router.js +46 -0
  4. package/bin/cli-hygiene.js +241 -0
  5. package/bin/dev/run-v2-torture.js +30 -0
  6. package/bin/registry.js +656 -0
  7. package/bin/runners/CLI_REFACTOR_SUMMARY.md +229 -0
  8. package/bin/runners/ENHANCEMENT_GUIDE.md +121 -0
  9. package/bin/runners/REPORT_AUDIT.md +64 -0
  10. package/bin/runners/cli-utils.js +1070 -0
  11. package/bin/runners/context/ai-task-decomposer.js +337 -0
  12. package/bin/runners/context/analyzer.js +513 -0
  13. package/bin/runners/context/api-contracts.js +427 -0
  14. package/bin/runners/context/context-diff.js +342 -0
  15. package/bin/runners/context/context-pruner.js +291 -0
  16. package/bin/runners/context/dependency-graph.js +414 -0
  17. package/bin/runners/context/generators/claude.js +107 -0
  18. package/bin/runners/context/generators/codex.js +108 -0
  19. package/bin/runners/context/generators/copilot.js +119 -0
  20. package/bin/runners/context/generators/cursor-enhanced.js +2525 -0
  21. package/bin/runners/context/generators/cursor.js +514 -0
  22. package/bin/runners/context/generators/mcp.js +169 -0
  23. package/bin/runners/context/generators/windsurf.js +180 -0
  24. package/bin/runners/context/git-context.js +304 -0
  25. package/bin/runners/context/index.js +1110 -0
  26. package/bin/runners/context/insights.js +173 -0
  27. package/bin/runners/context/mcp-server/generate-rules.js +337 -0
  28. package/bin/runners/context/mcp-server/index.js +1176 -0
  29. package/bin/runners/context/mcp-server/package.json +24 -0
  30. package/bin/runners/context/memory.js +200 -0
  31. package/bin/runners/context/monorepo.js +215 -0
  32. package/bin/runners/context/multi-repo-federation.js +404 -0
  33. package/bin/runners/context/patterns.js +253 -0
  34. package/bin/runners/context/proof-context.js +1264 -0
  35. package/bin/runners/context/security-scanner.js +541 -0
  36. package/bin/runners/context/semantic-search.js +350 -0
  37. package/bin/runners/context/shared.js +264 -0
  38. package/bin/runners/context/team-conventions.js +336 -0
  39. package/bin/runners/lib/__tests__/entitlements-v2.test.js +295 -0
  40. package/bin/runners/lib/agent-firewall/ai/false-positive-analyzer.js +474 -0
  41. package/bin/runners/lib/agent-firewall/change-packet/builder.js +488 -0
  42. package/bin/runners/lib/agent-firewall/change-packet/schema.json +228 -0
  43. package/bin/runners/lib/agent-firewall/change-packet/store.js +200 -0
  44. package/bin/runners/lib/agent-firewall/claims/claim-types.js +21 -0
  45. package/bin/runners/lib/agent-firewall/claims/extractor.js +303 -0
  46. package/bin/runners/lib/agent-firewall/claims/patterns.js +24 -0
  47. package/bin/runners/lib/agent-firewall/critic/index.js +151 -0
  48. package/bin/runners/lib/agent-firewall/critic/judge.js +432 -0
  49. package/bin/runners/lib/agent-firewall/critic/prompts.js +305 -0
  50. package/bin/runners/lib/agent-firewall/enforcement/gateway.js +1059 -0
  51. package/bin/runners/lib/agent-firewall/enforcement/index.js +98 -0
  52. package/bin/runners/lib/agent-firewall/enforcement/mode.js +318 -0
  53. package/bin/runners/lib/agent-firewall/enforcement/orchestrator.js +484 -0
  54. package/bin/runners/lib/agent-firewall/enforcement/proof-artifact.js +418 -0
  55. package/bin/runners/lib/agent-firewall/enforcement/schemas/change-event.schema.json +173 -0
  56. package/bin/runners/lib/agent-firewall/enforcement/schemas/intent.schema.json +181 -0
  57. package/bin/runners/lib/agent-firewall/enforcement/schemas/verdict.schema.json +222 -0
  58. package/bin/runners/lib/agent-firewall/enforcement/verdict-v2.js +333 -0
  59. package/bin/runners/lib/agent-firewall/evidence/auth-evidence.js +88 -0
  60. package/bin/runners/lib/agent-firewall/evidence/contract-evidence.js +75 -0
  61. package/bin/runners/lib/agent-firewall/evidence/env-evidence.js +127 -0
  62. package/bin/runners/lib/agent-firewall/evidence/resolver.js +102 -0
  63. package/bin/runners/lib/agent-firewall/evidence/route-evidence.js +213 -0
  64. package/bin/runners/lib/agent-firewall/evidence/side-effect-evidence.js +145 -0
  65. package/bin/runners/lib/agent-firewall/fs-hook/daemon.js +19 -0
  66. package/bin/runners/lib/agent-firewall/fs-hook/installer.js +87 -0
  67. package/bin/runners/lib/agent-firewall/fs-hook/watcher.js +184 -0
  68. package/bin/runners/lib/agent-firewall/git-hook/pre-commit.js +163 -0
  69. package/bin/runners/lib/agent-firewall/ide-extension/cursor.js +107 -0
  70. package/bin/runners/lib/agent-firewall/ide-extension/vscode.js +68 -0
  71. package/bin/runners/lib/agent-firewall/ide-extension/windsurf.js +66 -0
  72. package/bin/runners/lib/agent-firewall/index.js +200 -0
  73. package/bin/runners/lib/agent-firewall/integration/index.js +20 -0
  74. package/bin/runners/lib/agent-firewall/integration/ship-gate.js +437 -0
  75. package/bin/runners/lib/agent-firewall/intent/alignment-engine.js +634 -0
  76. package/bin/runners/lib/agent-firewall/intent/auto-detect.js +426 -0
  77. package/bin/runners/lib/agent-firewall/intent/index.js +102 -0
  78. package/bin/runners/lib/agent-firewall/intent/schema.js +352 -0
  79. package/bin/runners/lib/agent-firewall/intent/store.js +283 -0
  80. package/bin/runners/lib/agent-firewall/interception/fs-interceptor.js +502 -0
  81. package/bin/runners/lib/agent-firewall/interception/index.js +23 -0
  82. package/bin/runners/lib/agent-firewall/interceptor/base.js +308 -0
  83. package/bin/runners/lib/agent-firewall/interceptor/cursor.js +35 -0
  84. package/bin/runners/lib/agent-firewall/interceptor/vscode.js +35 -0
  85. package/bin/runners/lib/agent-firewall/interceptor/windsurf.js +34 -0
  86. package/bin/runners/lib/agent-firewall/lawbook/distributor.js +465 -0
  87. package/bin/runners/lib/agent-firewall/lawbook/evaluator.js +604 -0
  88. package/bin/runners/lib/agent-firewall/lawbook/index.js +304 -0
  89. package/bin/runners/lib/agent-firewall/lawbook/registry.js +514 -0
  90. package/bin/runners/lib/agent-firewall/lawbook/schema.js +420 -0
  91. package/bin/runners/lib/agent-firewall/logger.js +141 -0
  92. package/bin/runners/lib/agent-firewall/policy/default-policy.json +90 -0
  93. package/bin/runners/lib/agent-firewall/policy/engine.js +103 -0
  94. package/bin/runners/lib/agent-firewall/policy/loader.js +451 -0
  95. package/bin/runners/lib/agent-firewall/policy/rules/auth-drift.js +50 -0
  96. package/bin/runners/lib/agent-firewall/policy/rules/contract-drift.js +50 -0
  97. package/bin/runners/lib/agent-firewall/policy/rules/fake-success.js +79 -0
  98. package/bin/runners/lib/agent-firewall/policy/rules/ghost-env.js +227 -0
  99. package/bin/runners/lib/agent-firewall/policy/rules/ghost-route.js +191 -0
  100. package/bin/runners/lib/agent-firewall/policy/rules/scope.js +93 -0
  101. package/bin/runners/lib/agent-firewall/policy/rules/unsafe-side-effect.js +57 -0
  102. package/bin/runners/lib/agent-firewall/policy/schema.json +183 -0
  103. package/bin/runners/lib/agent-firewall/policy/verdict.js +54 -0
  104. package/bin/runners/lib/agent-firewall/proposal/extractor.js +394 -0
  105. package/bin/runners/lib/agent-firewall/proposal/index.js +212 -0
  106. package/bin/runners/lib/agent-firewall/proposal/schema.js +251 -0
  107. package/bin/runners/lib/agent-firewall/proposal/validator.js +386 -0
  108. package/bin/runners/lib/agent-firewall/reality/index.js +332 -0
  109. package/bin/runners/lib/agent-firewall/reality/state.js +625 -0
  110. package/bin/runners/lib/agent-firewall/reality/watcher.js +322 -0
  111. package/bin/runners/lib/agent-firewall/risk/index.js +173 -0
  112. package/bin/runners/lib/agent-firewall/risk/scorer.js +328 -0
  113. package/bin/runners/lib/agent-firewall/risk/thresholds.js +322 -0
  114. package/bin/runners/lib/agent-firewall/risk/vectors.js +421 -0
  115. package/bin/runners/lib/agent-firewall/session/collector.js +451 -0
  116. package/bin/runners/lib/agent-firewall/session/index.js +26 -0
  117. package/bin/runners/lib/agent-firewall/simulator/diff-simulator.js +472 -0
  118. package/bin/runners/lib/agent-firewall/simulator/import-resolver.js +346 -0
  119. package/bin/runners/lib/agent-firewall/simulator/index.js +181 -0
  120. package/bin/runners/lib/agent-firewall/simulator/route-validator.js +380 -0
  121. package/bin/runners/lib/agent-firewall/time-machine/incident-correlator.js +661 -0
  122. package/bin/runners/lib/agent-firewall/time-machine/index.js +267 -0
  123. package/bin/runners/lib/agent-firewall/time-machine/replay-engine.js +436 -0
  124. package/bin/runners/lib/agent-firewall/time-machine/state-reconstructor.js +490 -0
  125. package/bin/runners/lib/agent-firewall/time-machine/timeline-builder.js +530 -0
  126. package/bin/runners/lib/agent-firewall/truthpack/index.js +67 -0
  127. package/bin/runners/lib/agent-firewall/truthpack/loader.js +137 -0
  128. package/bin/runners/lib/agent-firewall/unblock/planner.js +337 -0
  129. package/bin/runners/lib/agent-firewall/utils/ignore-checker.js +118 -0
  130. package/bin/runners/lib/ai-bridge.js +416 -0
  131. package/bin/runners/lib/analysis-core.js +309 -0
  132. package/bin/runners/lib/analyzers.js +2500 -0
  133. package/bin/runners/lib/api-client.js +269 -0
  134. package/bin/runners/lib/approve-output.js +235 -0
  135. package/bin/runners/lib/artifact-envelope.js +540 -0
  136. package/bin/runners/lib/assets/vibecheck-logo.png +0 -0
  137. package/bin/runners/lib/audit-bridge.js +391 -0
  138. package/bin/runners/lib/auth-shared.js +977 -0
  139. package/bin/runners/lib/auth-truth.js +193 -0
  140. package/bin/runners/lib/auth.js +215 -0
  141. package/bin/runners/lib/authority-badge.js +425 -0
  142. package/bin/runners/lib/backup.js +62 -0
  143. package/bin/runners/lib/billing.js +107 -0
  144. package/bin/runners/lib/checkpoint.js +941 -0
  145. package/bin/runners/lib/claims.js +118 -0
  146. package/bin/runners/lib/classify-output.js +204 -0
  147. package/bin/runners/lib/cleanup/engine.js +571 -0
  148. package/bin/runners/lib/cleanup/index.js +53 -0
  149. package/bin/runners/lib/cleanup/output.js +375 -0
  150. package/bin/runners/lib/cleanup/rules.js +1060 -0
  151. package/bin/runners/lib/cli-output.js +400 -0
  152. package/bin/runners/lib/cli-ui.js +540 -0
  153. package/bin/runners/lib/compliance-bridge-new.js +0 -0
  154. package/bin/runners/lib/compliance-bridge.js +165 -0
  155. package/bin/runners/lib/contracts/auth-contract.js +202 -0
  156. package/bin/runners/lib/contracts/env-contract.js +181 -0
  157. package/bin/runners/lib/contracts/external-contract.js +206 -0
  158. package/bin/runners/lib/contracts/guard.js +168 -0
  159. package/bin/runners/lib/contracts/index.js +89 -0
  160. package/bin/runners/lib/contracts/plan-validator.js +311 -0
  161. package/bin/runners/lib/contracts/route-contract.js +199 -0
  162. package/bin/runners/lib/contracts.js +804 -0
  163. package/bin/runners/lib/default-config.js +127 -0
  164. package/bin/runners/lib/detect.js +89 -0
  165. package/bin/runners/lib/detectors-v2.js +622 -0
  166. package/bin/runners/lib/doctor/autofix.js +254 -0
  167. package/bin/runners/lib/doctor/diagnosis-receipt.js +454 -0
  168. package/bin/runners/lib/doctor/failure-signatures.js +526 -0
  169. package/bin/runners/lib/doctor/fix-script.js +336 -0
  170. package/bin/runners/lib/doctor/index.js +37 -0
  171. package/bin/runners/lib/doctor/modules/build-tools.js +453 -0
  172. package/bin/runners/lib/doctor/modules/dependencies.js +325 -0
  173. package/bin/runners/lib/doctor/modules/index.js +105 -0
  174. package/bin/runners/lib/doctor/modules/network.js +250 -0
  175. package/bin/runners/lib/doctor/modules/os-quirks.js +706 -0
  176. package/bin/runners/lib/doctor/modules/project.js +312 -0
  177. package/bin/runners/lib/doctor/modules/repo-integrity.js +485 -0
  178. package/bin/runners/lib/doctor/modules/runtime.js +224 -0
  179. package/bin/runners/lib/doctor/modules/security.js +350 -0
  180. package/bin/runners/lib/doctor/modules/system.js +213 -0
  181. package/bin/runners/lib/doctor/modules/vibecheck.js +394 -0
  182. package/bin/runners/lib/doctor/reporter.js +262 -0
  183. package/bin/runners/lib/doctor/safe-repair.js +384 -0
  184. package/bin/runners/lib/doctor/service.js +262 -0
  185. package/bin/runners/lib/doctor/types.js +113 -0
  186. package/bin/runners/lib/doctor/ui.js +263 -0
  187. package/bin/runners/lib/doctor-enhanced.js +233 -0
  188. package/bin/runners/lib/doctor-output.js +226 -0
  189. package/bin/runners/lib/doctor-v2.js +608 -0
  190. package/bin/runners/lib/drift.js +425 -0
  191. package/bin/runners/lib/enforcement.js +72 -0
  192. package/bin/runners/lib/engine/ast-cache.js +210 -0
  193. package/bin/runners/lib/engine/auth-extractor.js +211 -0
  194. package/bin/runners/lib/engine/billing-extractor.js +112 -0
  195. package/bin/runners/lib/engine/enforcement-extractor.js +100 -0
  196. package/bin/runners/lib/engine/env-extractor.js +207 -0
  197. package/bin/runners/lib/engine/express-extractor.js +208 -0
  198. package/bin/runners/lib/engine/extractors.js +849 -0
  199. package/bin/runners/lib/engine/index.js +207 -0
  200. package/bin/runners/lib/engine/repo-index.js +514 -0
  201. package/bin/runners/lib/engine/types.js +124 -0
  202. package/bin/runners/lib/engines/accessibility-engine.js +190 -0
  203. package/bin/runners/lib/engines/api-consistency-engine.js +162 -0
  204. package/bin/runners/lib/engines/ast-cache.js +99 -0
  205. package/bin/runners/lib/engines/attack-detector.js +1192 -0
  206. package/bin/runners/lib/engines/code-quality-engine.js +255 -0
  207. package/bin/runners/lib/engines/console-logs-engine.js +115 -0
  208. package/bin/runners/lib/engines/cross-file-analysis-engine.js +268 -0
  209. package/bin/runners/lib/engines/dead-code-engine.js +198 -0
  210. package/bin/runners/lib/engines/deprecated-api-engine.js +226 -0
  211. package/bin/runners/lib/engines/empty-catch-engine.js +150 -0
  212. package/bin/runners/lib/engines/file-filter.js +131 -0
  213. package/bin/runners/lib/engines/hardcoded-secrets-engine.js +251 -0
  214. package/bin/runners/lib/engines/mock-data-engine.js +272 -0
  215. package/bin/runners/lib/engines/parallel-processor.js +71 -0
  216. package/bin/runners/lib/engines/performance-issues-engine.js +265 -0
  217. package/bin/runners/lib/engines/security-vulnerabilities-engine.js +243 -0
  218. package/bin/runners/lib/engines/todo-fixme-engine.js +115 -0
  219. package/bin/runners/lib/engines/type-aware-engine.js +152 -0
  220. package/bin/runners/lib/engines/unsafe-regex-engine.js +225 -0
  221. package/bin/runners/lib/engines/vibecheck-engines/README.md +53 -0
  222. package/bin/runners/lib/engines/vibecheck-engines/index.js +15 -0
  223. package/bin/runners/lib/engines/vibecheck-engines/lib/ast-cache.js +164 -0
  224. package/bin/runners/lib/engines/vibecheck-engines/lib/code-quality-engine.js +291 -0
  225. package/bin/runners/lib/engines/vibecheck-engines/lib/console-logs-engine.js +83 -0
  226. package/bin/runners/lib/engines/vibecheck-engines/lib/dead-code-engine.js +198 -0
  227. package/bin/runners/lib/engines/vibecheck-engines/lib/deprecated-api-engine.js +275 -0
  228. package/bin/runners/lib/engines/vibecheck-engines/lib/empty-catch-engine.js +167 -0
  229. package/bin/runners/lib/engines/vibecheck-engines/lib/file-filter.js +217 -0
  230. package/bin/runners/lib/engines/vibecheck-engines/lib/hardcoded-secrets-engine.js +139 -0
  231. package/bin/runners/lib/engines/vibecheck-engines/lib/mock-data-engine.js +140 -0
  232. package/bin/runners/lib/engines/vibecheck-engines/lib/parallel-processor.js +164 -0
  233. package/bin/runners/lib/engines/vibecheck-engines/lib/performance-issues-engine.js +234 -0
  234. package/bin/runners/lib/engines/vibecheck-engines/lib/type-aware-engine.js +217 -0
  235. package/bin/runners/lib/engines/vibecheck-engines/lib/unsafe-regex-engine.js +78 -0
  236. package/bin/runners/lib/engines/vibecheck-engines/package.json +13 -0
  237. package/bin/runners/lib/enterprise-detect.js +603 -0
  238. package/bin/runners/lib/enterprise-init.js +942 -0
  239. package/bin/runners/lib/entitlements-v2.js +265 -0
  240. package/bin/runners/lib/entitlements.generated.js +0 -0
  241. package/bin/runners/lib/entitlements.js +340 -0
  242. package/bin/runners/lib/env-resolver.js +417 -0
  243. package/bin/runners/lib/env-template.js +66 -0
  244. package/bin/runners/lib/env.js +189 -0
  245. package/bin/runners/lib/error-handler.js +368 -0
  246. package/bin/runners/lib/error-messages.js +289 -0
  247. package/bin/runners/lib/evidence-pack.js +684 -0
  248. package/bin/runners/lib/exit-codes.js +275 -0
  249. package/bin/runners/lib/extractors/client-calls.js +990 -0
  250. package/bin/runners/lib/extractors/fastify-route-dump.js +573 -0
  251. package/bin/runners/lib/extractors/fastify-routes.js +426 -0
  252. package/bin/runners/lib/extractors/index.js +363 -0
  253. package/bin/runners/lib/extractors/next-routes.js +524 -0
  254. package/bin/runners/lib/extractors/proof-graph.js +431 -0
  255. package/bin/runners/lib/extractors/route-matcher.js +451 -0
  256. package/bin/runners/lib/extractors/truthpack-v2.js +377 -0
  257. package/bin/runners/lib/extractors/ui-bindings.js +547 -0
  258. package/bin/runners/lib/finding-id.js +69 -0
  259. package/bin/runners/lib/finding-sorter.js +89 -0
  260. package/bin/runners/lib/findings-schema.js +281 -0
  261. package/bin/runners/lib/fingerprint.js +377 -0
  262. package/bin/runners/lib/firewall-prompt.js +50 -0
  263. package/bin/runners/lib/fix-output.js +228 -0
  264. package/bin/runners/lib/global-flags.js +250 -0
  265. package/bin/runners/lib/graph/graph-builder.js +265 -0
  266. package/bin/runners/lib/graph/html-renderer.js +413 -0
  267. package/bin/runners/lib/graph/index.js +32 -0
  268. package/bin/runners/lib/graph/runtime-collector.js +215 -0
  269. package/bin/runners/lib/graph/static-extractor.js +518 -0
  270. package/bin/runners/lib/help-formatter.js +413 -0
  271. package/bin/runners/lib/html-proof-report.js +913 -0
  272. package/bin/runners/lib/html-report.js +650 -0
  273. package/bin/runners/lib/init-wizard.js +601 -0
  274. package/bin/runners/lib/interactive-menu.js +1496 -0
  275. package/bin/runners/lib/json-output.js +76 -0
  276. package/bin/runners/lib/llm.js +75 -0
  277. package/bin/runners/lib/logger.js +38 -0
  278. package/bin/runners/lib/meter.js +61 -0
  279. package/bin/runners/lib/missions/briefing.js +427 -0
  280. package/bin/runners/lib/missions/checkpoint.js +753 -0
  281. package/bin/runners/lib/missions/evidence.js +126 -0
  282. package/bin/runners/lib/missions/hardening.js +851 -0
  283. package/bin/runners/lib/missions/plan.js +648 -0
  284. package/bin/runners/lib/missions/safety-gates.js +645 -0
  285. package/bin/runners/lib/missions/schema.js +478 -0
  286. package/bin/runners/lib/missions/templates.js +317 -0
  287. package/bin/runners/lib/next-action.js +560 -0
  288. package/bin/runners/lib/packs/bundle.js +675 -0
  289. package/bin/runners/lib/packs/evidence-pack.js +671 -0
  290. package/bin/runners/lib/packs/pack-factory.js +837 -0
  291. package/bin/runners/lib/packs/permissions-pack.js +686 -0
  292. package/bin/runners/lib/packs/proof-graph-pack.js +779 -0
  293. package/bin/runners/lib/patch.js +40 -0
  294. package/bin/runners/lib/permissions/auth-model.js +213 -0
  295. package/bin/runners/lib/permissions/idor-prover.js +205 -0
  296. package/bin/runners/lib/permissions/index.js +45 -0
  297. package/bin/runners/lib/permissions/matrix-builder.js +198 -0
  298. package/bin/runners/lib/pkgjson.js +28 -0
  299. package/bin/runners/lib/policy.js +295 -0
  300. package/bin/runners/lib/polish/accessibility.js +62 -0
  301. package/bin/runners/lib/polish/analyzer.js +93 -0
  302. package/bin/runners/lib/polish/backend.js +87 -0
  303. package/bin/runners/lib/polish/configuration.js +83 -0
  304. package/bin/runners/lib/polish/documentation.js +83 -0
  305. package/bin/runners/lib/polish/frontend.js +817 -0
  306. package/bin/runners/lib/polish/index.js +27 -0
  307. package/bin/runners/lib/polish/infrastructure.js +80 -0
  308. package/bin/runners/lib/polish/internationalization.js +85 -0
  309. package/bin/runners/lib/polish/libraries.js +180 -0
  310. package/bin/runners/lib/polish/observability.js +75 -0
  311. package/bin/runners/lib/polish/performance.js +64 -0
  312. package/bin/runners/lib/polish/privacy.js +110 -0
  313. package/bin/runners/lib/polish/resilience.js +92 -0
  314. package/bin/runners/lib/polish/security.js +78 -0
  315. package/bin/runners/lib/polish/seo.js +71 -0
  316. package/bin/runners/lib/polish/styles.js +62 -0
  317. package/bin/runners/lib/polish/utils.js +104 -0
  318. package/bin/runners/lib/preflight.js +142 -0
  319. package/bin/runners/lib/prerequisites.js +149 -0
  320. package/bin/runners/lib/prove-output.js +220 -0
  321. package/bin/runners/lib/reality/correlation-detectors.js +359 -0
  322. package/bin/runners/lib/reality/index.js +318 -0
  323. package/bin/runners/lib/reality/request-hashing.js +416 -0
  324. package/bin/runners/lib/reality/request-mapper.js +453 -0
  325. package/bin/runners/lib/reality/safety-rails.js +463 -0
  326. package/bin/runners/lib/reality/semantic-snapshot.js +408 -0
  327. package/bin/runners/lib/reality/toast-detector.js +393 -0
  328. package/bin/runners/lib/reality-findings.js +84 -0
  329. package/bin/runners/lib/reality-output.js +231 -0
  330. package/bin/runners/lib/receipts.js +179 -0
  331. package/bin/runners/lib/redact.js +29 -0
  332. package/bin/runners/lib/replay/capsule-manager.js +154 -0
  333. package/bin/runners/lib/replay/index.js +263 -0
  334. package/bin/runners/lib/replay/player.js +348 -0
  335. package/bin/runners/lib/replay/recorder.js +331 -0
  336. package/bin/runners/lib/report-engine.js +626 -0
  337. package/bin/runners/lib/report-html.js +1233 -0
  338. package/bin/runners/lib/report-output.js +366 -0
  339. package/bin/runners/lib/report-templates.js +967 -0
  340. package/bin/runners/lib/report.js +135 -0
  341. package/bin/runners/lib/route-detection.js +1209 -0
  342. package/bin/runners/lib/route-truth.js +1322 -0
  343. package/bin/runners/lib/safelist/index.js +96 -0
  344. package/bin/runners/lib/safelist/integration.js +334 -0
  345. package/bin/runners/lib/safelist/matcher.js +696 -0
  346. package/bin/runners/lib/safelist/schema.js +948 -0
  347. package/bin/runners/lib/safelist/store.js +438 -0
  348. package/bin/runners/lib/sandbox/index.js +59 -0
  349. package/bin/runners/lib/sandbox/proof-chain.js +399 -0
  350. package/bin/runners/lib/sandbox/sandbox-runner.js +205 -0
  351. package/bin/runners/lib/sandbox/worktree.js +174 -0
  352. package/bin/runners/lib/scan-cache.js +330 -0
  353. package/bin/runners/lib/scan-output-schema.js +344 -0
  354. package/bin/runners/lib/scan-output.js +631 -0
  355. package/bin/runners/lib/scan-runner.js +135 -0
  356. package/bin/runners/lib/schema-validator.js +350 -0
  357. package/bin/runners/lib/schemas/ajv-validator.js +464 -0
  358. package/bin/runners/lib/schemas/contracts.schema.json +160 -0
  359. package/bin/runners/lib/schemas/error-envelope.schema.json +105 -0
  360. package/bin/runners/lib/schemas/finding-v3.schema.json +151 -0
  361. package/bin/runners/lib/schemas/finding.schema.json +100 -0
  362. package/bin/runners/lib/schemas/mission-pack.schema.json +206 -0
  363. package/bin/runners/lib/schemas/proof-graph.schema.json +176 -0
  364. package/bin/runners/lib/schemas/reality-report.schema.json +162 -0
  365. package/bin/runners/lib/schemas/report-artifact.schema.json +120 -0
  366. package/bin/runners/lib/schemas/run-request.schema.json +108 -0
  367. package/bin/runners/lib/schemas/share-pack.schema.json +180 -0
  368. package/bin/runners/lib/schemas/ship-manifest.schema.json +251 -0
  369. package/bin/runners/lib/schemas/ship-report.schema.json +117 -0
  370. package/bin/runners/lib/schemas/truthpack-v2.schema.json +303 -0
  371. package/bin/runners/lib/schemas/validator.js +465 -0
  372. package/bin/runners/lib/schemas/verdict.schema.json +140 -0
  373. package/bin/runners/lib/score-history.js +282 -0
  374. package/bin/runners/lib/security-bridge.js +249 -0
  375. package/bin/runners/lib/server-usage.js +513 -0
  376. package/bin/runners/lib/share-pack.js +239 -0
  377. package/bin/runners/lib/ship-gate.js +832 -0
  378. package/bin/runners/lib/ship-manifest.js +1153 -0
  379. package/bin/runners/lib/ship-output-enterprise.js +239 -0
  380. package/bin/runners/lib/ship-output.js +1128 -0
  381. package/bin/runners/lib/snippets.js +67 -0
  382. package/bin/runners/lib/status-output.js +340 -0
  383. package/bin/runners/lib/terminal-ui.js +356 -0
  384. package/bin/runners/lib/truth.js +1691 -0
  385. package/bin/runners/lib/ui.js +562 -0
  386. package/bin/runners/lib/unified-cli-output.js +947 -0
  387. package/bin/runners/lib/unified-output.js +197 -0
  388. package/bin/runners/lib/upsell.js +410 -0
  389. package/bin/runners/lib/usage.js +153 -0
  390. package/bin/runners/lib/validate-patch.js +156 -0
  391. package/bin/runners/lib/verdict-engine.js +628 -0
  392. package/bin/runners/lib/verification.js +345 -0
  393. package/bin/runners/lib/why-tree.js +650 -0
  394. package/bin/runners/reality/engine.js +917 -0
  395. package/bin/runners/reality/flows.js +122 -0
  396. package/bin/runners/reality/report.js +378 -0
  397. package/bin/runners/reality/session.js +193 -0
  398. package/bin/runners/runAIAgent.js +229 -0
  399. package/bin/runners/runAgent.d.ts +5 -0
  400. package/bin/runners/runAgent.js +161 -0
  401. package/bin/runners/runAllowlist.js +418 -0
  402. package/bin/runners/runApprove.js +320 -0
  403. package/bin/runners/runAudit.js +692 -0
  404. package/bin/runners/runAuth.js +731 -0
  405. package/bin/runners/runCI.js +353 -0
  406. package/bin/runners/runCheckpoint.js +530 -0
  407. package/bin/runners/runClassify.js +928 -0
  408. package/bin/runners/runCleanup.js +343 -0
  409. package/bin/runners/runContext.d.ts +4 -0
  410. package/bin/runners/runContext.js +175 -0
  411. package/bin/runners/runDoctor.js +877 -0
  412. package/bin/runners/runEvidencePack.js +362 -0
  413. package/bin/runners/runFirewall.d.ts +5 -0
  414. package/bin/runners/runFirewall.js +134 -0
  415. package/bin/runners/runFirewallHook.d.ts +5 -0
  416. package/bin/runners/runFirewallHook.js +56 -0
  417. package/bin/runners/runFix.js +1355 -0
  418. package/bin/runners/runForge.js +451 -0
  419. package/bin/runners/runGuard.js +262 -0
  420. package/bin/runners/runInit.js +1927 -0
  421. package/bin/runners/runIntent.js +906 -0
  422. package/bin/runners/runKickoff.js +878 -0
  423. package/bin/runners/runLabs.js +424 -0
  424. package/bin/runners/runLaunch.js +2000 -0
  425. package/bin/runners/runLink.js +785 -0
  426. package/bin/runners/runMcp.js +1875 -0
  427. package/bin/runners/runPacks.js +2089 -0
  428. package/bin/runners/runPolish.d.ts +4 -0
  429. package/bin/runners/runPolish.js +390 -0
  430. package/bin/runners/runPromptFirewall.js +211 -0
  431. package/bin/runners/runProve.js +1411 -0
  432. package/bin/runners/runQuickstart.js +531 -0
  433. package/bin/runners/runReality.js +2260 -0
  434. package/bin/runners/runReport.js +726 -0
  435. package/bin/runners/runRuntime.js +110 -0
  436. package/bin/runners/runSafelist.js +1190 -0
  437. package/bin/runners/runScan.js +688 -0
  438. package/bin/runners/runShield.js +1282 -0
  439. package/bin/runners/runShip.js +1660 -0
  440. package/bin/runners/runTruth.d.ts +5 -0
  441. package/bin/runners/runTruth.js +101 -0
  442. package/bin/runners/runValidate.js +179 -0
  443. package/bin/runners/runWatch.js +478 -0
  444. package/bin/runners/utils.js +360 -0
  445. package/bin/scan.js +617 -0
  446. package/bin/vibecheck.js +1617 -0
  447. package/dist/guardrail/index.d.ts +2405 -0
  448. package/dist/guardrail/index.js +9747 -0
  449. package/dist/guardrail/index.js.map +1 -0
  450. package/dist/scanner/index.d.ts +282 -0
  451. package/dist/scanner/index.js +3395 -0
  452. package/dist/scanner/index.js.map +1 -0
  453. package/package.json +123 -104
  454. package/README.md +0 -491
  455. package/dist/index.js +0 -99711
  456. package/dist/index.js.map +0 -1
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Time Machine Module
3
+ *
4
+ * Forensic Replay for AI Actions
5
+ * Enables deep analysis and replay of what AI agents did.
6
+ *
7
+ * Codename: Time Machine
8
+ */
9
+
10
+ "use strict";
11
+
12
+ const { ReplayEngine, createReplayEngine } = require("./replay-engine.js");
13
+ const { TimelineBuilder, createTimelineBuilder, EVENT_TYPES } = require("./timeline-builder.js");
14
+ const { StateReconstructor, createStateReconstructor } = require("./state-reconstructor.js");
15
+ const { IncidentCorrelator, createIncidentCorrelator, RELATIONSHIP_TYPES } = require("./incident-correlator.js");
16
+
17
+ /**
18
+ * Time Machine singleton for unified access
19
+ */
20
+ class TimeMachine {
21
+ constructor() {
22
+ this.replayEngine = null;
23
+ this.timelineBuilder = null;
24
+ this.stateReconstructor = null;
25
+ this.incidentCorrelator = null;
26
+ this.projectRoot = null;
27
+ this.initialized = false;
28
+ }
29
+
30
+ /**
31
+ * Initialize the Time Machine for a project
32
+ * @param {string} projectRoot - Project root directory
33
+ * @returns {TimeMachine} This instance
34
+ */
35
+ init(projectRoot) {
36
+ if (this.initialized && this.projectRoot === projectRoot) {
37
+ return this;
38
+ }
39
+
40
+ this.projectRoot = projectRoot;
41
+ this.replayEngine = createReplayEngine({ projectRoot });
42
+ this.timelineBuilder = createTimelineBuilder({ projectRoot });
43
+ this.stateReconstructor = createStateReconstructor({ projectRoot });
44
+ this.incidentCorrelator = createIncidentCorrelator({ projectRoot });
45
+ this.initialized = true;
46
+
47
+ return this;
48
+ }
49
+
50
+ /**
51
+ * Start a replay session
52
+ * @param {Object} options - Replay options
53
+ * @returns {Object} Replay session
54
+ */
55
+ async startReplay(options = {}) {
56
+ this.ensureInitialized();
57
+ return this.replayEngine.startReplay(options);
58
+ }
59
+
60
+ /**
61
+ * Get current snapshot in a replay session
62
+ * @param {string} sessionId - Session ID
63
+ * @returns {Object|null} Current snapshot
64
+ */
65
+ getCurrentSnapshot(sessionId) {
66
+ this.ensureInitialized();
67
+ return this.replayEngine.getCurrentSnapshot(sessionId);
68
+ }
69
+
70
+ /**
71
+ * Move to next snapshot
72
+ * @param {string} sessionId - Session ID
73
+ * @returns {Object|null} Next snapshot
74
+ */
75
+ nextSnapshot(sessionId) {
76
+ this.ensureInitialized();
77
+ return this.replayEngine.nextSnapshot(sessionId);
78
+ }
79
+
80
+ /**
81
+ * Move to previous snapshot
82
+ * @param {string} sessionId - Session ID
83
+ * @returns {Object|null} Previous snapshot
84
+ */
85
+ previousSnapshot(sessionId) {
86
+ this.ensureInitialized();
87
+ return this.replayEngine.previousSnapshot(sessionId);
88
+ }
89
+
90
+ /**
91
+ * Get replay session status
92
+ * @param {string} sessionId - Session ID
93
+ * @returns {Object|null} Session status
94
+ */
95
+ getSessionStatus(sessionId) {
96
+ this.ensureInitialized();
97
+ return this.replayEngine.getSessionStatus(sessionId);
98
+ }
99
+
100
+ /**
101
+ * End a replay session
102
+ * @param {string} sessionId - Session ID
103
+ */
104
+ endReplay(sessionId) {
105
+ this.ensureInitialized();
106
+ this.replayEngine.endReplay(sessionId);
107
+ }
108
+
109
+ /**
110
+ * Build a forensic timeline
111
+ * @param {Object} options - Timeline options
112
+ * @returns {Object} Forensic timeline
113
+ */
114
+ async buildTimeline(options = {}) {
115
+ this.ensureInitialized();
116
+ return this.timelineBuilder.buildTimeline(options);
117
+ }
118
+
119
+ /**
120
+ * Generate a timeline report
121
+ * @param {Object} timeline - Timeline to report on
122
+ * @returns {Object} Report
123
+ */
124
+ generateReport(timeline) {
125
+ this.ensureInitialized();
126
+ return this.timelineBuilder.generateReport(timeline);
127
+ }
128
+
129
+ /**
130
+ * Compare agent belief vs reality for a snapshot
131
+ * @param {Object} snapshot - Snapshot to analyze
132
+ * @returns {Object} Comparison result
133
+ */
134
+ compareBeliefVsReality(snapshot) {
135
+ this.ensureInitialized();
136
+ return this.replayEngine.compareBeliefVsReality(snapshot);
137
+ }
138
+
139
+ /**
140
+ * Quick replay for an incident
141
+ * @param {string} incidentId - Incident ID
142
+ * @param {Object} options - Additional options
143
+ * @returns {Object} Replay result with timeline
144
+ */
145
+ async replayIncident(incidentId, options = {}) {
146
+ this.ensureInitialized();
147
+
148
+ // Build timeline for the incident
149
+ const timeline = await this.buildTimeline({
150
+ ...options,
151
+ includeIncidents: true,
152
+ });
153
+
154
+ // Find the incident
155
+ const incidentEvent = timeline.events.find(
156
+ e => e.id === incidentId || e.details?.incidentId === incidentId
157
+ );
158
+
159
+ if (!incidentEvent) {
160
+ return {
161
+ success: false,
162
+ error: "Incident not found",
163
+ };
164
+ }
165
+
166
+ // Start replay from before the incident
167
+ const incidentTime = new Date(incidentEvent.timestamp);
168
+ const lookbackMs = options.lookbackMs || 24 * 60 * 60 * 1000; // 24 hours default
169
+
170
+ const session = await this.startReplay({
171
+ startTime: new Date(incidentTime.getTime() - lookbackMs),
172
+ endTime: incidentTime,
173
+ ...options,
174
+ });
175
+
176
+ return {
177
+ success: true,
178
+ session,
179
+ timeline,
180
+ incident: incidentEvent,
181
+ rootCause: timeline.rootCause,
182
+ causalChain: timeline.causalChain,
183
+ };
184
+ }
185
+
186
+ /**
187
+ * Reconstruct state at a specific timestamp
188
+ * @param {Date} timestamp - Target timestamp
189
+ * @param {Object} options - Options
190
+ * @returns {Object} Reconstructed state
191
+ */
192
+ async reconstructState(timestamp, options = {}) {
193
+ this.ensureInitialized();
194
+ return this.stateReconstructor.reconstructState(timestamp, options);
195
+ }
196
+
197
+ /**
198
+ * Record a new incident
199
+ * @param {Object} incidentData - Incident data
200
+ * @returns {Object} Created incident
201
+ */
202
+ recordIncident(incidentData) {
203
+ this.ensureInitialized();
204
+ return this.incidentCorrelator.recordIncident(incidentData);
205
+ }
206
+
207
+ /**
208
+ * Correlate an incident with firewall events
209
+ * @param {string} incidentId - Incident ID
210
+ * @param {Object} options - Options
211
+ * @returns {Object} Incident report
212
+ */
213
+ async correlateIncident(incidentId, options = {}) {
214
+ this.ensureInitialized();
215
+ return this.incidentCorrelator.correlateIncident(incidentId, options);
216
+ }
217
+
218
+ /**
219
+ * Get all recorded incidents
220
+ * @returns {Object[]} All incidents
221
+ */
222
+ getAllIncidents() {
223
+ this.ensureInitialized();
224
+ return this.incidentCorrelator.getAllIncidents();
225
+ }
226
+
227
+ /**
228
+ * Create a snapshot of current state
229
+ * @param {string} snapshotId - Optional snapshot ID
230
+ * @returns {string} Snapshot ID
231
+ */
232
+ async createSnapshot(snapshotId = null) {
233
+ this.ensureInitialized();
234
+ return this.stateReconstructor.createSnapshot(snapshotId);
235
+ }
236
+
237
+ /**
238
+ * Ensure Time Machine is initialized
239
+ */
240
+ ensureInitialized() {
241
+ if (!this.initialized) {
242
+ throw new Error("Time Machine not initialized. Call timeMachine.init(projectRoot) first.");
243
+ }
244
+ }
245
+ }
246
+
247
+ // Singleton instance
248
+ const timeMachine = new TimeMachine();
249
+
250
+ module.exports = {
251
+ timeMachine,
252
+ TimeMachine,
253
+ // Replay Engine
254
+ ReplayEngine,
255
+ createReplayEngine,
256
+ // Timeline Builder
257
+ TimelineBuilder,
258
+ createTimelineBuilder,
259
+ EVENT_TYPES,
260
+ // State Reconstructor
261
+ StateReconstructor,
262
+ createStateReconstructor,
263
+ // Incident Correlator
264
+ IncidentCorrelator,
265
+ createIncidentCorrelator,
266
+ RELATIONSHIP_TYPES,
267
+ };
@@ -0,0 +1,436 @@
1
+ /**
2
+ * Time Machine Replay Engine
3
+ *
4
+ * Reconstructs codebase state at any point in time.
5
+ * Enables forensic analysis of AI agent actions.
6
+ *
7
+ * Codename: Time Machine
8
+ */
9
+
10
+ "use strict";
11
+
12
+ const fs = require("fs");
13
+ const path = require("path");
14
+ const { timeMachineLogger: log, getErrorMessage } = require("../logger.js");
15
+
16
+ /**
17
+ * @typedef {Object} ReplaySnapshot
18
+ * @property {string} snapshotId - Unique snapshot ID
19
+ * @property {Date} timestamp - Point in time
20
+ * @property {Object} realityState - What the repo actually was
21
+ * @property {Object} agentBelief - What the agent assumed
22
+ * @property {Object} proposal - The change proposal
23
+ * @property {Object} verdict - The verdict issued
24
+ * @property {Object} [overrideContext] - Override info if applicable
25
+ */
26
+
27
+ /**
28
+ * @typedef {Object} ReplaySession
29
+ * @property {string} sessionId - Replay session ID
30
+ * @property {Date} startTime - When replay started
31
+ * @property {Date} targetTime - Point being replayed
32
+ * @property {ReplaySnapshot[]} snapshots - Snapshots in this session
33
+ * @property {number} currentIndex - Current position in replay
34
+ */
35
+
36
+ /**
37
+ * Replay Engine class
38
+ */
39
+ class ReplayEngine {
40
+ constructor(options = {}) {
41
+ this.projectRoot = options.projectRoot || process.cwd();
42
+ this.packetsDir = path.join(this.projectRoot, ".vibecheck", "packets");
43
+ this.auditDir = path.join(this.projectRoot, ".vibecheck", "audit");
44
+ this.snapshotsDir = path.join(this.projectRoot, ".vibecheck", "snapshots");
45
+ this.sessions = new Map();
46
+ this.packetCache = new Map();
47
+ }
48
+
49
+ /**
50
+ * Start a replay session for a specific time range
51
+ * @param {Object} options - Replay options
52
+ * @returns {ReplaySession} Replay session
53
+ */
54
+ async startReplay(options = {}) {
55
+ const {
56
+ startTime,
57
+ endTime = new Date(),
58
+ agentId = null,
59
+ file = null,
60
+ incidentId = null,
61
+ } = options;
62
+
63
+ const sessionId = `replay_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
64
+
65
+ // Load relevant packets
66
+ const packets = await this.loadPackets({
67
+ startTime,
68
+ endTime,
69
+ agentId,
70
+ file,
71
+ });
72
+
73
+ // Build snapshots from packets
74
+ const snapshots = await this.buildSnapshots(packets);
75
+
76
+ const session = {
77
+ sessionId,
78
+ startTime: new Date(),
79
+ targetTime: startTime,
80
+ options,
81
+ snapshots,
82
+ currentIndex: 0,
83
+ totalSnapshots: snapshots.length,
84
+ };
85
+
86
+ this.sessions.set(sessionId, session);
87
+
88
+ return session;
89
+ }
90
+
91
+ /**
92
+ * Load change packets for a time range
93
+ * @param {Object} filters - Filter options
94
+ * @returns {Object[]} Change packets
95
+ */
96
+ async loadPackets(filters = {}) {
97
+ const packets = [];
98
+
99
+ if (!fs.existsSync(this.packetsDir)) {
100
+ return packets;
101
+ }
102
+
103
+ const files = fs.readdirSync(this.packetsDir)
104
+ .filter(f => f.endsWith(".json"))
105
+ .sort();
106
+
107
+ for (const file of files) {
108
+ try {
109
+ const content = fs.readFileSync(path.join(this.packetsDir, file), "utf-8");
110
+ const packet = JSON.parse(content);
111
+
112
+ // Apply time filter
113
+ const packetTime = new Date(packet.timestamp || packet.createdAt);
114
+
115
+ if (filters.startTime && packetTime < new Date(filters.startTime)) {
116
+ continue;
117
+ }
118
+
119
+ if (filters.endTime && packetTime > new Date(filters.endTime)) {
120
+ continue;
121
+ }
122
+
123
+ // Apply agent filter
124
+ if (filters.agentId && packet.agentId !== filters.agentId) {
125
+ continue;
126
+ }
127
+
128
+ // Apply file filter
129
+ if (filters.file) {
130
+ const affectedFiles = this.extractAffectedFiles(packet);
131
+ if (!affectedFiles.some(f => f.includes(filters.file))) {
132
+ continue;
133
+ }
134
+ }
135
+
136
+ packets.push(packet);
137
+ } catch (error) {
138
+ log.warn(`Failed to load packet ${file}: ${getErrorMessage(error)}`);
139
+ }
140
+ }
141
+
142
+ // Sort by timestamp
143
+ packets.sort((a, b) => {
144
+ const timeA = new Date(a.timestamp || a.createdAt).getTime();
145
+ const timeB = new Date(b.timestamp || b.createdAt).getTime();
146
+ return timeA - timeB;
147
+ });
148
+
149
+ return packets;
150
+ }
151
+
152
+ /**
153
+ * Extract affected files from a packet
154
+ * @param {Object} packet - Change packet
155
+ * @returns {string[]} Affected file paths
156
+ */
157
+ extractAffectedFiles(packet) {
158
+ const files = [];
159
+
160
+ if (packet.file) files.push(packet.file);
161
+ if (packet.filePath) files.push(packet.filePath);
162
+
163
+ for (const op of packet.operations || []) {
164
+ if (op.path) files.push(op.path);
165
+ if (op.file) files.push(op.file);
166
+ if (op.filePath) files.push(op.filePath);
167
+ }
168
+
169
+ return files;
170
+ }
171
+
172
+ /**
173
+ * Build replay snapshots from packets
174
+ * @param {Object[]} packets - Change packets
175
+ * @returns {ReplaySnapshot[]} Replay snapshots
176
+ */
177
+ async buildSnapshots(packets) {
178
+ const snapshots = [];
179
+
180
+ for (const packet of packets) {
181
+ const snapshot = {
182
+ snapshotId: packet.id || `snap_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
183
+ timestamp: new Date(packet.timestamp || packet.createdAt),
184
+ realityState: await this.extractRealityState(packet),
185
+ agentBelief: this.extractAgentBelief(packet),
186
+ proposal: this.extractProposal(packet),
187
+ verdict: this.extractVerdict(packet),
188
+ overrideContext: this.extractOverrideContext(packet),
189
+ metadata: {
190
+ agentId: packet.agentId,
191
+ sessionId: packet.sessionId,
192
+ file: packet.file || this.extractAffectedFiles(packet)[0],
193
+ },
194
+ };
195
+
196
+ snapshots.push(snapshot);
197
+ }
198
+
199
+ return snapshots;
200
+ }
201
+
202
+ /**
203
+ * Extract reality state from a packet
204
+ * @param {Object} packet - Change packet
205
+ * @returns {Object} Reality state
206
+ */
207
+ async extractRealityState(packet) {
208
+ // Try to load from proof artifact
209
+ if (packet.proof?.realitySnapshot) {
210
+ return packet.proof.realitySnapshot;
211
+ }
212
+
213
+ // Build from packet data
214
+ return {
215
+ files: this.extractAffectedFiles(packet).map(f => ({
216
+ path: f,
217
+ exists: true, // Would need historical data to verify
218
+ })),
219
+ timestamp: packet.timestamp || packet.createdAt,
220
+ };
221
+ }
222
+
223
+ /**
224
+ * Extract what the agent believed/assumed
225
+ * @param {Object} packet - Change packet
226
+ * @returns {Object} Agent belief state
227
+ */
228
+ extractAgentBelief(packet) {
229
+ const assumptions = packet.assumptions || packet.proposal?.assumptions || [];
230
+
231
+ return {
232
+ assumptions: assumptions.map(a => ({
233
+ type: a.type,
234
+ target: a.target || a.path,
235
+ expectedValue: a.expectedValue || a.value,
236
+ wasValid: a.valid !== undefined ? a.valid : null,
237
+ })),
238
+ confidence: packet.confidence || packet.proposal?.confidence,
239
+ intent: packet.intent || packet.proposal?.intent,
240
+ };
241
+ }
242
+
243
+ /**
244
+ * Extract the proposal from a packet
245
+ * @param {Object} packet - Change packet
246
+ * @returns {Object} Proposal
247
+ */
248
+ extractProposal(packet) {
249
+ return {
250
+ proposalId: packet.proposalId || packet.id,
251
+ intent: packet.intent || packet.proposal?.intent,
252
+ operations: packet.operations || packet.proposal?.operations || [],
253
+ summary: packet.summary || packet.proposal?.summary,
254
+ };
255
+ }
256
+
257
+ /**
258
+ * Extract the verdict from a packet
259
+ * @param {Object} packet - Change packet
260
+ * @returns {Object} Verdict
261
+ */
262
+ extractVerdict(packet) {
263
+ return {
264
+ decision: packet.verdict?.decision || packet.proof?.decision || packet.decision,
265
+ confidence: packet.verdict?.confidence || packet.proof?.confidence,
266
+ rulesTriggered: packet.verdict?.rulesTriggered || packet.proof?.rulesTriggered || [],
267
+ riskScore: packet.riskScore || packet.proof?.riskScore,
268
+ riskLevel: packet.riskLevel || packet.proof?.riskLevel,
269
+ };
270
+ }
271
+
272
+ /**
273
+ * Extract override context if any
274
+ * @param {Object} packet - Change packet
275
+ * @returns {Object|null} Override context
276
+ */
277
+ extractOverrideContext(packet) {
278
+ if (!packet.proof?.overrideUsed && !packet.override?.used) {
279
+ return null;
280
+ }
281
+
282
+ return {
283
+ used: true,
284
+ by: packet.proof?.overrideBy || packet.override?.by,
285
+ reason: packet.proof?.overrideReason || packet.override?.reason,
286
+ timestamp: packet.proof?.overrideTimestamp || packet.override?.timestamp,
287
+ };
288
+ }
289
+
290
+ /**
291
+ * Get the current snapshot in a replay session
292
+ * @param {string} sessionId - Session ID
293
+ * @returns {ReplaySnapshot|null} Current snapshot
294
+ */
295
+ getCurrentSnapshot(sessionId) {
296
+ const session = this.sessions.get(sessionId);
297
+ if (!session) return null;
298
+
299
+ return session.snapshots[session.currentIndex] || null;
300
+ }
301
+
302
+ /**
303
+ * Move to the next snapshot
304
+ * @param {string} sessionId - Session ID
305
+ * @returns {ReplaySnapshot|null} Next snapshot or null if at end
306
+ */
307
+ nextSnapshot(sessionId) {
308
+ const session = this.sessions.get(sessionId);
309
+ if (!session) return null;
310
+
311
+ if (session.currentIndex < session.snapshots.length - 1) {
312
+ session.currentIndex++;
313
+ return session.snapshots[session.currentIndex];
314
+ }
315
+
316
+ return null;
317
+ }
318
+
319
+ /**
320
+ * Move to the previous snapshot
321
+ * @param {string} sessionId - Session ID
322
+ * @returns {ReplaySnapshot|null} Previous snapshot or null if at start
323
+ */
324
+ previousSnapshot(sessionId) {
325
+ const session = this.sessions.get(sessionId);
326
+ if (!session) return null;
327
+
328
+ if (session.currentIndex > 0) {
329
+ session.currentIndex--;
330
+ return session.snapshots[session.currentIndex];
331
+ }
332
+
333
+ return null;
334
+ }
335
+
336
+ /**
337
+ * Jump to a specific snapshot index
338
+ * @param {string} sessionId - Session ID
339
+ * @param {number} index - Index to jump to
340
+ * @returns {ReplaySnapshot|null} Snapshot at index
341
+ */
342
+ jumpToSnapshot(sessionId, index) {
343
+ const session = this.sessions.get(sessionId);
344
+ if (!session) return null;
345
+
346
+ if (index >= 0 && index < session.snapshots.length) {
347
+ session.currentIndex = index;
348
+ return session.snapshots[index];
349
+ }
350
+
351
+ return null;
352
+ }
353
+
354
+ /**
355
+ * Get session status
356
+ * @param {string} sessionId - Session ID
357
+ * @returns {Object|null} Session status
358
+ */
359
+ getSessionStatus(sessionId) {
360
+ const session = this.sessions.get(sessionId);
361
+ if (!session) return null;
362
+
363
+ return {
364
+ sessionId: session.sessionId,
365
+ totalSnapshots: session.totalSnapshots,
366
+ currentIndex: session.currentIndex,
367
+ currentSnapshot: session.snapshots[session.currentIndex],
368
+ isAtStart: session.currentIndex === 0,
369
+ isAtEnd: session.currentIndex === session.snapshots.length - 1,
370
+ progress: session.totalSnapshots > 0
371
+ ? Math.round((session.currentIndex / (session.totalSnapshots - 1)) * 100)
372
+ : 100,
373
+ };
374
+ }
375
+
376
+ /**
377
+ * End a replay session
378
+ * @param {string} sessionId - Session ID
379
+ */
380
+ endReplay(sessionId) {
381
+ this.sessions.delete(sessionId);
382
+ }
383
+
384
+ /**
385
+ * Get all active replay sessions
386
+ * @returns {Object[]} Active sessions
387
+ */
388
+ getActiveSessions() {
389
+ return Array.from(this.sessions.values()).map(s => ({
390
+ sessionId: s.sessionId,
391
+ startTime: s.startTime,
392
+ targetTime: s.targetTime,
393
+ totalSnapshots: s.totalSnapshots,
394
+ currentIndex: s.currentIndex,
395
+ }));
396
+ }
397
+
398
+ /**
399
+ * Compare what agent believed vs what was true
400
+ * @param {ReplaySnapshot} snapshot - Snapshot to analyze
401
+ * @returns {Object} Comparison result
402
+ */
403
+ compareBeliefVsReality(snapshot) {
404
+ const discrepancies = [];
405
+
406
+ for (const assumption of snapshot.agentBelief.assumptions || []) {
407
+ if (assumption.wasValid === false) {
408
+ discrepancies.push({
409
+ type: assumption.type,
410
+ target: assumption.target,
411
+ expected: assumption.expectedValue,
412
+ actual: "Did not match reality",
413
+ severity: "error",
414
+ });
415
+ }
416
+ }
417
+
418
+ return {
419
+ hadDiscrepancies: discrepancies.length > 0,
420
+ discrepancies,
421
+ confidence: snapshot.agentBelief.confidence,
422
+ verdictIssued: snapshot.verdict.decision,
423
+ };
424
+ }
425
+ }
426
+
427
+ /**
428
+ * Create a replay engine instance
429
+ * @param {Object} options - Options
430
+ * @returns {ReplayEngine} Replay engine
431
+ */
432
+ function createReplayEngine(options = {}) {
433
+ return new ReplayEngine(options);
434
+ }
435
+
436
+ module.exports = { ReplayEngine, createReplayEngine };