@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.
- package/.dockerignore +54 -0
- package/.eslintignore +11 -0
- package/.eslintrc.json +95 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +53 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +53 -0
- package/.github/ISSUE_TEMPLATE/security.md +51 -0
- package/.github/PULL_REQUEST_TEMPLATE/default.md +71 -0
- package/.github/dependabot.yml +38 -0
- package/.github/skills/dependency-cache-optimization/SKILL.md +526 -0
- package/.github/skills/docker-image-management/SKILL.md +532 -0
- package/.github/skills/frontend-design/SKILL.md +782 -0
- package/.github/skills/prompt-engineering/SKILL.md +360 -0
- package/.github/skills/quality-gate-config/SKILL.md +591 -0
- package/.github/skills/result-report-analysis/SKILL.md +576 -0
- package/.github/skills/test-automation/SKILL.md +593 -0
- package/.github/skills/workflow-diagnosis/SKILL.md +468 -0
- package/.github/workflows/build-docker-image.yml +453 -0
- package/.github/workflows/release.yml +68 -0
- package/.releaserc.json +135 -0
- package/CHANGELOG.md +117 -0
- package/CLAUDE.md +336 -0
- package/CONTRIBUTING.md +339 -0
- package/Dockerfile +217 -0
- package/README.md +1527 -0
- package/STYLE.md +521 -0
- package/add-js-extensions.d.ts +9 -0
- package/add-js-extensions.d.ts.map +1 -0
- package/add-js-extensions.js.map +1 -0
- package/dist/add-js-extensions.d.ts +9 -0
- package/dist/add-js-extensions.d.ts.map +1 -0
- package/dist/add-js-extensions.js +52 -0
- package/dist/add-js-extensions.js.map +1 -0
- package/dist/ansi-colors.d.ts +26 -0
- package/dist/ansi-colors.d.ts.map +1 -0
- package/dist/ansi-colors.js +51 -0
- package/dist/ansi-colors.js.map +1 -0
- package/dist/cli/BaseCommand.d.ts +18 -0
- package/dist/cli/BaseCommand.d.ts.map +1 -0
- package/dist/cli/BaseCommand.js +31 -0
- package/dist/cli/BaseCommand.js.map +1 -0
- package/dist/cli/KasekiCLI.d.ts +30 -0
- package/dist/cli/KasekiCLI.d.ts.map +1 -0
- package/dist/cli/KasekiCLI.js +134 -0
- package/dist/cli/KasekiCLI.js.map +1 -0
- package/dist/cli/commands/ConfigCommand.d.ts +13 -0
- package/dist/cli/commands/ConfigCommand.d.ts.map +1 -0
- package/dist/cli/commands/ConfigCommand.js +131 -0
- package/dist/cli/commands/ConfigCommand.js.map +1 -0
- package/dist/cli/commands/DoctorCommand.d.ts +45 -0
- package/dist/cli/commands/DoctorCommand.d.ts.map +1 -0
- package/dist/cli/commands/DoctorCommand.js +309 -0
- package/dist/cli/commands/DoctorCommand.js.map +1 -0
- package/dist/cli/commands/ListCommand.d.ts +9 -0
- package/dist/cli/commands/ListCommand.d.ts.map +1 -0
- package/dist/cli/commands/ListCommand.js +81 -0
- package/dist/cli/commands/ListCommand.js.map +1 -0
- package/dist/cli/commands/ReportCommand.d.ts +9 -0
- package/dist/cli/commands/ReportCommand.d.ts.map +1 -0
- package/dist/cli/commands/ReportCommand.js +98 -0
- package/dist/cli/commands/ReportCommand.js.map +1 -0
- package/dist/cli/commands/RunCommand.d.ts +13 -0
- package/dist/cli/commands/RunCommand.d.ts.map +1 -0
- package/dist/cli/commands/RunCommand.js +191 -0
- package/dist/cli/commands/RunCommand.js.map +1 -0
- package/dist/cli/commands/SecretsCommand.d.ts +9 -0
- package/dist/cli/commands/SecretsCommand.d.ts.map +1 -0
- package/dist/cli/commands/SecretsCommand.js +109 -0
- package/dist/cli/commands/SecretsCommand.js.map +1 -0
- package/dist/cli/commands/ServeCommand.d.ts +9 -0
- package/dist/cli/commands/ServeCommand.d.ts.map +1 -0
- package/dist/cli/commands/ServeCommand.js +50 -0
- package/dist/cli/commands/ServeCommand.js.map +1 -0
- package/dist/cli/commands/SetupCommand.d.ts +42 -0
- package/dist/cli/commands/SetupCommand.d.ts.map +1 -0
- package/dist/cli/commands/SetupCommand.js +249 -0
- package/dist/cli/commands/SetupCommand.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +130 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/ConfigManager.d.ts +395 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +446 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/docker/DockerManager.d.ts +69 -0
- package/dist/docker/DockerManager.d.ts.map +1 -0
- package/dist/docker/DockerManager.js +266 -0
- package/dist/docker/DockerManager.js.map +1 -0
- package/dist/event-aggregator.d.ts +71 -0
- package/dist/event-aggregator.d.ts.map +1 -0
- package/dist/event-aggregator.js +95 -0
- package/dist/event-aggregator.js.map +1 -0
- package/dist/github-app-token.d.ts +16 -0
- package/dist/github-app-token.d.ts.map +1 -0
- package/dist/github-app-token.js +148 -0
- package/dist/github-app-token.js.map +1 -0
- package/dist/idempotency-store.d.ts +61 -0
- package/dist/idempotency-store.d.ts.map +1 -0
- package/dist/idempotency-store.js +321 -0
- package/dist/idempotency-store.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/instance/InstanceManager.d.ts +81 -0
- package/dist/instance/InstanceManager.d.ts.map +1 -0
- package/dist/instance/InstanceManager.js +220 -0
- package/dist/instance/InstanceManager.js.map +1 -0
- package/dist/instance-metadata-reader.d.ts +48 -0
- package/dist/instance-metadata-reader.d.ts.map +1 -0
- package/dist/instance-metadata-reader.js +94 -0
- package/dist/instance-metadata-reader.js.map +1 -0
- package/dist/instance-state-derivation.d.ts +42 -0
- package/dist/instance-state-derivation.d.ts.map +1 -0
- package/dist/instance-state-derivation.js +133 -0
- package/dist/instance-state-derivation.js.map +1 -0
- package/dist/job-scheduler.d.ts +124 -0
- package/dist/job-scheduler.d.ts.map +1 -0
- package/dist/job-scheduler.js +992 -0
- package/dist/job-scheduler.js.map +1 -0
- package/dist/kaseki-api-client.d.ts +89 -0
- package/dist/kaseki-api-client.d.ts.map +1 -0
- package/dist/kaseki-api-client.js +405 -0
- package/dist/kaseki-api-client.js.map +1 -0
- package/dist/kaseki-api-config.d.ts +34 -0
- package/dist/kaseki-api-config.d.ts.map +1 -0
- package/dist/kaseki-api-config.js +113 -0
- package/dist/kaseki-api-config.js.map +1 -0
- package/dist/kaseki-api-routes.d.ts +13 -0
- package/dist/kaseki-api-routes.d.ts.map +1 -0
- package/dist/kaseki-api-routes.js +559 -0
- package/dist/kaseki-api-routes.js.map +1 -0
- package/dist/kaseki-api-service-wrapper.d.ts +43 -0
- package/dist/kaseki-api-service-wrapper.d.ts.map +1 -0
- package/dist/kaseki-api-service-wrapper.js +150 -0
- package/dist/kaseki-api-service-wrapper.js.map +1 -0
- package/dist/kaseki-api-service.d.ts +16 -0
- package/dist/kaseki-api-service.d.ts.map +1 -0
- package/dist/kaseki-api-service.js +143 -0
- package/dist/kaseki-api-service.js.map +1 -0
- package/dist/kaseki-api-types.d.ts +440 -0
- package/dist/kaseki-api-types.d.ts.map +1 -0
- package/dist/kaseki-api-types.js +64 -0
- package/dist/kaseki-api-types.js.map +1 -0
- package/dist/kaseki-cli-lib.d.ts +219 -0
- package/dist/kaseki-cli-lib.d.ts.map +1 -0
- package/dist/kaseki-cli-lib.js +523 -0
- package/dist/kaseki-cli-lib.js.map +1 -0
- package/dist/kaseki-cli.d.ts +38 -0
- package/dist/kaseki-cli.d.ts.map +1 -0
- package/dist/kaseki-cli.js +559 -0
- package/dist/kaseki-cli.js.map +1 -0
- package/dist/kaseki-report.d.ts +3 -0
- package/dist/kaseki-report.d.ts.map +1 -0
- package/dist/kaseki-report.js +140 -0
- package/dist/kaseki-report.js.map +1 -0
- package/dist/lib/subprocess-helpers.d.ts +98 -0
- package/dist/lib/subprocess-helpers.d.ts.map +1 -0
- package/dist/lib/subprocess-helpers.js +136 -0
- package/dist/lib/subprocess-helpers.js.map +1 -0
- package/dist/logger.d.ts +39 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +79 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics.d.ts +19 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +59 -0
- package/dist/metrics.js.map +1 -0
- package/dist/middleware/job-lookup.d.ts +27 -0
- package/dist/middleware/job-lookup.d.ts.map +1 -0
- package/dist/middleware/job-lookup.js +28 -0
- package/dist/middleware/job-lookup.js.map +1 -0
- package/dist/pi-event-filter.d.ts +3 -0
- package/dist/pi-event-filter.d.ts.map +1 -0
- package/dist/pi-event-filter.js +126 -0
- package/dist/pi-event-filter.js.map +1 -0
- package/dist/pi-progress-stream.d.ts +3 -0
- package/dist/pi-progress-stream.d.ts.map +1 -0
- package/dist/pi-progress-stream.js +205 -0
- package/dist/pi-progress-stream.js.map +1 -0
- package/dist/pi-progress-summarizer.d.ts +61 -0
- package/dist/pi-progress-summarizer.d.ts.map +1 -0
- package/dist/pi-progress-summarizer.js +246 -0
- package/dist/pi-progress-summarizer.js.map +1 -0
- package/dist/pre-flight-validator.d.ts +72 -0
- package/dist/pre-flight-validator.d.ts.map +1 -0
- package/dist/pre-flight-validator.js +513 -0
- package/dist/pre-flight-validator.js.map +1 -0
- package/dist/progress-stream-utils.d.ts +3 -0
- package/dist/progress-stream-utils.d.ts.map +1 -0
- package/dist/progress-stream-utils.js +15 -0
- package/dist/progress-stream-utils.js.map +1 -0
- package/dist/result-cache.d.ts +52 -0
- package/dist/result-cache.d.ts.map +1 -0
- package/dist/result-cache.js +134 -0
- package/dist/result-cache.js.map +1 -0
- package/dist/routes/artifact-routes.d.ts +10 -0
- package/dist/routes/artifact-routes.d.ts.map +1 -0
- package/dist/routes/artifact-routes.js +126 -0
- package/dist/routes/artifact-routes.js.map +1 -0
- package/dist/routes/log-routes.d.ts +8 -0
- package/dist/routes/log-routes.d.ts.map +1 -0
- package/dist/routes/log-routes.js +345 -0
- package/dist/routes/log-routes.js.map +1 -0
- package/dist/routes/status-routes.d.ts +8 -0
- package/dist/routes/status-routes.d.ts.map +1 -0
- package/dist/routes/status-routes.js +82 -0
- package/dist/routes/status-routes.js.map +1 -0
- package/dist/routes/webhook-routes.d.ts +6 -0
- package/dist/routes/webhook-routes.d.ts.map +1 -0
- package/dist/routes/webhook-routes.js +86 -0
- package/dist/routes/webhook-routes.js.map +1 -0
- package/dist/run-artifact-metadata-cache.d.ts +42 -0
- package/dist/run-artifact-metadata-cache.d.ts.map +1 -0
- package/dist/run-artifact-metadata-cache.js +139 -0
- package/dist/run-artifact-metadata-cache.js.map +1 -0
- package/dist/secret-value-cache.d.ts +13 -0
- package/dist/secret-value-cache.d.ts.map +1 -0
- package/dist/secret-value-cache.js +44 -0
- package/dist/secret-value-cache.js.map +1 -0
- package/dist/secrets/SecretsManager.d.ts +80 -0
- package/dist/secrets/SecretsManager.d.ts.map +1 -0
- package/dist/secrets/SecretsManager.js +306 -0
- package/dist/secrets/SecretsManager.js.map +1 -0
- package/dist/test-utils.d.ts +55 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +48 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/timestamp-tracker.d.ts +75 -0
- package/dist/timestamp-tracker.d.ts.map +1 -0
- package/dist/timestamp-tracker.js +121 -0
- package/dist/timestamp-tracker.js.map +1 -0
- package/dist/utils/failure-artifact-writer.d.ts +29 -0
- package/dist/utils/failure-artifact-writer.d.ts.map +1 -0
- package/dist/utils/failure-artifact-writer.js +157 -0
- package/dist/utils/failure-artifact-writer.js.map +1 -0
- package/dist/utils/file-helpers.d.ts +41 -0
- package/dist/utils/file-helpers.d.ts.map +1 -0
- package/dist/utils/file-helpers.js +143 -0
- package/dist/utils/file-helpers.js.map +1 -0
- package/dist/utils/http-client-factory.d.ts +46 -0
- package/dist/utils/http-client-factory.d.ts.map +1 -0
- package/dist/utils/http-client-factory.js +114 -0
- package/dist/utils/http-client-factory.js.map +1 -0
- package/dist/utils/progress-normalizer.d.ts +13 -0
- package/dist/utils/progress-normalizer.d.ts.map +1 -0
- package/dist/utils/progress-normalizer.js +57 -0
- package/dist/utils/progress-normalizer.js.map +1 -0
- package/dist/utils/response-helpers.d.ts +34 -0
- package/dist/utils/response-helpers.d.ts.map +1 -0
- package/dist/utils/response-helpers.js +78 -0
- package/dist/utils/response-helpers.js.map +1 -0
- package/dist/utils/route-helpers.d.ts +17 -0
- package/dist/utils/route-helpers.d.ts.map +1 -0
- package/dist/utils/route-helpers.js +22 -0
- package/dist/utils/route-helpers.js.map +1 -0
- package/dist/utils/status-response-builder.d.ts +23 -0
- package/dist/utils/status-response-builder.d.ts.map +1 -0
- package/dist/utils/status-response-builder.js +144 -0
- package/dist/utils/status-response-builder.js.map +1 -0
- package/dist/utils/type-guards.d.ts +37 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +45 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/utils/utf8-helpers.d.ts +32 -0
- package/dist/utils/utf8-helpers.d.ts.map +1 -0
- package/dist/utils/utf8-helpers.js +97 -0
- package/dist/utils/utf8-helpers.js.map +1 -0
- package/dist/utils/webhook-event-builder.d.ts +26 -0
- package/dist/utils/webhook-event-builder.d.ts.map +1 -0
- package/dist/utils/webhook-event-builder.js +77 -0
- package/dist/utils/webhook-event-builder.js.map +1 -0
- package/dist/webhook-manager.d.ts +56 -0
- package/dist/webhook-manager.d.ts.map +1 -0
- package/dist/webhook-manager.js +359 -0
- package/dist/webhook-manager.js.map +1 -0
- package/docker/workspace-cache/package-lock.json +13 -0
- package/docker/workspace-cache/package.json +7 -0
- package/docker-compose.yml +53 -0
- package/docs/API.md +708 -0
- package/docs/BACKLOG.md +19 -0
- package/docs/BUILD_STRATEGY.md +404 -0
- package/docs/CLI.md +569 -0
- package/docs/DEPLOYMENT.md +521 -0
- package/docs/DEVELOPMENT.md +459 -0
- package/docs/DOCKER_SETUP.md +522 -0
- package/docs/ENHANCED_PROGRESS_LOGS.md +264 -0
- package/docs/IMPLEMENTATION_SUMMARY.md +549 -0
- package/docs/INTEGRATION_EXAMPLE.md +217 -0
- package/docs/NPM_SETUP.md +468 -0
- package/docs/PHASE1-4_IMPLEMENTATION.md +302 -0
- package/docs/PHASE1_COMPLETION.md +192 -0
- package/docs/PHASE2_COMPLETION.md +134 -0
- package/docs/PHASE6_MIGRATION.md +392 -0
- package/docs/PRINTF_SAFETY_FIX.md +282 -0
- package/docs/QUALITY_GATES.md +369 -0
- package/docs/SETUP_GUIDE.md +482 -0
- package/docs/TASK_PROMPT_TEMPLATES.md +533 -0
- package/docs/VALIDATION_FIX.md +139 -0
- package/docs/VERIFICATION_CHECKLIST.md +335 -0
- package/docs/repo-maturity.md +760 -0
- package/fix-tests.d.ts +9 -0
- package/fix-tests.d.ts.map +1 -0
- package/fix-tests.js.map +1 -0
- package/fix-tests.ts +53 -0
- package/jest.config.ts +31 -0
- package/kaseki +183 -0
- package/kaseki-agent.sh +1961 -0
- package/ops/logrotate/kaseki +10 -0
- package/package.json +83 -0
- package/perf/README.md +54 -0
- package/perf/pi-event-filter.benchmark.test.ts +98 -0
- package/run-kaseki-json.test.sh +106 -0
- package/run-kaseki.sh +990 -0
- package/scripts/allowlist-helper.sh +56 -0
- package/scripts/cleanup-kaseki.sh +168 -0
- package/scripts/deploy-pi-template.sh +293 -0
- package/scripts/docker-entrypoint.sh +71 -0
- package/scripts/dry-run-allowlist.sh +161 -0
- package/scripts/kaseki-activate.sh +396 -0
- package/scripts/kaseki-api.service +62 -0
- package/scripts/kaseki-container-entrypoint-wrapper.sh +119 -0
- package/scripts/kaseki-container-setup-remote.sh +172 -0
- package/scripts/kaseki-container-setup.sh +193 -0
- package/scripts/kaseki-healthcheck.sh +95 -0
- package/scripts/kaseki-install.sh +50 -0
- package/scripts/kaseki-maturity-score.sh +291 -0
- package/scripts/kaseki-performance-metrics.sh +122 -0
- package/scripts/kaseki-preflight.sh +270 -0
- package/scripts/kaseki-setup.sh +265 -0
- package/scripts/pi-setup-remote.sh +213 -0
- package/scripts/setup-github-labels.sh +42 -0
- package/scripts/suggest-allowlist.sh +68 -0
- package/scripts/templates/MULTI_HOST_DISTRIBUTED.md +337 -0
- package/scripts/templates/REST_API_SERVICE.md +490 -0
- package/scripts/templates/SINGLE_HOST_CLI.md +194 -0
- package/scripts/test-github-app.sh +248 -0
- package/src/add-js-extensions.ts +61 -0
- package/src/ansi-colors.test.ts +62 -0
- package/src/ansi-colors.ts +67 -0
- package/src/cli/BaseCommand.ts +40 -0
- package/src/cli/KasekiCLI.ts +154 -0
- package/src/cli/commands/ConfigCommand.ts +145 -0
- package/src/cli/commands/DoctorCommand.ts +329 -0
- package/src/cli/commands/ListCommand.ts +105 -0
- package/src/cli/commands/ReportCommand.ts +110 -0
- package/src/cli/commands/RunCommand.ts +218 -0
- package/src/cli/commands/SecretsCommand.ts +120 -0
- package/src/cli/commands/ServeCommand.ts +62 -0
- package/src/cli/commands/SetupCommand.ts +301 -0
- package/src/cli.ts +138 -0
- package/src/config/ConfigManager.ts +476 -0
- package/src/docker/DockerManager.ts +319 -0
- package/src/docker-entrypoint-packaging.test.ts +33 -0
- package/src/event-aggregator.test.ts +117 -0
- package/src/event-aggregator.ts +126 -0
- package/src/github-app-token.ts +215 -0
- package/src/idempotency-store.test.ts +117 -0
- package/src/idempotency-store.ts +385 -0
- package/src/index.ts +89 -0
- package/src/instance/InstanceManager.ts +285 -0
- package/src/instance-metadata-reader.test.ts +190 -0
- package/src/instance-metadata-reader.ts +129 -0
- package/src/instance-state-derivation.test.ts +263 -0
- package/src/instance-state-derivation.ts +148 -0
- package/src/job-scheduler.test.ts +1236 -0
- package/src/job-scheduler.ts +1117 -0
- package/src/kaseki-api-client.ts +488 -0
- package/src/kaseki-api-config.test.ts +315 -0
- package/src/kaseki-api-config.ts +175 -0
- package/src/kaseki-api-routes.test.ts +1615 -0
- package/src/kaseki-api-routes.ts +643 -0
- package/src/kaseki-api-service-wrapper.ts +188 -0
- package/src/kaseki-api-service.test.ts +418 -0
- package/src/kaseki-api-service.ts +192 -0
- package/src/kaseki-api-types.ts +320 -0
- package/src/kaseki-cli-lib.test.ts +552 -0
- package/src/kaseki-cli-lib.ts +760 -0
- package/src/kaseki-cli.ts +682 -0
- package/src/kaseki-report.test.ts +118 -0
- package/src/kaseki-report.ts +192 -0
- package/src/lib/subprocess-helpers.ts +177 -0
- package/src/logger.ts +114 -0
- package/src/metrics.ts +66 -0
- package/src/middleware/job-lookup.test.ts +113 -0
- package/src/middleware/job-lookup.ts +45 -0
- package/src/pi-event-filter.test.ts +183 -0
- package/src/pi-event-filter.ts +183 -0
- package/src/pi-progress-stream.ts +287 -0
- package/src/pi-progress-summarizer.test.ts +302 -0
- package/src/pi-progress-summarizer.ts +287 -0
- package/src/pre-flight-validator.test.ts +512 -0
- package/src/pre-flight-validator.ts +618 -0
- package/src/progress-stream-utils.test.ts +35 -0
- package/src/progress-stream-utils.ts +14 -0
- package/src/result-cache.test.ts +195 -0
- package/src/result-cache.ts +181 -0
- package/src/routes/artifact-routes.ts +169 -0
- package/src/routes/log-routes.ts +391 -0
- package/src/routes/status-routes.ts +92 -0
- package/src/routes/webhook-routes.ts +97 -0
- package/src/run-artifact-metadata-cache.test.ts +80 -0
- package/src/run-artifact-metadata-cache.ts +184 -0
- package/src/secret-value-cache.test.ts +66 -0
- package/src/secret-value-cache.ts +55 -0
- package/src/secrets/SecretsManager.ts +343 -0
- package/src/test-utils.ts +81 -0
- package/src/timestamp-tracker.test.ts +134 -0
- package/src/timestamp-tracker.ts +132 -0
- package/src/utils/failure-artifact-writer.ts +187 -0
- package/src/utils/file-helpers.test.ts +235 -0
- package/src/utils/file-helpers.ts +150 -0
- package/src/utils/http-client-factory.test.ts +245 -0
- package/src/utils/http-client-factory.ts +157 -0
- package/src/utils/progress-normalizer.test.ts +442 -0
- package/src/utils/progress-normalizer.ts +68 -0
- package/src/utils/response-helpers.test.ts +122 -0
- package/src/utils/response-helpers.ts +101 -0
- package/src/utils/route-helpers.ts +30 -0
- package/src/utils/status-response-builder.ts +159 -0
- package/src/utils/type-guards.ts +52 -0
- package/src/utils/utf8-helpers.ts +102 -0
- package/src/utils/webhook-event-builder.test.ts +143 -0
- package/src/utils/webhook-event-builder.ts +87 -0
- package/src/webhook-manager.test.ts +152 -0
- package/src/webhook-manager.ts +445 -0
- package/templates/allowlist-api-route.txt +7 -0
- package/templates/allowlist-comprehensive.txt +8 -0
- package/templates/allowlist-parser-fix.txt +6 -0
- package/templates/allowlist-ui-component.txt +9 -0
- package/templates/allowlist-utility.txt +9 -0
- package/test/actual-model-metadata.test.sh +102 -0
- package/test/dry-run.test.sh +131 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-0.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-1.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-invalid.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-str-0.json +1 -0
- package/test/fixtures/kaseki-report-exit-codes/metadata-exit-str-1.json +1 -0
- package/test/kaseki-api.integration.test.sh +165 -0
- package/test/pi-event-filter-failure.test.sh +83 -0
- package/test/printf-safety-focused.test.sh +99 -0
- package/test/printf-safety-results/results/restoration.jsonl +10 -0
- package/test/printf-safety-results/results/test.jsonl +0 -0
- package/test/printf-safety.test.sh +297 -0
- package/test/validation-fix.test.sh +79 -0
- package/test/validation-integration.test.sh +109 -0
- package/tests/allowlist-glob.test.sh +61 -0
- package/tests/dependency-cache-key.test.sh +48 -0
- package/tests/dependency-restore-mode.test.sh +48 -0
- package/tests/doctor-template-parity.test.sh +95 -0
- package/tests/github-operations.test.sh +142 -0
- package/tests/npm-install-flags.test.sh +58 -0
- package/tests/quality-gates.test.sh +178 -0
- package/tests/repo-memory.test.sh +103 -0
- package/tests/restore-disallowed-changes.test.sh +80 -0
- package/tests/validation-missing-npm-scripts.test.sh +93 -0
- package/tests/validation-strict-mode.test.sh +118 -0
- package/tsconfig.changed.json +7 -0
- package/tsconfig.json +39 -0
package/package.json
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cyanautomation/kaseki-agent",
|
|
3
|
+
"version": "1.4.1",
|
|
4
|
+
"description": "Ephemeral coding-agent runner: orchestrates Pi CLI via Docker for automated code modifications with validation",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=24"
|
|
9
|
+
},
|
|
10
|
+
"os": [
|
|
11
|
+
"linux"
|
|
12
|
+
],
|
|
13
|
+
"bin": {
|
|
14
|
+
"kaseki-agent": "dist/cli.js"
|
|
15
|
+
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "https://github.com/CyanAutomation/kaseki-agent.git"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"pi-cli",
|
|
22
|
+
"openrouter",
|
|
23
|
+
"coding-agent",
|
|
24
|
+
"docker",
|
|
25
|
+
"automation"
|
|
26
|
+
],
|
|
27
|
+
"author": "CyanAutomation",
|
|
28
|
+
"bugs": {
|
|
29
|
+
"url": "https://github.com/CyanAutomation/kaseki-agent/issues"
|
|
30
|
+
},
|
|
31
|
+
"homepage": "https://github.com/CyanAutomation/kaseki-agent#readme",
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc && node dist/add-js-extensions.js && chmod 0755 dist/*.js",
|
|
34
|
+
"type-check": "tsc --noEmit",
|
|
35
|
+
"check": "npm run type-check && npm run lint",
|
|
36
|
+
"test": "npm run test:unit",
|
|
37
|
+
"test:unit": "jest --passWithNoTests",
|
|
38
|
+
"test:cli": "npm run build && npm run test:cli:install && npm run test:cli:verify",
|
|
39
|
+
"test:cli:install": "npm run test:cli:install-local && npm run test:cli:install-npx",
|
|
40
|
+
"test:cli:install-local": "npm link && kaseki-agent --version && npm unlink -g @cyanautomation/kaseki-agent",
|
|
41
|
+
"test:cli:install-npx": "npx . --version 2>&1 | grep -q 'version' && echo 'npx test passed'",
|
|
42
|
+
"test:cli:verify": "npm run build && kaseki-agent --help && kaseki-agent doctor --help",
|
|
43
|
+
"test:ci": "npm run build && npm run type-check && jest --passWithNoTests && bash run-kaseki-json.test.sh && bash tests/allowlist-glob.test.sh && bash tests/restore-disallowed-changes.test.sh && bash tests/dependency-cache-key.test.sh && bash tests/dependency-restore-mode.test.sh && bash tests/doctor-template-parity.test.sh && bash tests/npm-install-flags.test.sh && bash tests/repo-memory.test.sh && bash scripts/test-github-app.sh",
|
|
44
|
+
"test:watch": "jest --watch",
|
|
45
|
+
"test:coverage": "jest --coverage",
|
|
46
|
+
"lint": "npm run lint:js && npm run lint:sh || true",
|
|
47
|
+
"lint:js": "eslint . src/ --ignore-pattern dist/",
|
|
48
|
+
"lint:js:fix": "eslint . src/ --fix --ignore-pattern dist/",
|
|
49
|
+
"lint:sh": "shellcheck -x kaseki-agent.sh scripts/docker-entrypoint.sh run-kaseki-json.test.sh",
|
|
50
|
+
"lint:fix": "npm run lint:js:fix && npm run lint:sh",
|
|
51
|
+
"kaseki-api": "tsx src/kaseki-api-service.ts",
|
|
52
|
+
"type-check:full": "npm run type-check",
|
|
53
|
+
"type-check:changed": "tsc --noEmit -p tsconfig.changed.json",
|
|
54
|
+
"benchmark:pi-event-filter": "npm run build && RUN_PI_EVENT_FILTER_PERF=1 jest --testMatch \"<rootDir>/perf/**/*.benchmark.test.ts\" --runInBand",
|
|
55
|
+
"release": "semantic-release",
|
|
56
|
+
"release:dry": "semantic-release --dry-run"
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"express": "^4.18.2",
|
|
60
|
+
"zod": "^3.22.4"
|
|
61
|
+
},
|
|
62
|
+
"devDependencies": {
|
|
63
|
+
"@semantic-release/changelog": "^6.0.3",
|
|
64
|
+
"@semantic-release/commit-analyzer": "^13.0.1",
|
|
65
|
+
"@semantic-release/git": "^10.0.1",
|
|
66
|
+
"@semantic-release/github": "^12.0.6",
|
|
67
|
+
"@semantic-release/release-notes-generator": "^14.1.0",
|
|
68
|
+
"@types/express": "^4.17.21",
|
|
69
|
+
"@types/jest": "^29.5.14",
|
|
70
|
+
"@types/node": "^22.10.5",
|
|
71
|
+
"@types/uuid": "^9.0.2",
|
|
72
|
+
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
|
73
|
+
"@typescript-eslint/parser": "^7.18.0",
|
|
74
|
+
"conventional-changelog-conventionalcommits": "^9.3.1",
|
|
75
|
+
"eslint": "^8.56.0",
|
|
76
|
+
"jest": "^29.7.0",
|
|
77
|
+
"semantic-release": "^25.0.3",
|
|
78
|
+
"ts-jest": "^29.2.6",
|
|
79
|
+
"ts-node": "^10.9.2",
|
|
80
|
+
"tsx": "^4.21.0",
|
|
81
|
+
"typescript": "^5.7.3"
|
|
82
|
+
}
|
|
83
|
+
}
|
package/perf/README.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Pi event filter benchmark
|
|
2
|
+
|
|
3
|
+
The 200k-event `pi-event-filter` scenario is intentionally kept outside `src/`
|
|
4
|
+
so it is not discovered by the normal Jest unit/integration configuration. Treat
|
|
5
|
+
it as an explicit nightly or ad-hoc benchmark check, not as regular CI coverage.
|
|
6
|
+
|
|
7
|
+
## Required build artifact
|
|
8
|
+
|
|
9
|
+
Build before running the benchmark:
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm run build
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The benchmark launches Node against the compiled artifact at:
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
dist/pi-event-filter.js
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
If that file is missing or stale, run `npm run build` again before collecting
|
|
22
|
+
benchmark data.
|
|
23
|
+
|
|
24
|
+
## Required environment variables
|
|
25
|
+
|
|
26
|
+
Run through the package script for the standard setup:
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
npm run benchmark:pi-event-filter
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The script sets `RUN_PI_EVENT_FILTER_PERF=1`, which enables the otherwise skipped
|
|
33
|
+
benchmark suite. Equivalent enablement variables accepted by the benchmark are:
|
|
34
|
+
|
|
35
|
+
- `RUN_PI_EVENT_FILTER_PERF=1` for manual benchmark runs.
|
|
36
|
+
- `CI_NIGHTLY=1` for scheduled nightly workers.
|
|
37
|
+
- `PERF_TESTS=1` for generic performance-test jobs.
|
|
38
|
+
|
|
39
|
+
The benchmark process also sets `PI_EVENT_FILTER_TRACK_RSS=1` for the child
|
|
40
|
+
`dist/pi-event-filter.js` process so the worker prints `MAX_RSS_BYTES=<bytes>` to
|
|
41
|
+
stderr for assertion and trend collection.
|
|
42
|
+
|
|
43
|
+
## Expected worker memory profile
|
|
44
|
+
|
|
45
|
+
`pi-event-filter` is expected to stream JSONL without retaining the 200k-event
|
|
46
|
+
input in memory. The benchmark asserts the maximum worker RSS reported by the
|
|
47
|
+
child process:
|
|
48
|
+
|
|
49
|
+
- Nightly workers (`CI_NIGHTLY=1`): less than 450 MiB.
|
|
50
|
+
- Manual/ad-hoc runs: less than 800 MiB to allow for unknown local host overhead
|
|
51
|
+
while still catching large regressions.
|
|
52
|
+
|
|
53
|
+
Use the stderr `MAX_RSS_BYTES` value as the benchmark datapoint when tracking
|
|
54
|
+
memory drift across nightly runs.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { spawn } from 'node:child_process';
|
|
5
|
+
|
|
6
|
+
const runPerf =
|
|
7
|
+
process.env.RUN_PI_EVENT_FILTER_PERF === '1' ||
|
|
8
|
+
process.env.CI_NIGHTLY === '1' ||
|
|
9
|
+
process.env.PERF_TESTS === '1';
|
|
10
|
+
const describePerf = runPerf ? describe : describe.skip;
|
|
11
|
+
|
|
12
|
+
describePerf('pi-event-filter nightly benchmark suite', () => {
|
|
13
|
+
test('200k event benchmark completes within worker memory profile', async () => {
|
|
14
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pi-event-filter-perf-'));
|
|
15
|
+
const inputPath = path.join(tmpDir, 'in.jsonl');
|
|
16
|
+
const outputPath = path.join(tmpDir, 'out.jsonl');
|
|
17
|
+
const summaryPath = path.join(tmpDir, 'summary.json');
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
const totalEvents = 200_000;
|
|
21
|
+
const filteredEvery = 5;
|
|
22
|
+
const expectedKept = totalEvents - Math.floor(totalEvents / filteredEvery);
|
|
23
|
+
|
|
24
|
+
const input = fs.createWriteStream(inputPath, { encoding: 'utf8' });
|
|
25
|
+
for (let i = 0; i < totalEvents; i++) {
|
|
26
|
+
const filtered = i % filteredEvery === 0;
|
|
27
|
+
const event = {
|
|
28
|
+
type: i % 2 === 0 ? 'tool_execution_start' : 'tool_execution_end',
|
|
29
|
+
timestamp: `2026-01-01T00:00:${String(i % 60).padStart(2, '0')}.000Z`,
|
|
30
|
+
message: { model: 'pi-stress-model', api: 'pi-stress-api' },
|
|
31
|
+
assistantMessageEvent: {
|
|
32
|
+
type: filtered ? 'thinking_delta' : 'output_delta',
|
|
33
|
+
partial: {
|
|
34
|
+
timestamp: `2026-01-01T00:00:${String((i + 1) % 60).padStart(2, '0')}.000Z`,
|
|
35
|
+
content: [
|
|
36
|
+
{ type: 'thinking', text: 'internal note' },
|
|
37
|
+
{ type: 'output_text', text: `event-${i}` },
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
const canContinue = input.write(`${JSON.stringify(event)}\n`);
|
|
43
|
+
if (!canContinue) {
|
|
44
|
+
await new Promise<void>((resolve) => input.once('drain', resolve));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
await new Promise<void>((resolve) => input.end(resolve));
|
|
48
|
+
|
|
49
|
+
const script = [
|
|
50
|
+
path.join(__dirname, '..', 'dist', 'pi-event-filter.js'),
|
|
51
|
+
inputPath,
|
|
52
|
+
outputPath,
|
|
53
|
+
summaryPath,
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
const child = spawn(process.execPath, script, {
|
|
57
|
+
env: { ...process.env, PI_EVENT_FILTER_TRACK_RSS: '1' },
|
|
58
|
+
});
|
|
59
|
+
let stderr = '';
|
|
60
|
+
child.stderr.on('data', (chunk) => {
|
|
61
|
+
stderr += chunk.toString();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const exitCode = await new Promise<number | null>((resolve, reject) => {
|
|
65
|
+
child.once('error', reject);
|
|
66
|
+
child.once('close', resolve);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
expect(exitCode).toBe(0);
|
|
70
|
+
|
|
71
|
+
const lines = fs.readFileSync(outputPath, 'utf8').trim().split('\n');
|
|
72
|
+
expect(lines).toHaveLength(expectedKept);
|
|
73
|
+
|
|
74
|
+
const summary = JSON.parse(fs.readFileSync(summaryPath, 'utf8'));
|
|
75
|
+
expect(summary.tool_start_count + summary.tool_end_count).toBe(totalEvents);
|
|
76
|
+
expect(summary.invalid_json_lines).toBe(0);
|
|
77
|
+
expect(summary.selected_model).toBe('pi-stress-model');
|
|
78
|
+
expect(summary.selected_api).toBe('pi-stress-api');
|
|
79
|
+
|
|
80
|
+
const maxRssMatch = stderr.match(/MAX_RSS_BYTES=(\d+)/);
|
|
81
|
+
expect(maxRssMatch).not.toBeNull();
|
|
82
|
+
if (!maxRssMatch) return;
|
|
83
|
+
|
|
84
|
+
const memoryMb = Number.parseInt(maxRssMatch[1], 10) / (1024 * 1024);
|
|
85
|
+
|
|
86
|
+
// Threshold guidance:
|
|
87
|
+
// - default (developer laptops/unknown CI): loose guardrail for regressions
|
|
88
|
+
// - nightly perf workers: tighter budget to track drift
|
|
89
|
+
const thresholdMb = process.env.CI_NIGHTLY === '1' ? 450 : 800;
|
|
90
|
+
// Expected profile: a streaming worker should remain well below 450 MiB
|
|
91
|
+
// on nightly hosts; the 800 MiB fallback only protects ad-hoc local runs
|
|
92
|
+
// from large regressions on unknown hardware.
|
|
93
|
+
expect(memoryMb).toBeLessThan(thresholdMb);
|
|
94
|
+
} finally {
|
|
95
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
96
|
+
}
|
|
97
|
+
}, 120000);
|
|
98
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
TMP_DIR="$(mktemp -d)"
|
|
6
|
+
trap 'rm -rf "$TMP_DIR"' EXIT
|
|
7
|
+
|
|
8
|
+
require_file() {
|
|
9
|
+
local file="$1"
|
|
10
|
+
if [ ! -f "$file" ]; then
|
|
11
|
+
echo "Expected file missing: $file" >&2
|
|
12
|
+
exit 1
|
|
13
|
+
fi
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
require_artifacts() {
|
|
17
|
+
local result_dir="$1"
|
|
18
|
+
shift
|
|
19
|
+
for artifact in "$@"; do
|
|
20
|
+
require_file "$result_dir/$artifact"
|
|
21
|
+
done
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
KASEKI_ROOT="$TMP_DIR/kaseki"
|
|
25
|
+
REPO_URL='https://example.com/repo"quoted"'
|
|
26
|
+
GIT_REF='feature/"quoted"/branch'
|
|
27
|
+
OPENROUTER_API_KEY_FILE="$TMP_DIR/missing-secret"
|
|
28
|
+
DOCKER_BIN="$(command -v docker || true)"
|
|
29
|
+
if [ -z "$DOCKER_BIN" ]; then
|
|
30
|
+
echo "Skipping run-kaseki-json.test.sh because docker is not available" >&2
|
|
31
|
+
exit 0
|
|
32
|
+
fi
|
|
33
|
+
TEST_PATH="$(dirname "$DOCKER_BIN"):/usr/bin:/bin"
|
|
34
|
+
|
|
35
|
+
set +e
|
|
36
|
+
env \
|
|
37
|
+
PATH="$TEST_PATH" \
|
|
38
|
+
KASEKI_ROOT="$KASEKI_ROOT" \
|
|
39
|
+
REPO_URL="$REPO_URL" \
|
|
40
|
+
GIT_REF="$GIT_REF" \
|
|
41
|
+
OPENROUTER_API_KEY_FILE="$OPENROUTER_API_KEY_FILE" \
|
|
42
|
+
"$ROOT_DIR/run-kaseki.sh" >/dev/null 2>&1
|
|
43
|
+
status=$?
|
|
44
|
+
set -e
|
|
45
|
+
|
|
46
|
+
if [ "$status" -ne 2 ]; then
|
|
47
|
+
echo "Expected run-kaseki.sh to exit 2 when API key is missing, got: $status" >&2
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
if [ ! -d "$KASEKI_ROOT/kaseki-results/kaseki-1" ]; then
|
|
52
|
+
echo "Expected first auto run to create $KASEKI_ROOT/kaseki-results/kaseki-1" >&2
|
|
53
|
+
exit 1
|
|
54
|
+
fi
|
|
55
|
+
result_dir="$KASEKI_ROOT/kaseki-results/kaseki-1"
|
|
56
|
+
|
|
57
|
+
require_artifacts "$result_dir" host-start.json metadata.json
|
|
58
|
+
|
|
59
|
+
node -e '
|
|
60
|
+
const fs = require("node:fs");
|
|
61
|
+
const hostStart = JSON.parse(fs.readFileSync(process.argv[1], "utf8"));
|
|
62
|
+
const metadata = JSON.parse(fs.readFileSync(process.argv[2], "utf8"));
|
|
63
|
+
const expectedRepo = process.argv[3];
|
|
64
|
+
const expectedRef = process.argv[4];
|
|
65
|
+
if (hostStart.repo_url !== expectedRepo) throw new Error("host-start repo_url mismatch");
|
|
66
|
+
if (hostStart.git_ref !== expectedRef) throw new Error("host-start git_ref mismatch");
|
|
67
|
+
if (metadata.repo_url !== expectedRepo) throw new Error("metadata repo_url mismatch");
|
|
68
|
+
if (metadata.git_ref !== expectedRef) throw new Error("metadata git_ref mismatch");
|
|
69
|
+
' \
|
|
70
|
+
"$result_dir/host-start.json" \
|
|
71
|
+
"$result_dir/metadata.json" \
|
|
72
|
+
"$REPO_URL" \
|
|
73
|
+
"$GIT_REF"
|
|
74
|
+
|
|
75
|
+
require_artifacts "$result_dir" changed-files.txt validation-timings.tsv stage-timings.tsv dependency-cache.log quality.log secret-scan.log git-push.log progress.log progress.jsonl cleanup.log
|
|
76
|
+
|
|
77
|
+
if ! grep -q "missing OPENROUTER_API_KEY" "$result_dir/stage-timings.tsv"; then
|
|
78
|
+
echo "Expected missing-key failure to be recorded in stage-timings.tsv" >&2
|
|
79
|
+
exit 1
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
set +e
|
|
83
|
+
env \
|
|
84
|
+
PATH="$TEST_PATH" \
|
|
85
|
+
KASEKI_ROOT="$KASEKI_ROOT" \
|
|
86
|
+
REPO_URL="$REPO_URL" \
|
|
87
|
+
GIT_REF="$GIT_REF" \
|
|
88
|
+
OPENROUTER_API_KEY_FILE="$OPENROUTER_API_KEY_FILE" \
|
|
89
|
+
"$ROOT_DIR/run-kaseki.sh" >/tmp/kaseki-json-rerun.out 2>/tmp/kaseki-json-rerun.err
|
|
90
|
+
rerun_status=$?
|
|
91
|
+
set -e
|
|
92
|
+
|
|
93
|
+
if [ "$rerun_status" -ne 2 ]; then
|
|
94
|
+
echo "Expected second auto run to skip existing result and fail with missing key at kaseki-2, got: $rerun_status" >&2
|
|
95
|
+
exit 1
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
if [ ! -d "$KASEKI_ROOT/kaseki-results/kaseki-2" ]; then
|
|
99
|
+
echo "Expected second auto run to create kaseki-2 instead of overwriting kaseki-1" >&2
|
|
100
|
+
exit 1
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
if grep -q "node: command not found" "$result_dir/stderr.log"; then
|
|
104
|
+
echo "run-kaseki.sh should not require node on the host" >&2
|
|
105
|
+
exit 1
|
|
106
|
+
fi
|