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,530 @@
1
+ /**
2
+ * Time Machine Timeline Builder
3
+ *
4
+ * Builds event timelines from multiple sources.
5
+ * Correlates agent actions with outcomes and incidents.
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} TimelineEvent
18
+ * @property {string} id - Event ID
19
+ * @property {Date} timestamp - When event occurred
20
+ * @property {string} type - Event type
21
+ * @property {string} source - Event source (firewall, conductor, git, etc.)
22
+ * @property {string} summary - Human-readable summary
23
+ * @property {Object} details - Full event details
24
+ * @property {string[]} relatedEvents - IDs of related events
25
+ * @property {Object} [causalLink] - Link to caused/causing events
26
+ */
27
+
28
+ /**
29
+ * @typedef {Object} ForensicTimeline
30
+ * @property {string} timelineId - Timeline ID
31
+ * @property {Object} incident - Incident info if applicable
32
+ * @property {TimelineEvent[]} events - All events in timeline
33
+ * @property {Object[]} causalChain - Causal relationships
34
+ * @property {TimelineEvent} [rootCause] - Identified root cause
35
+ * @property {Date} generatedAt - When timeline was generated
36
+ */
37
+
38
+ /**
39
+ * Event types for timeline
40
+ */
41
+ const EVENT_TYPES = {
42
+ PROPOSAL_SUBMITTED: "proposal_submitted",
43
+ PROPOSAL_ALLOWED: "proposal_allowed",
44
+ PROPOSAL_BLOCKED: "proposal_blocked",
45
+ PROPOSAL_WARNED: "proposal_warned",
46
+ OVERRIDE_USED: "override_used",
47
+ FILE_CHANGED: "file_changed",
48
+ SESSION_STARTED: "session_started",
49
+ SESSION_ENDED: "session_ended",
50
+ LOCK_ACQUIRED: "lock_acquired",
51
+ LOCK_RELEASED: "lock_released",
52
+ CONFLICT_DETECTED: "conflict_detected",
53
+ INCIDENT_REPORTED: "incident_reported",
54
+ BUILD_FAILED: "build_failed",
55
+ TEST_FAILED: "test_failed",
56
+ };
57
+
58
+ /**
59
+ * Timeline Builder class
60
+ */
61
+ class TimelineBuilder {
62
+ constructor(options = {}) {
63
+ this.projectRoot = options.projectRoot || process.cwd();
64
+ this.auditDir = path.join(this.projectRoot, ".vibecheck", "audit");
65
+ this.packetsDir = path.join(this.projectRoot, ".vibecheck", "packets");
66
+ this.incidentsDir = path.join(this.projectRoot, ".vibecheck", "incidents");
67
+ }
68
+
69
+ /**
70
+ * Build a timeline for a time range
71
+ * @param {Object} options - Build options
72
+ * @returns {ForensicTimeline} Built timeline
73
+ */
74
+ async buildTimeline(options = {}) {
75
+ const {
76
+ startTime,
77
+ endTime = new Date(),
78
+ file = null,
79
+ agentId = null,
80
+ includeGit = true,
81
+ includeIncidents = true,
82
+ } = options;
83
+
84
+ const timelineId = `timeline_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
85
+ const events = [];
86
+
87
+ // Load firewall events
88
+ const firewallEvents = await this.loadFirewallEvents(startTime, endTime, file, agentId);
89
+ events.push(...firewallEvents);
90
+
91
+ // Load conductor events
92
+ const conductorEvents = await this.loadConductorEvents(startTime, endTime, agentId);
93
+ events.push(...conductorEvents);
94
+
95
+ // Load git events if requested
96
+ if (includeGit) {
97
+ const gitEvents = await this.loadGitEvents(startTime, endTime, file);
98
+ events.push(...gitEvents);
99
+ }
100
+
101
+ // Load incident events if requested
102
+ let incidentInfo = null;
103
+ if (includeIncidents) {
104
+ const incidentEvents = await this.loadIncidentEvents(startTime, endTime, file);
105
+ events.push(...incidentEvents);
106
+
107
+ // Find the main incident if any
108
+ incidentInfo = incidentEvents.find(e => e.type === EVENT_TYPES.INCIDENT_REPORTED)?.details;
109
+ }
110
+
111
+ // Sort by timestamp
112
+ events.sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime());
113
+
114
+ // Build causal relationships
115
+ const { causalChain, rootCause } = this.buildCausalChain(events);
116
+
117
+ // Link related events
118
+ this.linkRelatedEvents(events);
119
+
120
+ return {
121
+ timelineId,
122
+ incident: incidentInfo,
123
+ events,
124
+ causalChain,
125
+ rootCause,
126
+ generatedAt: new Date(),
127
+ options,
128
+ };
129
+ }
130
+
131
+ /**
132
+ * Load firewall events from audit log
133
+ * @param {Date} startTime - Start time
134
+ * @param {Date} endTime - End time
135
+ * @param {string} file - File filter
136
+ * @param {string} agentId - Agent filter
137
+ * @returns {TimelineEvent[]} Firewall events
138
+ */
139
+ async loadFirewallEvents(startTime, endTime, file, agentId) {
140
+ const events = [];
141
+ const auditFile = path.join(this.auditDir, "firewall-events.jsonl");
142
+
143
+ if (!fs.existsSync(auditFile)) {
144
+ return events;
145
+ }
146
+
147
+ try {
148
+ const content = fs.readFileSync(auditFile, "utf-8");
149
+ const lines = content.trim().split("\n").filter(l => l);
150
+
151
+ for (const line of lines) {
152
+ try {
153
+ const raw = JSON.parse(line);
154
+ const eventTime = new Date(raw.timestamp);
155
+
156
+ // Apply filters
157
+ if (startTime && eventTime < new Date(startTime)) continue;
158
+ if (endTime && eventTime > new Date(endTime)) continue;
159
+ if (file && raw.file !== file && !raw.file?.includes(file)) continue;
160
+ if (agentId && raw.agentId !== agentId) continue;
161
+
162
+ events.push({
163
+ id: raw.id || `evt_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
164
+ timestamp: eventTime,
165
+ type: this.mapVerdictToEventType(raw.verdict, raw.action),
166
+ source: "firewall",
167
+ summary: this.buildFirewallSummary(raw),
168
+ details: raw,
169
+ relatedEvents: [],
170
+ });
171
+ } catch {
172
+ // Skip invalid lines
173
+ }
174
+ }
175
+ } catch (error) {
176
+ log.warn(`Failed to load firewall events: ${getErrorMessage(error)}`);
177
+ }
178
+
179
+ return events;
180
+ }
181
+
182
+ /**
183
+ * Load conductor events
184
+ * @param {Date} startTime - Start time
185
+ * @param {Date} endTime - End time
186
+ * @param {string} agentId - Agent filter
187
+ * @returns {TimelineEvent[]} Conductor events
188
+ */
189
+ async loadConductorEvents(startTime, endTime, agentId) {
190
+ const events = [];
191
+ const conductorFile = path.join(this.auditDir, "conductor-events.jsonl");
192
+
193
+ if (!fs.existsSync(conductorFile)) {
194
+ return events;
195
+ }
196
+
197
+ try {
198
+ const content = fs.readFileSync(conductorFile, "utf-8");
199
+ const lines = content.trim().split("\n").filter(l => l);
200
+
201
+ for (const line of lines) {
202
+ try {
203
+ const raw = JSON.parse(line);
204
+ const eventTime = new Date(raw.timestamp);
205
+
206
+ if (startTime && eventTime < new Date(startTime)) continue;
207
+ if (endTime && eventTime > new Date(endTime)) continue;
208
+ if (agentId && raw.agentId !== agentId) continue;
209
+
210
+ events.push({
211
+ id: raw.id || `evt_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
212
+ timestamp: eventTime,
213
+ type: raw.type || raw.action,
214
+ source: "conductor",
215
+ summary: this.buildConductorSummary(raw),
216
+ details: raw,
217
+ relatedEvents: [],
218
+ });
219
+ } catch {
220
+ // Skip invalid lines
221
+ }
222
+ }
223
+ } catch (error) {
224
+ log.warn(`Failed to load conductor events: ${getErrorMessage(error)}`);
225
+ }
226
+
227
+ return events;
228
+ }
229
+
230
+ /**
231
+ * Load git events (commits, merges)
232
+ * @param {Date} startTime - Start time
233
+ * @param {Date} endTime - End time
234
+ * @param {string} file - File filter
235
+ * @returns {TimelineEvent[]} Git events
236
+ */
237
+ async loadGitEvents(startTime, endTime, file) {
238
+ const events = [];
239
+
240
+ // This would typically call git log
241
+ // For now, return empty - would be implemented with git integration
242
+
243
+ return events;
244
+ }
245
+
246
+ /**
247
+ * Load incident events
248
+ * @param {Date} startTime - Start time
249
+ * @param {Date} endTime - End time
250
+ * @param {string} file - File filter
251
+ * @returns {TimelineEvent[]} Incident events
252
+ */
253
+ async loadIncidentEvents(startTime, endTime, file) {
254
+ const events = [];
255
+ const incidentsFile = path.join(this.incidentsDir, "incidents.jsonl");
256
+
257
+ if (!fs.existsSync(incidentsFile)) {
258
+ return events;
259
+ }
260
+
261
+ try {
262
+ const content = fs.readFileSync(incidentsFile, "utf-8");
263
+ const lines = content.trim().split("\n").filter(l => l);
264
+
265
+ for (const line of lines) {
266
+ try {
267
+ const raw = JSON.parse(line);
268
+ const eventTime = new Date(raw.timestamp || raw.reportedAt);
269
+
270
+ if (startTime && eventTime < new Date(startTime)) continue;
271
+ if (endTime && eventTime > new Date(endTime)) continue;
272
+ if (file && !raw.affectedFiles?.includes(file)) continue;
273
+
274
+ events.push({
275
+ id: raw.id || raw.incidentId,
276
+ timestamp: eventTime,
277
+ type: EVENT_TYPES.INCIDENT_REPORTED,
278
+ source: "incident",
279
+ summary: `Incident: ${raw.title || raw.description || "Unknown"}`,
280
+ details: raw,
281
+ relatedEvents: [],
282
+ });
283
+ } catch {
284
+ // Skip invalid lines
285
+ }
286
+ }
287
+ } catch (error) {
288
+ log.warn(`Failed to load incident events: ${getErrorMessage(error)}`);
289
+ }
290
+
291
+ return events;
292
+ }
293
+
294
+ /**
295
+ * Map verdict to event type
296
+ * @param {string} verdict - Verdict
297
+ * @param {string} action - Action
298
+ * @returns {string} Event type
299
+ */
300
+ mapVerdictToEventType(verdict, action) {
301
+ if (action === "override") return EVENT_TYPES.OVERRIDE_USED;
302
+
303
+ switch (verdict) {
304
+ case "ALLOW":
305
+ return EVENT_TYPES.PROPOSAL_ALLOWED;
306
+ case "BLOCK":
307
+ return EVENT_TYPES.PROPOSAL_BLOCKED;
308
+ case "WARN":
309
+ return EVENT_TYPES.PROPOSAL_WARNED;
310
+ default:
311
+ return EVENT_TYPES.PROPOSAL_SUBMITTED;
312
+ }
313
+ }
314
+
315
+ /**
316
+ * Build summary for firewall event
317
+ * @param {Object} raw - Raw event data
318
+ * @returns {string} Summary
319
+ */
320
+ buildFirewallSummary(raw) {
321
+ const parts = [];
322
+
323
+ if (raw.verdict) {
324
+ parts.push(`[${raw.verdict}]`);
325
+ }
326
+
327
+ if (raw.agentId) {
328
+ parts.push(`Agent: ${raw.agentId}`);
329
+ }
330
+
331
+ if (raw.file) {
332
+ parts.push(`File: ${path.basename(raw.file)}`);
333
+ }
334
+
335
+ if (raw.intent) {
336
+ parts.push(raw.intent.slice(0, 50) + (raw.intent.length > 50 ? "..." : ""));
337
+ }
338
+
339
+ return parts.join(" | ") || "Firewall event";
340
+ }
341
+
342
+ /**
343
+ * Build summary for conductor event
344
+ * @param {Object} raw - Raw event data
345
+ * @returns {string} Summary
346
+ */
347
+ buildConductorSummary(raw) {
348
+ const parts = [];
349
+
350
+ if (raw.type || raw.action) {
351
+ parts.push(`[${raw.type || raw.action}]`);
352
+ }
353
+
354
+ if (raw.agentId) {
355
+ parts.push(`Agent: ${raw.agentId}`);
356
+ }
357
+
358
+ if (raw.sessionId) {
359
+ parts.push(`Session: ${raw.sessionId.slice(0, 12)}...`);
360
+ }
361
+
362
+ return parts.join(" | ") || "Conductor event";
363
+ }
364
+
365
+ /**
366
+ * Build causal chain from events
367
+ * @param {TimelineEvent[]} events - Events to analyze
368
+ * @returns {Object} Causal chain and root cause
369
+ */
370
+ buildCausalChain(events) {
371
+ const causalChain = [];
372
+ let rootCause = null;
373
+
374
+ // Find incident events
375
+ const incidents = events.filter(e => e.type === EVENT_TYPES.INCIDENT_REPORTED);
376
+
377
+ if (incidents.length === 0) {
378
+ return { causalChain, rootCause };
379
+ }
380
+
381
+ // For each incident, trace back to find potential causes
382
+ for (const incident of incidents) {
383
+ const affectedFiles = incident.details.affectedFiles || [];
384
+ const incidentTime = new Date(incident.timestamp);
385
+
386
+ // Find events that affected the same files before the incident
387
+ const potentialCauses = events.filter(e => {
388
+ const eventTime = new Date(e.timestamp);
389
+ if (eventTime >= incidentTime) return false;
390
+
391
+ const eventFile = e.details?.file;
392
+ if (!eventFile) return false;
393
+
394
+ return affectedFiles.some(f => f.includes(eventFile) || eventFile.includes(f));
395
+ });
396
+
397
+ // Look for overrides or blocked proposals that were overridden
398
+ for (const cause of potentialCauses) {
399
+ if (cause.type === EVENT_TYPES.OVERRIDE_USED ||
400
+ (cause.type === EVENT_TYPES.PROPOSAL_ALLOWED && cause.details?.overrideUsed)) {
401
+ causalChain.push({
402
+ cause: cause.id,
403
+ effect: incident.id,
404
+ relationship: "override_led_to_incident",
405
+ confidence: 0.8,
406
+ });
407
+
408
+ if (!rootCause) {
409
+ rootCause = cause;
410
+ }
411
+ }
412
+ }
413
+
414
+ // Also look for the first suspicious change
415
+ const firstSuspicious = potentialCauses.find(e =>
416
+ e.type === EVENT_TYPES.PROPOSAL_ALLOWED &&
417
+ (e.details?.riskScore || 0) >= 50
418
+ );
419
+
420
+ if (firstSuspicious && !rootCause) {
421
+ rootCause = firstSuspicious;
422
+ causalChain.push({
423
+ cause: firstSuspicious.id,
424
+ effect: incident.id,
425
+ relationship: "high_risk_change_led_to_incident",
426
+ confidence: 0.6,
427
+ });
428
+ }
429
+ }
430
+
431
+ return { causalChain, rootCause };
432
+ }
433
+
434
+ /**
435
+ * Link related events together
436
+ * @param {TimelineEvent[]} events - Events to link
437
+ */
438
+ linkRelatedEvents(events) {
439
+ // Group events by file
440
+ const byFile = new Map();
441
+
442
+ for (const event of events) {
443
+ const file = event.details?.file;
444
+ if (file) {
445
+ if (!byFile.has(file)) {
446
+ byFile.set(file, []);
447
+ }
448
+ byFile.get(file).push(event);
449
+ }
450
+ }
451
+
452
+ // Link events that share the same file
453
+ for (const [, fileEvents] of byFile) {
454
+ for (let i = 0; i < fileEvents.length; i++) {
455
+ for (let j = i + 1; j < fileEvents.length; j++) {
456
+ fileEvents[i].relatedEvents.push(fileEvents[j].id);
457
+ fileEvents[j].relatedEvents.push(fileEvents[i].id);
458
+ }
459
+ }
460
+ }
461
+
462
+ // Group events by session
463
+ const bySession = new Map();
464
+
465
+ for (const event of events) {
466
+ const sessionId = event.details?.sessionId;
467
+ if (sessionId) {
468
+ if (!bySession.has(sessionId)) {
469
+ bySession.set(sessionId, []);
470
+ }
471
+ bySession.get(sessionId).push(event);
472
+ }
473
+ }
474
+
475
+ // Link events in same session
476
+ for (const [, sessionEvents] of bySession) {
477
+ for (let i = 0; i < sessionEvents.length; i++) {
478
+ for (let j = i + 1; j < sessionEvents.length; j++) {
479
+ if (!sessionEvents[i].relatedEvents.includes(sessionEvents[j].id)) {
480
+ sessionEvents[i].relatedEvents.push(sessionEvents[j].id);
481
+ }
482
+ if (!sessionEvents[j].relatedEvents.includes(sessionEvents[i].id)) {
483
+ sessionEvents[j].relatedEvents.push(sessionEvents[i].id);
484
+ }
485
+ }
486
+ }
487
+ }
488
+ }
489
+
490
+ /**
491
+ * Generate a timeline report
492
+ * @param {ForensicTimeline} timeline - Timeline to report on
493
+ * @returns {Object} Report
494
+ */
495
+ generateReport(timeline) {
496
+ const eventCounts = {};
497
+ const sourceCounts = {};
498
+
499
+ for (const event of timeline.events) {
500
+ eventCounts[event.type] = (eventCounts[event.type] || 0) + 1;
501
+ sourceCounts[event.source] = (sourceCounts[event.source] || 0) + 1;
502
+ }
503
+
504
+ return {
505
+ timelineId: timeline.timelineId,
506
+ generatedAt: timeline.generatedAt,
507
+ totalEvents: timeline.events.length,
508
+ eventCounts,
509
+ sourceCounts,
510
+ hasIncident: !!timeline.incident,
511
+ rootCauseIdentified: !!timeline.rootCause,
512
+ causalChainLength: timeline.causalChain.length,
513
+ timeRange: {
514
+ start: timeline.events[0]?.timestamp,
515
+ end: timeline.events[timeline.events.length - 1]?.timestamp,
516
+ },
517
+ };
518
+ }
519
+ }
520
+
521
+ /**
522
+ * Create a timeline builder instance
523
+ * @param {Object} options - Options
524
+ * @returns {TimelineBuilder} Timeline builder
525
+ */
526
+ function createTimelineBuilder(options = {}) {
527
+ return new TimelineBuilder(options);
528
+ }
529
+
530
+ module.exports = { TimelineBuilder, createTimelineBuilder, EVENT_TYPES };
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Truthpack Accessor
3
+ *
4
+ * Unified interface for accessing truthpack data.
5
+ */
6
+
7
+ "use strict";
8
+
9
+ const { loadTruthpack } = require("./loader");
10
+
11
+ /**
12
+ * Get routes from truthpack
13
+ * @param {string} projectRoot - Project root directory
14
+ * @returns {array} Array of routes
15
+ */
16
+ function getRoutes(projectRoot) {
17
+ const truthpack = loadTruthpack(projectRoot);
18
+ return truthpack.routes?.routes || [];
19
+ }
20
+
21
+ /**
22
+ * Get environment variables from truthpack
23
+ * @param {string} projectRoot - Project root directory
24
+ * @returns {object} Env vars data
25
+ */
26
+ function getEnvVars(projectRoot) {
27
+ const truthpack = loadTruthpack(projectRoot);
28
+ return truthpack.env || { vars: [], declared: [], declaredSources: [] };
29
+ }
30
+
31
+ /**
32
+ * Get auth rules from truthpack
33
+ * @param {string} projectRoot - Project root directory
34
+ * @returns {object} Auth rules data
35
+ */
36
+ function getAuthRules(projectRoot) {
37
+ const truthpack = loadTruthpack(projectRoot);
38
+ return truthpack.auth || { nextMiddleware: [], nextMatcherPatterns: [], fastify: {} };
39
+ }
40
+
41
+ /**
42
+ * Get contracts from truthpack
43
+ * @param {string} projectRoot - Project root directory
44
+ * @returns {object} Contracts data
45
+ */
46
+ function getContracts(projectRoot) {
47
+ const truthpack = loadTruthpack(projectRoot);
48
+ return truthpack.contracts || {};
49
+ }
50
+
51
+ /**
52
+ * Get UI graph from truthpack
53
+ * @param {string} projectRoot - Project root directory
54
+ * @returns {object|null} UI graph or null
55
+ */
56
+ function getUIGraph(projectRoot) {
57
+ const truthpack = loadTruthpack(projectRoot);
58
+ return truthpack.uiGraph || null;
59
+ }
60
+
61
+ module.exports = {
62
+ getRoutes,
63
+ getEnvVars,
64
+ getAuthRules,
65
+ getContracts,
66
+ getUIGraph
67
+ };