@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
package/docs/CLI.md ADDED
@@ -0,0 +1,569 @@
1
+ # Kaseki CLI - Live Agent Monitoring
2
+
3
+ The **Kaseki CLI** is a command-line tool that allows external AI agents to query running and completed kaseki instances in real-time. It provides structured JSON output for easy integration into monitoring scripts and agent workflows.
4
+
5
+ ## Overview
6
+
7
+ - **Query running instances**: Get current stage, elapsed time, timeout risk
8
+ - **Detect errors**: Identify failures in stderr, validation, quality gates, and secret scans
9
+ - **Anomaly detection**: Flag timeout risk as the Pi agent approaches timeout
10
+ - **Log streaming**: Follow logs in real-time as they're written
11
+ - **Progress streaming**: Read sanitized stage and Pi tool progress without model text
12
+ - **Post-run analysis**: Comprehensive summary of changes, validation results, and Pi metrics
13
+
14
+ ## Installation
15
+
16
+ The CLI is implemented as Node.js scripts and included in the kaseki-agent repository:
17
+
18
+ ```bash
19
+ # Make scripts executable
20
+ chmod +x kaseki-cli.js kaseki-cli-lib.js
21
+
22
+ # Add to PATH (optional)
23
+ export PATH="/workspaces/kaseki-agent:$PATH"
24
+ ```
25
+
26
+ On Pi hosts that do not have Node.js installed, use the `kaseki` wrapper
27
+ deployed with the template. It runs the CLI inside the configured Kaseki Docker
28
+ image. Prefer this wrapper in Pi runbooks:
29
+
30
+ ```bash
31
+ /agents/kaseki-template/kaseki list
32
+ /agents/kaseki-template/kaseki status kaseki-1
33
+ /agents/kaseki-template/kaseki analysis kaseki-1
34
+ ```
35
+
36
+ ## Core Library (`kaseki-cli-lib.js`)
37
+
38
+ The library provides direct programmatic access. Use this for custom integration:
39
+
40
+ ```javascript
41
+ const kasekiCli = require('./kaseki-cli-lib.js');
42
+
43
+ // List all instances
44
+ const instances = kasekiCli.listInstances();
45
+
46
+ // Get status of a running instance
47
+ const status = kasekiCli.getInstanceStatus('kaseki-1');
48
+
49
+ // Detect errors
50
+ const errors = kasekiCli.detectErrors('kaseki-1');
51
+
52
+ // Get anomalies (timeout risk, etc.)
53
+ const anomalies = kasekiCli.detectAnomalies('kaseki-1');
54
+
55
+ // Post-run analysis
56
+ const analysis = kasekiCli.getAnalysis('kaseki-1');
57
+ ```
58
+
59
+ ## CLI Commands
60
+
61
+ ### `list`
62
+
63
+ List all kaseki instances (running and completed).
64
+
65
+ ```bash
66
+ ./kaseki-cli.js list
67
+ ```
68
+
69
+ **Output**:
70
+
71
+ ```
72
+ Instance Status Stage Elapsed (s) Exit Code Model
73
+ kaseki-2 running Running Pi agent 1050 — openrouter/claude-...
74
+ kaseki-1 completed Collecting artifacts 300 0 openrouter/claude-...
75
+ ```
76
+
77
+ ### `status <instance>`
78
+
79
+ Get detailed status of a specific instance (JSON format).
80
+
81
+ ```bash
82
+ ./kaseki-cli.js status kaseki-1
83
+ ```
84
+
85
+ **Output**:
86
+
87
+ ```json
88
+ {
89
+ "instance": "kaseki-1",
90
+ "running": false,
91
+ "stage": "Collecting artifacts",
92
+ "elapsedSeconds": 300,
93
+ "totalDurationSeconds": 300,
94
+ "agentElapsedSeconds": 120,
95
+ "timeoutSeconds": 1200,
96
+ "timeoutRiskPercent": 10.0,
97
+ "timeoutImminent": false,
98
+ "timedOut": false,
99
+ "exitCode": 0,
100
+ "failureClass": "none",
101
+ "repo": "CyanAutomation/crudmapper",
102
+ "ref": "main",
103
+ "model": "openrouter/claude-3.5-sonnet"
104
+ }
105
+ ```
106
+
107
+ `repo` prefers `host-start.json.repo_url` (fallback: `repo`), and `ref` prefers `host-start.json.git_ref` (fallback: `ref`).
108
+ `failureClass` is `none` for successful runs and a stable controller-facing
109
+ category such as `validation`, `timeout`, `empty-diff`, `quality`,
110
+ `secret-scan`, `github`, or `credentials` for failures.
111
+
112
+ For read-only controller tasks, launch with `KASEKI_TASK_MODE=inspect` or
113
+ `KASEKI_ALLOW_EMPTY_DIFF=1` so an empty git diff is treated as success.
114
+ Set `KASEKI_VALIDATION_COMMANDS=none` when validation should be skipped.
115
+
116
+ ### `logs <instance> [options]`
117
+
118
+ Display recent log lines (tail).
119
+
120
+ ```bash
121
+ # Show last 50 lines of stdout
122
+ ./kaseki-cli.js logs kaseki-1
123
+
124
+ # Show last 100 lines
125
+ ./kaseki-cli.js logs kaseki-1 --tail=100
126
+
127
+ # Show last 20 lines of validation.log
128
+ ./kaseki-cli.js logs kaseki-1 --file=validation.log --tail=20
129
+ ```
130
+
131
+ ### `progress <instance> [options]`
132
+
133
+ Display sanitized progress events from `progress.jsonl`.
134
+
135
+ ```bash
136
+ ./kaseki-cli.js progress kaseki-1
137
+ ./kaseki-cli.js progress kaseki-1 --tail=25
138
+ ```
139
+
140
+ Progress events include stage starts/finishes, Pi event counts, and tool
141
+ start/end counts. They intentionally do not include assistant text, thinking
142
+ content, environment values, or secrets.
143
+
144
+ ### `errors <instance>`
145
+
146
+ Detect and list errors (JSON format).
147
+
148
+ ```bash
149
+ ./kaseki-cli.js errors kaseki-1
150
+ ```
151
+
152
+ **Output**:
153
+
154
+ ```json
155
+ {
156
+ "instance": "kaseki-1",
157
+ "errorCount": 2,
158
+ "errors": [
159
+ {
160
+ "severity": "error",
161
+ "source": "stderr",
162
+ "message": "Error: Build failed",
163
+ "line": 42
164
+ },
165
+ {
166
+ "severity": "critical",
167
+ "source": "quality-gate",
168
+ "message": "Diff exceeds maximum size"
169
+ }
170
+ ]
171
+ }
172
+ ```
173
+
174
+ **Error sources**:
175
+
176
+ - `stderr` — errors from stderr.log
177
+ - `validation` — validation command failures
178
+ - `quality-gate` — quality gate violations (diff size, allowlist, format)
179
+ - `secret-scan` — credential leaks detected
180
+ - `timeout` — agent timeout (exit code 124)
181
+
182
+ ### `analysis <instance>`
183
+
184
+ Get comprehensive post-run analysis (JSON format).
185
+
186
+ ```bash
187
+ ./kaseki-cli.js analysis kaseki-1
188
+ ```
189
+
190
+ **Output**:
191
+
192
+ ```json
193
+ {
194
+ "instance": "kaseki-1",
195
+ "duration": 300,
196
+ "exitCode": 0,
197
+ "model": "openrouter/claude-3.5-sonnet",
198
+ "repo": "CyanAutomation/crudmapper",
199
+ "ref": "main",
200
+ "changedFiles": [
201
+ "src/lib/parser.ts",
202
+ "tests/parser.test.ts"
203
+ ],
204
+ "changedFileCount": 2,
205
+ "diffSizeBytes": 2150,
206
+ "diffSizeKb": 2,
207
+ "validationCommands": [
208
+ {
209
+ "command": "npm run check",
210
+ "exitCode": 0,
211
+ "durationSeconds": 10,
212
+ "passed": true
213
+ }
214
+ ],
215
+ "stageTimings": [
216
+ {
217
+ "stage": "prepare node dependencies",
218
+ "exitCode": 0,
219
+ "durationSeconds": 47,
220
+ "detail": "workspace-cache-hit"
221
+ }
222
+ ],
223
+ "piMetrics": {
224
+ "toolStartCount": 8,
225
+ "toolEndCount": 8,
226
+ "eventCount": 65
227
+ },
228
+ "errors": [],
229
+ "errorCount": 0,
230
+ "criticalErrors": 0
231
+ }
232
+ ```
233
+
234
+ `repo` prefers `host-start.json.repo_url` (fallback: `repo`), and `ref` prefers `host-start.json.git_ref` (fallback: `ref`).
235
+
236
+ ### `watch <instance> [options]`
237
+
238
+ Live monitor an instance with periodic status updates and anomaly alerts.
239
+
240
+ ```bash
241
+ # Poll every 5 seconds (default)
242
+ ./kaseki-cli.js watch kaseki-1
243
+
244
+ # Poll every 2 seconds
245
+ ./kaseki-cli.js watch kaseki-1 --interval=2
246
+ ```
247
+
248
+ **Output** (updates every interval):
249
+
250
+ ```
251
+ Watching kaseki-1 (updating every 5s, Ctrl+C to stop)...
252
+
253
+ [2026-04-25T14:23:45.123Z] Stage: Running Pi agent
254
+ Elapsed: 1050s / 1200s
255
+ Timeout: 87.5%
256
+ Status: RUNNING
257
+ ⚠ [WARNING] Timeout approaching: 1050s / 1200s (87.5%)
258
+
259
+ [2026-04-25T14:23:50.456Z] Stage: Running validation
260
+ Elapsed: 1055s / 1200s
261
+ Status: RUNNING
262
+ ```
263
+
264
+ ### `follow <instance> [options]`
265
+
266
+ Stream logs in real-time as they're written.
267
+
268
+ ```bash
269
+ # Follow stdout.log
270
+ ./kaseki-cli.js follow kaseki-1
271
+
272
+ # Follow validation.log
273
+ ./kaseki-cli.js follow kaseki-1 --tail=validation.log
274
+ ```
275
+
276
+ ---
277
+
278
+ ## External AI Agent Integration
279
+
280
+ ### Pattern 1: Polling Status
281
+
282
+ An external agent can poll kaseki status at regular intervals:
283
+
284
+ ```bash
285
+ #!/bin/bash
286
+ # monitor-kaseki.sh - Monitor kaseki instance from external agent
287
+
288
+ INSTANCE=$1
289
+ POLL_INTERVAL=${2:-5} # Default 5 seconds
290
+ MAX_ATTEMPTS=${3:-240} # Default 2 hours (240 * 5s)
291
+
292
+ ATTEMPT=0
293
+ while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do
294
+ STATUS=$(./kaseki-cli.js status $INSTANCE)
295
+
296
+ # Parse JSON
297
+ RUNNING=$(echo $STATUS | jq -r '.running')
298
+ STAGE=$(echo $STATUS | jq -r '.stage')
299
+ TIMEOUT_RISK=$(echo $STATUS | jq -r '.timeoutRiskPercent')
300
+ EXIT_CODE=$(echo $STATUS | jq -r '.exitCode')
301
+ FAILURE_CLASS=$(echo $STATUS | jq -r '.failureClass')
302
+
303
+ echo "[$INSTANCE] Stage: $STAGE | Timeout Risk: ${TIMEOUT_RISK}% | Failure: $FAILURE_CLASS"
304
+
305
+ # Detect timeout imminent
306
+ if (( $(echo "$TIMEOUT_RISK >= 85" | bc -l) )); then
307
+ echo "⚠ ALERT: Timeout approaching ($TIMEOUT_RISK%)"
308
+ # Take action: notify, scale resources, etc.
309
+ fi
310
+
311
+ # Check if completed
312
+ if [ "$RUNNING" = "false" ]; then
313
+ echo "✓ Instance completed with exit code: $EXIT_CODE"
314
+ break
315
+ fi
316
+
317
+ sleep $POLL_INTERVAL
318
+ ((ATTEMPT++))
319
+ done
320
+
321
+ # Post-run analysis
322
+ ANALYSIS=$(./kaseki-cli.js analysis $INSTANCE)
323
+ ERRORS=$(echo $ANALYSIS | jq -r '.errorCount')
324
+ echo "Final analysis: $ERRORS errors detected"
325
+ ```
326
+
327
+ ### Pattern 2: Error Detection and Reaction
328
+
329
+ React to detected errors:
330
+
331
+ ```bash
332
+ #!/bin/bash
333
+ # react-to-errors.sh
334
+
335
+ INSTANCE=$1
336
+
337
+ ERRORS=$(./kaseki-cli.js errors $INSTANCE)
338
+ ERROR_COUNT=$(echo $ERRORS | jq -r '.errorCount')
339
+
340
+ if [ "$ERROR_COUNT" -gt 0 ]; then
341
+ CRITICAL=$(echo $ERRORS | jq '[.errors[] | select(.severity == "critical")] | length')
342
+
343
+ if [ "$CRITICAL" -gt 0 ]; then
344
+ echo "❌ Critical errors detected: $CRITICAL"
345
+ # Escalate, rollback, notify team, etc.
346
+ else
347
+ echo "⚠ Non-critical errors detected: $(($ERROR_COUNT - $CRITICAL))"
348
+ fi
349
+ fi
350
+ ```
351
+
352
+ ### Pattern 3: Library Import in Node.js Agent
353
+
354
+ Use the library directly in a Node.js agent:
355
+
356
+ ```javascript
357
+ const kasekiCli = require('./kaseki-cli-lib.js');
358
+
359
+ async function monitorKaseki(instanceName) {
360
+ const pollInterval = 5000; // 5 seconds
361
+
362
+ while (true) {
363
+ const status = kasekiCli.getInstanceStatus(instanceName);
364
+
365
+ if (status.error) {
366
+ console.error(`Error: ${status.error}`);
367
+ break;
368
+ }
369
+
370
+ console.log(`[${instanceName}] Stage: ${status.stage} | Timeout: ${status.timeoutRiskPercent.toFixed(1)}%`);
371
+
372
+ // Check for timeout risk
373
+ if (status.timeoutImminent) {
374
+ console.warn(`⚠ ALERT: Timeout imminent (${status.elapsedSeconds}s / ${status.timeoutSeconds}s)`);
375
+ // Handle timeout risk
376
+ }
377
+
378
+ // Check for errors
379
+ const errors = kasekiCli.detectErrors(instanceName);
380
+ if (errors.length > 0) {
381
+ console.warn(`✗ ${errors.length} error(s) detected`);
382
+ errors.forEach((e) => console.warn(` - [${e.severity}] ${e.source}: ${e.message}`));
383
+ }
384
+
385
+ // Exit when complete
386
+ if (!status.running) {
387
+ const analysis = kasekiCli.getAnalysis(instanceName);
388
+ console.log(`✓ Completed: ${analysis.changedFileCount} files changed, ${analysis.errorCount} errors`);
389
+ break;
390
+ }
391
+
392
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
393
+ }
394
+ }
395
+
396
+ monitorKaseki('kaseki-1');
397
+ ```
398
+
399
+ ---
400
+
401
+ ## Output Formats
402
+
403
+ ### Status Object
404
+
405
+ ```json
406
+ {
407
+ "instance": "kaseki-1",
408
+ "running": boolean,
409
+ "stage": "string",
410
+ "elapsedSeconds": number,
411
+ "totalDurationSeconds": number,
412
+ "agentElapsedSeconds": number | null,
413
+ "timeoutSeconds": number,
414
+ "timeoutRiskPercent": number (0-100),
415
+ "timeoutImminent": boolean,
416
+ "timedOut": boolean,
417
+ "exitCode": number | null,
418
+ "repo": "string",
419
+ "ref": "string",
420
+ "model": "string"
421
+ }
422
+ ```
423
+
424
+ Field source note: `repo` is read from `host-start.json.repo_url` with fallback to `host-start.json.repo`; `ref` is read from `host-start.json.git_ref` with fallback to `host-start.json.ref`.
425
+
426
+ ### Error Object
427
+
428
+ ```json
429
+ {
430
+ "severity": "critical" | "error" | "warning",
431
+ "source": "stderr" | "validation" | "quality-gate" | "secret-scan" | "timeout",
432
+ "message": "string",
433
+ "line": number | null
434
+ }
435
+ ```
436
+
437
+ ### Anomaly Object
438
+
439
+ ```json
440
+ {
441
+ "type": "timeout-risk" | "timeout",
442
+ "severity": "warning" | "critical",
443
+ "message": "string"
444
+ }
445
+ ```
446
+
447
+ Timeout anomalies use Pi agent elapsed time rather than total run time. When a
448
+ completed run timed out after slow setup or artifact collection, the message also
449
+ includes total run duration separately.
450
+
451
+ ---
452
+
453
+ ## Configuration
454
+
455
+ ### Directory Structure
456
+
457
+ The CLI looks for instances in:
458
+
459
+ - Results: `/agents/kaseki-results/kaseki-N/`
460
+ - Workspace: `/agents/kaseki-runs/kaseki-N/` (optional, for running instances)
461
+
462
+ ### Testing Mode
463
+
464
+ To test with custom directories:
465
+
466
+ ```javascript
467
+ const kasekiCli = require('./kaseki-cli-lib.js');
468
+
469
+ // Override config for testing
470
+ kasekiCli.config.KASEKI_RESULTS_DIR = '/custom/path/kaseki-results';
471
+ ```
472
+
473
+ ---
474
+
475
+ ## Examples
476
+
477
+ ### Example 1: Monitor and Alert
478
+
479
+ ```bash
480
+ #!/bin/bash
481
+ while true; do
482
+ STATUS=$(./kaseki-cli.js status kaseki-1 | jq -r '.timeoutRiskPercent')
483
+ if (( $(echo "$STATUS > 85" | bc -l) )); then
484
+ echo "🚨 Timeout risk: $STATUS%" | mail -s "Kaseki Alert" ops@team.com
485
+ fi
486
+ sleep 10
487
+ done
488
+ ```
489
+
490
+ ### Example 2: Parse Changes from Completed Run
491
+
492
+ ```bash
493
+ ANALYSIS=$(./kaseki-cli.js analysis kaseki-1)
494
+ echo "Changed files:"
495
+ echo $ANALYSIS | jq -r '.changedFiles[]'
496
+ echo "Diff size: $(echo $ANALYSIS | jq '.diffSizeKb') KB"
497
+ ```
498
+
499
+ ### Example 3: Combine Status + Errors
500
+
501
+ ```bash
502
+ ./kaseki-cli.js status kaseki-1 > /tmp/status.json
503
+ ./kaseki-cli.js errors kaseki-1 > /tmp/errors.json
504
+ ./kaseki-cli.js analysis kaseki-1 > /tmp/analysis.json
505
+
506
+ # Process combined data
507
+ jq -s '. as $data | {status: $data[0], errors: $data[1], analysis: $data[2]}' \
508
+ /tmp/status.json /tmp/errors.json /tmp/analysis.json
509
+ ```
510
+
511
+ ---
512
+
513
+ ## Troubleshooting
514
+
515
+ ### "Instance not found"
516
+
517
+ - Verify instance name matches format `kaseki-N` where N is digits
518
+ - Check that `/agents/kaseki-results/kaseki-N/` directory exists
519
+
520
+ ### Empty results for running instances
521
+
522
+ - Stage extraction requires `==>` markers in stdout.log
523
+ - Elapsed time estimation requires `metadata.json` with `start_time`
524
+
525
+ ### Docker ps errors
526
+
527
+ - Docker may not be available (safe to ignore in test environments)
528
+ - Running check falls back to checking workspace directory existence
529
+
530
+ ---
531
+
532
+ ## Architecture
533
+
534
+ The CLI is split into two parts:
535
+
536
+ 1. **`kaseki-cli-lib.js`** — Core query library
537
+ - 600+ lines of reusable functions
538
+ - No side effects, all I/O is read-only
539
+ - Suitable for programmatic use and testing
540
+
541
+ 2. **`kaseki-cli.js`** — CLI executable
542
+ - Command-line interface using library
543
+ - Formats output (JSON, tables, streaming)
544
+ - Handles user options and arguments
545
+
546
+ ---
547
+
548
+ ## Performance Notes
549
+
550
+ - **listInstances()**: Scans `/agents/kaseki-results/` directory; O(n) where n = number of instances
551
+ - **readLiveLog()**: Tail only; avoids re-reading entire logs
552
+ - **getInstanceStatus()**: Lightweight; reads small JSON files and parses stage from logs
553
+ - **detectErrors()**: Scans stderr and error files; proportional to log size
554
+ - **getAnalysis()**: Collects data from multiple artifacts; good for post-run analysis
555
+
556
+ Suitable for:
557
+
558
+ - Polling every 5-10 seconds during runs
559
+ - Real-time log streaming
560
+ - Post-run batch analysis
561
+
562
+ ---
563
+
564
+ ## Future Enhancements
565
+
566
+ - **Baseline timing data**: Store per-stage historical medians for anomaly detection
567
+ - **Webhook integration**: Callback external services on status changes
568
+ - **Metrics export**: Prometheus-compatible metrics for monitoring stacks
569
+ - **Sub-task progress**: Real-time visibility into Pi agent tool invocations (requires enhanced logging)