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