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,478 @@
1
+ // bin/runners/lib/missions/schema.js
2
+ // ═══════════════════════════════════════════════════════════════════════════════
3
+ // MISSION SCHEMA - Formal definition for Fix Missions V2
4
+ // "Missions, not chaos" - Each mission is a well-defined, reversible operation
5
+ // ═══════════════════════════════════════════════════════════════════════════════
6
+
7
+ const crypto = require('crypto');
8
+ const {
9
+ ValidationError,
10
+ isValidFilePath,
11
+ isValidConfidence,
12
+ getAuditTrail,
13
+ } = require('./hardening');
14
+
15
+ /**
16
+ * @typedef {object} MissionObjective
17
+ * @property {string} title - Mission title
18
+ * @property {string} intent - What we're trying to achieve
19
+ * @property {string[]} successCriteria - How we know we succeeded
20
+ * @property {string[]} targetFindingIds - Which findings this resolves
21
+ * @property {number} findingCount - Number of findings targeted
22
+ * @property {string} category - Finding category
23
+ * @property {string} severity - Finding severity
24
+ */
25
+
26
+ /**
27
+ * @typedef {object} MissionScope
28
+ * @property {string[]} allowedFiles - Files LLM may edit
29
+ * @property {string[]} readOnlyContext - Files for context only
30
+ * @property {string} blastRadius - Blast radius category
31
+ * @property {string|null} primaryFile - Primary file to edit
32
+ */
33
+
34
+ /**
35
+ * @typedef {object} MissionVerification
36
+ * @property {string} proofType - What to run after (ship|lint|test|custom)
37
+ * @property {string} expectedOutcome - Expected result
38
+ * @property {number} timeout - Verification timeout in ms
39
+ * @property {number} retries - Number of retries attempted
40
+ */
41
+
42
+ /**
43
+ * @typedef {object} MissionSafety
44
+ * @property {boolean} reversible - Can be rolled back
45
+ * @property {boolean} requiresApproval - Needs human approval
46
+ * @property {number} confidence - Combined finding confidence (0-1)
47
+ * @property {string} riskLevel - Risk level category
48
+ * @property {string|null} checkpointId - Checkpoint to rollback to
49
+ */
50
+
51
+ /**
52
+ * @typedef {object} MissionTemplate
53
+ * @property {string|null} intent - Template intent
54
+ * @property {string[]} do - Actions to take
55
+ * @property {string[]} dont - Actions to avoid
56
+ * @property {string[]} success - Success criteria
57
+ */
58
+
59
+ /**
60
+ * @typedef {object} Mission
61
+ * @property {string} id - Stable mission ID (M_xxx)
62
+ * @property {string} type - Mission type
63
+ * @property {string} status - Current status
64
+ * @property {string} createdAt - ISO timestamp
65
+ * @property {string} [updatedAt] - ISO timestamp
66
+ * @property {MissionObjective} objective - Mission objective
67
+ * @property {MissionScope} scope - Files in scope
68
+ * @property {MissionVerification} verification - Verification config
69
+ * @property {MissionSafety} safety - Safety metadata
70
+ * @property {MissionTemplate} template - LLM prompt template
71
+ * @property {object[]} evidence - Evidence from findings
72
+ */
73
+
74
+ /**
75
+ * Risk levels for missions
76
+ */
77
+ const RISK_LEVEL = {
78
+ LOW: 'low',
79
+ MEDIUM: 'medium',
80
+ HIGH: 'high',
81
+ CRITICAL: 'critical',
82
+ };
83
+
84
+ /**
85
+ * Blast radius categories
86
+ */
87
+ const BLAST_RADIUS = {
88
+ LOW: 'low', // 1-2 files
89
+ MEDIUM: 'medium', // 3-5 files
90
+ HIGH: 'high', // 6+ files
91
+ };
92
+
93
+ /**
94
+ * Proof types for verification
95
+ */
96
+ const PROOF_TYPE = {
97
+ SHIP: 'ship', // Run vibecheck ship
98
+ LINT: 'lint', // Run linter
99
+ TEST: 'test', // Run tests
100
+ CUSTOM: 'custom', // Custom verification
101
+ };
102
+
103
+ /**
104
+ * Expected outcomes for verification
105
+ */
106
+ const EXPECTED_OUTCOME = {
107
+ FINDING_REMOVED: 'finding_removed',
108
+ TEST_PASS: 'test_pass',
109
+ SCORE_DECREASE: 'score_decrease',
110
+ NO_REGRESSION: 'no_regression',
111
+ };
112
+
113
+ /**
114
+ * Mission status
115
+ */
116
+ const MISSION_STATUS = {
117
+ PLANNED: 'planned',
118
+ PENDING: 'pending',
119
+ IN_PROGRESS: 'in_progress',
120
+ COMPLETED: 'completed',
121
+ FAILED: 'failed',
122
+ ROLLED_BACK: 'rolled_back',
123
+ SKIPPED: 'skipped',
124
+ };
125
+
126
+ /**
127
+ * Generate a stable mission ID from finding IDs
128
+ * @param {string} type - Mission type
129
+ * @param {string[]} findingIds - Target finding IDs
130
+ * @returns {string} Stable mission ID
131
+ */
132
+ function generateMissionId(type, findingIds) {
133
+ const sorted = [...findingIds].sort();
134
+ const hash = crypto
135
+ .createHash('sha256')
136
+ .update(`${type}:${sorted.join(',')}`)
137
+ .digest('hex')
138
+ .slice(0, 12);
139
+ return `M_${hash}`;
140
+ }
141
+
142
+ /**
143
+ * Calculate blast radius from file count
144
+ * @param {number} fileCount - Number of files affected
145
+ * @returns {string} Blast radius category
146
+ */
147
+ function calculateBlastRadius(fileCount) {
148
+ if (fileCount <= 2) return BLAST_RADIUS.LOW;
149
+ if (fileCount <= 5) return BLAST_RADIUS.MEDIUM;
150
+ return BLAST_RADIUS.HIGH;
151
+ }
152
+
153
+ /**
154
+ * Calculate risk level from mission properties
155
+ * @param {object} params - Mission parameters
156
+ * @returns {string} Risk level
157
+ */
158
+ function calculateRiskLevel({ severity, confidence, blastRadius, missionType }) {
159
+ let score = 0;
160
+
161
+ // Severity contribution (0-40 points)
162
+ if (severity === 'BLOCK') score += 40;
163
+ else if (severity === 'WARN') score += 20;
164
+ else score += 5;
165
+
166
+ // Confidence inverse contribution (0-20 points)
167
+ // Lower confidence = higher risk
168
+ score += Math.round((1 - (confidence || 0.5)) * 20);
169
+
170
+ // Blast radius contribution (0-30 points)
171
+ if (blastRadius === BLAST_RADIUS.HIGH) score += 30;
172
+ else if (blastRadius === BLAST_RADIUS.MEDIUM) score += 15;
173
+ else score += 5;
174
+
175
+ // Mission type contribution (0-10 points)
176
+ const criticalTypes = [
177
+ 'FIX_HARDCODED_SECRETS',
178
+ 'REMOVE_OWNER_MODE',
179
+ 'FIX_AUTH_DRIFT',
180
+ 'FIX_STRIPE_WEBHOOKS',
181
+ ];
182
+ if (criticalTypes.includes(missionType)) score += 10;
183
+
184
+ // Convert score to risk level
185
+ if (score >= 70) return RISK_LEVEL.CRITICAL;
186
+ if (score >= 50) return RISK_LEVEL.HIGH;
187
+ if (score >= 30) return RISK_LEVEL.MEDIUM;
188
+ return RISK_LEVEL.LOW;
189
+ }
190
+
191
+ /**
192
+ * Create a mission object from findings
193
+ * @param {object} params - Mission creation parameters
194
+ * @param {string} params.type - Mission type
195
+ * @param {string} params.title - Mission title
196
+ * @param {string} params.severity - Finding severity
197
+ * @param {string} params.category - Finding category
198
+ * @param {string[]} params.targetFindingIds - IDs of findings to fix
199
+ * @param {object} [params.template] - Mission template
200
+ * @param {string[]} [params.allowedFiles] - Files that can be edited
201
+ * @param {string[]} [params.readOnlyContext] - Files for context only
202
+ * @param {number} [params.confidence] - Confidence score (0-1)
203
+ * @param {object[]} [params.evidence] - Evidence from findings
204
+ * @param {string|null} [params.file] - Primary file
205
+ * @returns {Mission} Mission object
206
+ * @throws {ValidationError} If parameters are invalid
207
+ */
208
+ function createMission({
209
+ type,
210
+ title,
211
+ severity,
212
+ category,
213
+ targetFindingIds,
214
+ template,
215
+ allowedFiles = [],
216
+ readOnlyContext = [],
217
+ confidence = 0.5,
218
+ evidence = [],
219
+ file = null,
220
+ }) {
221
+ const audit = getAuditTrail();
222
+
223
+ // ═══════════════════════════════════════════════════════════════════════════════
224
+ // INPUT VALIDATION
225
+ // ═══════════════════════════════════════════════════════════════════════════════
226
+
227
+ // Validate required fields
228
+ if (!type || typeof type !== 'string') {
229
+ throw new ValidationError('Mission type is required and must be a string', 'type', type);
230
+ }
231
+
232
+ if (!targetFindingIds || !Array.isArray(targetFindingIds) || targetFindingIds.length === 0) {
233
+ throw new ValidationError('targetFindingIds must be a non-empty array', 'targetFindingIds', targetFindingIds);
234
+ }
235
+
236
+ // Validate confidence
237
+ if (!isValidConfidence(confidence)) {
238
+ audit.warn('invalid_confidence', { confidence, default: 0.5 });
239
+ confidence = 0.5;
240
+ }
241
+
242
+ // Validate and sanitize file paths
243
+ const sanitizedAllowedFiles = [];
244
+ for (const filePath of allowedFiles) {
245
+ if (isValidFilePath(filePath)) {
246
+ sanitizedAllowedFiles.push(filePath);
247
+ } else {
248
+ audit.warn('invalid_file_path_skipped', { filePath });
249
+ }
250
+ }
251
+
252
+ const sanitizedReadOnlyContext = [];
253
+ for (const filePath of readOnlyContext) {
254
+ if (isValidFilePath(filePath)) {
255
+ sanitizedReadOnlyContext.push(filePath);
256
+ } else {
257
+ audit.warn('invalid_readonly_path_skipped', { filePath });
258
+ }
259
+ }
260
+
261
+ // Validate primary file
262
+ let sanitizedFile = null;
263
+ if (file) {
264
+ if (isValidFilePath(file)) {
265
+ sanitizedFile = file;
266
+ } else {
267
+ audit.warn('invalid_primary_file', { file });
268
+ }
269
+ }
270
+
271
+ // ═══════════════════════════════════════════════════════════════════════════════
272
+ // MISSION CONSTRUCTION
273
+ // ═══════════════════════════════════════════════════════════════════════════════
274
+
275
+ const blastRadius = calculateBlastRadius(sanitizedAllowedFiles.length);
276
+ const riskLevel = calculateRiskLevel({
277
+ severity,
278
+ confidence,
279
+ blastRadius,
280
+ missionType: type,
281
+ });
282
+
283
+ const missionId = generateMissionId(type, targetFindingIds);
284
+
285
+ // Sanitize title
286
+ const sanitizedTitle = (title || `Fix ${type}`).slice(0, 200);
287
+
288
+ // Sanitize severity
289
+ const validSeverities = ['BLOCK', 'WARN', 'INFO', 'critical', 'high', 'medium', 'low', 'info'];
290
+ const sanitizedSeverity = validSeverities.includes(severity) ? severity : 'WARN';
291
+
292
+ const mission = {
293
+ // Identity
294
+ id: missionId,
295
+ type,
296
+ status: MISSION_STATUS.PLANNED,
297
+ createdAt: new Date().toISOString(),
298
+
299
+ // Objective (the "briefing")
300
+ objective: {
301
+ title: sanitizedTitle,
302
+ intent: template?.intent || `Fix ${type} issues`,
303
+ successCriteria: Array.isArray(template?.success) ? template.success : [`Finding ${targetFindingIds[0]} no longer appears in ship results`],
304
+ targetFindingIds: [...targetFindingIds], // Defensive copy
305
+ findingCount: targetFindingIds.length,
306
+ category: category || 'Unknown',
307
+ severity: sanitizedSeverity,
308
+ },
309
+
310
+ // Files touched (pre-calculated)
311
+ scope: {
312
+ allowedFiles: sanitizedAllowedFiles,
313
+ readOnlyContext: sanitizedReadOnlyContext,
314
+ blastRadius,
315
+ primaryFile: sanitizedFile || sanitizedAllowedFiles[0] || null,
316
+ },
317
+
318
+ // Expected proofs
319
+ verification: {
320
+ proofType: PROOF_TYPE.SHIP,
321
+ expectedOutcome: EXPECTED_OUTCOME.FINDING_REMOVED,
322
+ timeout: 30000,
323
+ retries: 0,
324
+ },
325
+
326
+ // Safety metadata
327
+ safety: {
328
+ reversible: true,
329
+ requiresApproval: riskLevel === RISK_LEVEL.CRITICAL,
330
+ confidence,
331
+ riskLevel,
332
+ checkpointId: null, // Set when checkpoint is created
333
+ },
334
+
335
+ // Template for LLM prompt
336
+ template: {
337
+ intent: template?.intent || null,
338
+ do: Array.isArray(template?.do) ? template.do : [],
339
+ dont: Array.isArray(template?.dont) ? template.dont : [],
340
+ success: Array.isArray(template?.success) ? template.success : [],
341
+ },
342
+
343
+ // Evidence from findings (defensive copy)
344
+ evidence: Array.isArray(evidence) ? [...evidence] : [],
345
+ };
346
+
347
+ audit.debug('mission_created', {
348
+ missionId,
349
+ type,
350
+ findingCount: targetFindingIds.length,
351
+ fileCount: sanitizedAllowedFiles.length,
352
+ riskLevel,
353
+ });
354
+
355
+ return mission;
356
+ }
357
+
358
+ /**
359
+ * Validate a mission object
360
+ * @param {object} mission - Mission to validate
361
+ * @returns {object} Validation result { valid: boolean, errors: string[] }
362
+ */
363
+ function validateMission(mission) {
364
+ const errors = [];
365
+
366
+ if (!mission.id || !mission.id.startsWith('M_')) {
367
+ errors.push('Mission ID must start with "M_"');
368
+ }
369
+
370
+ if (!mission.type) {
371
+ errors.push('Mission type is required');
372
+ }
373
+
374
+ if (!mission.objective?.targetFindingIds?.length) {
375
+ errors.push('Mission must target at least one finding');
376
+ }
377
+
378
+ if (!mission.scope?.allowedFiles?.length && !mission.scope?.readOnlyContext?.length) {
379
+ errors.push('Mission must have at least one file in scope');
380
+ }
381
+
382
+ if (mission.safety?.confidence < 0 || mission.safety?.confidence > 1) {
383
+ errors.push('Confidence must be between 0 and 1');
384
+ }
385
+
386
+ return {
387
+ valid: errors.length === 0,
388
+ errors,
389
+ };
390
+ }
391
+
392
+ /**
393
+ * Serialize mission to JSON for storage
394
+ * @param {object} mission - Mission object
395
+ * @returns {string} JSON string
396
+ */
397
+ function serializeMission(mission) {
398
+ return JSON.stringify(mission, null, 2);
399
+ }
400
+
401
+ /**
402
+ * Deserialize mission from JSON
403
+ * @param {string} json - JSON string
404
+ * @returns {object} Mission object
405
+ */
406
+ function deserializeMission(json) {
407
+ const mission = JSON.parse(json);
408
+ // Ensure all required fields exist with defaults
409
+ return {
410
+ ...mission,
411
+ status: mission.status || MISSION_STATUS.PLANNED,
412
+ safety: {
413
+ reversible: true,
414
+ requiresApproval: false,
415
+ confidence: 0.5,
416
+ riskLevel: RISK_LEVEL.MEDIUM,
417
+ checkpointId: null,
418
+ ...mission.safety,
419
+ },
420
+ verification: {
421
+ proofType: PROOF_TYPE.SHIP,
422
+ expectedOutcome: EXPECTED_OUTCOME.FINDING_REMOVED,
423
+ timeout: 30000,
424
+ retries: 0,
425
+ ...mission.verification,
426
+ },
427
+ };
428
+ }
429
+
430
+ /**
431
+ * Update mission status
432
+ * @param {object} mission - Mission object
433
+ * @param {string} status - New status
434
+ * @param {object} metadata - Additional metadata
435
+ * @returns {object} Updated mission
436
+ */
437
+ function updateMissionStatus(mission, status, metadata = {}) {
438
+ return {
439
+ ...mission,
440
+ status,
441
+ updatedAt: new Date().toISOString(),
442
+ ...metadata,
443
+ };
444
+ }
445
+
446
+ /**
447
+ * Check if mission is safe to auto-apply
448
+ * @param {object} mission - Mission object
449
+ * @returns {boolean} True if safe to auto-apply
450
+ */
451
+ function isSafeToAutoApply(mission) {
452
+ return (
453
+ mission.safety.reversible &&
454
+ !mission.safety.requiresApproval &&
455
+ mission.safety.riskLevel !== RISK_LEVEL.CRITICAL &&
456
+ mission.safety.confidence >= 0.6
457
+ );
458
+ }
459
+
460
+ module.exports = {
461
+ // Constants
462
+ RISK_LEVEL,
463
+ BLAST_RADIUS,
464
+ PROOF_TYPE,
465
+ EXPECTED_OUTCOME,
466
+ MISSION_STATUS,
467
+
468
+ // Functions
469
+ generateMissionId,
470
+ calculateBlastRadius,
471
+ calculateRiskLevel,
472
+ createMission,
473
+ validateMission,
474
+ serializeMission,
475
+ deserializeMission,
476
+ updateMissionStatus,
477
+ isSafeToAutoApply,
478
+ };