@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,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instance Manager
|
|
3
|
+
*
|
|
4
|
+
* Handles kaseki instance lifecycle: naming, directories, metadata
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs/promises';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { createLogger } from '../logger.js';
|
|
9
|
+
const logger = createLogger('instance');
|
|
10
|
+
export class InstanceManager {
|
|
11
|
+
rootDir;
|
|
12
|
+
instanceId = null;
|
|
13
|
+
constructor(rootDir = '/agents') {
|
|
14
|
+
this.rootDir = rootDir;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate or get next instance ID
|
|
18
|
+
*/
|
|
19
|
+
async getOrCreateInstanceId() {
|
|
20
|
+
if (this.instanceId) {
|
|
21
|
+
return this.instanceId;
|
|
22
|
+
}
|
|
23
|
+
// Find next available instance number
|
|
24
|
+
const runsDir = path.join(this.rootDir, 'kaseki-runs');
|
|
25
|
+
let instanceNum = 1;
|
|
26
|
+
try {
|
|
27
|
+
const entries = await fs.readdir(runsDir, { withFileTypes: true });
|
|
28
|
+
const existingNums = entries
|
|
29
|
+
.filter((entry) => entry.isDirectory() && entry.name.startsWith('kaseki-'))
|
|
30
|
+
.map((entry) => {
|
|
31
|
+
const match = entry.name.match(/kaseki-(\d+)/);
|
|
32
|
+
return match ? parseInt(match[1], 10) : 0;
|
|
33
|
+
})
|
|
34
|
+
.filter((num) => num > 0);
|
|
35
|
+
if (existingNums.length > 0) {
|
|
36
|
+
instanceNum = Math.max(...existingNums) + 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// Directory doesn't exist yet, that's fine
|
|
41
|
+
instanceNum = 1;
|
|
42
|
+
}
|
|
43
|
+
this.instanceId = `kaseki-${instanceNum}`;
|
|
44
|
+
logger.debug(`Generated instance ID: ${this.instanceId}`);
|
|
45
|
+
return this.instanceId;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get workspace directory path
|
|
49
|
+
*/
|
|
50
|
+
async getWorkspaceDir() {
|
|
51
|
+
const id = await this.getOrCreateInstanceId();
|
|
52
|
+
return path.join(this.rootDir, 'kaseki-runs', id);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Get results directory path
|
|
56
|
+
*/
|
|
57
|
+
async getResultsDir() {
|
|
58
|
+
const id = await this.getOrCreateInstanceId();
|
|
59
|
+
return path.join(this.rootDir, 'kaseki-results', id);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get cache directory path
|
|
63
|
+
*/
|
|
64
|
+
getCacheDir() {
|
|
65
|
+
return path.join(this.rootDir, 'kaseki-cache');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create instance directories
|
|
69
|
+
*/
|
|
70
|
+
async createDirectories() {
|
|
71
|
+
const workspace = await this.getWorkspaceDir();
|
|
72
|
+
const results = await this.getResultsDir();
|
|
73
|
+
try {
|
|
74
|
+
await fs.mkdir(workspace, { recursive: true });
|
|
75
|
+
await fs.mkdir(results, { recursive: true });
|
|
76
|
+
logger.debug(`Created instance directories for ${this.instanceId}`);
|
|
77
|
+
return { workspace, results };
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
throw new Error(`Failed to create instance directories: ${error}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Initialize metadata file
|
|
85
|
+
*/
|
|
86
|
+
async initializeMetadata(metadata) {
|
|
87
|
+
const id = await this.getOrCreateInstanceId();
|
|
88
|
+
const resultsDir = await this.getResultsDir();
|
|
89
|
+
const metadataPath = path.join(resultsDir, 'metadata.json');
|
|
90
|
+
const fullMetadata = {
|
|
91
|
+
id,
|
|
92
|
+
createdAt: new Date().toISOString(),
|
|
93
|
+
status: 'running',
|
|
94
|
+
stages: {},
|
|
95
|
+
...metadata,
|
|
96
|
+
};
|
|
97
|
+
try {
|
|
98
|
+
await fs.writeFile(metadataPath, JSON.stringify(fullMetadata, null, 2), 'utf-8');
|
|
99
|
+
logger.debug(`Initialized metadata for ${id}`);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
throw new Error(`Failed to initialize metadata: ${error}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Update metadata
|
|
107
|
+
*/
|
|
108
|
+
async updateMetadata(updates) {
|
|
109
|
+
const resultsDir = await this.getResultsDir();
|
|
110
|
+
const metadataPath = path.join(resultsDir, 'metadata.json');
|
|
111
|
+
try {
|
|
112
|
+
let metadata = {
|
|
113
|
+
id: this.instanceId || '',
|
|
114
|
+
createdAt: new Date().toISOString(),
|
|
115
|
+
status: 'running',
|
|
116
|
+
};
|
|
117
|
+
// Read existing metadata
|
|
118
|
+
try {
|
|
119
|
+
const content = await fs.readFile(metadataPath, 'utf-8');
|
|
120
|
+
metadata = JSON.parse(content);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// File doesn't exist yet, that's fine
|
|
124
|
+
}
|
|
125
|
+
// Merge updates
|
|
126
|
+
const updated = { ...metadata, ...updates };
|
|
127
|
+
// Write back
|
|
128
|
+
await fs.writeFile(metadataPath, JSON.stringify(updated, null, 2), 'utf-8');
|
|
129
|
+
logger.debug(`Updated metadata for ${this.instanceId}`);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
logger.warn(`Failed to update metadata: ${error}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Record stage timing
|
|
137
|
+
*/
|
|
138
|
+
async recordStage(stageName, exitCode, startTime, endTime) {
|
|
139
|
+
const resultsDir = await this.getResultsDir();
|
|
140
|
+
const metadataPath = path.join(resultsDir, 'metadata.json');
|
|
141
|
+
try {
|
|
142
|
+
let metadata = {
|
|
143
|
+
id: this.instanceId || '',
|
|
144
|
+
createdAt: new Date().toISOString(),
|
|
145
|
+
status: 'running',
|
|
146
|
+
};
|
|
147
|
+
try {
|
|
148
|
+
const content = await fs.readFile(metadataPath, 'utf-8');
|
|
149
|
+
metadata = JSON.parse(content);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// File doesn't exist
|
|
153
|
+
}
|
|
154
|
+
if (!metadata.stages) {
|
|
155
|
+
metadata.stages = {};
|
|
156
|
+
}
|
|
157
|
+
metadata.stages[stageName] = {
|
|
158
|
+
startTime: startTime?.toISOString(),
|
|
159
|
+
endTime: endTime?.toISOString(),
|
|
160
|
+
exitCode,
|
|
161
|
+
duration: startTime && endTime ?
|
|
162
|
+
(endTime.getTime() - startTime.getTime()) / 1000 : undefined,
|
|
163
|
+
};
|
|
164
|
+
await fs.writeFile(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');
|
|
165
|
+
logger.debug(`Recorded stage: ${stageName} (exit code: ${exitCode})`);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
logger.warn(`Failed to record stage: ${error}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Finalize instance metadata
|
|
173
|
+
*/
|
|
174
|
+
async finalize(exitCode) {
|
|
175
|
+
await this.updateMetadata({
|
|
176
|
+
completedAt: new Date().toISOString(),
|
|
177
|
+
status: exitCode === 0 ? 'completed' : 'failed',
|
|
178
|
+
exitCode,
|
|
179
|
+
});
|
|
180
|
+
logger.info(`Finalized instance ${this.instanceId}: exit code ${exitCode}`);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get instance metadata
|
|
184
|
+
*/
|
|
185
|
+
async getMetadata() {
|
|
186
|
+
try {
|
|
187
|
+
const resultsDir = await this.getResultsDir();
|
|
188
|
+
const metadataPath = path.join(resultsDir, 'metadata.json');
|
|
189
|
+
const content = await fs.readFile(metadataPath, 'utf-8');
|
|
190
|
+
return JSON.parse(content);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Clean up instance workspace (optional)
|
|
198
|
+
*/
|
|
199
|
+
async cleanup(keepWorkspace = false) {
|
|
200
|
+
if (keepWorkspace) {
|
|
201
|
+
logger.debug(`Keeping workspace for ${this.instanceId}`);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
const workspace = await this.getWorkspaceDir();
|
|
206
|
+
await fs.rm(workspace, { recursive: true, force: true });
|
|
207
|
+
logger.debug(`Cleaned up workspace for ${this.instanceId}`);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
logger.warn(`Failed to cleanup workspace: ${error}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get instance ID
|
|
215
|
+
*/
|
|
216
|
+
getInstanceId() {
|
|
217
|
+
return this.instanceId;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=InstanceManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InstanceManager.js","sourceRoot":"","sources":["../../src/instance/InstanceManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* instance-metadata-reader.ts
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates metadata reading logic for kaseki instances.
|
|
5
|
+
* Safely reads and parses metadata.json, host-start.json, and resource.time files
|
|
6
|
+
* with graceful error handling for transient I/O errors.
|
|
7
|
+
*/
|
|
8
|
+
export interface Metadata {
|
|
9
|
+
current_stage?: string;
|
|
10
|
+
exit_code?: number | string;
|
|
11
|
+
duration_seconds?: number;
|
|
12
|
+
started_at?: string;
|
|
13
|
+
start_time?: string;
|
|
14
|
+
model?: string;
|
|
15
|
+
pi_duration_seconds?: number;
|
|
16
|
+
[key: string]: any;
|
|
17
|
+
}
|
|
18
|
+
export interface HostStart {
|
|
19
|
+
model?: string;
|
|
20
|
+
repo_url?: string;
|
|
21
|
+
repo?: string;
|
|
22
|
+
git_ref?: string;
|
|
23
|
+
ref?: string;
|
|
24
|
+
agentTimeoutSeconds?: number;
|
|
25
|
+
[key: string]: any;
|
|
26
|
+
}
|
|
27
|
+
export interface InstanceMetadataInfo {
|
|
28
|
+
metadata: Metadata;
|
|
29
|
+
hostStart: HostStart;
|
|
30
|
+
elapsedSeconds: number | null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Read metadata for a kaseki instance from its results directory.
|
|
34
|
+
*
|
|
35
|
+
* Reads three files:
|
|
36
|
+
* - metadata.json (primary source of truth)
|
|
37
|
+
* - host-start.json (configuration from run initiation)
|
|
38
|
+
* - resource.time (timing information if metadata incomplete)
|
|
39
|
+
*
|
|
40
|
+
* Handles transient I/O errors (ENOENT, ESTALE) by propagating them
|
|
41
|
+
* so callers can skip the instance and continue scanning.
|
|
42
|
+
*
|
|
43
|
+
* @param resultDir - Path to the kaseki results directory (e.g., /agents/kaseki-results/kaseki-1)
|
|
44
|
+
* @returns InstanceMetadataInfo with parsed metadata, host config, and elapsed time
|
|
45
|
+
* @throws Error if I/O error is transient (ENOENT, ESTALE); caller should skip this instance
|
|
46
|
+
*/
|
|
47
|
+
export declare function readInstanceMetadata(resultDir: string): InstanceMetadataInfo;
|
|
48
|
+
//# sourceMappingURL=instance-metadata-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-metadata-reader.d.ts","sourceRoot":"","sources":["../src/instance-metadata-reader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,MAAM,WAAW,QAAQ;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAoCD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,oBAAoB,CAyC5E"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* instance-metadata-reader.ts
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates metadata reading logic for kaseki instances.
|
|
5
|
+
* Safely reads and parses metadata.json, host-start.json, and resource.time files
|
|
6
|
+
* with graceful error handling for transient I/O errors.
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Check if an error is a transient I/O error that should be retried or skipped.
|
|
12
|
+
*/
|
|
13
|
+
function isSkippableInstanceIoError(error) {
|
|
14
|
+
return error && (error.code === 'ENOENT' || error.code === 'ESTALE');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Read elapsed seconds from metadata or resource.time file.
|
|
18
|
+
* Tries metadata.duration_seconds first, then falls back to resource.time.
|
|
19
|
+
*/
|
|
20
|
+
function readElapsedSeconds(resultDir, metadata) {
|
|
21
|
+
if (metadata.duration_seconds !== undefined) {
|
|
22
|
+
return metadata.duration_seconds;
|
|
23
|
+
}
|
|
24
|
+
const resourceTimePath = path.join(resultDir, 'resource.time');
|
|
25
|
+
if (!fs.existsSync(resourceTimePath)) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const content = fs.readFileSync(resourceTimePath, 'utf8');
|
|
30
|
+
const match = content.match(/elapsed_seconds=([0-9]+(?:\.[0-9]+)?)/);
|
|
31
|
+
if (match) {
|
|
32
|
+
return parseFloat(match[1]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// File may be unreadable; return null
|
|
37
|
+
}
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Read metadata for a kaseki instance from its results directory.
|
|
42
|
+
*
|
|
43
|
+
* Reads three files:
|
|
44
|
+
* - metadata.json (primary source of truth)
|
|
45
|
+
* - host-start.json (configuration from run initiation)
|
|
46
|
+
* - resource.time (timing information if metadata incomplete)
|
|
47
|
+
*
|
|
48
|
+
* Handles transient I/O errors (ENOENT, ESTALE) by propagating them
|
|
49
|
+
* so callers can skip the instance and continue scanning.
|
|
50
|
+
*
|
|
51
|
+
* @param resultDir - Path to the kaseki results directory (e.g., /agents/kaseki-results/kaseki-1)
|
|
52
|
+
* @returns InstanceMetadataInfo with parsed metadata, host config, and elapsed time
|
|
53
|
+
* @throws Error if I/O error is transient (ENOENT, ESTALE); caller should skip this instance
|
|
54
|
+
*/
|
|
55
|
+
export function readInstanceMetadata(resultDir) {
|
|
56
|
+
const metadataPath = path.join(resultDir, 'metadata.json');
|
|
57
|
+
const hostStartPath = path.join(resultDir, 'host-start.json');
|
|
58
|
+
let metadata = {};
|
|
59
|
+
let hostStart = {};
|
|
60
|
+
// Read metadata
|
|
61
|
+
if (fs.existsSync(metadataPath)) {
|
|
62
|
+
try {
|
|
63
|
+
const content = fs.readFileSync(metadataPath, 'utf8');
|
|
64
|
+
metadata = JSON.parse(content);
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
if (isSkippableInstanceIoError(e)) {
|
|
68
|
+
throw e; // Propagate transient errors to caller
|
|
69
|
+
}
|
|
70
|
+
// Metadata may still be incomplete if run is in progress; use empty object
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Read host start config
|
|
74
|
+
if (fs.existsSync(hostStartPath)) {
|
|
75
|
+
try {
|
|
76
|
+
const content = fs.readFileSync(hostStartPath, 'utf8');
|
|
77
|
+
hostStart = JSON.parse(content);
|
|
78
|
+
}
|
|
79
|
+
catch (e) {
|
|
80
|
+
if (isSkippableInstanceIoError(e)) {
|
|
81
|
+
throw e; // Propagate transient errors to caller
|
|
82
|
+
}
|
|
83
|
+
// File may be unreadable; use empty object
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Read elapsed seconds
|
|
87
|
+
const elapsedSeconds = readElapsedSeconds(resultDir, metadata);
|
|
88
|
+
return {
|
|
89
|
+
metadata,
|
|
90
|
+
hostStart,
|
|
91
|
+
elapsedSeconds,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=instance-metadata-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-metadata-reader.js","sourceRoot":"","sources":["../src/instance-metadata-reader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AA6BxB;;GAEG;AACH,SAAS,0BAA0B,CAAC,KAAU;IAC5C,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;AACvE,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,SAAiB,EAAE,QAAkB;IAC/D,IAAI,QAAQ,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC5C,OAAO,QAAQ,CAAC,gBAAgB,CAAC;IACnC,CAAC;IAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACrE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IAC3D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAE9D,IAAI,QAAQ,GAAa,EAAE,CAAC;IAC5B,IAAI,SAAS,GAAc,EAAE,CAAC;IAE9B,gBAAgB;IAChB,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACtD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,CAAC,CAAC,uCAAuC;YAClD,CAAC;YACD,2EAA2E;QAC7E,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YACvD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,CAAC,CAAC,uCAAuC;YAClD,CAAC;YACD,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,MAAM,cAAc,GAAG,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE/D,OAAO;QACL,QAAQ;QACR,SAAS;QACT,cAAc;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* instance-state-derivation.ts
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates state derivation logic for kaseki instances.
|
|
5
|
+
* Derives lifecycle status, exit codes, stages, and failure classifications
|
|
6
|
+
* from metadata and instance artifacts.
|
|
7
|
+
*/
|
|
8
|
+
import { Metadata } from './instance-metadata-reader';
|
|
9
|
+
export type InstanceLifecycleStatus = 'running' | 'completed' | 'failed' | 'pending';
|
|
10
|
+
/**
|
|
11
|
+
* Normalize an exit code candidate into an integer or null.
|
|
12
|
+
*/
|
|
13
|
+
export declare function normalizeExitCodeCandidate(value: any): number | null;
|
|
14
|
+
/**
|
|
15
|
+
* Derive lifecycle status from running flag and exit code.
|
|
16
|
+
*/
|
|
17
|
+
export declare function deriveInstanceLifecycleStatus(isRunning: boolean, exitCode: number | null): InstanceLifecycleStatus;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve exit code from metadata and optional /exit_code file.
|
|
20
|
+
* Prefers /exit_code file when readable, falls back to metadata.exit_code.
|
|
21
|
+
* Returns null only when neither source has a valid integer.
|
|
22
|
+
*/
|
|
23
|
+
export declare function resolveInstanceExitCode(resultDir: string, metadata?: Metadata): number | null;
|
|
24
|
+
/**
|
|
25
|
+
* Resolve stage from metadata first, then fallback to stdout markers.
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveInstanceStage(resultsDir: string, instanceName: string, metadata?: Metadata, fallback?: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Extract validation failure reason from metadata.
|
|
30
|
+
* Returns the reason if validation failed, otherwise null.
|
|
31
|
+
*/
|
|
32
|
+
export declare function extractValidationFailureReason(metadata?: Metadata): string | null;
|
|
33
|
+
/**
|
|
34
|
+
* Extract quality gate failure reason from metadata.
|
|
35
|
+
* Returns the reason if quality checks failed, otherwise null.
|
|
36
|
+
*/
|
|
37
|
+
export declare function extractQualityFailureReason(metadata?: Metadata): string | null;
|
|
38
|
+
/**
|
|
39
|
+
* Classify failure type from metadata and exit code.
|
|
40
|
+
*/
|
|
41
|
+
export declare function classifyFailure(metadata?: Metadata, exitCode?: number | string | null): string;
|
|
42
|
+
//# sourceMappingURL=instance-state-derivation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-state-derivation.d.ts","sourceRoot":"","sources":["../src/instance-state-derivation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAErF;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAQpE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,uBAAuB,CAKzB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,QAAa,GACtB,MAAM,GAAG,IAAI,CAaf;AAwBD;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,QAAQ,GAAE,QAAa,EACvB,QAAQ,GAAE,MAAkB,GAC3B,MAAM,CAMR;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAAC,QAAQ,GAAE,QAAa,GAAG,MAAM,GAAG,IAAI,CAKrF;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,GAAE,QAAa,GAAG,MAAM,GAAG,IAAI,CAKlF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,GAAE,QAAa,EACvB,QAAQ,GAAE,MAAM,GAAG,MAAM,GAAG,IAAW,GACtC,MAAM,CAkBR"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* instance-state-derivation.ts
|
|
3
|
+
*
|
|
4
|
+
* Encapsulates state derivation logic for kaseki instances.
|
|
5
|
+
* Derives lifecycle status, exit codes, stages, and failure classifications
|
|
6
|
+
* from metadata and instance artifacts.
|
|
7
|
+
*/
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
/**
|
|
11
|
+
* Normalize an exit code candidate into an integer or null.
|
|
12
|
+
*/
|
|
13
|
+
export function normalizeExitCodeCandidate(value) {
|
|
14
|
+
if (typeof value === 'number' && Number.isInteger(value)) {
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
if (typeof value === 'string' && /^-?\d+$/.test(value.trim())) {
|
|
18
|
+
return parseInt(value.trim(), 10);
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Derive lifecycle status from running flag and exit code.
|
|
24
|
+
*/
|
|
25
|
+
export function deriveInstanceLifecycleStatus(isRunning, exitCode) {
|
|
26
|
+
if (isRunning)
|
|
27
|
+
return 'running';
|
|
28
|
+
if (exitCode === 0)
|
|
29
|
+
return 'completed';
|
|
30
|
+
if (Number.isInteger(exitCode))
|
|
31
|
+
return 'failed';
|
|
32
|
+
return 'pending';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve exit code from metadata and optional /exit_code file.
|
|
36
|
+
* Prefers /exit_code file when readable, falls back to metadata.exit_code.
|
|
37
|
+
* Returns null only when neither source has a valid integer.
|
|
38
|
+
*/
|
|
39
|
+
export function resolveInstanceExitCode(resultDir, metadata = {}) {
|
|
40
|
+
const metadataExitCode = normalizeExitCodeCandidate(metadata.exit_code);
|
|
41
|
+
const exitCodePath = path.join(resultDir, 'exit_code');
|
|
42
|
+
if (!fs.existsSync(exitCodePath)) {
|
|
43
|
+
return metadataExitCode;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const fileExitCode = normalizeExitCodeCandidate(fs.readFileSync(exitCodePath, 'utf8'));
|
|
47
|
+
return fileExitCode !== null ? fileExitCode : metadataExitCode;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return metadataExitCode;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get the current stage of a running or completed instance.
|
|
55
|
+
* Parses stdout.log for "==> stage_name" markers.
|
|
56
|
+
*/
|
|
57
|
+
function getCurrentStage(resultsDir, instanceName) {
|
|
58
|
+
const stdoutPath = path.join(resultsDir, instanceName, 'stdout.log');
|
|
59
|
+
if (!fs.existsSync(stdoutPath)) {
|
|
60
|
+
return 'unknown';
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const stdout = fs.readFileSync(stdoutPath, 'utf8');
|
|
64
|
+
const matches = stdout.match(/^==> (.+?)$/gm);
|
|
65
|
+
if (!matches || matches.length === 0)
|
|
66
|
+
return 'unknown';
|
|
67
|
+
const lastMarker = matches[matches.length - 1];
|
|
68
|
+
return lastMarker.replace(/^==> /, '').trim();
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return 'unknown';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resolve stage from metadata first, then fallback to stdout markers.
|
|
76
|
+
*/
|
|
77
|
+
export function resolveInstanceStage(resultsDir, instanceName, metadata = {}, fallback = 'unknown') {
|
|
78
|
+
if (typeof metadata.current_stage === 'string' && metadata.current_stage.trim().length > 0) {
|
|
79
|
+
return metadata.current_stage;
|
|
80
|
+
}
|
|
81
|
+
const parsedStage = getCurrentStage(resultsDir, instanceName);
|
|
82
|
+
return parsedStage !== 'unknown' ? parsedStage : fallback;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Extract validation failure reason from metadata.
|
|
86
|
+
* Returns the reason if validation failed, otherwise null.
|
|
87
|
+
*/
|
|
88
|
+
export function extractValidationFailureReason(metadata = {}) {
|
|
89
|
+
const reason = typeof metadata.validation_failure_reason === 'string'
|
|
90
|
+
? metadata.validation_failure_reason.trim()
|
|
91
|
+
: '';
|
|
92
|
+
return reason.length > 0 ? reason : null;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Extract quality gate failure reason from metadata.
|
|
96
|
+
* Returns the reason if quality checks failed, otherwise null.
|
|
97
|
+
*/
|
|
98
|
+
export function extractQualityFailureReason(metadata = {}) {
|
|
99
|
+
const reason = typeof metadata.quality_failure_reason === 'string'
|
|
100
|
+
? metadata.quality_failure_reason.trim()
|
|
101
|
+
: '';
|
|
102
|
+
return reason.length > 0 ? reason : null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Classify failure type from metadata and exit code.
|
|
106
|
+
*/
|
|
107
|
+
export function classifyFailure(metadata = {}, exitCode = null) {
|
|
108
|
+
const normalizedExitCode = normalizeExitCodeCandidate(exitCode);
|
|
109
|
+
const failedCommand = typeof metadata.failed_command === 'string' ? metadata.failed_command.trim() : '';
|
|
110
|
+
if (normalizedExitCode === 0)
|
|
111
|
+
return 'none';
|
|
112
|
+
if (normalizedExitCode === 124)
|
|
113
|
+
return 'timeout';
|
|
114
|
+
if (failedCommand === 'empty git diff' || normalizedExitCode === 3)
|
|
115
|
+
return 'empty-diff';
|
|
116
|
+
if (failedCommand === 'validation')
|
|
117
|
+
return 'validation';
|
|
118
|
+
if (failedCommand === 'quality checks')
|
|
119
|
+
return 'quality';
|
|
120
|
+
if (failedCommand === 'secret scan')
|
|
121
|
+
return 'secret-scan';
|
|
122
|
+
if (failedCommand.startsWith('github'))
|
|
123
|
+
return 'github';
|
|
124
|
+
if (failedCommand.includes('OPENROUTER_API_KEY') || failedCommand.includes('OpenRouter')) {
|
|
125
|
+
return 'credentials';
|
|
126
|
+
}
|
|
127
|
+
if (failedCommand)
|
|
128
|
+
return failedCommand.replace(/\s+/g, '-');
|
|
129
|
+
if (Number.isInteger(normalizedExitCode))
|
|
130
|
+
return 'nonzero-exit';
|
|
131
|
+
return 'unknown';
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=instance-state-derivation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-state-derivation.js","sourceRoot":"","sources":["../src/instance-state-derivation.ts"],"names":[],"mappings":"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"}
|