@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 @@
1
+ {"version":3,"file":"response-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/response-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAiB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,IAAI,CASN;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtD,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,cAAc,CAqBjB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7B,IAAI,CAmBN;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM1D"}
@@ -0,0 +1,78 @@
1
+ import * as fs from 'fs';
2
+ /**
3
+ * Send a standardized error response.
4
+ * Consolidates error response generation across all endpoints.
5
+ */
6
+ export function sendErrorResponse(res, status, title, detail) {
7
+ const response = {
8
+ type: 'https://api.kaseki.local/errors#' + title.toLowerCase().replace(/\s+/g, '-'),
9
+ title,
10
+ status,
11
+ detail,
12
+ };
13
+ res.status(status).json(response);
14
+ }
15
+ /**
16
+ * Build a StatusResponse from job metadata.
17
+ * Consolidates StatusResponse construction logic used in multiple routes.
18
+ */
19
+ export function buildStatusResponse(jobData) {
20
+ const response = {
21
+ id: jobData.id,
22
+ status: jobData.status,
23
+ correlationId: jobData.correlationId,
24
+ requestId: jobData.requestId,
25
+ resultDir: jobData.resultDir,
26
+ };
27
+ // Only include optional fields if they are not null
28
+ if (jobData.exitCode !== null && jobData.exitCode !== undefined) {
29
+ response.exitCode = jobData.exitCode;
30
+ }
31
+ if (jobData.failureClass !== null && jobData.failureClass !== undefined) {
32
+ response.failureClass = jobData.failureClass;
33
+ }
34
+ if (jobData.error !== null && jobData.error !== undefined) {
35
+ response.error = jobData.error;
36
+ }
37
+ return response;
38
+ }
39
+ /**
40
+ * Send a file response with appropriate headers for artifact delivery.
41
+ * Handles Content-Type detection and streaming.
42
+ */
43
+ export function sendFileResponse(res, filePath, fileName, options) {
44
+ try {
45
+ const stat = fs.statSync(filePath);
46
+ const contentType = detectContentType(fileName);
47
+ res.setHeader('Content-Type', contentType);
48
+ res.setHeader('Content-Length', stat.size);
49
+ res.setHeader('Content-Disposition', `inline; filename="${fileName}"`);
50
+ if (options?.stream) {
51
+ const stream = fs.createReadStream(filePath);
52
+ stream.pipe(res);
53
+ }
54
+ else {
55
+ const content = fs.readFileSync(filePath, 'utf-8');
56
+ res.send(content);
57
+ }
58
+ }
59
+ catch (error) {
60
+ sendErrorResponse(res, 500, 'Internal Server Error', `Failed to read file: ${fileName}`);
61
+ }
62
+ }
63
+ /**
64
+ * Detect Content-Type based on file extension.
65
+ * Used for artifact responses.
66
+ */
67
+ export function detectContentType(fileName) {
68
+ if (fileName.endsWith('.json'))
69
+ return 'application/json';
70
+ if (fileName.endsWith('.md'))
71
+ return 'text/markdown';
72
+ if (fileName.endsWith('.jsonl'))
73
+ return 'application/x-jsonl';
74
+ if (fileName.endsWith('.diff'))
75
+ return 'text/plain';
76
+ return 'text/plain';
77
+ }
78
+ //# sourceMappingURL=response-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-helpers.js","sourceRoot":"","sources":["../../src/utils/response-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Route helper utilities for common patterns across API routes.
3
+ */
4
+ import { Response } from 'express';
5
+ import { JobScheduler } from '../job-scheduler';
6
+ import { Job } from '../kaseki-api-types';
7
+ /**
8
+ * Extract and validate a job ID from a request, sending an error response if not found.
9
+ * Consolidates the pattern used across artifact, log, and status routes.
10
+ *
11
+ * @param scheduler Job scheduler instance
12
+ * @param jobId Job ID to look up
13
+ * @param res Express response object (for error responses)
14
+ * @returns Job object if found, null if error response already sent
15
+ */
16
+ export declare function getJobOrRespond(scheduler: JobScheduler, jobId: string, res: Response): Job | null;
17
+ //# sourceMappingURL=route-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/route-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAG1C;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,YAAY,EACvB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,QAAQ,GACZ,GAAG,GAAG,IAAI,CAOZ"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Route helper utilities for common patterns across API routes.
3
+ */
4
+ import { sendErrorResponse } from './response-helpers.js';
5
+ /**
6
+ * Extract and validate a job ID from a request, sending an error response if not found.
7
+ * Consolidates the pattern used across artifact, log, and status routes.
8
+ *
9
+ * @param scheduler Job scheduler instance
10
+ * @param jobId Job ID to look up
11
+ * @param res Express response object (for error responses)
12
+ * @returns Job object if found, null if error response already sent
13
+ */
14
+ export function getJobOrRespond(scheduler, jobId, res) {
15
+ const job = scheduler.getJob(jobId);
16
+ if (!job) {
17
+ sendErrorResponse(res, 404, 'Not Found', `Run not found: ${jobId}`);
18
+ return null;
19
+ }
20
+ return job;
21
+ }
22
+ //# sourceMappingURL=route-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/utils/route-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,SAAuB,EACvB,KAAa,EACb,GAAa;IAEb,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,kBAAkB,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { Job } from '../kaseki-api-types';
2
+ import { StatusResponse } from '../kaseki-api-types';
3
+ import { KasekiApiConfig } from '../kaseki-api-config';
4
+ import { JobScheduler } from '../job-scheduler';
5
+ /**
6
+ * Builds StatusResponse objects with timing, progress, and artifact information.
7
+ * Encapsulates complex response building logic from status routes.
8
+ */
9
+ export declare class StatusResponseBuilder {
10
+ private scheduler;
11
+ private config;
12
+ constructor(scheduler: JobScheduler, config: KasekiApiConfig);
13
+ /**
14
+ * Build a complete StatusResponse for a job.
15
+ */
16
+ buildStatus(job: Job): StatusResponse;
17
+ private addTimingInfo;
18
+ private addProgressInfo;
19
+ private addArtifactInfo;
20
+ private readMetadata;
21
+ private resolveExitCode;
22
+ }
23
+ //# sourceMappingURL=status-response-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-response-builder.d.ts","sourceRoot":"","sources":["../../src/utils/status-response-builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQhD;;;GAGG;AACH,qBAAa,qBAAqB;IAE9B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;gBADN,SAAS,EAAE,YAAY,EACvB,MAAM,EAAE,eAAe;IAGjC;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,cAAc;IA0BrC,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,eAAe;IA+BvB,OAAO,CAAC,eAAe;IAmCvB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,eAAe;CAiBxB"}
@@ -0,0 +1,144 @@
1
+ import * as path from 'path';
2
+ import * as fs from 'fs';
3
+ import { getRunArtifactMetadata } from '../run-artifact-metadata-cache.js';
4
+ import { resolveInstanceExitCode, extractValidationFailureReason, extractQualityFailureReason } from '../instance-state-derivation.js';
5
+ import { toStructuredProgress } from './progress-normalizer.js';
6
+ import { readLastJsonlEvent } from './file-helpers.js';
7
+ const STATUS_KEY_FILES = ['metadata.json', 'analysis.md', 'result-summary.md', 'failure.json', 'stderr.log'];
8
+ /**
9
+ * Builds StatusResponse objects with timing, progress, and artifact information.
10
+ * Encapsulates complex response building logic from status routes.
11
+ */
12
+ export class StatusResponseBuilder {
13
+ scheduler;
14
+ config;
15
+ constructor(scheduler, config) {
16
+ this.scheduler = scheduler;
17
+ this.config = config;
18
+ }
19
+ /**
20
+ * Build a complete StatusResponse for a job.
21
+ */
22
+ buildStatus(job) {
23
+ const runDir = job.resultDir || path.join(this.config.resultsDir, job.id);
24
+ const exitCode = this.resolveExitCode(job, runDir);
25
+ const metadata = this.readMetadata(runDir);
26
+ const validationReason = extractValidationFailureReason(metadata);
27
+ const qualityReason = extractQualityFailureReason(metadata);
28
+ const response = {
29
+ id: job.id,
30
+ status: job.status,
31
+ exitCode: exitCode ?? undefined,
32
+ failureClass: job.failureClass,
33
+ validationFailureReason: validationReason ?? undefined,
34
+ qualityFailureReason: qualityReason ?? undefined,
35
+ correlationId: job.correlationId,
36
+ requestId: job.requestId,
37
+ error: job.error,
38
+ resultDir: job.resultDir,
39
+ };
40
+ this.addTimingInfo(response, job);
41
+ this.addProgressInfo(response, job);
42
+ this.addArtifactInfo(response, job);
43
+ return response;
44
+ }
45
+ addTimingInfo(response, job) {
46
+ if (job.startedAt) {
47
+ const elapsed = (job.completedAt || new Date()).getTime() - job.startedAt.getTime();
48
+ response.elapsedSeconds = Math.round(elapsed / 1000);
49
+ const timeoutSeconds = job.effectiveTimeoutSeconds ?? this.config.agentTimeoutSeconds;
50
+ const timeoutMs = timeoutSeconds * 1000;
51
+ response.timeoutRiskPercent = Math.round((elapsed / timeoutMs) * 100);
52
+ }
53
+ }
54
+ addProgressInfo(response, job) {
55
+ if (job.status !== 'running') {
56
+ return;
57
+ }
58
+ try {
59
+ const progressFile = path.join(this.config.resultsDir, job.id, 'progress.jsonl');
60
+ const lastFileEvent = readLastJsonlEvent(progressFile);
61
+ if (lastFileEvent) {
62
+ const structuredProgress = toStructuredProgress(lastFileEvent);
63
+ if (structuredProgress) {
64
+ response.progress = structuredProgress;
65
+ }
66
+ return;
67
+ }
68
+ if (typeof this.scheduler.getLiveProgressEvents === 'function') {
69
+ const liveEvents = this.scheduler.getLiveProgressEvents(job.id, 1);
70
+ const lastEvent = liveEvents[liveEvents.length - 1];
71
+ if (lastEvent) {
72
+ const structuredProgress = toStructuredProgress(lastEvent, 'running');
73
+ if (structuredProgress) {
74
+ response.progress = structuredProgress;
75
+ }
76
+ }
77
+ }
78
+ }
79
+ catch {
80
+ // Ignore progress file errors; status remains resilient
81
+ }
82
+ }
83
+ addArtifactInfo(response, job) {
84
+ if (!(job.status === 'completed' || job.status === 'failed')) {
85
+ return;
86
+ }
87
+ const runDir = job.resultDir || path.join(this.config.resultsDir, job.id);
88
+ const metadata = getRunArtifactMetadata(job.id, runDir, STATUS_KEY_FILES, true);
89
+ const keyFileAvailability = STATUS_KEY_FILES.reduce((acc, fileName) => {
90
+ acc[fileName] = metadata[fileName]?.exists === true && metadata[fileName].size > 0;
91
+ return acc;
92
+ }, {});
93
+ response.artifacts = {
94
+ metadataJson: keyFileAvailability['metadata.json'],
95
+ analysisMd: keyFileAvailability['analysis.md'],
96
+ resultSummaryMd: keyFileAvailability['result-summary.md'],
97
+ failureJson: keyFileAvailability['failure.json'],
98
+ stderrLog: keyFileAvailability['stderr.log'],
99
+ availableFiles: STATUS_KEY_FILES.filter((fileName) => keyFileAvailability[fileName]),
100
+ };
101
+ if (job.status === 'failed') {
102
+ if (keyFileAvailability['failure.json']) {
103
+ response.diagnosticEntryPoint = 'failure.json';
104
+ }
105
+ else if (keyFileAvailability['analysis.md']) {
106
+ response.diagnosticEntryPoint = 'analysis.md';
107
+ }
108
+ else if (keyFileAvailability['result-summary.md']) {
109
+ response.diagnosticEntryPoint = 'result-summary.md';
110
+ }
111
+ }
112
+ }
113
+ readMetadata(runDir) {
114
+ try {
115
+ const metadataPath = path.join(runDir, 'metadata.json');
116
+ if (fs.existsSync(metadataPath)) {
117
+ return JSON.parse(fs.readFileSync(metadataPath, 'utf-8'));
118
+ }
119
+ }
120
+ catch {
121
+ // Ignore metadata read errors
122
+ }
123
+ return {};
124
+ }
125
+ resolveExitCode(job, runDir) {
126
+ if (job.exitCode !== undefined && job.exitCode !== null) {
127
+ return job.exitCode;
128
+ }
129
+ if (!(job.status === 'completed' || job.status === 'failed')) {
130
+ return null;
131
+ }
132
+ try {
133
+ const metadataPath = path.join(runDir, 'metadata.json');
134
+ const metadata = fs.existsSync(metadataPath)
135
+ ? JSON.parse(fs.readFileSync(metadataPath, 'utf-8'))
136
+ : {};
137
+ return resolveInstanceExitCode(runDir, metadata);
138
+ }
139
+ catch {
140
+ return null;
141
+ }
142
+ }
143
+ }
144
+ //# sourceMappingURL=status-response-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-response-builder.js","sourceRoot":"","sources":["../../src/utils/status-response-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Type guard utilities for common type checks.
3
+ * Reduces verbosity and provides reusable predicates across the codebase.
4
+ */
5
+ /**
6
+ * Check if value is a string.
7
+ */
8
+ export declare const isString: (value: unknown) => value is string;
9
+ /**
10
+ * Check if value is a number.
11
+ */
12
+ export declare const isNumber: (value: unknown) => value is number;
13
+ /**
14
+ * Check if value is a boolean.
15
+ */
16
+ export declare const isBoolean: (value: unknown) => value is boolean;
17
+ /**
18
+ * Check if value is a record (plain object).
19
+ */
20
+ export declare const isRecord: (value: unknown) => value is Record<string, unknown>;
21
+ /**
22
+ * Check if value is an array.
23
+ */
24
+ export declare const isArray: (value: unknown) => value is unknown[];
25
+ /**
26
+ * Check if value is an array of strings.
27
+ */
28
+ export declare const isStringArray: (value: unknown) => value is string[];
29
+ /**
30
+ * Check if value is an array of objects (records).
31
+ */
32
+ export declare const isRecordArray: (value: unknown) => value is Record<string, unknown>[];
33
+ /**
34
+ * Check if value is an object with specific keys (shallow validation).
35
+ */
36
+ export declare const hasKeys: (value: unknown, ...keys: string[]) => value is Record<string, unknown>;
37
+ //# sourceMappingURL=type-guards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-guards.d.ts","sourceRoot":"","sources":["../../src/utils/type-guards.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAmC,CAAC;AAEvF;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAmC,CAAC;AAEvF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,OAAqC,CAAC;AAE1F;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAExE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,OAAO,EAA0B,CAAC;AAEpF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,EAE7D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE9E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,EAAE,GAAG,MAAM,MAAM,EAAE,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAE1F,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Type guard utilities for common type checks.
3
+ * Reduces verbosity and provides reusable predicates across the codebase.
4
+ */
5
+ /**
6
+ * Check if value is a string.
7
+ */
8
+ export const isString = (value) => typeof value === 'string';
9
+ /**
10
+ * Check if value is a number.
11
+ */
12
+ export const isNumber = (value) => typeof value === 'number';
13
+ /**
14
+ * Check if value is a boolean.
15
+ */
16
+ export const isBoolean = (value) => typeof value === 'boolean';
17
+ /**
18
+ * Check if value is a record (plain object).
19
+ */
20
+ export const isRecord = (value) => {
21
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
22
+ };
23
+ /**
24
+ * Check if value is an array.
25
+ */
26
+ export const isArray = (value) => Array.isArray(value);
27
+ /**
28
+ * Check if value is an array of strings.
29
+ */
30
+ export const isStringArray = (value) => {
31
+ return Array.isArray(value) && value.every((item) => typeof item === 'string');
32
+ };
33
+ /**
34
+ * Check if value is an array of objects (records).
35
+ */
36
+ export const isRecordArray = (value) => {
37
+ return Array.isArray(value) && value.every((item) => isRecord(item));
38
+ };
39
+ /**
40
+ * Check if value is an object with specific keys (shallow validation).
41
+ */
42
+ export const hasKeys = (value, ...keys) => {
43
+ return isRecord(value) && keys.every((key) => key in value);
44
+ };
45
+ //# sourceMappingURL=type-guards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-guards.js","sourceRoot":"","sources":["../../src/utils/type-guards.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;AAEvF;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC;AAEvF;;GAEG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAoB,EAAE,CAAC,OAAO,KAAK,KAAK,SAAS,CAAC;AAE1F;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE;IAC3E,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAc,EAAsB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEpF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAqB,EAAE;IACjE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;AACjF,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAsC,EAAE;IAClF,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,GAAG,IAAc,EAAoC,EAAE;IAC7F,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC;AAC9D,CAAC,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * UTF-8 safe string encoding/decoding utilities.
3
+ * Handles proper UTF-8 sequence detection to prevent breaking multi-byte characters.
4
+ */
5
+ /**
6
+ * Safely decode a buffer tail to UTF-8, avoiding partial UTF-8 sequences.
7
+ * If the buffer ends in the middle of a multi-byte UTF-8 sequence,
8
+ * the incomplete sequence is truncated.
9
+ *
10
+ * @param buffer Buffer to decode
11
+ * @returns UTF-8 string without incomplete sequences at the end
12
+ */
13
+ export declare function decodeUtf8TailSafely(buffer: Buffer): string;
14
+ /**
15
+ * Extract the last N lines from a string.
16
+ *
17
+ * @param content String content to extract from
18
+ * @param maxLines Maximum number of lines to return
19
+ * @returns Last N lines of the content (or entire content if fewer lines)
20
+ */
21
+ export declare function tailLogByLines(content: string, maxLines: number): string;
22
+ /**
23
+ * Read the tail bytes of a file into a buffer.
24
+ * Useful for reading last N bytes of a large file without loading entire file.
25
+ *
26
+ * @param logFile Path to the file
27
+ * @param size Total size of the file (from fs.statSync)
28
+ * @param maxSize Maximum bytes to read
29
+ * @returns Buffer containing the tail bytes
30
+ */
31
+ export declare function readTailBytes(logFile: string, size: number, maxSize: number): Buffer;
32
+ //# sourceMappingURL=utf8-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utf8-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/utf8-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuBH;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA2B3D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUxE;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAUpF"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * UTF-8 safe string encoding/decoding utilities.
3
+ * Handles proper UTF-8 sequence detection to prevent breaking multi-byte characters.
4
+ */
5
+ import * as fs from 'fs';
6
+ /**
7
+ * Check if a byte is a UTF-8 continuation byte.
8
+ * Continuation bytes have the pattern 10xxxxxx (0x80-0xBF).
9
+ */
10
+ function isUtf8ContinuationByte(byte) {
11
+ return (byte & 0xc0) === 0x80;
12
+ }
13
+ /**
14
+ * Determine the expected length of a UTF-8 sequence from its leading byte.
15
+ */
16
+ function utf8SequenceLength(leadingByte) {
17
+ if ((leadingByte & 0x80) === 0)
18
+ return 1; // Single-byte: 0xxxxxxx
19
+ if ((leadingByte & 0xe0) === 0xc0)
20
+ return 2; // Two-byte: 110xxxxx
21
+ if ((leadingByte & 0xf0) === 0xe0)
22
+ return 3; // Three-byte: 1110xxxx
23
+ if ((leadingByte & 0xf8) === 0xf0)
24
+ return 4; // Four-byte: 11110xxx
25
+ return 1; // Invalid; treat as single-byte
26
+ }
27
+ /**
28
+ * Safely decode a buffer tail to UTF-8, avoiding partial UTF-8 sequences.
29
+ * If the buffer ends in the middle of a multi-byte UTF-8 sequence,
30
+ * the incomplete sequence is truncated.
31
+ *
32
+ * @param buffer Buffer to decode
33
+ * @returns UTF-8 string without incomplete sequences at the end
34
+ */
35
+ export function decodeUtf8TailSafely(buffer) {
36
+ let end = buffer.length;
37
+ if (end > 0) {
38
+ let continuationCount = 0;
39
+ let candidateLead = end - 1;
40
+ // Count continuation bytes at the end
41
+ while (candidateLead >= 0 && isUtf8ContinuationByte(buffer[candidateLead])) {
42
+ continuationCount++;
43
+ candidateLead--;
44
+ }
45
+ if (candidateLead < 0) {
46
+ // All bytes are continuation bytes; skip all
47
+ end = 0;
48
+ }
49
+ else {
50
+ const sequenceLength = utf8SequenceLength(buffer[candidateLead]);
51
+ const expectedContinuationCount = sequenceLength - 1;
52
+ // If the continuation byte count doesn't match the expected count, truncate
53
+ if (sequenceLength > 1 && continuationCount !== expectedContinuationCount) {
54
+ end = candidateLead;
55
+ }
56
+ }
57
+ }
58
+ return buffer.subarray(0, end).toString('utf-8');
59
+ }
60
+ /**
61
+ * Extract the last N lines from a string.
62
+ *
63
+ * @param content String content to extract from
64
+ * @param maxLines Maximum number of lines to return
65
+ * @returns Last N lines of the content (or entire content if fewer lines)
66
+ */
67
+ export function tailLogByLines(content, maxLines) {
68
+ if (maxLines <= 0) {
69
+ return '';
70
+ }
71
+ const lines = content.split(/\r?\n/);
72
+ if (lines.length <= maxLines) {
73
+ return content;
74
+ }
75
+ return lines.slice(-maxLines).join('\n');
76
+ }
77
+ /**
78
+ * Read the tail bytes of a file into a buffer.
79
+ * Useful for reading last N bytes of a large file without loading entire file.
80
+ *
81
+ * @param logFile Path to the file
82
+ * @param size Total size of the file (from fs.statSync)
83
+ * @param maxSize Maximum bytes to read
84
+ * @returns Buffer containing the tail bytes
85
+ */
86
+ export function readTailBytes(logFile, size, maxSize) {
87
+ const truncated = Buffer.alloc(maxSize);
88
+ const fd = fs.openSync(logFile, 'r');
89
+ try {
90
+ fs.readSync(fd, truncated, 0, maxSize, size - maxSize);
91
+ }
92
+ finally {
93
+ fs.closeSync(fd);
94
+ }
95
+ return truncated;
96
+ }
97
+ //# sourceMappingURL=utf8-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utf8-helpers.js","sourceRoot":"","sources":["../../src/utils/utf8-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { WebhookPayload } from '../kaseki-api-types';
2
+ /**
3
+ * Factory functions for creating webhook event payloads.
4
+ * Consolidates webhook event creation logic across job-scheduler.ts.
5
+ */
6
+ /**
7
+ * Create a JOB_SUBMITTED event payload.
8
+ */
9
+ export declare function createJobSubmittedEvent(jobId: string): WebhookPayload;
10
+ /**
11
+ * Create a JOB_STARTED event payload.
12
+ */
13
+ export declare function createJobStartedEvent(jobId: string): WebhookPayload;
14
+ /**
15
+ * Create a JOB_COMPLETED event payload.
16
+ */
17
+ export declare function createJobCompletedEvent(jobId: string, exitCode?: number | null): WebhookPayload;
18
+ /**
19
+ * Create a JOB_CANCELLED event payload.
20
+ */
21
+ export declare function createJobCancelledEvent(jobId: string, error?: string): WebhookPayload;
22
+ /**
23
+ * Create a JOB_FAILED event payload.
24
+ */
25
+ export declare function createJobFailedEvent(jobId: string, failureClass?: string, error?: string, exitCode?: number): WebhookPayload;
26
+ //# sourceMappingURL=webhook-event-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-event-builder.d.ts","sourceRoot":"","sources":["../../src/utils/webhook-event-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEvE;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CASrE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,CASnE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAU/F;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,CAWrF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc,CAYhB"}