@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,10 @@
1
+ /var/log/kaseki/*.log {
2
+ daily
3
+ rotate 14
4
+ compress
5
+ delaycompress
6
+ missingok
7
+ notifempty
8
+ copytruncate
9
+ create 0640 root adm
10
+ }
package/package.json ADDED
@@ -0,0 +1,83 @@
1
+ {
2
+ "name": "@cyanautomation/kaseki-agent",
3
+ "version": "1.4.1",
4
+ "description": "Ephemeral coding-agent runner: orchestrates Pi CLI via Docker for automated code modifications with validation",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "engines": {
8
+ "node": ">=24"
9
+ },
10
+ "os": [
11
+ "linux"
12
+ ],
13
+ "bin": {
14
+ "kaseki-agent": "dist/cli.js"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/CyanAutomation/kaseki-agent.git"
19
+ },
20
+ "keywords": [
21
+ "pi-cli",
22
+ "openrouter",
23
+ "coding-agent",
24
+ "docker",
25
+ "automation"
26
+ ],
27
+ "author": "CyanAutomation",
28
+ "bugs": {
29
+ "url": "https://github.com/CyanAutomation/kaseki-agent/issues"
30
+ },
31
+ "homepage": "https://github.com/CyanAutomation/kaseki-agent#readme",
32
+ "scripts": {
33
+ "build": "tsc && node dist/add-js-extensions.js && chmod 0755 dist/*.js",
34
+ "type-check": "tsc --noEmit",
35
+ "check": "npm run type-check && npm run lint",
36
+ "test": "npm run test:unit",
37
+ "test:unit": "jest --passWithNoTests",
38
+ "test:cli": "npm run build && npm run test:cli:install && npm run test:cli:verify",
39
+ "test:cli:install": "npm run test:cli:install-local && npm run test:cli:install-npx",
40
+ "test:cli:install-local": "npm link && kaseki-agent --version && npm unlink -g @cyanautomation/kaseki-agent",
41
+ "test:cli:install-npx": "npx . --version 2>&1 | grep -q 'version' && echo 'npx test passed'",
42
+ "test:cli:verify": "npm run build && kaseki-agent --help && kaseki-agent doctor --help",
43
+ "test:ci": "npm run build && npm run type-check && jest --passWithNoTests && bash run-kaseki-json.test.sh && bash tests/allowlist-glob.test.sh && bash tests/restore-disallowed-changes.test.sh && bash tests/dependency-cache-key.test.sh && bash tests/dependency-restore-mode.test.sh && bash tests/doctor-template-parity.test.sh && bash tests/npm-install-flags.test.sh && bash tests/repo-memory.test.sh && bash scripts/test-github-app.sh",
44
+ "test:watch": "jest --watch",
45
+ "test:coverage": "jest --coverage",
46
+ "lint": "npm run lint:js && npm run lint:sh || true",
47
+ "lint:js": "eslint . src/ --ignore-pattern dist/",
48
+ "lint:js:fix": "eslint . src/ --fix --ignore-pattern dist/",
49
+ "lint:sh": "shellcheck -x kaseki-agent.sh scripts/docker-entrypoint.sh run-kaseki-json.test.sh",
50
+ "lint:fix": "npm run lint:js:fix && npm run lint:sh",
51
+ "kaseki-api": "tsx src/kaseki-api-service.ts",
52
+ "type-check:full": "npm run type-check",
53
+ "type-check:changed": "tsc --noEmit -p tsconfig.changed.json",
54
+ "benchmark:pi-event-filter": "npm run build && RUN_PI_EVENT_FILTER_PERF=1 jest --testMatch \"<rootDir>/perf/**/*.benchmark.test.ts\" --runInBand",
55
+ "release": "semantic-release",
56
+ "release:dry": "semantic-release --dry-run"
57
+ },
58
+ "dependencies": {
59
+ "express": "^4.18.2",
60
+ "zod": "^3.22.4"
61
+ },
62
+ "devDependencies": {
63
+ "@semantic-release/changelog": "^6.0.3",
64
+ "@semantic-release/commit-analyzer": "^13.0.1",
65
+ "@semantic-release/git": "^10.0.1",
66
+ "@semantic-release/github": "^12.0.6",
67
+ "@semantic-release/release-notes-generator": "^14.1.0",
68
+ "@types/express": "^4.17.21",
69
+ "@types/jest": "^29.5.14",
70
+ "@types/node": "^22.10.5",
71
+ "@types/uuid": "^9.0.2",
72
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
73
+ "@typescript-eslint/parser": "^7.18.0",
74
+ "conventional-changelog-conventionalcommits": "^9.3.1",
75
+ "eslint": "^8.56.0",
76
+ "jest": "^29.7.0",
77
+ "semantic-release": "^25.0.3",
78
+ "ts-jest": "^29.2.6",
79
+ "ts-node": "^10.9.2",
80
+ "tsx": "^4.21.0",
81
+ "typescript": "^5.7.3"
82
+ }
83
+ }
package/perf/README.md ADDED
@@ -0,0 +1,54 @@
1
+ # Pi event filter benchmark
2
+
3
+ The 200k-event `pi-event-filter` scenario is intentionally kept outside `src/`
4
+ so it is not discovered by the normal Jest unit/integration configuration. Treat
5
+ it as an explicit nightly or ad-hoc benchmark check, not as regular CI coverage.
6
+
7
+ ## Required build artifact
8
+
9
+ Build before running the benchmark:
10
+
11
+ ```sh
12
+ npm run build
13
+ ```
14
+
15
+ The benchmark launches Node against the compiled artifact at:
16
+
17
+ ```text
18
+ dist/pi-event-filter.js
19
+ ```
20
+
21
+ If that file is missing or stale, run `npm run build` again before collecting
22
+ benchmark data.
23
+
24
+ ## Required environment variables
25
+
26
+ Run through the package script for the standard setup:
27
+
28
+ ```sh
29
+ npm run benchmark:pi-event-filter
30
+ ```
31
+
32
+ The script sets `RUN_PI_EVENT_FILTER_PERF=1`, which enables the otherwise skipped
33
+ benchmark suite. Equivalent enablement variables accepted by the benchmark are:
34
+
35
+ - `RUN_PI_EVENT_FILTER_PERF=1` for manual benchmark runs.
36
+ - `CI_NIGHTLY=1` for scheduled nightly workers.
37
+ - `PERF_TESTS=1` for generic performance-test jobs.
38
+
39
+ The benchmark process also sets `PI_EVENT_FILTER_TRACK_RSS=1` for the child
40
+ `dist/pi-event-filter.js` process so the worker prints `MAX_RSS_BYTES=<bytes>` to
41
+ stderr for assertion and trend collection.
42
+
43
+ ## Expected worker memory profile
44
+
45
+ `pi-event-filter` is expected to stream JSONL without retaining the 200k-event
46
+ input in memory. The benchmark asserts the maximum worker RSS reported by the
47
+ child process:
48
+
49
+ - Nightly workers (`CI_NIGHTLY=1`): less than 450 MiB.
50
+ - Manual/ad-hoc runs: less than 800 MiB to allow for unknown local host overhead
51
+ while still catching large regressions.
52
+
53
+ Use the stderr `MAX_RSS_BYTES` value as the benchmark datapoint when tracking
54
+ memory drift across nightly runs.
@@ -0,0 +1,98 @@
1
+ import fs from 'node:fs';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { spawn } from 'node:child_process';
5
+
6
+ const runPerf =
7
+ process.env.RUN_PI_EVENT_FILTER_PERF === '1' ||
8
+ process.env.CI_NIGHTLY === '1' ||
9
+ process.env.PERF_TESTS === '1';
10
+ const describePerf = runPerf ? describe : describe.skip;
11
+
12
+ describePerf('pi-event-filter nightly benchmark suite', () => {
13
+ test('200k event benchmark completes within worker memory profile', async () => {
14
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pi-event-filter-perf-'));
15
+ const inputPath = path.join(tmpDir, 'in.jsonl');
16
+ const outputPath = path.join(tmpDir, 'out.jsonl');
17
+ const summaryPath = path.join(tmpDir, 'summary.json');
18
+
19
+ try {
20
+ const totalEvents = 200_000;
21
+ const filteredEvery = 5;
22
+ const expectedKept = totalEvents - Math.floor(totalEvents / filteredEvery);
23
+
24
+ const input = fs.createWriteStream(inputPath, { encoding: 'utf8' });
25
+ for (let i = 0; i < totalEvents; i++) {
26
+ const filtered = i % filteredEvery === 0;
27
+ const event = {
28
+ type: i % 2 === 0 ? 'tool_execution_start' : 'tool_execution_end',
29
+ timestamp: `2026-01-01T00:00:${String(i % 60).padStart(2, '0')}.000Z`,
30
+ message: { model: 'pi-stress-model', api: 'pi-stress-api' },
31
+ assistantMessageEvent: {
32
+ type: filtered ? 'thinking_delta' : 'output_delta',
33
+ partial: {
34
+ timestamp: `2026-01-01T00:00:${String((i + 1) % 60).padStart(2, '0')}.000Z`,
35
+ content: [
36
+ { type: 'thinking', text: 'internal note' },
37
+ { type: 'output_text', text: `event-${i}` },
38
+ ],
39
+ },
40
+ },
41
+ };
42
+ const canContinue = input.write(`${JSON.stringify(event)}\n`);
43
+ if (!canContinue) {
44
+ await new Promise<void>((resolve) => input.once('drain', resolve));
45
+ }
46
+ }
47
+ await new Promise<void>((resolve) => input.end(resolve));
48
+
49
+ const script = [
50
+ path.join(__dirname, '..', 'dist', 'pi-event-filter.js'),
51
+ inputPath,
52
+ outputPath,
53
+ summaryPath,
54
+ ];
55
+
56
+ const child = spawn(process.execPath, script, {
57
+ env: { ...process.env, PI_EVENT_FILTER_TRACK_RSS: '1' },
58
+ });
59
+ let stderr = '';
60
+ child.stderr.on('data', (chunk) => {
61
+ stderr += chunk.toString();
62
+ });
63
+
64
+ const exitCode = await new Promise<number | null>((resolve, reject) => {
65
+ child.once('error', reject);
66
+ child.once('close', resolve);
67
+ });
68
+
69
+ expect(exitCode).toBe(0);
70
+
71
+ const lines = fs.readFileSync(outputPath, 'utf8').trim().split('\n');
72
+ expect(lines).toHaveLength(expectedKept);
73
+
74
+ const summary = JSON.parse(fs.readFileSync(summaryPath, 'utf8'));
75
+ expect(summary.tool_start_count + summary.tool_end_count).toBe(totalEvents);
76
+ expect(summary.invalid_json_lines).toBe(0);
77
+ expect(summary.selected_model).toBe('pi-stress-model');
78
+ expect(summary.selected_api).toBe('pi-stress-api');
79
+
80
+ const maxRssMatch = stderr.match(/MAX_RSS_BYTES=(\d+)/);
81
+ expect(maxRssMatch).not.toBeNull();
82
+ if (!maxRssMatch) return;
83
+
84
+ const memoryMb = Number.parseInt(maxRssMatch[1], 10) / (1024 * 1024);
85
+
86
+ // Threshold guidance:
87
+ // - default (developer laptops/unknown CI): loose guardrail for regressions
88
+ // - nightly perf workers: tighter budget to track drift
89
+ const thresholdMb = process.env.CI_NIGHTLY === '1' ? 450 : 800;
90
+ // Expected profile: a streaming worker should remain well below 450 MiB
91
+ // on nightly hosts; the 800 MiB fallback only protects ad-hoc local runs
92
+ // from large regressions on unknown hardware.
93
+ expect(memoryMb).toBeLessThan(thresholdMb);
94
+ } finally {
95
+ fs.rmSync(tmpDir, { recursive: true, force: true });
96
+ }
97
+ }, 120000);
98
+ });
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+ TMP_DIR="$(mktemp -d)"
6
+ trap 'rm -rf "$TMP_DIR"' EXIT
7
+
8
+ require_file() {
9
+ local file="$1"
10
+ if [ ! -f "$file" ]; then
11
+ echo "Expected file missing: $file" >&2
12
+ exit 1
13
+ fi
14
+ }
15
+
16
+ require_artifacts() {
17
+ local result_dir="$1"
18
+ shift
19
+ for artifact in "$@"; do
20
+ require_file "$result_dir/$artifact"
21
+ done
22
+ }
23
+
24
+ KASEKI_ROOT="$TMP_DIR/kaseki"
25
+ REPO_URL='https://example.com/repo"quoted"'
26
+ GIT_REF='feature/"quoted"/branch'
27
+ OPENROUTER_API_KEY_FILE="$TMP_DIR/missing-secret"
28
+ DOCKER_BIN="$(command -v docker || true)"
29
+ if [ -z "$DOCKER_BIN" ]; then
30
+ echo "Skipping run-kaseki-json.test.sh because docker is not available" >&2
31
+ exit 0
32
+ fi
33
+ TEST_PATH="$(dirname "$DOCKER_BIN"):/usr/bin:/bin"
34
+
35
+ set +e
36
+ env \
37
+ PATH="$TEST_PATH" \
38
+ KASEKI_ROOT="$KASEKI_ROOT" \
39
+ REPO_URL="$REPO_URL" \
40
+ GIT_REF="$GIT_REF" \
41
+ OPENROUTER_API_KEY_FILE="$OPENROUTER_API_KEY_FILE" \
42
+ "$ROOT_DIR/run-kaseki.sh" >/dev/null 2>&1
43
+ status=$?
44
+ set -e
45
+
46
+ if [ "$status" -ne 2 ]; then
47
+ echo "Expected run-kaseki.sh to exit 2 when API key is missing, got: $status" >&2
48
+ exit 1
49
+ fi
50
+
51
+ if [ ! -d "$KASEKI_ROOT/kaseki-results/kaseki-1" ]; then
52
+ echo "Expected first auto run to create $KASEKI_ROOT/kaseki-results/kaseki-1" >&2
53
+ exit 1
54
+ fi
55
+ result_dir="$KASEKI_ROOT/kaseki-results/kaseki-1"
56
+
57
+ require_artifacts "$result_dir" host-start.json metadata.json
58
+
59
+ node -e '
60
+ const fs = require("node:fs");
61
+ const hostStart = JSON.parse(fs.readFileSync(process.argv[1], "utf8"));
62
+ const metadata = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
63
+ const expectedRepo = process.argv[3];
64
+ const expectedRef = process.argv[4];
65
+ if (hostStart.repo_url !== expectedRepo) throw new Error("host-start repo_url mismatch");
66
+ if (hostStart.git_ref !== expectedRef) throw new Error("host-start git_ref mismatch");
67
+ if (metadata.repo_url !== expectedRepo) throw new Error("metadata repo_url mismatch");
68
+ if (metadata.git_ref !== expectedRef) throw new Error("metadata git_ref mismatch");
69
+ ' \
70
+ "$result_dir/host-start.json" \
71
+ "$result_dir/metadata.json" \
72
+ "$REPO_URL" \
73
+ "$GIT_REF"
74
+
75
+ require_artifacts "$result_dir" changed-files.txt validation-timings.tsv stage-timings.tsv dependency-cache.log quality.log secret-scan.log git-push.log progress.log progress.jsonl cleanup.log
76
+
77
+ if ! grep -q "missing OPENROUTER_API_KEY" "$result_dir/stage-timings.tsv"; then
78
+ echo "Expected missing-key failure to be recorded in stage-timings.tsv" >&2
79
+ exit 1
80
+ fi
81
+
82
+ set +e
83
+ env \
84
+ PATH="$TEST_PATH" \
85
+ KASEKI_ROOT="$KASEKI_ROOT" \
86
+ REPO_URL="$REPO_URL" \
87
+ GIT_REF="$GIT_REF" \
88
+ OPENROUTER_API_KEY_FILE="$OPENROUTER_API_KEY_FILE" \
89
+ "$ROOT_DIR/run-kaseki.sh" >/tmp/kaseki-json-rerun.out 2>/tmp/kaseki-json-rerun.err
90
+ rerun_status=$?
91
+ set -e
92
+
93
+ if [ "$rerun_status" -ne 2 ]; then
94
+ echo "Expected second auto run to skip existing result and fail with missing key at kaseki-2, got: $rerun_status" >&2
95
+ exit 1
96
+ fi
97
+
98
+ if [ ! -d "$KASEKI_ROOT/kaseki-results/kaseki-2" ]; then
99
+ echo "Expected second auto run to create kaseki-2 instead of overwriting kaseki-1" >&2
100
+ exit 1
101
+ fi
102
+
103
+ if grep -q "node: command not found" "$result_dir/stderr.log"; then
104
+ echo "run-kaseki.sh should not require node on the host" >&2
105
+ exit 1
106
+ fi