@planu/cli 0.63.6 → 0.64.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 (664) hide show
  1. package/dist/config/license-plans.json +16 -1
  2. package/dist/engine/a2a/capability-card.d.ts +16 -0
  3. package/dist/engine/a2a/capability-card.d.ts.map +1 -0
  4. package/dist/engine/a2a/capability-card.js +69 -0
  5. package/dist/engine/a2a/capability-card.js.map +1 -0
  6. package/dist/engine/a2a/delegate.d.ts +15 -0
  7. package/dist/engine/a2a/delegate.d.ts.map +1 -0
  8. package/dist/engine/a2a/delegate.js +47 -0
  9. package/dist/engine/a2a/delegate.js.map +1 -0
  10. package/dist/engine/a2a/fallback.d.ts +12 -0
  11. package/dist/engine/a2a/fallback.d.ts.map +1 -0
  12. package/dist/engine/a2a/fallback.js +52 -0
  13. package/dist/engine/a2a/fallback.js.map +1 -0
  14. package/dist/engine/a2a/index.d.ts +5 -0
  15. package/dist/engine/a2a/index.d.ts.map +1 -0
  16. package/dist/engine/a2a/index.js +6 -0
  17. package/dist/engine/a2a/index.js.map +1 -0
  18. package/dist/engine/a2a/task-manager.d.ts +39 -0
  19. package/dist/engine/a2a/task-manager.d.ts.map +1 -0
  20. package/dist/engine/a2a/task-manager.js +84 -0
  21. package/dist/engine/a2a/task-manager.js.map +1 -0
  22. package/dist/engine/ac-gap-detector/analyze-gaps.d.ts +13 -0
  23. package/dist/engine/ac-gap-detector/analyze-gaps.d.ts.map +1 -0
  24. package/dist/engine/ac-gap-detector/analyze-gaps.js +43 -0
  25. package/dist/engine/ac-gap-detector/analyze-gaps.js.map +1 -0
  26. package/dist/engine/ac-gap-detector/constants.d.ts +22 -0
  27. package/dist/engine/ac-gap-detector/constants.d.ts.map +1 -0
  28. package/dist/engine/ac-gap-detector/constants.js +143 -0
  29. package/dist/engine/ac-gap-detector/constants.js.map +1 -0
  30. package/dist/engine/ac-gap-detector/gap-rules.d.ts +16 -0
  31. package/dist/engine/ac-gap-detector/gap-rules.d.ts.map +1 -0
  32. package/dist/engine/ac-gap-detector/gap-rules.js +180 -0
  33. package/dist/engine/ac-gap-detector/gap-rules.js.map +1 -0
  34. package/dist/engine/ac-gap-detector/pattern-matcher.d.ts +16 -0
  35. package/dist/engine/ac-gap-detector/pattern-matcher.d.ts.map +1 -0
  36. package/dist/engine/ac-gap-detector/pattern-matcher.js +62 -0
  37. package/dist/engine/ac-gap-detector/pattern-matcher.js.map +1 -0
  38. package/dist/engine/ac-gap-detector.d.ts +3 -0
  39. package/dist/engine/ac-gap-detector.d.ts.map +1 -0
  40. package/dist/engine/ac-gap-detector.js +5 -0
  41. package/dist/engine/ac-gap-detector.js.map +1 -0
  42. package/dist/engine/analyzer/analyze-project.js +1 -1
  43. package/dist/engine/analyzer/analyze-project.js.map +1 -1
  44. package/dist/engine/analyzer/completeness-checker.js +1 -1
  45. package/dist/engine/analyzer/completeness-checker.js.map +1 -1
  46. package/dist/engine/analyzer/detectors.js +2 -2
  47. package/dist/engine/analyzer/detectors.js.map +1 -1
  48. package/dist/engine/audit-trail/attestation.d.ts +11 -0
  49. package/dist/engine/audit-trail/attestation.d.ts.map +1 -0
  50. package/dist/engine/audit-trail/attestation.js +47 -0
  51. package/dist/engine/audit-trail/attestation.js.map +1 -0
  52. package/dist/engine/audit-trail/index.d.ts +6 -0
  53. package/dist/engine/audit-trail/index.d.ts.map +1 -0
  54. package/dist/engine/audit-trail/index.js +6 -0
  55. package/dist/engine/audit-trail/index.js.map +1 -0
  56. package/dist/engine/audit-trail/logger.d.ts +17 -0
  57. package/dist/engine/audit-trail/logger.d.ts.map +1 -0
  58. package/dist/engine/audit-trail/logger.js +78 -0
  59. package/dist/engine/audit-trail/logger.js.map +1 -0
  60. package/dist/engine/audit-trail/query.d.ts +7 -0
  61. package/dist/engine/audit-trail/query.d.ts.map +1 -0
  62. package/dist/engine/audit-trail/query.js +61 -0
  63. package/dist/engine/audit-trail/query.js.map +1 -0
  64. package/dist/engine/audit-trail/utils.d.ts +18 -0
  65. package/dist/engine/audit-trail/utils.d.ts.map +1 -0
  66. package/dist/engine/audit-trail/utils.js +44 -0
  67. package/dist/engine/audit-trail/utils.js.map +1 -0
  68. package/dist/engine/audit-trail/verifier.d.ts +10 -0
  69. package/dist/engine/audit-trail/verifier.d.ts.map +1 -0
  70. package/dist/engine/audit-trail/verifier.js +78 -0
  71. package/dist/engine/audit-trail/verifier.js.map +1 -0
  72. package/dist/engine/auth/config.d.ts +20 -0
  73. package/dist/engine/auth/config.d.ts.map +1 -0
  74. package/dist/engine/auth/config.js +49 -0
  75. package/dist/engine/auth/config.js.map +1 -0
  76. package/dist/engine/auth/index.d.ts +6 -0
  77. package/dist/engine/auth/index.d.ts.map +1 -0
  78. package/dist/engine/auth/index.js +7 -0
  79. package/dist/engine/auth/index.js.map +1 -0
  80. package/dist/engine/auth/middleware.d.ts +19 -0
  81. package/dist/engine/auth/middleware.d.ts.map +1 -0
  82. package/dist/engine/auth/middleware.js +64 -0
  83. package/dist/engine/auth/middleware.js.map +1 -0
  84. package/dist/engine/auth/pkce.d.ts +17 -0
  85. package/dist/engine/auth/pkce.d.ts.map +1 -0
  86. package/dist/engine/auth/pkce.js +33 -0
  87. package/dist/engine/auth/pkce.js.map +1 -0
  88. package/dist/engine/auth/scope-mapper.d.ts +21 -0
  89. package/dist/engine/auth/scope-mapper.d.ts.map +1 -0
  90. package/dist/engine/auth/scope-mapper.js +124 -0
  91. package/dist/engine/auth/scope-mapper.js.map +1 -0
  92. package/dist/engine/auth/token-validator.d.ts +15 -0
  93. package/dist/engine/auth/token-validator.d.ts.map +1 -0
  94. package/dist/engine/auth/token-validator.js +121 -0
  95. package/dist/engine/auth/token-validator.js.map +1 -0
  96. package/dist/engine/ci-generator/index.d.ts.map +1 -1
  97. package/dist/engine/ci-generator/index.js +8 -2
  98. package/dist/engine/ci-generator/index.js.map +1 -1
  99. package/dist/engine/ci-generator/yaml-builder.d.ts +7 -2
  100. package/dist/engine/ci-generator/yaml-builder.d.ts.map +1 -1
  101. package/dist/engine/ci-generator/yaml-builder.js +49 -1
  102. package/dist/engine/ci-generator/yaml-builder.js.map +1 -1
  103. package/dist/engine/code-transforms/typescript/ast-utils.js +1 -1
  104. package/dist/engine/code-transforms/typescript/ast-utils.js.map +1 -1
  105. package/dist/engine/design-to-spec/ac-generator.d.ts +21 -0
  106. package/dist/engine/design-to-spec/ac-generator.d.ts.map +1 -0
  107. package/dist/engine/design-to-spec/ac-generator.js +185 -0
  108. package/dist/engine/design-to-spec/ac-generator.js.map +1 -0
  109. package/dist/engine/design-to-spec/index.d.ts +11 -0
  110. package/dist/engine/design-to-spec/index.d.ts.map +1 -0
  111. package/dist/engine/design-to-spec/index.js +19 -0
  112. package/dist/engine/design-to-spec/index.js.map +1 -0
  113. package/dist/engine/design-to-spec/parser.d.ts +7 -0
  114. package/dist/engine/design-to-spec/parser.d.ts.map +1 -0
  115. package/dist/engine/design-to-spec/parser.js +290 -0
  116. package/dist/engine/design-to-spec/parser.js.map +1 -0
  117. package/dist/engine/design-to-spec/spec-builder.d.ts +12 -0
  118. package/dist/engine/design-to-spec/spec-builder.d.ts.map +1 -0
  119. package/dist/engine/design-to-spec/spec-builder.js +148 -0
  120. package/dist/engine/design-to-spec/spec-builder.js.map +1 -0
  121. package/dist/engine/design-to-spec/ui-contract-builder.d.ts +17 -0
  122. package/dist/engine/design-to-spec/ui-contract-builder.d.ts.map +1 -0
  123. package/dist/engine/design-to-spec/ui-contract-builder.js +175 -0
  124. package/dist/engine/design-to-spec/ui-contract-builder.js.map +1 -0
  125. package/dist/engine/detectors/css-framework-detector.js +9 -9
  126. package/dist/engine/detectors/css-framework-detector.js.map +1 -1
  127. package/dist/engine/detectors/mcp-server-detector.js +2 -2
  128. package/dist/engine/detectors/mcp-server-detector.js.map +1 -1
  129. package/dist/engine/docs-site-generator/markdown-renderer.js +1 -1
  130. package/dist/engine/docs-site-generator/markdown-renderer.js.map +1 -1
  131. package/dist/engine/elicitation/builder.d.ts +37 -0
  132. package/dist/engine/elicitation/builder.d.ts.map +1 -0
  133. package/dist/engine/elicitation/builder.js +115 -0
  134. package/dist/engine/elicitation/builder.js.map +1 -0
  135. package/dist/engine/elicitation/fallback.d.ts +20 -0
  136. package/dist/engine/elicitation/fallback.d.ts.map +1 -0
  137. package/dist/engine/elicitation/fallback.js +72 -0
  138. package/dist/engine/elicitation/fallback.js.map +1 -0
  139. package/dist/engine/elicitation/index.d.ts +4 -0
  140. package/dist/engine/elicitation/index.d.ts.map +1 -0
  141. package/dist/engine/elicitation/index.js +5 -0
  142. package/dist/engine/elicitation/index.js.map +1 -0
  143. package/dist/engine/elicitation/response-parser.d.ts +9 -0
  144. package/dist/engine/elicitation/response-parser.d.ts.map +1 -0
  145. package/dist/engine/elicitation/response-parser.js +163 -0
  146. package/dist/engine/elicitation/response-parser.js.map +1 -0
  147. package/dist/engine/federation/cross-repo-resolver.d.ts +21 -0
  148. package/dist/engine/federation/cross-repo-resolver.d.ts.map +1 -0
  149. package/dist/engine/federation/cross-repo-resolver.js +75 -0
  150. package/dist/engine/federation/cross-repo-resolver.js.map +1 -0
  151. package/dist/engine/federation/drift-checker.d.ts +19 -0
  152. package/dist/engine/federation/drift-checker.d.ts.map +1 -0
  153. package/dist/engine/federation/drift-checker.js +114 -0
  154. package/dist/engine/federation/drift-checker.js.map +1 -0
  155. package/dist/engine/federation/federation-store.d.ts +25 -0
  156. package/dist/engine/federation/federation-store.d.ts.map +1 -0
  157. package/dist/engine/federation/federation-store.js +58 -0
  158. package/dist/engine/federation/federation-store.js.map +1 -0
  159. package/dist/engine/federation/index.d.ts +4 -0
  160. package/dist/engine/federation/index.d.ts.map +1 -0
  161. package/dist/engine/federation/index.js +5 -0
  162. package/dist/engine/federation/index.js.map +1 -0
  163. package/dist/engine/github/spec-ac-analyzer.d.ts +40 -0
  164. package/dist/engine/github/spec-ac-analyzer.d.ts.map +1 -0
  165. package/dist/engine/github/spec-ac-analyzer.js +181 -0
  166. package/dist/engine/github/spec-ac-analyzer.js.map +1 -0
  167. package/dist/engine/hooks/handlers/on-impl-change.d.ts +3 -1
  168. package/dist/engine/hooks/handlers/on-impl-change.d.ts.map +1 -1
  169. package/dist/engine/hooks/handlers/on-impl-change.js +25 -1
  170. package/dist/engine/hooks/handlers/on-impl-change.js.map +1 -1
  171. package/dist/engine/infrastructure/component-mapper.d.ts +9 -0
  172. package/dist/engine/infrastructure/component-mapper.d.ts.map +1 -0
  173. package/dist/engine/infrastructure/component-mapper.js +162 -0
  174. package/dist/engine/infrastructure/component-mapper.js.map +1 -0
  175. package/dist/engine/infrastructure/cost-estimator.d.ts +6 -0
  176. package/dist/engine/infrastructure/cost-estimator.d.ts.map +1 -0
  177. package/dist/engine/infrastructure/cost-estimator.js +48 -0
  178. package/dist/engine/infrastructure/cost-estimator.js.map +1 -0
  179. package/dist/engine/infrastructure/docker-compose-generator.d.ts +6 -0
  180. package/dist/engine/infrastructure/docker-compose-generator.d.ts.map +1 -0
  181. package/dist/engine/infrastructure/docker-compose-generator.js +201 -0
  182. package/dist/engine/infrastructure/docker-compose-generator.js.map +1 -0
  183. package/dist/engine/infrastructure/index.d.ts +15 -0
  184. package/dist/engine/infrastructure/index.d.ts.map +1 -0
  185. package/dist/engine/infrastructure/index.js +67 -0
  186. package/dist/engine/infrastructure/index.js.map +1 -0
  187. package/dist/engine/infrastructure/kubernetes-generator.d.ts +6 -0
  188. package/dist/engine/infrastructure/kubernetes-generator.d.ts.map +1 -0
  189. package/dist/engine/infrastructure/kubernetes-generator.js +141 -0
  190. package/dist/engine/infrastructure/kubernetes-generator.js.map +1 -0
  191. package/dist/engine/infrastructure/railway-generator.d.ts +6 -0
  192. package/dist/engine/infrastructure/railway-generator.d.ts.map +1 -0
  193. package/dist/engine/infrastructure/railway-generator.js +87 -0
  194. package/dist/engine/infrastructure/railway-generator.js.map +1 -0
  195. package/dist/engine/infrastructure/signal-detector.d.ts +7 -0
  196. package/dist/engine/infrastructure/signal-detector.d.ts.map +1 -0
  197. package/dist/engine/infrastructure/signal-detector.js +174 -0
  198. package/dist/engine/infrastructure/signal-detector.js.map +1 -0
  199. package/dist/engine/infrastructure/terraform-generator.d.ts +6 -0
  200. package/dist/engine/infrastructure/terraform-generator.d.ts.map +1 -0
  201. package/dist/engine/infrastructure/terraform-generator.js +241 -0
  202. package/dist/engine/infrastructure/terraform-generator.js.map +1 -0
  203. package/dist/engine/legal-compliance/detector.js +1 -1
  204. package/dist/engine/legal-compliance/detector.js.map +1 -1
  205. package/dist/engine/living-spec/annotation-parser.d.ts.map +1 -1
  206. package/dist/engine/living-spec/annotation-parser.js.map +1 -1
  207. package/dist/engine/living-spec/auto-updater.d.ts +58 -0
  208. package/dist/engine/living-spec/auto-updater.d.ts.map +1 -0
  209. package/dist/engine/living-spec/auto-updater.js +311 -0
  210. package/dist/engine/living-spec/auto-updater.js.map +1 -0
  211. package/dist/engine/living-spec/bidirectional-sync.d.ts +10 -0
  212. package/dist/engine/living-spec/bidirectional-sync.d.ts.map +1 -1
  213. package/dist/engine/living-spec/bidirectional-sync.js +11 -3
  214. package/dist/engine/living-spec/bidirectional-sync.js.map +1 -1
  215. package/dist/engine/living-spec/conflict-resolver.d.ts +46 -0
  216. package/dist/engine/living-spec/conflict-resolver.d.ts.map +1 -0
  217. package/dist/engine/living-spec/conflict-resolver.js +301 -0
  218. package/dist/engine/living-spec/conflict-resolver.js.map +1 -0
  219. package/dist/engine/living-spec/hash-tracker.d.ts.map +1 -1
  220. package/dist/engine/living-spec/hash-tracker.js.map +1 -1
  221. package/dist/engine/living-spec/index.d.ts +1 -0
  222. package/dist/engine/living-spec/index.d.ts.map +1 -1
  223. package/dist/engine/living-spec/index.js +1 -0
  224. package/dist/engine/living-spec/index.js.map +1 -1
  225. package/dist/engine/living-spec/signature-tracker.d.ts.map +1 -1
  226. package/dist/engine/living-spec/signature-tracker.js.map +1 -1
  227. package/dist/engine/observability/config.d.ts +16 -0
  228. package/dist/engine/observability/config.d.ts.map +1 -0
  229. package/dist/engine/observability/config.js +44 -0
  230. package/dist/engine/observability/config.js.map +1 -0
  231. package/dist/engine/observability/index.d.ts +7 -0
  232. package/dist/engine/observability/index.d.ts.map +1 -0
  233. package/dist/engine/observability/index.js +8 -0
  234. package/dist/engine/observability/index.js.map +1 -0
  235. package/dist/engine/observability/metrics.d.ts +12 -0
  236. package/dist/engine/observability/metrics.d.ts.map +1 -0
  237. package/dist/engine/observability/metrics.js +61 -0
  238. package/dist/engine/observability/metrics.js.map +1 -0
  239. package/dist/engine/observability/noop-tracer.d.ts +13 -0
  240. package/dist/engine/observability/noop-tracer.d.ts.map +1 -0
  241. package/dist/engine/observability/noop-tracer.js +41 -0
  242. package/dist/engine/observability/noop-tracer.js.map +1 -0
  243. package/dist/engine/observability/otel-tracer.d.ts +19 -0
  244. package/dist/engine/observability/otel-tracer.d.ts.map +1 -0
  245. package/dist/engine/observability/otel-tracer.js +134 -0
  246. package/dist/engine/observability/otel-tracer.js.map +1 -0
  247. package/dist/engine/observability/span-helpers.d.ts +28 -0
  248. package/dist/engine/observability/span-helpers.d.ts.map +1 -0
  249. package/dist/engine/observability/span-helpers.js +68 -0
  250. package/dist/engine/observability/span-helpers.js.map +1 -0
  251. package/dist/engine/observability/tracer.d.ts +26 -0
  252. package/dist/engine/observability/tracer.d.ts.map +1 -0
  253. package/dist/engine/observability/tracer.js +45 -0
  254. package/dist/engine/observability/tracer.js.map +1 -0
  255. package/dist/engine/rbac/index.d.ts +3 -0
  256. package/dist/engine/rbac/index.d.ts.map +1 -0
  257. package/dist/engine/rbac/index.js +4 -0
  258. package/dist/engine/rbac/index.js.map +1 -0
  259. package/dist/engine/rbac/permission-checker.d.ts +21 -0
  260. package/dist/engine/rbac/permission-checker.d.ts.map +1 -0
  261. package/dist/engine/rbac/permission-checker.js +74 -0
  262. package/dist/engine/rbac/permission-checker.js.map +1 -0
  263. package/dist/engine/rbac/roles.d.ts +12 -0
  264. package/dist/engine/rbac/roles.d.ts.map +1 -0
  265. package/dist/engine/rbac/roles.js +37 -0
  266. package/dist/engine/rbac/roles.js.map +1 -0
  267. package/dist/engine/shared/ac-extractor.d.ts +9 -0
  268. package/dist/engine/shared/ac-extractor.d.ts.map +1 -0
  269. package/dist/engine/shared/ac-extractor.js +36 -0
  270. package/dist/engine/shared/ac-extractor.js.map +1 -0
  271. package/dist/engine/shared/line-diff.d.ts +11 -0
  272. package/dist/engine/shared/line-diff.d.ts.map +1 -0
  273. package/dist/engine/shared/line-diff.js +32 -0
  274. package/dist/engine/shared/line-diff.js.map +1 -0
  275. package/dist/engine/skill-generator/sections-platform.d.ts.map +1 -1
  276. package/dist/engine/skill-generator/sections-platform.js +13 -37
  277. package/dist/engine/skill-generator/sections-platform.js.map +1 -1
  278. package/dist/engine/skill-registry/agentskill-adapter.d.ts +1 -2
  279. package/dist/engine/skill-registry/agentskill-adapter.d.ts.map +1 -1
  280. package/dist/engine/skill-registry/agentskill-adapter.js +1 -2
  281. package/dist/engine/skill-registry/agentskill-adapter.js.map +1 -1
  282. package/dist/engine/source-resolver.d.ts +1 -1
  283. package/dist/engine/source-resolver.d.ts.map +1 -1
  284. package/dist/engine/source-resolver.js +3 -2
  285. package/dist/engine/source-resolver.js.map +1 -1
  286. package/dist/engine/spec-decomposer/analyzer.d.ts +18 -0
  287. package/dist/engine/spec-decomposer/analyzer.d.ts.map +1 -0
  288. package/dist/engine/spec-decomposer/analyzer.js +263 -0
  289. package/dist/engine/spec-decomposer/analyzer.js.map +1 -0
  290. package/dist/engine/spec-decomposer/file-mapper.d.ts +17 -0
  291. package/dist/engine/spec-decomposer/file-mapper.d.ts.map +1 -0
  292. package/dist/engine/spec-decomposer/file-mapper.js +96 -0
  293. package/dist/engine/spec-decomposer/file-mapper.js.map +1 -0
  294. package/dist/engine/spec-decomposer/index.d.ts +14 -0
  295. package/dist/engine/spec-decomposer/index.d.ts.map +1 -0
  296. package/dist/engine/spec-decomposer/index.js +50 -0
  297. package/dist/engine/spec-decomposer/index.js.map +1 -0
  298. package/dist/engine/spec-decomposer/ownership-resolver.d.ts +7 -0
  299. package/dist/engine/spec-decomposer/ownership-resolver.d.ts.map +1 -0
  300. package/dist/engine/spec-decomposer/ownership-resolver.js +169 -0
  301. package/dist/engine/spec-decomposer/ownership-resolver.js.map +1 -0
  302. package/dist/engine/spec-observability/index.d.ts +4 -0
  303. package/dist/engine/spec-observability/index.d.ts.map +1 -0
  304. package/dist/engine/spec-observability/index.js +4 -0
  305. package/dist/engine/spec-observability/index.js.map +1 -0
  306. package/dist/engine/spec-observability/metrics.d.ts +8 -0
  307. package/dist/engine/spec-observability/metrics.d.ts.map +1 -0
  308. package/dist/engine/spec-observability/metrics.js +116 -0
  309. package/dist/engine/spec-observability/metrics.js.map +1 -0
  310. package/dist/engine/spec-observability/tracker.d.ts +22 -0
  311. package/dist/engine/spec-observability/tracker.d.ts.map +1 -0
  312. package/dist/engine/spec-observability/tracker.js +77 -0
  313. package/dist/engine/spec-observability/tracker.js.map +1 -0
  314. package/dist/engine/spec-reader.d.ts +7 -0
  315. package/dist/engine/spec-reader.d.ts.map +1 -0
  316. package/dist/engine/spec-reader.js +23 -0
  317. package/dist/engine/spec-reader.js.map +1 -0
  318. package/dist/engine/spec-repair.d.ts +10 -0
  319. package/dist/engine/spec-repair.d.ts.map +1 -0
  320. package/dist/engine/spec-repair.js +388 -0
  321. package/dist/engine/spec-repair.js.map +1 -0
  322. package/dist/engine/spec-summary-html.js +2 -2
  323. package/dist/engine/spec-versioning/brancher.d.ts +17 -0
  324. package/dist/engine/spec-versioning/brancher.d.ts.map +1 -0
  325. package/dist/engine/spec-versioning/brancher.js +113 -0
  326. package/dist/engine/spec-versioning/brancher.js.map +1 -0
  327. package/dist/engine/spec-versioning/differ.d.ts +19 -0
  328. package/dist/engine/spec-versioning/differ.d.ts.map +1 -0
  329. package/dist/engine/spec-versioning/differ.js +151 -0
  330. package/dist/engine/spec-versioning/differ.js.map +1 -0
  331. package/dist/engine/spec-versioning/index.d.ts +5 -0
  332. package/dist/engine/spec-versioning/index.d.ts.map +1 -0
  333. package/dist/engine/spec-versioning/index.js +6 -0
  334. package/dist/engine/spec-versioning/index.js.map +1 -0
  335. package/dist/engine/spec-versioning/merger.d.ts +18 -0
  336. package/dist/engine/spec-versioning/merger.d.ts.map +1 -0
  337. package/dist/engine/spec-versioning/merger.js +113 -0
  338. package/dist/engine/spec-versioning/merger.js.map +1 -0
  339. package/dist/engine/spec-versioning/version-store.d.ts +18 -0
  340. package/dist/engine/spec-versioning/version-store.d.ts.map +1 -0
  341. package/dist/engine/spec-versioning/version-store.js +96 -0
  342. package/dist/engine/spec-versioning/version-store.js.map +1 -0
  343. package/dist/engine/web-fetcher/stack-advisor.d.ts.map +1 -1
  344. package/dist/engine/web-fetcher/stack-advisor.js +5 -6
  345. package/dist/engine/web-fetcher/stack-advisor.js.map +1 -1
  346. package/dist/engine/well-known/discovery.d.ts +7 -0
  347. package/dist/engine/well-known/discovery.d.ts.map +1 -0
  348. package/dist/engine/well-known/discovery.js +109 -0
  349. package/dist/engine/well-known/discovery.js.map +1 -0
  350. package/dist/engine/well-known/index.d.ts +6 -0
  351. package/dist/engine/well-known/index.d.ts.map +1 -0
  352. package/dist/engine/well-known/index.js +5 -0
  353. package/dist/engine/well-known/index.js.map +1 -0
  354. package/dist/engine/well-known/manifest-generator.d.ts +7 -0
  355. package/dist/engine/well-known/manifest-generator.d.ts.map +1 -0
  356. package/dist/engine/well-known/manifest-generator.js +60 -0
  357. package/dist/engine/well-known/manifest-generator.js.map +1 -0
  358. package/dist/engine/well-known/manifest-schema.d.ts +92 -0
  359. package/dist/engine/well-known/manifest-schema.d.ts.map +1 -0
  360. package/dist/engine/well-known/manifest-schema.js +70 -0
  361. package/dist/engine/well-known/manifest-schema.js.map +1 -0
  362. package/dist/resources/spec-granular.d.ts +33 -0
  363. package/dist/resources/spec-granular.d.ts.map +1 -0
  364. package/dist/resources/spec-granular.js +299 -0
  365. package/dist/resources/spec-granular.js.map +1 -0
  366. package/dist/storage/federation-store.d.ts +29 -0
  367. package/dist/storage/federation-store.d.ts.map +1 -0
  368. package/dist/storage/federation-store.js +111 -0
  369. package/dist/storage/federation-store.js.map +1 -0
  370. package/dist/storage/index.d.ts +3 -0
  371. package/dist/storage/index.d.ts.map +1 -1
  372. package/dist/storage/index.js +3 -0
  373. package/dist/storage/index.js.map +1 -1
  374. package/dist/storage/rbac-store.d.ts +8 -0
  375. package/dist/storage/rbac-store.d.ts.map +1 -0
  376. package/dist/storage/rbac-store.js +75 -0
  377. package/dist/storage/rbac-store.js.map +1 -0
  378. package/dist/storage/spec-observability-store.d.ts +16 -0
  379. package/dist/storage/spec-observability-store.d.ts.map +1 -0
  380. package/dist/storage/spec-observability-store.js +55 -0
  381. package/dist/storage/spec-observability-store.js.map +1 -0
  382. package/dist/tools/a2a-handler.d.ts +14 -0
  383. package/dist/tools/a2a-handler.d.ts.map +1 -0
  384. package/dist/tools/a2a-handler.js +100 -0
  385. package/dist/tools/a2a-handler.js.map +1 -0
  386. package/dist/tools/assign-role-handler.d.ts +3 -0
  387. package/dist/tools/assign-role-handler.d.ts.map +1 -0
  388. package/dist/tools/assign-role-handler.js +25 -0
  389. package/dist/tools/assign-role-handler.js.map +1 -0
  390. package/dist/tools/audit-trail-handler.d.ts +4 -0
  391. package/dist/tools/audit-trail-handler.d.ts.map +1 -0
  392. package/dist/tools/audit-trail-handler.js +91 -0
  393. package/dist/tools/audit-trail-handler.js.map +1 -0
  394. package/dist/tools/audit.js +2 -2
  395. package/dist/tools/audit.js.map +1 -1
  396. package/dist/tools/auto-update-spec.d.ts +3 -0
  397. package/dist/tools/auto-update-spec.d.ts.map +1 -0
  398. package/dist/tools/auto-update-spec.js +43 -0
  399. package/dist/tools/auto-update-spec.js.map +1 -0
  400. package/dist/tools/branch-spec.d.ts +3 -0
  401. package/dist/tools/branch-spec.d.ts.map +1 -0
  402. package/dist/tools/branch-spec.js +68 -0
  403. package/dist/tools/branch-spec.js.map +1 -0
  404. package/dist/tools/challenge-spec/platform-challenge-scenarios-b.js +1 -1
  405. package/dist/tools/challenge-spec/platform-challenge-scenarios-b.js.map +1 -1
  406. package/dist/tools/challenge-spec/platform-challenge-scenarios.js +1 -1
  407. package/dist/tools/challenge-spec/platform-challenge-scenarios.js.map +1 -1
  408. package/dist/tools/configure-auth-handler.d.ts +15 -0
  409. package/dist/tools/configure-auth-handler.d.ts.map +1 -0
  410. package/dist/tools/configure-auth-handler.js +113 -0
  411. package/dist/tools/configure-auth-handler.js.map +1 -0
  412. package/dist/tools/configure-observability.d.ts +14 -0
  413. package/dist/tools/configure-observability.d.ts.map +1 -0
  414. package/dist/tools/configure-observability.js +96 -0
  415. package/dist/tools/configure-observability.js.map +1 -0
  416. package/dist/tools/configure-roles-handler.d.ts +4 -0
  417. package/dist/tools/configure-roles-handler.d.ts.map +1 -0
  418. package/dist/tools/configure-roles-handler.js +36 -0
  419. package/dist/tools/configure-roles-handler.js.map +1 -0
  420. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.d.ts +7 -0
  421. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.d.ts.map +1 -0
  422. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.js +114 -0
  423. package/dist/tools/create-spec-hu/ac-adapters/architecture-adapter.js.map +1 -0
  424. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.d.ts +7 -0
  425. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.d.ts.map +1 -0
  426. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.js +48 -0
  427. package/dist/tools/create-spec-hu/ac-adapters/database-adapter.js.map +1 -0
  428. package/dist/tools/create-spec-hu/ac-adapters/index.d.ts +14 -0
  429. package/dist/tools/create-spec-hu/ac-adapters/index.d.ts.map +1 -0
  430. package/dist/tools/create-spec-hu/ac-adapters/index.js +28 -0
  431. package/dist/tools/create-spec-hu/ac-adapters/index.js.map +1 -0
  432. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.d.ts +7 -0
  433. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.d.ts.map +1 -0
  434. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.js +99 -0
  435. package/dist/tools/create-spec-hu/ac-adapters/stack-adapter.js.map +1 -0
  436. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.d.ts +7 -0
  437. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.d.ts.map +1 -0
  438. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.js +62 -0
  439. package/dist/tools/create-spec-hu/ac-adapters/testing-adapter.js.map +1 -0
  440. package/dist/tools/create-spec-hu/ai-testing-governance-adapter.js +4 -4
  441. package/dist/tools/create-spec-hu/ai-testing-governance-adapter.js.map +1 -1
  442. package/dist/tools/create-spec-hu/hu-body-generators.d.ts.map +1 -1
  443. package/dist/tools/create-spec-hu/hu-body-generators.js +41 -19
  444. package/dist/tools/create-spec-hu/hu-body-generators.js.map +1 -1
  445. package/dist/tools/create-spec-hu/llm-security-hu-adapter.js +1 -1
  446. package/dist/tools/create-spec-hu/llm-security-hu-adapter.js.map +1 -1
  447. package/dist/tools/create-spec-hu/quality-helpers.d.ts.map +1 -1
  448. package/dist/tools/create-spec-hu/quality-helpers.js +2 -3
  449. package/dist/tools/create-spec-hu/quality-helpers.js.map +1 -1
  450. package/dist/tools/create-spec-hu/swift-android-hu-adapter.js +1 -1
  451. package/dist/tools/create-spec-hu/swift-android-hu-adapter.js.map +1 -1
  452. package/dist/tools/create-spec-tech/ficha-content.d.ts.map +1 -1
  453. package/dist/tools/create-spec-tech/ficha-content.js +236 -6
  454. package/dist/tools/create-spec-tech/ficha-content.js.map +1 -1
  455. package/dist/tools/decompose-spec.d.ts +7 -0
  456. package/dist/tools/decompose-spec.d.ts.map +1 -0
  457. package/dist/tools/decompose-spec.js +49 -0
  458. package/dist/tools/decompose-spec.js.map +1 -0
  459. package/dist/tools/design-to-spec.d.ts +12 -0
  460. package/dist/tools/design-to-spec.d.ts.map +1 -0
  461. package/dist/tools/design-to-spec.js +73 -0
  462. package/dist/tools/design-to-spec.js.map +1 -0
  463. package/dist/tools/detect-ac-gaps.d.ts +7 -0
  464. package/dist/tools/detect-ac-gaps.d.ts.map +1 -0
  465. package/dist/tools/detect-ac-gaps.js +63 -0
  466. package/dist/tools/detect-ac-gaps.js.map +1 -0
  467. package/dist/tools/discover-registry.d.ts +8 -0
  468. package/dist/tools/discover-registry.d.ts.map +1 -0
  469. package/dist/tools/discover-registry.js +79 -0
  470. package/dist/tools/discover-registry.js.map +1 -0
  471. package/dist/tools/federate-specs.d.ts +6 -0
  472. package/dist/tools/federate-specs.d.ts.map +1 -0
  473. package/dist/tools/federate-specs.js +41 -0
  474. package/dist/tools/federate-specs.js.map +1 -0
  475. package/dist/tools/federation-status.d.ts +6 -0
  476. package/dist/tools/federation-status.d.ts.map +1 -0
  477. package/dist/tools/federation-status.js +56 -0
  478. package/dist/tools/federation-status.js.map +1 -0
  479. package/dist/tools/generate-annotations.d.ts.map +1 -1
  480. package/dist/tools/generate-annotations.js +3 -1
  481. package/dist/tools/generate-annotations.js.map +1 -1
  482. package/dist/tools/generate-docs/agent-docs-generator.js +1 -1
  483. package/dist/tools/generate-docs/agent-docs-generator.js.map +1 -1
  484. package/dist/tools/generate-infrastructure.d.ts +3 -0
  485. package/dist/tools/generate-infrastructure.d.ts.map +1 -0
  486. package/dist/tools/generate-infrastructure.js +60 -0
  487. package/dist/tools/generate-infrastructure.js.map +1 -0
  488. package/dist/tools/generate-tests/generators/advanced-testing-generator.d.ts.map +1 -1
  489. package/dist/tools/generate-tests/generators/advanced-testing-generator.js +5 -4
  490. package/dist/tools/generate-tests/generators/advanced-testing-generator.js.map +1 -1
  491. package/dist/tools/merge-spec-branch.d.ts +3 -0
  492. package/dist/tools/merge-spec-branch.d.ts.map +1 -0
  493. package/dist/tools/merge-spec-branch.js +103 -0
  494. package/dist/tools/merge-spec-branch.js.map +1 -0
  495. package/dist/tools/publish-registry.d.ts +8 -0
  496. package/dist/tools/publish-registry.d.ts.map +1 -0
  497. package/dist/tools/publish-registry.js +76 -0
  498. package/dist/tools/publish-registry.js.map +1 -0
  499. package/dist/tools/register-a2a-tools.d.ts +3 -0
  500. package/dist/tools/register-a2a-tools.d.ts.map +1 -0
  501. package/dist/tools/register-a2a-tools.js +66 -0
  502. package/dist/tools/register-a2a-tools.js.map +1 -0
  503. package/dist/tools/register-audit-trail-tools.d.ts +3 -0
  504. package/dist/tools/register-audit-trail-tools.d.ts.map +1 -0
  505. package/dist/tools/register-audit-trail-tools.js +62 -0
  506. package/dist/tools/register-audit-trail-tools.js.map +1 -0
  507. package/dist/tools/register-decompose-tools.d.ts +3 -0
  508. package/dist/tools/register-decompose-tools.d.ts.map +1 -0
  509. package/dist/tools/register-decompose-tools.js +31 -0
  510. package/dist/tools/register-decompose-tools.js.map +1 -0
  511. package/dist/tools/register-federation-tools.d.ts +6 -0
  512. package/dist/tools/register-federation-tools.d.ts.map +1 -0
  513. package/dist/tools/register-federation-tools.js +48 -0
  514. package/dist/tools/register-federation-tools.js.map +1 -0
  515. package/dist/tools/register-infrastructure-tools.d.ts +3 -0
  516. package/dist/tools/register-infrastructure-tools.d.ts.map +1 -0
  517. package/dist/tools/register-infrastructure-tools.js +34 -0
  518. package/dist/tools/register-infrastructure-tools.js.map +1 -0
  519. package/dist/tools/register-living-spec-tools.d.ts.map +1 -1
  520. package/dist/tools/register-living-spec-tools.js +2 -8
  521. package/dist/tools/register-living-spec-tools.js.map +1 -1
  522. package/dist/tools/register-observability-tools.d.ts +3 -0
  523. package/dist/tools/register-observability-tools.d.ts.map +1 -0
  524. package/dist/tools/register-observability-tools.js +48 -0
  525. package/dist/tools/register-observability-tools.js.map +1 -0
  526. package/dist/tools/register-rbac-tools.d.ts +3 -0
  527. package/dist/tools/register-rbac-tools.d.ts.map +1 -0
  528. package/dist/tools/register-rbac-tools.js +36 -0
  529. package/dist/tools/register-rbac-tools.js.map +1 -0
  530. package/dist/tools/register-spec-observability-tools.d.ts +3 -0
  531. package/dist/tools/register-spec-observability-tools.d.ts.map +1 -0
  532. package/dist/tools/register-spec-observability-tools.js +24 -0
  533. package/dist/tools/register-spec-observability-tools.js.map +1 -0
  534. package/dist/tools/register-versioning-tools.d.ts +3 -0
  535. package/dist/tools/register-versioning-tools.d.ts.map +1 -0
  536. package/dist/tools/register-versioning-tools.js +93 -0
  537. package/dist/tools/register-versioning-tools.js.map +1 -0
  538. package/dist/tools/register-well-known-tools.d.ts +3 -0
  539. package/dist/tools/register-well-known-tools.d.ts.map +1 -0
  540. package/dist/tools/register-well-known-tools.js +36 -0
  541. package/dist/tools/register-well-known-tools.js.map +1 -0
  542. package/dist/tools/repair-spec.d.ts +9 -0
  543. package/dist/tools/repair-spec.d.ts.map +1 -0
  544. package/dist/tools/repair-spec.js +93 -0
  545. package/dist/tools/repair-spec.js.map +1 -0
  546. package/dist/tools/resolve-spec-conflict.d.ts +7 -0
  547. package/dist/tools/resolve-spec-conflict.d.ts.map +1 -0
  548. package/dist/tools/resolve-spec-conflict.js +63 -0
  549. package/dist/tools/resolve-spec-conflict.js.map +1 -0
  550. package/dist/tools/response-helpers.d.ts +42 -0
  551. package/dist/tools/response-helpers.d.ts.map +1 -1
  552. package/dist/tools/response-helpers.js +29 -0
  553. package/dist/tools/response-helpers.js.map +1 -1
  554. package/dist/tools/schemas/auth-schema.d.ts +12 -0
  555. package/dist/tools/schemas/auth-schema.d.ts.map +1 -0
  556. package/dist/tools/schemas/auth-schema.js +38 -0
  557. package/dist/tools/schemas/auth-schema.js.map +1 -0
  558. package/dist/tools/schemas/rbac.d.ts +26 -0
  559. package/dist/tools/schemas/rbac.d.ts.map +1 -0
  560. package/dist/tools/schemas/rbac.js +25 -0
  561. package/dist/tools/schemas/rbac.js.map +1 -0
  562. package/dist/tools/schemas/well-known.d.ts +12 -0
  563. package/dist/tools/schemas/well-known.d.ts.map +1 -0
  564. package/dist/tools/schemas/well-known.js +31 -0
  565. package/dist/tools/schemas/well-known.js.map +1 -0
  566. package/dist/tools/snapshot-spec-hashes.d.ts.map +1 -1
  567. package/dist/tools/snapshot-spec-hashes.js.map +1 -1
  568. package/dist/tools/spec-usage-report.d.ts +3 -0
  569. package/dist/tools/spec-usage-report.d.ts.map +1 -0
  570. package/dist/tools/spec-usage-report.js +95 -0
  571. package/dist/tools/spec-usage-report.js.map +1 -0
  572. package/dist/tools/start-hooks.d.ts.map +1 -1
  573. package/dist/tools/start-hooks.js +93 -16
  574. package/dist/tools/start-hooks.js.map +1 -1
  575. package/dist/tools/suggest-tooling/advanced-testing-catalog.d.ts.map +1 -1
  576. package/dist/tools/suggest-tooling/advanced-testing-catalog.js +8 -5
  577. package/dist/tools/suggest-tooling/advanced-testing-catalog.js.map +1 -1
  578. package/dist/tools/tool-registry.d.ts.map +1 -1
  579. package/dist/tools/tool-registry.js +2 -0
  580. package/dist/tools/tool-registry.js.map +1 -1
  581. package/dist/tools/version-spec.d.ts +3 -0
  582. package/dist/tools/version-spec.d.ts.map +1 -0
  583. package/dist/tools/version-spec.js +54 -0
  584. package/dist/tools/version-spec.js.map +1 -0
  585. package/dist/types/a2a.d.ts +125 -0
  586. package/dist/types/a2a.d.ts.map +1 -0
  587. package/dist/types/a2a.js +3 -0
  588. package/dist/types/a2a.js.map +1 -0
  589. package/dist/types/ac-gap.d.ts +57 -0
  590. package/dist/types/ac-gap.d.ts.map +1 -0
  591. package/dist/types/ac-gap.js +3 -0
  592. package/dist/types/ac-gap.js.map +1 -0
  593. package/dist/types/audit-trail.d.ts +77 -0
  594. package/dist/types/audit-trail.d.ts.map +1 -0
  595. package/dist/types/audit-trail.js +3 -0
  596. package/dist/types/audit-trail.js.map +1 -0
  597. package/dist/types/auth.d.ts +82 -0
  598. package/dist/types/auth.d.ts.map +1 -0
  599. package/dist/types/auth.js +3 -0
  600. package/dist/types/auth.js.map +1 -0
  601. package/dist/types/ci.d.ts +10 -25
  602. package/dist/types/ci.d.ts.map +1 -1
  603. package/dist/types/design-to-spec.d.ts +89 -0
  604. package/dist/types/design-to-spec.d.ts.map +1 -0
  605. package/dist/types/design-to-spec.js +3 -0
  606. package/dist/types/design-to-spec.js.map +1 -0
  607. package/dist/types/elicitation.d.ts +109 -0
  608. package/dist/types/elicitation.d.ts.map +1 -0
  609. package/dist/types/elicitation.js +3 -0
  610. package/dist/types/elicitation.js.map +1 -0
  611. package/dist/types/federation.d.ts +95 -0
  612. package/dist/types/federation.d.ts.map +1 -0
  613. package/dist/types/federation.js +3 -0
  614. package/dist/types/federation.js.map +1 -0
  615. package/dist/types/file-hooks.d.ts +8 -6
  616. package/dist/types/file-hooks.d.ts.map +1 -1
  617. package/dist/types/github.d.ts +17 -0
  618. package/dist/types/github.d.ts.map +1 -1
  619. package/dist/types/index.d.ts +16 -0
  620. package/dist/types/index.d.ts.map +1 -1
  621. package/dist/types/index.js +16 -0
  622. package/dist/types/index.js.map +1 -1
  623. package/dist/types/infrastructure.d.ts +71 -0
  624. package/dist/types/infrastructure.d.ts.map +1 -0
  625. package/dist/types/infrastructure.js +3 -0
  626. package/dist/types/infrastructure.js.map +1 -0
  627. package/dist/types/living-spec.d.ts +100 -0
  628. package/dist/types/living-spec.d.ts.map +1 -1
  629. package/dist/types/observability.d.ts +105 -0
  630. package/dist/types/observability.d.ts.map +1 -0
  631. package/dist/types/observability.js +3 -0
  632. package/dist/types/observability.js.map +1 -0
  633. package/dist/types/rbac.d.ts +51 -0
  634. package/dist/types/rbac.d.ts.map +1 -0
  635. package/dist/types/rbac.js +4 -0
  636. package/dist/types/rbac.js.map +1 -0
  637. package/dist/types/resources.d.ts +20 -0
  638. package/dist/types/resources.d.ts.map +1 -0
  639. package/dist/types/resources.js +3 -0
  640. package/dist/types/resources.js.map +1 -0
  641. package/dist/types/safe-schemas.js +1 -1
  642. package/dist/types/safe-schemas.js.map +1 -1
  643. package/dist/types/spec/repair.d.ts +33 -0
  644. package/dist/types/spec/repair.d.ts.map +1 -0
  645. package/dist/types/spec/repair.js +3 -0
  646. package/dist/types/spec/repair.js.map +1 -0
  647. package/dist/types/spec-decomposer.d.ts +108 -0
  648. package/dist/types/spec-decomposer.d.ts.map +1 -0
  649. package/dist/types/spec-decomposer.js +4 -0
  650. package/dist/types/spec-decomposer.js.map +1 -0
  651. package/dist/types/spec-observability.d.ts +71 -0
  652. package/dist/types/spec-observability.d.ts.map +1 -0
  653. package/dist/types/spec-observability.js +4 -0
  654. package/dist/types/spec-observability.js.map +1 -0
  655. package/dist/types/spec-versioning.d.ts +117 -0
  656. package/dist/types/spec-versioning.d.ts.map +1 -0
  657. package/dist/types/spec-versioning.js +3 -0
  658. package/dist/types/spec-versioning.js.map +1 -0
  659. package/dist/types/well-known.d.ts +70 -0
  660. package/dist/types/well-known.d.ts.map +1 -0
  661. package/dist/types/well-known.js +3 -0
  662. package/dist/types/well-known.js.map +1 -0
  663. package/package.json +1 -1
  664. package/src/config/license-plans.json +16 -1
@@ -0,0 +1,47 @@
1
+ // engine/audit-trail/attestation.ts — Generate attestation document for a spec (SPEC-167)
2
+ // Produces structured JSON (no runtime PDF deps required).
3
+ import { randomUUID } from 'node:crypto';
4
+ import { queryAuditLog } from './query.js';
5
+ import { verifyChainIntegrity } from './verifier.js';
6
+ /**
7
+ * Build an event-type frequency map from an array of events.
8
+ */
9
+ function buildEventTypeSummary(events) {
10
+ const counts = {};
11
+ for (const ev of events) {
12
+ counts[ev.eventType] = (counts[ev.eventType] ?? 0) + 1;
13
+ }
14
+ return counts;
15
+ }
16
+ /**
17
+ * Generate an attestation document for all events of a given spec.
18
+ * Verifies chain integrity and embeds the result in the attestation.
19
+ *
20
+ * @param filePath Absolute path to the project's audit-log.jsonl.
21
+ * @param projectId Project identifier.
22
+ * @param specId Spec identifier to filter events for.
23
+ */
24
+ export async function generateAttestation(filePath, projectId, specId) {
25
+ const [queryResult, chainResult] = await Promise.all([
26
+ queryAuditLog(filePath, { projectId, specId, limit: 1000 }),
27
+ verifyChainIntegrity(filePath),
28
+ ]);
29
+ const events = queryResult.events;
30
+ const timestamps = events.map((e) => e.timestamp).sort();
31
+ const summary = {
32
+ totalEvents: events.length,
33
+ firstEvent: timestamps[0],
34
+ lastEvent: timestamps[timestamps.length - 1],
35
+ eventTypes: buildEventTypeSummary(events),
36
+ };
37
+ return {
38
+ attestationId: randomUUID(),
39
+ generatedAt: new Date().toISOString(),
40
+ projectId,
41
+ specId,
42
+ events,
43
+ chainValid: chainResult.valid,
44
+ summary,
45
+ };
46
+ }
47
+ //# sourceMappingURL=attestation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attestation.js","sourceRoot":"","sources":["../../../src/engine/audit-trail/attestation.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,2DAA2D;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAAoB;IACjD,MAAM,MAAM,GAA4C,EAAE,CAAC;IAC3D,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAgB,EAChB,SAAiB,EACjB,MAAc;IAEd,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACnD,aAAa,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC3D,oBAAoB,CAAC,QAAQ,CAAC;KAC/B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAClC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAEzD,MAAM,OAAO,GAAG;QACd,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;QACzB,SAAS,EAAE,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5C,UAAU,EAAE,qBAAqB,CAAC,MAAM,CAAC;KAC1C,CAAC;IAEF,OAAO;QACL,aAAa,EAAE,UAAU,EAAE;QAC3B,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,SAAS;QACT,MAAM;QACN,MAAM;QACN,UAAU,EAAE,WAAW,CAAC,KAAK;QAC7B,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { appendEvent } from './logger.js';
2
+ export type { AppendEventInput } from './logger.js';
3
+ export { queryAuditLog } from './query.js';
4
+ export { verifyChainIntegrity } from './verifier.js';
5
+ export { generateAttestation } from './attestation.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/audit-trail/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,6 @@
1
+ // engine/audit-trail/index.ts — Barrel export for audit-trail engine module (SPEC-167)
2
+ export { appendEvent } from './logger.js';
3
+ export { queryAuditLog } from './query.js';
4
+ export { verifyChainIntegrity } from './verifier.js';
5
+ export { generateAttestation } from './attestation.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/audit-trail/index.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { AuditEvent, AppendEventInput } from '../../types/audit-trail.js';
2
+ export type { AppendEventInput };
3
+ /**
4
+ * Compute SHA-256 hex digest of a string.
5
+ */
6
+ export declare function sha256(input: string): string;
7
+ /**
8
+ * Append a new audit event to the JSONL log at filePath.
9
+ * Each event's hash is derived from the previous entry's hash, forming a chain.
10
+ * The file is created (with parent dirs) if it does not exist.
11
+ *
12
+ * Writes are serialized per file via a promise queue to prevent race conditions
13
+ * that would break the hash chain when multiple events are appended concurrently.
14
+ */
15
+ export declare function appendEvent(filePath: string, input: AppendEventInput): Promise<AuditEvent>;
16
+ export { canonicalJson } from './utils.js';
17
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/engine/audit-trail/logger.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE/E,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AA0DD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAgB1F;AAID,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,78 @@
1
+ // engine/audit-trail/logger.ts — Append-only audit logger with SHA-256 hash chain (SPEC-167)
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { appendFile, mkdir } from 'node:fs/promises';
4
+ import { dirname } from 'node:path';
5
+ import { canonicalJson, readJsonlLines } from './utils.js';
6
+ /**
7
+ * Compute SHA-256 hex digest of a string.
8
+ */
9
+ export function sha256(input) {
10
+ return createHash('sha256').update(input, 'utf8').digest('hex');
11
+ }
12
+ /**
13
+ * Read the hash of the last line in a JSONL file.
14
+ * Returns empty string if the file is empty or does not exist.
15
+ */
16
+ async function readLastHash(filePath) {
17
+ const lines = await readJsonlLines(filePath);
18
+ if (lines.length === 0) {
19
+ return '';
20
+ }
21
+ const lastLine = lines[lines.length - 1] ?? '';
22
+ try {
23
+ const parsed = JSON.parse(lastLine);
24
+ return typeof parsed.hash === 'string' ? parsed.hash : '';
25
+ }
26
+ catch {
27
+ return '';
28
+ }
29
+ }
30
+ /**
31
+ * Per-file write queues to prevent race conditions on the hash chain.
32
+ * Node.js is single-threaded but async I/O allows two concurrent `appendEvent`
33
+ * calls to both read the same `lastHash` before either writes, breaking the
34
+ * chain integrity. Chaining each write onto a resolved promise serializes
35
+ * all writes to the same file without blocking the event loop.
36
+ */
37
+ const writeQueues = new Map();
38
+ /**
39
+ * Perform the actual append operation (must run serially per file).
40
+ */
41
+ async function doAppend(filePath, input) {
42
+ await mkdir(dirname(filePath), { recursive: true });
43
+ const previousHash = await readLastHash(filePath);
44
+ const partial = {
45
+ id: randomUUID(),
46
+ timestamp: new Date().toISOString(),
47
+ eventType: input.eventType,
48
+ specId: input.specId,
49
+ userId: input.userId,
50
+ action: input.action,
51
+ details: input.details ?? {},
52
+ previousHash,
53
+ };
54
+ const hash = sha256(canonicalJson(partial));
55
+ const event = { ...partial, hash };
56
+ await appendFile(filePath, JSON.stringify(event) + '\n', 'utf-8');
57
+ return event;
58
+ }
59
+ /**
60
+ * Append a new audit event to the JSONL log at filePath.
61
+ * Each event's hash is derived from the previous entry's hash, forming a chain.
62
+ * The file is created (with parent dirs) if it does not exist.
63
+ *
64
+ * Writes are serialized per file via a promise queue to prevent race conditions
65
+ * that would break the hash chain when multiple events are appended concurrently.
66
+ */
67
+ export function appendEvent(filePath, input) {
68
+ let result;
69
+ const next = (writeQueues.get(filePath) ?? Promise.resolve()).then(async () => {
70
+ result = await doAppend(filePath, input);
71
+ });
72
+ writeQueues.set(filePath, next.then(() => undefined, () => undefined));
73
+ return next.then(() => result);
74
+ }
75
+ // Re-export canonicalJson so consumers that need the hash logic (e.g., verifier)
76
+ // can import it from the module barrel without reaching into utils directly.
77
+ export { canonicalJson } from './utils.js';
78
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/engine/audit-trail/logger.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG3D;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,KAAa;IAClC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAwB,CAAC;QAC3D,OAAO,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;AAErD;;GAEG;AACH,KAAK,UAAU,QAAQ,CAAC,QAAgB,EAAE,KAAuB;IAC/D,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAElD,MAAM,OAAO,GAA6B;QACxC,EAAE,EAAE,UAAU,EAAE;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE;QAC5B,YAAY;KACb,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAE5C,MAAM,KAAK,GAAe,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;IAE/C,MAAM,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAElE,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,KAAuB;IACnE,IAAI,MAAmB,CAAC;IAExB,MAAM,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QAC5E,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,WAAW,CAAC,GAAG,CACb,QAAQ,EACR,IAAI,CAAC,IAAI,CACP,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CACF,CAAC;IAEF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,iFAAiF;AACjF,6EAA6E;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { AuditQuery, AuditQueryResult } from '../../types/audit-trail.js';
2
+ /**
3
+ * Query the audit log JSONL file at filePath using the provided filters.
4
+ * Returns matching events up to the configured limit, in ascending timestamp order.
5
+ */
6
+ export declare function queryAuditLog(filePath: string, query: AuditQuery): Promise<AuditQueryResult>;
7
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/engine/audit-trail/query.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,UAAU,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAqC3F;;;GAGG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,gBAAgB,CAAC,CAsB3B"}
@@ -0,0 +1,61 @@
1
+ // engine/audit-trail/query.ts — Query the audit JSONL log with filters (SPEC-167)
2
+ import { isNodeError, readJsonlLines } from './utils.js';
3
+ const DEFAULT_LIMIT = 100;
4
+ const MAX_LIMIT = 1000;
5
+ /** Parse all valid AuditEvent lines from an array of raw JSONL strings. */
6
+ function parseLines(lines) {
7
+ return lines.flatMap((line) => {
8
+ try {
9
+ return [JSON.parse(line)];
10
+ }
11
+ catch {
12
+ return [];
13
+ }
14
+ });
15
+ }
16
+ /** Apply query filters to an event. Returns true if the event matches all criteria. */
17
+ function matchesFilter(event, query) {
18
+ if (query.specId !== undefined && event.specId !== query.specId) {
19
+ return false;
20
+ }
21
+ if (query.userId !== undefined && event.userId !== query.userId) {
22
+ return false;
23
+ }
24
+ if (query.eventType !== undefined && event.eventType !== query.eventType) {
25
+ return false;
26
+ }
27
+ if (query.from !== undefined && event.timestamp < query.from) {
28
+ return false;
29
+ }
30
+ if (query.to !== undefined && event.timestamp > query.to) {
31
+ return false;
32
+ }
33
+ return true;
34
+ }
35
+ /**
36
+ * Query the audit log JSONL file at filePath using the provided filters.
37
+ * Returns matching events up to the configured limit, in ascending timestamp order.
38
+ */
39
+ export async function queryAuditLog(filePath, query) {
40
+ let lines;
41
+ try {
42
+ lines = await readJsonlLines(filePath);
43
+ }
44
+ catch (err) {
45
+ if (isNodeError(err) && err.code === 'ENOENT') {
46
+ return { events: [], total: 0, truncated: false };
47
+ }
48
+ throw err;
49
+ }
50
+ const all = parseLines(lines);
51
+ const filtered = all.filter((ev) => matchesFilter(ev, query));
52
+ const limit = Math.min(query.limit ?? DEFAULT_LIMIT, MAX_LIMIT);
53
+ const truncated = filtered.length > limit;
54
+ const events = truncated ? filtered.slice(0, limit) : filtered;
55
+ return {
56
+ events,
57
+ total: filtered.length,
58
+ truncated,
59
+ };
60
+ }
61
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/engine/audit-trail/query.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAGlF,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,aAAa,GAAG,GAAG,CAAC;AAC1B,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,2EAA2E;AAC3E,SAAS,UAAU,CAAC,KAAe;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAe,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,uFAAuF;AACvF,SAAS,aAAa,CAAC,KAAiB,EAAE,KAAiB;IACzD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;QACzE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,KAAiB;IAEjB,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACpD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,aAAa,EAAE,SAAS,CAAC,CAAC;IAChE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE/D,OAAO;QACL,MAAM;QACN,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,SAAS;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { AuditEvent } from '../../types/audit-trail.js';
2
+ /**
3
+ * Type guard for Node.js filesystem errors (ErrnoException).
4
+ */
5
+ export declare function isNodeError(err: unknown): err is NodeJS.ErrnoException;
6
+ /**
7
+ * Compute the canonical JSON string used for hashing an AuditEvent.
8
+ * Excludes the `hash` field itself to avoid circular dependency.
9
+ * CRITICAL: must stay in sync with how events are written in logger.ts.
10
+ * If this function diverges from the write path, chain verification breaks silently.
11
+ */
12
+ export declare function canonicalJson(event: Omit<AuditEvent, 'hash'>): string;
13
+ /**
14
+ * Read a JSONL file and return all non-empty lines.
15
+ * Returns an empty array when the file does not exist (ENOENT).
16
+ */
17
+ export declare function readJsonlLines(filePath: string): Promise<string[]>;
18
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/engine/audit-trail/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,cAAc,CAEtE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,MAAM,CAWrE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWxE"}
@@ -0,0 +1,44 @@
1
+ // engine/audit-trail/utils.ts — Shared low-level utilities for the audit-trail module
2
+ import { readFile } from 'node:fs/promises';
3
+ /**
4
+ * Type guard for Node.js filesystem errors (ErrnoException).
5
+ */
6
+ export function isNodeError(err) {
7
+ return err instanceof Error && 'code' in err;
8
+ }
9
+ /**
10
+ * Compute the canonical JSON string used for hashing an AuditEvent.
11
+ * Excludes the `hash` field itself to avoid circular dependency.
12
+ * CRITICAL: must stay in sync with how events are written in logger.ts.
13
+ * If this function diverges from the write path, chain verification breaks silently.
14
+ */
15
+ export function canonicalJson(event) {
16
+ return JSON.stringify({
17
+ id: event.id,
18
+ timestamp: event.timestamp,
19
+ eventType: event.eventType,
20
+ specId: event.specId,
21
+ userId: event.userId,
22
+ action: event.action,
23
+ details: event.details,
24
+ previousHash: event.previousHash,
25
+ });
26
+ }
27
+ /**
28
+ * Read a JSONL file and return all non-empty lines.
29
+ * Returns an empty array when the file does not exist (ENOENT).
30
+ */
31
+ export async function readJsonlLines(filePath) {
32
+ let raw;
33
+ try {
34
+ raw = await readFile(filePath, 'utf-8');
35
+ }
36
+ catch (err) {
37
+ if (isNodeError(err) && err.code === 'ENOENT') {
38
+ return [];
39
+ }
40
+ throw err;
41
+ }
42
+ return raw.split('\n').filter((l) => l.trim().length > 0);
43
+ }
44
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/engine/audit-trail/utils.ts"],"names":[],"mappings":"AAAA,sFAAsF;AAEtF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,OAAO,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAA+B;IAC3D,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ChainVerificationResult } from '../../types/audit-trail.js';
2
+ /**
3
+ * Verify that the SHA-256 hash chain of the JSONL log file at filePath is intact.
4
+ * Validates:
5
+ * 1. Each entry's `hash` matches the recomputed hash of its canonical JSON.
6
+ * 2. Each entry's `previousHash` matches the previous entry's `hash`.
7
+ * 3. The first entry has an empty `previousHash`.
8
+ */
9
+ export declare function verifyChainIntegrity(filePath: string): Promise<ChainVerificationResult>;
10
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../../src/engine/audit-trail/verifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAStF;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAmE7F"}
@@ -0,0 +1,78 @@
1
+ // engine/audit-trail/verifier.ts — Validate SHA-256 hash chain integrity (SPEC-167)
2
+ import { sha256 } from './logger.js';
3
+ import { isNodeError, canonicalJson, readJsonlLines } from './utils.js';
4
+ /** Recompute the canonical hash for an event using the shared canonicalJson helper. */
5
+ function recomputeHash(event) {
6
+ return sha256(canonicalJson(event));
7
+ }
8
+ /**
9
+ * Verify that the SHA-256 hash chain of the JSONL log file at filePath is intact.
10
+ * Validates:
11
+ * 1. Each entry's `hash` matches the recomputed hash of its canonical JSON.
12
+ * 2. Each entry's `previousHash` matches the previous entry's `hash`.
13
+ * 3. The first entry has an empty `previousHash`.
14
+ */
15
+ export async function verifyChainIntegrity(filePath) {
16
+ let lines;
17
+ try {
18
+ lines = await readJsonlLines(filePath);
19
+ }
20
+ catch (err) {
21
+ if (isNodeError(err) && err.code === 'ENOENT') {
22
+ return {
23
+ valid: true,
24
+ totalEntries: 0,
25
+ message: 'Audit log is empty — chain is valid.',
26
+ };
27
+ }
28
+ throw err;
29
+ }
30
+ if (lines.length === 0) {
31
+ return {
32
+ valid: true,
33
+ totalEntries: 0,
34
+ message: 'Audit log is empty — chain is valid.',
35
+ };
36
+ }
37
+ let previousHash = '';
38
+ for (let i = 0; i < lines.length; i++) {
39
+ let event;
40
+ try {
41
+ event = JSON.parse(lines[i] ?? '');
42
+ }
43
+ catch {
44
+ return {
45
+ valid: false,
46
+ totalEntries: lines.length,
47
+ firstBrokenAt: i + 1,
48
+ message: `Line ${String(i + 1)} is not valid JSON.`,
49
+ };
50
+ }
51
+ // Verify previousHash linkage
52
+ if (event.previousHash !== previousHash) {
53
+ return {
54
+ valid: false,
55
+ totalEntries: lines.length,
56
+ firstBrokenAt: i + 1,
57
+ message: `Chain broken at entry ${String(i + 1)}: previousHash mismatch.`,
58
+ };
59
+ }
60
+ // Verify self-hash
61
+ const expected = recomputeHash(event);
62
+ if (event.hash !== expected) {
63
+ return {
64
+ valid: false,
65
+ totalEntries: lines.length,
66
+ firstBrokenAt: i + 1,
67
+ message: `Entry ${String(i + 1)} hash mismatch — possible tampering detected.`,
68
+ };
69
+ }
70
+ previousHash = event.hash;
71
+ }
72
+ return {
73
+ valid: true,
74
+ totalEntries: lines.length,
75
+ message: `Chain verified — ${String(lines.length)} entries are intact.`,
76
+ };
77
+ }
78
+ //# sourceMappingURL=verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../src/engine/audit-trail/verifier.ts"],"names":[],"mappings":"AAAA,oFAAoF;AAGpF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAExE,uFAAuF;AACvF,SAAS,aAAa,CAAC,KAAiB;IACtC,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,CAAC;gBACf,OAAO,EAAE,sCAAsC;aAChD,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,KAAK,EAAE,IAAI;YACX,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,sCAAsC;SAChD,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,GAAG,EAAE,CAAC;IAEtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAiB,CAAC;QACtB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAe,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,YAAY,EAAE,KAAK,CAAC,MAAM;gBAC1B,aAAa,EAAE,CAAC,GAAG,CAAC;gBACpB,OAAO,EAAE,QAAQ,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,qBAAqB;aACpD,CAAC;QACJ,CAAC;QAED,8BAA8B;QAC9B,IAAI,KAAK,CAAC,YAAY,KAAK,YAAY,EAAE,CAAC;YACxC,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,YAAY,EAAE,KAAK,CAAC,MAAM;gBAC1B,aAAa,EAAE,CAAC,GAAG,CAAC;gBACpB,OAAO,EAAE,yBAAyB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,0BAA0B;aAC1E,CAAC;QACJ,CAAC;QAED,mBAAmB;QACnB,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,YAAY,EAAE,KAAK,CAAC,MAAM;gBAC1B,aAAa,EAAE,CAAC,GAAG,CAAC;gBACpB,OAAO,EAAE,SAAS,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,+CAA+C;aAC/E,CAAC;QACJ,CAAC;QAED,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,KAAK,CAAC,MAAM;QAC1B,OAAO,EAAE,oBAAoB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB;KACxE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { AuthConfig } from '../../types/index.js';
2
+ /**
3
+ * Load auth config from disk. Returns null when no config has been set yet.
4
+ * Config is cached in memory after the first load.
5
+ */
6
+ export declare function loadAuthConfig(): Promise<AuthConfig | null>;
7
+ /**
8
+ * Save auth config to disk and update the in-memory cache.
9
+ * Ensures the data/global directory exists before writing.
10
+ */
11
+ export declare function saveAuthConfig(config: AuthConfig): Promise<void>;
12
+ /**
13
+ * Check whether auth has been configured (config file exists and is valid).
14
+ */
15
+ export declare function isAuthConfigured(): Promise<boolean>;
16
+ /**
17
+ * Reset the in-memory cache. Used in tests and after config deletion.
18
+ */
19
+ export declare function resetAuthConfigCache(): void;
20
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/engine/auth/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAOvD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAajE;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAKtE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAGzD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
@@ -0,0 +1,49 @@
1
+ // engine/auth/config.ts — AuthConfig loading and saving (SPEC-161)
2
+ // Persists to data/global/auth-config.json. Never persists tokens.
3
+ import { readFile, writeFile, mkdir } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ const CONFIG_DIR = join(process.cwd(), 'data', 'global');
6
+ const CONFIG_PATH = join(CONFIG_DIR, 'auth-config.json');
7
+ let cached = null;
8
+ /**
9
+ * Load auth config from disk. Returns null when no config has been set yet.
10
+ * Config is cached in memory after the first load.
11
+ */
12
+ export async function loadAuthConfig() {
13
+ if (cached !== null) {
14
+ return cached;
15
+ }
16
+ try {
17
+ const raw = await readFile(CONFIG_PATH, 'utf-8');
18
+ cached = JSON.parse(raw);
19
+ return cached;
20
+ }
21
+ catch {
22
+ // File does not exist or is unreadable — no config set yet.
23
+ return null;
24
+ }
25
+ }
26
+ /**
27
+ * Save auth config to disk and update the in-memory cache.
28
+ * Ensures the data/global directory exists before writing.
29
+ */
30
+ export async function saveAuthConfig(config) {
31
+ await mkdir(CONFIG_DIR, { recursive: true });
32
+ const serialized = JSON.stringify(config, null, 2);
33
+ await writeFile(CONFIG_PATH, serialized, 'utf-8');
34
+ cached = config;
35
+ }
36
+ /**
37
+ * Check whether auth has been configured (config file exists and is valid).
38
+ */
39
+ export async function isAuthConfigured() {
40
+ const config = await loadAuthConfig();
41
+ return config !== null;
42
+ }
43
+ /**
44
+ * Reset the in-memory cache. Used in tests and after config deletion.
45
+ */
46
+ export function resetAuthConfigCache() {
47
+ cached = null;
48
+ }
49
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/engine/auth/config.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,mEAAmE;AAEnE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACzD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AAEzD,IAAI,MAAM,GAAsB,IAAI,CAAC;AAErC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;QACvC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAkB;IACrD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,SAAS,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,GAAG,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IACtC,OAAO,MAAM,KAAK,IAAI,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { loadAuthConfig, saveAuthConfig, isAuthConfigured, resetAuthConfigCache, } from './config.js';
2
+ export { generateCodeVerifier, deriveCodeChallenge, generatePkceChallenge } from './pkce.js';
3
+ export { resolveAllowedTools, isToolAllowed, BUILTIN_SCOPE_MAPPINGS } from './scope-mapper.js';
4
+ export { extractBearerToken, validateToken } from './token-validator.js';
5
+ export { evaluateAuthContext, authorizeToolCall } from './middleware.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/auth/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ // engine/auth/index.ts — Barrel export for the auth engine module (SPEC-161)
2
+ export { loadAuthConfig, saveAuthConfig, isAuthConfigured, resetAuthConfigCache, } from './config.js';
3
+ export { generateCodeVerifier, deriveCodeChallenge, generatePkceChallenge } from './pkce.js';
4
+ export { resolveAllowedTools, isToolAllowed, BUILTIN_SCOPE_MAPPINGS } from './scope-mapper.js';
5
+ export { extractBearerToken, validateToken } from './token-validator.js';
6
+ export { evaluateAuthContext, authorizeToolCall } from './middleware.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/auth/index.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,EACL,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { AuthContext } from '../../types/index.js';
2
+ /**
3
+ * Evaluate an incoming Authorization header against the current auth config.
4
+ *
5
+ * Behavior:
6
+ * - No auth config → returns disabled context (all tools allowed, no enforcement).
7
+ * - Auth config present but no token → returns invalid context.
8
+ * - Auth config present and token provided → validates and maps scopes to tools.
9
+ *
10
+ * This function is async because it loads config from disk on first call
11
+ * (cached thereafter) and may call the introspection endpoint.
12
+ */
13
+ export declare function evaluateAuthContext(authorizationHeader: string | undefined): Promise<AuthContext>;
14
+ /**
15
+ * Check whether the caller is authorized to invoke a specific tool.
16
+ * When auth is disabled (stdio mode), all tools are accessible.
17
+ */
18
+ export declare function authorizeToolCall(toolName: string, context: AuthContext): boolean;
19
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/engine/auth/middleware.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,sBAAsB,CAAC;AAWpE;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,OAAO,CAAC,WAAW,CAAC,CAyBtB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAQjF"}
@@ -0,0 +1,64 @@
1
+ // engine/auth/middleware.ts — Auth middleware for hosted MCP requests (SPEC-161)
2
+ // Is a no-op when auth is not configured (local stdio mode).
3
+ // Never logs token values.
4
+ import { loadAuthConfig } from './config.js';
5
+ import { validateToken, extractBearerToken } from './token-validator.js';
6
+ import { resolveAllowedTools } from './scope-mapper.js';
7
+ /** Unauthenticated context returned when auth is disabled (stdio mode). */
8
+ const DISABLED_CONTEXT = {
9
+ enabled: false,
10
+ allowedTools: [],
11
+ };
12
+ /**
13
+ * Evaluate an incoming Authorization header against the current auth config.
14
+ *
15
+ * Behavior:
16
+ * - No auth config → returns disabled context (all tools allowed, no enforcement).
17
+ * - Auth config present but no token → returns invalid context.
18
+ * - Auth config present and token provided → validates and maps scopes to tools.
19
+ *
20
+ * This function is async because it loads config from disk on first call
21
+ * (cached thereafter) and may call the introspection endpoint.
22
+ */
23
+ export async function evaluateAuthContext(authorizationHeader) {
24
+ const config = await loadAuthConfig();
25
+ if (config === null) {
26
+ return DISABLED_CONTEXT;
27
+ }
28
+ const token = extractBearerToken(authorizationHeader);
29
+ if (!token) {
30
+ return buildInvalidContext(config, 'Missing or malformed Authorization: Bearer <token> header');
31
+ }
32
+ const validation = await validateToken(token, config);
33
+ if (!validation.valid) {
34
+ return buildInvalidContext(config, validation.reason ?? 'Token validation failed');
35
+ }
36
+ const allowedTools = resolveAllowedTools(validation.scopes, config.scopeMappings);
37
+ return {
38
+ enabled: true,
39
+ validation,
40
+ allowedTools,
41
+ };
42
+ }
43
+ /**
44
+ * Check whether the caller is authorized to invoke a specific tool.
45
+ * When auth is disabled (stdio mode), all tools are accessible.
46
+ */
47
+ export function authorizeToolCall(toolName, context) {
48
+ if (!context.enabled) {
49
+ return true;
50
+ }
51
+ if (!context.validation?.valid) {
52
+ return false;
53
+ }
54
+ return context.allowedTools.includes(toolName);
55
+ }
56
+ function buildInvalidContext(config, reason) {
57
+ void config; // Config is loaded but only used to mark auth as enabled
58
+ return {
59
+ enabled: true,
60
+ validation: { valid: false, scopes: [], reason },
61
+ allowedTools: [],
62
+ };
63
+ }
64
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/engine/auth/middleware.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,6DAA6D;AAC7D,2BAA2B;AAG3B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,2EAA2E;AAC3E,MAAM,gBAAgB,GAAgB;IACpC,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,EAAE;CACjB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,mBAAuC;IAEvC,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IAEtC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,mBAAmB,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,mBAAmB,CAAC,MAAM,EAAE,2DAA2D,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAEtD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,yBAAyB,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAElF,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU;QACV,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,OAAoB;IACtE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAkB,EAAE,MAAc;IAC7D,KAAK,MAAM,CAAC,CAAC,yDAAyD;IACtE,OAAO;QACL,OAAO,EAAE,IAAI;QACb,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE;QAChD,YAAY,EAAE,EAAE;KACjB,CAAC;AACJ,CAAC"}