takt 0.45.0 → 0.46.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/builtins/en/config.yaml +9 -0
- package/builtins/en/facets/instructions/implement-maintenance.md +2 -0
- package/builtins/en/facets/instructions/implement.md +3 -2
- package/builtins/en/facets/instructions/review-arch.md +1 -1
- package/builtins/en/facets/instructions/review-coding.md +4 -3
- package/builtins/en/facets/instructions/review-cqrs-es.md +1 -1
- package/builtins/en/facets/instructions/review-pure.md +1 -0
- package/builtins/en/facets/instructions/review-qa.md +1 -0
- package/builtins/en/facets/instructions/review-terraform.md +1 -1
- package/builtins/en/facets/instructions/review-test.md +2 -0
- package/builtins/en/facets/instructions/supervise-maintenance.md +7 -5
- package/builtins/en/facets/instructions/supervise.md +11 -4
- package/builtins/en/facets/instructions/write-tests-maintenance.md +1 -0
- package/builtins/en/facets/knowledge/e2e-testing.md +11 -1
- package/builtins/en/facets/knowledge/unit-testing.md +11 -0
- package/builtins/en/facets/output-contracts/maintenance-scope.md +5 -0
- package/builtins/en/facets/output-contracts/pure-review.md +61 -0
- package/builtins/en/facets/output-contracts/qa-review.md +5 -0
- package/builtins/en/facets/output-contracts/supervisor-validation.md +1 -1
- package/builtins/en/facets/output-contracts/testing-review.md +6 -1
- package/builtins/en/facets/personas/ai-antipattern-reviewer.md +2 -2
- package/builtins/en/facets/personas/architecture-reviewer.md +1 -1
- package/builtins/en/facets/personas/pr-commenter.md +2 -2
- package/builtins/en/facets/personas/pure-reviewer.md +22 -0
- package/builtins/en/facets/personas/supervisor.md +1 -1
- package/builtins/en/facets/personas/terraform-reviewer.md +3 -3
- package/builtins/en/facets/policies/ai-antipattern.md +2 -0
- package/builtins/en/facets/policies/coding.md +36 -0
- package/builtins/en/facets/policies/review.md +26 -1
- package/builtins/en/facets/policies/testing.md +25 -0
- package/builtins/en/workflows/backend-cqrs.yaml +21 -0
- package/builtins/en/workflows/backend.yaml +21 -0
- package/builtins/en/workflows/default-high.yaml +1 -1
- package/builtins/en/workflows/default-peer-review.yaml +24 -3
- package/builtins/en/workflows/draft.yaml +4 -32
- package/builtins/en/workflows/dual-cqrs.yaml +21 -0
- package/builtins/en/workflows/dual.yaml +5 -5
- package/builtins/en/workflows/frontend-maintenance.yaml +21 -0
- package/builtins/en/workflows/frontend.yaml +21 -0
- package/builtins/en/workflows/peer-review.yaml +13 -70
- package/builtins/en/workflows/provider-options/edit.yaml +21 -0
- package/builtins/en/workflows/provider-options/review-files.yaml +10 -0
- package/builtins/en/workflows/provider-options/review-readonly.yaml +16 -0
- package/builtins/en/workflows/provider-options/review-web.yaml +14 -0
- package/builtins/en/workflows/review-backend-cqrs.yaml +21 -0
- package/builtins/en/workflows/review-backend.yaml +21 -0
- package/builtins/en/workflows/review-default.yaml +6 -6
- package/builtins/en/workflows/review-dual-cqrs.yaml +21 -0
- package/builtins/en/workflows/review-dual.yaml +21 -0
- package/builtins/en/workflows/review-fix-backend-cqrs.yaml +21 -0
- package/builtins/en/workflows/review-fix-backend.yaml +21 -0
- package/builtins/en/workflows/review-fix-default.yaml +6 -6
- package/builtins/en/workflows/review-fix-dual-cqrs.yaml +21 -0
- package/builtins/en/workflows/review-fix-dual.yaml +21 -0
- package/builtins/en/workflows/review-fix-frontend.yaml +21 -0
- package/builtins/en/workflows/review-fix-takt-default.yaml +5 -5
- package/builtins/en/workflows/review-frontend.yaml +21 -0
- package/builtins/en/workflows/review-takt-default.yaml +6 -6
- package/builtins/en/workflows/takt-default-refresh-all.yaml +6 -6
- package/builtins/en/workflows/takt-default-refresh-fast.yaml +5 -5
- package/builtins/en/workflows/takt-default.yaml +4 -27
- package/builtins/en/workflows/terraform.yaml +23 -2
- package/builtins/ja/config.yaml +9 -0
- package/builtins/ja/facets/instructions/implement-maintenance.md +2 -0
- package/builtins/ja/facets/instructions/implement.md +3 -2
- package/builtins/ja/facets/instructions/review-arch.md +1 -1
- package/builtins/ja/facets/instructions/review-coding.md +4 -3
- package/builtins/ja/facets/instructions/review-cqrs-es.md +1 -1
- package/builtins/ja/facets/instructions/review-pure.md +1 -0
- package/builtins/ja/facets/instructions/review-qa.md +1 -0
- package/builtins/ja/facets/instructions/review-terraform.md +1 -1
- package/builtins/ja/facets/instructions/review-test.md +2 -0
- package/builtins/ja/facets/instructions/supervise-maintenance.md +6 -4
- package/builtins/ja/facets/instructions/supervise.md +11 -4
- package/builtins/ja/facets/instructions/write-tests-maintenance.md +1 -0
- package/builtins/ja/facets/knowledge/e2e-testing.md +11 -1
- package/builtins/ja/facets/knowledge/unit-testing.md +11 -0
- package/builtins/ja/facets/output-contracts/maintenance-scope.md +5 -0
- package/builtins/ja/facets/output-contracts/pure-review.md +61 -0
- package/builtins/ja/facets/output-contracts/qa-review.md +5 -0
- package/builtins/ja/facets/output-contracts/supervisor-validation.md +1 -1
- package/builtins/ja/facets/output-contracts/testing-review.md +6 -1
- package/builtins/ja/facets/personas/ai-antipattern-reviewer.md +2 -2
- package/builtins/ja/facets/personas/architecture-reviewer.md +2 -2
- package/builtins/ja/facets/personas/pr-commenter.md +3 -3
- package/builtins/ja/facets/personas/pure-reviewer.md +22 -0
- package/builtins/ja/facets/personas/supervisor.md +1 -1
- package/builtins/ja/facets/personas/terraform-reviewer.md +3 -3
- package/builtins/ja/facets/policies/ai-antipattern.md +2 -0
- package/builtins/ja/facets/policies/coding.md +36 -0
- package/builtins/ja/facets/policies/review.md +26 -1
- package/builtins/ja/facets/policies/testing.md +25 -0
- package/builtins/ja/workflows/backend-cqrs.yaml +21 -0
- package/builtins/ja/workflows/backend.yaml +21 -0
- package/builtins/ja/workflows/default-high.yaml +1 -1
- package/builtins/ja/workflows/default-peer-review.yaml +24 -3
- package/builtins/ja/workflows/draft.yaml +4 -32
- package/builtins/ja/workflows/dual-cqrs.yaml +21 -0
- package/builtins/ja/workflows/dual.yaml +5 -5
- package/builtins/ja/workflows/frontend-maintenance.yaml +21 -0
- package/builtins/ja/workflows/frontend.yaml +21 -0
- package/builtins/ja/workflows/peer-review.yaml +13 -70
- package/builtins/ja/workflows/provider-options/edit.yaml +21 -0
- package/builtins/ja/workflows/provider-options/review-files.yaml +10 -0
- package/builtins/ja/workflows/provider-options/review-readonly.yaml +16 -0
- package/builtins/ja/workflows/provider-options/review-web.yaml +14 -0
- package/builtins/ja/workflows/review-backend-cqrs.yaml +21 -0
- package/builtins/ja/workflows/review-backend.yaml +21 -0
- package/builtins/ja/workflows/review-default.yaml +7 -7
- package/builtins/ja/workflows/review-dual-cqrs.yaml +21 -0
- package/builtins/ja/workflows/review-dual.yaml +21 -0
- package/builtins/ja/workflows/review-fix-backend-cqrs.yaml +21 -0
- package/builtins/ja/workflows/review-fix-backend.yaml +21 -0
- package/builtins/ja/workflows/review-fix-default.yaml +6 -6
- package/builtins/ja/workflows/review-fix-dual-cqrs.yaml +21 -0
- package/builtins/ja/workflows/review-fix-dual.yaml +21 -0
- package/builtins/ja/workflows/review-fix-frontend.yaml +21 -0
- package/builtins/ja/workflows/review-fix-takt-default.yaml +6 -6
- package/builtins/ja/workflows/review-frontend.yaml +21 -0
- package/builtins/ja/workflows/review-takt-default.yaml +7 -7
- package/builtins/ja/workflows/takt-default-refresh-all.yaml +6 -6
- package/builtins/ja/workflows/takt-default-refresh-fast.yaml +5 -5
- package/builtins/ja/workflows/takt-default.yaml +4 -27
- package/builtins/ja/workflows/terraform.yaml +22 -1
- package/dist/agents/decompose-task-usecase.d.ts +2 -1
- package/dist/agents/decompose-task-usecase.d.ts.map +1 -1
- package/dist/agents/decompose-task-usecase.js +7 -5
- package/dist/agents/decompose-task-usecase.js.map +1 -1
- package/dist/agents/judge-status-usecase.d.ts +4 -1
- package/dist/agents/judge-status-usecase.d.ts.map +1 -1
- package/dist/agents/judge-status-usecase.js +5 -0
- package/dist/agents/judge-status-usecase.js.map +1 -1
- package/dist/agents/runner-prompt.d.ts +3 -1
- package/dist/agents/runner-prompt.d.ts.map +1 -1
- package/dist/agents/runner-prompt.js +11 -4
- package/dist/agents/runner-prompt.js.map +1 -1
- package/dist/agents/runner.d.ts.map +1 -1
- package/dist/agents/runner.js +23 -5
- package/dist/agents/runner.js.map +1 -1
- package/dist/agents/structured-caller/capability-aware-structured-caller.d.ts +1 -1
- package/dist/agents/structured-caller/capability-aware-structured-caller.d.ts.map +1 -1
- package/dist/agents/structured-caller/capability-aware-structured-caller.js +3 -3
- package/dist/agents/structured-caller/capability-aware-structured-caller.js.map +1 -1
- package/dist/agents/structured-caller/contracts.d.ts +1 -1
- package/dist/agents/structured-caller/contracts.d.ts.map +1 -1
- package/dist/agents/structured-caller/default-structured-caller.d.ts +1 -1
- package/dist/agents/structured-caller/default-structured-caller.d.ts.map +1 -1
- package/dist/agents/structured-caller/default-structured-caller.js +2 -2
- package/dist/agents/structured-caller/default-structured-caller.js.map +1 -1
- package/dist/agents/structured-caller/prompt-based-structured-caller.d.ts +1 -1
- package/dist/agents/structured-caller/prompt-based-structured-caller.d.ts.map +1 -1
- package/dist/agents/structured-caller/prompt-based-structured-caller.js +9 -3
- package/dist/agents/structured-caller/prompt-based-structured-caller.js.map +1 -1
- package/dist/agents/team-leader-structured-output.d.ts +3 -3
- package/dist/agents/team-leader-structured-output.d.ts.map +1 -1
- package/dist/agents/team-leader-structured-output.js +14 -10
- package/dist/agents/team-leader-structured-output.js.map +1 -1
- package/dist/agents/types.d.ts +1 -0
- package/dist/agents/types.d.ts.map +1 -1
- package/dist/core/models/config-schemas.d.ts +16 -0
- package/dist/core/models/config-schemas.d.ts.map +1 -1
- package/dist/core/models/part.d.ts +2 -1
- package/dist/core/models/part.d.ts.map +1 -1
- package/dist/core/models/schema-base.d.ts +66 -0
- package/dist/core/models/schema-base.d.ts.map +1 -1
- package/dist/core/models/schema-base.js +7 -2
- package/dist/core/models/schema-base.js.map +1 -1
- package/dist/core/models/workflow-provider-options.d.ts +5 -0
- package/dist/core/models/workflow-provider-options.d.ts.map +1 -1
- package/dist/core/models/workflow-provider-options.js.map +1 -1
- package/dist/core/models/workflow-schemas.d.ts +165 -21
- package/dist/core/models/workflow-schemas.d.ts.map +1 -1
- package/dist/core/models/workflow-schemas.js +62 -18
- package/dist/core/models/workflow-schemas.js.map +1 -1
- package/dist/core/models/workflow-types.d.ts +1 -1
- package/dist/core/models/workflow-types.d.ts.map +1 -1
- package/dist/core/models/workflow-types.js.map +1 -1
- package/dist/core/workflow/engine/ArpeggioRunner.d.ts +2 -0
- package/dist/core/workflow/engine/ArpeggioRunner.d.ts.map +1 -1
- package/dist/core/workflow/engine/ArpeggioRunner.js +1 -0
- package/dist/core/workflow/engine/ArpeggioRunner.js.map +1 -1
- package/dist/core/workflow/engine/OptionsBuilder.d.ts.map +1 -1
- package/dist/core/workflow/engine/OptionsBuilder.js +2 -0
- package/dist/core/workflow/engine/OptionsBuilder.js.map +1 -1
- package/dist/core/workflow/engine/ParallelRunner.d.ts +1 -0
- package/dist/core/workflow/engine/ParallelRunner.d.ts.map +1 -1
- package/dist/core/workflow/engine/ParallelRunner.js +3 -0
- package/dist/core/workflow/engine/ParallelRunner.js.map +1 -1
- package/dist/core/workflow/engine/StepExecutor.d.ts.map +1 -1
- package/dist/core/workflow/engine/StepExecutor.js +1 -0
- package/dist/core/workflow/engine/StepExecutor.js.map +1 -1
- package/dist/core/workflow/engine/TeamLeaderRunner.d.ts.map +1 -1
- package/dist/core/workflow/engine/TeamLeaderRunner.js +9 -4
- package/dist/core/workflow/engine/TeamLeaderRunner.js.map +1 -1
- package/dist/core/workflow/engine/WorkflowEngineSetup.d.ts.map +1 -1
- package/dist/core/workflow/engine/WorkflowEngineSetup.js +2 -0
- package/dist/core/workflow/engine/WorkflowEngineSetup.js.map +1 -1
- package/dist/core/workflow/engine/WorkflowRunLoop.d.ts +1 -0
- package/dist/core/workflow/engine/WorkflowRunLoop.d.ts.map +1 -1
- package/dist/core/workflow/engine/WorkflowRunLoop.js +3 -0
- package/dist/core/workflow/engine/WorkflowRunLoop.js.map +1 -1
- package/dist/core/workflow/engine/engine-provider-options.d.ts.map +1 -1
- package/dist/core/workflow/engine/engine-provider-options.js +3 -3
- package/dist/core/workflow/engine/engine-provider-options.js.map +1 -1
- package/dist/core/workflow/engine/parallel-logger.d.ts +1 -1
- package/dist/core/workflow/engine/parallel-logger.d.ts.map +1 -1
- package/dist/core/workflow/engine/parallel-logger.js +3 -1
- package/dist/core/workflow/engine/parallel-logger.js.map +1 -1
- package/dist/core/workflow/engine/task-decomposer.d.ts +1 -1
- package/dist/core/workflow/engine/task-decomposer.d.ts.map +1 -1
- package/dist/core/workflow/engine/task-decomposer.js +3 -3
- package/dist/core/workflow/engine/task-decomposer.js.map +1 -1
- package/dist/core/workflow/engine/team-leader-budget-errors.d.ts +2 -0
- package/dist/core/workflow/engine/team-leader-budget-errors.d.ts.map +1 -0
- package/dist/core/workflow/engine/team-leader-budget-errors.js +12 -0
- package/dist/core/workflow/engine/team-leader-budget-errors.js.map +1 -0
- package/dist/core/workflow/engine/team-leader-execution.d.ts.map +1 -1
- package/dist/core/workflow/engine/team-leader-execution.js +16 -2
- package/dist/core/workflow/engine/team-leader-execution.js.map +1 -1
- package/dist/core/workflow/evaluation/RuleEvaluator.d.ts +2 -0
- package/dist/core/workflow/evaluation/RuleEvaluator.d.ts.map +1 -1
- package/dist/core/workflow/evaluation/RuleEvaluator.js +1 -0
- package/dist/core/workflow/evaluation/RuleEvaluator.js.map +1 -1
- package/dist/core/workflow/observability/workflowSpans.d.ts.map +1 -1
- package/dist/core/workflow/observability/workflowSpans.js +27 -9
- package/dist/core/workflow/observability/workflowSpans.js.map +1 -1
- package/dist/core/workflow/phase-runner.d.ts +2 -0
- package/dist/core/workflow/phase-runner.d.ts.map +1 -1
- package/dist/core/workflow/phase-runner.js.map +1 -1
- package/dist/core/workflow/promotion/PromotionEvaluator.d.ts +2 -0
- package/dist/core/workflow/promotion/PromotionEvaluator.d.ts.map +1 -1
- package/dist/core/workflow/promotion/PromotionEvaluator.js +1 -0
- package/dist/core/workflow/promotion/PromotionEvaluator.js.map +1 -1
- package/dist/core/workflow/promotion/promotion-runtime.d.ts +2 -0
- package/dist/core/workflow/promotion/promotion-runtime.d.ts.map +1 -1
- package/dist/core/workflow/promotion/promotion-runtime.js +1 -0
- package/dist/core/workflow/promotion/promotion-runtime.js.map +1 -1
- package/dist/core/workflow/quality-gates/commandGateRunner.d.ts +1 -1
- package/dist/core/workflow/quality-gates/commandGateRunner.d.ts.map +1 -1
- package/dist/core/workflow/quality-gates/commandGateRunner.js +11 -6
- package/dist/core/workflow/quality-gates/commandGateRunner.js.map +1 -1
- package/dist/core/workflow/quality-gates/qualityGateRunner.d.ts +1 -1
- package/dist/core/workflow/quality-gates/qualityGateRunner.d.ts.map +1 -1
- package/dist/core/workflow/quality-gates/qualityGateRunner.js +2 -2
- package/dist/core/workflow/quality-gates/qualityGateRunner.js.map +1 -1
- package/dist/core/workflow/quality-gates/types.d.ts +2 -0
- package/dist/core/workflow/quality-gates/types.d.ts.map +1 -1
- package/dist/core/workflow/status-judgment-phase.d.ts.map +1 -1
- package/dist/core/workflow/status-judgment-phase.js +1 -0
- package/dist/core/workflow/status-judgment-phase.js.map +1 -1
- package/dist/core/workflow/types.d.ts +2 -0
- package/dist/core/workflow/types.d.ts.map +1 -1
- package/dist/features/interactive/aiCaller.d.ts.map +1 -1
- package/dist/features/interactive/aiCaller.js +4 -2
- package/dist/features/interactive/aiCaller.js.map +1 -1
- package/dist/features/tasks/execute/workflowExecution.d.ts.map +1 -1
- package/dist/features/tasks/execute/workflowExecution.js +30 -0
- package/dist/features/tasks/execute/workflowExecution.js.map +1 -1
- package/dist/features/tasks/execute/workflowExecutionEvents.d.ts.map +1 -1
- package/dist/features/tasks/execute/workflowExecutionEvents.js +6 -0
- package/dist/features/tasks/execute/workflowExecutionEvents.js.map +1 -1
- package/dist/infra/claude/client.d.ts.map +1 -1
- package/dist/infra/claude/client.js +1 -0
- package/dist/infra/claude/client.js.map +1 -1
- package/dist/infra/claude/options-builder.d.ts.map +1 -1
- package/dist/infra/claude/options-builder.js +2 -3
- package/dist/infra/claude/options-builder.js.map +1 -1
- package/dist/infra/claude/types.d.ts +2 -0
- package/dist/infra/claude/types.d.ts.map +1 -1
- package/dist/infra/claude-headless/headless-spawn.d.ts.map +1 -1
- package/dist/infra/claude-headless/headless-spawn.js +2 -1
- package/dist/infra/claude-headless/headless-spawn.js.map +1 -1
- package/dist/infra/claude-headless/types.d.ts +1 -0
- package/dist/infra/claude-headless/types.d.ts.map +1 -1
- package/dist/infra/claude-terminal/client.d.ts.map +1 -1
- package/dist/infra/claude-terminal/client.js +1 -0
- package/dist/infra/claude-terminal/client.js.map +1 -1
- package/dist/infra/claude-terminal/response-normalizer.js.map +1 -1
- package/dist/infra/claude-terminal/tmux-backend.d.ts.map +1 -1
- package/dist/infra/claude-terminal/tmux-backend.js +15 -1
- package/dist/infra/claude-terminal/tmux-backend.js.map +1 -1
- package/dist/infra/claude-terminal/types.d.ts +2 -0
- package/dist/infra/claude-terminal/types.d.ts.map +1 -1
- package/dist/infra/codex/client.d.ts.map +1 -1
- package/dist/infra/codex/client.js +3 -1
- package/dist/infra/codex/client.js.map +1 -1
- package/dist/infra/codex/types.d.ts +1 -0
- package/dist/infra/codex/types.d.ts.map +1 -1
- package/dist/infra/config/configNormalizers.d.ts.map +1 -1
- package/dist/infra/config/configNormalizers.js +9 -1
- package/dist/infra/config/configNormalizers.js.map +1 -1
- package/dist/infra/config/loaders/workflowDiscovery.js +1 -1
- package/dist/infra/config/loaders/workflowDiscovery.js.map +1 -1
- package/dist/infra/config/loaders/workflowLoopMonitorNormalizer.d.ts.map +1 -1
- package/dist/infra/config/loaders/workflowLoopMonitorNormalizer.js +1 -1
- package/dist/infra/config/loaders/workflowLoopMonitorNormalizer.js.map +1 -1
- package/dist/infra/config/loaders/workflowParser.d.ts.map +1 -1
- package/dist/infra/config/loaders/workflowParser.js +1 -1
- package/dist/infra/config/loaders/workflowParser.js.map +1 -1
- package/dist/infra/config/loaders/workflowProviderOptionsResolver.d.ts +7 -0
- package/dist/infra/config/loaders/workflowProviderOptionsResolver.d.ts.map +1 -0
- package/dist/infra/config/loaders/workflowProviderOptionsResolver.js +68 -0
- package/dist/infra/config/loaders/workflowProviderOptionsResolver.js.map +1 -0
- package/dist/infra/config/loaders/workflowStepFeaturesNormalizer.d.ts.map +1 -1
- package/dist/infra/config/loaders/workflowStepFeaturesNormalizer.js +5 -3
- package/dist/infra/config/loaders/workflowStepFeaturesNormalizer.js.map +1 -1
- package/dist/infra/config/loaders/workflowStepNormalizer.d.ts +1 -1
- package/dist/infra/config/loaders/workflowStepNormalizer.d.ts.map +1 -1
- package/dist/infra/config/loaders/workflowStepNormalizer.js +41 -10
- package/dist/infra/config/loaders/workflowStepNormalizer.js.map +1 -1
- package/dist/infra/config/providerOptions.d.ts +6 -1
- package/dist/infra/config/providerOptions.d.ts.map +1 -1
- package/dist/infra/config/providerOptions.js +31 -3
- package/dist/infra/config/providerOptions.js.map +1 -1
- package/dist/infra/config/providerOptionsContract.d.ts +3 -3
- package/dist/infra/config/providerOptionsContract.d.ts.map +1 -1
- package/dist/infra/config/providerOptionsContract.js +8 -0
- package/dist/infra/config/providerOptionsContract.js.map +1 -1
- package/dist/infra/copilot/client.d.ts.map +1 -1
- package/dist/infra/copilot/client.js +7 -8
- package/dist/infra/copilot/client.js.map +1 -1
- package/dist/infra/copilot/types.d.ts +1 -0
- package/dist/infra/copilot/types.d.ts.map +1 -1
- package/dist/infra/cursor/client.d.ts.map +1 -1
- package/dist/infra/cursor/client.js +7 -8
- package/dist/infra/cursor/client.js.map +1 -1
- package/dist/infra/cursor/types.d.ts +1 -0
- package/dist/infra/cursor/types.d.ts.map +1 -1
- package/dist/infra/kiro/client.d.ts.map +1 -1
- package/dist/infra/kiro/client.js +10 -0
- package/dist/infra/kiro/client.js.map +1 -1
- package/dist/infra/kiro/process.d.ts.map +1 -1
- package/dist/infra/kiro/process.js +4 -2
- package/dist/infra/kiro/process.js.map +1 -1
- package/dist/infra/kiro/types.d.ts +2 -0
- package/dist/infra/kiro/types.d.ts.map +1 -1
- package/dist/infra/observability/otelFoundation.d.ts.map +1 -1
- package/dist/infra/observability/otelFoundation.js +93 -20
- package/dist/infra/observability/otelFoundation.js.map +1 -1
- package/dist/infra/opencode/OpenCodeStreamHandler.d.ts +19 -0
- package/dist/infra/opencode/OpenCodeStreamHandler.d.ts.map +1 -1
- package/dist/infra/opencode/OpenCodeStreamHandler.js +10 -0
- package/dist/infra/opencode/OpenCodeStreamHandler.js.map +1 -1
- package/dist/infra/opencode/allowedTools.d.ts +2 -0
- package/dist/infra/opencode/allowedTools.d.ts.map +1 -0
- package/dist/infra/opencode/allowedTools.js +10 -0
- package/dist/infra/opencode/allowedTools.js.map +1 -0
- package/dist/infra/opencode/client.d.ts +4 -2
- package/dist/infra/opencode/client.d.ts.map +1 -1
- package/dist/infra/opencode/client.js +283 -124
- package/dist/infra/opencode/client.js.map +1 -1
- package/dist/infra/opencode/index.d.ts +1 -1
- package/dist/infra/opencode/index.d.ts.map +1 -1
- package/dist/infra/opencode/index.js +1 -1
- package/dist/infra/opencode/index.js.map +1 -1
- package/dist/infra/opencode/types.d.ts +12 -10
- package/dist/infra/opencode/types.d.ts.map +1 -1
- package/dist/infra/opencode/types.js +101 -36
- package/dist/infra/opencode/types.js.map +1 -1
- package/dist/infra/providers/allowed-tool-edit-policy.d.ts +3 -0
- package/dist/infra/providers/allowed-tool-edit-policy.d.ts.map +1 -0
- package/dist/infra/providers/allowed-tool-edit-policy.js +10 -0
- package/dist/infra/providers/allowed-tool-edit-policy.js.map +1 -0
- package/dist/infra/providers/claude-headless.d.ts +2 -0
- package/dist/infra/providers/claude-headless.d.ts.map +1 -1
- package/dist/infra/providers/claude-headless.js +8 -0
- package/dist/infra/providers/claude-headless.js.map +1 -1
- package/dist/infra/providers/claude-terminal.d.ts +2 -0
- package/dist/infra/providers/claude-terminal.d.ts.map +1 -1
- package/dist/infra/providers/claude-terminal.js +8 -0
- package/dist/infra/providers/claude-terminal.js.map +1 -1
- package/dist/infra/providers/claude.d.ts +2 -0
- package/dist/infra/providers/claude.d.ts.map +1 -1
- package/dist/infra/providers/claude.js +8 -0
- package/dist/infra/providers/claude.js.map +1 -1
- package/dist/infra/providers/codex.d.ts +2 -0
- package/dist/infra/providers/codex.d.ts.map +1 -1
- package/dist/infra/providers/codex.js +7 -0
- package/dist/infra/providers/codex.js.map +1 -1
- package/dist/infra/providers/copilot.d.ts +2 -0
- package/dist/infra/providers/copilot.d.ts.map +1 -1
- package/dist/infra/providers/copilot.js +7 -0
- package/dist/infra/providers/copilot.js.map +1 -1
- package/dist/infra/providers/cursor.d.ts +2 -0
- package/dist/infra/providers/cursor.d.ts.map +1 -1
- package/dist/infra/providers/cursor.js +7 -0
- package/dist/infra/providers/cursor.js.map +1 -1
- package/dist/infra/providers/kiro.d.ts +2 -0
- package/dist/infra/providers/kiro.d.ts.map +1 -1
- package/dist/infra/providers/kiro.js +8 -0
- package/dist/infra/providers/kiro.js.map +1 -1
- package/dist/infra/providers/mock.d.ts +2 -0
- package/dist/infra/providers/mock.d.ts.map +1 -1
- package/dist/infra/providers/mock.js +7 -0
- package/dist/infra/providers/mock.js.map +1 -1
- package/dist/infra/providers/opencode.d.ts +3 -1
- package/dist/infra/providers/opencode.d.ts.map +1 -1
- package/dist/infra/providers/opencode.js +16 -3
- package/dist/infra/providers/opencode.js.map +1 -1
- package/dist/infra/providers/provider-capabilities.d.ts +2 -0
- package/dist/infra/providers/provider-capabilities.d.ts.map +1 -1
- package/dist/infra/providers/provider-capabilities.js +13 -0
- package/dist/infra/providers/provider-capabilities.js.map +1 -1
- package/dist/infra/providers/runtimeSystemPrompt.d.ts +2 -0
- package/dist/infra/providers/runtimeSystemPrompt.d.ts.map +1 -0
- package/dist/infra/providers/runtimeSystemPrompt.js +11 -0
- package/dist/infra/providers/runtimeSystemPrompt.js.map +1 -0
- package/dist/infra/providers/types.d.ts +3 -0
- package/dist/infra/providers/types.d.ts.map +1 -1
- package/dist/infra/rate-limit/detection.d.ts +1 -1
- package/dist/infra/rate-limit/detection.d.ts.map +1 -1
- package/dist/infra/rate-limit/detection.js +6 -7
- package/dist/infra/rate-limit/detection.js.map +1 -1
- package/dist/infra/resources/schema-loader.d.ts +1 -1
- package/dist/infra/resources/schema-loader.d.ts.map +1 -1
- package/dist/infra/resources/schema-loader.js +8 -4
- package/dist/infra/resources/schema-loader.js.map +1 -1
- package/dist/infra/service/runSyncConflictResolver.d.ts.map +1 -1
- package/dist/infra/service/runSyncConflictResolver.js +3 -1
- package/dist/infra/service/runSyncConflictResolver.js.map +1 -1
- package/dist/infra/task/summarize.d.ts.map +1 -1
- package/dist/infra/task/summarize.js +3 -1
- package/dist/infra/task/summarize.js.map +1 -1
- package/dist/shared/constants.d.ts +2 -0
- package/dist/shared/constants.d.ts.map +1 -1
- package/dist/shared/constants.js +2 -0
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/prompts/en/perform_agent_system_prompt.md +9 -1
- package/dist/shared/prompts/en/provider_runtime_system_prompt.md +18 -0
- package/dist/shared/prompts/index.d.ts +1 -1
- package/dist/shared/prompts/index.d.ts.map +1 -1
- package/dist/shared/prompts/index.js +7 -1
- package/dist/shared/prompts/index.js.map +1 -1
- package/dist/shared/prompts/ja/perform_agent_system_prompt.md +9 -1
- package/dist/shared/prompts/ja/provider_runtime_system_prompt.md +18 -0
- package/dist/shared/telemetry/childProcessEnv.d.ts +7 -0
- package/dist/shared/telemetry/childProcessEnv.d.ts.map +1 -0
- package/dist/shared/telemetry/childProcessEnv.js +176 -0
- package/dist/shared/telemetry/childProcessEnv.js.map +1 -0
- package/dist/shared/telemetry/index.d.ts +3 -0
- package/dist/shared/telemetry/index.d.ts.map +1 -0
- package/dist/shared/telemetry/index.js +3 -0
- package/dist/shared/telemetry/index.js.map +1 -0
- package/dist/shared/telemetry/otlp.d.ts +40 -0
- package/dist/shared/telemetry/otlp.d.ts.map +1 -0
- package/dist/shared/telemetry/otlp.js +72 -0
- package/dist/shared/telemetry/otlp.js.map +1 -0
- package/dist/shared/types/provider.d.ts +25 -0
- package/dist/shared/types/provider.d.ts.map +1 -1
- package/dist/shared/ui/StreamDisplay.d.ts.map +1 -1
- package/dist/shared/ui/StreamDisplay.js +1 -0
- package/dist/shared/ui/StreamDisplay.js.map +1 -1
- package/package.json +5 -2
- package/builtins/en/facets/instructions/review-requirements.md +0 -17
- package/builtins/en/facets/output-contracts/requirements-review.md +0 -56
- package/builtins/en/facets/personas/requirements-reviewer.md +0 -33
- package/builtins/ja/facets/instructions/review-requirements.md +0 -17
- package/builtins/ja/facets/output-contracts/requirements-review.md +0 -56
- package/builtins/ja/facets/personas/requirements-reviewer.md +0 -33
|
@@ -7,10 +7,11 @@
|
|
|
7
7
|
import { createOpencode } from '@opencode-ai/sdk/v2';
|
|
8
8
|
import { createServer } from 'node:net';
|
|
9
9
|
import { AskUserQuestionDeniedError } from '../../core/workflow/ask-user-question-error.js';
|
|
10
|
-
import { createLogger, getErrorMessage, createStreamDiagnostics
|
|
10
|
+
import { createLogger, getErrorMessage, createStreamDiagnostics } from '../../shared/utils/index.js';
|
|
11
|
+
import { getNestedObservabilityEnvFingerprint, runWithNestedObservabilityProcessEnv, } from '../../shared/telemetry/index.js';
|
|
11
12
|
import { parseProviderModel } from '../../shared/utils/providerModel.js';
|
|
12
|
-
import { buildOpenCodePermissionRuleset,
|
|
13
|
-
import { createStreamTrackingState, emitInit, emitText, emitResult, handlePartUpdated, } from './OpenCodeStreamHandler.js';
|
|
13
|
+
import { buildOpenCodePermissionRuleset, resolveOpenCodePermissionReply, } from './types.js';
|
|
14
|
+
import { createStreamTrackingState, emitInit, emitText, emitPermissionAsked, emitPermissionSummary, emitResult, handlePartUpdated, } from './OpenCodeStreamHandler.js';
|
|
14
15
|
import { buildRateLimitedResponseFields, containsRateLimitError } from '../rate-limit/detection.js';
|
|
15
16
|
const log = createLogger('opencode-sdk');
|
|
16
17
|
const OPENCODE_STREAM_IDLE_TIMEOUT_MS = 10 * 60 * 1000;
|
|
@@ -31,60 +32,132 @@ const OPENCODE_RETRYABLE_ERROR_PATTERNS = [
|
|
|
31
32
|
'failed to start server on port',
|
|
32
33
|
'timeout waiting for server',
|
|
33
34
|
];
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
const sharedServers = new Map();
|
|
36
|
+
async function acquireClient(model, apiKey, childProcessEnv, abortSignal) {
|
|
37
|
+
throwIfAborted(abortSignal);
|
|
38
|
+
const key = buildSharedServerKey(model, apiKey, childProcessEnv);
|
|
39
|
+
const entry = getSharedServerEntry(key);
|
|
40
|
+
if (entry.initPromise) {
|
|
41
|
+
const server = await entry.initPromise;
|
|
42
|
+
throwIfAborted(abortSignal);
|
|
43
|
+
return acquireSharedServer(server, abortSignal);
|
|
39
44
|
}
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
45
|
+
if (entry.server) {
|
|
46
|
+
return acquireSharedServer(entry.server, abortSignal);
|
|
47
|
+
}
|
|
48
|
+
entry.initPromise = createSharedServer(model, apiKey, childProcessEnv)
|
|
49
|
+
.then((server) => {
|
|
50
|
+
entry.server = server;
|
|
51
|
+
return server;
|
|
52
|
+
})
|
|
53
|
+
.finally(() => {
|
|
54
|
+
entry.initPromise = undefined;
|
|
55
|
+
});
|
|
56
|
+
const server = await entry.initPromise;
|
|
57
|
+
throwIfAborted(abortSignal);
|
|
58
|
+
return acquireSharedServer(server, abortSignal);
|
|
59
|
+
}
|
|
60
|
+
function buildSharedServerKey(model, apiKey, childProcessEnv) {
|
|
61
|
+
return JSON.stringify([model, apiKey, getNestedObservabilityEnvFingerprint(childProcessEnv)]);
|
|
62
|
+
}
|
|
63
|
+
function getSharedServerEntry(key) {
|
|
64
|
+
const existing = sharedServers.get(key);
|
|
65
|
+
if (existing) {
|
|
66
|
+
return existing;
|
|
67
|
+
}
|
|
68
|
+
const entry = {};
|
|
69
|
+
sharedServers.set(key, entry);
|
|
70
|
+
return entry;
|
|
71
|
+
}
|
|
72
|
+
async function createSharedServer(model, apiKey, childProcessEnv) {
|
|
73
|
+
const port = await getFreePort();
|
|
74
|
+
const { client, server } = await runWithNestedObservabilityProcessEnv(childProcessEnv, () => createOpencode({
|
|
75
|
+
port,
|
|
76
|
+
config: {
|
|
77
|
+
model,
|
|
78
|
+
small_model: model,
|
|
79
|
+
...(apiKey ? { provider: { opencode: { options: { apiKey } } } } : {}),
|
|
80
|
+
},
|
|
81
|
+
timeout: OPENCODE_SERVER_START_TIMEOUT_MS,
|
|
82
|
+
}));
|
|
83
|
+
const closeServer = () => {
|
|
84
|
+
try {
|
|
85
|
+
server.close();
|
|
43
86
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
log.debug(`Failed to close OpenCode server: ${getErrorMessage(error)}`, { model });
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
log.debug('OpenCode server started', { model, port });
|
|
92
|
+
return { client, close: closeServer, model, apiKey, busy: false, queue: [] };
|
|
93
|
+
}
|
|
94
|
+
function acquireSharedServer(server, abortSignal) {
|
|
95
|
+
throwIfAborted(abortSignal);
|
|
96
|
+
if (!server.busy) {
|
|
97
|
+
server.busy = true;
|
|
98
|
+
return { client: server.client, release: createReleaseHandle(server) };
|
|
47
99
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
100
|
+
return new Promise((resolve, reject) => {
|
|
101
|
+
const entry = { resolve, reject, signal: abortSignal };
|
|
102
|
+
if (abortSignal) {
|
|
103
|
+
entry.onAbort = () => {
|
|
104
|
+
removeQueuedClient(server, entry);
|
|
105
|
+
reject(new Error(OPENCODE_STREAM_ABORTED_MESSAGE));
|
|
106
|
+
};
|
|
107
|
+
abortSignal.addEventListener('abort', entry.onAbort, { once: true });
|
|
108
|
+
}
|
|
109
|
+
server.queue.push(entry);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export async function getOpenCodeSessionSnapshot(model, sessionID, directory, apiKey) {
|
|
113
|
+
const { client, release } = await acquireClient(model, apiKey, undefined);
|
|
51
114
|
try {
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
small_model: model,
|
|
58
|
-
...(apiKey ? { provider: { opencode: { options: { apiKey } } } } : {}),
|
|
59
|
-
},
|
|
60
|
-
timeout: OPENCODE_SERVER_START_TIMEOUT_MS,
|
|
61
|
-
});
|
|
62
|
-
const closeServer = () => {
|
|
63
|
-
try {
|
|
64
|
-
server.close();
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
// Ignore close errors
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
sharedServer = { client, close: closeServer, model, apiKey, queue: [] };
|
|
71
|
-
log.debug('OpenCode server started', { model, port });
|
|
72
|
-
return { client, release: () => releaseClient() };
|
|
115
|
+
const result = await client.session.get({ sessionID, directory });
|
|
116
|
+
if (!result.data) {
|
|
117
|
+
throw new Error(`OpenCode session not found: ${sessionID}`);
|
|
118
|
+
}
|
|
119
|
+
return result.data;
|
|
73
120
|
}
|
|
74
121
|
finally {
|
|
75
|
-
|
|
76
|
-
resolveInit();
|
|
122
|
+
release();
|
|
77
123
|
}
|
|
78
124
|
}
|
|
79
|
-
function releaseClient() {
|
|
80
|
-
|
|
125
|
+
function releaseClient(server) {
|
|
126
|
+
const next = server.queue.shift();
|
|
127
|
+
if (next) {
|
|
128
|
+
if (next.signal && next.onAbort) {
|
|
129
|
+
next.signal.removeEventListener('abort', next.onAbort);
|
|
130
|
+
}
|
|
131
|
+
next.resolve({ client: server.client, release: createReleaseHandle(server) });
|
|
81
132
|
return;
|
|
82
|
-
|
|
83
|
-
|
|
133
|
+
}
|
|
134
|
+
server.busy = false;
|
|
135
|
+
}
|
|
136
|
+
function removeQueuedClient(server, entry) {
|
|
137
|
+
server.queue = server.queue.filter((queued) => queued !== entry);
|
|
138
|
+
if (entry.signal && entry.onAbort) {
|
|
139
|
+
entry.signal.removeEventListener('abort', entry.onAbort);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function throwIfAborted(signal) {
|
|
143
|
+
if (signal?.aborted) {
|
|
144
|
+
throw new Error(OPENCODE_STREAM_ABORTED_MESSAGE);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
function createReleaseHandle(server) {
|
|
148
|
+
let released = false;
|
|
149
|
+
return () => {
|
|
150
|
+
if (released)
|
|
151
|
+
return;
|
|
152
|
+
released = true;
|
|
153
|
+
releaseClient(server);
|
|
154
|
+
};
|
|
84
155
|
}
|
|
85
156
|
export function resetSharedServer() {
|
|
86
|
-
|
|
87
|
-
|
|
157
|
+
for (const entry of sharedServers.values()) {
|
|
158
|
+
entry.server?.close();
|
|
159
|
+
}
|
|
160
|
+
sharedServers.clear();
|
|
88
161
|
}
|
|
89
162
|
async function withTimeout(operation, timeoutMs, timeoutErrorMessage) {
|
|
90
163
|
const controller = new AbortController();
|
|
@@ -123,25 +196,33 @@ function extractOpenCodeErrorMessage(error) {
|
|
|
123
196
|
}
|
|
124
197
|
return undefined;
|
|
125
198
|
}
|
|
126
|
-
function getCommonPrefixLength(a, b) {
|
|
127
|
-
const max = Math.min(a.length, b.length);
|
|
128
|
-
let i = 0;
|
|
129
|
-
while (i < max && a[i] === b[i]) {
|
|
130
|
-
i += 1;
|
|
131
|
-
}
|
|
132
|
-
return i;
|
|
133
|
-
}
|
|
134
199
|
function stripPromptEcho(chunk, echoState) {
|
|
135
200
|
if (!chunk)
|
|
136
201
|
return '';
|
|
137
|
-
if (
|
|
202
|
+
if (echoState.remainingPrompts.length === 0)
|
|
138
203
|
return chunk;
|
|
139
|
-
const
|
|
140
|
-
if (
|
|
141
|
-
echoState.
|
|
142
|
-
return chunk
|
|
204
|
+
const matchingPrompts = echoState.remainingPrompts.filter((remainingPrompt) => (remainingPrompt.startsWith(chunk) || chunk.startsWith(remainingPrompt)));
|
|
205
|
+
if (matchingPrompts.length === 0) {
|
|
206
|
+
echoState.remainingPrompts = [];
|
|
207
|
+
return chunk;
|
|
208
|
+
}
|
|
209
|
+
const consumedPrompt = matchingPrompts
|
|
210
|
+
.filter((remainingPrompt) => chunk.startsWith(remainingPrompt))
|
|
211
|
+
.sort((a, b) => b.length - a.length)[0];
|
|
212
|
+
if (consumedPrompt !== undefined) {
|
|
213
|
+
const visible = chunk.slice(consumedPrompt.length);
|
|
214
|
+
echoState.remainingPrompts = [];
|
|
215
|
+
return visible;
|
|
216
|
+
}
|
|
217
|
+
echoState.remainingPrompts = matchingPrompts.map((remainingPrompt) => (remainingPrompt.slice(chunk.length)));
|
|
218
|
+
return '';
|
|
219
|
+
}
|
|
220
|
+
function buildPromptEchoCandidates(prompt, systemPrompt) {
|
|
221
|
+
const prompts = [prompt];
|
|
222
|
+
if (systemPrompt !== undefined && systemPrompt.length > 0) {
|
|
223
|
+
prompts.unshift(`${systemPrompt}\n\n${prompt}`);
|
|
143
224
|
}
|
|
144
|
-
return
|
|
225
|
+
return Array.from(new Set(prompts)).filter((candidate) => candidate.length > 0);
|
|
145
226
|
}
|
|
146
227
|
function toQuestionInput(props) {
|
|
147
228
|
return {
|
|
@@ -165,6 +246,12 @@ function toQuestionAnswers(props, answers) {
|
|
|
165
246
|
return [value];
|
|
166
247
|
});
|
|
167
248
|
}
|
|
249
|
+
function buildPermissionRejectedMessage(permission) {
|
|
250
|
+
if (permission && permission.length > 0) {
|
|
251
|
+
return `OpenCode permission rejected: ${permission}`;
|
|
252
|
+
}
|
|
253
|
+
return 'OpenCode permission rejected';
|
|
254
|
+
}
|
|
168
255
|
async function getFreePort() {
|
|
169
256
|
return new Promise((resolve, reject) => {
|
|
170
257
|
const server = createServer();
|
|
@@ -198,6 +285,10 @@ export class OpenCodeClient {
|
|
|
198
285
|
if (abortCause === 'timeout') {
|
|
199
286
|
return true;
|
|
200
287
|
}
|
|
288
|
+
if (abortCause === 'prompt') {
|
|
289
|
+
const lower = message.toLowerCase();
|
|
290
|
+
return OPENCODE_RETRYABLE_ERROR_PATTERNS.some((pattern) => lower.includes(pattern));
|
|
291
|
+
}
|
|
201
292
|
if (aborted || abortCause) {
|
|
202
293
|
return false;
|
|
203
294
|
}
|
|
@@ -229,17 +320,6 @@ export class OpenCodeClient {
|
|
|
229
320
|
}
|
|
230
321
|
});
|
|
231
322
|
}
|
|
232
|
-
/** Build a prompt suffix that instructs the agent to return JSON matching the schema */
|
|
233
|
-
buildStructuredOutputSuffix(schema) {
|
|
234
|
-
return [
|
|
235
|
-
'',
|
|
236
|
-
'---',
|
|
237
|
-
'IMPORTANT: You MUST respond with ONLY a valid JSON object matching this schema. No other text, no markdown code blocks, no explanation.',
|
|
238
|
-
'```',
|
|
239
|
-
JSON.stringify(schema, null, 2),
|
|
240
|
-
'```',
|
|
241
|
-
].join('\n');
|
|
242
|
-
}
|
|
243
323
|
buildRateLimitedResponse(agentType, sessionId, message) {
|
|
244
324
|
return {
|
|
245
325
|
persona: agentType,
|
|
@@ -250,14 +330,6 @@ export class OpenCodeClient {
|
|
|
250
330
|
}
|
|
251
331
|
/** Call OpenCode with an agent prompt */
|
|
252
332
|
async call(agentType, prompt, options) {
|
|
253
|
-
const basePrompt = options.systemPrompt
|
|
254
|
-
? `${options.systemPrompt}\n\n${prompt}`
|
|
255
|
-
: prompt;
|
|
256
|
-
// OpenCode SDK does not natively support structured output via outputFormat.
|
|
257
|
-
// Inject JSON output instructions into the prompt to make the agent return JSON.
|
|
258
|
-
const fullPrompt = options.outputSchema
|
|
259
|
-
? `${basePrompt}${this.buildStructuredOutputSuffix(options.outputSchema)}`
|
|
260
|
-
: basePrompt;
|
|
261
333
|
for (let attempt = 1; attempt <= OPENCODE_RETRY_MAX_ATTEMPTS; attempt++) {
|
|
262
334
|
let idleTimeoutId;
|
|
263
335
|
const streamAbortController = new AbortController();
|
|
@@ -267,7 +339,38 @@ export class OpenCodeClient {
|
|
|
267
339
|
let release;
|
|
268
340
|
let opencodeApiClient;
|
|
269
341
|
let sessionId = options.sessionId;
|
|
342
|
+
let promptCompletion;
|
|
343
|
+
let promptCompletionWait;
|
|
344
|
+
let promptError;
|
|
270
345
|
const interactionTimeoutMs = options.interactionTimeoutMs ?? OPENCODE_INTERACTION_TIMEOUT_MS;
|
|
346
|
+
const promptCompletionTimeoutMessage = 'OpenCode prompt completion timed out';
|
|
347
|
+
const awaitPromptCompletion = () => {
|
|
348
|
+
if (!promptCompletion) {
|
|
349
|
+
return Promise.resolve();
|
|
350
|
+
}
|
|
351
|
+
promptCompletionWait ??= (async () => {
|
|
352
|
+
let timeoutId;
|
|
353
|
+
try {
|
|
354
|
+
await Promise.race([
|
|
355
|
+
promptCompletion,
|
|
356
|
+
new Promise((_, reject) => {
|
|
357
|
+
timeoutId = setTimeout(() => {
|
|
358
|
+
reject(new Error(promptCompletionTimeoutMessage));
|
|
359
|
+
}, interactionTimeoutMs);
|
|
360
|
+
}),
|
|
361
|
+
]);
|
|
362
|
+
}
|
|
363
|
+
catch (error) {
|
|
364
|
+
promptError ??= getErrorMessage(error);
|
|
365
|
+
}
|
|
366
|
+
finally {
|
|
367
|
+
if (timeoutId !== undefined) {
|
|
368
|
+
clearTimeout(timeoutId);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
})();
|
|
372
|
+
return promptCompletionWait;
|
|
373
|
+
};
|
|
271
374
|
const resetIdleTimeout = () => {
|
|
272
375
|
if (idleTimeoutId !== undefined) {
|
|
273
376
|
clearTimeout(idleTimeoutId);
|
|
@@ -284,6 +387,7 @@ export class OpenCodeClient {
|
|
|
284
387
|
};
|
|
285
388
|
if (options.abortSignal) {
|
|
286
389
|
if (options.abortSignal.aborted) {
|
|
390
|
+
abortCause = 'external';
|
|
287
391
|
streamAbortController.abort();
|
|
288
392
|
}
|
|
289
393
|
else {
|
|
@@ -301,48 +405,78 @@ export class OpenCodeClient {
|
|
|
301
405
|
diagRef = diag;
|
|
302
406
|
const parsedModel = parseProviderModel(options.model, 'OpenCode model');
|
|
303
407
|
const fullModel = `${parsedModel.providerID}/${parsedModel.modelID}`;
|
|
304
|
-
const acquired = await acquireClient(fullModel, options.opencodeApiKey);
|
|
408
|
+
const acquired = await acquireClient(fullModel, options.opencodeApiKey, options.childProcessEnv, options.abortSignal);
|
|
305
409
|
opencodeApiClient = acquired.client;
|
|
306
410
|
release = acquired.release;
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
411
|
+
if (streamAbortController.signal.aborted) {
|
|
412
|
+
release();
|
|
413
|
+
release = undefined;
|
|
414
|
+
throw new Error(OPENCODE_STREAM_ABORTED_MESSAGE);
|
|
415
|
+
}
|
|
416
|
+
const permissionRuleset = buildOpenCodePermissionRuleset(options.permissionMode, options.networkAccess, options.allowedTools);
|
|
417
|
+
const shouldCreateSession = sessionId === undefined || options.allowedTools !== undefined;
|
|
418
|
+
const appliedPermissionRuleset = shouldCreateSession;
|
|
419
|
+
if (sessionId === undefined) {
|
|
420
|
+
const sessionResult = await opencodeApiClient.session.create({
|
|
310
421
|
directory: options.cwd,
|
|
311
|
-
permission:
|
|
422
|
+
permission: permissionRuleset,
|
|
312
423
|
});
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
424
|
+
sessionId = sessionResult.data?.id;
|
|
425
|
+
if (!sessionId) {
|
|
426
|
+
throw new Error('Failed to create OpenCode session');
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
else if (options.allowedTools !== undefined) {
|
|
430
|
+
const sessionResult = await opencodeApiClient.session.create({
|
|
431
|
+
directory: options.cwd,
|
|
432
|
+
parentID: sessionId,
|
|
433
|
+
permission: permissionRuleset,
|
|
434
|
+
});
|
|
435
|
+
sessionId = sessionResult.data?.id;
|
|
436
|
+
if (!sessionId) {
|
|
437
|
+
throw new Error('Failed to create OpenCode session');
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
const activeSessionId = sessionId;
|
|
441
|
+
if (activeSessionId === undefined) {
|
|
442
|
+
throw new Error('OpenCode session ID is required');
|
|
317
443
|
}
|
|
318
444
|
const { stream } = await opencodeApiClient.event.subscribe({ directory: options.cwd }, { signal: streamAbortController.signal });
|
|
319
445
|
resetIdleTimeout();
|
|
320
446
|
diag.onConnected();
|
|
321
|
-
|
|
447
|
+
if (appliedPermissionRuleset) {
|
|
448
|
+
emitPermissionSummary(options.onStream, {
|
|
449
|
+
sessionId: activeSessionId,
|
|
450
|
+
...(options.permissionMode !== undefined ? { permissionMode: options.permissionMode } : {}),
|
|
451
|
+
...(options.allowedTools !== undefined ? { allowedTools: options.allowedTools } : {}),
|
|
452
|
+
...(options.networkAccess !== undefined ? { networkAccess: options.networkAccess } : {}),
|
|
453
|
+
resolvedPermissions: permissionRuleset,
|
|
454
|
+
});
|
|
455
|
+
}
|
|
322
456
|
const promptPayload = {
|
|
323
|
-
sessionID:
|
|
457
|
+
sessionID: activeSessionId,
|
|
324
458
|
directory: options.cwd,
|
|
325
459
|
model: parsedModel,
|
|
326
460
|
...(options.variant !== undefined ? { variant: options.variant } : {}),
|
|
327
|
-
...(
|
|
328
|
-
parts: [{ type: 'text', text:
|
|
461
|
+
...(options.systemPrompt !== undefined ? { system: options.systemPrompt } : {}),
|
|
462
|
+
parts: [{ type: 'text', text: prompt }],
|
|
329
463
|
};
|
|
330
|
-
if (options.outputSchema) {
|
|
331
|
-
promptPayload.outputFormat = {
|
|
332
|
-
type: 'json_schema',
|
|
333
|
-
schema: options.outputSchema,
|
|
334
|
-
};
|
|
335
|
-
}
|
|
336
464
|
const promptPayloadForSdk = promptPayload;
|
|
337
|
-
|
|
465
|
+
promptCompletion = opencodeApiClient.session.promptAsync(promptPayloadForSdk, {
|
|
338
466
|
signal: streamAbortController.signal,
|
|
467
|
+
}).catch((error) => {
|
|
468
|
+
promptError = getErrorMessage(error);
|
|
469
|
+
if (!streamAbortController.signal.aborted) {
|
|
470
|
+
abortCause = 'prompt';
|
|
471
|
+
streamAbortController.abort();
|
|
472
|
+
}
|
|
339
473
|
});
|
|
340
|
-
emitInit(options.onStream, options.model,
|
|
474
|
+
emitInit(options.onStream, options.model, activeSessionId);
|
|
341
475
|
let content = '';
|
|
342
476
|
let success = true;
|
|
343
477
|
let failureMessage = '';
|
|
344
478
|
const state = createStreamTrackingState();
|
|
345
|
-
const echoState = {
|
|
479
|
+
const echoState = { remainingPrompts: buildPromptEchoCandidates(prompt, options.systemPrompt) };
|
|
346
480
|
const textOffsets = new Map();
|
|
347
481
|
const textContentParts = new Map();
|
|
348
482
|
// Consume a raw text delta for a part: strip the prompt echo, stream the
|
|
@@ -393,16 +527,27 @@ export class OpenCodeClient {
|
|
|
393
527
|
}
|
|
394
528
|
if (sseEvent.type === 'permission.asked') {
|
|
395
529
|
const permProps = sseEvent.properties;
|
|
396
|
-
if (permProps.sessionID ===
|
|
530
|
+
if (permProps.sessionID === activeSessionId) {
|
|
397
531
|
try {
|
|
398
|
-
const reply = options.permissionMode
|
|
399
|
-
|
|
400
|
-
:
|
|
532
|
+
const reply = resolveOpenCodePermissionReply(options.permissionMode, permProps.permission, options.allowedTools !== undefined ? permissionRuleset : undefined);
|
|
533
|
+
emitPermissionAsked(options.onStream, {
|
|
534
|
+
requestId: permProps.id,
|
|
535
|
+
sessionId: permProps.sessionID,
|
|
536
|
+
permission: permProps.permission ?? '',
|
|
537
|
+
patterns: Array.isArray(permProps.patterns) ? permProps.patterns : [],
|
|
538
|
+
always: Array.isArray(permProps.always) ? permProps.always : [],
|
|
539
|
+
reply,
|
|
540
|
+
});
|
|
401
541
|
await withTimeout((signal) => opencodeApiClient.permission.reply({
|
|
402
542
|
requestID: permProps.id,
|
|
403
543
|
directory: options.cwd,
|
|
404
544
|
reply,
|
|
405
545
|
}, { signal }), interactionTimeoutMs, 'OpenCode permission reply timed out');
|
|
546
|
+
if (reply === 'reject') {
|
|
547
|
+
success = false;
|
|
548
|
+
failureMessage = buildPermissionRejectedMessage(permProps.permission);
|
|
549
|
+
break;
|
|
550
|
+
}
|
|
406
551
|
}
|
|
407
552
|
catch (e) {
|
|
408
553
|
success = false;
|
|
@@ -414,7 +559,7 @@ export class OpenCodeClient {
|
|
|
414
559
|
}
|
|
415
560
|
if (sseEvent.type === 'question.asked') {
|
|
416
561
|
const questionProps = sseEvent.properties;
|
|
417
|
-
if (questionProps.sessionID ===
|
|
562
|
+
if (questionProps.sessionID === activeSessionId) {
|
|
418
563
|
const rejectQuestion = () => withTimeout((signal) => opencodeApiClient.question.reject({
|
|
419
564
|
requestID: questionProps.id,
|
|
420
565
|
directory: options.cwd,
|
|
@@ -461,7 +606,7 @@ export class OpenCodeClient {
|
|
|
461
606
|
if (sseEvent.type === 'message.updated') {
|
|
462
607
|
const messageProps = sseEvent.properties;
|
|
463
608
|
const info = messageProps.info;
|
|
464
|
-
const isCurrentAssistantMessage = info?.sessionID ===
|
|
609
|
+
const isCurrentAssistantMessage = info?.sessionID === activeSessionId && info?.role === 'assistant';
|
|
465
610
|
if (isCurrentAssistantMessage) {
|
|
466
611
|
const streamError = extractOpenCodeErrorMessage(info?.error);
|
|
467
612
|
if (streamError) {
|
|
@@ -476,7 +621,7 @@ export class OpenCodeClient {
|
|
|
476
621
|
if (sseEvent.type === 'message.completed') {
|
|
477
622
|
const completedProps = sseEvent.properties;
|
|
478
623
|
const info = completedProps.info;
|
|
479
|
-
const isCurrentAssistantMessage = info?.sessionID ===
|
|
624
|
+
const isCurrentAssistantMessage = info?.sessionID === activeSessionId && info?.role === 'assistant';
|
|
480
625
|
if (isCurrentAssistantMessage) {
|
|
481
626
|
const streamError = extractOpenCodeErrorMessage(info?.error);
|
|
482
627
|
if (streamError) {
|
|
@@ -491,7 +636,7 @@ export class OpenCodeClient {
|
|
|
491
636
|
if (sseEvent.type === 'message.failed') {
|
|
492
637
|
const failedProps = sseEvent.properties;
|
|
493
638
|
const info = failedProps.info;
|
|
494
|
-
const isCurrentAssistantMessage = info?.sessionID ===
|
|
639
|
+
const isCurrentAssistantMessage = info?.sessionID === activeSessionId && info?.role === 'assistant';
|
|
495
640
|
if (isCurrentAssistantMessage) {
|
|
496
641
|
success = false;
|
|
497
642
|
failureMessage = extractOpenCodeErrorMessage(info?.error) ?? 'OpenCode message failed';
|
|
@@ -502,23 +647,23 @@ export class OpenCodeClient {
|
|
|
502
647
|
}
|
|
503
648
|
if (sseEvent.type === 'session.status') {
|
|
504
649
|
const statusProps = sseEvent.properties;
|
|
505
|
-
if (statusProps.sessionID ===
|
|
650
|
+
if (statusProps.sessionID === activeSessionId && statusProps.status?.type === 'idle') {
|
|
506
651
|
break;
|
|
507
652
|
}
|
|
508
653
|
continue;
|
|
509
654
|
}
|
|
510
655
|
if (sseEvent.type === 'session.idle') {
|
|
511
656
|
const idleProps = sseEvent.properties;
|
|
512
|
-
if (idleProps.sessionID ===
|
|
657
|
+
if (idleProps.sessionID === activeSessionId) {
|
|
513
658
|
break;
|
|
514
659
|
}
|
|
515
660
|
continue;
|
|
516
661
|
}
|
|
517
662
|
if (sseEvent.type === 'session.error') {
|
|
518
663
|
const errorProps = sseEvent.properties;
|
|
519
|
-
if (!errorProps.sessionID || errorProps.sessionID ===
|
|
664
|
+
if (!errorProps.sessionID || errorProps.sessionID === activeSessionId) {
|
|
520
665
|
success = false;
|
|
521
|
-
failureMessage = errorProps.error
|
|
666
|
+
failureMessage = extractOpenCodeErrorMessage(errorProps.error) ?? 'OpenCode session error';
|
|
522
667
|
diag.onStreamError('session.error', failureMessage);
|
|
523
668
|
break;
|
|
524
669
|
}
|
|
@@ -526,12 +671,25 @@ export class OpenCodeClient {
|
|
|
526
671
|
}
|
|
527
672
|
}
|
|
528
673
|
content = [...textContentParts.values()].join('\n');
|
|
674
|
+
if (!success && !streamAbortController.signal.aborted) {
|
|
675
|
+
streamAbortController.abort();
|
|
676
|
+
}
|
|
677
|
+
await awaitPromptCompletion();
|
|
678
|
+
if (promptError !== undefined) {
|
|
679
|
+
if (success) {
|
|
680
|
+
success = false;
|
|
681
|
+
failureMessage = promptError;
|
|
682
|
+
}
|
|
683
|
+
else if (!failureMessage) {
|
|
684
|
+
failureMessage = promptError;
|
|
685
|
+
}
|
|
686
|
+
}
|
|
529
687
|
diag.onCompleted(success ? 'normal' : 'error', success ? undefined : failureMessage);
|
|
530
688
|
if (!success) {
|
|
531
689
|
const message = failureMessage || 'OpenCode execution failed';
|
|
532
690
|
if (containsRateLimitError(message)) {
|
|
533
|
-
const rateLimitedResponse = this.buildRateLimitedResponse(agentType,
|
|
534
|
-
emitResult(options.onStream, false, rateLimitedResponse.error ?? rateLimitedResponse.content,
|
|
691
|
+
const rateLimitedResponse = this.buildRateLimitedResponse(agentType, activeSessionId, message);
|
|
692
|
+
emitResult(options.onStream, false, rateLimitedResponse.error ?? rateLimitedResponse.content, activeSessionId);
|
|
535
693
|
return rateLimitedResponse;
|
|
536
694
|
}
|
|
537
695
|
const retriable = this.isRetriableError(message, streamAbortController.signal.aborted, abortCause);
|
|
@@ -540,25 +698,23 @@ export class OpenCodeClient {
|
|
|
540
698
|
await this.waitForRetryDelay(attempt, options.abortSignal);
|
|
541
699
|
continue;
|
|
542
700
|
}
|
|
543
|
-
emitResult(options.onStream, false, message,
|
|
701
|
+
emitResult(options.onStream, false, message, activeSessionId);
|
|
544
702
|
return {
|
|
545
703
|
persona: agentType,
|
|
546
704
|
status: 'error',
|
|
547
705
|
content: message,
|
|
548
706
|
timestamp: new Date(),
|
|
549
|
-
sessionId,
|
|
707
|
+
sessionId: activeSessionId,
|
|
550
708
|
};
|
|
551
709
|
}
|
|
552
710
|
const trimmed = content.trim();
|
|
553
|
-
|
|
554
|
-
emitResult(options.onStream, true, trimmed, sessionId);
|
|
711
|
+
emitResult(options.onStream, true, trimmed, activeSessionId);
|
|
555
712
|
return {
|
|
556
713
|
persona: agentType,
|
|
557
714
|
status: 'done',
|
|
558
715
|
content: trimmed,
|
|
559
716
|
timestamp: new Date(),
|
|
560
|
-
sessionId,
|
|
561
|
-
structuredOutput,
|
|
717
|
+
sessionId: activeSessionId,
|
|
562
718
|
};
|
|
563
719
|
}
|
|
564
720
|
catch (error) {
|
|
@@ -566,7 +722,9 @@ export class OpenCodeClient {
|
|
|
566
722
|
const errorMessage = streamAbortController.signal.aborted
|
|
567
723
|
? abortCause === 'timeout'
|
|
568
724
|
? timeoutMessage
|
|
569
|
-
:
|
|
725
|
+
: abortCause === 'prompt' && promptError !== undefined
|
|
726
|
+
? promptError
|
|
727
|
+
: OPENCODE_STREAM_ABORTED_MESSAGE
|
|
570
728
|
: message;
|
|
571
729
|
if (containsRateLimitError(errorMessage)) {
|
|
572
730
|
const rateLimitedResponse = this.buildRateLimitedResponse(agentType, sessionId, errorMessage);
|
|
@@ -575,7 +733,7 @@ export class OpenCodeClient {
|
|
|
575
733
|
}
|
|
576
734
|
return rateLimitedResponse;
|
|
577
735
|
}
|
|
578
|
-
diagRef?.onCompleted(abortCause === 'timeout' ? 'timeout' : streamAbortController.signal.aborted ? 'abort' : 'error', errorMessage);
|
|
736
|
+
diagRef?.onCompleted(abortCause === 'timeout' ? 'timeout' : streamAbortController.signal.aborted && abortCause !== 'prompt' ? 'abort' : 'error', errorMessage);
|
|
579
737
|
const retriable = this.isRetriableError(errorMessage, streamAbortController.signal.aborted, abortCause);
|
|
580
738
|
if (retriable && attempt < OPENCODE_RETRY_MAX_ATTEMPTS) {
|
|
581
739
|
log.info('Retrying OpenCode call after transient exception', { agentType, attempt, errorMessage });
|
|
@@ -600,10 +758,11 @@ export class OpenCodeClient {
|
|
|
600
758
|
if (options.abortSignal) {
|
|
601
759
|
options.abortSignal.removeEventListener('abort', onExternalAbort);
|
|
602
760
|
}
|
|
603
|
-
release?.();
|
|
604
761
|
if (!streamAbortController.signal.aborted) {
|
|
605
762
|
streamAbortController.abort();
|
|
606
763
|
}
|
|
764
|
+
await awaitPromptCompletion();
|
|
765
|
+
release?.();
|
|
607
766
|
}
|
|
608
767
|
}
|
|
609
768
|
throw new Error('Unreachable: OpenCode retry loop exhausted without returning');
|