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,352 @@
1
+ /**
2
+ * Intent Schema v2 - Enforcement-Grade Intent Declaration
3
+ *
4
+ * ═══════════════════════════════════════════════════════════════════════════════
5
+ * AGENT FIREWALL™ - INTENT DECLARATION SYSTEM
6
+ * ═══════════════════════════════════════════════════════════════════════════════
7
+ *
8
+ * Intent is the foundation of the Agent Firewall enforcement model.
9
+ * All AI actions MUST be checked against declared intent.
10
+ *
11
+ * Properties:
12
+ * - Intent is explicit, human-written, short, and structured
13
+ * - Intent is captured BEFORE any AI code generation
14
+ * - Intent is IMMUTABLE during a session unless explicitly updated
15
+ * - If intent is missing → Agent Firewall defaults to BLOCK
16
+ *
17
+ * @module intent/schema
18
+ * @version 2.0.0
19
+ */
20
+
21
+ "use strict";
22
+
23
+ const crypto = require("crypto");
24
+
25
+ /**
26
+ * Intent Declaration JSON Schema
27
+ */
28
+ const INTENT_SCHEMA = {
29
+ $schema: "http://json-schema.org/draft-07/schema#",
30
+ $id: "https://vibecheckai.dev/schemas/intent/v2",
31
+ type: "object",
32
+ required: ["summary", "constraints", "created_at", "hash"],
33
+ properties: {
34
+ // Core required fields
35
+ summary: {
36
+ type: "string",
37
+ description: "Human-written summary of what the change intends to accomplish",
38
+ minLength: 10,
39
+ maxLength: 500,
40
+ },
41
+ constraints: {
42
+ type: "array",
43
+ description: "Explicit constraints that MUST be respected. Violations = BLOCK.",
44
+ items: {
45
+ type: "string",
46
+ minLength: 5,
47
+ },
48
+ minItems: 0,
49
+ },
50
+ allowed_changes: {
51
+ type: "array",
52
+ description: "Explicit list of allowed modifications (files, routes, env vars)",
53
+ items: {
54
+ type: "object",
55
+ required: ["type", "target"],
56
+ properties: {
57
+ type: {
58
+ type: "string",
59
+ enum: ["file_create", "file_modify", "file_delete", "route_add", "route_modify", "env_add", "permission_modify", "config_change"],
60
+ description: "Type of allowed change",
61
+ },
62
+ target: {
63
+ type: "string",
64
+ description: "Target of the change (file path, route pattern, env var name)",
65
+ },
66
+ pattern: {
67
+ type: "string",
68
+ description: "Glob pattern for matching multiple targets",
69
+ },
70
+ reason: {
71
+ type: "string",
72
+ description: "Why this change is allowed",
73
+ },
74
+ },
75
+ },
76
+ },
77
+ created_at: {
78
+ type: "string",
79
+ format: "date-time",
80
+ description: "ISO timestamp when intent was declared",
81
+ },
82
+ hash: {
83
+ type: "string",
84
+ pattern: "^[a-f0-9]{64}$",
85
+ description: "SHA-256 hash of intent content for immutability verification",
86
+ },
87
+
88
+ // Optional metadata
89
+ session_id: {
90
+ type: "string",
91
+ description: "Session identifier for tracking",
92
+ },
93
+ author: {
94
+ type: "string",
95
+ description: "Who declared the intent (user identifier)",
96
+ },
97
+ version: {
98
+ type: "number",
99
+ description: "Intent version (increments on explicit update)",
100
+ minimum: 1,
101
+ },
102
+ parent_hash: {
103
+ type: "string",
104
+ description: "Hash of parent intent if this is an update",
105
+ },
106
+ expires_at: {
107
+ type: "string",
108
+ format: "date-time",
109
+ description: "Optional expiration time for the intent",
110
+ },
111
+ scope: {
112
+ type: "object",
113
+ description: "Scope restrictions for the intent",
114
+ properties: {
115
+ directories: {
116
+ type: "array",
117
+ items: { type: "string" },
118
+ description: "Allowed directories for changes",
119
+ },
120
+ file_patterns: {
121
+ type: "array",
122
+ items: { type: "string" },
123
+ description: "Allowed file glob patterns",
124
+ },
125
+ domains: {
126
+ type: "array",
127
+ items: {
128
+ type: "string",
129
+ enum: ["auth", "payments", "routes", "contracts", "ui", "database", "config", "general"],
130
+ },
131
+ description: "Allowed domains for changes",
132
+ },
133
+ excluded_paths: {
134
+ type: "array",
135
+ items: { type: "string" },
136
+ description: "Explicitly excluded paths",
137
+ },
138
+ },
139
+ },
140
+ },
141
+ additionalProperties: false,
142
+ };
143
+
144
+ /**
145
+ * Compute content hash for intent immutability verification
146
+ * @param {Object} intent - Intent object (without hash)
147
+ * @returns {string} SHA-256 hash
148
+ */
149
+ function computeIntentHash(intent) {
150
+ // Normalize intent for consistent hashing
151
+ const normalized = {
152
+ summary: intent.summary?.trim() || "",
153
+ constraints: (intent.constraints || []).map(c => c.trim()).sort(),
154
+ allowed_changes: (intent.allowed_changes || [])
155
+ .map(c => ({ type: c.type, target: c.target, pattern: c.pattern }))
156
+ .sort((a, b) => `${a.type}:${a.target}`.localeCompare(`${b.type}:${b.target}`)),
157
+ created_at: intent.created_at,
158
+ };
159
+
160
+ const content = JSON.stringify(normalized, null, 0);
161
+ return crypto.createHash("sha256").update(content).digest("hex");
162
+ }
163
+
164
+ /**
165
+ * Create a new intent declaration
166
+ * @param {Object} params - Intent parameters
167
+ * @param {string} params.summary - Human-readable summary
168
+ * @param {string[]} params.constraints - Constraints to enforce
169
+ * @param {Object[]} params.allowed_changes - Explicitly allowed changes
170
+ * @param {Object} params.scope - Scope restrictions
171
+ * @param {string} params.author - Who declared the intent
172
+ * @param {string} params.session_id - Session identifier
173
+ * @returns {Object} Complete intent object with hash
174
+ */
175
+ function createIntent({
176
+ summary,
177
+ constraints = [],
178
+ allowed_changes = [],
179
+ scope = null,
180
+ author = null,
181
+ session_id = null,
182
+ }) {
183
+ const created_at = new Date().toISOString();
184
+
185
+ const intent = {
186
+ summary: summary?.trim(),
187
+ constraints: constraints.map(c => c.trim()).filter(Boolean),
188
+ allowed_changes,
189
+ created_at,
190
+ version: 1,
191
+ hash: "", // Placeholder
192
+ };
193
+
194
+ // Add optional fields
195
+ if (scope) intent.scope = scope;
196
+ if (author) intent.author = author;
197
+ if (session_id) intent.session_id = session_id;
198
+
199
+ // Compute and set hash
200
+ intent.hash = computeIntentHash(intent);
201
+
202
+ return intent;
203
+ }
204
+
205
+ /**
206
+ * Verify intent has not been tampered with
207
+ * @param {Object} intent - Intent to verify
208
+ * @returns {Object} Verification result { valid, computed_hash, stored_hash }
209
+ */
210
+ function verifyIntentIntegrity(intent) {
211
+ if (!intent || !intent.hash) {
212
+ return {
213
+ valid: false,
214
+ reason: "MISSING_HASH",
215
+ computed_hash: null,
216
+ stored_hash: null,
217
+ };
218
+ }
219
+
220
+ const computed = computeIntentHash(intent);
221
+ const stored = intent.hash;
222
+
223
+ return {
224
+ valid: computed === stored,
225
+ reason: computed === stored ? "VERIFIED" : "HASH_MISMATCH",
226
+ computed_hash: computed,
227
+ stored_hash: stored,
228
+ };
229
+ }
230
+
231
+ /**
232
+ * Update an existing intent (creates new version with parent reference)
233
+ * @param {Object} currentIntent - Current intent
234
+ * @param {Object} updates - Fields to update
235
+ * @returns {Object} New intent with incremented version
236
+ */
237
+ function updateIntent(currentIntent, updates) {
238
+ const parent_hash = currentIntent.hash;
239
+ const version = (currentIntent.version || 1) + 1;
240
+
241
+ const newIntent = {
242
+ ...currentIntent,
243
+ ...updates,
244
+ created_at: new Date().toISOString(),
245
+ version,
246
+ parent_hash,
247
+ hash: "", // Will be recomputed
248
+ };
249
+
250
+ // Ensure constraints are clean
251
+ if (newIntent.constraints) {
252
+ newIntent.constraints = newIntent.constraints.map(c => c.trim()).filter(Boolean);
253
+ }
254
+
255
+ // Recompute hash
256
+ newIntent.hash = computeIntentHash(newIntent);
257
+
258
+ return newIntent;
259
+ }
260
+
261
+ /**
262
+ * Check if intent is expired
263
+ * @param {Object} intent - Intent to check
264
+ * @returns {boolean} True if expired
265
+ */
266
+ function isIntentExpired(intent) {
267
+ if (!intent.expires_at) return false;
268
+ return new Date(intent.expires_at) < new Date();
269
+ }
270
+
271
+ /**
272
+ * Create a minimal blocking intent (for when no intent is declared)
273
+ * This intent blocks ALL changes by having no allowed_changes.
274
+ * @returns {Object} Blocking intent
275
+ */
276
+ function createBlockingIntent() {
277
+ return createIntent({
278
+ summary: "NO INTENT DECLARED - ALL CHANGES BLOCKED BY DEFAULT",
279
+ constraints: [
280
+ "No changes allowed without explicit intent declaration",
281
+ "All file operations blocked",
282
+ "All route additions blocked",
283
+ "All env var references blocked",
284
+ ],
285
+ allowed_changes: [],
286
+ scope: {
287
+ directories: [],
288
+ file_patterns: [],
289
+ domains: [],
290
+ },
291
+ });
292
+ }
293
+
294
+ /**
295
+ * Intent constraint types for enforcement
296
+ */
297
+ const CONSTRAINT_TYPES = {
298
+ NO_NEW_ROUTES: "no_new_routes",
299
+ NO_AUTH_CHANGES: "no_auth_changes",
300
+ NO_PAYMENT_CHANGES: "no_payment_changes",
301
+ NO_DATABASE_MIGRATIONS: "no_database_migrations",
302
+ NO_ENV_ADDITIONS: "no_env_additions",
303
+ NO_PERMISSION_CHANGES: "no_permission_changes",
304
+ NO_EXTERNAL_CALLS: "no_external_calls",
305
+ NO_FILE_DELETIONS: "no_file_deletions",
306
+ SINGLE_FILE_ONLY: "single_file_only",
307
+ TESTS_REQUIRED: "tests_required",
308
+ REVIEW_REQUIRED: "review_required",
309
+ };
310
+
311
+ /**
312
+ * Pre-built constraint templates
313
+ */
314
+ const CONSTRAINT_TEMPLATES = {
315
+ STRICT_BUGFIX: [
316
+ "No new routes allowed",
317
+ "No auth logic changes",
318
+ "No new environment variables",
319
+ "Changes limited to specified file(s)",
320
+ "No new dependencies",
321
+ ],
322
+ FEATURE_ADDITION: [
323
+ "New routes must be documented in intent",
324
+ "No changes to existing auth logic",
325
+ "New env vars must be declared",
326
+ "Tests required for new functionality",
327
+ ],
328
+ REFACTOR: [
329
+ "No behavior changes",
330
+ "No new routes",
331
+ "No API contract changes",
332
+ "No auth boundary changes",
333
+ ],
334
+ SECURITY_PATCH: [
335
+ "Auth changes must be explicit in intent",
336
+ "No new external endpoints",
337
+ "No permission relaxation",
338
+ "Review required before ship",
339
+ ],
340
+ };
341
+
342
+ module.exports = {
343
+ INTENT_SCHEMA,
344
+ createIntent,
345
+ computeIntentHash,
346
+ verifyIntentIntegrity,
347
+ updateIntent,
348
+ isIntentExpired,
349
+ createBlockingIntent,
350
+ CONSTRAINT_TYPES,
351
+ CONSTRAINT_TEMPLATES,
352
+ };
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Intent Store - Persistent Intent Storage
3
+ *
4
+ * ═══════════════════════════════════════════════════════════════════════════════
5
+ * AGENT FIREWALL™ - INTENT PERSISTENCE
6
+ * ═══════════════════════════════════════════════════════════════════════════════
7
+ *
8
+ * Stores intent declarations for session and audit purposes.
9
+ * Intent is immutable once stored - updates create new versions.
10
+ *
11
+ * @module intent/store
12
+ * @version 2.0.0
13
+ */
14
+
15
+ "use strict";
16
+
17
+ const fs = require("fs");
18
+ const path = require("path");
19
+ const { verifyIntentIntegrity, createBlockingIntent } = require("./schema");
20
+
21
+ /**
22
+ * Intent Store - manages intent persistence
23
+ */
24
+ class IntentStore {
25
+ constructor(projectRoot) {
26
+ this.projectRoot = projectRoot;
27
+ this.intentDir = path.join(projectRoot, ".vibecheck", "intents");
28
+ this.currentIntentPath = path.join(this.intentDir, "current.json");
29
+ this.historyDir = path.join(this.intentDir, "history");
30
+ }
31
+
32
+ /**
33
+ * Ensure storage directories exist
34
+ */
35
+ ensureDirectories() {
36
+ if (!fs.existsSync(this.intentDir)) {
37
+ fs.mkdirSync(this.intentDir, { recursive: true });
38
+ }
39
+ if (!fs.existsSync(this.historyDir)) {
40
+ fs.mkdirSync(this.historyDir, { recursive: true });
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Store a new intent (or update)
46
+ * @param {Object} intent - Intent to store
47
+ * @returns {Object} Storage result
48
+ */
49
+ store(intent) {
50
+ this.ensureDirectories();
51
+
52
+ // Verify intent integrity
53
+ const verification = verifyIntentIntegrity(intent);
54
+ if (!verification.valid) {
55
+ return {
56
+ success: false,
57
+ error: `INTENT_INTEGRITY_FAILED: ${verification.reason}`,
58
+ };
59
+ }
60
+
61
+ // Archive current intent if exists (use allowMissing to avoid archiving blocking intent)
62
+ const current = this.getCurrent({ allowMissing: true });
63
+ if (current && current.hash !== intent.hash) {
64
+ this.archive(current);
65
+ }
66
+
67
+ // Write new current intent
68
+ const data = {
69
+ intent,
70
+ stored_at: new Date().toISOString(),
71
+ verified: true,
72
+ };
73
+
74
+ fs.writeFileSync(this.currentIntentPath, JSON.stringify(data, null, 2));
75
+
76
+ return {
77
+ success: true,
78
+ hash: intent.hash,
79
+ path: this.currentIntentPath,
80
+ };
81
+ }
82
+
83
+ /**
84
+ * Get current intent (returns blocking intent if none exists)
85
+ * @param {Object} options - Options
86
+ * @param {boolean} options.allowMissing - Don't return blocking intent if missing
87
+ * @returns {Object|null} Current intent or blocking intent
88
+ */
89
+ getCurrent(options = {}) {
90
+ if (!fs.existsSync(this.currentIntentPath)) {
91
+ if (options.allowMissing) {
92
+ return null;
93
+ }
94
+ // Return blocking intent when no intent declared
95
+ return createBlockingIntent();
96
+ }
97
+
98
+ try {
99
+ const data = JSON.parse(fs.readFileSync(this.currentIntentPath, "utf-8"));
100
+ const intent = data.intent;
101
+
102
+ // Verify integrity on load
103
+ const verification = verifyIntentIntegrity(intent);
104
+ if (!verification.valid) {
105
+ console.error(`[IntentStore] INTEGRITY VIOLATION: ${verification.reason}`);
106
+ // Return blocking intent on integrity failure
107
+ return createBlockingIntent();
108
+ }
109
+
110
+ return intent;
111
+ } catch (error) {
112
+ console.error(`[IntentStore] Error loading intent: ${error.message}`);
113
+ if (options.allowMissing) {
114
+ return null;
115
+ }
116
+ return createBlockingIntent();
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Check if an intent is currently declared
122
+ * @returns {boolean} True if intent exists
123
+ */
124
+ hasIntent() {
125
+ return fs.existsSync(this.currentIntentPath);
126
+ }
127
+
128
+ /**
129
+ * Archive an intent to history
130
+ * @param {Object} intent - Intent to archive
131
+ */
132
+ archive(intent) {
133
+ this.ensureDirectories();
134
+
135
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
136
+ const archivePath = path.join(this.historyDir, `${timestamp}_${intent.hash.slice(0, 8)}.json`);
137
+
138
+ const data = {
139
+ intent,
140
+ archived_at: new Date().toISOString(),
141
+ };
142
+
143
+ fs.writeFileSync(archivePath, JSON.stringify(data, null, 2));
144
+ }
145
+
146
+ /**
147
+ * Get intent history
148
+ * @param {number} limit - Maximum number of intents to return
149
+ * @returns {Object[]} Array of historical intents
150
+ */
151
+ getHistory(limit = 10) {
152
+ if (!fs.existsSync(this.historyDir)) {
153
+ return [];
154
+ }
155
+
156
+ const files = fs.readdirSync(this.historyDir)
157
+ .filter(f => f.endsWith(".json"))
158
+ .sort()
159
+ .reverse()
160
+ .slice(0, limit);
161
+
162
+ return files.map(file => {
163
+ try {
164
+ const data = JSON.parse(fs.readFileSync(path.join(this.historyDir, file), "utf-8"));
165
+ return {
166
+ ...data.intent,
167
+ archived_at: data.archived_at,
168
+ };
169
+ } catch {
170
+ return null;
171
+ }
172
+ }).filter(Boolean);
173
+ }
174
+
175
+ /**
176
+ * Clear current intent
177
+ * @returns {boolean} Success
178
+ */
179
+ clear() {
180
+ const current = this.getCurrent({ allowMissing: true });
181
+ if (current) {
182
+ this.archive(current);
183
+ }
184
+
185
+ if (fs.existsSync(this.currentIntentPath)) {
186
+ fs.unlinkSync(this.currentIntentPath);
187
+ }
188
+
189
+ return true;
190
+ }
191
+
192
+ /**
193
+ * Get intent by hash (from history)
194
+ * @param {string} hash - Intent hash
195
+ * @returns {Object|null} Intent or null
196
+ */
197
+ getByHash(hash) {
198
+ // Check current
199
+ const current = this.getCurrent({ allowMissing: true });
200
+ if (current && current.hash === hash) {
201
+ return current;
202
+ }
203
+
204
+ // Check history
205
+ if (!fs.existsSync(this.historyDir)) {
206
+ return null;
207
+ }
208
+
209
+ const files = fs.readdirSync(this.historyDir);
210
+ for (const file of files) {
211
+ if (file.includes(hash.slice(0, 8))) {
212
+ try {
213
+ const data = JSON.parse(fs.readFileSync(path.join(this.historyDir, file), "utf-8"));
214
+ if (data.intent.hash === hash) {
215
+ return data.intent;
216
+ }
217
+ } catch {
218
+ continue;
219
+ }
220
+ }
221
+ }
222
+
223
+ return null;
224
+ }
225
+ }
226
+
227
+ /**
228
+ * Session-scoped intent tracking
229
+ */
230
+ class SessionIntentTracker {
231
+ constructor() {
232
+ this.sessions = new Map();
233
+ }
234
+
235
+ /**
236
+ * Set intent for a session
237
+ * @param {string} sessionId - Session identifier
238
+ * @param {Object} intent - Intent object
239
+ */
240
+ setIntent(sessionId, intent) {
241
+ this.sessions.set(sessionId, {
242
+ intent,
243
+ set_at: new Date().toISOString(),
244
+ locked: true, // Immutable by default
245
+ });
246
+ }
247
+
248
+ /**
249
+ * Get intent for a session
250
+ * @param {string} sessionId - Session identifier
251
+ * @returns {Object|null} Intent or null
252
+ */
253
+ getIntent(sessionId) {
254
+ const session = this.sessions.get(sessionId);
255
+ return session?.intent || null;
256
+ }
257
+
258
+ /**
259
+ * Check if session has intent
260
+ * @param {string} sessionId - Session identifier
261
+ * @returns {boolean} True if intent exists
262
+ */
263
+ hasIntent(sessionId) {
264
+ return this.sessions.has(sessionId);
265
+ }
266
+
267
+ /**
268
+ * Clear session intent
269
+ * @param {string} sessionId - Session identifier
270
+ */
271
+ clearIntent(sessionId) {
272
+ this.sessions.delete(sessionId);
273
+ }
274
+ }
275
+
276
+ // Global session tracker
277
+ const globalSessionTracker = new SessionIntentTracker();
278
+
279
+ module.exports = {
280
+ IntentStore,
281
+ SessionIntentTracker,
282
+ globalSessionTracker,
283
+ };