takt 0.49.0 → 0.50.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.
Files changed (674) hide show
  1. package/README.md +2 -0
  2. package/builtins/en/config.yaml +6 -0
  3. package/builtins/en/facets/instructions/ai-antipattern-review.md +5 -0
  4. package/builtins/en/facets/instructions/findings-manager.md +6 -2
  5. package/builtins/en/facets/instructions/loop-monitor-fix-replan.md +21 -0
  6. package/builtins/en/facets/instructions/loop-monitor-replan.md +10 -0
  7. package/builtins/en/facets/instructions/plan-maintenance.md +10 -7
  8. package/builtins/en/facets/instructions/plan.md +17 -8
  9. package/builtins/en/facets/instructions/review-arch.md +5 -0
  10. package/builtins/en/facets/instructions/review-coding.md +15 -6
  11. package/builtins/en/facets/instructions/review-cqrs-es.md +9 -0
  12. package/builtins/en/facets/instructions/review-implementation-semantics.md +18 -0
  13. package/builtins/en/facets/instructions/review-merge-readiness.md +14 -0
  14. package/builtins/en/facets/instructions/supervise-maintenance.md +2 -2
  15. package/builtins/en/facets/instructions/supervise.md +8 -3
  16. package/builtins/en/facets/instructions/write-tests-first.md +23 -3
  17. package/builtins/en/facets/knowledge/architecture.md +25 -0
  18. package/builtins/en/facets/knowledge/cqrs-es.md +718 -235
  19. package/builtins/en/facets/knowledge/implementation-semantics.md +104 -0
  20. package/builtins/en/facets/knowledge/takt.md +10 -2
  21. package/builtins/en/facets/knowledge/unit-testing.md +14 -0
  22. package/builtins/en/facets/output-contracts/ai-antipattern-review.md +11 -1
  23. package/builtins/en/facets/output-contracts/architecture-review.md +6 -1
  24. package/builtins/en/facets/output-contracts/coding-review.md +11 -1
  25. package/builtins/en/facets/output-contracts/findings-manager.md +14 -0
  26. package/builtins/en/facets/output-contracts/implementation-semantics-review-finding-contract.md +28 -0
  27. package/builtins/en/facets/output-contracts/implementation-semantics-review.md +50 -0
  28. package/builtins/en/facets/output-contracts/{pure-review-finding-contract.md → merge-readiness-review-finding-contract.md} +14 -8
  29. package/builtins/en/facets/output-contracts/{pure-review.md → merge-readiness-review.md} +17 -11
  30. package/builtins/en/facets/output-contracts/supervisor-validation.md +6 -2
  31. package/builtins/en/facets/output-contracts/test-report.md +25 -0
  32. package/builtins/en/facets/personas/implementation-semantics-reviewer.md +27 -0
  33. package/builtins/en/facets/personas/merge-readiness-reviewer.md +28 -0
  34. package/builtins/en/facets/personas/supervisor.md +1 -1
  35. package/builtins/en/facets/policies/ai-antipattern.md +18 -0
  36. package/builtins/en/facets/policies/review.md +15 -0
  37. package/builtins/en/facets/policies/testing.md +3 -2
  38. package/builtins/en/workflow-categories.yaml +13 -1
  39. package/builtins/en/workflows/audit-architecture-backend.yaml +1 -0
  40. package/builtins/en/workflows/audit-architecture-dual.yaml +1 -0
  41. package/builtins/en/workflows/audit-architecture-frontend.yaml +1 -0
  42. package/builtins/en/workflows/audit-architecture.yaml +1 -0
  43. package/builtins/en/workflows/audit-e2e.yaml +1 -0
  44. package/builtins/en/workflows/audit-security.yaml +1 -0
  45. package/builtins/en/workflows/audit-unit.yaml +1 -0
  46. package/builtins/en/workflows/backend-cqrs-for-local-llm.yaml +288 -0
  47. package/builtins/en/workflows/backend-cqrs-mini.yaml +1 -0
  48. package/builtins/en/workflows/backend-cqrs.yaml +28 -84
  49. package/builtins/en/workflows/backend-for-local-llm.yaml +284 -0
  50. package/builtins/en/workflows/backend-maintenance.yaml +32 -89
  51. package/builtins/en/workflows/backend-mini.yaml +1 -0
  52. package/builtins/en/workflows/backend.yaml +25 -83
  53. package/builtins/en/workflows/{takt-default-with-fc.yaml → cli.yaml} +16 -4
  54. package/builtins/en/workflows/deep-research.yaml +1 -0
  55. package/builtins/en/workflows/default-high.yaml +3 -32
  56. package/builtins/en/workflows/default-peer-review.yaml +16 -52
  57. package/builtins/en/workflows/default.yaml +2 -1
  58. package/builtins/en/workflows/dual-cqrs-mini.yaml +1 -0
  59. package/builtins/en/workflows/dual-cqrs.yaml +28 -87
  60. package/builtins/en/workflows/dual-for-local-llm.yaml +312 -0
  61. package/builtins/en/workflows/dual-mini.yaml +1 -0
  62. package/builtins/en/workflows/dual.yaml +29 -57
  63. package/builtins/en/workflows/frontend-for-local-llm.yaml +289 -0
  64. package/builtins/en/workflows/frontend-maintenance.yaml +34 -91
  65. package/builtins/en/workflows/frontend-mini.yaml +1 -0
  66. package/builtins/en/workflows/frontend.yaml +27 -85
  67. package/builtins/en/workflows/merge-readiness-dual-final-gate.yaml +92 -0
  68. package/builtins/en/workflows/merge-readiness-final-gate.yaml +79 -0
  69. package/builtins/en/workflows/{peer-review-with-fc.yaml → peer-review-for-local-llm.yaml} +48 -37
  70. package/builtins/en/workflows/peer-review.yaml +25 -20
  71. package/builtins/en/workflows/research.yaml +1 -0
  72. package/builtins/en/workflows/review-backend-cqrs.yaml +63 -35
  73. package/builtins/en/workflows/review-backend.yaml +63 -35
  74. package/builtins/en/workflows/review-default.yaml +138 -107
  75. package/builtins/en/workflows/review-dual-cqrs.yaml +63 -35
  76. package/builtins/en/workflows/review-dual.yaml +63 -35
  77. package/builtins/en/workflows/review-fix-backend-cqrs.yaml +27 -87
  78. package/builtins/en/workflows/review-fix-backend.yaml +25 -86
  79. package/builtins/en/workflows/review-fix-default.yaml +17 -87
  80. package/builtins/en/workflows/review-fix-dual-cqrs.yaml +29 -90
  81. package/builtins/en/workflows/review-fix-dual.yaml +27 -89
  82. package/builtins/en/workflows/review-fix-frontend.yaml +25 -87
  83. package/builtins/en/workflows/review-fix-takt-default.yaml +67 -362
  84. package/builtins/en/workflows/review-frontend.yaml +63 -35
  85. package/builtins/en/workflows/review-takt-default.yaml +140 -109
  86. package/builtins/en/workflows/takt-default-for-local-llm.yaml +283 -0
  87. package/builtins/en/workflows/takt-default-refresh-all.yaml +20 -58
  88. package/builtins/en/workflows/takt-default-refresh-fast.yaml +19 -56
  89. package/builtins/en/workflows/takt-default.yaml +3 -25
  90. package/builtins/en/workflows/terraform.yaml +81 -44
  91. package/builtins/ja/config.yaml +6 -0
  92. package/builtins/ja/facets/instructions/ai-antipattern-review.md +5 -0
  93. package/builtins/ja/facets/instructions/findings-manager.md +6 -2
  94. package/builtins/ja/facets/instructions/implement-maintenance.md +4 -15
  95. package/builtins/ja/facets/instructions/implement.md +2 -14
  96. package/builtins/ja/facets/instructions/loop-monitor-fix-replan.md +21 -0
  97. package/builtins/ja/facets/instructions/loop-monitor-replan.md +10 -0
  98. package/builtins/ja/facets/instructions/plan-maintenance.md +10 -7
  99. package/builtins/ja/facets/instructions/plan.md +9 -6
  100. package/builtins/ja/facets/instructions/review-arch.md +5 -0
  101. package/builtins/ja/facets/instructions/review-coding.md +15 -6
  102. package/builtins/ja/facets/instructions/review-cqrs-es.md +9 -0
  103. package/builtins/ja/facets/instructions/review-implementation-semantics.md +17 -0
  104. package/builtins/ja/facets/instructions/review-merge-readiness.md +14 -0
  105. package/builtins/ja/facets/instructions/supervise-maintenance.md +2 -2
  106. package/builtins/ja/facets/instructions/supervise.md +8 -3
  107. package/builtins/ja/facets/instructions/write-tests-first.md +23 -3
  108. package/builtins/ja/facets/knowledge/architecture.md +25 -0
  109. package/builtins/ja/facets/knowledge/cqrs-es.md +211 -16
  110. package/builtins/ja/facets/knowledge/implementation-semantics.md +104 -0
  111. package/builtins/ja/facets/knowledge/takt.md +10 -2
  112. package/builtins/ja/facets/knowledge/unit-testing.md +14 -0
  113. package/builtins/ja/facets/output-contracts/ai-antipattern-review.md +11 -1
  114. package/builtins/ja/facets/output-contracts/architecture-review.md +6 -1
  115. package/builtins/ja/facets/output-contracts/coding-review.md +11 -1
  116. package/builtins/ja/facets/output-contracts/findings-manager.md +14 -0
  117. package/builtins/ja/facets/output-contracts/implementation-semantics-review-finding-contract.md +24 -0
  118. package/builtins/ja/facets/output-contracts/implementation-semantics-review.md +50 -0
  119. package/builtins/ja/facets/output-contracts/{pure-review-finding-contract.md → merge-readiness-review-finding-contract.md} +14 -8
  120. package/builtins/ja/facets/output-contracts/{pure-review.md → merge-readiness-review.md} +17 -11
  121. package/builtins/ja/facets/output-contracts/supervisor-validation.md +6 -2
  122. package/builtins/ja/facets/output-contracts/test-report.md +25 -0
  123. package/builtins/ja/facets/partials/instructions/implement-common.md +13 -0
  124. package/builtins/ja/facets/personas/implementation-semantics-reviewer.md +27 -0
  125. package/builtins/ja/facets/personas/merge-readiness-reviewer.md +28 -0
  126. package/builtins/ja/facets/personas/supervisor.md +1 -1
  127. package/builtins/ja/facets/policies/ai-antipattern.md +18 -0
  128. package/builtins/ja/facets/policies/coding.md +1 -0
  129. package/builtins/ja/facets/policies/review.md +15 -0
  130. package/builtins/ja/facets/policies/testing.md +8 -4
  131. package/builtins/ja/workflow-categories.yaml +13 -1
  132. package/builtins/ja/workflows/audit-architecture-backend.yaml +1 -0
  133. package/builtins/ja/workflows/audit-architecture-dual.yaml +1 -0
  134. package/builtins/ja/workflows/audit-architecture-frontend.yaml +1 -0
  135. package/builtins/ja/workflows/audit-architecture.yaml +1 -0
  136. package/builtins/ja/workflows/audit-e2e.yaml +1 -0
  137. package/builtins/ja/workflows/audit-security.yaml +1 -0
  138. package/builtins/ja/workflows/audit-unit.yaml +1 -0
  139. package/builtins/ja/workflows/backend-cqrs-for-local-llm.yaml +287 -0
  140. package/builtins/ja/workflows/backend-cqrs-mini.yaml +1 -0
  141. package/builtins/ja/workflows/backend-cqrs.yaml +28 -84
  142. package/builtins/ja/workflows/backend-for-local-llm.yaml +283 -0
  143. package/builtins/ja/workflows/backend-maintenance.yaml +32 -89
  144. package/builtins/ja/workflows/backend-mini.yaml +1 -0
  145. package/builtins/ja/workflows/backend.yaml +25 -83
  146. package/builtins/ja/workflows/{takt-default-with-fc.yaml → cli.yaml} +16 -4
  147. package/builtins/ja/workflows/deep-research.yaml +1 -0
  148. package/builtins/ja/workflows/default-high.yaml +3 -32
  149. package/builtins/ja/workflows/default-peer-review.yaml +16 -52
  150. package/builtins/ja/workflows/default.yaml +2 -1
  151. package/builtins/ja/workflows/dual-cqrs-mini.yaml +1 -0
  152. package/builtins/ja/workflows/dual-cqrs.yaml +28 -87
  153. package/builtins/ja/workflows/dual-for-local-llm.yaml +311 -0
  154. package/builtins/ja/workflows/dual-mini.yaml +1 -0
  155. package/builtins/ja/workflows/dual.yaml +29 -57
  156. package/builtins/ja/workflows/frontend-for-local-llm.yaml +288 -0
  157. package/builtins/ja/workflows/frontend-maintenance.yaml +34 -91
  158. package/builtins/ja/workflows/frontend-mini.yaml +1 -0
  159. package/builtins/ja/workflows/frontend.yaml +27 -85
  160. package/builtins/ja/workflows/merge-readiness-dual-final-gate.yaml +92 -0
  161. package/builtins/ja/workflows/merge-readiness-final-gate.yaml +79 -0
  162. package/builtins/ja/workflows/{peer-review-with-fc.yaml → peer-review-for-local-llm.yaml} +48 -37
  163. package/builtins/ja/workflows/peer-review.yaml +25 -20
  164. package/builtins/ja/workflows/research.yaml +1 -0
  165. package/builtins/ja/workflows/review-backend-cqrs.yaml +63 -35
  166. package/builtins/ja/workflows/review-backend.yaml +63 -35
  167. package/builtins/ja/workflows/review-default.yaml +111 -79
  168. package/builtins/ja/workflows/review-dual-cqrs.yaml +63 -35
  169. package/builtins/ja/workflows/review-dual.yaml +63 -35
  170. package/builtins/ja/workflows/review-fix-backend-cqrs.yaml +27 -87
  171. package/builtins/ja/workflows/review-fix-backend.yaml +25 -86
  172. package/builtins/ja/workflows/review-fix-default.yaml +17 -87
  173. package/builtins/ja/workflows/review-fix-dual-cqrs.yaml +29 -90
  174. package/builtins/ja/workflows/review-fix-dual.yaml +27 -89
  175. package/builtins/ja/workflows/review-fix-frontend.yaml +25 -87
  176. package/builtins/ja/workflows/review-fix-takt-default.yaml +67 -362
  177. package/builtins/ja/workflows/review-frontend.yaml +63 -35
  178. package/builtins/ja/workflows/review-takt-default.yaml +112 -80
  179. package/builtins/ja/workflows/takt-default-for-local-llm.yaml +282 -0
  180. package/builtins/ja/workflows/takt-default-refresh-all.yaml +20 -58
  181. package/builtins/ja/workflows/takt-default-refresh-fast.yaml +19 -56
  182. package/builtins/ja/workflows/takt-default.yaml +3 -25
  183. package/builtins/ja/workflows/terraform.yaml +81 -44
  184. package/dist/agents/decompose-task-usecase.d.ts +1 -0
  185. package/dist/agents/decompose-task-usecase.d.ts.map +1 -1
  186. package/dist/agents/decompose-task-usecase.js +2 -0
  187. package/dist/agents/decompose-task-usecase.js.map +1 -1
  188. package/dist/agents/judge-utils.d.ts.map +1 -1
  189. package/dist/agents/judge-utils.js +4 -3
  190. package/dist/agents/judge-utils.js.map +1 -1
  191. package/dist/agents/structured-caller/prompt-based-structured-caller.d.ts.map +1 -1
  192. package/dist/agents/structured-caller/prompt-based-structured-caller.js +2 -0
  193. package/dist/agents/structured-caller/prompt-based-structured-caller.js.map +1 -1
  194. package/dist/app/acp/agent.d.ts +28 -0
  195. package/dist/app/acp/agent.d.ts.map +1 -0
  196. package/dist/app/acp/agent.js +279 -0
  197. package/dist/app/acp/agent.js.map +1 -0
  198. package/dist/app/acp/confirmationBridge.d.ts +5 -0
  199. package/dist/app/acp/confirmationBridge.d.ts.map +1 -0
  200. package/dist/app/acp/confirmationBridge.js +194 -0
  201. package/dist/app/acp/confirmationBridge.js.map +1 -0
  202. package/dist/app/acp/conversationFactory.d.ts +4 -0
  203. package/dist/app/acp/conversationFactory.d.ts.map +1 -0
  204. package/dist/app/acp/conversationFactory.js +33 -0
  205. package/dist/app/acp/conversationFactory.js.map +1 -0
  206. package/dist/app/acp/enqueue.d.ts +33 -0
  207. package/dist/app/acp/enqueue.d.ts.map +1 -0
  208. package/dist/app/acp/enqueue.js +45 -0
  209. package/dist/app/acp/enqueue.js.map +1 -0
  210. package/dist/app/acp/index.d.ts +7 -0
  211. package/dist/app/acp/index.d.ts.map +1 -0
  212. package/dist/app/acp/index.js +125 -0
  213. package/dist/app/acp/index.js.map +1 -0
  214. package/dist/app/acp/intent.d.ts +10 -0
  215. package/dist/app/acp/intent.d.ts.map +1 -0
  216. package/dist/app/acp/intent.js +210 -0
  217. package/dist/app/acp/intent.js.map +1 -0
  218. package/dist/app/acp/mcpServers.d.ts +4 -0
  219. package/dist/app/acp/mcpServers.d.ts.map +1 -0
  220. package/dist/app/acp/mcpServers.js +51 -0
  221. package/dist/app/acp/mcpServers.js.map +1 -0
  222. package/dist/app/acp/promptContent.d.ts +3 -0
  223. package/dist/app/acp/promptContent.d.ts.map +1 -0
  224. package/dist/app/acp/promptContent.js +23 -0
  225. package/dist/app/acp/promptContent.js.map +1 -0
  226. package/dist/app/acp/sessionStore.d.ts +19 -0
  227. package/dist/app/acp/sessionStore.d.ts.map +1 -0
  228. package/dist/app/acp/sessionStore.js +50 -0
  229. package/dist/app/acp/sessionStore.js.map +1 -0
  230. package/dist/app/acp/sessionUpdates.d.ts +8 -0
  231. package/dist/app/acp/sessionUpdates.d.ts.map +1 -0
  232. package/dist/app/acp/sessionUpdates.js +108 -0
  233. package/dist/app/acp/sessionUpdates.js.map +1 -0
  234. package/dist/app/acp/taskContext.d.ts +17 -0
  235. package/dist/app/acp/taskContext.d.ts.map +1 -0
  236. package/dist/app/acp/taskContext.js +81 -0
  237. package/dist/app/acp/taskContext.js.map +1 -0
  238. package/dist/app/acp/types.d.ts +33 -0
  239. package/dist/app/acp/types.d.ts.map +1 -0
  240. package/dist/app/acp/types.js +2 -0
  241. package/dist/app/acp/types.js.map +1 -0
  242. package/dist/app/cli/program.d.ts.map +1 -1
  243. package/dist/app/cli/program.js +2 -3
  244. package/dist/app/cli/program.js.map +1 -1
  245. package/dist/app/mcp/index.d.ts +3 -0
  246. package/dist/app/mcp/index.d.ts.map +1 -0
  247. package/dist/app/mcp/index.js +16 -0
  248. package/dist/app/mcp/index.js.map +1 -0
  249. package/dist/app/mcp/server.d.ts +2 -0
  250. package/dist/app/mcp/server.d.ts.map +1 -0
  251. package/dist/app/mcp/server.js +2 -0
  252. package/dist/app/mcp/server.js.map +1 -0
  253. package/dist/core/config/provider-resolution.d.ts +1 -0
  254. package/dist/core/config/provider-resolution.d.ts.map +1 -1
  255. package/dist/core/config/provider-resolution.js +19 -0
  256. package/dist/core/config/provider-resolution.js.map +1 -1
  257. package/dist/core/models/finding-schemas.d.ts +129 -10
  258. package/dist/core/models/finding-schemas.d.ts.map +1 -1
  259. package/dist/core/models/finding-schemas.js +79 -9
  260. package/dist/core/models/finding-schemas.js.map +1 -1
  261. package/dist/core/models/finding-types.d.ts +39 -2
  262. package/dist/core/models/finding-types.d.ts.map +1 -1
  263. package/dist/core/models/finding-types.js +3 -2
  264. package/dist/core/models/finding-types.js.map +1 -1
  265. package/dist/core/models/workflow-condition-expression.d.ts +17 -0
  266. package/dist/core/models/workflow-condition-expression.d.ts.map +1 -1
  267. package/dist/core/models/workflow-condition-expression.js +85 -2
  268. package/dist/core/models/workflow-condition-expression.js.map +1 -1
  269. package/dist/core/models/workflow-schemas.d.ts +18 -6
  270. package/dist/core/models/workflow-schemas.d.ts.map +1 -1
  271. package/dist/core/models/workflow-schemas.js +1 -1
  272. package/dist/core/models/workflow-schemas.js.map +1 -1
  273. package/dist/core/models/workflow-types.d.ts +6 -0
  274. package/dist/core/models/workflow-types.d.ts.map +1 -1
  275. package/dist/core/runtime/runtime-environment.d.ts.map +1 -1
  276. package/dist/core/runtime/runtime-environment.js +19 -0
  277. package/dist/core/runtime/runtime-environment.js.map +1 -1
  278. package/dist/core/workflow/engine/OptionsBuilder.d.ts +14 -5
  279. package/dist/core/workflow/engine/OptionsBuilder.d.ts.map +1 -1
  280. package/dist/core/workflow/engine/OptionsBuilder.js +70 -5
  281. package/dist/core/workflow/engine/OptionsBuilder.js.map +1 -1
  282. package/dist/core/workflow/engine/ParallelRunner.d.ts +2 -0
  283. package/dist/core/workflow/engine/ParallelRunner.d.ts.map +1 -1
  284. package/dist/core/workflow/engine/ParallelRunner.js +131 -23
  285. package/dist/core/workflow/engine/ParallelRunner.js.map +1 -1
  286. package/dist/core/workflow/engine/StepExecutor.d.ts +10 -0
  287. package/dist/core/workflow/engine/StepExecutor.d.ts.map +1 -1
  288. package/dist/core/workflow/engine/StepExecutor.js +86 -30
  289. package/dist/core/workflow/engine/StepExecutor.js.map +1 -1
  290. package/dist/core/workflow/engine/TeamLeaderRunner.d.ts.map +1 -1
  291. package/dist/core/workflow/engine/TeamLeaderRunner.js +3 -0
  292. package/dist/core/workflow/engine/TeamLeaderRunner.js.map +1 -1
  293. package/dist/core/workflow/engine/WorkflowEngine.d.ts.map +1 -1
  294. package/dist/core/workflow/engine/WorkflowEngine.js +8 -3
  295. package/dist/core/workflow/engine/WorkflowEngine.js.map +1 -1
  296. package/dist/core/workflow/engine/WorkflowEngineSetup.d.ts.map +1 -1
  297. package/dist/core/workflow/engine/WorkflowEngineSetup.js +3 -1
  298. package/dist/core/workflow/engine/WorkflowEngineSetup.js.map +1 -1
  299. package/dist/core/workflow/engine/WorkflowValidator.d.ts.map +1 -1
  300. package/dist/core/workflow/engine/WorkflowValidator.js +9 -6
  301. package/dist/core/workflow/engine/WorkflowValidator.js.map +1 -1
  302. package/dist/core/workflow/engine/engine-provider-options.d.ts +1 -0
  303. package/dist/core/workflow/engine/engine-provider-options.d.ts.map +1 -1
  304. package/dist/core/workflow/engine/engine-provider-options.js +12 -0
  305. package/dist/core/workflow/engine/engine-provider-options.js.map +1 -1
  306. package/dist/core/workflow/engine/team-leader-part-runner.d.ts.map +1 -1
  307. package/dist/core/workflow/engine/team-leader-part-runner.js +3 -1
  308. package/dist/core/workflow/engine/team-leader-part-runner.js.map +1 -1
  309. package/dist/core/workflow/evaluation/RuleEvaluator.d.ts +0 -1
  310. package/dist/core/workflow/evaluation/RuleEvaluator.d.ts.map +1 -1
  311. package/dist/core/workflow/evaluation/RuleEvaluator.js +22 -34
  312. package/dist/core/workflow/evaluation/RuleEvaluator.js.map +1 -1
  313. package/dist/core/workflow/evaluation/rule-utils.d.ts +33 -1
  314. package/dist/core/workflow/evaluation/rule-utils.d.ts.map +1 -1
  315. package/dist/core/workflow/evaluation/rule-utils.js +77 -5
  316. package/dist/core/workflow/evaluation/rule-utils.js.map +1 -1
  317. package/dist/core/workflow/evaluation/when-evaluator.d.ts +1 -0
  318. package/dist/core/workflow/evaluation/when-evaluator.d.ts.map +1 -1
  319. package/dist/core/workflow/evaluation/when-evaluator.js +18 -40
  320. package/dist/core/workflow/evaluation/when-evaluator.js.map +1 -1
  321. package/dist/core/workflow/findings/context.d.ts +4 -0
  322. package/dist/core/workflow/findings/context.d.ts.map +1 -1
  323. package/dist/core/workflow/findings/context.js +27 -0
  324. package/dist/core/workflow/findings/context.js.map +1 -1
  325. package/dist/core/workflow/findings/manager-output-validation.d.ts +2 -0
  326. package/dist/core/workflow/findings/manager-output-validation.d.ts.map +1 -1
  327. package/dist/core/workflow/findings/manager-output-validation.js +145 -8
  328. package/dist/core/workflow/findings/manager-output-validation.js.map +1 -1
  329. package/dist/core/workflow/findings/manager-runner.d.ts +13 -3
  330. package/dist/core/workflow/findings/manager-runner.d.ts.map +1 -1
  331. package/dist/core/workflow/findings/manager-runner.js +19 -2
  332. package/dist/core/workflow/findings/manager-runner.js.map +1 -1
  333. package/dist/core/workflow/findings/reconciler.d.ts +1 -0
  334. package/dist/core/workflow/findings/reconciler.d.ts.map +1 -1
  335. package/dist/core/workflow/findings/reconciler.js +90 -4
  336. package/dist/core/workflow/findings/reconciler.js.map +1 -1
  337. package/dist/core/workflow/instruction/InstructionBuilder.d.ts.map +1 -1
  338. package/dist/core/workflow/instruction/InstructionBuilder.js +17 -1
  339. package/dist/core/workflow/instruction/InstructionBuilder.js.map +1 -1
  340. package/dist/core/workflow/instruction/instruction-context.d.ts +4 -0
  341. package/dist/core/workflow/instruction/instruction-context.d.ts.map +1 -1
  342. package/dist/core/workflow/instruction/instruction-context.js.map +1 -1
  343. package/dist/core/workflow/instruction/status-rules.d.ts.map +1 -1
  344. package/dist/core/workflow/instruction/status-rules.js +7 -2
  345. package/dist/core/workflow/instruction/status-rules.js.map +1 -1
  346. package/dist/core/workflow/phase-runner.d.ts +17 -10
  347. package/dist/core/workflow/phase-runner.d.ts.map +1 -1
  348. package/dist/core/workflow/phase-runner.js +1 -1
  349. package/dist/core/workflow/phase-runner.js.map +1 -1
  350. package/dist/core/workflow/provider-model-requirements.d.ts +6 -0
  351. package/dist/core/workflow/provider-model-requirements.d.ts.map +1 -0
  352. package/dist/core/workflow/provider-model-requirements.js +15 -0
  353. package/dist/core/workflow/provider-model-requirements.js.map +1 -0
  354. package/dist/core/workflow/report-phase-runner.d.ts +5 -2
  355. package/dist/core/workflow/report-phase-runner.d.ts.map +1 -1
  356. package/dist/core/workflow/report-phase-runner.js +135 -43
  357. package/dist/core/workflow/report-phase-runner.js.map +1 -1
  358. package/dist/core/workflow/status-judgment-phase.d.ts +2 -2
  359. package/dist/core/workflow/status-judgment-phase.d.ts.map +1 -1
  360. package/dist/core/workflow/status-judgment-phase.js +1 -7
  361. package/dist/core/workflow/status-judgment-phase.js.map +1 -1
  362. package/dist/core/workflow/system/system-step-effect-runner.js +2 -2
  363. package/dist/core/workflow/system/system-step-effect-runner.js.map +1 -1
  364. package/dist/core/workflow/system/system-step-services.d.ts +101 -0
  365. package/dist/core/workflow/system/system-step-services.d.ts.map +1 -1
  366. package/dist/core/workflow/types.d.ts +7 -3
  367. package/dist/core/workflow/types.d.ts.map +1 -1
  368. package/dist/features/analytics/events.d.ts +2 -1
  369. package/dist/features/analytics/events.d.ts.map +1 -1
  370. package/dist/features/exec/assistantSession.js +1 -1
  371. package/dist/features/exec/assistantSession.js.map +1 -1
  372. package/dist/features/exec/configOps.d.ts.map +1 -1
  373. package/dist/features/exec/configOps.js +4 -4
  374. package/dist/features/exec/configOps.js.map +1 -1
  375. package/dist/features/exec/configValidation.d.ts +1 -1
  376. package/dist/features/exec/configValidation.d.ts.map +1 -1
  377. package/dist/features/exec/configValidation.js +9 -13
  378. package/dist/features/exec/configValidation.js.map +1 -1
  379. package/dist/features/exec/setupMenu.js +2 -2
  380. package/dist/features/exec/setupMenu.js.map +1 -1
  381. package/dist/features/exec/workflowTemplate.d.ts.map +1 -1
  382. package/dist/features/exec/workflowTemplate.js +4 -4
  383. package/dist/features/exec/workflowTemplate.js.map +1 -1
  384. package/dist/features/interactive/aiCaller.d.ts +2 -0
  385. package/dist/features/interactive/aiCaller.d.ts.map +1 -1
  386. package/dist/features/interactive/aiCaller.js +31 -10
  387. package/dist/features/interactive/aiCaller.js.map +1 -1
  388. package/dist/features/interactive/conversationSession.d.ts +44 -0
  389. package/dist/features/interactive/conversationSession.d.ts.map +1 -0
  390. package/dist/features/interactive/conversationSession.js +133 -0
  391. package/dist/features/interactive/conversationSession.js.map +1 -0
  392. package/dist/features/interactive/index.d.ts +1 -0
  393. package/dist/features/interactive/index.d.ts.map +1 -1
  394. package/dist/features/interactive/index.js +1 -0
  395. package/dist/features/interactive/index.js.map +1 -1
  396. package/dist/features/interactive/interactive.d.ts +5 -4
  397. package/dist/features/interactive/interactive.d.ts.map +1 -1
  398. package/dist/features/interactive/interactive.js +10 -4
  399. package/dist/features/interactive/interactive.js.map +1 -1
  400. package/dist/features/interactive/interactiveApplication.d.ts +5 -0
  401. package/dist/features/interactive/interactiveApplication.d.ts.map +1 -0
  402. package/dist/features/interactive/interactiveApplication.js +10 -0
  403. package/dist/features/interactive/interactiveApplication.js.map +1 -0
  404. package/dist/features/mcp/operations.d.ts +25 -0
  405. package/dist/features/mcp/operations.d.ts.map +1 -0
  406. package/dist/features/mcp/operations.js +150 -0
  407. package/dist/features/mcp/operations.js.map +1 -0
  408. package/dist/features/mcp/schemas.d.ts +50 -0
  409. package/dist/features/mcp/schemas.d.ts.map +1 -0
  410. package/dist/features/mcp/schemas.js +59 -0
  411. package/dist/features/mcp/schemas.js.map +1 -0
  412. package/dist/features/mcp/server.d.ts +7 -0
  413. package/dist/features/mcp/server.d.ts.map +1 -0
  414. package/dist/features/mcp/server.js +36 -0
  415. package/dist/features/mcp/server.js.map +1 -0
  416. package/dist/features/tasks/add/index.d.ts +8 -20
  417. package/dist/features/tasks/add/index.d.ts.map +1 -1
  418. package/dist/features/tasks/add/index.js +42 -61
  419. package/dist/features/tasks/add/index.js.map +1 -1
  420. package/dist/features/tasks/attachments.d.ts +2 -5
  421. package/dist/features/tasks/attachments.d.ts.map +1 -1
  422. package/dist/features/tasks/attachments.js +11 -35
  423. package/dist/features/tasks/attachments.js.map +1 -1
  424. package/dist/features/tasks/execute/outputFns.d.ts +1 -1
  425. package/dist/features/tasks/execute/outputFns.d.ts.map +1 -1
  426. package/dist/features/tasks/execute/outputFns.js +17 -1
  427. package/dist/features/tasks/execute/outputFns.js.map +1 -1
  428. package/dist/features/tasks/execute/postExecution.d.ts +4 -1
  429. package/dist/features/tasks/execute/postExecution.d.ts.map +1 -1
  430. package/dist/features/tasks/execute/postExecution.js +33 -14
  431. package/dist/features/tasks/execute/postExecution.js.map +1 -1
  432. package/dist/features/tasks/execute/resolveTask.d.ts +9 -3
  433. package/dist/features/tasks/execute/resolveTask.d.ts.map +1 -1
  434. package/dist/features/tasks/execute/resolveTask.js +45 -13
  435. package/dist/features/tasks/execute/resolveTask.js.map +1 -1
  436. package/dist/features/tasks/execute/runTaskExecution.d.ts +7 -1
  437. package/dist/features/tasks/execute/runTaskExecution.d.ts.map +1 -1
  438. package/dist/features/tasks/execute/runTaskExecution.js +11 -8
  439. package/dist/features/tasks/execute/runTaskExecution.js.map +1 -1
  440. package/dist/features/tasks/execute/taskExecution.d.ts +12 -3
  441. package/dist/features/tasks/execute/taskExecution.d.ts.map +1 -1
  442. package/dist/features/tasks/execute/taskExecution.js +63 -16
  443. package/dist/features/tasks/execute/taskExecution.js.map +1 -1
  444. package/dist/features/tasks/execute/taskResultHandler.d.ts +2 -2
  445. package/dist/features/tasks/execute/taskResultHandler.d.ts.map +1 -1
  446. package/dist/features/tasks/execute/taskResultHandler.js +8 -4
  447. package/dist/features/tasks/execute/taskResultHandler.js.map +1 -1
  448. package/dist/features/tasks/execute/taskWorkflowExecution.d.ts.map +1 -1
  449. package/dist/features/tasks/execute/taskWorkflowExecution.js +60 -9
  450. package/dist/features/tasks/execute/taskWorkflowExecution.js.map +1 -1
  451. package/dist/features/tasks/execute/traceTaskMetadata.js +3 -6
  452. package/dist/features/tasks/execute/traceTaskMetadata.js.map +1 -1
  453. package/dist/features/tasks/execute/types.d.ts +95 -2
  454. package/dist/features/tasks/execute/types.d.ts.map +1 -1
  455. package/dist/features/tasks/execute/workflowExecution.d.ts +3 -1
  456. package/dist/features/tasks/execute/workflowExecution.d.ts.map +1 -1
  457. package/dist/features/tasks/execute/workflowExecution.js +41 -3
  458. package/dist/features/tasks/execute/workflowExecution.js.map +1 -1
  459. package/dist/features/tasks/execute/workflowExecutionApi.d.ts +6 -0
  460. package/dist/features/tasks/execute/workflowExecutionApi.d.ts.map +1 -0
  461. package/dist/features/tasks/execute/workflowExecutionApi.js +25 -0
  462. package/dist/features/tasks/execute/workflowExecutionApi.js.map +1 -0
  463. package/dist/features/tasks/execute/workflowExecutionBootstrap.d.ts +2 -1
  464. package/dist/features/tasks/execute/workflowExecutionBootstrap.d.ts.map +1 -1
  465. package/dist/features/tasks/execute/workflowExecutionBootstrap.js +18 -14
  466. package/dist/features/tasks/execute/workflowExecutionBootstrap.js.map +1 -1
  467. package/dist/features/tasks/execute/workflowExecutionEvents.d.ts +14 -1
  468. package/dist/features/tasks/execute/workflowExecutionEvents.d.ts.map +1 -1
  469. package/dist/features/tasks/execute/workflowExecutionEvents.js +241 -2
  470. package/dist/features/tasks/execute/workflowExecutionEvents.js.map +1 -1
  471. package/dist/features/tasks/list/requeueHelpers.d.ts +1 -0
  472. package/dist/features/tasks/list/requeueHelpers.d.ts.map +1 -1
  473. package/dist/features/tasks/list/requeueHelpers.js +3 -0
  474. package/dist/features/tasks/list/requeueHelpers.js.map +1 -1
  475. package/dist/features/tasks/list/taskInstructionActions.d.ts.map +1 -1
  476. package/dist/features/tasks/list/taskInstructionActions.js +2 -2
  477. package/dist/features/tasks/list/taskInstructionActions.js.map +1 -1
  478. package/dist/features/tasks/list/taskRetryActions.d.ts.map +1 -1
  479. package/dist/features/tasks/list/taskRetryActions.js +1 -4
  480. package/dist/features/tasks/list/taskRetryActions.js.map +1 -1
  481. package/dist/features/tasks/taskContextValidation.d.ts +10 -0
  482. package/dist/features/tasks/taskContextValidation.d.ts.map +1 -0
  483. package/dist/features/tasks/taskContextValidation.js +73 -0
  484. package/dist/features/tasks/taskContextValidation.js.map +1 -0
  485. package/dist/infra/codex/client.d.ts.map +1 -1
  486. package/dist/infra/codex/client.js +5 -0
  487. package/dist/infra/codex/client.js.map +1 -1
  488. package/dist/infra/config/configNormalizers.js +4 -4
  489. package/dist/infra/config/configNormalizers.js.map +1 -1
  490. package/dist/infra/config/global/globalConfigCore.js +2 -2
  491. package/dist/infra/config/global/globalConfigCore.js.map +1 -1
  492. package/dist/infra/config/loaders/resource-resolver.d.ts.map +1 -1
  493. package/dist/infra/config/loaders/resource-resolver.js +22 -7
  494. package/dist/infra/config/loaders/resource-resolver.js.map +1 -1
  495. package/dist/infra/config/loaders/workflowCallContracts.d.ts.map +1 -1
  496. package/dist/infra/config/loaders/workflowCallContracts.js +5 -0
  497. package/dist/infra/config/loaders/workflowCallContracts.js.map +1 -1
  498. package/dist/infra/config/loaders/workflowCallableArgResolver.d.ts.map +1 -1
  499. package/dist/infra/config/loaders/workflowCallableArgResolver.js +27 -0
  500. package/dist/infra/config/loaders/workflowCallableArgResolver.js.map +1 -1
  501. package/dist/infra/config/loaders/workflowCallableRuleValidation.d.ts.map +1 -1
  502. package/dist/infra/config/loaders/workflowCallableRuleValidation.js +5 -0
  503. package/dist/infra/config/loaders/workflowCallableRuleValidation.js.map +1 -1
  504. package/dist/infra/config/loaders/workflowLoopMonitorNormalizer.d.ts.map +1 -1
  505. package/dist/infra/config/loaders/workflowLoopMonitorNormalizer.js +9 -1
  506. package/dist/infra/config/loaders/workflowLoopMonitorNormalizer.js.map +1 -1
  507. package/dist/infra/config/loaders/workflowPackageScope.d.ts +1 -0
  508. package/dist/infra/config/loaders/workflowPackageScope.d.ts.map +1 -1
  509. package/dist/infra/config/loaders/workflowPackageScope.js +20 -2
  510. package/dist/infra/config/loaders/workflowPackageScope.js.map +1 -1
  511. package/dist/infra/config/loaders/workflowParser.d.ts.map +1 -1
  512. package/dist/infra/config/loaders/workflowParser.js +11 -6
  513. package/dist/infra/config/loaders/workflowParser.js.map +1 -1
  514. package/dist/infra/config/loaders/workflowRuleNormalizer.d.ts +10 -0
  515. package/dist/infra/config/loaders/workflowRuleNormalizer.d.ts.map +1 -1
  516. package/dist/infra/config/loaders/workflowRuleNormalizer.js +70 -1
  517. package/dist/infra/config/loaders/workflowRuleNormalizer.js.map +1 -1
  518. package/dist/infra/config/loaders/workflowStepNormalizer.d.ts.map +1 -1
  519. package/dist/infra/config/loaders/workflowStepNormalizer.js +15 -1
  520. package/dist/infra/config/loaders/workflowStepNormalizer.js.map +1 -1
  521. package/dist/infra/config/project/sessionStore.d.ts +2 -2
  522. package/dist/infra/config/project/sessionStore.d.ts.map +1 -1
  523. package/dist/infra/config/project/sessionStore.js +12 -4
  524. package/dist/infra/config/project/sessionStore.js.map +1 -1
  525. package/dist/infra/config/providerModelRequirements.d.ts +2 -0
  526. package/dist/infra/config/providerModelRequirements.d.ts.map +1 -0
  527. package/dist/infra/config/providerModelRequirements.js +2 -0
  528. package/dist/infra/config/providerModelRequirements.js.map +1 -0
  529. package/dist/infra/git/format.d.ts +1 -0
  530. package/dist/infra/git/format.d.ts.map +1 -1
  531. package/dist/infra/git/format.js +21 -0
  532. package/dist/infra/git/format.js.map +1 -1
  533. package/dist/infra/git/index.d.ts +1 -1
  534. package/dist/infra/git/index.d.ts.map +1 -1
  535. package/dist/infra/git/types.d.ts +16 -4
  536. package/dist/infra/git/types.d.ts.map +1 -1
  537. package/dist/infra/github/GitHubProvider.d.ts +2 -1
  538. package/dist/infra/github/GitHubProvider.d.ts.map +1 -1
  539. package/dist/infra/github/GitHubProvider.js +4 -1
  540. package/dist/infra/github/GitHubProvider.js.map +1 -1
  541. package/dist/infra/github/issue.d.ts +2 -1
  542. package/dist/infra/github/issue.d.ts.map +1 -1
  543. package/dist/infra/github/issue.js +23 -2
  544. package/dist/infra/github/issue.js.map +1 -1
  545. package/dist/infra/gitlab/GitLabProvider.d.ts +2 -1
  546. package/dist/infra/gitlab/GitLabProvider.d.ts.map +1 -1
  547. package/dist/infra/gitlab/GitLabProvider.js +4 -1
  548. package/dist/infra/gitlab/GitLabProvider.js.map +1 -1
  549. package/dist/infra/gitlab/issue.d.ts +2 -1
  550. package/dist/infra/gitlab/issue.d.ts.map +1 -1
  551. package/dist/infra/gitlab/issue.js +30 -2
  552. package/dist/infra/gitlab/issue.js.map +1 -1
  553. package/dist/infra/opencode/OpenCodeStreamHandler.d.ts +4 -0
  554. package/dist/infra/opencode/OpenCodeStreamHandler.d.ts.map +1 -1
  555. package/dist/infra/opencode/OpenCodeStreamHandler.js.map +1 -1
  556. package/dist/infra/opencode/allowedTools.d.ts.map +1 -1
  557. package/dist/infra/opencode/allowedTools.js +0 -1
  558. package/dist/infra/opencode/allowedTools.js.map +1 -1
  559. package/dist/infra/opencode/client.d.ts +2 -0
  560. package/dist/infra/opencode/client.d.ts.map +1 -1
  561. package/dist/infra/opencode/client.js +346 -169
  562. package/dist/infra/opencode/client.js.map +1 -1
  563. package/dist/infra/opencode/types.d.ts +34 -0
  564. package/dist/infra/opencode/types.d.ts.map +1 -1
  565. package/dist/infra/opencode/types.js +88 -1
  566. package/dist/infra/opencode/types.js.map +1 -1
  567. package/dist/infra/opencode/unavailable-tool-loop.d.ts +13 -0
  568. package/dist/infra/opencode/unavailable-tool-loop.d.ts.map +1 -1
  569. package/dist/infra/opencode/unavailable-tool-loop.js +46 -0
  570. package/dist/infra/opencode/unavailable-tool-loop.js.map +1 -1
  571. package/dist/infra/providers/claude-headless.d.ts.map +1 -1
  572. package/dist/infra/providers/claude-headless.js +0 -2
  573. package/dist/infra/providers/claude-headless.js.map +1 -1
  574. package/dist/infra/providers/claude-terminal.d.ts.map +1 -1
  575. package/dist/infra/providers/claude-terminal.js +0 -2
  576. package/dist/infra/providers/claude-terminal.js.map +1 -1
  577. package/dist/infra/providers/claude.d.ts.map +1 -1
  578. package/dist/infra/providers/claude.js +0 -2
  579. package/dist/infra/providers/claude.js.map +1 -1
  580. package/dist/infra/providers/opencode.d.ts +1 -1
  581. package/dist/infra/providers/opencode.d.ts.map +1 -1
  582. package/dist/infra/providers/opencode.js +2 -1
  583. package/dist/infra/providers/opencode.js.map +1 -1
  584. package/dist/infra/task/clone-exec.d.ts.map +1 -1
  585. package/dist/infra/task/clone-exec.js +31 -0
  586. package/dist/infra/task/clone-exec.js.map +1 -1
  587. package/dist/infra/task/enqueueService.d.ts +115 -0
  588. package/dist/infra/task/enqueueService.d.ts.map +1 -0
  589. package/dist/infra/task/enqueueService.js +191 -0
  590. package/dist/infra/task/enqueueService.js.map +1 -0
  591. package/dist/infra/task/enqueuedTaskFile.d.ts +6 -0
  592. package/dist/infra/task/enqueuedTaskFile.d.ts.map +1 -0
  593. package/dist/infra/task/enqueuedTaskFile.js +55 -0
  594. package/dist/infra/task/enqueuedTaskFile.js.map +1 -0
  595. package/dist/infra/task/issueTask.d.ts +20 -0
  596. package/dist/infra/task/issueTask.d.ts.map +1 -0
  597. package/dist/{features/tasks/add → infra/task}/issueTask.js +61 -43
  598. package/dist/infra/task/issueTask.js.map +1 -0
  599. package/dist/infra/task/listSerializer.d.ts +1 -0
  600. package/dist/infra/task/listSerializer.d.ts.map +1 -1
  601. package/dist/infra/task/listSerializer.js +1 -0
  602. package/dist/infra/task/listSerializer.js.map +1 -1
  603. package/dist/infra/task/mapper.d.ts.map +1 -1
  604. package/dist/infra/task/mapper.js +1 -0
  605. package/dist/infra/task/mapper.js.map +1 -1
  606. package/dist/infra/task/taskExecutionSchemas.d.ts +3 -0
  607. package/dist/infra/task/taskExecutionSchemas.d.ts.map +1 -1
  608. package/dist/infra/task/taskExecutionSchemas.js +4 -2
  609. package/dist/infra/task/taskExecutionSchemas.js.map +1 -1
  610. package/dist/infra/task/taskRecordSchemas.d.ts +2 -0
  611. package/dist/infra/task/taskRecordSchemas.d.ts.map +1 -1
  612. package/dist/infra/workflow/system/DefaultSystemStepServices.d.ts.map +1 -1
  613. package/dist/infra/workflow/system/DefaultSystemStepServices.js +7 -7
  614. package/dist/infra/workflow/system/DefaultSystemStepServices.js.map +1 -1
  615. package/dist/infra/workflow/system/system-enqueue-effect.d.ts.map +1 -1
  616. package/dist/infra/workflow/system/system-enqueue-effect.js +78 -20
  617. package/dist/infra/workflow/system/system-enqueue-effect.js.map +1 -1
  618. package/dist/infra/workflow/system/system-git-context.d.ts +6 -6
  619. package/dist/infra/workflow/system/system-git-context.d.ts.map +1 -1
  620. package/dist/infra/workflow/system/system-git-context.js +13 -13
  621. package/dist/infra/workflow/system/system-git-context.js.map +1 -1
  622. package/dist/infra/workflow/system/system-issue-input-resolver.d.ts +3 -3
  623. package/dist/infra/workflow/system/system-issue-input-resolver.d.ts.map +1 -1
  624. package/dist/infra/workflow/system/system-issue-input-resolver.js +8 -8
  625. package/dist/infra/workflow/system/system-issue-input-resolver.js.map +1 -1
  626. package/dist/infra/workflow/system/system-pr-effects.d.ts.map +1 -1
  627. package/dist/infra/workflow/system/system-pr-effects.js +6 -3
  628. package/dist/infra/workflow/system/system-pr-effects.js.map +1 -1
  629. package/dist/infra/workflow/system/system-pr-input-resolver.d.ts +3 -3
  630. package/dist/infra/workflow/system/system-pr-input-resolver.d.ts.map +1 -1
  631. package/dist/infra/workflow/system/system-pr-input-resolver.js +8 -8
  632. package/dist/infra/workflow/system/system-pr-input-resolver.js.map +1 -1
  633. package/dist/infra/workflow/system/system-sync-effects.js +2 -2
  634. package/dist/infra/workflow/system/system-sync-effects.js.map +1 -1
  635. package/dist/shared/package-info.d.ts +2 -0
  636. package/dist/shared/package-info.d.ts.map +1 -0
  637. package/dist/shared/package-info.js +5 -0
  638. package/dist/shared/package-info.js.map +1 -0
  639. package/dist/shared/prompts/en/finding_manager_instruction.md +9 -2
  640. package/dist/shared/prompts/en/opencode_review_agent_prompt.md +20 -23
  641. package/dist/shared/prompts/ja/finding_manager_instruction.md +9 -2
  642. package/dist/shared/prompts/ja/opencode_review_agent_prompt.md +20 -23
  643. package/dist/shared/utils/entrypoint.d.ts +2 -0
  644. package/dist/shared/utils/entrypoint.d.ts.map +1 -0
  645. package/dist/shared/utils/entrypoint.js +15 -0
  646. package/dist/shared/utils/entrypoint.js.map +1 -0
  647. package/dist/shared/utils/index.d.ts +1 -0
  648. package/dist/shared/utils/index.d.ts.map +1 -1
  649. package/dist/shared/utils/index.js +1 -0
  650. package/dist/shared/utils/index.js.map +1 -1
  651. package/dist/shared/utils/safeExternalErrorMessage.d.ts +2 -0
  652. package/dist/shared/utils/safeExternalErrorMessage.d.ts.map +1 -0
  653. package/dist/shared/utils/safeExternalErrorMessage.js +22 -0
  654. package/dist/shared/utils/safeExternalErrorMessage.js.map +1 -0
  655. package/package.json +29 -10
  656. package/builtins/en/facets/instructions/review-pure.md +0 -9
  657. package/builtins/en/facets/personas/pure-reviewer.md +0 -22
  658. package/builtins/ja/facets/instructions/review-pure.md +0 -9
  659. package/builtins/ja/facets/personas/pure-reviewer.md +0 -22
  660. package/dist/core/workflow/claude-effort-compatibility.d.ts +0 -3
  661. package/dist/core/workflow/claude-effort-compatibility.d.ts.map +0 -1
  662. package/dist/core/workflow/claude-effort-compatibility.js +0 -28
  663. package/dist/core/workflow/claude-effort-compatibility.js.map +0 -1
  664. package/dist/core/workflow/provider-model-compatibility.d.ts +0 -6
  665. package/dist/core/workflow/provider-model-compatibility.d.ts.map +0 -1
  666. package/dist/core/workflow/provider-model-compatibility.js +0 -20
  667. package/dist/core/workflow/provider-model-compatibility.js.map +0 -1
  668. package/dist/features/tasks/add/issueTask.d.ts +0 -7
  669. package/dist/features/tasks/add/issueTask.d.ts.map +0 -1
  670. package/dist/features/tasks/add/issueTask.js.map +0 -1
  671. package/dist/infra/config/providerModelCompatibility.d.ts +0 -2
  672. package/dist/infra/config/providerModelCompatibility.d.ts.map +0 -1
  673. package/dist/infra/config/providerModelCompatibility.js +0 -2
  674. package/dist/infra/config/providerModelCompatibility.js.map +0 -1
@@ -9,16 +9,37 @@ import { createServer } from 'node:net';
9
9
  import { loadTemplate } from '../../shared/prompts/index.js';
10
10
  import { mapsToOpenCodeEditPermission } from './allowedTools.js';
11
11
  import { AskUserQuestionDeniedError } from '../../core/workflow/ask-user-question-error.js';
12
+ import { parseLastJsonBlock } from '../../agents/structured-caller/shared.js';
12
13
  import { createLogger, getErrorMessage, createStreamDiagnostics } from '../../shared/utils/index.js';
13
14
  import { getNestedObservabilityEnvFingerprint, runWithNestedObservabilityProcessEnv, } from '../../shared/telemetry/index.js';
14
15
  import { parseProviderModel } from '../../shared/utils/providerModel.js';
15
- import { buildOpenCodePermissionRuleset, resolveOpenCodePermissionReply, } from './types.js';
16
+ import { buildOpenCodePermissionRuleset, buildOpenCodePromptTools, buildOpenCodeSessionPermission, resolveOpenCodePermissionReply, } from './types.js';
16
17
  import { createStreamTrackingState, emitInit, emitText, emitPermissionAsked, emitPermissionSummary, emitResult, handlePartUpdated, } from './OpenCodeStreamHandler.js';
17
- import { UnavailableToolLoopDetector } from './unavailable-tool-loop.js';
18
+ import { InvalidToolArgumentLoopDetector, UnavailableToolLoopDetector } from './unavailable-tool-loop.js';
18
19
  import { buildRateLimitedResponseFields, containsRateLimitError } from '../rate-limit/detection.js';
19
20
  const TAKT_AGENT = 'takt';
20
21
  const TAKT_AGENT_REVIEW = 'takt-review';
21
22
  const TAKT_AGENT_REPORT = 'takt-report';
23
+ /**
24
+ * イベントが属するセッション ID を取り出す。イベントバスはサーバ全体で
25
+ * 共有されるため、無音検出のリセットは「自セッションの進捗」だけに
26
+ * 反応させる必要がある(LSP・ファイルウォッチャ・兄弟セッションの
27
+ * イベントでリセットすると、生成が死んでいても永遠にハングする)。
28
+ */
29
+ function extractEventSessionId(event) {
30
+ const props = event.properties;
31
+ if (!props)
32
+ return undefined;
33
+ if (typeof props.sessionID === 'string')
34
+ return props.sessionID;
35
+ const part = props.part;
36
+ if (part !== undefined && typeof part.sessionID === 'string')
37
+ return part.sessionID;
38
+ const info = props.info;
39
+ if (info !== undefined && typeof info.sessionID === 'string')
40
+ return info.sessionID;
41
+ return undefined;
42
+ }
22
43
  function selectTaktAgent(allowedTools) {
23
44
  if (allowedTools !== undefined && allowedTools.length === 0) {
24
45
  return TAKT_AGENT_REPORT;
@@ -33,7 +54,11 @@ function selectTaktAgent(allowedTools) {
33
54
  return TAKT_AGENT_REVIEW;
34
55
  }
35
56
  const log = createLogger('opencode-sdk');
36
- const OPENCODE_STREAM_IDLE_TIMEOUT_MS = 10 * 60 * 1000;
57
+ /** 呼び出し時に評価する(テストや実験で env から上書きできるようにする) */
58
+ function resolveStreamIdleTimeoutMs() {
59
+ const fromEnv = Number(process.env.TAKT_OPENCODE_STREAM_IDLE_TIMEOUT_MS);
60
+ return fromEnv > 0 ? fromEnv : 10 * 60 * 1000;
61
+ }
37
62
  const OPENCODE_STREAM_ABORTED_MESSAGE = 'OpenCode execution aborted';
38
63
  const OPENCODE_RETRY_MAX_ATTEMPTS = 3;
39
64
  const OPENCODE_RETRY_BASE_DELAY_MS = 250;
@@ -95,6 +120,14 @@ async function createSharedServer(model, apiKey, childProcessEnv) {
95
120
  config: {
96
121
  model,
97
122
  small_model: model,
123
+ // Session-level permission rules are rewritten whenever a prompt
124
+ // carries a tools map (OpenCode materializes the map into
125
+ // session.permission), so session-scoped denies do not survive the
126
+ // first prompt. Server-config permission is outside that rewrite and
127
+ // is the only layer that reliably keeps out-of-workspace access a
128
+ // soft tool error instead of an ask (which would depend on the
129
+ // user's global OpenCode config).
130
+ permission: { external_directory: 'deny' },
98
131
  ...(apiKey ? { provider: { opencode: { options: { apiKey } } } } : {}),
99
132
  agent: {
100
133
  [TAKT_AGENT]: {
@@ -163,6 +196,19 @@ export async function getOpenCodeSessionSnapshot(model, sessionID, directory, ap
163
196
  release();
164
197
  }
165
198
  }
199
+ export async function getOpenCodeSessionMessages(model, sessionID, directory, apiKey) {
200
+ const { client, release } = await acquireClient(model, apiKey, undefined);
201
+ try {
202
+ const result = await client.session.messages({ sessionID, directory });
203
+ if (!result.data) {
204
+ throw new Error(`OpenCode session messages not found: ${sessionID}`);
205
+ }
206
+ return result.data;
207
+ }
208
+ finally {
209
+ release();
210
+ }
211
+ }
166
212
  function releaseClient(server) {
167
213
  const next = server.queue.shift();
168
214
  if (next) {
@@ -371,10 +417,19 @@ export class OpenCodeClient {
371
417
  }
372
418
  /** Call OpenCode with an agent prompt */
373
419
  async call(agentType, prompt, options) {
374
- for (let attempt = 1; attempt <= OPENCODE_RETRY_MAX_ATTEMPTS; attempt++) {
420
+ // native format(StructuredOutput ツール)をモデルが呼ばない個体が
421
+ // あるため、その失敗を検出したら format なし(手書き JSON + 下流の
422
+ // 是正リトライ)へフォールバックする。
423
+ let disableNativeStructuredOutput = false;
424
+ // フォールバック(format なし再試行)は transient 再試行の予算とは別枠で
425
+ // 1回だけ確保する: 先行の transient エラーで予算を使い切っていても、
426
+ // 最終試行の format 失敗から救済できるようにする。
427
+ let maxAttempts = OPENCODE_RETRY_MAX_ATTEMPTS;
428
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
375
429
  let idleTimeoutId;
376
430
  const streamAbortController = new AbortController();
377
- const timeoutMessage = `OpenCode stream timed out after ${Math.floor(OPENCODE_STREAM_IDLE_TIMEOUT_MS / 60000)} minutes of inactivity`;
431
+ const streamIdleTimeoutMs = resolveStreamIdleTimeoutMs();
432
+ const timeoutMessage = `OpenCode stream timed out after ${Math.round(streamIdleTimeoutMs / 60000)} minutes of inactivity`;
378
433
  let abortCause;
379
434
  let diagRef;
380
435
  let release;
@@ -418,9 +473,10 @@ export class OpenCodeClient {
418
473
  }
419
474
  idleTimeoutId = setTimeout(() => {
420
475
  diagRef?.onIdleTimeoutFired();
476
+ log.warn(timeoutMessage, { sessionId, model: options.model });
421
477
  abortCause = 'timeout';
422
478
  streamAbortController.abort();
423
- }, OPENCODE_STREAM_IDLE_TIMEOUT_MS);
479
+ }, streamIdleTimeoutMs);
424
480
  };
425
481
  const onExternalAbort = () => {
426
482
  abortCause = 'external';
@@ -455,23 +511,17 @@ export class OpenCodeClient {
455
511
  throw new Error(OPENCODE_STREAM_ABORTED_MESSAGE);
456
512
  }
457
513
  const permissionRuleset = buildOpenCodePermissionRuleset(options.permissionMode, options.networkAccess, options.allowedTools);
458
- const shouldCreateSession = sessionId === undefined || options.allowedTools !== undefined;
459
- const appliedPermissionRuleset = shouldCreateSession;
514
+ // The session is created once per step and reused across phases: a
515
+ // session-scoped deny can never be escalated later, and recreating the
516
+ // session drops the conversation history the report/judgment phases
517
+ // depend on. Per-phase tool restriction rides on the explicit prompt
518
+ // tools map below instead.
519
+ const appliedPermissionRuleset = sessionId === undefined;
520
+ const sessionPermission = buildOpenCodeSessionPermission(options.permissionMode, options.networkAccess, options.allowedTools);
460
521
  if (sessionId === undefined) {
461
522
  const sessionResult = await opencodeApiClient.session.create({
462
523
  directory: options.cwd,
463
- permission: permissionRuleset,
464
- });
465
- sessionId = sessionResult.data?.id;
466
- if (!sessionId) {
467
- throw new Error('Failed to create OpenCode session');
468
- }
469
- }
470
- else if (options.allowedTools !== undefined) {
471
- const sessionResult = await opencodeApiClient.session.create({
472
- directory: options.cwd,
473
- parentID: sessionId,
474
- permission: permissionRuleset,
524
+ permission: sessionPermission,
475
525
  });
476
526
  sessionId = sessionResult.data?.id;
477
527
  if (!sessionId) {
@@ -491,21 +541,32 @@ export class OpenCodeClient {
491
541
  ...(options.permissionMode !== undefined ? { permissionMode: options.permissionMode } : {}),
492
542
  ...(options.allowedTools !== undefined ? { allowedTools: options.allowedTools } : {}),
493
543
  ...(options.networkAccess !== undefined ? { networkAccess: options.networkAccess } : {}),
494
- resolvedPermissions: permissionRuleset,
544
+ resolvedPermissions: sessionPermission,
495
545
  });
496
546
  }
497
547
  const agentName = selectTaktAgent(options.allowedTools);
548
+ // OpenCode persists the last explicit tools map on the session, so
549
+ // every prompt sends the full map for its own phase (see
550
+ // buildOpenCodePromptTools).
551
+ const promptTools = buildOpenCodePromptTools(options.permissionMode, options.networkAccess, options.allowedTools);
498
552
  log.debug('Selecting OpenCode agent', {
499
553
  agentName,
500
554
  allowedTools: options.allowedTools,
555
+ promptTools,
501
556
  });
502
557
  const promptPayload = {
503
558
  sessionID: activeSessionId,
504
559
  directory: options.cwd,
505
560
  model: parsedModel,
561
+ tools: promptTools,
506
562
  ...(agentName !== undefined ? { agent: agentName } : {}),
507
563
  ...(options.variant !== undefined ? { variant: options.variant } : {}),
508
564
  ...(options.systemPrompt !== undefined ? { system: options.systemPrompt } : {}),
565
+ // ネイティブ構造化出力: OpenCode がスキーマのキー構造を強制する
566
+ // (enum 等の値制約までは保証されないため、下流のスキーマ検証は維持)。
567
+ ...(options.outputSchema !== undefined && !disableNativeStructuredOutput
568
+ ? { format: { type: 'json_schema', schema: options.outputSchema, retryCount: 2 } }
569
+ : {}),
509
570
  parts: [{ type: 'text', text: prompt }],
510
571
  };
511
572
  const promptPayloadForSdk = promptPayload;
@@ -521,9 +582,11 @@ export class OpenCodeClient {
521
582
  emitInit(options.onStream, options.model, activeSessionId);
522
583
  let content = '';
523
584
  let success = true;
585
+ let capturedStructuredOutput;
524
586
  let failureMessage = '';
525
587
  const state = createStreamTrackingState();
526
588
  const unavailableToolLoopDetector = new UnavailableToolLoopDetector();
589
+ const invalidArgumentLoopDetector = new InvalidToolArgumentLoopDetector();
527
590
  const echoState = { remainingPrompts: buildPromptEchoCandidates(prompt, options.systemPrompt) };
528
591
  const textOffsets = new Map();
529
592
  const textContentParts = new Map();
@@ -544,198 +607,267 @@ export class OpenCodeClient {
544
607
  const prevOffset = textOffsets.get(partId) ?? 0;
545
608
  textOffsets.set(partId, prevOffset + rawDelta.length);
546
609
  };
547
- for await (const event of stream) {
548
- if (streamAbortController.signal.aborted)
549
- break;
550
- resetIdleTimeout();
551
- const sseEvent = event;
552
- diag.onFirstEvent(sseEvent.type);
553
- diag.onEvent(sseEvent.type);
554
- if (sseEvent.type === 'message.part.updated') {
555
- const props = sseEvent.properties;
556
- const part = props.part;
557
- const delta = props.delta;
558
- if (part.type === 'text') {
559
- unavailableToolLoopDetector.reset();
560
- const textPart = part;
561
- const prev = textOffsets.get(textPart.id) ?? 0;
562
- const rawDelta = delta
563
- ?? (textPart.text.length > prev ? textPart.text.slice(prev) : '');
564
- consumeTextDelta(textPart.id, rawDelta);
565
- continue;
610
+ // for-await 単体だと、タイマーが abort してもイベントが来るまで
611
+ // 待ちから戻らない(SDK が signal を尊重しない場合は永久待機)。
612
+ // イテレータと abort をレースさせ、タイマー発火で必ず脱出する。
613
+ const streamIterator = stream[Symbol.asyncIterator]();
614
+ const streamAborted = new Promise((_, reject) => {
615
+ streamAbortController.signal.addEventListener('abort', () => {
616
+ reject(new Error(timeoutMessage));
617
+ }, { once: true });
618
+ });
619
+ streamAborted.catch(() => { });
620
+ try {
621
+ while (true) {
622
+ if (streamAbortController.signal.aborted)
623
+ break;
624
+ let iteration;
625
+ try {
626
+ iteration = await Promise.race([streamIterator.next(), streamAborted]);
566
627
  }
567
- if (part.type === 'tool') {
568
- const toolPart = part;
569
- const loopError = toolPart.state.status === 'error'
570
- ? unavailableToolLoopDetector.observe(toolPart.callID || toolPart.id, toolPart.tool, toolPart.state.error)
571
- : undefined;
572
- if (toolPart.state.status === 'completed') {
573
- unavailableToolLoopDetector.reset();
574
- }
575
- handlePartUpdated(part, delta, options.onStream, state);
576
- if (loopError !== undefined) {
577
- success = false;
578
- failureMessage = loopError;
579
- diag.onStreamError('message.part.updated', loopError);
628
+ catch (raceError) {
629
+ if (streamAbortController.signal.aborted)
580
630
  break;
581
- }
631
+ throw raceError;
632
+ }
633
+ if (iteration.done)
634
+ break;
635
+ const event = iteration.value;
636
+ const sseEvent = event;
637
+ // セッション帰属が判明していて自分でないイベントは処理しない。
638
+ // サーバプールは同一モデルで共有されるため(並列レビュー等)、
639
+ // 兄弟セッションの text/tool 更新を通すと content と検出器が
640
+ // 汚染される。帰属不明のイベントは種別ごとの処理に委ねるが、
641
+ // 無音検出のリセット(延命)は自セッションのイベントに限る。
642
+ const eventSessionId = extractEventSessionId(sseEvent);
643
+ if (eventSessionId !== undefined && eventSessionId !== activeSessionId) {
582
644
  continue;
583
645
  }
584
- handlePartUpdated(part, delta, options.onStream, state);
585
- continue;
586
- }
587
- if (sseEvent.type === 'message.part.delta') {
588
- const deltaProps = sseEvent.properties;
589
- if (deltaProps.field === 'text' && deltaProps.delta) {
590
- unavailableToolLoopDetector.reset();
591
- consumeTextDelta(deltaProps.partID, deltaProps.delta);
646
+ if (eventSessionId === activeSessionId) {
647
+ resetIdleTimeout();
592
648
  }
593
- continue;
594
- }
595
- if (sseEvent.type === 'permission.asked') {
596
- const permProps = sseEvent.properties;
597
- if (permProps.sessionID === activeSessionId) {
598
- try {
599
- const reply = resolveOpenCodePermissionReply(options.permissionMode, permProps.permission, options.allowedTools !== undefined ? permissionRuleset : undefined);
600
- emitPermissionAsked(options.onStream, {
601
- requestId: permProps.id,
602
- sessionId: permProps.sessionID,
603
- permission: permProps.permission ?? '',
604
- patterns: Array.isArray(permProps.patterns) ? permProps.patterns : [],
605
- always: Array.isArray(permProps.always) ? permProps.always : [],
606
- reply,
607
- });
608
- await withTimeout((signal) => opencodeApiClient.permission.reply({
609
- requestID: permProps.id,
610
- directory: options.cwd,
611
- reply,
612
- }, { signal }), interactionTimeoutMs, 'OpenCode permission reply timed out');
613
- if (reply === 'reject') {
649
+ diag.onFirstEvent(sseEvent.type);
650
+ diag.onEvent(sseEvent.type);
651
+ if (sseEvent.type === 'message.part.updated') {
652
+ const props = sseEvent.properties;
653
+ const part = props.part;
654
+ const delta = props.delta;
655
+ if (part.type === 'text') {
656
+ unavailableToolLoopDetector.reset();
657
+ const textPart = part;
658
+ const prev = textOffsets.get(textPart.id) ?? 0;
659
+ const rawDelta = delta
660
+ ?? (textPart.text.length > prev ? textPart.text.slice(prev) : '');
661
+ consumeTextDelta(textPart.id, rawDelta);
662
+ continue;
663
+ }
664
+ if (part.type === 'tool') {
665
+ const toolPart = part;
666
+ let loopError;
667
+ if (toolPart.state.status === 'error') {
668
+ // 両検出器に必ず観測させる(?? 短絡だと invalid 側が
669
+ // unavailable エラーを見逃し、連続性の判定が狂う)
670
+ const unavailableError = unavailableToolLoopDetector.observe(toolPart.callID || toolPart.id, toolPart.tool, toolPart.state.error);
671
+ const invalidArgumentError = invalidArgumentLoopDetector.observe(toolPart.callID || toolPart.id, toolPart.tool, toolPart.state.error);
672
+ loopError = unavailableError ?? invalidArgumentError;
673
+ }
674
+ if (toolPart.state.status === 'completed') {
675
+ unavailableToolLoopDetector.reset();
676
+ invalidArgumentLoopDetector.reset();
677
+ }
678
+ handlePartUpdated(part, delta, options.onStream, state);
679
+ if (loopError !== undefined) {
614
680
  success = false;
615
- failureMessage = buildPermissionRejectedMessage(permProps.permission);
681
+ failureMessage = loopError;
682
+ diag.onStreamError('message.part.updated', loopError);
616
683
  break;
617
684
  }
685
+ continue;
618
686
  }
619
- catch (e) {
620
- success = false;
621
- failureMessage = getErrorMessage(e);
622
- break;
687
+ handlePartUpdated(part, delta, options.onStream, state);
688
+ continue;
689
+ }
690
+ if (sseEvent.type === 'message.part.delta') {
691
+ const deltaProps = sseEvent.properties;
692
+ if (deltaProps.field === 'text' && deltaProps.delta) {
693
+ unavailableToolLoopDetector.reset();
694
+ consumeTextDelta(deltaProps.partID, deltaProps.delta);
623
695
  }
696
+ continue;
624
697
  }
625
- continue;
626
- }
627
- if (sseEvent.type === 'question.asked') {
628
- const questionProps = sseEvent.properties;
629
- if (questionProps.sessionID === activeSessionId) {
630
- const rejectQuestion = () => withTimeout((signal) => opencodeApiClient.question.reject({
631
- requestID: questionProps.id,
632
- directory: options.cwd,
633
- }, { signal }), interactionTimeoutMs, 'OpenCode question reject timed out');
634
- if (!options.onAskUserQuestion) {
698
+ if (sseEvent.type === 'permission.asked') {
699
+ const permProps = sseEvent.properties;
700
+ if (permProps.sessionID === activeSessionId) {
635
701
  try {
636
- await rejectQuestion();
702
+ const reply = resolveOpenCodePermissionReply(options.permissionMode, permProps.permission, options.allowedTools !== undefined ? permissionRuleset : undefined);
703
+ emitPermissionAsked(options.onStream, {
704
+ requestId: permProps.id,
705
+ sessionId: permProps.sessionID,
706
+ permission: permProps.permission ?? '',
707
+ patterns: Array.isArray(permProps.patterns) ? permProps.patterns : [],
708
+ always: Array.isArray(permProps.always) ? permProps.always : [],
709
+ reply,
710
+ });
711
+ await withTimeout((signal) => opencodeApiClient.permission.reply({
712
+ requestID: permProps.id,
713
+ directory: options.cwd,
714
+ reply,
715
+ }, { signal }), interactionTimeoutMs, 'OpenCode permission reply timed out');
716
+ if (reply === 'reject') {
717
+ // A rejected permission is a per-tool failure, not a fatal
718
+ // one: OpenCode returns the rejection to the model as a tool
719
+ // error and generation continues (verified against a live
720
+ // server). Aborting here used to turn a single stray
721
+ // out-of-workspace access into a whole-step failure.
722
+ log.info(buildPermissionRejectedMessage(permProps.permission), {
723
+ permission: permProps.permission,
724
+ patterns: permProps.patterns,
725
+ });
726
+ }
637
727
  }
638
728
  catch (e) {
639
729
  success = false;
640
730
  failureMessage = getErrorMessage(e);
641
731
  break;
642
732
  }
643
- continue;
644
733
  }
645
- try {
646
- const answers = await options.onAskUserQuestion(toQuestionInput(questionProps));
647
- await withTimeout((signal) => opencodeApiClient.question.reply({
734
+ continue;
735
+ }
736
+ if (sseEvent.type === 'question.asked') {
737
+ const questionProps = sseEvent.properties;
738
+ if (questionProps.sessionID === activeSessionId) {
739
+ const rejectQuestion = () => withTimeout((signal) => opencodeApiClient.question.reject({
648
740
  requestID: questionProps.id,
649
741
  directory: options.cwd,
650
- answers: toQuestionAnswers(questionProps, answers),
651
- }, { signal }), interactionTimeoutMs, 'OpenCode question reply timed out');
652
- }
653
- catch (e) {
654
- if (e instanceof AskUserQuestionDeniedError) {
742
+ }, { signal }), interactionTimeoutMs, 'OpenCode question reject timed out');
743
+ if (!options.onAskUserQuestion) {
655
744
  try {
656
745
  await rejectQuestion();
657
746
  }
658
- catch (rejectErr) {
747
+ catch (e) {
748
+ success = false;
749
+ failureMessage = getErrorMessage(e);
750
+ break;
751
+ }
752
+ continue;
753
+ }
754
+ try {
755
+ const answers = await options.onAskUserQuestion(toQuestionInput(questionProps));
756
+ await withTimeout((signal) => opencodeApiClient.question.reply({
757
+ requestID: questionProps.id,
758
+ directory: options.cwd,
759
+ answers: toQuestionAnswers(questionProps, answers),
760
+ }, { signal }), interactionTimeoutMs, 'OpenCode question reply timed out');
761
+ }
762
+ catch (e) {
763
+ if (e instanceof AskUserQuestionDeniedError) {
764
+ try {
765
+ await rejectQuestion();
766
+ }
767
+ catch (rejectErr) {
768
+ success = false;
769
+ failureMessage = getErrorMessage(rejectErr);
770
+ break;
771
+ }
772
+ }
773
+ else {
659
774
  success = false;
660
- failureMessage = getErrorMessage(rejectErr);
775
+ failureMessage = getErrorMessage(e);
661
776
  break;
662
777
  }
663
778
  }
664
- else {
779
+ }
780
+ continue;
781
+ }
782
+ if (sseEvent.type === 'message.updated') {
783
+ const messageProps = sseEvent.properties;
784
+ const info = messageProps.info;
785
+ const isCurrentAssistantMessage = info?.sessionID === activeSessionId && info?.role === 'assistant';
786
+ if (isCurrentAssistantMessage) {
787
+ if (info?.structured !== undefined && info.structured !== null && typeof info.structured === 'object' && !Array.isArray(info.structured)) {
788
+ capturedStructuredOutput = info.structured;
789
+ }
790
+ const streamError = extractOpenCodeErrorMessage(info?.error);
791
+ if (streamError) {
665
792
  success = false;
666
- failureMessage = getErrorMessage(e);
793
+ failureMessage = streamError;
794
+ diag.onStreamError('message.updated', streamError);
667
795
  break;
668
796
  }
669
797
  }
798
+ continue;
670
799
  }
671
- continue;
672
- }
673
- if (sseEvent.type === 'message.updated') {
674
- const messageProps = sseEvent.properties;
675
- const info = messageProps.info;
676
- const isCurrentAssistantMessage = info?.sessionID === activeSessionId && info?.role === 'assistant';
677
- if (isCurrentAssistantMessage) {
678
- const streamError = extractOpenCodeErrorMessage(info?.error);
679
- if (streamError) {
680
- success = false;
681
- failureMessage = streamError;
682
- diag.onStreamError('message.updated', streamError);
683
- break;
800
+ if (sseEvent.type === 'message.completed') {
801
+ const completedProps = sseEvent.properties;
802
+ const info = completedProps.info;
803
+ const isCurrentAssistantMessage = info?.sessionID === activeSessionId && info?.role === 'assistant';
804
+ if (isCurrentAssistantMessage) {
805
+ if (info?.structured !== undefined && info.structured !== null && typeof info.structured === 'object' && !Array.isArray(info.structured)) {
806
+ capturedStructuredOutput = info.structured;
807
+ }
808
+ const streamError = extractOpenCodeErrorMessage(info?.error);
809
+ if (streamError) {
810
+ success = false;
811
+ failureMessage = streamError;
812
+ diag.onStreamError('message.completed', streamError);
813
+ break;
814
+ }
684
815
  }
816
+ continue;
685
817
  }
686
- continue;
687
- }
688
- if (sseEvent.type === 'message.completed') {
689
- const completedProps = sseEvent.properties;
690
- const info = completedProps.info;
691
- const isCurrentAssistantMessage = info?.sessionID === activeSessionId && info?.role === 'assistant';
692
- if (isCurrentAssistantMessage) {
693
- const streamError = extractOpenCodeErrorMessage(info?.error);
694
- if (streamError) {
818
+ if (sseEvent.type === 'message.failed') {
819
+ const failedProps = sseEvent.properties;
820
+ const info = failedProps.info;
821
+ const isCurrentAssistantMessage = info?.sessionID === activeSessionId && info?.role === 'assistant';
822
+ if (isCurrentAssistantMessage) {
695
823
  success = false;
696
- failureMessage = streamError;
697
- diag.onStreamError('message.completed', streamError);
824
+ failureMessage = extractOpenCodeErrorMessage(info?.error) ?? 'OpenCode message failed';
825
+ diag.onStreamError('message.failed', failureMessage);
698
826
  break;
699
827
  }
828
+ continue;
700
829
  }
701
- continue;
702
- }
703
- if (sseEvent.type === 'message.failed') {
704
- const failedProps = sseEvent.properties;
705
- const info = failedProps.info;
706
- const isCurrentAssistantMessage = info?.sessionID === activeSessionId && info?.role === 'assistant';
707
- if (isCurrentAssistantMessage) {
708
- success = false;
709
- failureMessage = extractOpenCodeErrorMessage(info?.error) ?? 'OpenCode message failed';
710
- diag.onStreamError('message.failed', failureMessage);
711
- break;
830
+ if (sseEvent.type === 'session.status') {
831
+ const statusProps = sseEvent.properties;
832
+ if (statusProps.sessionID === activeSessionId && statusProps.status?.type === 'idle') {
833
+ break;
834
+ }
835
+ continue;
712
836
  }
713
- continue;
714
- }
715
- if (sseEvent.type === 'session.status') {
716
- const statusProps = sseEvent.properties;
717
- if (statusProps.sessionID === activeSessionId && statusProps.status?.type === 'idle') {
718
- break;
837
+ if (sseEvent.type === 'session.idle') {
838
+ const idleProps = sseEvent.properties;
839
+ if (idleProps.sessionID === activeSessionId) {
840
+ break;
841
+ }
842
+ continue;
719
843
  }
720
- continue;
721
- }
722
- if (sseEvent.type === 'session.idle') {
723
- const idleProps = sseEvent.properties;
724
- if (idleProps.sessionID === activeSessionId) {
725
- break;
844
+ if (sseEvent.type === 'session.error') {
845
+ const errorProps = sseEvent.properties;
846
+ if (!errorProps.sessionID || errorProps.sessionID === activeSessionId) {
847
+ success = false;
848
+ failureMessage = extractOpenCodeErrorMessage(errorProps.error) ?? 'OpenCode session error';
849
+ diag.onStreamError('session.error', failureMessage);
850
+ break;
851
+ }
852
+ continue;
726
853
  }
727
- continue;
728
854
  }
729
- if (sseEvent.type === 'session.error') {
730
- const errorProps = sseEvent.properties;
731
- if (!errorProps.sessionID || errorProps.sessionID === activeSessionId) {
732
- success = false;
733
- failureMessage = extractOpenCodeErrorMessage(errorProps.error) ?? 'OpenCode session error';
734
- diag.onStreamError('session.error', failureMessage);
735
- break;
736
- }
737
- continue;
855
+ }
856
+ finally {
857
+ // for-await break 時に行っていた後始末(SSE クローズ)を再現する
858
+ try {
859
+ await streamIterator.return?.(undefined);
738
860
  }
861
+ catch { /* クローズ失敗は結果に影響させない */ }
862
+ }
863
+ // The idle watchdog and external aborts cancel the stream. If the
864
+ // iterator ends without throwing, the loop falls through with
865
+ // success still true - do not let a timed-out or aborted stream
866
+ // pass as a completed call (a stalled stream after a rejected
867
+ // permission would otherwise be reported as done).
868
+ if (success && streamAbortController.signal.aborted && (abortCause === 'timeout' || abortCause === 'external')) {
869
+ success = false;
870
+ failureMessage = abortCause === 'timeout' ? timeoutMessage : OPENCODE_STREAM_ABORTED_MESSAGE;
739
871
  }
740
872
  content = [...textContentParts.values()].join('\n');
741
873
  if (!success && !streamAbortController.signal.aborted) {
@@ -759,6 +891,27 @@ export class OpenCodeClient {
759
891
  emitResult(options.onStream, false, rateLimitedResponse.error ?? rateLimitedResponse.content, activeSessionId);
760
892
  return rateLimitedResponse;
761
893
  }
894
+ const lowerMessage = message.toLowerCase();
895
+ // Failures that point at the native json_schema request itself: a
896
+ // model that never emits the StructuredOutput tool ("did not produce
897
+ // structured output"), or a gateway/model that rejects the json_schema
898
+ // response format outright (surfaced as an upstream request error).
899
+ // These fall back to formatless structured output; generic transient
900
+ // errors (transport/network) must not, or they would burn the one-shot
901
+ // fallback budget before a real format failure arrives.
902
+ const isNativeStructuredOutputFailure = lowerMessage.includes('did not produce structured output')
903
+ || lowerMessage.includes('upstream request failed');
904
+ if (options.outputSchema !== undefined
905
+ && !disableNativeStructuredOutput
906
+ && isNativeStructuredOutputFailure) {
907
+ // Fall back to formatless structured output once — hand-written JSON
908
+ // validated by the downstream correction retry — before giving up.
909
+ disableNativeStructuredOutput = true;
910
+ maxAttempts = Math.max(maxAttempts, attempt + 1);
911
+ log.info('Native structured output failed; retrying without json_schema format', { agentType, attempt, message });
912
+ await this.waitForRetryDelay(attempt, options.abortSignal);
913
+ continue;
914
+ }
762
915
  const retriable = this.isRetriableError(message, streamAbortController.signal.aborted, abortCause);
763
916
  if (retriable && attempt < OPENCODE_RETRY_MAX_ATTEMPTS) {
764
917
  log.info('Retrying OpenCode call after transient failure', { agentType, attempt, message });
@@ -770,18 +923,41 @@ export class OpenCodeClient {
770
923
  persona: agentType,
771
924
  status: 'error',
772
925
  content: message,
926
+ error: message,
773
927
  timestamp: new Date(),
774
928
  sessionId: activeSessionId,
775
929
  };
776
930
  }
777
931
  const trimmed = content.trim();
778
932
  emitResult(options.onStream, true, trimmed, activeSessionId);
933
+ // format 要求時に structured がイベントで捕捉できなかった場合は、
934
+ // 本文の末尾 JSON をフォールバックとして採取する(検証は下流で行う)。
935
+ if (capturedStructuredOutput === undefined && options.outputSchema !== undefined) {
936
+ try {
937
+ const parsed = parseLastJsonBlock(trimmed);
938
+ if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
939
+ capturedStructuredOutput = parsed;
940
+ }
941
+ else {
942
+ log.debug('Structured output fallback found non-object JSON', { agentType });
943
+ }
944
+ }
945
+ catch (fallbackError) {
946
+ // フォールバック採取の失敗は握りつぶすが、調査用に痕跡は残す
947
+ // (下流の検証と是正リトライに委ねる)。
948
+ log.debug('Structured output fallback extraction failed', {
949
+ agentType,
950
+ error: getErrorMessage(fallbackError),
951
+ });
952
+ }
953
+ }
779
954
  return {
780
955
  persona: agentType,
781
956
  status: 'done',
782
957
  content: trimmed,
783
958
  timestamp: new Date(),
784
959
  sessionId: activeSessionId,
960
+ ...(capturedStructuredOutput !== undefined ? { structuredOutput: capturedStructuredOutput } : {}),
785
961
  };
786
962
  }
787
963
  catch (error) {
@@ -814,6 +990,7 @@ export class OpenCodeClient {
814
990
  persona: agentType,
815
991
  status: 'error',
816
992
  content: errorMessage,
993
+ error: errorMessage,
817
994
  timestamp: new Date(),
818
995
  sessionId,
819
996
  };