@cyanautomation/kaseki-agent 1.4.1

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 (459) hide show
  1. package/.dockerignore +54 -0
  2. package/.eslintignore +11 -0
  3. package/.eslintrc.json +95 -0
  4. package/.github/ISSUE_TEMPLATE/bug_report.md +53 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +53 -0
  6. package/.github/ISSUE_TEMPLATE/security.md +51 -0
  7. package/.github/PULL_REQUEST_TEMPLATE/default.md +71 -0
  8. package/.github/dependabot.yml +38 -0
  9. package/.github/skills/dependency-cache-optimization/SKILL.md +526 -0
  10. package/.github/skills/docker-image-management/SKILL.md +532 -0
  11. package/.github/skills/frontend-design/SKILL.md +782 -0
  12. package/.github/skills/prompt-engineering/SKILL.md +360 -0
  13. package/.github/skills/quality-gate-config/SKILL.md +591 -0
  14. package/.github/skills/result-report-analysis/SKILL.md +576 -0
  15. package/.github/skills/test-automation/SKILL.md +593 -0
  16. package/.github/skills/workflow-diagnosis/SKILL.md +468 -0
  17. package/.github/workflows/build-docker-image.yml +453 -0
  18. package/.github/workflows/release.yml +68 -0
  19. package/.releaserc.json +135 -0
  20. package/CHANGELOG.md +117 -0
  21. package/CLAUDE.md +336 -0
  22. package/CONTRIBUTING.md +339 -0
  23. package/Dockerfile +217 -0
  24. package/README.md +1527 -0
  25. package/STYLE.md +521 -0
  26. package/add-js-extensions.d.ts +9 -0
  27. package/add-js-extensions.d.ts.map +1 -0
  28. package/add-js-extensions.js.map +1 -0
  29. package/dist/add-js-extensions.d.ts +9 -0
  30. package/dist/add-js-extensions.d.ts.map +1 -0
  31. package/dist/add-js-extensions.js +52 -0
  32. package/dist/add-js-extensions.js.map +1 -0
  33. package/dist/ansi-colors.d.ts +26 -0
  34. package/dist/ansi-colors.d.ts.map +1 -0
  35. package/dist/ansi-colors.js +51 -0
  36. package/dist/ansi-colors.js.map +1 -0
  37. package/dist/cli/BaseCommand.d.ts +18 -0
  38. package/dist/cli/BaseCommand.d.ts.map +1 -0
  39. package/dist/cli/BaseCommand.js +31 -0
  40. package/dist/cli/BaseCommand.js.map +1 -0
  41. package/dist/cli/KasekiCLI.d.ts +30 -0
  42. package/dist/cli/KasekiCLI.d.ts.map +1 -0
  43. package/dist/cli/KasekiCLI.js +134 -0
  44. package/dist/cli/KasekiCLI.js.map +1 -0
  45. package/dist/cli/commands/ConfigCommand.d.ts +13 -0
  46. package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
  47. package/dist/cli/commands/ConfigCommand.js +131 -0
  48. package/dist/cli/commands/ConfigCommand.js.map +1 -0
  49. package/dist/cli/commands/DoctorCommand.d.ts +45 -0
  50. package/dist/cli/commands/DoctorCommand.d.ts.map +1 -0
  51. package/dist/cli/commands/DoctorCommand.js +309 -0
  52. package/dist/cli/commands/DoctorCommand.js.map +1 -0
  53. package/dist/cli/commands/ListCommand.d.ts +9 -0
  54. package/dist/cli/commands/ListCommand.d.ts.map +1 -0
  55. package/dist/cli/commands/ListCommand.js +81 -0
  56. package/dist/cli/commands/ListCommand.js.map +1 -0
  57. package/dist/cli/commands/ReportCommand.d.ts +9 -0
  58. package/dist/cli/commands/ReportCommand.d.ts.map +1 -0
  59. package/dist/cli/commands/ReportCommand.js +98 -0
  60. package/dist/cli/commands/ReportCommand.js.map +1 -0
  61. package/dist/cli/commands/RunCommand.d.ts +13 -0
  62. package/dist/cli/commands/RunCommand.d.ts.map +1 -0
  63. package/dist/cli/commands/RunCommand.js +191 -0
  64. package/dist/cli/commands/RunCommand.js.map +1 -0
  65. package/dist/cli/commands/SecretsCommand.d.ts +9 -0
  66. package/dist/cli/commands/SecretsCommand.d.ts.map +1 -0
  67. package/dist/cli/commands/SecretsCommand.js +109 -0
  68. package/dist/cli/commands/SecretsCommand.js.map +1 -0
  69. package/dist/cli/commands/ServeCommand.d.ts +9 -0
  70. package/dist/cli/commands/ServeCommand.d.ts.map +1 -0
  71. package/dist/cli/commands/ServeCommand.js +50 -0
  72. package/dist/cli/commands/ServeCommand.js.map +1 -0
  73. package/dist/cli/commands/SetupCommand.d.ts +42 -0
  74. package/dist/cli/commands/SetupCommand.d.ts.map +1 -0
  75. package/dist/cli/commands/SetupCommand.js +249 -0
  76. package/dist/cli/commands/SetupCommand.js.map +1 -0
  77. package/dist/cli.d.ts +9 -0
  78. package/dist/cli.d.ts.map +1 -0
  79. package/dist/cli.js +130 -0
  80. package/dist/cli.js.map +1 -0
  81. package/dist/config/ConfigManager.d.ts +395 -0
  82. package/dist/config/ConfigManager.d.ts.map +1 -0
  83. package/dist/config/ConfigManager.js +446 -0
  84. package/dist/config/ConfigManager.js.map +1 -0
  85. package/dist/docker/DockerManager.d.ts +69 -0
  86. package/dist/docker/DockerManager.d.ts.map +1 -0
  87. package/dist/docker/DockerManager.js +266 -0
  88. package/dist/docker/DockerManager.js.map +1 -0
  89. package/dist/event-aggregator.d.ts +71 -0
  90. package/dist/event-aggregator.d.ts.map +1 -0
  91. package/dist/event-aggregator.js +95 -0
  92. package/dist/event-aggregator.js.map +1 -0
  93. package/dist/github-app-token.d.ts +16 -0
  94. package/dist/github-app-token.d.ts.map +1 -0
  95. package/dist/github-app-token.js +148 -0
  96. package/dist/github-app-token.js.map +1 -0
  97. package/dist/idempotency-store.d.ts +61 -0
  98. package/dist/idempotency-store.d.ts.map +1 -0
  99. package/dist/idempotency-store.js +321 -0
  100. package/dist/idempotency-store.js.map +1 -0
  101. package/dist/index.d.ts +25 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +31 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/instance/InstanceManager.d.ts +81 -0
  106. package/dist/instance/InstanceManager.d.ts.map +1 -0
  107. package/dist/instance/InstanceManager.js +220 -0
  108. package/dist/instance/InstanceManager.js.map +1 -0
  109. package/dist/instance-metadata-reader.d.ts +48 -0
  110. package/dist/instance-metadata-reader.d.ts.map +1 -0
  111. package/dist/instance-metadata-reader.js +94 -0
  112. package/dist/instance-metadata-reader.js.map +1 -0
  113. package/dist/instance-state-derivation.d.ts +42 -0
  114. package/dist/instance-state-derivation.d.ts.map +1 -0
  115. package/dist/instance-state-derivation.js +133 -0
  116. package/dist/instance-state-derivation.js.map +1 -0
  117. package/dist/job-scheduler.d.ts +124 -0
  118. package/dist/job-scheduler.d.ts.map +1 -0
  119. package/dist/job-scheduler.js +992 -0
  120. package/dist/job-scheduler.js.map +1 -0
  121. package/dist/kaseki-api-client.d.ts +89 -0
  122. package/dist/kaseki-api-client.d.ts.map +1 -0
  123. package/dist/kaseki-api-client.js +405 -0
  124. package/dist/kaseki-api-client.js.map +1 -0
  125. package/dist/kaseki-api-config.d.ts +34 -0
  126. package/dist/kaseki-api-config.d.ts.map +1 -0
  127. package/dist/kaseki-api-config.js +113 -0
  128. package/dist/kaseki-api-config.js.map +1 -0
  129. package/dist/kaseki-api-routes.d.ts +13 -0
  130. package/dist/kaseki-api-routes.d.ts.map +1 -0
  131. package/dist/kaseki-api-routes.js +559 -0
  132. package/dist/kaseki-api-routes.js.map +1 -0
  133. package/dist/kaseki-api-service-wrapper.d.ts +43 -0
  134. package/dist/kaseki-api-service-wrapper.d.ts.map +1 -0
  135. package/dist/kaseki-api-service-wrapper.js +150 -0
  136. package/dist/kaseki-api-service-wrapper.js.map +1 -0
  137. package/dist/kaseki-api-service.d.ts +16 -0
  138. package/dist/kaseki-api-service.d.ts.map +1 -0
  139. package/dist/kaseki-api-service.js +143 -0
  140. package/dist/kaseki-api-service.js.map +1 -0
  141. package/dist/kaseki-api-types.d.ts +440 -0
  142. package/dist/kaseki-api-types.d.ts.map +1 -0
  143. package/dist/kaseki-api-types.js +64 -0
  144. package/dist/kaseki-api-types.js.map +1 -0
  145. package/dist/kaseki-cli-lib.d.ts +219 -0
  146. package/dist/kaseki-cli-lib.d.ts.map +1 -0
  147. package/dist/kaseki-cli-lib.js +523 -0
  148. package/dist/kaseki-cli-lib.js.map +1 -0
  149. package/dist/kaseki-cli.d.ts +38 -0
  150. package/dist/kaseki-cli.d.ts.map +1 -0
  151. package/dist/kaseki-cli.js +559 -0
  152. package/dist/kaseki-cli.js.map +1 -0
  153. package/dist/kaseki-report.d.ts +3 -0
  154. package/dist/kaseki-report.d.ts.map +1 -0
  155. package/dist/kaseki-report.js +140 -0
  156. package/dist/kaseki-report.js.map +1 -0
  157. package/dist/lib/subprocess-helpers.d.ts +98 -0
  158. package/dist/lib/subprocess-helpers.d.ts.map +1 -0
  159. package/dist/lib/subprocess-helpers.js +136 -0
  160. package/dist/lib/subprocess-helpers.js.map +1 -0
  161. package/dist/logger.d.ts +39 -0
  162. package/dist/logger.d.ts.map +1 -0
  163. package/dist/logger.js +79 -0
  164. package/dist/logger.js.map +1 -0
  165. package/dist/metrics.d.ts +19 -0
  166. package/dist/metrics.d.ts.map +1 -0
  167. package/dist/metrics.js +59 -0
  168. package/dist/metrics.js.map +1 -0
  169. package/dist/middleware/job-lookup.d.ts +27 -0
  170. package/dist/middleware/job-lookup.d.ts.map +1 -0
  171. package/dist/middleware/job-lookup.js +28 -0
  172. package/dist/middleware/job-lookup.js.map +1 -0
  173. package/dist/pi-event-filter.d.ts +3 -0
  174. package/dist/pi-event-filter.d.ts.map +1 -0
  175. package/dist/pi-event-filter.js +126 -0
  176. package/dist/pi-event-filter.js.map +1 -0
  177. package/dist/pi-progress-stream.d.ts +3 -0
  178. package/dist/pi-progress-stream.d.ts.map +1 -0
  179. package/dist/pi-progress-stream.js +205 -0
  180. package/dist/pi-progress-stream.js.map +1 -0
  181. package/dist/pi-progress-summarizer.d.ts +61 -0
  182. package/dist/pi-progress-summarizer.d.ts.map +1 -0
  183. package/dist/pi-progress-summarizer.js +246 -0
  184. package/dist/pi-progress-summarizer.js.map +1 -0
  185. package/dist/pre-flight-validator.d.ts +72 -0
  186. package/dist/pre-flight-validator.d.ts.map +1 -0
  187. package/dist/pre-flight-validator.js +513 -0
  188. package/dist/pre-flight-validator.js.map +1 -0
  189. package/dist/progress-stream-utils.d.ts +3 -0
  190. package/dist/progress-stream-utils.d.ts.map +1 -0
  191. package/dist/progress-stream-utils.js +15 -0
  192. package/dist/progress-stream-utils.js.map +1 -0
  193. package/dist/result-cache.d.ts +52 -0
  194. package/dist/result-cache.d.ts.map +1 -0
  195. package/dist/result-cache.js +134 -0
  196. package/dist/result-cache.js.map +1 -0
  197. package/dist/routes/artifact-routes.d.ts +10 -0
  198. package/dist/routes/artifact-routes.d.ts.map +1 -0
  199. package/dist/routes/artifact-routes.js +126 -0
  200. package/dist/routes/artifact-routes.js.map +1 -0
  201. package/dist/routes/log-routes.d.ts +8 -0
  202. package/dist/routes/log-routes.d.ts.map +1 -0
  203. package/dist/routes/log-routes.js +345 -0
  204. package/dist/routes/log-routes.js.map +1 -0
  205. package/dist/routes/status-routes.d.ts +8 -0
  206. package/dist/routes/status-routes.d.ts.map +1 -0
  207. package/dist/routes/status-routes.js +82 -0
  208. package/dist/routes/status-routes.js.map +1 -0
  209. package/dist/routes/webhook-routes.d.ts +6 -0
  210. package/dist/routes/webhook-routes.d.ts.map +1 -0
  211. package/dist/routes/webhook-routes.js +86 -0
  212. package/dist/routes/webhook-routes.js.map +1 -0
  213. package/dist/run-artifact-metadata-cache.d.ts +42 -0
  214. package/dist/run-artifact-metadata-cache.d.ts.map +1 -0
  215. package/dist/run-artifact-metadata-cache.js +139 -0
  216. package/dist/run-artifact-metadata-cache.js.map +1 -0
  217. package/dist/secret-value-cache.d.ts +13 -0
  218. package/dist/secret-value-cache.d.ts.map +1 -0
  219. package/dist/secret-value-cache.js +44 -0
  220. package/dist/secret-value-cache.js.map +1 -0
  221. package/dist/secrets/SecretsManager.d.ts +80 -0
  222. package/dist/secrets/SecretsManager.d.ts.map +1 -0
  223. package/dist/secrets/SecretsManager.js +306 -0
  224. package/dist/secrets/SecretsManager.js.map +1 -0
  225. package/dist/test-utils.d.ts +55 -0
  226. package/dist/test-utils.d.ts.map +1 -0
  227. package/dist/test-utils.js +48 -0
  228. package/dist/test-utils.js.map +1 -0
  229. package/dist/timestamp-tracker.d.ts +75 -0
  230. package/dist/timestamp-tracker.d.ts.map +1 -0
  231. package/dist/timestamp-tracker.js +121 -0
  232. package/dist/timestamp-tracker.js.map +1 -0
  233. package/dist/utils/failure-artifact-writer.d.ts +29 -0
  234. package/dist/utils/failure-artifact-writer.d.ts.map +1 -0
  235. package/dist/utils/failure-artifact-writer.js +157 -0
  236. package/dist/utils/failure-artifact-writer.js.map +1 -0
  237. package/dist/utils/file-helpers.d.ts +41 -0
  238. package/dist/utils/file-helpers.d.ts.map +1 -0
  239. package/dist/utils/file-helpers.js +143 -0
  240. package/dist/utils/file-helpers.js.map +1 -0
  241. package/dist/utils/http-client-factory.d.ts +46 -0
  242. package/dist/utils/http-client-factory.d.ts.map +1 -0
  243. package/dist/utils/http-client-factory.js +114 -0
  244. package/dist/utils/http-client-factory.js.map +1 -0
  245. package/dist/utils/progress-normalizer.d.ts +13 -0
  246. package/dist/utils/progress-normalizer.d.ts.map +1 -0
  247. package/dist/utils/progress-normalizer.js +57 -0
  248. package/dist/utils/progress-normalizer.js.map +1 -0
  249. package/dist/utils/response-helpers.d.ts +34 -0
  250. package/dist/utils/response-helpers.d.ts.map +1 -0
  251. package/dist/utils/response-helpers.js +78 -0
  252. package/dist/utils/response-helpers.js.map +1 -0
  253. package/dist/utils/route-helpers.d.ts +17 -0
  254. package/dist/utils/route-helpers.d.ts.map +1 -0
  255. package/dist/utils/route-helpers.js +22 -0
  256. package/dist/utils/route-helpers.js.map +1 -0
  257. package/dist/utils/status-response-builder.d.ts +23 -0
  258. package/dist/utils/status-response-builder.d.ts.map +1 -0
  259. package/dist/utils/status-response-builder.js +144 -0
  260. package/dist/utils/status-response-builder.js.map +1 -0
  261. package/dist/utils/type-guards.d.ts +37 -0
  262. package/dist/utils/type-guards.d.ts.map +1 -0
  263. package/dist/utils/type-guards.js +45 -0
  264. package/dist/utils/type-guards.js.map +1 -0
  265. package/dist/utils/utf8-helpers.d.ts +32 -0
  266. package/dist/utils/utf8-helpers.d.ts.map +1 -0
  267. package/dist/utils/utf8-helpers.js +97 -0
  268. package/dist/utils/utf8-helpers.js.map +1 -0
  269. package/dist/utils/webhook-event-builder.d.ts +26 -0
  270. package/dist/utils/webhook-event-builder.d.ts.map +1 -0
  271. package/dist/utils/webhook-event-builder.js +77 -0
  272. package/dist/utils/webhook-event-builder.js.map +1 -0
  273. package/dist/webhook-manager.d.ts +56 -0
  274. package/dist/webhook-manager.d.ts.map +1 -0
  275. package/dist/webhook-manager.js +359 -0
  276. package/dist/webhook-manager.js.map +1 -0
  277. package/docker/workspace-cache/package-lock.json +13 -0
  278. package/docker/workspace-cache/package.json +7 -0
  279. package/docker-compose.yml +53 -0
  280. package/docs/API.md +708 -0
  281. package/docs/BACKLOG.md +19 -0
  282. package/docs/BUILD_STRATEGY.md +404 -0
  283. package/docs/CLI.md +569 -0
  284. package/docs/DEPLOYMENT.md +521 -0
  285. package/docs/DEVELOPMENT.md +459 -0
  286. package/docs/DOCKER_SETUP.md +522 -0
  287. package/docs/ENHANCED_PROGRESS_LOGS.md +264 -0
  288. package/docs/IMPLEMENTATION_SUMMARY.md +549 -0
  289. package/docs/INTEGRATION_EXAMPLE.md +217 -0
  290. package/docs/NPM_SETUP.md +468 -0
  291. package/docs/PHASE1-4_IMPLEMENTATION.md +302 -0
  292. package/docs/PHASE1_COMPLETION.md +192 -0
  293. package/docs/PHASE2_COMPLETION.md +134 -0
  294. package/docs/PHASE6_MIGRATION.md +392 -0
  295. package/docs/PRINTF_SAFETY_FIX.md +282 -0
  296. package/docs/QUALITY_GATES.md +369 -0
  297. package/docs/SETUP_GUIDE.md +482 -0
  298. package/docs/TASK_PROMPT_TEMPLATES.md +533 -0
  299. package/docs/VALIDATION_FIX.md +139 -0
  300. package/docs/VERIFICATION_CHECKLIST.md +335 -0
  301. package/docs/repo-maturity.md +760 -0
  302. package/fix-tests.d.ts +9 -0
  303. package/fix-tests.d.ts.map +1 -0
  304. package/fix-tests.js.map +1 -0
  305. package/fix-tests.ts +53 -0
  306. package/jest.config.ts +31 -0
  307. package/kaseki +183 -0
  308. package/kaseki-agent.sh +1961 -0
  309. package/ops/logrotate/kaseki +10 -0
  310. package/package.json +83 -0
  311. package/perf/README.md +54 -0
  312. package/perf/pi-event-filter.benchmark.test.ts +98 -0
  313. package/run-kaseki-json.test.sh +106 -0
  314. package/run-kaseki.sh +990 -0
  315. package/scripts/allowlist-helper.sh +56 -0
  316. package/scripts/cleanup-kaseki.sh +168 -0
  317. package/scripts/deploy-pi-template.sh +293 -0
  318. package/scripts/docker-entrypoint.sh +71 -0
  319. package/scripts/dry-run-allowlist.sh +161 -0
  320. package/scripts/kaseki-activate.sh +396 -0
  321. package/scripts/kaseki-api.service +62 -0
  322. package/scripts/kaseki-container-entrypoint-wrapper.sh +119 -0
  323. package/scripts/kaseki-container-setup-remote.sh +172 -0
  324. package/scripts/kaseki-container-setup.sh +193 -0
  325. package/scripts/kaseki-healthcheck.sh +95 -0
  326. package/scripts/kaseki-install.sh +50 -0
  327. package/scripts/kaseki-maturity-score.sh +291 -0
  328. package/scripts/kaseki-performance-metrics.sh +122 -0
  329. package/scripts/kaseki-preflight.sh +270 -0
  330. package/scripts/kaseki-setup.sh +265 -0
  331. package/scripts/pi-setup-remote.sh +213 -0
  332. package/scripts/setup-github-labels.sh +42 -0
  333. package/scripts/suggest-allowlist.sh +68 -0
  334. package/scripts/templates/MULTI_HOST_DISTRIBUTED.md +337 -0
  335. package/scripts/templates/REST_API_SERVICE.md +490 -0
  336. package/scripts/templates/SINGLE_HOST_CLI.md +194 -0
  337. package/scripts/test-github-app.sh +248 -0
  338. package/src/add-js-extensions.ts +61 -0
  339. package/src/ansi-colors.test.ts +62 -0
  340. package/src/ansi-colors.ts +67 -0
  341. package/src/cli/BaseCommand.ts +40 -0
  342. package/src/cli/KasekiCLI.ts +154 -0
  343. package/src/cli/commands/ConfigCommand.ts +145 -0
  344. package/src/cli/commands/DoctorCommand.ts +329 -0
  345. package/src/cli/commands/ListCommand.ts +105 -0
  346. package/src/cli/commands/ReportCommand.ts +110 -0
  347. package/src/cli/commands/RunCommand.ts +218 -0
  348. package/src/cli/commands/SecretsCommand.ts +120 -0
  349. package/src/cli/commands/ServeCommand.ts +62 -0
  350. package/src/cli/commands/SetupCommand.ts +301 -0
  351. package/src/cli.ts +138 -0
  352. package/src/config/ConfigManager.ts +476 -0
  353. package/src/docker/DockerManager.ts +319 -0
  354. package/src/docker-entrypoint-packaging.test.ts +33 -0
  355. package/src/event-aggregator.test.ts +117 -0
  356. package/src/event-aggregator.ts +126 -0
  357. package/src/github-app-token.ts +215 -0
  358. package/src/idempotency-store.test.ts +117 -0
  359. package/src/idempotency-store.ts +385 -0
  360. package/src/index.ts +89 -0
  361. package/src/instance/InstanceManager.ts +285 -0
  362. package/src/instance-metadata-reader.test.ts +190 -0
  363. package/src/instance-metadata-reader.ts +129 -0
  364. package/src/instance-state-derivation.test.ts +263 -0
  365. package/src/instance-state-derivation.ts +148 -0
  366. package/src/job-scheduler.test.ts +1236 -0
  367. package/src/job-scheduler.ts +1117 -0
  368. package/src/kaseki-api-client.ts +488 -0
  369. package/src/kaseki-api-config.test.ts +315 -0
  370. package/src/kaseki-api-config.ts +175 -0
  371. package/src/kaseki-api-routes.test.ts +1615 -0
  372. package/src/kaseki-api-routes.ts +643 -0
  373. package/src/kaseki-api-service-wrapper.ts +188 -0
  374. package/src/kaseki-api-service.test.ts +418 -0
  375. package/src/kaseki-api-service.ts +192 -0
  376. package/src/kaseki-api-types.ts +320 -0
  377. package/src/kaseki-cli-lib.test.ts +552 -0
  378. package/src/kaseki-cli-lib.ts +760 -0
  379. package/src/kaseki-cli.ts +682 -0
  380. package/src/kaseki-report.test.ts +118 -0
  381. package/src/kaseki-report.ts +192 -0
  382. package/src/lib/subprocess-helpers.ts +177 -0
  383. package/src/logger.ts +114 -0
  384. package/src/metrics.ts +66 -0
  385. package/src/middleware/job-lookup.test.ts +113 -0
  386. package/src/middleware/job-lookup.ts +45 -0
  387. package/src/pi-event-filter.test.ts +183 -0
  388. package/src/pi-event-filter.ts +183 -0
  389. package/src/pi-progress-stream.ts +287 -0
  390. package/src/pi-progress-summarizer.test.ts +302 -0
  391. package/src/pi-progress-summarizer.ts +287 -0
  392. package/src/pre-flight-validator.test.ts +512 -0
  393. package/src/pre-flight-validator.ts +618 -0
  394. package/src/progress-stream-utils.test.ts +35 -0
  395. package/src/progress-stream-utils.ts +14 -0
  396. package/src/result-cache.test.ts +195 -0
  397. package/src/result-cache.ts +181 -0
  398. package/src/routes/artifact-routes.ts +169 -0
  399. package/src/routes/log-routes.ts +391 -0
  400. package/src/routes/status-routes.ts +92 -0
  401. package/src/routes/webhook-routes.ts +97 -0
  402. package/src/run-artifact-metadata-cache.test.ts +80 -0
  403. package/src/run-artifact-metadata-cache.ts +184 -0
  404. package/src/secret-value-cache.test.ts +66 -0
  405. package/src/secret-value-cache.ts +55 -0
  406. package/src/secrets/SecretsManager.ts +343 -0
  407. package/src/test-utils.ts +81 -0
  408. package/src/timestamp-tracker.test.ts +134 -0
  409. package/src/timestamp-tracker.ts +132 -0
  410. package/src/utils/failure-artifact-writer.ts +187 -0
  411. package/src/utils/file-helpers.test.ts +235 -0
  412. package/src/utils/file-helpers.ts +150 -0
  413. package/src/utils/http-client-factory.test.ts +245 -0
  414. package/src/utils/http-client-factory.ts +157 -0
  415. package/src/utils/progress-normalizer.test.ts +442 -0
  416. package/src/utils/progress-normalizer.ts +68 -0
  417. package/src/utils/response-helpers.test.ts +122 -0
  418. package/src/utils/response-helpers.ts +101 -0
  419. package/src/utils/route-helpers.ts +30 -0
  420. package/src/utils/status-response-builder.ts +159 -0
  421. package/src/utils/type-guards.ts +52 -0
  422. package/src/utils/utf8-helpers.ts +102 -0
  423. package/src/utils/webhook-event-builder.test.ts +143 -0
  424. package/src/utils/webhook-event-builder.ts +87 -0
  425. package/src/webhook-manager.test.ts +152 -0
  426. package/src/webhook-manager.ts +445 -0
  427. package/templates/allowlist-api-route.txt +7 -0
  428. package/templates/allowlist-comprehensive.txt +8 -0
  429. package/templates/allowlist-parser-fix.txt +6 -0
  430. package/templates/allowlist-ui-component.txt +9 -0
  431. package/templates/allowlist-utility.txt +9 -0
  432. package/test/actual-model-metadata.test.sh +102 -0
  433. package/test/dry-run.test.sh +131 -0
  434. package/test/fixtures/kaseki-report-exit-codes/metadata-exit-0.json +1 -0
  435. package/test/fixtures/kaseki-report-exit-codes/metadata-exit-1.json +1 -0
  436. package/test/fixtures/kaseki-report-exit-codes/metadata-exit-invalid.json +1 -0
  437. package/test/fixtures/kaseki-report-exit-codes/metadata-exit-str-0.json +1 -0
  438. package/test/fixtures/kaseki-report-exit-codes/metadata-exit-str-1.json +1 -0
  439. package/test/kaseki-api.integration.test.sh +165 -0
  440. package/test/pi-event-filter-failure.test.sh +83 -0
  441. package/test/printf-safety-focused.test.sh +99 -0
  442. package/test/printf-safety-results/results/restoration.jsonl +10 -0
  443. package/test/printf-safety-results/results/test.jsonl +0 -0
  444. package/test/printf-safety.test.sh +297 -0
  445. package/test/validation-fix.test.sh +79 -0
  446. package/test/validation-integration.test.sh +109 -0
  447. package/tests/allowlist-glob.test.sh +61 -0
  448. package/tests/dependency-cache-key.test.sh +48 -0
  449. package/tests/dependency-restore-mode.test.sh +48 -0
  450. package/tests/doctor-template-parity.test.sh +95 -0
  451. package/tests/github-operations.test.sh +142 -0
  452. package/tests/npm-install-flags.test.sh +58 -0
  453. package/tests/quality-gates.test.sh +178 -0
  454. package/tests/repo-memory.test.sh +103 -0
  455. package/tests/restore-disallowed-changes.test.sh +80 -0
  456. package/tests/validation-missing-npm-scripts.test.sh +93 -0
  457. package/tests/validation-strict-mode.test.sh +118 -0
  458. package/tsconfig.changed.json +7 -0
  459. package/tsconfig.json +39 -0
@@ -0,0 +1,559 @@
1
+ import { Router } from 'express';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import * as crypto from 'crypto';
5
+ import { randomUUID } from 'node:crypto';
6
+ import { execDockerCommand } from './lib/subprocess-helpers.js';
7
+ import { RunRequestSchema, } from './kaseki-api-types.js';
8
+ import { validateApiKey } from './kaseki-api-config.js';
9
+ import { createEventLogger } from './logger.js';
10
+ import { sendErrorResponse } from './utils/response-helpers.js';
11
+ import { readFirstLine, commandOutput } from './utils/file-helpers.js';
12
+ import { createStatusRoutes } from './routes/status-routes.js';
13
+ import { createLogRoutes } from './routes/log-routes.js';
14
+ import { createArtifactRoutes } from './routes/artifact-routes.js';
15
+ import { createWebhookRoutes } from './routes/webhook-routes.js';
16
+ import { metricsRegistry } from './metrics.js';
17
+ import { ResultCache } from './result-cache.js';
18
+ // Re-export UTF-8 helpers for backward compatibility
19
+ export { decodeUtf8TailSafely, tailLogByLines, readTailBytes } from './utils/utf8-helpers.js';
20
+ function stableStringify(value) {
21
+ if (Array.isArray(value)) {
22
+ return `[${value.map((item) => stableStringify(item)).join(',')}]`;
23
+ }
24
+ if (value && typeof value === 'object') {
25
+ const entries = Object.entries(value).sort(([a], [b]) => a.localeCompare(b));
26
+ return `{${entries.map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`).join(',')}}`;
27
+ }
28
+ return JSON.stringify(value);
29
+ }
30
+ function buildRequestFingerprint(runRequest) {
31
+ const requestForFingerprint = { ...runRequest };
32
+ delete requestForFingerprint.idempotencyKey;
33
+ return crypto.createHash('sha256').update(stableStringify(requestForFingerprint)).digest('hex');
34
+ }
35
+ function readKasekiImage(templateDir = '/agents/kaseki-template') {
36
+ if (process.env.KASEKI_IMAGE) {
37
+ return process.env.KASEKI_IMAGE;
38
+ }
39
+ const imageFile = path.join(templateDir, '.kaseki-image');
40
+ try {
41
+ const value = fs.readFileSync(imageFile, 'utf-8').trim();
42
+ if (value) {
43
+ return value;
44
+ }
45
+ }
46
+ catch {
47
+ // Fall through to the registry default.
48
+ }
49
+ return 'docker.io/cyanautomation/kaseki-agent:latest';
50
+ }
51
+ function inspectImageDigest(image) {
52
+ return commandOutput('docker', ['image', 'inspect', image, '--format', '{{range .RepoDigests}}{{println .}}{{end}}'])
53
+ ?.split(/\r?\n/)
54
+ .find((line) => line.trim().length > 0);
55
+ }
56
+ // Re-export from subprocess-helpers for backward compatibility with tests
57
+ export { classifyDockerFailure } from './lib/subprocess-helpers.js';
58
+ function checkOpenRouterKey() {
59
+ if (process.env.OPENROUTER_API_KEY && process.env.OPENROUTER_API_KEY.length > 0) {
60
+ return { name: 'openrouter-key', ok: true, detail: 'OPENROUTER_API_KEY is present in the API environment.' };
61
+ }
62
+ const keyFile = process.env.OPENROUTER_API_KEY_FILE || '/run/secrets/openrouter_api_key';
63
+ try {
64
+ const stat = fs.statSync(keyFile);
65
+ if (stat.isFile() && stat.size > 0) {
66
+ return { name: 'openrouter-key', ok: true, detail: `Readable key file: ${keyFile}` };
67
+ }
68
+ }
69
+ catch {
70
+ // Handled below.
71
+ }
72
+ return {
73
+ name: 'openrouter-key',
74
+ ok: false,
75
+ detail: 'No OpenRouter API key was found in env or the configured key file.',
76
+ remediation: 'Set OPENROUTER_API_KEY for API-triggered runs or mount OPENROUTER_API_KEY_FILE.',
77
+ };
78
+ }
79
+ function readSecretValue(inlineValue, filePath) {
80
+ const trimmedInline = inlineValue?.trim();
81
+ if (trimmedInline) {
82
+ return trimmedInline;
83
+ }
84
+ if (!filePath) {
85
+ return undefined;
86
+ }
87
+ try {
88
+ const stat = fs.statSync(filePath);
89
+ if (!stat.isFile() || stat.size === 0) {
90
+ return undefined;
91
+ }
92
+ const value = fs.readFileSync(filePath, 'utf-8').replace(/^\uFEFF/, '').trim();
93
+ return value || undefined;
94
+ }
95
+ catch {
96
+ return undefined;
97
+ }
98
+ }
99
+ function checkGitHubAppCredentials() {
100
+ const configured = Boolean(process.env.GITHUB_APP_ID || process.env.GITHUB_APP_ID_FILE) ||
101
+ Boolean(process.env.GITHUB_APP_CLIENT_ID || process.env.GITHUB_APP_CLIENT_ID_FILE) ||
102
+ Boolean(process.env.GITHUB_APP_PRIVATE_KEY || process.env.GITHUB_APP_PRIVATE_KEY_FILE);
103
+ if (!configured) {
104
+ return {
105
+ name: 'github-app',
106
+ ok: true,
107
+ detail: 'GitHub App credentials are not configured; PR creation will be disabled.',
108
+ };
109
+ }
110
+ const appId = readSecretValue(process.env.GITHUB_APP_ID, process.env.GITHUB_APP_ID_FILE);
111
+ const clientId = readSecretValue(process.env.GITHUB_APP_CLIENT_ID, process.env.GITHUB_APP_CLIENT_ID_FILE);
112
+ const privateKey = process.env.GITHUB_APP_PRIVATE_KEY?.trim() ||
113
+ readSecretValue(undefined, process.env.GITHUB_APP_PRIVATE_KEY_FILE);
114
+ const missing = [];
115
+ if (!appId) {
116
+ missing.push('GITHUB_APP_ID or GITHUB_APP_ID_FILE');
117
+ }
118
+ if (!clientId) {
119
+ missing.push('GITHUB_APP_CLIENT_ID or GITHUB_APP_CLIENT_ID_FILE');
120
+ }
121
+ if (!privateKey) {
122
+ missing.push('GITHUB_APP_PRIVATE_KEY or GITHUB_APP_PRIVATE_KEY_FILE');
123
+ }
124
+ if (missing.length > 0) {
125
+ return {
126
+ name: 'github-app',
127
+ ok: false,
128
+ detail: `GitHub App credentials are incomplete: missing ${missing.join(', ')}.`,
129
+ remediation: 'Mount readable GitHub App secret files or set the corresponding environment variables.',
130
+ };
131
+ }
132
+ const keyLooksLikePem = /-----BEGIN [A-Z ]*PRIVATE KEY-----/.test(privateKey);
133
+ if (!/^\d+$/.test(appId)) {
134
+ return {
135
+ name: 'github-app',
136
+ ok: false,
137
+ detail: 'GitHub App ID is present but is not numeric.',
138
+ remediation: 'Set GITHUB_APP_ID or GITHUB_APP_ID_FILE to the numeric GitHub App ID.',
139
+ };
140
+ }
141
+ if (!keyLooksLikePem) {
142
+ return {
143
+ name: 'github-app',
144
+ ok: false,
145
+ detail: 'GitHub App private key is present but does not look like a PEM private key.',
146
+ remediation: 'Mount the GitHub App private key PEM file and point GITHUB_APP_PRIVATE_KEY_FILE at it.',
147
+ };
148
+ }
149
+ return {
150
+ name: 'github-app',
151
+ ok: true,
152
+ detail: 'GitHub App credentials are readable and structurally valid for PR creation.',
153
+ };
154
+ }
155
+ function isGitHubAppReady() {
156
+ return checkGitHubAppCredentials().ok &&
157
+ (Boolean(process.env.GITHUB_APP_ID || process.env.GITHUB_APP_ID_FILE) ||
158
+ Boolean(process.env.GITHUB_APP_CLIENT_ID || process.env.GITHUB_APP_CLIENT_ID_FILE) ||
159
+ Boolean(process.env.GITHUB_APP_PRIVATE_KEY || process.env.GITHUB_APP_PRIVATE_KEY_FILE));
160
+ }
161
+ function buildPreflightResponse(config) {
162
+ const templateDir = process.env.KASEKI_TEMPLATE_DIR || '/agents/kaseki-template';
163
+ const image = readKasekiImage(templateDir);
164
+ const templateImageDigest = readFirstLine(path.join(templateDir, '.kaseki-image-digest')) || inspectImageDigest(image);
165
+ const checkoutDir = process.env.KASEKI_CHECKOUT_DIR || '/agents/kaseki-agent';
166
+ const templateRef = fs.existsSync(path.join(checkoutDir, '.git'))
167
+ ? commandOutput('git', ['rev-parse', '--short', 'HEAD'], checkoutDir)
168
+ : undefined;
169
+ const checks = [];
170
+ try {
171
+ fs.accessSync(config.resultsDir, fs.constants.R_OK | fs.constants.W_OK);
172
+ checks.push({ name: 'results-dir', ok: true, detail: `${config.resultsDir} is readable and writable.` });
173
+ }
174
+ catch (err) {
175
+ checks.push({
176
+ name: 'results-dir',
177
+ ok: false,
178
+ detail: `${config.resultsDir} is not readable and writable: ${err.message}`,
179
+ remediation: 'Create the results directory and make it writable by the API container user.',
180
+ });
181
+ }
182
+ checks.push(checkOpenRouterKey());
183
+ checks.push(checkGitHubAppCredentials());
184
+ const dockerVersion = execDockerCommand(['version', '--format', '{{.Client.Version}} -> {{.Server.Version}}']);
185
+ if (dockerVersion.ok) {
186
+ checks.push({ name: 'docker-daemon', ok: true, detail: dockerVersion.stdout });
187
+ }
188
+ else {
189
+ const classified = dockerVersion.classification || { detail: 'Docker command failed', remediation: 'Check Docker daemon' };
190
+ checks.push({ name: 'docker-daemon', ok: false, ...classified });
191
+ }
192
+ const imageInspect = execDockerCommand(['image', 'inspect', image]);
193
+ if (imageInspect.ok) {
194
+ checks.push({ name: 'docker-image', ok: true, detail: `Image is present: ${image}` });
195
+ }
196
+ else {
197
+ const classified = imageInspect.classification || { detail: 'Docker command failed', remediation: 'Check Docker daemon' };
198
+ const daemonFailed = checks.some((check) => check.name === 'docker-daemon' && !check.ok);
199
+ checks.push({
200
+ name: 'docker-image',
201
+ ok: false,
202
+ detail: daemonFailed ? classified.detail : `Docker image is not present locally: ${image}`,
203
+ remediation: daemonFailed ? classified.remediation : `Pull ${image} or set KASEKI_IMAGE to an available image.`,
204
+ });
205
+ }
206
+ const runScript = path.join(templateDir, 'run-kaseki.sh');
207
+ checks.push({
208
+ name: 'template',
209
+ ok: fs.existsSync(runScript),
210
+ detail: fs.existsSync(runScript) ? `Template runner exists: ${runScript}` : `Missing template runner: ${runScript}`,
211
+ remediation: fs.existsSync(runScript) ? undefined : 'Run scripts/kaseki-activate.sh --controller bootstrap.',
212
+ });
213
+ const status = checks.every((check) => check.ok)
214
+ ? 'ok'
215
+ : checks.some((check) => check.name === 'docker-daemon' && !check.ok)
216
+ ? 'error'
217
+ : 'degraded';
218
+ return {
219
+ status,
220
+ timestamp: new Date().toISOString(),
221
+ checks,
222
+ image,
223
+ imageDigest: templateImageDigest,
224
+ templateImage: image,
225
+ templateImageDigest,
226
+ templateDir,
227
+ templateRef,
228
+ resultsDir: config.resultsDir,
229
+ runtime: {
230
+ nodeVersion: process.version,
231
+ uid: process.getuid?.(),
232
+ gid: process.getgid?.(),
233
+ groups: process.getgroups?.(),
234
+ },
235
+ docker: {
236
+ version: dockerVersion.stdout,
237
+ clientVersion: dockerVersion.stdout?.split(' -> ')[0],
238
+ serverVersion: dockerVersion.stdout?.split(' -> ')[1],
239
+ },
240
+ };
241
+ }
242
+ function buildRunResponse(job, cached = false) {
243
+ return {
244
+ id: job.id,
245
+ status: job.status,
246
+ createdAt: job.createdAt.toISOString(),
247
+ correlationId: job.correlationId,
248
+ requestId: job.requestId,
249
+ cached: cached || undefined,
250
+ completedAt: job.completedAt?.toISOString(),
251
+ exitCode: job.exitCode,
252
+ failureClass: job.failureClass,
253
+ error: job.error,
254
+ };
255
+ }
256
+ /**
257
+ * Create the API routes.
258
+ */
259
+ export function createApiRouter(scheduler, config, idempotencyStore, preFlightValidator, artifactCache = new ResultCache({
260
+ maxEntries: config.artifactCacheMaxEntries,
261
+ ttlMs: config.artifactCacheTtlMs,
262
+ maxFileBytes: config.artifactCacheMaxFileBytes,
263
+ })) {
264
+ const router = Router();
265
+ const logger = createEventLogger('api');
266
+ /**
267
+ * Middleware: Request/Response logging.
268
+ */
269
+ router.use((req, res, next) => {
270
+ const startTime = Date.now();
271
+ const originalSend = res.send;
272
+ res.send = function (data) {
273
+ const duration = Date.now() - startTime;
274
+ const statusCode = res.statusCode;
275
+ // Log request/response event
276
+ logger.event('api_request_complete', {
277
+ method: req.method,
278
+ path: req.path,
279
+ statusCode,
280
+ durationMs: duration,
281
+ query: Object.keys(req.query).length > 0 ? req.query : undefined,
282
+ });
283
+ return originalSend.call(this, data);
284
+ };
285
+ next();
286
+ });
287
+ /**
288
+ * Middleware: API key validation.
289
+ */
290
+ router.use((req, res, next) => {
291
+ // Skip auth for health check
292
+ if (req.path === '/health' || req.path === '/ready') {
293
+ return next();
294
+ }
295
+ const authHeader = req.get('Authorization');
296
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
297
+ logger.event('api_auth_failed', {
298
+ path: req.path,
299
+ reason: 'missing_or_invalid_header',
300
+ });
301
+ return sendErrorResponse(res, 401, 'Unauthorized', 'Missing or invalid Authorization header');
302
+ }
303
+ const token = authHeader.slice(7);
304
+ if (!validateApiKey(config, token)) {
305
+ logger.event('api_auth_failed', {
306
+ path: req.path,
307
+ reason: 'invalid_api_key',
308
+ });
309
+ return sendErrorResponse(res, 401, 'Unauthorized', 'Invalid API key');
310
+ }
311
+ next();
312
+ });
313
+ /**
314
+ * Health check endpoint.
315
+ */
316
+ router.get('/health', (_req, res) => {
317
+ const queueStatus = scheduler.getQueueStatus();
318
+ const errors = [];
319
+ // Check if results directory is accessible
320
+ if (!fs.existsSync(config.resultsDir)) {
321
+ errors.push(`Results directory not accessible: ${config.resultsDir}`);
322
+ }
323
+ const status = errors.length === 0 ? 'healthy' : 'degraded';
324
+ res.json({
325
+ status,
326
+ timestamp: new Date().toISOString(),
327
+ queue: queueStatus,
328
+ errors: errors.length > 0 ? errors : undefined,
329
+ });
330
+ });
331
+ router.get('/ready', (_req, res) => {
332
+ const readiness = scheduler.getReadiness();
333
+ if (readiness.ready) {
334
+ return res.status(200).json({ status: 'ready', timestamp: new Date().toISOString() });
335
+ }
336
+ return res.status(503).json({
337
+ status: 'not_ready',
338
+ timestamp: new Date().toISOString(),
339
+ reasons: readiness.reasons,
340
+ });
341
+ });
342
+ router.get('/metrics', (_req, res) => {
343
+ const cacheStats = artifactCache.getStats();
344
+ const artifactCacheMetrics = [
345
+ '# HELP kaseki_artifact_cache_entries Number of artifact content cache entries currently held in memory.',
346
+ '# TYPE kaseki_artifact_cache_entries gauge',
347
+ `kaseki_artifact_cache_entries ${cacheStats.entries}`,
348
+ '# HELP kaseki_artifact_cache_bytes Bytes of artifact content currently held in memory.',
349
+ '# TYPE kaseki_artifact_cache_bytes gauge',
350
+ `kaseki_artifact_cache_bytes ${cacheStats.bytes}`,
351
+ '# HELP kaseki_artifact_cache_hits_total Total artifact content cache hits.',
352
+ '# TYPE kaseki_artifact_cache_hits_total counter',
353
+ `kaseki_artifact_cache_hits_total ${cacheStats.hits}`,
354
+ '# HELP kaseki_artifact_cache_misses_total Total artifact content cache misses.',
355
+ '# TYPE kaseki_artifact_cache_misses_total counter',
356
+ `kaseki_artifact_cache_misses_total ${cacheStats.misses}`,
357
+ '# HELP kaseki_artifact_cache_max_entries Configured maximum artifact content cache entries.',
358
+ '# TYPE kaseki_artifact_cache_max_entries gauge',
359
+ `kaseki_artifact_cache_max_entries ${cacheStats.maxEntries}`,
360
+ '# HELP kaseki_artifact_cache_max_file_bytes Configured maximum file size eligible for artifact content caching.',
361
+ '# TYPE kaseki_artifact_cache_max_file_bytes gauge',
362
+ `kaseki_artifact_cache_max_file_bytes ${cacheStats.maxFileBytes}`,
363
+ ].join('\n');
364
+ res.setHeader('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');
365
+ res.status(200).send(`${metricsRegistry.renderPrometheus()}${artifactCacheMetrics}\n`);
366
+ });
367
+ /**
368
+ * GET /api/preflight - Controller-oriented readiness diagnostics.
369
+ */
370
+ router.get('/preflight', (_req, res) => {
371
+ const response = buildPreflightResponse(config);
372
+ res.status(response.status === 'error' ? 503 : 200).json(response);
373
+ });
374
+ /**
375
+ * POST /api/runs - Trigger a new kaseki run.
376
+ */
377
+ router.post('/runs', async (req, res) => {
378
+ try {
379
+ // Validate request body
380
+ const runRequest = RunRequestSchema.parse({
381
+ ...req.body,
382
+ startupCheck: req.query.dryRun === 'true' || req.query.startupCheck === 'true'
383
+ ? true
384
+ : req.body?.startupCheck,
385
+ });
386
+ if ((runRequest.publishMode === 'branch' || runRequest.publishMode === 'draft_pr') && !isGitHubAppReady()) {
387
+ return sendErrorResponse(res, 400, 'Bad Request', `publishMode=${runRequest.publishMode} requires readable GitHub App credentials. Check /api/preflight before submitting publishable runs.`);
388
+ }
389
+ // Auto-generate idempotency key if not provided
390
+ const idempotencyKey = runRequest.idempotencyKey || randomUUID();
391
+ const requestFingerprint = buildRequestFingerprint(runRequest);
392
+ const claimResult = idempotencyStore.claimOrGet(idempotencyKey, requestFingerprint);
393
+ if (claimResult.kind === 'fulfilled') {
394
+ const currentJob = scheduler.getJob(claimResult.response.id);
395
+ const response = currentJob
396
+ ? buildRunResponse(currentJob, true)
397
+ : {
398
+ ...claimResult.response,
399
+ cached: true,
400
+ };
401
+ logger.event('api_idempotent_resubmission', {
402
+ jobId: response.id,
403
+ idempotencyKey,
404
+ currentStatus: currentJob?.status,
405
+ });
406
+ return res.status(200).json(response); // 200 OK, not 202
407
+ }
408
+ if (claimResult.kind === 'pending') {
409
+ return sendErrorResponse(res, 409, 'Conflict', 'Request with this idempotency key is already being processed');
410
+ }
411
+ // Log request
412
+ logger.event('api_run_request', {
413
+ repoUrl: runRequest.repoUrl,
414
+ ref: runRequest.ref,
415
+ taskMode: runRequest.taskMode,
416
+ publishMode: runRequest.publishMode,
417
+ startupCheck: runRequest.startupCheck,
418
+ idempotencyKey,
419
+ });
420
+ // Submit to scheduler
421
+ const job = await scheduler.submitJob(runRequest);
422
+ // Store idempotency key on job
423
+ job.idempotencyKey = idempotencyKey;
424
+ const response = buildRunResponse(job);
425
+ // Store in idempotency cache
426
+ idempotencyStore.storeResponse(idempotencyKey, response, requestFingerprint);
427
+ res.status(202).json(response); // 202 Accepted
428
+ }
429
+ catch (err) {
430
+ if (err instanceof Error && 'errors' in err) {
431
+ // Zod validation error
432
+ const details = err.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join('; ');
433
+ logger.event('api_validation_error', {
434
+ path: '/runs',
435
+ details,
436
+ });
437
+ return sendErrorResponse(res, 400, 'Bad Request', details);
438
+ }
439
+ logger.event('api_error', {
440
+ path: '/runs',
441
+ error: err.message,
442
+ });
443
+ return sendErrorResponse(res, 400, 'Bad Request', err.message);
444
+ }
445
+ });
446
+ /**
447
+ * POST /api/webhooks/test - Test webhook configuration.
448
+ */
449
+ router.post('/webhooks/test', async (req, res) => {
450
+ try {
451
+ const { url, secret } = req.body;
452
+ if (!url || typeof url !== 'string') {
453
+ return sendErrorResponse(res, 400, 'Bad Request', 'Webhook URL is required');
454
+ }
455
+ // Validate URL format
456
+ try {
457
+ new URL(url);
458
+ }
459
+ catch {
460
+ return sendErrorResponse(res, 400, 'Bad Request', 'Invalid webhook URL format');
461
+ }
462
+ // Send test webhook
463
+ let statusCode;
464
+ let error;
465
+ let durationMs = 0;
466
+ const startTime = Date.now();
467
+ try {
468
+ const testPayload = {
469
+ eventType: 'webhook.test',
470
+ jobId: 'test',
471
+ timestamp: new Date().toISOString(),
472
+ data: { message: 'This is a test webhook from kaseki-agent API' },
473
+ };
474
+ // Generate HMAC signature if secret provided
475
+ let signature = null;
476
+ if (secret && typeof secret === 'string') {
477
+ const body = JSON.stringify(testPayload);
478
+ signature = crypto.createHmac('sha256', secret).update(body).digest('hex');
479
+ }
480
+ const response = await fetch(url, {
481
+ method: 'POST',
482
+ headers: {
483
+ 'Content-Type': 'application/json',
484
+ 'X-Kaseki-Event': 'webhook.test',
485
+ 'X-Kaseki-Job-Id': 'test',
486
+ ...(signature && { 'X-Kaseki-Signature': `sha256=${signature}` }),
487
+ },
488
+ body: JSON.stringify(testPayload),
489
+ signal: AbortSignal.timeout(10000),
490
+ });
491
+ durationMs = Date.now() - startTime;
492
+ statusCode = response.status;
493
+ if (!response.ok) {
494
+ error = `HTTP ${response.status} ${response.statusText}`;
495
+ }
496
+ }
497
+ catch (err) {
498
+ durationMs = Date.now() - startTime;
499
+ error = err instanceof Error ? err.message : String(err);
500
+ }
501
+ const result = {
502
+ url,
503
+ statusCode,
504
+ durationMs,
505
+ success: !error,
506
+ error,
507
+ };
508
+ logger.event('webhook_test', result);
509
+ res.json(result);
510
+ }
511
+ catch (err) {
512
+ logger.event('api_error', {
513
+ path: '/webhooks/test',
514
+ error: err.message,
515
+ });
516
+ return sendErrorResponse(res, 400, 'Bad Request', err.message);
517
+ }
518
+ });
519
+ /**
520
+ * POST /api/validate - Pre-flight validation of job request (dry-run).
521
+ */
522
+ router.post('/validate', async (req, res) => {
523
+ try {
524
+ // Validate request body
525
+ const runRequest = RunRequestSchema.parse(req.body);
526
+ logger.event('api_validation_request', {
527
+ repoUrl: runRequest.repoUrl,
528
+ ref: runRequest.ref,
529
+ });
530
+ // Run pre-flight validation
531
+ const validationResult = await preFlightValidator.validate(runRequest);
532
+ const response = validationResult;
533
+ res.json(response);
534
+ }
535
+ catch (err) {
536
+ if (err instanceof Error && 'errors' in err) {
537
+ // Zod validation error
538
+ const details = err.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join('; ');
539
+ logger.event('api_validation_error', {
540
+ path: '/validate',
541
+ details,
542
+ });
543
+ return sendErrorResponse(res, 400, 'Bad Request', details);
544
+ }
545
+ logger.event('api_error', {
546
+ path: '/validate',
547
+ error: err.message,
548
+ });
549
+ return sendErrorResponse(res, 400, 'Bad Request', err.message);
550
+ }
551
+ });
552
+ // Register domain-focused route modules
553
+ router.use(createStatusRoutes(scheduler, config));
554
+ router.use(createLogRoutes(scheduler, config));
555
+ router.use(createArtifactRoutes(scheduler, config, artifactCache));
556
+ router.use(createWebhookRoutes());
557
+ return router;
558
+ }
559
+ //# sourceMappingURL=kaseki-api-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kaseki-api-routes.js","sourceRoot":"","sources":["../src/kaseki-api-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Kaseki API Service - Express server wrapper
3
+ *
4
+ * Encapsulates the complete REST API service for async execution
5
+ */
6
+ interface KasekiAPIServiceOptions {
7
+ port?: number;
8
+ apiKeys?: string[];
9
+ logLevel?: string;
10
+ }
11
+ export declare class KasekiAPIServiceImpl {
12
+ private server;
13
+ private logger;
14
+ private scheduler;
15
+ private webhookManager;
16
+ private idempotencyStore;
17
+ private artifactCache;
18
+ private config;
19
+ constructor(options?: KasekiAPIServiceOptions);
20
+ /**
21
+ * Start the API service
22
+ */
23
+ start(): Promise<void>;
24
+ /**
25
+ * Stop the API service
26
+ */
27
+ stop(): Promise<void>;
28
+ /**
29
+ * Get service port
30
+ */
31
+ getPort(): number;
32
+ /**
33
+ * Get service status
34
+ */
35
+ getStatus(): {
36
+ running: boolean;
37
+ port: number;
38
+ uptime: number;
39
+ };
40
+ }
41
+ export declare const KasekiAPIService: typeof KasekiAPIServiceImpl;
42
+ export default KasekiAPIServiceImpl;
43
+ //# sourceMappingURL=kaseki-api-service-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kaseki-api-service-wrapper.d.ts","sourceRoot":"","sources":["../src/kaseki-api-service-wrapper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,UAAU,uBAAuB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,MAAM,CAAgB;gBAElB,OAAO,GAAE,uBAA4B;IAmBjD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2F5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,SAAS,IAAI;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KACd;CAOJ;AAGD,eAAO,MAAM,gBAAgB,6BAAuB,CAAC;AACrD,eAAe,oBAAoB,CAAC"}