@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
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { StringDecoder } from 'node:string_decoder';
|
|
4
|
+
/**
|
|
5
|
+
* Handles writing failure artifacts (failure.json, analysis.md, result-summary.md, etc.)
|
|
6
|
+
* when a job fails before complete diagnostics are available.
|
|
7
|
+
*/
|
|
8
|
+
export class FailureArtifactWriter {
|
|
9
|
+
resultsDir;
|
|
10
|
+
constructor(resultsDir) {
|
|
11
|
+
this.resultsDir = resultsDir;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Write API finalization artifacts when job fails before container diagnostics.
|
|
15
|
+
*/
|
|
16
|
+
writeFailureArtifacts(job, cleanup, options) {
|
|
17
|
+
if (job.status !== 'failed' && !job.failureClass) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const resultDir = path.join(this.resultsDir, job.id);
|
|
21
|
+
const now = (job.completedAt || new Date()).toISOString();
|
|
22
|
+
try {
|
|
23
|
+
fs.mkdirSync(resultDir, { recursive: true });
|
|
24
|
+
this.writeFailureJson(resultDir, job, now, cleanup);
|
|
25
|
+
this.writeResultSummary(resultDir, job, now);
|
|
26
|
+
this.writeAnalysis(resultDir, job, now, cleanup, options?.lastStage);
|
|
27
|
+
this.writeMetadata(resultDir, job, now);
|
|
28
|
+
this.writeStderrLog(resultDir, job, options?.stdoutTail, options?.stderrTail);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Best effort diagnostics; never mask the primary job failure.
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
writeFailureJson(resultDir, job, now, cleanup) {
|
|
35
|
+
const failurePath = path.join(resultDir, 'failure.json');
|
|
36
|
+
const shouldWriteFailure = !fs.existsSync(failurePath) || fs.statSync(failurePath).size === 0;
|
|
37
|
+
if (shouldWriteFailure) {
|
|
38
|
+
const payload = {
|
|
39
|
+
failureClass: job.failureClass || 'api_finalized',
|
|
40
|
+
error: job.error || 'Job failed before runner failure metadata was written',
|
|
41
|
+
exitCode: job.exitCode,
|
|
42
|
+
cancelledAt: job.failureClass === 'cancelled' ? now : undefined,
|
|
43
|
+
completedAt: now,
|
|
44
|
+
apiFinalized: true,
|
|
45
|
+
cleanup,
|
|
46
|
+
};
|
|
47
|
+
fs.writeFileSync(failurePath, `${JSON.stringify(payload, null, 2)}\n`, 'utf-8');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
writeResultSummary(resultDir, job, now) {
|
|
51
|
+
const summaryPath = path.join(resultDir, 'result-summary.md');
|
|
52
|
+
const shouldWriteSummary = !fs.existsSync(summaryPath) || fs.statSync(summaryPath).size === 0;
|
|
53
|
+
if (shouldWriteSummary) {
|
|
54
|
+
fs.writeFileSync(summaryPath, [
|
|
55
|
+
`# ${job.id} failed`,
|
|
56
|
+
'',
|
|
57
|
+
`Failure class: ${job.failureClass || 'unknown'}`,
|
|
58
|
+
`Exit code: ${job.exitCode ?? 'unknown'}`,
|
|
59
|
+
`Error: ${job.error || 'unknown'}`,
|
|
60
|
+
`Completed at: ${now}`,
|
|
61
|
+
'',
|
|
62
|
+
].join('\n'), 'utf-8');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
writeAnalysis(resultDir, job, now, cleanup, lastStage) {
|
|
66
|
+
const analysisPath = path.join(resultDir, 'analysis.md');
|
|
67
|
+
const shouldWriteAnalysis = !fs.existsSync(analysisPath) || fs.statSync(analysisPath).size === 0;
|
|
68
|
+
if (shouldWriteAnalysis) {
|
|
69
|
+
fs.writeFileSync(analysisPath, [
|
|
70
|
+
`# Failure analysis for ${job.id}`,
|
|
71
|
+
'',
|
|
72
|
+
'## Completed work',
|
|
73
|
+
`- Job lifecycle entered: ${job.startedAt ? 'running' : 'queued'}`,
|
|
74
|
+
'- API finalization fallback written: yes',
|
|
75
|
+
'',
|
|
76
|
+
'## Failure classification',
|
|
77
|
+
`- Failure class: ${job.failureClass || 'unknown'}`,
|
|
78
|
+
`- Exit code: ${job.exitCode ?? 'unknown'}`,
|
|
79
|
+
`- Error: ${job.error || 'unknown'}`,
|
|
80
|
+
`- Last stage: ${lastStage || 'unknown'}`,
|
|
81
|
+
'',
|
|
82
|
+
'## Known warnings',
|
|
83
|
+
`- Container cleanup attempted: ${cleanup.attempted ? 'yes' : 'no'}`,
|
|
84
|
+
`- Container cleanup ok: ${cleanup.ok ? 'yes' : 'no'}`,
|
|
85
|
+
`- Cleanup detail: ${cleanup.detail || 'none'}`,
|
|
86
|
+
'',
|
|
87
|
+
`Completed at: ${now}`,
|
|
88
|
+
'',
|
|
89
|
+
].join('\n'), 'utf-8');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
writeMetadata(resultDir, job, now) {
|
|
93
|
+
const metadataPath = path.join(resultDir, 'metadata.json');
|
|
94
|
+
const shouldWriteMetadata = !fs.existsSync(metadataPath) || fs.statSync(metadataPath).size === 0;
|
|
95
|
+
if (shouldWriteMetadata) {
|
|
96
|
+
const startedAt = job.startedAt?.toISOString();
|
|
97
|
+
const completedAt = job.completedAt?.toISOString() || now;
|
|
98
|
+
const durationSeconds = job.startedAt && (job.completedAt || now)
|
|
99
|
+
? Math.max(0, Math.round((new Date(completedAt).getTime() - job.startedAt.getTime()) / 1000))
|
|
100
|
+
: undefined;
|
|
101
|
+
const payload = {
|
|
102
|
+
id: job.id,
|
|
103
|
+
status: job.status,
|
|
104
|
+
timestamps: {
|
|
105
|
+
createdAt: job.createdAt.toISOString(),
|
|
106
|
+
startedAt,
|
|
107
|
+
completedAt,
|
|
108
|
+
},
|
|
109
|
+
durations: {
|
|
110
|
+
totalSeconds: durationSeconds,
|
|
111
|
+
},
|
|
112
|
+
runtime: {
|
|
113
|
+
timeoutSeconds: job.effectiveTimeoutSeconds,
|
|
114
|
+
pid: job.processId,
|
|
115
|
+
nodeVersion: process.version,
|
|
116
|
+
platform: process.platform,
|
|
117
|
+
},
|
|
118
|
+
env: {
|
|
119
|
+
taskMode: job.request.taskMode,
|
|
120
|
+
startupCheck: !!job.request.startupCheck,
|
|
121
|
+
},
|
|
122
|
+
failure: {
|
|
123
|
+
failureClass: job.failureClass || 'api_finalized',
|
|
124
|
+
error: job.error || 'Job failed before runner failure metadata was written',
|
|
125
|
+
exitCode: job.exitCode,
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
fs.writeFileSync(metadataPath, `${JSON.stringify(payload, null, 2)}\n`, 'utf-8');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
writeStderrLog(resultDir, job, stdoutTail, stderrTail) {
|
|
132
|
+
const stderrPath = path.join(resultDir, 'stderr.log');
|
|
133
|
+
const shouldWriteStderr = !fs.existsSync(stderrPath) || fs.statSync(stderrPath).size === 0;
|
|
134
|
+
if (shouldWriteStderr) {
|
|
135
|
+
const decodedStderr = stderrTail ? this.decodeUtf8Tail(stderrTail) : '';
|
|
136
|
+
const decodedStdout = stdoutTail ? this.decodeUtf8Tail(stdoutTail) : '';
|
|
137
|
+
const content = [
|
|
138
|
+
'stderr fallback generated by API finalization',
|
|
139
|
+
`failureClass=${job.failureClass || 'unknown'} exitCode=${job.exitCode ?? 'unknown'}`,
|
|
140
|
+
`error=${job.error || 'unknown'}`,
|
|
141
|
+
'',
|
|
142
|
+
decodedStderr ? '--- captured stderr tail ---' : '',
|
|
143
|
+
decodedStderr,
|
|
144
|
+
decodedStdout ? '--- captured stdout tail ---' : '',
|
|
145
|
+
decodedStdout,
|
|
146
|
+
]
|
|
147
|
+
.filter(Boolean)
|
|
148
|
+
.join('\n');
|
|
149
|
+
fs.writeFileSync(stderrPath, `${content}\n`, 'utf-8');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
decodeUtf8Tail(tail) {
|
|
153
|
+
const decoder = new StringDecoder('utf8');
|
|
154
|
+
return decoder.end(tail);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=failure-artifact-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-artifact-writer.js","sourceRoot":"","sources":["../../src/utils/failure-artifact-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
/**
|
|
3
|
+
* Check if a file exists and is non-empty.
|
|
4
|
+
* Used for artifact availability checks.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isNonEmptyFile(filePath: string): boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Read the first line of a file.
|
|
9
|
+
* Used for metadata extraction.
|
|
10
|
+
*/
|
|
11
|
+
export declare function readFirstLine(filePath: string): string | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Read the tail of a file (last N lines).
|
|
14
|
+
* Used for log truncation.
|
|
15
|
+
*/
|
|
16
|
+
export declare function readTailLines(content: string, maxLines: number): string;
|
|
17
|
+
/**
|
|
18
|
+
* Read the final complete non-empty JSONL event from a file tail.
|
|
19
|
+
* Reads at most maxBytes from the end of the file so large progress logs do not
|
|
20
|
+
* need to be loaded fully for status responses.
|
|
21
|
+
*/
|
|
22
|
+
export declare function readLastJsonlEvent(filePath: string, maxBytes?: number): Record<string, unknown> | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Execute a shell command and return its output.
|
|
25
|
+
* Delegates to subprocess-helpers for consolidated subprocess handling.
|
|
26
|
+
* Used for system diagnostics (e.g., git commands, docker info).
|
|
27
|
+
*/
|
|
28
|
+
export declare function commandOutput(command: string, args: string[], cwd?: string): string | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a file path exists.
|
|
31
|
+
*/
|
|
32
|
+
export declare function fileExists(filePath: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Read a file's content as text, or return null if unavailable.
|
|
35
|
+
*/
|
|
36
|
+
export declare function readFileContent(filePath: string): string | null;
|
|
37
|
+
/**
|
|
38
|
+
* Get file stats (size, modified time, etc.).
|
|
39
|
+
*/
|
|
40
|
+
export declare function getFileStats(filePath: string): fs.Stats | null;
|
|
41
|
+
//# sourceMappingURL=file-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-helpers.d.ts","sourceRoot":"","sources":["../../src/utils/file-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAGzB;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMxD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOlE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUvE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CA0D1G;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE/F;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG,IAAI,CAM9D"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import { commandOutput as executeCommand } from '../lib/subprocess-helpers.js';
|
|
3
|
+
/**
|
|
4
|
+
* Check if a file exists and is non-empty.
|
|
5
|
+
* Used for artifact availability checks.
|
|
6
|
+
*/
|
|
7
|
+
export function isNonEmptyFile(filePath) {
|
|
8
|
+
try {
|
|
9
|
+
return fs.statSync(filePath).size > 0;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Read the first line of a file.
|
|
17
|
+
* Used for metadata extraction.
|
|
18
|
+
*/
|
|
19
|
+
export function readFirstLine(filePath) {
|
|
20
|
+
try {
|
|
21
|
+
const value = fs.readFileSync(filePath, 'utf-8').trim().split(/\r?\n/)[0];
|
|
22
|
+
return value || undefined;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Read the tail of a file (last N lines).
|
|
30
|
+
* Used for log truncation.
|
|
31
|
+
*/
|
|
32
|
+
export function readTailLines(content, maxLines) {
|
|
33
|
+
if (maxLines <= 0) {
|
|
34
|
+
return '';
|
|
35
|
+
}
|
|
36
|
+
const lines = content.split(/\r?\n/);
|
|
37
|
+
if (lines.length <= maxLines) {
|
|
38
|
+
return content;
|
|
39
|
+
}
|
|
40
|
+
return lines.slice(-maxLines).join('\n');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Read the final complete non-empty JSONL event from a file tail.
|
|
44
|
+
* Reads at most maxBytes from the end of the file so large progress logs do not
|
|
45
|
+
* need to be loaded fully for status responses.
|
|
46
|
+
*/
|
|
47
|
+
export function readLastJsonlEvent(filePath, maxBytes = 65536) {
|
|
48
|
+
if (maxBytes <= 0) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
let fd;
|
|
52
|
+
try {
|
|
53
|
+
fd = fs.openSync(filePath, 'r');
|
|
54
|
+
const stats = fs.fstatSync(fd);
|
|
55
|
+
if (!stats.isFile() || stats.size === 0) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
const bytesToRead = Math.min(stats.size, maxBytes);
|
|
59
|
+
const start = stats.size - bytesToRead;
|
|
60
|
+
const buffer = Buffer.alloc(bytesToRead);
|
|
61
|
+
const bytesRead = fs.readSync(fd, buffer, 0, bytesToRead, start);
|
|
62
|
+
if (bytesRead <= 0) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
let tail = buffer.subarray(0, bytesRead).toString('utf-8');
|
|
66
|
+
const endsWithLineBreak = /[\r\n]$/.test(tail);
|
|
67
|
+
if (!endsWithLineBreak) {
|
|
68
|
+
const lastLineBreak = Math.max(tail.lastIndexOf('\n'), tail.lastIndexOf('\r'));
|
|
69
|
+
const shouldTreatOnlyLineAsComplete = start === 0 && lastLineBreak === -1;
|
|
70
|
+
if (!shouldTreatOnlyLineAsComplete) {
|
|
71
|
+
if (lastLineBreak === -1) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
tail = tail.slice(0, lastLineBreak + 1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const lines = tail.split(/\r?\n/);
|
|
78
|
+
for (let index = lines.length - 1; index >= 0; index -= 1) {
|
|
79
|
+
const line = lines[index].trim();
|
|
80
|
+
if (!line) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const parsed = JSON.parse(line);
|
|
84
|
+
return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : undefined;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
finally {
|
|
91
|
+
if (fd !== undefined) {
|
|
92
|
+
try {
|
|
93
|
+
fs.closeSync(fd);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Ignore close errors; callers treat the event as best-effort metadata.
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Execute a shell command and return its output.
|
|
104
|
+
* Delegates to subprocess-helpers for consolidated subprocess handling.
|
|
105
|
+
* Used for system diagnostics (e.g., git commands, docker info).
|
|
106
|
+
*/
|
|
107
|
+
export function commandOutput(command, args, cwd) {
|
|
108
|
+
return executeCommand(command, args, cwd);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Check if a file path exists.
|
|
112
|
+
*/
|
|
113
|
+
export function fileExists(filePath) {
|
|
114
|
+
try {
|
|
115
|
+
return fs.existsSync(filePath);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Read a file's content as text, or return null if unavailable.
|
|
123
|
+
*/
|
|
124
|
+
export function readFileContent(filePath) {
|
|
125
|
+
try {
|
|
126
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get file stats (size, modified time, etc.).
|
|
134
|
+
*/
|
|
135
|
+
export function getFileStats(filePath) {
|
|
136
|
+
try {
|
|
137
|
+
return fs.statSync(filePath);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=file-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-helpers.js","sourceRoot":"","sources":["../../src/utils/file-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client factory for creating API requests with retry logic.
|
|
3
|
+
* Consolidates HTTP fetch + error handling patterns across kaseki-api-client.ts.
|
|
4
|
+
*/
|
|
5
|
+
export interface HttpRequestOptions {
|
|
6
|
+
method: 'GET' | 'POST' | 'DELETE';
|
|
7
|
+
headers?: Record<string, string>;
|
|
8
|
+
body?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RetryConfig {
|
|
11
|
+
maxAttempts: number;
|
|
12
|
+
initialDelayMs: number;
|
|
13
|
+
maxDelayMs: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Creates an HTTP request factory with retry logic.
|
|
17
|
+
*/
|
|
18
|
+
export declare class HttpClientFactory {
|
|
19
|
+
private retryConfig;
|
|
20
|
+
constructor(retryConfig?: Partial<RetryConfig>);
|
|
21
|
+
/**
|
|
22
|
+
* Create and execute an HTTP request with automatic retry on failure.
|
|
23
|
+
*/
|
|
24
|
+
request<T>(url: string, options: HttpRequestOptions, parser: (data: unknown) => T, description?: string): Promise<T>;
|
|
25
|
+
/**
|
|
26
|
+
* Create and execute an HTTP request that returns text content.
|
|
27
|
+
*/
|
|
28
|
+
requestText(url: string, options: HttpRequestOptions, description?: string): Promise<string>;
|
|
29
|
+
/**
|
|
30
|
+
* Create and execute an HTTP request that returns binary data.
|
|
31
|
+
*/
|
|
32
|
+
requestBlob(url: string, options: HttpRequestOptions, description?: string): Promise<Blob>;
|
|
33
|
+
/**
|
|
34
|
+
* Execute a function with exponential backoff retry.
|
|
35
|
+
*/
|
|
36
|
+
private retryWithBackoff;
|
|
37
|
+
/**
|
|
38
|
+
* Parse error detail from a response body.
|
|
39
|
+
*/
|
|
40
|
+
private parseErrorDetail;
|
|
41
|
+
/**
|
|
42
|
+
* Type guard for checking if a value is an object/record.
|
|
43
|
+
*/
|
|
44
|
+
private isRecord;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=http-client-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client-factory.d.ts","sourceRoot":"","sources":["../../src/utils/http-client-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAWD;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,WAAW,CAAc;gBAErB,WAAW,GAAE,OAAO,CAAC,WAAW,CAAM;IAIlD;;OAEG;IACG,OAAO,CAAC,CAAC,EACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,kBAAkB,EAC3B,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,CAAC,EAC5B,WAAW,GAAE,MAAuB,GACnC,OAAO,CAAC,CAAC,CAAC;IAoBb;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,WAAW,GAAE,MAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IAYlH;;OAEG;IACG,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,WAAW,GAAE,MAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYhH;;OAEG;YACW,gBAAgB;IA0C9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;OAEG;IACH,OAAO,CAAC,QAAQ;CAGjB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client factory for creating API requests with retry logic.
|
|
3
|
+
* Consolidates HTTP fetch + error handling patterns across kaseki-api-client.ts.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Default retry configuration for HTTP requests.
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_RETRY_CONFIG = {
|
|
9
|
+
maxAttempts: 3,
|
|
10
|
+
initialDelayMs: 1000,
|
|
11
|
+
maxDelayMs: 8000,
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Creates an HTTP request factory with retry logic.
|
|
15
|
+
*/
|
|
16
|
+
export class HttpClientFactory {
|
|
17
|
+
retryConfig;
|
|
18
|
+
constructor(retryConfig = {}) {
|
|
19
|
+
this.retryConfig = { ...DEFAULT_RETRY_CONFIG, ...retryConfig };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Create and execute an HTTP request with automatic retry on failure.
|
|
23
|
+
*/
|
|
24
|
+
async request(url, options, parser, description = 'HTTP request') {
|
|
25
|
+
return this.retryWithBackoff(async () => {
|
|
26
|
+
const response = await fetch(url, options);
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
let errorDetail;
|
|
29
|
+
try {
|
|
30
|
+
const errorData = await response.json();
|
|
31
|
+
errorDetail = this.parseErrorDetail(errorData);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Ignore non-JSON error payloads
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`${description} failed: ${errorDetail ?? response.statusText}`);
|
|
37
|
+
}
|
|
38
|
+
const data = await response.json();
|
|
39
|
+
return parser(data);
|
|
40
|
+
}, description);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create and execute an HTTP request that returns text content.
|
|
44
|
+
*/
|
|
45
|
+
async requestText(url, options, description = 'HTTP request') {
|
|
46
|
+
return this.retryWithBackoff(async () => {
|
|
47
|
+
const response = await fetch(url, options);
|
|
48
|
+
if (!response.ok) {
|
|
49
|
+
throw new Error(`${description} failed: ${response.status}`);
|
|
50
|
+
}
|
|
51
|
+
return response.text();
|
|
52
|
+
}, description);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create and execute an HTTP request that returns binary data.
|
|
56
|
+
*/
|
|
57
|
+
async requestBlob(url, options, description = 'HTTP request') {
|
|
58
|
+
return this.retryWithBackoff(async () => {
|
|
59
|
+
const response = await fetch(url, options);
|
|
60
|
+
if (!response.ok) {
|
|
61
|
+
throw new Error(`${description} failed: ${response.status}`);
|
|
62
|
+
}
|
|
63
|
+
return response.blob();
|
|
64
|
+
}, description);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Execute a function with exponential backoff retry.
|
|
68
|
+
*/
|
|
69
|
+
async retryWithBackoff(fn, description = 'Operation') {
|
|
70
|
+
let lastError;
|
|
71
|
+
for (let attempt = 0; attempt < this.retryConfig.maxAttempts; attempt++) {
|
|
72
|
+
try {
|
|
73
|
+
return await fn();
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
77
|
+
// Don't retry on 4xx errors (except 429 Too Many Requests)
|
|
78
|
+
const is4xxError = lastError.message.includes('400') ||
|
|
79
|
+
lastError.message.includes('401') ||
|
|
80
|
+
lastError.message.includes('403') ||
|
|
81
|
+
lastError.message.includes('404');
|
|
82
|
+
if (is4xxError && !lastError.message.includes('429')) {
|
|
83
|
+
throw lastError;
|
|
84
|
+
}
|
|
85
|
+
// If this is the last attempt, throw
|
|
86
|
+
if (attempt === this.retryConfig.maxAttempts - 1) {
|
|
87
|
+
throw lastError;
|
|
88
|
+
}
|
|
89
|
+
// Calculate backoff with exponential increase
|
|
90
|
+
const delayMs = Math.min(this.retryConfig.initialDelayMs * Math.pow(2, attempt), this.retryConfig.maxDelayMs);
|
|
91
|
+
// Wait before retrying
|
|
92
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
throw lastError || new Error(`${description} failed after ${this.retryConfig.maxAttempts} attempts`);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Parse error detail from a response body.
|
|
99
|
+
*/
|
|
100
|
+
parseErrorDetail(value) {
|
|
101
|
+
if (!this.isRecord(value)) {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
const detail = value.detail;
|
|
105
|
+
return typeof detail === 'string' ? detail : undefined;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Type guard for checking if a value is an object/record.
|
|
109
|
+
*/
|
|
110
|
+
isRecord(value) {
|
|
111
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=http-client-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client-factory.js","sourceRoot":"","sources":["../../src/utils/http-client-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { StructuredProgress } from '../kaseki-api-types';
|
|
2
|
+
export declare function sanitizeProgressMessage(message: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* Normalize a progress event by ensuring common fields are standardized.
|
|
5
|
+
* Ensures message is populated from stage/detail, and timestamp is normalized to updatedAt.
|
|
6
|
+
*/
|
|
7
|
+
export declare function normalizeProgressEvent(event: Record<string, unknown>): Record<string, unknown>;
|
|
8
|
+
/**
|
|
9
|
+
* Convert a progress event to a StructuredProgress object.
|
|
10
|
+
* Always ensures stage is present; returns null only if event is invalid.
|
|
11
|
+
*/
|
|
12
|
+
export declare function toStructuredProgress(event: Record<string, unknown>, fallbackStage?: string): StructuredProgress | null;
|
|
13
|
+
//# sourceMappingURL=progress-normalizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-normalizer.d.ts","sourceRoot":"","sources":["../../src/utils/progress-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAKzD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAM/D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgB9F;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,aAAa,GAAE,MAAkB,GAChC,kBAAkB,GAAG,IAAI,CAyB3B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const SHELL_DIAGNOSTIC_PATTERN = /\/[^\s:]+(?:\/[^\s:]+)*:\s+line\s+\d+:\s+.*$/;
|
|
2
|
+
const GIT_CLONE_STDERR_PATTERN = /Cloning into '[^']+'\.\.\.$/;
|
|
3
|
+
export function sanitizeProgressMessage(message) {
|
|
4
|
+
return message
|
|
5
|
+
.replace(SHELL_DIAGNOSTIC_PATTERN, '')
|
|
6
|
+
.replace(GIT_CLONE_STDERR_PATTERN, '')
|
|
7
|
+
.replace(/\s+/g, ' ')
|
|
8
|
+
.trim();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Normalize a progress event by ensuring common fields are standardized.
|
|
12
|
+
* Ensures message is populated from stage/detail, and timestamp is normalized to updatedAt.
|
|
13
|
+
*/
|
|
14
|
+
export function normalizeProgressEvent(event) {
|
|
15
|
+
const normalized = { ...event };
|
|
16
|
+
if (typeof normalized.stage === 'string') {
|
|
17
|
+
if (typeof normalized.message !== 'string' && typeof normalized.detail === 'string') {
|
|
18
|
+
normalized.message = sanitizeProgressMessage(normalized.detail);
|
|
19
|
+
}
|
|
20
|
+
if (typeof normalized.message !== 'string') {
|
|
21
|
+
normalized.message = normalized.stage;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
normalized.message = sanitizeProgressMessage(normalized.message);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (typeof normalized.updatedAt !== 'string' && typeof normalized.timestamp === 'string') {
|
|
28
|
+
normalized.updatedAt = normalized.timestamp;
|
|
29
|
+
}
|
|
30
|
+
return normalized;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Convert a progress event to a StructuredProgress object.
|
|
34
|
+
* Always ensures stage is present; returns null only if event is invalid.
|
|
35
|
+
*/
|
|
36
|
+
export function toStructuredProgress(event, fallbackStage = 'running') {
|
|
37
|
+
const stage = typeof event.stage === 'string' ? event.stage.trim() : fallbackStage;
|
|
38
|
+
if (!stage) {
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
const message = typeof event.message === 'string'
|
|
42
|
+
? sanitizeProgressMessage(event.message)
|
|
43
|
+
: typeof event.detail === 'string'
|
|
44
|
+
? sanitizeProgressMessage(event.detail)
|
|
45
|
+
: undefined;
|
|
46
|
+
const numericPercent = typeof event.percentComplete === 'number' ? event.percentComplete : undefined;
|
|
47
|
+
const percentFromPercent = typeof event.percent === 'number' ? event.percent : undefined;
|
|
48
|
+
const percentComplete = numericPercent ?? percentFromPercent;
|
|
49
|
+
const updatedAt = typeof event.updatedAt === 'string' ? event.updatedAt : typeof event.timestamp === 'string' ? event.timestamp : undefined;
|
|
50
|
+
return {
|
|
51
|
+
stage,
|
|
52
|
+
percentComplete,
|
|
53
|
+
message: message || stage,
|
|
54
|
+
updatedAt,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=progress-normalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-normalizer.js","sourceRoot":"","sources":["../../src/utils/progress-normalizer.ts"],"names":[],"mappings":"AAEA,MAAM,wBAAwB,GAAG,8CAA8C,CAAC;AAChF,MAAM,wBAAwB,GAAG,6BAA6B,CAAC;AAE/D,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,OAAO,OAAO;SACX,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC;SACrC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC;SACrC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAA8B;IACnE,MAAM,UAAU,GAA4B,EAAE,GAAG,KAAK,EAAE,CAAC;IACzD,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACzC,IAAI,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACpF,UAAU,CAAC,OAAO,GAAG,uBAAuB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC3C,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,OAAO,GAAG,uBAAuB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,IAAI,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACzF,UAAU,CAAC,SAAS,GAAG,UAAU,CAAC,SAAS,CAAC;IAC9C,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAA8B,EAC9B,gBAAwB,SAAS;IAEjC,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;IACnF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GACX,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QAC/B,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC;QACxC,CAAC,CAAC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;YAChC,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC,MAAM,CAAC;YACvC,CAAC,CAAC,SAAS,CAAC;IAElB,MAAM,cAAc,GAAG,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC;IACrG,MAAM,kBAAkB,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,MAAM,eAAe,GAAG,cAAc,IAAI,kBAAkB,CAAC;IAC7D,MAAM,SAAS,GACb,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5H,OAAO;QACL,KAAK;QACL,eAAe;QACf,OAAO,EAAE,OAAO,IAAI,KAAK;QACzB,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Response } from 'express';
|
|
2
|
+
import { StatusResponse } from '../kaseki-api-types';
|
|
3
|
+
/**
|
|
4
|
+
* Send a standardized error response.
|
|
5
|
+
* Consolidates error response generation across all endpoints.
|
|
6
|
+
*/
|
|
7
|
+
export declare function sendErrorResponse(res: Response, status: number, title: string, detail: string): void;
|
|
8
|
+
/**
|
|
9
|
+
* Build a StatusResponse from job metadata.
|
|
10
|
+
* Consolidates StatusResponse construction logic used in multiple routes.
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildStatusResponse(jobData: {
|
|
13
|
+
id: string;
|
|
14
|
+
status: 'queued' | 'running' | 'completed' | 'failed';
|
|
15
|
+
exitCode?: number | null;
|
|
16
|
+
failureClass?: string | null;
|
|
17
|
+
correlationId?: string;
|
|
18
|
+
requestId?: string;
|
|
19
|
+
error?: string | null;
|
|
20
|
+
resultDir?: string;
|
|
21
|
+
}): StatusResponse;
|
|
22
|
+
/**
|
|
23
|
+
* Send a file response with appropriate headers for artifact delivery.
|
|
24
|
+
* Handles Content-Type detection and streaming.
|
|
25
|
+
*/
|
|
26
|
+
export declare function sendFileResponse(res: Response, filePath: string, fileName: string, options?: {
|
|
27
|
+
stream?: boolean;
|
|
28
|
+
}): void;
|
|
29
|
+
/**
|
|
30
|
+
* Detect Content-Type based on file extension.
|
|
31
|
+
* Used for artifact responses.
|
|
32
|
+
*/
|
|
33
|
+
export declare function detectContentType(fileName: string): string;
|
|
34
|
+
//# sourceMappingURL=response-helpers.d.ts.map
|