@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,266 @@
1
+ /**
2
+ * Docker Manager
3
+ *
4
+ * Handles Docker operations: image pulling, container spawning, log streaming
5
+ */
6
+ import { execSync, spawn } from 'child_process';
7
+ import { createLogger } from '../logger.js';
8
+ const logger = createLogger('docker');
9
+ export class DockerManager {
10
+ /**
11
+ * Check if Docker is available and daemon is running
12
+ */
13
+ static isDockerAvailable() {
14
+ try {
15
+ execSync('docker ps > /dev/null 2>&1', { shell: '/bin/bash' });
16
+ return true;
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ /**
23
+ * Pull Docker image (with retry logic)
24
+ */
25
+ static pullImage(image, maxRetries = 3) {
26
+ logger.info(`Pulling Docker image: ${image}`);
27
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
28
+ try {
29
+ execSync(`docker pull ${image}`, {
30
+ stdio: 'inherit',
31
+ timeout: 5 * 60 * 1000, // 5 minute timeout
32
+ });
33
+ logger.info(`Successfully pulled image: ${image}`);
34
+ return true;
35
+ }
36
+ catch (error) {
37
+ if (attempt < maxRetries) {
38
+ logger.warn(`Pull attempt ${attempt} failed. Retrying...`);
39
+ }
40
+ else {
41
+ logger.error(`Failed to pull image after ${maxRetries} attempts: ${error}`);
42
+ return false;
43
+ }
44
+ }
45
+ }
46
+ return false;
47
+ }
48
+ /**
49
+ * Check if Docker image exists locally
50
+ */
51
+ static imageExists(image) {
52
+ try {
53
+ execSync(`docker inspect ${image} > /dev/null 2>&1`, { shell: '/bin/bash' });
54
+ return true;
55
+ }
56
+ catch {
57
+ return false;
58
+ }
59
+ }
60
+ /**
61
+ * Get Docker image ID
62
+ */
63
+ static getImageId(image) {
64
+ try {
65
+ const id = execSync(`docker inspect -f '{{.ID}}' ${image}`, {
66
+ encoding: 'utf-8',
67
+ }).trim();
68
+ return id || null;
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ /**
75
+ * Run Docker container and stream output
76
+ */
77
+ static async runContainer(config) {
78
+ logger.debug(`Running container: ${config.name}`);
79
+ // Ensure directories exist
80
+ this.ensureDirectories(config.workspaceDir, config.resultsDir, config.cacheDir);
81
+ // Build Docker run command
82
+ const dockerArgs = this.buildDockerArgs(config);
83
+ logger.debug(`Docker command: docker run ${dockerArgs.join(' ')}`);
84
+ return new Promise((resolve) => {
85
+ let stdout = '';
86
+ let stderr = '';
87
+ const child = spawn('docker', ['run', ...dockerArgs], {
88
+ stdio: ['ignore', 'pipe', 'pipe'],
89
+ timeout: (config.timeout || 1200) * 1000,
90
+ });
91
+ // Collect stdout
92
+ if (child.stdout) {
93
+ child.stdout.on('data', (data) => {
94
+ const text = data.toString();
95
+ stdout += text;
96
+ // Also stream to console for real-time feedback
97
+ process.stdout.write(text);
98
+ });
99
+ }
100
+ // Collect stderr
101
+ if (child.stderr) {
102
+ child.stderr.on('data', (data) => {
103
+ const text = data.toString();
104
+ stderr += text;
105
+ process.stderr.write(text);
106
+ });
107
+ }
108
+ // Handle completion
109
+ child.on('exit', (code) => {
110
+ resolve({
111
+ exitCode: code ?? 1,
112
+ stdout,
113
+ stderr,
114
+ });
115
+ });
116
+ // Handle errors
117
+ child.on('error', (error) => {
118
+ logger.error(`Failed to spawn docker: ${error.message}`);
119
+ resolve({
120
+ exitCode: 1,
121
+ stdout,
122
+ stderr: error.message,
123
+ });
124
+ });
125
+ // Handle timeout
126
+ child.on('timeout', () => {
127
+ logger.warn(`Container timeout after ${config.timeout} seconds`);
128
+ child.kill('SIGTERM');
129
+ resolve({
130
+ exitCode: 124,
131
+ stdout,
132
+ stderr: `Container timeout after ${config.timeout} seconds`,
133
+ });
134
+ });
135
+ });
136
+ }
137
+ /**
138
+ * Build Docker run arguments
139
+ */
140
+ static buildDockerArgs(config) {
141
+ const args = [];
142
+ // Container name
143
+ args.push('--name', config.name);
144
+ // Security flags (from run-kaseki.sh)
145
+ args.push('--read-only');
146
+ args.push('--cap-drop=ALL');
147
+ args.push('--security-opt', 'no-new-privileges:true');
148
+ args.push('-u', '10001:10001');
149
+ // Temporary filesystems for writable areas
150
+ args.push('--tmpfs', '/tmp:rw,nosuid,nodev,noexec');
151
+ args.push('--tmpfs', '/var/tmp:rw,nosuid,nodev,noexec');
152
+ args.push('--tmpfs', '/run:rw,nosuid,nodev,noexec');
153
+ // Mount workspace (rw for agent to clone repo)
154
+ args.push('-v', `${config.workspaceDir}:/workspace:rw`);
155
+ // Mount results (rw for writing outputs)
156
+ args.push('-v', `${config.resultsDir}:/results:rw`);
157
+ // Mount cache if provided
158
+ if (config.cacheDir) {
159
+ args.push('-v', `${config.cacheDir}:/cache:rw`);
160
+ }
161
+ // Mount API key file (ro for security)
162
+ if (config.apiKeyFile) {
163
+ args.push('-v', `${config.apiKeyFile}:/run/secrets/openrouter_api_key:ro`);
164
+ }
165
+ // Set environment variables (never pass API key via env)
166
+ for (const [key, value] of Object.entries(config.environment)) {
167
+ if (key !== 'OPENROUTER_API_KEY') {
168
+ // Skip inline API key
169
+ args.push('-e', `${key}=${value}`);
170
+ }
171
+ }
172
+ // Set entrypoint if provided
173
+ if (config.entrypoint) {
174
+ args.push('--entrypoint', config.entrypoint);
175
+ }
176
+ // Image
177
+ args.push(config.image);
178
+ // Command and arguments
179
+ if (config.command) {
180
+ args.push(...config.command);
181
+ }
182
+ return args;
183
+ }
184
+ /**
185
+ * Ensure required directories exist with correct permissions
186
+ */
187
+ static ensureDirectories(workspaceDir, resultsDir, cacheDir) {
188
+ const dirs = [workspaceDir, resultsDir];
189
+ if (cacheDir) {
190
+ dirs.push(cacheDir);
191
+ }
192
+ for (const dir of dirs) {
193
+ try {
194
+ execSync(`mkdir -p "${dir}"`, { shell: '/bin/bash' });
195
+ logger.debug(`Created/verified directory: ${dir}`);
196
+ }
197
+ catch (error) {
198
+ throw new Error(`Failed to create directory ${dir}: ${error}`);
199
+ }
200
+ }
201
+ }
202
+ /**
203
+ * Stop a running container
204
+ */
205
+ static stopContainer(containerId, timeout = 10) {
206
+ try {
207
+ execSync(`docker stop -t ${timeout} ${containerId}`, { stdio: 'ignore' });
208
+ logger.debug(`Stopped container: ${containerId}`);
209
+ return true;
210
+ }
211
+ catch {
212
+ logger.warn(`Failed to stop container: ${containerId}`);
213
+ return false;
214
+ }
215
+ }
216
+ /**
217
+ * Remove a container
218
+ */
219
+ static removeContainer(containerId, force = true) {
220
+ try {
221
+ const args = ['rm'];
222
+ if (force)
223
+ args.push('-f');
224
+ args.push(containerId);
225
+ execSync(`docker ${args.join(' ')}`, { stdio: 'ignore' });
226
+ logger.debug(`Removed container: ${containerId}`);
227
+ return true;
228
+ }
229
+ catch {
230
+ logger.warn(`Failed to remove container: ${containerId}`);
231
+ return false;
232
+ }
233
+ }
234
+ /**
235
+ * List running containers matching a pattern
236
+ */
237
+ static listContainers(pattern = 'kaseki') {
238
+ try {
239
+ const output = execSync(`docker ps --filter "name=${pattern}" --format "{{.Names}}"`, { encoding: 'utf-8' });
240
+ return output
241
+ .split('\n')
242
+ .filter((name) => name.trim())
243
+ .map((name) => name.trim());
244
+ }
245
+ catch {
246
+ return [];
247
+ }
248
+ }
249
+ /**
250
+ * Get container logs
251
+ */
252
+ static getContainerLogs(containerId, tail) {
253
+ try {
254
+ const args = ['logs'];
255
+ if (tail) {
256
+ args.push(`--tail=${tail}`);
257
+ }
258
+ args.push(containerId);
259
+ return execSync(`docker ${args.join(' ')}`, { encoding: 'utf-8' });
260
+ }
261
+ catch {
262
+ return '';
263
+ }
264
+ }
265
+ }
266
+ //# sourceMappingURL=DockerManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DockerManager.js","sourceRoot":"","sources":["../../src/docker/DockerManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAqBtC,MAAM,OAAO,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,iBAAiB;QACtB,IAAI,CAAC;YACH,QAAQ,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,KAAa,EAAE,aAAqB,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;QAE9C,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,QAAQ,CAAC,eAAe,KAAK,EAAE,EAAE;oBAC/B,KAAK,EAAE,SAAS;oBAChB,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,mBAAmB;iBAC5C,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAC;gBACnD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;oBACzB,MAAM,CAAC,IAAI,CAAC,gBAAgB,OAAO,sBAAsB,CAAC,CAAC;gBAC7D,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,8BAA8B,UAAU,cAAc,KAAK,EAAE,CAAC,CAAC;oBAC5E,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,KAAa;QAC9B,IAAI,CAAC;YACH,QAAQ,CAAC,kBAAkB,KAAK,mBAAmB,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAC7E,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,KAAa;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,CAAC,+BAA+B,KAAK,EAAE,EAAE;gBAC1D,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,IAAI,IAAI,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAuB;QAC/C,MAAM,CAAC,KAAK,CAAC,sBAAsB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAElD,2BAA2B;QAC3B,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEhF,2BAA2B;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAEhD,MAAM,CAAC,KAAK,CAAC,8BAA8B,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEnE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC,EAAE;gBACpD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;gBACjC,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,IAAI;aACzC,CAAC,CAAC;YAEH,iBAAiB;YACjB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;oBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC7B,MAAM,IAAI,IAAI,CAAC;oBACf,gDAAgD;oBAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC;YAED,iBAAiB;YACjB,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;oBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAC7B,MAAM,IAAI,IAAI,CAAC;oBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC;YAED,oBAAoB;YACpB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAmB,EAAE,EAAE;gBACvC,OAAO,CAAC;oBACN,QAAQ,EAAE,IAAI,IAAI,CAAC;oBACnB,MAAM;oBACN,MAAM;iBACP,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,gBAAgB;YAChB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;gBACjC,MAAM,CAAC,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzD,OAAO,CAAC;oBACN,QAAQ,EAAE,CAAC;oBACX,MAAM;oBACN,MAAM,EAAE,KAAK,CAAC,OAAO;iBACtB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,iBAAiB;YACjB,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACvB,MAAM,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;gBACjE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtB,OAAO,CAAC;oBACN,QAAQ,EAAE,GAAG;oBACb,MAAM;oBACN,MAAM,EAAE,2BAA2B,MAAM,CAAC,OAAO,UAAU;iBAC5D,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,eAAe,CAAC,MAAuB;QACpD,MAAM,IAAI,GAAa,EAAE,CAAC;QAE1B,iBAAiB;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjC,sCAAsC;QACtC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,wBAAwB,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QAE/B,2CAA2C;QAC3C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iCAAiC,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;QAEpD,+CAA+C;QAC/C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,YAAY,gBAAgB,CAAC,CAAC;QAExD,yCAAyC;QACzC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,UAAU,cAAc,CAAC,CAAC;QAEpD,0BAA0B;QAC1B,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,QAAQ,YAAY,CAAC,CAAC;QAClD,CAAC;QAED,uCAAuC;QACvC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,UAAU,qCAAqC,CAAC,CAAC;QAC7E,CAAC;QAED,yDAAyD;QACzD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9D,IAAI,GAAG,KAAK,oBAAoB,EAAE,CAAC;gBACjC,sBAAsB;gBACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAC/C,CAAC;QAED,QAAQ;QACR,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAExB,wBAAwB;QACxB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,iBAAiB,CAC9B,YAAoB,EACpB,UAAkB,EAClB,QAAiB;QAEjB,MAAM,IAAI,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,CAAC,aAAa,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;gBACtD,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,WAAmB,EAAE,UAAkB,EAAE;QAC5D,IAAI,CAAC;YACH,QAAQ,CAAC,kBAAkB,OAAO,IAAI,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1E,MAAM,CAAC,KAAK,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,6BAA6B,WAAW,EAAE,CAAC,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,WAAmB,EAAE,QAAiB,IAAI;QAC/D,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,KAAK;gBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACvB,QAAQ,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,sBAAsB,WAAW,EAAE,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAC;YAC1D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,UAAkB,QAAQ;QAC9C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,CACrB,4BAA4B,OAAO,yBAAyB,EAC5D,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC;YACF,OAAO,MAAM;iBACV,KAAK,CAAC,IAAI,CAAC;iBACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC7B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,WAAmB,EAAE,IAAa;QACxD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;YACtB,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAEvB,OAAO,QAAQ,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * event-aggregator.ts
3
+ *
4
+ * Encapsulates counter aggregation logic for Pi event stream processing.
5
+ * Tracks event types, models, APIs, tool executions, and assistant message types
6
+ * with bounded cardinality (1000 keys per counter).
7
+ */
8
+ export interface EventCountMap {
9
+ [key: string]: number;
10
+ }
11
+ export interface AggregatorSummary {
12
+ selected_model: string;
13
+ selected_api: string;
14
+ event_counts: EventCountMap;
15
+ assistant_event_counts: EventCountMap;
16
+ tool_start_count: number;
17
+ tool_end_count: number;
18
+ }
19
+ /**
20
+ * EventCounterAggregator manages counter maps for event stream aggregation.
21
+ *
22
+ * Responsibilities:
23
+ * - Track event type counts with cardinality cap
24
+ * - Track assistant message type counts
25
+ * - Observe and count models and APIs
26
+ * - Track tool execution start/end events
27
+ * - Provide summarized output with top model/API selected
28
+ */
29
+ export declare class EventCounterAggregator {
30
+ private eventCounts;
31
+ private assistantEventCounts;
32
+ private models;
33
+ private apis;
34
+ private toolStartCount;
35
+ private toolEndCount;
36
+ /**
37
+ * Increment a counter in a map with cardinality cap.
38
+ * Once a map reaches MAX_DISTINCT_SUMMARY_KEYS entries, new unseen keys
39
+ * are folded into the "__other__" bucket.
40
+ */
41
+ private incrementMap;
42
+ /**
43
+ * Record an event type observation.
44
+ */
45
+ recordEventType(eventType: string | undefined): void;
46
+ /**
47
+ * Record an assistant message type observation.
48
+ */
49
+ recordAssistantEventType(assistantType: string | undefined): void;
50
+ /**
51
+ * Record model and API observations from a message object.
52
+ */
53
+ recordModelAndApi(message: any): void;
54
+ /**
55
+ * Record a tool execution start event.
56
+ */
57
+ recordToolStart(): void;
58
+ /**
59
+ * Record a tool execution end event.
60
+ */
61
+ recordToolEnd(): void;
62
+ /**
63
+ * Get the top model by frequency.
64
+ */
65
+ private topByFrequency;
66
+ /**
67
+ * Generate summary with selected model/API and all counters.
68
+ */
69
+ summary(): AggregatorSummary;
70
+ }
71
+ //# sourceMappingURL=event-aggregator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-aggregator.d.ts","sourceRoot":"","sources":["../src/event-aggregator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,aAAa,CAAC;IAC5B,sBAAsB,EAAE,aAAa,CAAC;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,oBAAoB,CAAqB;IACjD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAAK;IAEzB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAiBpB;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAIpD;;OAEG;IACH,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAQjE;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAMrC;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,IAAI,iBAAiB;CAU7B"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * event-aggregator.ts
3
+ *
4
+ * Encapsulates counter aggregation logic for Pi event stream processing.
5
+ * Tracks event types, models, APIs, tool executions, and assistant message types
6
+ * with bounded cardinality (1000 keys per counter).
7
+ */
8
+ const MAX_DISTINCT_SUMMARY_KEYS = 1000;
9
+ const OTHER_BUCKET_KEY = '__other__';
10
+ /**
11
+ * EventCounterAggregator manages counter maps for event stream aggregation.
12
+ *
13
+ * Responsibilities:
14
+ * - Track event type counts with cardinality cap
15
+ * - Track assistant message type counts
16
+ * - Observe and count models and APIs
17
+ * - Track tool execution start/end events
18
+ * - Provide summarized output with top model/API selected
19
+ */
20
+ export class EventCounterAggregator {
21
+ eventCounts = {};
22
+ assistantEventCounts = {};
23
+ models = {};
24
+ apis = {};
25
+ toolStartCount = 0;
26
+ toolEndCount = 0;
27
+ /**
28
+ * Increment a counter in a map with cardinality cap.
29
+ * Once a map reaches MAX_DISTINCT_SUMMARY_KEYS entries, new unseen keys
30
+ * are folded into the "__other__" bucket.
31
+ */
32
+ incrementMap(map, key, maxDistinctKeys = MAX_DISTINCT_SUMMARY_KEYS) {
33
+ if (!key)
34
+ return;
35
+ let targetKey = key;
36
+ if (map[key] === undefined &&
37
+ Object.keys(map).filter((k) => k !== OTHER_BUCKET_KEY).length >= maxDistinctKeys) {
38
+ targetKey = OTHER_BUCKET_KEY;
39
+ }
40
+ map[targetKey] = (map[targetKey] ?? 0) + 1;
41
+ }
42
+ /**
43
+ * Record an event type observation.
44
+ */
45
+ recordEventType(eventType) {
46
+ this.incrementMap(this.eventCounts, eventType ?? '<missing>', MAX_DISTINCT_SUMMARY_KEYS);
47
+ }
48
+ /**
49
+ * Record an assistant message type observation.
50
+ */
51
+ recordAssistantEventType(assistantType) {
52
+ this.incrementMap(this.assistantEventCounts, assistantType, MAX_DISTINCT_SUMMARY_KEYS);
53
+ }
54
+ /**
55
+ * Record model and API observations from a message object.
56
+ */
57
+ recordModelAndApi(message) {
58
+ if (!message || typeof message !== 'object')
59
+ return;
60
+ this.incrementMap(this.models, message.model, MAX_DISTINCT_SUMMARY_KEYS);
61
+ this.incrementMap(this.apis, message.api, MAX_DISTINCT_SUMMARY_KEYS);
62
+ }
63
+ /**
64
+ * Record a tool execution start event.
65
+ */
66
+ recordToolStart() {
67
+ this.toolStartCount++;
68
+ }
69
+ /**
70
+ * Record a tool execution end event.
71
+ */
72
+ recordToolEnd() {
73
+ this.toolEndCount++;
74
+ }
75
+ /**
76
+ * Get the top model by frequency.
77
+ */
78
+ topByFrequency(map) {
79
+ return Object.entries(map).sort((a, b) => b[1] - a[1])[0]?.[0] ?? '';
80
+ }
81
+ /**
82
+ * Generate summary with selected model/API and all counters.
83
+ */
84
+ summary() {
85
+ return {
86
+ selected_model: this.topByFrequency(this.models),
87
+ selected_api: this.topByFrequency(this.apis),
88
+ event_counts: this.eventCounts,
89
+ assistant_event_counts: this.assistantEventCounts,
90
+ tool_start_count: this.toolStartCount,
91
+ tool_end_count: this.toolEndCount,
92
+ };
93
+ }
94
+ }
95
+ //# sourceMappingURL=event-aggregator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-aggregator.js","sourceRoot":"","sources":["../src/event-aggregator.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,MAAM,gBAAgB,GAAG,WAAW,CAAC;AAerC;;;;;;;;;GASG;AACH,MAAM,OAAO,sBAAsB;IACzB,WAAW,GAAkB,EAAE,CAAC;IAChC,oBAAoB,GAAkB,EAAE,CAAC;IACzC,MAAM,GAAkB,EAAE,CAAC;IAC3B,IAAI,GAAkB,EAAE,CAAC;IACzB,cAAc,GAAG,CAAC,CAAC;IACnB,YAAY,GAAG,CAAC,CAAC;IAEzB;;;;OAIG;IACK,YAAY,CAClB,GAAkB,EAClB,GAAuB,EACvB,kBAA0B,yBAAyB;QAEnD,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,IAAI,SAAS,GAAG,GAAG,CAAC;QACpB,IACE,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;YACtB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC,MAAM,IAAI,eAAe,EAChF,CAAC;YACD,SAAS,GAAG,gBAAgB,CAAC;QAC/B,CAAC;QACD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,SAA6B;QAC3C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,IAAI,WAAW,EAAE,yBAAyB,CAAC,CAAC;IAC3F,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,aAAiC;QACxD,IAAI,CAAC,YAAY,CACf,IAAI,CAAC,oBAAoB,EACzB,aAAa,EACb,yBAAyB,CAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAY;QAC5B,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO;QACpD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC;QACzE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,eAAe;QACb,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,aAAa;QACX,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,GAAkB;QACvC,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO;YACL,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;YAChD,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5C,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,sBAAsB,EAAE,IAAI,CAAC,oBAAoB;YACjD,gBAAgB,EAAE,IAAI,CAAC,cAAc;YACrC,cAAc,EAAE,IAAI,CAAC,YAAY;SAClC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * github-app-token.ts - Generate GitHub App installation access tokens
4
+ *
5
+ * Usage:
6
+ * node dist/github-app-token.js <app-id> <private-key-file> <owner> <repo>
7
+ *
8
+ * Outputs JSON:
9
+ * {
10
+ * "token": "ghu_...",
11
+ * "expires_at": "2026-04-26T...",
12
+ * "error": "..." (if failed)
13
+ * }
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=github-app-token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-app-token.d.ts","sourceRoot":"","sources":["../src/github-app-token.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,148 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * github-app-token.ts - Generate GitHub App installation access tokens
4
+ *
5
+ * Usage:
6
+ * node dist/github-app-token.js <app-id> <private-key-file> <owner> <repo>
7
+ *
8
+ * Outputs JSON:
9
+ * {
10
+ * "token": "ghu_...",
11
+ * "expires_at": "2026-04-26T...",
12
+ * "error": "..." (if failed)
13
+ * }
14
+ */
15
+ import fs from 'fs';
16
+ import crypto from 'crypto';
17
+ import https from 'https';
18
+ const APP_ID = process.argv[2];
19
+ const PRIVATE_KEY_FILE = process.argv[3];
20
+ const OWNER = process.argv[4];
21
+ const REPO = process.argv[5];
22
+ async function generateJWT(appId, privateKey) {
23
+ const now = Math.floor(Date.now() / 1000);
24
+ const iat = now - 60; // account for clock skew
25
+ const exp = now + 10 * 60; // 10 minutes
26
+ const header = {
27
+ alg: 'RS256',
28
+ typ: 'JWT',
29
+ };
30
+ const payload = {
31
+ iss: appId,
32
+ iat,
33
+ exp,
34
+ };
35
+ const headerBase64 = Buffer.from(JSON.stringify(header)).toString('base64url');
36
+ const payloadBase64 = Buffer.from(JSON.stringify(payload)).toString('base64url');
37
+ const message = `${headerBase64}.${payloadBase64}`;
38
+ // Sign with RSA-SHA256
39
+ const signer = crypto.createSign('RSA-SHA256');
40
+ signer.update(message);
41
+ signer.end();
42
+ const signature = signer.sign(privateKey, 'base64url');
43
+ return `${message}.${signature}`;
44
+ }
45
+ async function getInstallationId(jwt, owner, repo) {
46
+ return new Promise((resolve, reject) => {
47
+ const options = {
48
+ hostname: 'api.github.com',
49
+ path: `/repos/${owner}/${repo}/installation`,
50
+ method: 'GET',
51
+ headers: {
52
+ 'Authorization': `Bearer ${jwt}`,
53
+ 'Accept': 'application/vnd.github.machine-man-preview+json',
54
+ 'User-Agent': 'Kaseki-Agent',
55
+ },
56
+ };
57
+ const req = https.request(options, (res) => {
58
+ let data = '';
59
+ res.on('data', (chunk) => {
60
+ data += chunk;
61
+ });
62
+ res.on('end', () => {
63
+ if (res.statusCode !== 200) {
64
+ reject(new Error(`Failed to get installation ID: ${res.statusCode} ${data}`));
65
+ }
66
+ else {
67
+ try {
68
+ const json = JSON.parse(data);
69
+ resolve(json.id);
70
+ }
71
+ catch (e) {
72
+ reject(new Error(`Failed to parse installation response: ${e instanceof Error ? e.message : String(e)}`));
73
+ }
74
+ }
75
+ });
76
+ });
77
+ req.on('error', reject);
78
+ req.end();
79
+ });
80
+ }
81
+ async function getAccessToken(jwt, installationId) {
82
+ return new Promise((resolve, reject) => {
83
+ const options = {
84
+ hostname: 'api.github.com',
85
+ path: `/app/installations/${installationId}/access_tokens`,
86
+ method: 'POST',
87
+ headers: {
88
+ 'Authorization': `Bearer ${jwt}`,
89
+ 'Accept': 'application/vnd.github.machine-man-preview+json',
90
+ 'User-Agent': 'Kaseki-Agent',
91
+ 'Content-Length': '0',
92
+ },
93
+ };
94
+ const req = https.request(options, (res) => {
95
+ let data = '';
96
+ res.on('data', (chunk) => {
97
+ data += chunk;
98
+ });
99
+ res.on('end', () => {
100
+ if (res.statusCode !== 201) {
101
+ reject(new Error(`Failed to get access token: ${res.statusCode} ${data}`));
102
+ }
103
+ else {
104
+ try {
105
+ const json = JSON.parse(data);
106
+ resolve({
107
+ token: json.token,
108
+ expires_at: json.expires_at,
109
+ });
110
+ }
111
+ catch (e) {
112
+ reject(new Error(`Failed to parse token response: ${e instanceof Error ? e.message : String(e)}`));
113
+ }
114
+ }
115
+ });
116
+ });
117
+ req.on('error', reject);
118
+ req.end();
119
+ });
120
+ }
121
+ async function main() {
122
+ if (!APP_ID || !PRIVATE_KEY_FILE || !OWNER || !REPO) {
123
+ console.error('Usage: node github-app-token.js <app-id> <private-key-file> <owner> <repo>');
124
+ process.exit(1);
125
+ }
126
+ try {
127
+ // Read private key
128
+ const privateKey = fs.readFileSync(PRIVATE_KEY_FILE, 'utf8');
129
+ // Generate JWT
130
+ const jwt = await generateJWT(APP_ID, privateKey);
131
+ // Get installation ID
132
+ const installationId = await getInstallationId(jwt, OWNER, REPO);
133
+ // Get access token
134
+ const tokenData = await getAccessToken(jwt, installationId);
135
+ // Output result as JSON
136
+ console.log(JSON.stringify(tokenData));
137
+ }
138
+ catch (error) {
139
+ // Output error as JSON
140
+ const result = {
141
+ error: error instanceof Error ? error.message : String(error),
142
+ };
143
+ console.log(JSON.stringify(result));
144
+ process.exit(1);
145
+ }
146
+ }
147
+ main();
148
+ //# sourceMappingURL=github-app-token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-app-token.js","sourceRoot":"","sources":["../src/github-app-token.ts"],"names":[],"mappings":"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"}