@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,490 @@
|
|
|
1
|
+
# REST API Service Setup
|
|
2
|
+
|
|
3
|
+
For running kaseki-agent as a long-running HTTP API service for async, distributed execution.
|
|
4
|
+
|
|
5
|
+
**Complexity**: High | **Time**: 15-30 minutes
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
External Client
|
|
13
|
+
↓ (HTTP POST /api/run)
|
|
14
|
+
REST API Service (port 8080)
|
|
15
|
+
↓
|
|
16
|
+
Docker Daemon
|
|
17
|
+
↓
|
|
18
|
+
Kaseki Agent Container (kaseki-1, kaseki-2, ...)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
The API service acts as a broker, accepting HTTP requests and managing kaseki instances on behalf of clients.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Comparison: API Service vs. Direct CLI
|
|
26
|
+
|
|
27
|
+
| Aspect | Direct CLI | REST API Service |
|
|
28
|
+
|--------|-----------|------------------|
|
|
29
|
+
| **Deployment** | Single host or SSH-based | Long-running service |
|
|
30
|
+
| **Execution** | Synchronous (blocking) | Asynchronous (non-blocking) |
|
|
31
|
+
| **Concurrent Runs** | One at a time | Multiple (configurable) |
|
|
32
|
+
| **Access Method** | Shell commands | HTTP REST API |
|
|
33
|
+
| **Best For** | Development, simple tasks | Production, distributed systems |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Prerequisites
|
|
38
|
+
|
|
39
|
+
- Docker (required)
|
|
40
|
+
- Docker Compose (recommended) or Node.js ≥24.x (fallback)
|
|
41
|
+
- OpenRouter API key
|
|
42
|
+
- Port 8080 available (or configure different port)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Step 1: Clone and Prepare
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
cd /agents/kaseki-template
|
|
50
|
+
# (or clone if not already done)
|
|
51
|
+
git clone https://github.com/CyanAutomation/kaseki-agent.git /agents/kaseki-template
|
|
52
|
+
cd /agents/kaseki-template
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Step 2: Set API Keys
|
|
56
|
+
|
|
57
|
+
### Option A: Single API Key (Simple)
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
export KASEKI_API_KEYS=sk-your-secret-key-here
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Option B: Multiple API Keys (Production)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
export KASEKI_API_KEYS="sk-key1,sk-key2,sk-key3"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Or store in a file:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# Create file with one key per line
|
|
73
|
+
cat > ~/.kaseki/api-keys.txt << 'EOF'
|
|
74
|
+
sk-key1
|
|
75
|
+
sk-key2
|
|
76
|
+
sk-key3
|
|
77
|
+
EOF
|
|
78
|
+
|
|
79
|
+
# Set environment to point to file
|
|
80
|
+
export KASEKI_API_KEYS_FILE=~/.kaseki/api-keys.txt
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Step 3: Configure OpenRouter API Key
|
|
84
|
+
|
|
85
|
+
The service needs your OpenRouter key to invoke the Pi agent:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
# Option 1: Environment variable (not recommended for production)
|
|
89
|
+
export OPENROUTER_API_KEY=sk-or-v1-your-key
|
|
90
|
+
|
|
91
|
+
# Option 2: File (recommended)
|
|
92
|
+
mkdir -p ~/.kaseki/secrets
|
|
93
|
+
read -sp 'Enter OpenRouter API key: ' OPENROUTER_KEY
|
|
94
|
+
echo "$OPENROUTER_KEY" > ~/.kaseki/secrets/openrouter_api_key
|
|
95
|
+
chmod 600 ~/.kaseki/secrets/openrouter_api_key
|
|
96
|
+
export OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Step 4: Launch the Service
|
|
102
|
+
|
|
103
|
+
### Option A: Docker Compose (Recommended)
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Navigate to repo root
|
|
107
|
+
cd /agents/kaseki-template
|
|
108
|
+
|
|
109
|
+
# Set configuration
|
|
110
|
+
export KASEKI_API_KEYS=sk-your-secret-key-here
|
|
111
|
+
export OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key
|
|
112
|
+
|
|
113
|
+
# Get Docker socket GID (required for container to launch kaseki instances)
|
|
114
|
+
export DOCKER_GID="$(stat -c '%g' /var/run/docker.sock)"
|
|
115
|
+
|
|
116
|
+
# Start services
|
|
117
|
+
docker-compose up -d
|
|
118
|
+
|
|
119
|
+
# View logs
|
|
120
|
+
docker-compose logs -f kaseki-api
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Option B: systemd Service
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# Copy service file to systemd directory
|
|
127
|
+
sudo cp scripts/kaseki-api.service /etc/systemd/system/
|
|
128
|
+
|
|
129
|
+
# Create environment file
|
|
130
|
+
sudo tee /etc/kaseki.env > /dev/null << 'EOF'
|
|
131
|
+
KASEKI_API_KEYS=sk-your-secret-key-here
|
|
132
|
+
OPENROUTER_API_KEY_FILE=/home/pi/secrets/openrouter_api_key
|
|
133
|
+
KASEKI_API_PORT=8080
|
|
134
|
+
KASEKI_RESULTS_DIR=/agents/kaseki-results
|
|
135
|
+
EOF
|
|
136
|
+
|
|
137
|
+
# Enable and start service
|
|
138
|
+
sudo systemctl daemon-reload
|
|
139
|
+
sudo systemctl enable kaseki-api
|
|
140
|
+
sudo systemctl start kaseki-api
|
|
141
|
+
|
|
142
|
+
# Check status
|
|
143
|
+
sudo systemctl status kaseki-api
|
|
144
|
+
|
|
145
|
+
# View logs
|
|
146
|
+
sudo journalctl -u kaseki-api -f
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Option C: Direct Node.js (Fallback)
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Install dependencies
|
|
153
|
+
npm ci --omit=dev
|
|
154
|
+
|
|
155
|
+
# Build TypeScript
|
|
156
|
+
npm run build
|
|
157
|
+
|
|
158
|
+
# Start API service
|
|
159
|
+
KASEKI_API_KEYS=sk-your-secret-key-here \
|
|
160
|
+
OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
|
|
161
|
+
npm run kaseki-api
|
|
162
|
+
|
|
163
|
+
# Service runs on http://localhost:8080
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
## Step 5: Verify the Service
|
|
169
|
+
|
|
170
|
+
### Health Check
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# Without authentication (preflight endpoint)
|
|
174
|
+
curl http://localhost:8080/api/health
|
|
175
|
+
|
|
176
|
+
# Response: { "status": "ok" }
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Authenticated Preflight Check
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
# With API key authentication
|
|
183
|
+
curl -H "Authorization: Bearer sk-your-secret-key-here" \
|
|
184
|
+
http://localhost:8080/api/preflight
|
|
185
|
+
|
|
186
|
+
# Response includes Docker readiness, image status, etc.
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Step 6: Trigger Your First Run
|
|
192
|
+
|
|
193
|
+
### Via curl
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
curl -X POST http://localhost:8080/api/run \
|
|
197
|
+
-H "Authorization: Bearer sk-your-secret-key-here" \
|
|
198
|
+
-H "Content-Type: application/json" \
|
|
199
|
+
-d '{
|
|
200
|
+
"repo_url": "https://github.com/your-org/your-repo",
|
|
201
|
+
"git_ref": "main",
|
|
202
|
+
"task_prompt": "Fix the bug in parser.ts"
|
|
203
|
+
}'
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Response:
|
|
207
|
+
|
|
208
|
+
```json
|
|
209
|
+
{
|
|
210
|
+
"instance_name": "kaseki-1",
|
|
211
|
+
"status": "queued",
|
|
212
|
+
"estimated_start_time": "2026-05-07T10:15:32Z"
|
|
213
|
+
}
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Via Node.js Client
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
import { KasekirClient } from './dist/kaseki-api-client.js';
|
|
220
|
+
|
|
221
|
+
const client = new KasekirClient('http://localhost:8080', 'sk-your-secret-key-here');
|
|
222
|
+
|
|
223
|
+
const result = await client.run({
|
|
224
|
+
repo_url: 'https://github.com/your-org/your-repo',
|
|
225
|
+
git_ref: 'main',
|
|
226
|
+
task_prompt: 'Fix the bug in parser.ts',
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
console.log('Started:', result.instance_name);
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Step 7: Monitor Runs
|
|
235
|
+
|
|
236
|
+
### Get Run Status
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
curl -H "Authorization: Bearer sk-your-secret-key-here" \
|
|
240
|
+
http://localhost:8080/api/status/kaseki-1
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Response:
|
|
244
|
+
|
|
245
|
+
```json
|
|
246
|
+
{
|
|
247
|
+
"instance_name": "kaseki-1",
|
|
248
|
+
"status": "running",
|
|
249
|
+
"elapsed_seconds": 42,
|
|
250
|
+
"timeout_seconds": 1200,
|
|
251
|
+
"stage": "pi-agent",
|
|
252
|
+
"progress": "Analyzing code..."
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### List All Runs
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
curl -H "Authorization: Bearer sk-your-secret-key-here" \
|
|
260
|
+
http://localhost:8080/api/runs
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Get Results (After Completion)
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
curl -H "Authorization: Bearer sk-your-secret-key-here" \
|
|
267
|
+
http://localhost:8080/api/results/kaseki-1
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Configuration Reference
|
|
273
|
+
|
|
274
|
+
### Environment Variables
|
|
275
|
+
|
|
276
|
+
| Variable | Default | Notes |
|
|
277
|
+
|----------|---------|-------|
|
|
278
|
+
| `KASEKI_API_KEYS` | — | Required: comma-separated API keys |
|
|
279
|
+
| `KASEKI_API_KEYS_FILE` | — | Alternative: file with newline-separated keys |
|
|
280
|
+
| `KASEKI_API_PORT` | `8080` | HTTP listen port |
|
|
281
|
+
| `KASEKI_API_LOG_LEVEL` | `info` | Log level: debug, info, warn, error |
|
|
282
|
+
| `KASEKI_API_IMAGE` | `docker.io/cyanautomation/kaseki-agent:latest` | Docker image to use |
|
|
283
|
+
| `KASEKI_API_MAX_CONCURRENT_RUNS` | `3` | Max parallel instances |
|
|
284
|
+
| `KASEKI_AGENT_TIMEOUT_SECONDS` | `1200` | Per-run timeout (20 min) |
|
|
285
|
+
| `KASEKI_MAX_DIFF_BYTES` | `200000` | Max diff size (200 KB) |
|
|
286
|
+
| `OPENROUTER_API_KEY_FILE` | — | Required: path to OpenRouter key file |
|
|
287
|
+
| `KASEKI_RESULTS_DIR` | `/agents/kaseki-results` | Output directory |
|
|
288
|
+
|
|
289
|
+
### Docker Compose Override
|
|
290
|
+
|
|
291
|
+
To customize Docker Compose, create `docker-compose.override.yml`:
|
|
292
|
+
|
|
293
|
+
```yaml
|
|
294
|
+
version: '3.8'
|
|
295
|
+
|
|
296
|
+
services:
|
|
297
|
+
kaseki-api:
|
|
298
|
+
environment:
|
|
299
|
+
KASEKI_API_MAX_CONCURRENT_RUNS: 5
|
|
300
|
+
KASEKI_AGENT_TIMEOUT_SECONDS: 3600
|
|
301
|
+
ports:
|
|
302
|
+
- "9000:8080" # Listen on port 9000 instead
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Scaling & Production Setup
|
|
308
|
+
|
|
309
|
+
### Load Balancing (nginx)
|
|
310
|
+
|
|
311
|
+
```nginx
|
|
312
|
+
upstream kaseki_api {
|
|
313
|
+
server localhost:8080;
|
|
314
|
+
server host2:8080;
|
|
315
|
+
server host3:8080;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
server {
|
|
319
|
+
listen 80;
|
|
320
|
+
server_name kaseki.example.com;
|
|
321
|
+
|
|
322
|
+
location /api/ {
|
|
323
|
+
proxy_pass http://kaseki_api;
|
|
324
|
+
proxy_set_header Authorization $http_authorization;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Multiple Instances on Different Ports
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
# Instance 1
|
|
333
|
+
export KASEKI_API_PORT=8080
|
|
334
|
+
docker-compose -f docker-compose.yml -p kaseki-1 up -d
|
|
335
|
+
|
|
336
|
+
# Instance 2
|
|
337
|
+
export KASEKI_API_PORT=8081
|
|
338
|
+
docker-compose -f docker-compose.yml -p kaseki-2 up -d
|
|
339
|
+
|
|
340
|
+
# Instance 3
|
|
341
|
+
export KASEKI_API_PORT=8082
|
|
342
|
+
docker-compose -f docker-compose.yml -p kaseki-3 up -d
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### Monitoring & Logging
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
# Real-time logs
|
|
349
|
+
docker-compose logs -f kaseki-api
|
|
350
|
+
|
|
351
|
+
# JSON logs for parsing
|
|
352
|
+
docker-compose logs --format='{{json .}}' kaseki-api | jq .
|
|
353
|
+
|
|
354
|
+
# Log rotation (optional)
|
|
355
|
+
sudo cp ops/logrotate/kaseki-api /etc/logrotate.d/
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## Troubleshooting
|
|
361
|
+
|
|
362
|
+
### "Connection refused"
|
|
363
|
+
|
|
364
|
+
Service is not running:
|
|
365
|
+
|
|
366
|
+
```bash
|
|
367
|
+
# Check Docker Compose
|
|
368
|
+
docker-compose ps
|
|
369
|
+
|
|
370
|
+
# Check systemd
|
|
371
|
+
sudo systemctl status kaseki-api
|
|
372
|
+
|
|
373
|
+
# Check Node.js process
|
|
374
|
+
ps aux | grep kaseki-api
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
### "Unauthorized" (401 error)
|
|
378
|
+
|
|
379
|
+
Invalid or missing API key:
|
|
380
|
+
|
|
381
|
+
```bash
|
|
382
|
+
# Verify key is set
|
|
383
|
+
echo $KASEKI_API_KEYS
|
|
384
|
+
|
|
385
|
+
# Check curl header
|
|
386
|
+
curl -v -H "Authorization: Bearer sk-your-secret-key" \
|
|
387
|
+
http://localhost:8080/api/health
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
### "Max concurrent runs exceeded"
|
|
391
|
+
|
|
392
|
+
All worker slots are in use. Either:
|
|
393
|
+
|
|
394
|
+
1. Wait for a run to complete
|
|
395
|
+
2. Increase `KASEKI_API_MAX_CONCURRENT_RUNS`
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
export KASEKI_API_MAX_CONCURRENT_RUNS=10
|
|
399
|
+
docker-compose up -d # Restart with new limit
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### Results Directory Filling Up
|
|
403
|
+
|
|
404
|
+
Clean up old runs:
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
./scripts/cleanup-kaseki.sh --keep 10
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
Or configure automatic retention:
|
|
411
|
+
|
|
412
|
+
```bash
|
|
413
|
+
# In crontab
|
|
414
|
+
0 2 * * * /agents/kaseki-template/scripts/cleanup-kaseki.sh --keep 20
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
## Integration Examples
|
|
420
|
+
|
|
421
|
+
### Python Client
|
|
422
|
+
|
|
423
|
+
```python
|
|
424
|
+
import requests
|
|
425
|
+
|
|
426
|
+
API_URL = "http://localhost:8080"
|
|
427
|
+
API_KEY = "sk-your-secret-key-here"
|
|
428
|
+
|
|
429
|
+
def run_kaseki(repo_url, git_ref, task_prompt):
|
|
430
|
+
headers = {
|
|
431
|
+
"Authorization": f"Bearer {API_KEY}",
|
|
432
|
+
"Content-Type": "application/json",
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
data = {
|
|
436
|
+
"repo_url": repo_url,
|
|
437
|
+
"git_ref": git_ref,
|
|
438
|
+
"task_prompt": task_prompt,
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
response = requests.post(f"{API_URL}/api/run", headers=headers, json=data)
|
|
442
|
+
return response.json()
|
|
443
|
+
|
|
444
|
+
result = run_kaseki("https://github.com/org/repo", "main", "Fix bug")
|
|
445
|
+
print(f"Started: {result['instance_name']}")
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
### Bash Wrapper
|
|
449
|
+
|
|
450
|
+
```bash
|
|
451
|
+
#!/bin/bash
|
|
452
|
+
|
|
453
|
+
API_URL="http://localhost:8080"
|
|
454
|
+
API_KEY="sk-your-secret-key-here"
|
|
455
|
+
REPO_URL="$1"
|
|
456
|
+
GIT_REF="$2"
|
|
457
|
+
TASK_PROMPT="$3"
|
|
458
|
+
|
|
459
|
+
RESPONSE=$(curl -s -X POST "$API_URL/api/run" \
|
|
460
|
+
-H "Authorization: Bearer $API_KEY" \
|
|
461
|
+
-H "Content-Type: application/json" \
|
|
462
|
+
-d "{
|
|
463
|
+
\"repo_url\": \"$REPO_URL\",
|
|
464
|
+
\"git_ref\": \"$GIT_REF\",
|
|
465
|
+
\"task_prompt\": \"$TASK_PROMPT\"
|
|
466
|
+
}")
|
|
467
|
+
|
|
468
|
+
INSTANCE=$(echo "$RESPONSE" | jq -r '.instance_name')
|
|
469
|
+
echo "Started: $INSTANCE"
|
|
470
|
+
|
|
471
|
+
# Poll for completion
|
|
472
|
+
while true; do
|
|
473
|
+
STATUS=$(curl -s -H "Authorization: Bearer $API_KEY" \
|
|
474
|
+
"$API_URL/api/status/$INSTANCE" | jq -r '.status')
|
|
475
|
+
|
|
476
|
+
[ "$STATUS" = "completed" ] && break
|
|
477
|
+
sleep 5
|
|
478
|
+
done
|
|
479
|
+
|
|
480
|
+
echo "Completed!"
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## Next Steps
|
|
486
|
+
|
|
487
|
+
- Set up SSL/TLS for production: [docs/DEPLOYMENT.md](../../docs/DEPLOYMENT.md)
|
|
488
|
+
- Integrate with orchestrators: See integration examples
|
|
489
|
+
- Monitor performance: `kaseki-cli.js` and dashboard
|
|
490
|
+
- Scale horizontally: Deploy multiple API instances behind load balancer
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Single Host CLI Setup
|
|
2
|
+
|
|
3
|
+
For running kaseki-agent directly on a single host (Pi, Ubuntu VM, etc.) via command-line.
|
|
4
|
+
|
|
5
|
+
**Complexity**: Low | **Time**: 5-10 minutes
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Prerequisites
|
|
10
|
+
|
|
11
|
+
- Docker installed and running
|
|
12
|
+
- Git installed
|
|
13
|
+
- OpenRouter API key
|
|
14
|
+
|
|
15
|
+
## Step 1: Clone the Repository
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# On your Pi or host machine
|
|
19
|
+
git clone https://github.com/CyanAutomation/kaseki-agent.git /agents/kaseki-template
|
|
20
|
+
cd /agents/kaseki-template
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Step 2: Run Interactive Setup
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
./scripts/kaseki-setup.sh
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
This will:
|
|
30
|
+
|
|
31
|
+
- Validate Docker is installed
|
|
32
|
+
- Prompt for your OpenRouter API key (securely, not in shell history)
|
|
33
|
+
- Create `~/.kaseki/secrets/openrouter_api_key` with proper permissions
|
|
34
|
+
- Run health checks
|
|
35
|
+
|
|
36
|
+
## Step 3: Verify Setup
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
/agents/kaseki-template/run-kaseki.sh --doctor
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Expected output:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
Preflight required dependencies: ok (docker)
|
|
46
|
+
Preflight optional dependencies: ok (curl, wget, sshpass, git, node, npm)
|
|
47
|
+
Docker daemon: running
|
|
48
|
+
Kaseki template image: available
|
|
49
|
+
✓ Setup is ready!
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Step 4: Run Your First Task
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
# Set the API key file location
|
|
56
|
+
export OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key
|
|
57
|
+
|
|
58
|
+
# Run kaseki-agent against a repository
|
|
59
|
+
./run-kaseki.sh https://github.com/your-org/your-repo main
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Or with inline arguments:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
REPO_URL=https://github.com/your-org/your-repo \
|
|
66
|
+
GIT_REF=main \
|
|
67
|
+
TASK_PROMPT='Fix the bug in parser.ts' \
|
|
68
|
+
OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
|
|
69
|
+
./run-kaseki.sh
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Step 5: Monitor Results
|
|
73
|
+
|
|
74
|
+
Kaseki creates a numbered instance folder. Check the results:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# List all runs
|
|
78
|
+
ls -la /agents/kaseki-results/
|
|
79
|
+
|
|
80
|
+
# Check the first run
|
|
81
|
+
cat /agents/kaseki-results/kaseki-1/result-summary.md
|
|
82
|
+
|
|
83
|
+
# View the git diff
|
|
84
|
+
cat /agents/kaseki-results/kaseki-1/git.diff
|
|
85
|
+
|
|
86
|
+
# Stream live progress (if still running)
|
|
87
|
+
./kaseki-cli.js watch kaseki-1
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Convenience: Add to Shell Profile
|
|
91
|
+
|
|
92
|
+
To avoid typing `OPENROUTER_API_KEY_FILE=...` every time:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Add to ~/.bashrc or ~/.zshrc
|
|
96
|
+
export OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key
|
|
97
|
+
export REPO_URL=https://github.com/your-org/your-repo
|
|
98
|
+
export GIT_REF=main
|
|
99
|
+
|
|
100
|
+
# Reload shell
|
|
101
|
+
source ~/.bashrc # or ~/.zshrc
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Then simply run:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
./run-kaseki.sh
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Common Tasks
|
|
111
|
+
|
|
112
|
+
### Run a Custom Task
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
TASK_PROMPT='Refactor the authentication module to use async/await' \
|
|
116
|
+
OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
|
|
117
|
+
./run-kaseki.sh https://github.com/your-org/your-repo main
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Increase Agent Timeout
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
KASEKI_AGENT_TIMEOUT_SECONDS=3600 \
|
|
124
|
+
OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
|
|
125
|
+
./run-kaseki.sh ...
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Run Against a Specific Commit
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
GIT_REF=abc1234def5678 \
|
|
132
|
+
OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
|
|
133
|
+
./run-kaseki.sh https://github.com/your-org/your-repo abc1234def5678
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Enable Debug Output
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
KASEKI_DEBUG_RAW_EVENTS=1 \
|
|
140
|
+
OPENROUTER_API_KEY_FILE=~/.kaseki/secrets/openrouter_api_key \
|
|
141
|
+
./run-kaseki.sh ...
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Troubleshooting
|
|
145
|
+
|
|
146
|
+
### "Docker daemon not running"
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
# Start Docker
|
|
150
|
+
sudo systemctl start docker
|
|
151
|
+
|
|
152
|
+
# Or (if not using systemd)
|
|
153
|
+
sudo service docker start
|
|
154
|
+
|
|
155
|
+
# Verify
|
|
156
|
+
docker ps
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### "Permission denied" when accessing Docker
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# Add user to docker group
|
|
163
|
+
sudo usermod -aG docker "$USER"
|
|
164
|
+
|
|
165
|
+
# Apply immediately
|
|
166
|
+
newgrp docker
|
|
167
|
+
|
|
168
|
+
# Or restart shell
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### "API key not found"
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# Recreate the key file
|
|
175
|
+
mkdir -p ~/.kaseki/secrets
|
|
176
|
+
read -sp 'Enter your OpenRouter API key: ' OPENROUTER_KEY
|
|
177
|
+
echo "$OPENROUTER_KEY" > ~/.kaseki/secrets/openrouter_api_key
|
|
178
|
+
chmod 600 ~/.kaseki/secrets/openrouter_api_key
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Agent times out
|
|
182
|
+
|
|
183
|
+
Increase the timeout:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
KASEKI_AGENT_TIMEOUT_SECONDS=3600 ./run-kaseki.sh ... # 1 hour
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Next Steps
|
|
190
|
+
|
|
191
|
+
- Review [docs/QUALITY_GATES.md](../../docs/QUALITY_GATES.md) to understand constraints
|
|
192
|
+
- Learn about task prompts: [docs/TASK_PROMPT_TEMPLATES.md](../../docs/TASK_PROMPT_TEMPLATES.md)
|
|
193
|
+
- Monitor runs with CLI: [docs/CLI.md](../../docs/CLI.md)
|
|
194
|
+
- Scale to multiple hosts: [MULTI_HOST_DISTRIBUTED.md](MULTI_HOST_DISTRIBUTED.md)
|