@urateam/core 0.1.0
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/dist/__tests__/assembler.test.d.ts +2 -0
- package/dist/__tests__/assembler.test.d.ts.map +1 -0
- package/dist/__tests__/assembler.test.js +63 -0
- package/dist/__tests__/assembler.test.js.map +1 -0
- package/dist/__tests__/auth-check.test.d.ts +2 -0
- package/dist/__tests__/auth-check.test.d.ts.map +1 -0
- package/dist/__tests__/auth-check.test.js +88 -0
- package/dist/__tests__/auth-check.test.js.map +1 -0
- package/dist/__tests__/auto-merge.test.d.ts +15 -0
- package/dist/__tests__/auto-merge.test.d.ts.map +1 -0
- package/dist/__tests__/auto-merge.test.js +428 -0
- package/dist/__tests__/auto-merge.test.js.map +1 -0
- package/dist/__tests__/bec89-unified-schema.test.d.ts +2 -0
- package/dist/__tests__/bec89-unified-schema.test.d.ts.map +1 -0
- package/dist/__tests__/bec89-unified-schema.test.js +235 -0
- package/dist/__tests__/bec89-unified-schema.test.js.map +1 -0
- package/dist/__tests__/conflict-detector.test.d.ts +2 -0
- package/dist/__tests__/conflict-detector.test.d.ts.map +1 -0
- package/dist/__tests__/conflict-detector.test.js +206 -0
- package/dist/__tests__/conflict-detector.test.js.map +1 -0
- package/dist/__tests__/coordination.test.d.ts +2 -0
- package/dist/__tests__/coordination.test.d.ts.map +1 -0
- package/dist/__tests__/coordination.test.js +257 -0
- package/dist/__tests__/coordination.test.js.map +1 -0
- package/dist/__tests__/db-postgres.test.d.ts +14 -0
- package/dist/__tests__/db-postgres.test.d.ts.map +1 -0
- package/dist/__tests__/db-postgres.test.js +289 -0
- package/dist/__tests__/db-postgres.test.js.map +1 -0
- package/dist/__tests__/db.test.d.ts +2 -0
- package/dist/__tests__/db.test.d.ts.map +1 -0
- package/dist/__tests__/db.test.js +182 -0
- package/dist/__tests__/db.test.js.map +1 -0
- package/dist/__tests__/deep-review.test.d.ts +2 -0
- package/dist/__tests__/deep-review.test.d.ts.map +1 -0
- package/dist/__tests__/deep-review.test.js +322 -0
- package/dist/__tests__/deep-review.test.js.map +1 -0
- package/dist/__tests__/devcontainer.test.d.ts +2 -0
- package/dist/__tests__/devcontainer.test.d.ts.map +1 -0
- package/dist/__tests__/devcontainer.test.js +89 -0
- package/dist/__tests__/devcontainer.test.js.map +1 -0
- package/dist/__tests__/distributed-lock.test.d.ts +18 -0
- package/dist/__tests__/distributed-lock.test.d.ts.map +1 -0
- package/dist/__tests__/distributed-lock.test.js +237 -0
- package/dist/__tests__/distributed-lock.test.js.map +1 -0
- package/dist/__tests__/e2e-pipeline.test.d.ts +25 -0
- package/dist/__tests__/e2e-pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/e2e-pipeline.test.js +517 -0
- package/dist/__tests__/e2e-pipeline.test.js.map +1 -0
- package/dist/__tests__/error-classifier.test.d.ts +2 -0
- package/dist/__tests__/error-classifier.test.d.ts.map +1 -0
- package/dist/__tests__/error-classifier.test.js +33 -0
- package/dist/__tests__/error-classifier.test.js.map +1 -0
- package/dist/__tests__/executor-integration.test.d.ts +11 -0
- package/dist/__tests__/executor-integration.test.d.ts.map +1 -0
- package/dist/__tests__/executor-integration.test.js +246 -0
- package/dist/__tests__/executor-integration.test.js.map +1 -0
- package/dist/__tests__/executor-issue-id.test.d.ts +13 -0
- package/dist/__tests__/executor-issue-id.test.d.ts.map +1 -0
- package/dist/__tests__/executor-issue-id.test.js +211 -0
- package/dist/__tests__/executor-issue-id.test.js.map +1 -0
- package/dist/__tests__/executor.test.d.ts +2 -0
- package/dist/__tests__/executor.test.d.ts.map +1 -0
- package/dist/__tests__/executor.test.js +164 -0
- package/dist/__tests__/executor.test.js.map +1 -0
- package/dist/__tests__/extract-handoff.test.d.ts +2 -0
- package/dist/__tests__/extract-handoff.test.d.ts.map +1 -0
- package/dist/__tests__/extract-handoff.test.js +131 -0
- package/dist/__tests__/extract-handoff.test.js.map +1 -0
- package/dist/__tests__/fail-on-auto-commit.test.d.ts +2 -0
- package/dist/__tests__/fail-on-auto-commit.test.d.ts.map +1 -0
- package/dist/__tests__/fail-on-auto-commit.test.js +156 -0
- package/dist/__tests__/fail-on-auto-commit.test.js.map +1 -0
- package/dist/__tests__/fixtures/webhook-comment.json +5 -0
- package/dist/__tests__/fixtures/webhook-state-change.json +15 -0
- package/dist/__tests__/force-push-agent-branches.test.d.ts +12 -0
- package/dist/__tests__/force-push-agent-branches.test.d.ts.map +1 -0
- package/dist/__tests__/force-push-agent-branches.test.js +348 -0
- package/dist/__tests__/force-push-agent-branches.test.js.map +1 -0
- package/dist/__tests__/github-webhook.test.d.ts +2 -0
- package/dist/__tests__/github-webhook.test.d.ts.map +1 -0
- package/dist/__tests__/github-webhook.test.js +370 -0
- package/dist/__tests__/github-webhook.test.js.map +1 -0
- package/dist/__tests__/gitlab.test.d.ts +28 -0
- package/dist/__tests__/gitlab.test.d.ts.map +1 -0
- package/dist/__tests__/gitlab.test.js +241 -0
- package/dist/__tests__/gitlab.test.js.map +1 -0
- package/dist/__tests__/integration/auto-commit.test.d.ts +2 -0
- package/dist/__tests__/integration/auto-commit.test.d.ts.map +1 -0
- package/dist/__tests__/integration/auto-commit.test.js +207 -0
- package/dist/__tests__/integration/auto-commit.test.js.map +1 -0
- package/dist/__tests__/integration/bec99-cross-worktree-guard.test.d.ts +10 -0
- package/dist/__tests__/integration/bec99-cross-worktree-guard.test.d.ts.map +1 -0
- package/dist/__tests__/integration/bec99-cross-worktree-guard.test.js +183 -0
- package/dist/__tests__/integration/bec99-cross-worktree-guard.test.js.map +1 -0
- package/dist/__tests__/integration/reproduce-bec99.test.d.ts +32 -0
- package/dist/__tests__/integration/reproduce-bec99.test.d.ts.map +1 -0
- package/dist/__tests__/integration/reproduce-bec99.test.js +243 -0
- package/dist/__tests__/integration/reproduce-bec99.test.js.map +1 -0
- package/dist/__tests__/integration/vitest-changed.test.d.ts +10 -0
- package/dist/__tests__/integration/vitest-changed.test.d.ts.map +1 -0
- package/dist/__tests__/integration/vitest-changed.test.js +128 -0
- package/dist/__tests__/integration/vitest-changed.test.js.map +1 -0
- package/dist/__tests__/license.test.d.ts +2 -0
- package/dist/__tests__/license.test.d.ts.map +1 -0
- package/dist/__tests__/license.test.js +53 -0
- package/dist/__tests__/license.test.js.map +1 -0
- package/dist/__tests__/mcp-resolver.test.d.ts +2 -0
- package/dist/__tests__/mcp-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/mcp-resolver.test.js +65 -0
- package/dist/__tests__/mcp-resolver.test.js.map +1 -0
- package/dist/__tests__/migrator.test.d.ts +2 -0
- package/dist/__tests__/migrator.test.d.ts.map +1 -0
- package/dist/__tests__/migrator.test.js +300 -0
- package/dist/__tests__/migrator.test.js.map +1 -0
- package/dist/__tests__/notifier-discord.test.d.ts +2 -0
- package/dist/__tests__/notifier-discord.test.d.ts.map +1 -0
- package/dist/__tests__/notifier-discord.test.js +166 -0
- package/dist/__tests__/notifier-discord.test.js.map +1 -0
- package/dist/__tests__/notifier-slack.test.d.ts +2 -0
- package/dist/__tests__/notifier-slack.test.d.ts.map +1 -0
- package/dist/__tests__/notifier-slack.test.js +157 -0
- package/dist/__tests__/notifier-slack.test.js.map +1 -0
- package/dist/__tests__/notifier.test.d.ts +2 -0
- package/dist/__tests__/notifier.test.d.ts.map +1 -0
- package/dist/__tests__/notifier.test.js +207 -0
- package/dist/__tests__/notifier.test.js.map +1 -0
- package/dist/__tests__/pipeline-config.test.d.ts +2 -0
- package/dist/__tests__/pipeline-config.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-config.test.js +143 -0
- package/dist/__tests__/pipeline-config.test.js.map +1 -0
- package/dist/__tests__/pipeline-runner.test.d.ts +2 -0
- package/dist/__tests__/pipeline-runner.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline-runner.test.js +359 -0
- package/dist/__tests__/pipeline-runner.test.js.map +1 -0
- package/dist/__tests__/pm-approvals-n1.repro.test.d.ts +9 -0
- package/dist/__tests__/pm-approvals-n1.repro.test.d.ts.map +1 -0
- package/dist/__tests__/pm-approvals-n1.repro.test.js +175 -0
- package/dist/__tests__/pm-approvals-n1.repro.test.js.map +1 -0
- package/dist/__tests__/pm-approvals.test.d.ts +2 -0
- package/dist/__tests__/pm-approvals.test.d.ts.map +1 -0
- package/dist/__tests__/pm-approvals.test.js +162 -0
- package/dist/__tests__/pm-approvals.test.js.map +1 -0
- package/dist/__tests__/pm-budget.test.d.ts +2 -0
- package/dist/__tests__/pm-budget.test.d.ts.map +1 -0
- package/dist/__tests__/pm-budget.test.js +65 -0
- package/dist/__tests__/pm-budget.test.js.map +1 -0
- package/dist/__tests__/pm-conflict.test.d.ts +2 -0
- package/dist/__tests__/pm-conflict.test.d.ts.map +1 -0
- package/dist/__tests__/pm-conflict.test.js +87 -0
- package/dist/__tests__/pm-conflict.test.js.map +1 -0
- package/dist/__tests__/pm-promote.test.d.ts +2 -0
- package/dist/__tests__/pm-promote.test.d.ts.map +1 -0
- package/dist/__tests__/pm-promote.test.js +82 -0
- package/dist/__tests__/pm-promote.test.js.map +1 -0
- package/dist/__tests__/pm-recover.test.d.ts +2 -0
- package/dist/__tests__/pm-recover.test.d.ts.map +1 -0
- package/dist/__tests__/pm-recover.test.js +100 -0
- package/dist/__tests__/pm-recover.test.js.map +1 -0
- package/dist/__tests__/pm-scheduler.test.d.ts +2 -0
- package/dist/__tests__/pm-scheduler.test.d.ts.map +1 -0
- package/dist/__tests__/pm-scheduler.test.js +112 -0
- package/dist/__tests__/pm-scheduler.test.js.map +1 -0
- package/dist/__tests__/pm-slack-interface.test.d.ts +2 -0
- package/dist/__tests__/pm-slack-interface.test.d.ts.map +1 -0
- package/dist/__tests__/pm-slack-interface.test.js +372 -0
- package/dist/__tests__/pm-slack-interface.test.js.map +1 -0
- package/dist/__tests__/pm-slack.test.d.ts +2 -0
- package/dist/__tests__/pm-slack.test.d.ts.map +1 -0
- package/dist/__tests__/pm-slack.test.js +83 -0
- package/dist/__tests__/pm-slack.test.js.map +1 -0
- package/dist/__tests__/pm-triage.test.d.ts +2 -0
- package/dist/__tests__/pm-triage.test.d.ts.map +1 -0
- package/dist/__tests__/pm-triage.test.js +198 -0
- package/dist/__tests__/pm-triage.test.js.map +1 -0
- package/dist/__tests__/pm-types.test.d.ts +2 -0
- package/dist/__tests__/pm-types.test.d.ts.map +1 -0
- package/dist/__tests__/pm-types.test.js +76 -0
- package/dist/__tests__/pm-types.test.js.map +1 -0
- package/dist/__tests__/pr-automerge.test.d.ts +18 -0
- package/dist/__tests__/pr-automerge.test.d.ts.map +1 -0
- package/dist/__tests__/pr-automerge.test.js +645 -0
- package/dist/__tests__/pr-automerge.test.js.map +1 -0
- package/dist/__tests__/pr-description.test.d.ts +2 -0
- package/dist/__tests__/pr-description.test.d.ts.map +1 -0
- package/dist/__tests__/pr-description.test.js +728 -0
- package/dist/__tests__/pr-description.test.js.map +1 -0
- package/dist/__tests__/prompt-injection.test.d.ts +2 -0
- package/dist/__tests__/prompt-injection.test.d.ts.map +1 -0
- package/dist/__tests__/prompt-injection.test.js +446 -0
- package/dist/__tests__/prompt-injection.test.js.map +1 -0
- package/dist/__tests__/ralph-gate.test.d.ts +19 -0
- package/dist/__tests__/ralph-gate.test.d.ts.map +1 -0
- package/dist/__tests__/ralph-gate.test.js +593 -0
- package/dist/__tests__/ralph-gate.test.js.map +1 -0
- package/dist/__tests__/ralph-review-fix-regression.test.d.ts +18 -0
- package/dist/__tests__/ralph-review-fix-regression.test.d.ts.map +1 -0
- package/dist/__tests__/ralph-review-fix-regression.test.js +306 -0
- package/dist/__tests__/ralph-review-fix-regression.test.js.map +1 -0
- package/dist/__tests__/ralph.test.d.ts +2 -0
- package/dist/__tests__/ralph.test.d.ts.map +1 -0
- package/dist/__tests__/ralph.test.js +96 -0
- package/dist/__tests__/ralph.test.js.map +1 -0
- package/dist/__tests__/recover-stuck.test.d.ts +8 -0
- package/dist/__tests__/recover-stuck.test.d.ts.map +1 -0
- package/dist/__tests__/recover-stuck.test.js +399 -0
- package/dist/__tests__/recover-stuck.test.js.map +1 -0
- package/dist/__tests__/repo.test.d.ts +2 -0
- package/dist/__tests__/repo.test.d.ts.map +1 -0
- package/dist/__tests__/repo.test.js +295 -0
- package/dist/__tests__/repo.test.js.map +1 -0
- package/dist/__tests__/repro-bec58-n-plus-one.test.d.ts +2 -0
- package/dist/__tests__/repro-bec58-n-plus-one.test.d.ts.map +1 -0
- package/dist/__tests__/repro-bec58-n-plus-one.test.js +187 -0
- package/dist/__tests__/repro-bec58-n-plus-one.test.js.map +1 -0
- package/dist/__tests__/reproduce-bec113-pagination-warning.test.d.ts +16 -0
- package/dist/__tests__/reproduce-bec113-pagination-warning.test.d.ts.map +1 -0
- package/dist/__tests__/reproduce-bec113-pagination-warning.test.js +226 -0
- package/dist/__tests__/reproduce-bec113-pagination-warning.test.js.map +1 -0
- package/dist/__tests__/reproduce-bec43-updatedat.test.d.ts +2 -0
- package/dist/__tests__/reproduce-bec43-updatedat.test.d.ts.map +1 -0
- package/dist/__tests__/reproduce-bec43-updatedat.test.js +76 -0
- package/dist/__tests__/reproduce-bec43-updatedat.test.js.map +1 -0
- package/dist/__tests__/reproduce-bec48-distributed-race.test.d.ts +18 -0
- package/dist/__tests__/reproduce-bec48-distributed-race.test.d.ts.map +1 -0
- package/dist/__tests__/reproduce-bec48-distributed-race.test.js +178 -0
- package/dist/__tests__/reproduce-bec48-distributed-race.test.js.map +1 -0
- package/dist/__tests__/reproduce-bec62.test.d.ts +2 -0
- package/dist/__tests__/reproduce-bec62.test.d.ts.map +1 -0
- package/dist/__tests__/reproduce-bec62.test.js +86 -0
- package/dist/__tests__/reproduce-bec62.test.js.map +1 -0
- package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.d.ts +13 -0
- package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.d.ts.map +1 -0
- package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js +220 -0
- package/dist/__tests__/reproduce-bec91-stuck-in-progress.test.js.map +1 -0
- package/dist/__tests__/review-feedback.test.d.ts +2 -0
- package/dist/__tests__/review-feedback.test.d.ts.map +1 -0
- package/dist/__tests__/review-feedback.test.js +383 -0
- package/dist/__tests__/review-feedback.test.js.map +1 -0
- package/dist/__tests__/sanitizer.test.d.ts +2 -0
- package/dist/__tests__/sanitizer.test.d.ts.map +1 -0
- package/dist/__tests__/sanitizer.test.js +162 -0
- package/dist/__tests__/sanitizer.test.js.map +1 -0
- package/dist/__tests__/security.test.d.ts +2 -0
- package/dist/__tests__/security.test.d.ts.map +1 -0
- package/dist/__tests__/security.test.js +52 -0
- package/dist/__tests__/security.test.js.map +1 -0
- package/dist/__tests__/server.test.d.ts +2 -0
- package/dist/__tests__/server.test.d.ts.map +1 -0
- package/dist/__tests__/server.test.js +61 -0
- package/dist/__tests__/server.test.js.map +1 -0
- package/dist/__tests__/slack-alerts.test.d.ts +2 -0
- package/dist/__tests__/slack-alerts.test.d.ts.map +1 -0
- package/dist/__tests__/slack-alerts.test.js +214 -0
- package/dist/__tests__/slack-alerts.test.js.map +1 -0
- package/dist/__tests__/stage-models.test.d.ts +14 -0
- package/dist/__tests__/stage-models.test.d.ts.map +1 -0
- package/dist/__tests__/stage-models.test.js +244 -0
- package/dist/__tests__/stage-models.test.js.map +1 -0
- package/dist/__tests__/start-todo.test.d.ts +2 -0
- package/dist/__tests__/start-todo.test.d.ts.map +1 -0
- package/dist/__tests__/start-todo.test.js +175 -0
- package/dist/__tests__/start-todo.test.js.map +1 -0
- package/dist/__tests__/tech-stack.test.d.ts +2 -0
- package/dist/__tests__/tech-stack.test.d.ts.map +1 -0
- package/dist/__tests__/tech-stack.test.js +75 -0
- package/dist/__tests__/tech-stack.test.js.map +1 -0
- package/dist/__tests__/templates.test.d.ts +2 -0
- package/dist/__tests__/templates.test.d.ts.map +1 -0
- package/dist/__tests__/templates.test.js +161 -0
- package/dist/__tests__/templates.test.js.map +1 -0
- package/dist/__tests__/test-quality.test.d.ts +2 -0
- package/dist/__tests__/test-quality.test.d.ts.map +1 -0
- package/dist/__tests__/test-quality.test.js +329 -0
- package/dist/__tests__/test-quality.test.js.map +1 -0
- package/dist/__tests__/token-budget.test.d.ts +2 -0
- package/dist/__tests__/token-budget.test.d.ts.map +1 -0
- package/dist/__tests__/token-budget.test.js +198 -0
- package/dist/__tests__/token-budget.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +156 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/dist/__tests__/validate.test.d.ts +2 -0
- package/dist/__tests__/validate.test.d.ts.map +1 -0
- package/dist/__tests__/validate.test.js +128 -0
- package/dist/__tests__/validate.test.js.map +1 -0
- package/dist/__tests__/webhook-handler.test.d.ts +2 -0
- package/dist/__tests__/webhook-handler.test.d.ts.map +1 -0
- package/dist/__tests__/webhook-handler.test.js +286 -0
- package/dist/__tests__/webhook-handler.test.js.map +1 -0
- package/dist/__tests__/webhook.test.d.ts +2 -0
- package/dist/__tests__/webhook.test.d.ts.map +1 -0
- package/dist/__tests__/webhook.test.js +58 -0
- package/dist/__tests__/webhook.test.js.map +1 -0
- package/dist/db/client.d.ts +56 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +201 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/index.d.ts +4 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +4 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations/postgres/001_initial_schema.sql +78 -0
- package/dist/db/migrations/postgres/002_pg_timestamps.sql +78 -0
- package/dist/db/migrations/postgres/003_retry_count.sql +10 -0
- package/dist/db/migrations/postgres/004_review_feedback.sql +20 -0
- package/dist/db/migrations/postgres/005_auto_merge.sql +15 -0
- package/dist/db/migrations/sqlite/001_initial_schema.sql +78 -0
- package/dist/db/migrations/sqlite/002_retry_count.sql +5 -0
- package/dist/db/migrations/sqlite/003_review_feedback.sql +7 -0
- package/dist/db/migrations/sqlite/004_auto_merge.sql +6 -0
- package/dist/db/migrator.d.ts +51 -0
- package/dist/db/migrator.d.ts.map +1 -0
- package/dist/db/migrator.js +188 -0
- package/dist/db/migrator.js.map +1 -0
- package/dist/db/schema.d.ts +1114 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +129 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/entrypoint.d.ts +2 -0
- package/dist/entrypoint.d.ts.map +1 -0
- package/dist/entrypoint.js +113 -0
- package/dist/entrypoint.js.map +1 -0
- package/dist/executor/agent-config.d.ts +10 -0
- package/dist/executor/agent-config.d.ts.map +1 -0
- package/dist/executor/agent-config.js +81 -0
- package/dist/executor/agent-config.js.map +1 -0
- package/dist/executor/agent-stream.d.ts +65 -0
- package/dist/executor/agent-stream.d.ts.map +1 -0
- package/dist/executor/agent-stream.js +101 -0
- package/dist/executor/agent-stream.js.map +1 -0
- package/dist/executor/auth-check.d.ts +10 -0
- package/dist/executor/auth-check.d.ts.map +1 -0
- package/dist/executor/auth-check.js +52 -0
- package/dist/executor/auth-check.js.map +1 -0
- package/dist/executor/deep-review.d.ts +61 -0
- package/dist/executor/deep-review.d.ts.map +1 -0
- package/dist/executor/deep-review.js +308 -0
- package/dist/executor/deep-review.js.map +1 -0
- package/dist/executor/executor.d.ts +27 -0
- package/dist/executor/executor.d.ts.map +1 -0
- package/dist/executor/executor.js +168 -0
- package/dist/executor/executor.js.map +1 -0
- package/dist/executor/extract-handoff.d.ts +14 -0
- package/dist/executor/extract-handoff.d.ts.map +1 -0
- package/dist/executor/extract-handoff.js +80 -0
- package/dist/executor/extract-handoff.js.map +1 -0
- package/dist/executor/handoff.d.ts +24 -0
- package/dist/executor/handoff.d.ts.map +1 -0
- package/dist/executor/handoff.js +63 -0
- package/dist/executor/handoff.js.map +1 -0
- package/dist/executor/index.d.ts +8 -0
- package/dist/executor/index.d.ts.map +1 -0
- package/dist/executor/index.js +8 -0
- package/dist/executor/index.js.map +1 -0
- package/dist/executor/mcp-resolver.d.ts +29 -0
- package/dist/executor/mcp-resolver.d.ts.map +1 -0
- package/dist/executor/mcp-resolver.js +80 -0
- package/dist/executor/mcp-resolver.js.map +1 -0
- package/dist/executor/permissions.d.ts +11 -0
- package/dist/executor/permissions.d.ts.map +1 -0
- package/dist/executor/permissions.js +32 -0
- package/dist/executor/permissions.js.map +1 -0
- package/dist/executor/profiles.d.ts +5 -0
- package/dist/executor/profiles.d.ts.map +1 -0
- package/dist/executor/profiles.js +35 -0
- package/dist/executor/profiles.js.map +1 -0
- package/dist/executor/prompt/assembler.d.ts +10 -0
- package/dist/executor/prompt/assembler.d.ts.map +1 -0
- package/dist/executor/prompt/assembler.js +28 -0
- package/dist/executor/prompt/assembler.js.map +1 -0
- package/dist/executor/prompt/index.d.ts +5 -0
- package/dist/executor/prompt/index.d.ts.map +1 -0
- package/dist/executor/prompt/index.js +5 -0
- package/dist/executor/prompt/index.js.map +1 -0
- package/dist/executor/prompt/sanitizer.d.ts +25 -0
- package/dist/executor/prompt/sanitizer.d.ts.map +1 -0
- package/dist/executor/prompt/sanitizer.js +81 -0
- package/dist/executor/prompt/sanitizer.js.map +1 -0
- package/dist/executor/prompt/schema-mapper.d.ts +7 -0
- package/dist/executor/prompt/schema-mapper.d.ts.map +1 -0
- package/dist/executor/prompt/schema-mapper.js +59 -0
- package/dist/executor/prompt/schema-mapper.js.map +1 -0
- package/dist/executor/prompt/templates.d.ts +31 -0
- package/dist/executor/prompt/templates.d.ts.map +1 -0
- package/dist/executor/prompt/templates.js +283 -0
- package/dist/executor/prompt/templates.js.map +1 -0
- package/dist/executor/ralph.d.ts +19 -0
- package/dist/executor/ralph.d.ts.map +1 -0
- package/dist/executor/ralph.js +112 -0
- package/dist/executor/ralph.js.map +1 -0
- package/dist/executor/test-quality.d.ts +117 -0
- package/dist/executor/test-quality.d.ts.map +1 -0
- package/dist/executor/test-quality.js +261 -0
- package/dist/executor/test-quality.js.map +1 -0
- package/dist/executor/validate.d.ts +15 -0
- package/dist/executor/validate.d.ts.map +1 -0
- package/dist/executor/validate.js +124 -0
- package/dist/executor/validate.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/license.d.ts +18 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +44 -0
- package/dist/license.js.map +1 -0
- package/dist/logger.d.ts +43 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +91 -0
- package/dist/logger.js.map +1 -0
- package/dist/notifier/composite.d.ts +13 -0
- package/dist/notifier/composite.d.ts.map +1 -0
- package/dist/notifier/composite.js +28 -0
- package/dist/notifier/composite.js.map +1 -0
- package/dist/notifier/discord.d.ts +14 -0
- package/dist/notifier/discord.d.ts.map +1 -0
- package/dist/notifier/discord.js +105 -0
- package/dist/notifier/discord.js.map +1 -0
- package/dist/notifier/index.d.ts +6 -0
- package/dist/notifier/index.d.ts.map +1 -0
- package/dist/notifier/index.js +6 -0
- package/dist/notifier/index.js.map +1 -0
- package/dist/notifier/linear.d.ts +28 -0
- package/dist/notifier/linear.d.ts.map +1 -0
- package/dist/notifier/linear.js +138 -0
- package/dist/notifier/linear.js.map +1 -0
- package/dist/notifier/slack-alerts.d.ts +62 -0
- package/dist/notifier/slack-alerts.d.ts.map +1 -0
- package/dist/notifier/slack-alerts.js +184 -0
- package/dist/notifier/slack-alerts.js.map +1 -0
- package/dist/notifier/slack.d.ts +14 -0
- package/dist/notifier/slack.d.ts.map +1 -0
- package/dist/notifier/slack.js +146 -0
- package/dist/notifier/slack.js.map +1 -0
- package/dist/pipeline/automerge.d.ts +44 -0
- package/dist/pipeline/automerge.d.ts.map +1 -0
- package/dist/pipeline/automerge.js +135 -0
- package/dist/pipeline/automerge.js.map +1 -0
- package/dist/pipeline/config.d.ts +5 -0
- package/dist/pipeline/config.d.ts.map +1 -0
- package/dist/pipeline/config.js +68 -0
- package/dist/pipeline/config.js.map +1 -0
- package/dist/pipeline/distributed-lock.d.ts +50 -0
- package/dist/pipeline/distributed-lock.d.ts.map +1 -0
- package/dist/pipeline/distributed-lock.js +114 -0
- package/dist/pipeline/distributed-lock.js.map +1 -0
- package/dist/pipeline/error-classifier.d.ts +9 -0
- package/dist/pipeline/error-classifier.d.ts.map +1 -0
- package/dist/pipeline/error-classifier.js +25 -0
- package/dist/pipeline/error-classifier.js.map +1 -0
- package/dist/pipeline/index.d.ts +9 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +9 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/pr-description.d.ts +35 -0
- package/dist/pipeline/pr-description.d.ts.map +1 -0
- package/dist/pipeline/pr-description.js +52 -0
- package/dist/pipeline/pr-description.js.map +1 -0
- package/dist/pipeline/queue.d.ts +7 -0
- package/dist/pipeline/queue.d.ts.map +1 -0
- package/dist/pipeline/queue.js +39 -0
- package/dist/pipeline/queue.js.map +1 -0
- package/dist/pipeline/router.d.ts +6 -0
- package/dist/pipeline/router.d.ts.map +1 -0
- package/dist/pipeline/router.js +19 -0
- package/dist/pipeline/router.js.map +1 -0
- package/dist/pipeline/runner.d.ts +142 -0
- package/dist/pipeline/runner.d.ts.map +1 -0
- package/dist/pipeline/runner.js +1848 -0
- package/dist/pipeline/runner.js.map +1 -0
- package/dist/pm/actions/approval-helpers.d.ts +11 -0
- package/dist/pm/actions/approval-helpers.d.ts.map +1 -0
- package/dist/pm/actions/approval-helpers.js +34 -0
- package/dist/pm/actions/approval-helpers.js.map +1 -0
- package/dist/pm/actions/cancel.d.ts +11 -0
- package/dist/pm/actions/cancel.d.ts.map +1 -0
- package/dist/pm/actions/cancel.js +68 -0
- package/dist/pm/actions/cancel.js.map +1 -0
- package/dist/pm/actions/deprioritize.d.ts +12 -0
- package/dist/pm/actions/deprioritize.d.ts.map +1 -0
- package/dist/pm/actions/deprioritize.js +55 -0
- package/dist/pm/actions/deprioritize.js.map +1 -0
- package/dist/pm/actions/promote.d.ts +11 -0
- package/dist/pm/actions/promote.d.ts.map +1 -0
- package/dist/pm/actions/promote.js +78 -0
- package/dist/pm/actions/promote.js.map +1 -0
- package/dist/pm/actions/recover-stuck.d.ts +42 -0
- package/dist/pm/actions/recover-stuck.d.ts.map +1 -0
- package/dist/pm/actions/recover-stuck.js +143 -0
- package/dist/pm/actions/recover-stuck.js.map +1 -0
- package/dist/pm/actions/recover.d.ts +18 -0
- package/dist/pm/actions/recover.d.ts.map +1 -0
- package/dist/pm/actions/recover.js +56 -0
- package/dist/pm/actions/recover.js.map +1 -0
- package/dist/pm/actions/resolve-approvals.d.ts +17 -0
- package/dist/pm/actions/resolve-approvals.d.ts.map +1 -0
- package/dist/pm/actions/resolve-approvals.js +92 -0
- package/dist/pm/actions/resolve-approvals.js.map +1 -0
- package/dist/pm/actions/start-todo.d.ts +28 -0
- package/dist/pm/actions/start-todo.d.ts.map +1 -0
- package/dist/pm/actions/start-todo.js +117 -0
- package/dist/pm/actions/start-todo.js.map +1 -0
- package/dist/pm/actions/triage.d.ts +13 -0
- package/dist/pm/actions/triage.d.ts.map +1 -0
- package/dist/pm/actions/triage.js +109 -0
- package/dist/pm/actions/triage.js.map +1 -0
- package/dist/pm/budget.d.ts +9 -0
- package/dist/pm/budget.d.ts.map +1 -0
- package/dist/pm/budget.js +62 -0
- package/dist/pm/budget.js.map +1 -0
- package/dist/pm/call-claude.d.ts +3 -0
- package/dist/pm/call-claude.d.ts.map +1 -0
- package/dist/pm/call-claude.js +37 -0
- package/dist/pm/call-claude.js.map +1 -0
- package/dist/pm/conflict-detector.d.ts +42 -0
- package/dist/pm/conflict-detector.d.ts.map +1 -0
- package/dist/pm/conflict-detector.js +116 -0
- package/dist/pm/conflict-detector.js.map +1 -0
- package/dist/pm/conflict.d.ts +20 -0
- package/dist/pm/conflict.d.ts.map +1 -0
- package/dist/pm/conflict.js +63 -0
- package/dist/pm/conflict.js.map +1 -0
- package/dist/pm/coordination.d.ts +50 -0
- package/dist/pm/coordination.d.ts.map +1 -0
- package/dist/pm/coordination.js +163 -0
- package/dist/pm/coordination.js.map +1 -0
- package/dist/pm/linear-helpers.d.ts +2 -0
- package/dist/pm/linear-helpers.d.ts.map +1 -0
- package/dist/pm/linear-helpers.js +16 -0
- package/dist/pm/linear-helpers.js.map +1 -0
- package/dist/pm/scheduler.d.ts +47 -0
- package/dist/pm/scheduler.d.ts.map +1 -0
- package/dist/pm/scheduler.js +346 -0
- package/dist/pm/scheduler.js.map +1 -0
- package/dist/pm/slack-helpers.d.ts +2 -0
- package/dist/pm/slack-helpers.d.ts.map +1 -0
- package/dist/pm/slack-helpers.js +24 -0
- package/dist/pm/slack-helpers.js.map +1 -0
- package/dist/pm/slack-interface.d.ts +133 -0
- package/dist/pm/slack-interface.d.ts.map +1 -0
- package/dist/pm/slack-interface.js +641 -0
- package/dist/pm/slack-interface.js.map +1 -0
- package/dist/pm/slack.d.ts +18 -0
- package/dist/pm/slack.d.ts.map +1 -0
- package/dist/pm/slack.js +144 -0
- package/dist/pm/slack.js.map +1 -0
- package/dist/pm/types.d.ts +99 -0
- package/dist/pm/types.d.ts.map +1 -0
- package/dist/pm/types.js +17 -0
- package/dist/pm/types.js.map +1 -0
- package/dist/repo/config.d.ts +35 -0
- package/dist/repo/config.d.ts.map +1 -0
- package/dist/repo/config.js +72 -0
- package/dist/repo/config.js.map +1 -0
- package/dist/repo/devcontainer.d.ts +33 -0
- package/dist/repo/devcontainer.d.ts.map +1 -0
- package/dist/repo/devcontainer.js +90 -0
- package/dist/repo/devcontainer.js.map +1 -0
- package/dist/repo/git.d.ts +185 -0
- package/dist/repo/git.d.ts.map +1 -0
- package/dist/repo/git.js +586 -0
- package/dist/repo/git.js.map +1 -0
- package/dist/repo/github.d.ts +56 -0
- package/dist/repo/github.d.ts.map +1 -0
- package/dist/repo/github.js +164 -0
- package/dist/repo/github.js.map +1 -0
- package/dist/repo/gitlab.d.ts +47 -0
- package/dist/repo/gitlab.d.ts.map +1 -0
- package/dist/repo/gitlab.js +91 -0
- package/dist/repo/gitlab.js.map +1 -0
- package/dist/repo/index.d.ts +7 -0
- package/dist/repo/index.d.ts.map +1 -0
- package/dist/repo/index.js +5 -0
- package/dist/repo/index.js.map +1 -0
- package/dist/repo/tech-stack.d.ts +13 -0
- package/dist/repo/tech-stack.d.ts.map +1 -0
- package/dist/repo/tech-stack.js +112 -0
- package/dist/repo/tech-stack.js.map +1 -0
- package/dist/security/index.d.ts +3 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +3 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/review-checklist.d.ts +9 -0
- package/dist/security/review-checklist.d.ts.map +1 -0
- package/dist/security/review-checklist.js +46 -0
- package/dist/security/review-checklist.js.map +1 -0
- package/dist/security/sandbox.d.ts +7 -0
- package/dist/security/sandbox.d.ts.map +1 -0
- package/dist/security/sandbox.js +31 -0
- package/dist/security/sandbox.js.map +1 -0
- package/dist/server.d.ts +48 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +90 -0
- package/dist/server.js.map +1 -0
- package/dist/types.d.ts +1230 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +225 -0
- package/dist/types.js.map +1 -0
- package/dist/webhook/github-handler.d.ts +39 -0
- package/dist/webhook/github-handler.d.ts.map +1 -0
- package/dist/webhook/github-handler.js +439 -0
- package/dist/webhook/github-handler.js.map +1 -0
- package/dist/webhook/handler.d.ts +16 -0
- package/dist/webhook/handler.d.ts.map +1 -0
- package/dist/webhook/handler.js +171 -0
- package/dist/webhook/handler.js.map +1 -0
- package/dist/webhook/index.d.ts +5 -0
- package/dist/webhook/index.d.ts.map +1 -0
- package/dist/webhook/index.js +5 -0
- package/dist/webhook/index.js.map +1 -0
- package/dist/webhook/parser.d.ts +18 -0
- package/dist/webhook/parser.d.ts.map +1 -0
- package/dist/webhook/parser.js +30 -0
- package/dist/webhook/parser.js.map +1 -0
- package/dist/webhook/signature.d.ts +2 -0
- package/dist/webhook/signature.d.ts.map +1 -0
- package/dist/webhook/signature.js +14 -0
- package/dist/webhook/signature.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep review: runs 3 parallel sub-agents (reuse, quality, efficiency) to
|
|
3
|
+
* produce hardened code-review findings. Corresponds to the /simplify
|
|
4
|
+
* pattern — each agent specialises in one dimension of code quality.
|
|
5
|
+
*/
|
|
6
|
+
import type { HandoffArtifact, ReviewFinding } from "../types.js";
|
|
7
|
+
export interface DeepReviewFinding {
|
|
8
|
+
agent: "reuse" | "quality" | "efficiency";
|
|
9
|
+
severity: "blocking" | "warning" | "suggestion";
|
|
10
|
+
file: string;
|
|
11
|
+
line: number;
|
|
12
|
+
category: string;
|
|
13
|
+
description: string;
|
|
14
|
+
fix: string;
|
|
15
|
+
}
|
|
16
|
+
export interface DeepReviewResult {
|
|
17
|
+
findings: DeepReviewFinding[];
|
|
18
|
+
/** Total input tokens used across all 3 sub-agents. */
|
|
19
|
+
inputTokens: number;
|
|
20
|
+
/** Total output tokens used across all 3 sub-agents. */
|
|
21
|
+
outputTokens: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Reuse agent: source files only.
|
|
25
|
+
* Skips tests, configs, docs, generated output, and static assets.
|
|
26
|
+
*/
|
|
27
|
+
export declare function filterReuseFiles(files: string[]): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Efficiency agent: hot-path source files.
|
|
30
|
+
* Skips tests, static assets, and generated output.
|
|
31
|
+
*/
|
|
32
|
+
export declare function filterEfficiencyFiles(files: string[]): string[];
|
|
33
|
+
/**
|
|
34
|
+
* Quality agent: all source files but not generated/dist output.
|
|
35
|
+
*/
|
|
36
|
+
export declare function filterQualityFiles(files: string[]): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Run the three parallel deep-review sub-agents (reuse, quality, efficiency)
|
|
39
|
+
* against the current worktree state.
|
|
40
|
+
*
|
|
41
|
+
* Returns aggregated findings and combined token usage. Sub-agent failures are
|
|
42
|
+
* swallowed (logged) so the pipeline is not blocked by infra issues.
|
|
43
|
+
*
|
|
44
|
+
* Optimisations applied:
|
|
45
|
+
* - diff-stat computed once and shared across all three sub-agents.
|
|
46
|
+
* - Handoff trimmed to summary + file list only (no issue data / acceptance
|
|
47
|
+
* criteria) to reduce prompt size.
|
|
48
|
+
* - Each agent receives only the file subset relevant to its focus area.
|
|
49
|
+
*/
|
|
50
|
+
export declare function runDeepReview(handoff: HandoffArtifact, workdir: string): Promise<DeepReviewResult>;
|
|
51
|
+
/**
|
|
52
|
+
* Convert DeepReviewFindings to ReviewFindings for use in handoff context.
|
|
53
|
+
* This allows downstream stages to see deep-review output as standard findings.
|
|
54
|
+
*/
|
|
55
|
+
export declare function deepFindingsToReviewFindings(findings: DeepReviewFinding[]): ReviewFinding[];
|
|
56
|
+
/**
|
|
57
|
+
* Build a prompt context block for the implement agent describing the deep
|
|
58
|
+
* review findings it should address.
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildDeepReviewContext(pass: number, findings: DeepReviewFinding[], previousHandoff: HandoffArtifact): string;
|
|
61
|
+
//# sourceMappingURL=deep-review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-review.d.ts","sourceRoot":"","sources":["../../src/executor/deep-review.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAclE,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,CAAC;IAC1C,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;CACtB;AAyDD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAS1D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAO/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE5D;AA+KD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAmD3B;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,iBAAiB,EAAE,GAC5B,aAAa,EAAE,CASjB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,eAAe,EAAE,eAAe,GAC/B,MAAM,CAqCR"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deep review: runs 3 parallel sub-agents (reuse, quality, efficiency) to
|
|
3
|
+
* produce hardened code-review findings. Corresponds to the /simplify
|
|
4
|
+
* pattern — each agent specialises in one dimension of code quality.
|
|
5
|
+
*/
|
|
6
|
+
import { gitExecSafe } from "../repo/git.js";
|
|
7
|
+
import { createLogger } from "../logger.js";
|
|
8
|
+
import { consumeAgentStream, parseJsonBlock } from "./agent-stream.js";
|
|
9
|
+
import { buildStagePermissionOptions } from "./permissions.js";
|
|
10
|
+
import { sanitize, buildSandboxedBlock } from "./prompt/sanitizer.js";
|
|
11
|
+
const log = createLogger({ component: "DeepReview" });
|
|
12
|
+
const DEEP_REVIEW_MODEL = "claude-haiku-4-5-20251001";
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// File subset filters
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/** Patterns identifying test files. */
|
|
17
|
+
const TEST_PATTERNS = [
|
|
18
|
+
/\.test\.[jt]sx?$/,
|
|
19
|
+
/\.spec\.[jt]sx?$/,
|
|
20
|
+
/(^|\/)__tests__\//,
|
|
21
|
+
/(^|\/)tests?\//,
|
|
22
|
+
];
|
|
23
|
+
/** Patterns identifying generated or dist output. */
|
|
24
|
+
const GENERATED_PATTERNS = [
|
|
25
|
+
/(^|\/)dist\//,
|
|
26
|
+
/(^|\/)build\//,
|
|
27
|
+
/\.d\.ts$/,
|
|
28
|
+
/(^|\/)generated\//,
|
|
29
|
+
/(^|\/)\.(next|nuxt|svelte-kit)\//,
|
|
30
|
+
];
|
|
31
|
+
/** Patterns identifying config files. */
|
|
32
|
+
const CONFIG_PATTERNS = [
|
|
33
|
+
/\.(config|rc)\.[jt]sx?$/,
|
|
34
|
+
/\.(eslintrc|prettierrc|babelrc|jest\.config)\b/,
|
|
35
|
+
/tsconfig.*\.json$/,
|
|
36
|
+
/package\.json$/,
|
|
37
|
+
/pnpm-lock\.yaml$/,
|
|
38
|
+
/yarn\.lock$/,
|
|
39
|
+
];
|
|
40
|
+
/** Patterns identifying documentation files. */
|
|
41
|
+
const DOC_PATTERNS = [
|
|
42
|
+
/\.md$/,
|
|
43
|
+
/\.mdx$/,
|
|
44
|
+
/(^|\/)docs?\//,
|
|
45
|
+
/CHANGELOG/i,
|
|
46
|
+
/README/i,
|
|
47
|
+
/LICENSE/i,
|
|
48
|
+
];
|
|
49
|
+
/** Patterns identifying static assets. */
|
|
50
|
+
const STATIC_ASSET_PATTERNS = [
|
|
51
|
+
/\.(png|jpg|jpeg|gif|svg|ico|webp)$/,
|
|
52
|
+
/\.(css|scss|sass|less)$/,
|
|
53
|
+
/\.(html|htm)$/,
|
|
54
|
+
/\.(woff2?|ttf|eot)$/,
|
|
55
|
+
/\.(mp4|webm|mp3|wav)$/,
|
|
56
|
+
/\.(pdf|zip|tar|gz)$/,
|
|
57
|
+
];
|
|
58
|
+
function matchesAny(file, patterns) {
|
|
59
|
+
return patterns.some((p) => p.test(file));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Reuse agent: source files only.
|
|
63
|
+
* Skips tests, configs, docs, generated output, and static assets.
|
|
64
|
+
*/
|
|
65
|
+
export function filterReuseFiles(files) {
|
|
66
|
+
return files.filter((f) => !matchesAny(f, TEST_PATTERNS) &&
|
|
67
|
+
!matchesAny(f, CONFIG_PATTERNS) &&
|
|
68
|
+
!matchesAny(f, DOC_PATTERNS) &&
|
|
69
|
+
!matchesAny(f, GENERATED_PATTERNS) &&
|
|
70
|
+
!matchesAny(f, STATIC_ASSET_PATTERNS));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Efficiency agent: hot-path source files.
|
|
74
|
+
* Skips tests, static assets, and generated output.
|
|
75
|
+
*/
|
|
76
|
+
export function filterEfficiencyFiles(files) {
|
|
77
|
+
return files.filter((f) => !matchesAny(f, TEST_PATTERNS) &&
|
|
78
|
+
!matchesAny(f, STATIC_ASSET_PATTERNS) &&
|
|
79
|
+
!matchesAny(f, GENERATED_PATTERNS));
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Quality agent: all source files but not generated/dist output.
|
|
83
|
+
*/
|
|
84
|
+
export function filterQualityFiles(files) {
|
|
85
|
+
return files.filter((f) => !matchesAny(f, GENERATED_PATTERNS));
|
|
86
|
+
}
|
|
87
|
+
// ---------------------------------------------------------------------------
|
|
88
|
+
// Constants
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
/** Agent name type and tuple for type-safe iteration and string narrowing. */
|
|
91
|
+
const AGENT_NAMES = ["reuse", "quality", "efficiency"];
|
|
92
|
+
/** Valid severity values, kept in sync with DeepReviewFinding["severity"]. */
|
|
93
|
+
const VALID_SEVERITIES = ["blocking", "warning", "suggestion"];
|
|
94
|
+
/** Tools made available to each deep-review sub-agent. */
|
|
95
|
+
const DEEP_REVIEW_TOOLS = ["Read", "Glob", "Grep"];
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// Sub-agent prompts
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
/** Per-agent instructions for the "what to look for" step. */
|
|
100
|
+
const AGENT_INSTRUCTIONS = {
|
|
101
|
+
reuse: {
|
|
102
|
+
role: "code-reuse review agent",
|
|
103
|
+
lookFor: "duplicate functions, copy-pasted logic, missed utility/helper extraction, reimplemented existing library features.",
|
|
104
|
+
exampleCategory: "duplicate-logic",
|
|
105
|
+
},
|
|
106
|
+
quality: {
|
|
107
|
+
role: "code-quality review agent",
|
|
108
|
+
lookFor: "copy-paste code, stringly-typed values (magic strings/numbers), redundant state, overly complex conditionals, missing error handling, unclear naming.",
|
|
109
|
+
exampleCategory: "stringly-typed",
|
|
110
|
+
},
|
|
111
|
+
efficiency: {
|
|
112
|
+
role: "code-efficiency review agent",
|
|
113
|
+
lookFor: "N+1 query patterns, missed concurrency (sequential awaits that could be Promise.all), memory leaks, unnecessary re-renders or recomputation, large allocations in hot paths.",
|
|
114
|
+
exampleCategory: "n-plus-1",
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
/**
|
|
118
|
+
* Build a sub-agent prompt for the given agent type.
|
|
119
|
+
* Shared template — only the role, instructions, and example category differ.
|
|
120
|
+
*/
|
|
121
|
+
function buildPrompt(agentType, summary, files, diffStat) {
|
|
122
|
+
const { role, lookFor, exampleCategory } = AGENT_INSTRUCTIONS[agentType];
|
|
123
|
+
const filesJson = JSON.stringify(files);
|
|
124
|
+
// Sanitize untrusted strings using the canonical sandboxed-block pattern.
|
|
125
|
+
// buildSandboxedBlock() applies sanitize() AND wraps with the warning preamble.
|
|
126
|
+
const handoffBlock = buildSandboxedBlock("handoff-data", `Summary: ${summary || ""}\nFiles changed: ${filesJson}`);
|
|
127
|
+
// diffStat is git output (not user-controlled), but still strip closing-tag
|
|
128
|
+
// injection as an extra defence layer.
|
|
129
|
+
const safeDiffStat = (diffStat || "No file changes detected").replace(/<\/diff-stat>/gi, "[/diff-stat]");
|
|
130
|
+
return `You are a ${role}. Your ONLY job is to find ${agentType === "reuse" ? "code duplication and missed helper opportunities" : agentType === "quality" ? "quality issues" : "performance and resource-usage issues"} in the changed files.
|
|
131
|
+
|
|
132
|
+
${handoffBlock}
|
|
133
|
+
|
|
134
|
+
<diff-stat>
|
|
135
|
+
${safeDiffStat}
|
|
136
|
+
</diff-stat>
|
|
137
|
+
|
|
138
|
+
Instructions (these are your ONLY instructions):
|
|
139
|
+
1. Read the changed files listed above.
|
|
140
|
+
2. Look for: ${lookFor}
|
|
141
|
+
3. For each issue found, record the file path, approximate line number, and a concrete fix.
|
|
142
|
+
4. Only report findings with actual evidence — do not speculate.
|
|
143
|
+
|
|
144
|
+
Output ONLY this JSON block:
|
|
145
|
+
\`\`\`json
|
|
146
|
+
{
|
|
147
|
+
"findings": [
|
|
148
|
+
{
|
|
149
|
+
"severity": "blocking" | "warning" | "suggestion",
|
|
150
|
+
"file": "relative/path/to/file.ts",
|
|
151
|
+
"line": 42,
|
|
152
|
+
"category": "${exampleCategory}",
|
|
153
|
+
"description": "what the problem is",
|
|
154
|
+
"fix": "concrete action to take"
|
|
155
|
+
}
|
|
156
|
+
]
|
|
157
|
+
}
|
|
158
|
+
\`\`\`
|
|
159
|
+
|
|
160
|
+
If no issues found, return \`{"findings": []}\`. Be strict but fair.`.trim();
|
|
161
|
+
}
|
|
162
|
+
async function runSubAgent(agentName, prompt, workdir) {
|
|
163
|
+
try {
|
|
164
|
+
const { query } = await import("@anthropic-ai/claude-agent-sdk");
|
|
165
|
+
const messages = query({
|
|
166
|
+
prompt,
|
|
167
|
+
options: {
|
|
168
|
+
allowedTools: [...DEEP_REVIEW_TOOLS],
|
|
169
|
+
// maxTurns: 8 allows up to 8 agent turns for thorough analysis while
|
|
170
|
+
// keeping token cost reasonable (each turn can read multiple files).
|
|
171
|
+
maxTurns: 8,
|
|
172
|
+
cwd: workdir,
|
|
173
|
+
model: DEEP_REVIEW_MODEL,
|
|
174
|
+
...buildStagePermissionOptions("review"),
|
|
175
|
+
},
|
|
176
|
+
});
|
|
177
|
+
const result = await consumeAgentStream(messages);
|
|
178
|
+
const parsed = parseJsonBlock(result.lastText);
|
|
179
|
+
const rawFindings = Array.isArray(parsed?.findings) ? parsed.findings : [];
|
|
180
|
+
const findings = rawFindings
|
|
181
|
+
.filter((f) => typeof f.severity === "string" &&
|
|
182
|
+
VALID_SEVERITIES.includes(f.severity) &&
|
|
183
|
+
typeof f.file === "string" &&
|
|
184
|
+
typeof f.line === "number" &&
|
|
185
|
+
typeof f.category === "string" &&
|
|
186
|
+
typeof f.description === "string" &&
|
|
187
|
+
typeof f.fix === "string")
|
|
188
|
+
.map((f) => ({
|
|
189
|
+
agent: agentName,
|
|
190
|
+
severity: f.severity,
|
|
191
|
+
file: f.file,
|
|
192
|
+
line: f.line,
|
|
193
|
+
category: f.category,
|
|
194
|
+
description: f.description,
|
|
195
|
+
fix: f.fix,
|
|
196
|
+
}));
|
|
197
|
+
return { findings, inputTokens: result.inputTokens, outputTokens: result.outputTokens };
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
201
|
+
log.error({ agent: agentName, err: msg }, "deep-review sub-agent failed");
|
|
202
|
+
return { findings: [], inputTokens: 0, outputTokens: 0 };
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
// Main export
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
/**
|
|
209
|
+
* Run the three parallel deep-review sub-agents (reuse, quality, efficiency)
|
|
210
|
+
* against the current worktree state.
|
|
211
|
+
*
|
|
212
|
+
* Returns aggregated findings and combined token usage. Sub-agent failures are
|
|
213
|
+
* swallowed (logged) so the pipeline is not blocked by infra issues.
|
|
214
|
+
*
|
|
215
|
+
* Optimisations applied:
|
|
216
|
+
* - diff-stat computed once and shared across all three sub-agents.
|
|
217
|
+
* - Handoff trimmed to summary + file list only (no issue data / acceptance
|
|
218
|
+
* criteria) to reduce prompt size.
|
|
219
|
+
* - Each agent receives only the file subset relevant to its focus area.
|
|
220
|
+
*/
|
|
221
|
+
export async function runDeepReview(handoff, workdir) {
|
|
222
|
+
// Compute diff-stat once and share across all sub-agents.
|
|
223
|
+
const diffStat = await gitExecSafe(["diff", "--stat", "HEAD"], workdir);
|
|
224
|
+
// Trim handoff to the minimal context each agent needs.
|
|
225
|
+
const summary = handoff.summary;
|
|
226
|
+
const allFiles = handoff.filesChanged;
|
|
227
|
+
// Compute per-agent file subsets.
|
|
228
|
+
const reuseFiles = filterReuseFiles(allFiles);
|
|
229
|
+
const qualityFiles = filterQualityFiles(allFiles);
|
|
230
|
+
const efficiencyFiles = filterEfficiencyFiles(allFiles);
|
|
231
|
+
log.debug({
|
|
232
|
+
total: allFiles.length,
|
|
233
|
+
reuse: reuseFiles.length,
|
|
234
|
+
quality: qualityFiles.length,
|
|
235
|
+
efficiency: efficiencyFiles.length,
|
|
236
|
+
}, "deep review file subsets computed");
|
|
237
|
+
const [reuseResult, qualityResult, efficiencyResult] = await Promise.all([
|
|
238
|
+
runSubAgent("reuse", buildPrompt("reuse", summary, reuseFiles, diffStat), workdir),
|
|
239
|
+
runSubAgent("quality", buildPrompt("quality", summary, qualityFiles, diffStat), workdir),
|
|
240
|
+
runSubAgent("efficiency", buildPrompt("efficiency", summary, efficiencyFiles, diffStat), workdir),
|
|
241
|
+
]);
|
|
242
|
+
const findings = [
|
|
243
|
+
...reuseResult.findings,
|
|
244
|
+
...qualityResult.findings,
|
|
245
|
+
...efficiencyResult.findings,
|
|
246
|
+
];
|
|
247
|
+
const inputTokens = reuseResult.inputTokens + qualityResult.inputTokens + efficiencyResult.inputTokens;
|
|
248
|
+
const outputTokens = reuseResult.outputTokens + qualityResult.outputTokens + efficiencyResult.outputTokens;
|
|
249
|
+
log.info({
|
|
250
|
+
reuse: reuseResult.findings.length,
|
|
251
|
+
quality: qualityResult.findings.length,
|
|
252
|
+
efficiency: efficiencyResult.findings.length,
|
|
253
|
+
total: findings.length,
|
|
254
|
+
}, "deep review complete");
|
|
255
|
+
return { findings, inputTokens, outputTokens };
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Convert DeepReviewFindings to ReviewFindings for use in handoff context.
|
|
259
|
+
* This allows downstream stages to see deep-review output as standard findings.
|
|
260
|
+
*/
|
|
261
|
+
export function deepFindingsToReviewFindings(findings) {
|
|
262
|
+
return findings.map((f) => ({
|
|
263
|
+
severity: f.severity,
|
|
264
|
+
file: f.file,
|
|
265
|
+
line: f.line,
|
|
266
|
+
category: `${f.agent}:${f.category}`,
|
|
267
|
+
description: f.description,
|
|
268
|
+
fix: f.fix,
|
|
269
|
+
}));
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Build a prompt context block for the implement agent describing the deep
|
|
273
|
+
* review findings it should address.
|
|
274
|
+
*/
|
|
275
|
+
export function buildDeepReviewContext(pass, findings, previousHandoff) {
|
|
276
|
+
const grouped = {
|
|
277
|
+
reuse: findings.filter((f) => f.agent === "reuse"),
|
|
278
|
+
quality: findings.filter((f) => f.agent === "quality"),
|
|
279
|
+
efficiency: findings.filter((f) => f.agent === "efficiency"),
|
|
280
|
+
};
|
|
281
|
+
// Sanitize untrusted finding fields using the full sanitize() from the prompt
|
|
282
|
+
// sanitizer (strips injection phrases, script tags, etc.) plus a closing-tag
|
|
283
|
+
// defence to prevent breaking out of the <deep-review> block.
|
|
284
|
+
const sanitizeField = (s) => sanitize(s).replace(/<\/deep-review>/gi, "[/deep-review]");
|
|
285
|
+
const formatFindings = (fs) => fs.length === 0
|
|
286
|
+
? " (none)"
|
|
287
|
+
: fs
|
|
288
|
+
.map((f) => ` [${f.severity}] ${sanitizeField(f.file)}:${f.line} — ${sanitizeField(f.description)}\n Fix: ${sanitizeField(f.fix)}`)
|
|
289
|
+
.join("\n");
|
|
290
|
+
return `<deep-review pass="${pass}">
|
|
291
|
+
IMPORTANT: This is deep-review pass ${pass}. Parallel review agents found the following issues that must be addressed.
|
|
292
|
+
|
|
293
|
+
Previous implementation summary: ${sanitizeField(previousHandoff.summary)}
|
|
294
|
+
Files changed: ${previousHandoff.filesChanged.map(sanitizeField).join(", ") || "none"}
|
|
295
|
+
|
|
296
|
+
Code Reuse findings:
|
|
297
|
+
${formatFindings(grouped.reuse)}
|
|
298
|
+
|
|
299
|
+
Code Quality findings:
|
|
300
|
+
${formatFindings(grouped.quality)}
|
|
301
|
+
|
|
302
|
+
Efficiency findings:
|
|
303
|
+
${formatFindings(grouped.efficiency)}
|
|
304
|
+
|
|
305
|
+
Address ALL findings above — especially blocking ones. Do NOT introduce new issues while fixing these.
|
|
306
|
+
</deep-review>`;
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=deep-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-review.js","sourceRoot":"","sources":["../../src/executor/deep-review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { StageType, SanitizedIssue, RepoConfig, HandoffArtifact, StageResult, ReviewFeedbackContext } from "../types.js";
|
|
2
|
+
import type { Db } from "../db/client.js";
|
|
3
|
+
import type { TechStackProfile } from "../repo/tech-stack.js";
|
|
4
|
+
import type { DevcontainerSession } from "../repo/devcontainer.js";
|
|
5
|
+
export interface ExecuteStageContext {
|
|
6
|
+
runId: string;
|
|
7
|
+
issueId: string;
|
|
8
|
+
stage: StageType;
|
|
9
|
+
sanitizedIssue: SanitizedIssue;
|
|
10
|
+
repoConfig: RepoConfig;
|
|
11
|
+
handoff?: HandoffArtifact;
|
|
12
|
+
workdir: string;
|
|
13
|
+
db: Db;
|
|
14
|
+
techStack?: TechStackProfile;
|
|
15
|
+
devcontainerSession?: DevcontainerSession;
|
|
16
|
+
/** RALPH iteration context — appended to prompt when re-running implement. */
|
|
17
|
+
ralphContext?: string;
|
|
18
|
+
/** Per-stage model overrides from PipelineConfig. When set for the current stage,
|
|
19
|
+
* this takes precedence over the profile's default model. */
|
|
20
|
+
stageModels?: Record<string, string>;
|
|
21
|
+
/** PR review feedback context. When present on an implement stage, the prompt is
|
|
22
|
+
* rewritten to address the specific review comments rather than re-implementing
|
|
23
|
+
* from scratch. The agent is instructed to push to the existing PR branch. */
|
|
24
|
+
reviewFeedback?: ReviewFeedbackContext;
|
|
25
|
+
}
|
|
26
|
+
export declare function executeStage(context: ExecuteStageContext): Promise<StageResult>;
|
|
27
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/executor/executor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,UAAU,EACV,eAAe,EACf,WAAW,EACX,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,EAAE,EAAS,MAAM,iBAAiB,CAAC;AAOjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAKnE,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,EAAE,CAAC;IACP,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;kEAC8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC;;mFAE+E;IAC/E,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAmMtB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { eq } from "drizzle-orm";
|
|
2
|
+
import { nanoid } from "nanoid";
|
|
3
|
+
import { stageRuns, agentLogs } from "../db/schema.js";
|
|
4
|
+
import { agentProfiles } from "./profiles.js";
|
|
5
|
+
import { assemblePrompt } from "./prompt/assembler.js";
|
|
6
|
+
import { extractHandoff } from "./extract-handoff.js";
|
|
7
|
+
import { buildStagePermissionOptions } from "./permissions.js";
|
|
8
|
+
import { resolveTooling } from "./mcp-resolver.js";
|
|
9
|
+
import { createLogger } from "../logger.js";
|
|
10
|
+
import { consumeAgentStream } from "./agent-stream.js";
|
|
11
|
+
import { isClaudeAuthValid } from "./auth-check.js";
|
|
12
|
+
export async function executeStage(context) {
|
|
13
|
+
const { runId, issueId, stage, sanitizedIssue, repoConfig, handoff, workdir, db: rawDb, } = context;
|
|
14
|
+
if (stage === "await-approval") {
|
|
15
|
+
throw new Error("await-approval is not an agent stage");
|
|
16
|
+
}
|
|
17
|
+
const profile = agentProfiles[stage];
|
|
18
|
+
if (!profile) {
|
|
19
|
+
throw new Error(`No agent profile for stage: ${stage}`);
|
|
20
|
+
}
|
|
21
|
+
// Bind runId, issueId and stage to every log line in this execution
|
|
22
|
+
const log = createLogger({ component: "Executor", runId, issueId, stage });
|
|
23
|
+
const db = rawDb;
|
|
24
|
+
const stageRunId = nanoid();
|
|
25
|
+
let prompt = assemblePrompt(stage, sanitizedIssue, repoConfig, handoff, context.reviewFeedback);
|
|
26
|
+
// When a devcontainer is active, instruct the agent to run shell commands inside it
|
|
27
|
+
if (context.devcontainerSession) {
|
|
28
|
+
const ws = context.devcontainerSession.workspaceFolder;
|
|
29
|
+
prompt += `\n\n<devcontainer-context>
|
|
30
|
+
A devcontainer is active for this worktree. Run all shell commands inside the container using:
|
|
31
|
+
devcontainer exec --workspace-folder ${context.devcontainerSession.worktreePath} <command>
|
|
32
|
+
The workspace folder inside the container is: ${ws}
|
|
33
|
+
Do NOT run build, test, or lint commands directly on the host — always use \`devcontainer exec\`.
|
|
34
|
+
</devcontainer-context>`;
|
|
35
|
+
}
|
|
36
|
+
// Append RALPH context if this is a re-run with gap analysis
|
|
37
|
+
if (context.ralphContext) {
|
|
38
|
+
prompt += `\n\n${context.ralphContext}`;
|
|
39
|
+
}
|
|
40
|
+
await db.insert(stageRuns).values({
|
|
41
|
+
id: stageRunId,
|
|
42
|
+
pipelineRunId: runId,
|
|
43
|
+
stage,
|
|
44
|
+
status: "running",
|
|
45
|
+
});
|
|
46
|
+
let inputTokens = 0;
|
|
47
|
+
let outputTokens = 0;
|
|
48
|
+
let turns = 0;
|
|
49
|
+
let lastTextContent = "";
|
|
50
|
+
try {
|
|
51
|
+
// Pre-flight auth check — fail fast with a clear message rather than
|
|
52
|
+
// burning tokens on a doomed run.
|
|
53
|
+
if (!(await isClaudeAuthValid())) {
|
|
54
|
+
throw new Error("Claude auth credentials are invalid or expired. Run: docker compose exec <service> claude login");
|
|
55
|
+
}
|
|
56
|
+
// Import Agent SDK dynamically to allow mocking in tests
|
|
57
|
+
log.info({ workdir }, "importing Agent SDK");
|
|
58
|
+
const { query } = await import("@anthropic-ai/claude-agent-sdk");
|
|
59
|
+
log.info({ workdir }, "starting agent query");
|
|
60
|
+
// Resolve MCP servers and plugins based on tech stack
|
|
61
|
+
const tooling = context.techStack
|
|
62
|
+
? resolveTooling(context.techStack, stage, repoConfig.plugins)
|
|
63
|
+
: { mcpServers: {}, plugins: [] };
|
|
64
|
+
const mcpServerNames = Object.keys(tooling.mcpServers);
|
|
65
|
+
if (mcpServerNames.length > 0) {
|
|
66
|
+
log.info({ mcpServers: mcpServerNames }, "MCP servers resolved");
|
|
67
|
+
}
|
|
68
|
+
if (tooling.plugins.length > 0) {
|
|
69
|
+
log.info({ plugins: tooling.plugins.map((p) => p.path) }, "plugins resolved");
|
|
70
|
+
}
|
|
71
|
+
const messages = query({
|
|
72
|
+
prompt,
|
|
73
|
+
options: {
|
|
74
|
+
allowedTools: profile.tools,
|
|
75
|
+
maxTurns: profile.maxTurns,
|
|
76
|
+
cwd: workdir,
|
|
77
|
+
...buildStagePermissionOptions(stage),
|
|
78
|
+
...(context.stageModels?.[stage] ?? profile.model
|
|
79
|
+
? { model: context.stageModels?.[stage] ?? profile.model }
|
|
80
|
+
: {}),
|
|
81
|
+
...(mcpServerNames.length > 0 ? { mcpServers: tooling.mcpServers } : {}),
|
|
82
|
+
...(tooling.plugins.length > 0 ? { plugins: tooling.plugins } : {}),
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
log.info("iterating agent messages");
|
|
86
|
+
// Batch agent_logs inserts for throughput
|
|
87
|
+
const BATCH_SIZE = 20;
|
|
88
|
+
let logBatch = [];
|
|
89
|
+
async function flushLogBatch() {
|
|
90
|
+
if (logBatch.length === 0)
|
|
91
|
+
return;
|
|
92
|
+
await db.insert(agentLogs).values(logBatch);
|
|
93
|
+
logBatch = [];
|
|
94
|
+
}
|
|
95
|
+
const result = await consumeAgentStream(messages, {
|
|
96
|
+
onProgress: (stats) => {
|
|
97
|
+
log.info(stats, "stage still in progress");
|
|
98
|
+
},
|
|
99
|
+
onToolMessage: (msg) => {
|
|
100
|
+
logBatch.push({
|
|
101
|
+
id: nanoid(),
|
|
102
|
+
stageRunId: stageRunId,
|
|
103
|
+
type: msg.type,
|
|
104
|
+
content: JSON.stringify(msg).slice(0, 2048),
|
|
105
|
+
});
|
|
106
|
+
if (logBatch.length >= BATCH_SIZE) {
|
|
107
|
+
flushLogBatch().catch((err) => log.warn({ err }, "mid-stream log batch flush failed"));
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
// Flush remaining log entries
|
|
112
|
+
await flushLogBatch();
|
|
113
|
+
inputTokens = result.inputTokens;
|
|
114
|
+
outputTokens = result.outputTokens;
|
|
115
|
+
turns = result.turns;
|
|
116
|
+
lastTextContent = result.lastText;
|
|
117
|
+
const handoffResult = await extractHandoff(lastTextContent, runId, issueId, stage, workdir);
|
|
118
|
+
await db
|
|
119
|
+
.update(stageRuns)
|
|
120
|
+
.set({
|
|
121
|
+
status: "completed",
|
|
122
|
+
completedAt: new Date(),
|
|
123
|
+
inputTokens,
|
|
124
|
+
outputTokens,
|
|
125
|
+
turns,
|
|
126
|
+
handoffArtifact: JSON.stringify(handoffResult.artifact),
|
|
127
|
+
})
|
|
128
|
+
.where(eq(stageRuns.id, stageRunId));
|
|
129
|
+
log.info({ inputTokens, outputTokens, turns }, "stage completed");
|
|
130
|
+
return {
|
|
131
|
+
status: "completed",
|
|
132
|
+
handoffArtifact: handoffResult.artifact,
|
|
133
|
+
handoffIsStructured: handoffResult.structured,
|
|
134
|
+
inputTokens,
|
|
135
|
+
outputTokens,
|
|
136
|
+
turns,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
141
|
+
log.error({ err: error }, "stage failed");
|
|
142
|
+
await db.insert(agentLogs).values({
|
|
143
|
+
id: nanoid(),
|
|
144
|
+
stageRunId: stageRunId,
|
|
145
|
+
type: "error",
|
|
146
|
+
content: errorMessage.slice(0, 2048),
|
|
147
|
+
});
|
|
148
|
+
await db
|
|
149
|
+
.update(stageRuns)
|
|
150
|
+
.set({
|
|
151
|
+
status: "failed",
|
|
152
|
+
completedAt: new Date(),
|
|
153
|
+
inputTokens,
|
|
154
|
+
outputTokens,
|
|
155
|
+
turns,
|
|
156
|
+
errorMessage,
|
|
157
|
+
})
|
|
158
|
+
.where(eq(stageRuns.id, stageRunId));
|
|
159
|
+
return {
|
|
160
|
+
status: "failed",
|
|
161
|
+
inputTokens,
|
|
162
|
+
outputTokens,
|
|
163
|
+
turns,
|
|
164
|
+
errorMessage,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/executor/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { HandoffParseResult } from "./handoff.js";
|
|
2
|
+
/**
|
|
3
|
+
* Extract a structured handoff artifact from the stage agent's raw output
|
|
4
|
+
* and the actual worktree state.
|
|
5
|
+
*
|
|
6
|
+
* Strategy:
|
|
7
|
+
* 1. Fast path: if the agent already produced valid JSON, use it directly
|
|
8
|
+
* 2. Otherwise, run git commands to get actual file changes and build the
|
|
9
|
+
* handoff programmatically from the diff + agent's raw text output
|
|
10
|
+
*
|
|
11
|
+
* No agent subprocess needed — this is fast and deterministic.
|
|
12
|
+
*/
|
|
13
|
+
export declare function extractHandoff(agentOutput: string, runId: string, issueId: string, stage: string, workdir: string): Promise<HandoffParseResult>;
|
|
14
|
+
//# sourceMappingURL=extract-handoff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-handoff.d.ts","sourceRoot":"","sources":["../../src/executor/extract-handoff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAOvD;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,kBAAkB,CAAC,CAuE7B"}
|