@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,521 @@
1
+ # Kaseki Agent API Service - Deployment Guide
2
+
3
+ ## Overview
4
+
5
+ The Kaseki API Service allows remote execution and monitoring of kaseki-agent runs via HTTP REST API.
6
+
7
+ **Authoritative deployment mode: Docker container runtime** (docker-compose, systemd+docker, or manual `docker run`). Host Node.js process mode is fallback/dev-only and is not the production reference path.
8
+
9
+ ## Prerequisites
10
+
11
+ - Docker + Docker Compose (for docker-compose deployment)
12
+ - Node.js ≥ 24.x (for Node.js fallback deployment)
13
+ - `/agents/kaseki-results` directory must exist or be creatable
14
+ - OpenRouter API key for Pi agent invocation (inherited from kaseki-agent)
15
+
16
+ ## Quick Start
17
+
18
+ ### ✅ Recommended: Docker Compose
19
+
20
+ ```bash
21
+ # Navigate to kaseki-agent repository
22
+ cd /agents/kaseki-template
23
+
24
+ # Set API key
25
+ export KASEKI_API_KEYS=sk-your-secret-key-here
26
+
27
+ # Build image from this repo
28
+ docker build -t kaseki-agent:node24-local .
29
+
30
+ # Start services (uses KASEKI_API_IMAGE, default: kaseki-agent:node24-local)
31
+ docker-compose up -d
32
+
33
+ # View logs
34
+ docker-compose logs -f kaseki-api
35
+
36
+ # Stop services
37
+ docker-compose down
38
+ ```
39
+
40
+ The API container runs as the `/agents` owner by default (`1000:1000`) and must also be able to use the host Docker socket so it can launch ephemeral `kaseki-N` containers. Set `DOCKER_GID` to the group owner of `/var/run/docker.sock`:
41
+
42
+ ```bash
43
+ export DOCKER_GID="$(stat -c '%g' /var/run/docker.sock)"
44
+ docker-compose up -d
45
+ ```
46
+
47
+ In Dockhand, Portainer, or another compose manager, keep the same shape:
48
+
49
+ ```yaml
50
+ services:
51
+ kaseki-api:
52
+ user: "1000:1000"
53
+ group_add:
54
+ - "${DOCKER_GID:-985}"
55
+ volumes:
56
+ - /agents:/agents:rw
57
+ - /var/run/docker.sock:/var/run/docker.sock
58
+ ```
59
+
60
+ After deployment, verify controller readiness with the authenticated preflight endpoint:
61
+
62
+ ```bash
63
+ curl -H "Authorization: Bearer $KASEKI_API_KEYS" \
64
+ http://localhost:8080/api/preflight
65
+ ```
66
+
67
+ **Configuration** (via environment variables):
68
+
69
+ ```bash
70
+ # Core settings
71
+ KASEKI_API_KEYS=sk-key1,sk-key2 # Required: comma-separated API keys
72
+ KASEKI_API_PORT=8080 # API listen port (default: 8080)
73
+ KASEKI_API_LOG_LEVEL=info # Log level: debug/info/warn/error
74
+ KASEKI_API_IMAGE=kaseki-agent:node24-local # Must be built from this repo's Dockerfile
75
+
76
+ # Performance
77
+ KASEKI_API_MAX_CONCURRENT_RUNS=3 # Max concurrent jobs (default: 3)
78
+ KASEKI_AGENT_TIMEOUT_SECONDS=1200 # Agent timeout in seconds (default: 20 min)
79
+ KASEKI_MAX_DIFF_BYTES=200000 # Max diff size (default: 200 KB)
80
+
81
+ # Paths (usually inherited from docker-compose)
82
+ KASEKI_RESULTS_DIR=/agents/kaseki-results
83
+ KASEKI_API_LOG_DIR=/var/log/kaseki-api
84
+ ```
85
+
86
+ ---
87
+
88
+ ## Fallback Deployment Options
89
+
90
+ ### Option 1: Node.js Process (Fallback)
91
+
92
+ Quick alternative if Docker/docker-compose is unavailable:
93
+
94
+ ```bash
95
+ cd /agents/kaseki-template
96
+
97
+ # Install dependencies (lockfile-enforced)
98
+ npm ci --omit=dev
99
+
100
+ # Verify runtime
101
+ node -v # Must report v24.x or newer
102
+
103
+ # Start API
104
+ KASEKI_API_KEYS=sk-dev-key npm run kaseki-api
105
+ ```
106
+
107
+ **Environment variables:**
108
+
109
+ ```bash
110
+ KASEKI_API_KEYS=sk-key1,sk-key2 # Required
111
+ KASEKI_API_PORT=8080 # Default: 8080
112
+ KASEKI_API_LOG_LEVEL=info # Default: info
113
+ KASEKI_API_MAX_CONCURRENT_RUNS=3 # Default: 3
114
+ KASEKI_AGENT_TIMEOUT_SECONDS=1200 # Default: 1200
115
+ KASEKI_MAX_DIFF_BYTES=200000 # Default: 200000
116
+ ```
117
+
118
+ **Production considerations:**
119
+
120
+ - Use a process manager (systemd, supervisor, PM2) for restart/recovery
121
+ - Run with `NODE_ENV=production` for optimal performance
122
+ - Monitor logs and uptime independently
123
+
124
+ ### Option 2: systemd Service (Alternative)
125
+
126
+ Deploy as a systemd service on the host (advanced):
127
+
128
+ ```bash
129
+ # 1. Build image from this repository
130
+ cd /agents/kaseki-template
131
+ npm ci --omit=dev
132
+ npm run build
133
+ docker build -t kaseki-agent:node24-local .
134
+
135
+ # 2. (Registry workflow) push/pull image before service restart
136
+ # docker tag kaseki-agent:node24-local registry.example.com/kaseki-agent:node24-2026-05-03
137
+ # docker push registry.example.com/kaseki-agent:node24-2026-05-03
138
+ # On target host: docker pull registry.example.com/kaseki-agent:node24-2026-05-03
139
+
140
+ # 3. Install systemd service (Docker mode only)
141
+ sudo cp scripts/kaseki-api.service /etc/systemd/system/
142
+ sudo systemctl daemon-reload
143
+
144
+ # 4. Create environment file
145
+ sudo mkdir -p /etc/kaseki-api
146
+ sudo tee /etc/kaseki-api/kaseki-api.env << EOF
147
+ KASEKI_API_KEYS=sk-your-secret-key
148
+ KASEKI_API_PORT=8080
149
+ KASEKI_API_LOG_LEVEL=info
150
+ KASEKI_RESULTS_DIR=/agents/kaseki-results
151
+ KASEKI_API_IMAGE=kaseki-agent:node24-local
152
+ EOF
153
+
154
+ # 5. Set appropriate permissions
155
+ sudo chown root:root /etc/kaseki-api/kaseki-api.env
156
+ sudo chmod 600 /etc/kaseki-api/kaseki-api.env
157
+
158
+ # 6. Start service
159
+ sudo systemctl enable kaseki-api
160
+ sudo systemctl start kaseki-api
161
+
162
+ # 7. Check status
163
+ sudo systemctl status kaseki-api
164
+ sudo journalctl -u kaseki-api -f
165
+ ```
166
+
167
+ **Important behavior in Docker mode:**
168
+
169
+ - The unit executes `node /app/dist/kaseki-api-service.js` inside the container image.
170
+ - `/etc/kaseki-api/kaseki-api.env` only supplies environment variables; it does not mount over `/app/dist`.
171
+ - Mounted host volumes are `/agents`, `/agents/kaseki-results`, `/var/log/kaseki-api`, and `/var/run/docker.sock`; none are mounted at `/app`, so `/app/dist` always comes from the image artifact.
172
+
173
+ ### Option 3: Manual Docker Container (Advanced)
174
+
175
+ Run the API container directly without docker-compose:
176
+
177
+ ```bash
178
+ docker run --rm \
179
+ --name kaseki-api \
180
+ -p 8080:8080 \
181
+ -v /agents:/agents:rw \
182
+ -v /agents/kaseki-results:/agents/kaseki-results:rw \
183
+ -v /var/log/kaseki-api:/var/log/kaseki-api:rw \
184
+ -v /var/run/docker.sock:/var/run/docker.sock \
185
+ -e KASEKI_API_KEYS=sk-your-key \
186
+ -e KASEKI_API_PORT=8080 \
187
+ -e KASEKI_CONTAINER_USER=1000:1000 \
188
+ -e KASEKI_AGENT_TIMEOUT_SECONDS=1200 \
189
+ --user 1000:1000 \
190
+ --group-add "$(stat -c '%g' /var/run/docker.sock)" \
191
+ --cap-drop ALL \
192
+ --security-opt no-new-privileges:true \
193
+ --read-only \
194
+ --entrypoint node \
195
+ ${KASEKI_API_IMAGE:-kaseki-agent:node24-local} \
196
+ /app/dist/kaseki-api-service.js
197
+ ```
198
+
199
+ ---
200
+
201
+ ## Security Best Practices
202
+
203
+ 1. **API Key Management**
204
+ - Store keys in environment files with mode `0600` (or use Docker secrets)
205
+ - Never commit keys to version control
206
+ - Rotate keys regularly
207
+ - Use separate keys for different environments (dev/staging/prod)
208
+ - For GitHub App authentication, prefer mounted files:
209
+ `GITHUB_APP_ID_FILE`, `GITHUB_APP_CLIENT_ID_FILE`, and
210
+ `GITHUB_APP_PRIVATE_KEY_FILE`. Avoid placing the private key PEM directly
211
+ in `.env`; environment variables are more likely to appear in process
212
+ inspection output, container metadata, and deployment UI history.
213
+
214
+ 2. **Network Security**
215
+ - Expose API only on trusted networks (localhost or VPN)
216
+ - Use firewall rules to restrict access:
217
+
218
+ ```bash
219
+ sudo ufw allow from 10.0.0.0/8 to any port 8080 # Example: allow from private network
220
+ ```
221
+
222
+ - Consider putting API behind a reverse proxy (nginx) with authentication
223
+
224
+ 3. **Container Hardening**
225
+ - All Docker deployments use:
226
+ - `--cap-drop ALL` — Remove all Linux capabilities
227
+ - `--security-opt no-new-privileges:true` — Prevent privilege escalation
228
+ - `--read-only` — Read-only root filesystem
229
+ - `tmpfs` — Temporary write-able directories
230
+ - API runs as a non-root user that owns `/agents`
231
+ - Add only the host Docker socket group as a supplemental group; do not run the API as root just to reach Docker
232
+
233
+ 4. **TLS/HTTPS**
234
+ - Forward HTTPS traffic via reverse proxy (e.g., nginx):
235
+
236
+ ```nginx
237
+ upstream kaseki_api {
238
+ server localhost:8080;
239
+ }
240
+
241
+ server {
242
+ listen 443 ssl http2;
243
+ server_name api.kaseki.local;
244
+ ssl_certificate /etc/letsencrypt/live/api.kaseki.local/fullchain.pem;
245
+ ssl_certificate_key /etc/letsencrypt/live/api.kaseki.local/privkey.pem;
246
+
247
+ location / {
248
+ proxy_pass http://kaseki_api;
249
+ proxy_set_header Authorization $http_authorization;
250
+ }
251
+ }
252
+ ```
253
+
254
+ ---
255
+
256
+ ## Health Checks
257
+
258
+ All deployments should monitor health:
259
+
260
+ ```bash
261
+ curl http://localhost:8080/health
262
+ # Equivalent namespaced endpoint:
263
+ curl http://localhost:8080/api/health
264
+ ```
265
+
266
+ Expected response:
267
+
268
+ ```json
269
+ {
270
+ "status": "healthy",
271
+ "timestamp": "2026-05-02T14:30:00Z",
272
+ "queue": {
273
+ "pending": 0,
274
+ "running": 0,
275
+ "maxConcurrent": 3
276
+ }
277
+ }
278
+ ```
279
+
280
+ ---
281
+
282
+ ## Monitoring
283
+
284
+ ### Dependency Cache Behavior
285
+
286
+ - Worker installs are lockfile-only (`npm ci --omit=dev`) and will fail when no `package-lock.json` or `npm-shrinkwrap.json` is present.
287
+ - Scheduler/runner containers must keep a persistent cache mount at `/agents/kaseki-cache` (or override with `KASEKI_CACHE_DIR`) so dependency cache data survives between runs.
288
+ - `run-kaseki.sh` mounts that directory into workers at `/cache`, and workers use:
289
+ - `KASEKI_DEPENDENCY_CACHE_DIR=/cache/dependencies`
290
+ - `NPM_CONFIG_CACHE=/cache/npm-cache`
291
+ - Cache key is deterministic: `sha256(repo_url) + lockfile sha256 + Node major version`.
292
+ - Progress + timing artifacts include install/cache signals:
293
+ - `progress.jsonl` / `progress.log`: dependency install stage, cache hit/miss, elapsed seconds.
294
+ - `stage-timings.tsv`: `dependency install` row with cache source and install flags.
295
+ - `dependency-cache.log`: summarized cache status.
296
+
297
+ ### Docker Compose
298
+
299
+ ```bash
300
+ # View logs
301
+ docker-compose logs -f kaseki-api
302
+
303
+ # Check resource usage
304
+ docker stats kaseki-api
305
+ ```
306
+
307
+ ### Node.js Process
308
+
309
+ ```bash
310
+ # Check process status
311
+ ps aux | grep kaseki-api
312
+
313
+ # View recent logs (depends on logging setup)
314
+ tail -f /var/log/kaseki-api.log
315
+ ```
316
+
317
+ ### systemd Service
318
+
319
+ ```bash
320
+ # Check status
321
+ systemctl status kaseki-api
322
+
323
+ # View logs (last 100 lines)
324
+ journalctl -u kaseki-api -n 100
325
+
326
+ # Stream logs
327
+ journalctl -u kaseki-api -f
328
+ ```
329
+
330
+ ### Prometheus Metrics
331
+
332
+ Metrics endpoint coming in Phase 8:
333
+
334
+ ```bash
335
+ curl -H "Authorization: Bearer $KASEKI_API_KEYS" http://localhost:8080/api/metrics
336
+ ```
337
+
338
+ Example Prometheus scrape config:
339
+
340
+ ```yaml
341
+ scrape_configs:
342
+ - job_name: kaseki_api
343
+ metrics_path: /api/metrics
344
+ scheme: http
345
+ static_configs:
346
+ - targets: ['kaseki-api:8080']
347
+ authorization:
348
+ credentials: ${KASEKI_API_KEY}
349
+ ```
350
+
351
+ Readiness probe (no auth required):
352
+
353
+ ```bash
354
+ curl -f http://localhost:8080/ready
355
+ # or
356
+ curl -f http://localhost:8080/api/ready
357
+ ```
358
+
359
+ `/ready` returns `503` with machine-readable `reasons` when dependencies like results-dir writability,
360
+ scheduler queue introspection, or webhook processing health are unavailable.
361
+
362
+ ---
363
+
364
+ ## Log Rotation
365
+
366
+ ### Docker Compose
367
+
368
+ Logs are managed by Docker automatically. To configure retention:
369
+
370
+ ```bash
371
+ # Edit daemon.json
372
+ sudo nano /etc/docker/daemon.json
373
+ ```
374
+
375
+ Add:
376
+
377
+ ```json
378
+ {
379
+ "log-driver": "json-file",
380
+ "log-opts": {
381
+ "max-size": "10m",
382
+ "max-file": "3"
383
+ }
384
+ }
385
+ ```
386
+
387
+ Then restart Docker:
388
+
389
+ ```bash
390
+ sudo systemctl restart docker
391
+ ```
392
+
393
+ ### Host Deployment (systemd/Node.js)
394
+
395
+ Configure logrotate:
396
+
397
+ ```bash
398
+ sudo tee /etc/logrotate.d/kaseki-api << EOF
399
+ /var/log/kaseki-api/*.log {
400
+ daily
401
+ rotate 7
402
+ compress
403
+ delaycompress
404
+ missingok
405
+ notifempty
406
+ create 0640 nobody nogroup
407
+ sharedscripts
408
+ postrotate
409
+ systemctl reload kaseki-api > /dev/null 2>&1 || true
410
+ endscript
411
+ }
412
+ EOF
413
+ ```
414
+
415
+ ---
416
+
417
+ ## Troubleshooting
418
+
419
+ ### API won't start
420
+
421
+ Check required environment variables:
422
+
423
+ ```bash
424
+ # Must be set
425
+ echo $KASEKI_API_KEYS # Should not be empty
426
+ ls -la /agents/kaseki-results # Directory must exist
427
+ ```
428
+
429
+ ### Container/process is crashing
430
+
431
+ View logs for detailed error:
432
+
433
+ ```bash
434
+ # Docker Compose
435
+ docker-compose logs kaseki-api | head -50
436
+
437
+ # Node.js
438
+ npm run kaseki-api # Run in foreground to see errors
439
+
440
+ # systemd
441
+ journalctl -u kaseki-api -n 50
442
+ ```
443
+
444
+ Common issues:
445
+
446
+ - Missing `/agents/kaseki-results` directory
447
+ - Invalid port (not between 1-65535)
448
+ - API key environment variable not set
449
+ - Docker daemon not running (for docker-compose)
450
+ - Node.js not installed or wrong version
451
+
452
+ ### Slow performance
453
+
454
+ Check queue status:
455
+
456
+ ```bash
457
+ curl -H "Authorization: Bearer sk-key" http://localhost:8080/api/runs
458
+
459
+ # Monitor running jobs
460
+ watch -n2 'curl -s http://localhost:8080/health | jq ".queue"'
461
+ ```
462
+
463
+ Increase `KASEKI_API_MAX_CONCURRENT_RUNS` if jobs are queueing unnecessarily.
464
+
465
+ ---
466
+
467
+ ## Cleanup
468
+
469
+ ### Docker Compose
470
+
471
+ ```bash
472
+ cd /agents/kaseki-template
473
+ docker-compose down
474
+ docker volume prune # Optional: delete unused volumes
475
+ ```
476
+
477
+ ### Node.js Process
478
+
479
+ ```bash
480
+ # Stop the process
481
+ pkill -f "kaseki-api"
482
+
483
+ # Or if using npm:
484
+ # Ctrl+C in the terminal
485
+ ```
486
+
487
+ ### systemd Service
488
+
489
+ ```bash
490
+ sudo systemctl stop kaseki-api
491
+ sudo systemctl disable kaseki-api
492
+ sudo rm /etc/systemd/system/kaseki-api.service
493
+ sudo systemctl daemon-reload
494
+ ```
495
+
496
+ ---
497
+
498
+ ## Next Steps
499
+
500
+ 1. **Choose your deployment path** — Docker Compose (recommended) or Node.js
501
+ 2. **Configure for your network** — Update firewall rules, reverse proxy settings
502
+ 3. **Set up monitoring** — Add health checks, alerts
503
+ 4. **Test integration** — Use TypeScript client library to submit test runs
504
+ 5. **Deploy kaseki-agent** — Ensure Docker base image and OpenRouter credentials are configured
505
+
506
+ ## Runtime Verification
507
+
508
+ Use these checks after deployment:
509
+
510
+ ```bash
511
+ # Check whether systemd is launching Docker or host Node
512
+ systemctl cat kaseki-api | sed -n "1,220p"
513
+
514
+ # Docker path: verify container runtime Node major
515
+ docker exec kaseki-api node -v
516
+
517
+ # Host-Node path: verify service user runtime (example for nobody)
518
+ sudo -u nobody /usr/bin/node -v
519
+ ```
520
+
521
+ The service startup precheck logs detected Node version and exits with a clear error if the major version is less than 24.