@chorus-aidlc/chorus 0.17.0 → 0.17.2

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 (481) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +519 -519
  3. package/.next/standalone/.next/app-path-routes-manifest.json +44 -44
  4. package/.next/standalone/.next/build-manifest.json +6 -6
  5. package/.next/standalone/.next/prerender-manifest.json +45 -45
  6. package/.next/standalone/.next/react-loadable-manifest.json +1 -1
  7. package/.next/standalone/.next/required-server-files.json +4 -4
  8. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +2 -2
  9. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +2 -2
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +2 -2
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +2 -2
  39. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  40. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +2 -2
  42. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  43. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +3 -3
  45. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
  46. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
  48. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  49. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
  51. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  53. package/.next/standalone/.next/server/app/_not-found.rsc +5 -5
  54. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page.js +2 -2
  55. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page.js.nft.json +1 -1
  56. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app/admin/companies/new/page.js +2 -2
  58. package/.next/standalone/.next/server/app/admin/companies/new/page.js.nft.json +1 -1
  59. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
  61. package/.next/standalone/.next/server/app/admin/companies/new.rsc +7 -7
  62. package/.next/standalone/.next/server/app/admin/companies/page.js +2 -2
  63. package/.next/standalone/.next/server/app/admin/companies/page.js.nft.json +1 -1
  64. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/admin/companies.html +2 -2
  66. package/.next/standalone/.next/server/app/admin/companies.rsc +7 -7
  67. package/.next/standalone/.next/server/app/admin/page.js +2 -2
  68. package/.next/standalone/.next/server/app/admin/page.js.nft.json +1 -1
  69. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/admin.html +2 -2
  71. package/.next/standalone/.next/server/app/admin.rsc +7 -7
  72. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route.js +1 -1
  73. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/admin/companies/route.js +1 -1
  75. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/admin/login/route.js +1 -1
  77. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/admin/session/route.js +1 -1
  79. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/agent-connections/route.js +1 -1
  81. package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/agents/[uuid]/route.js +1 -1
  83. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
  85. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/agents/route.js +1 -1
  87. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route.js +1 -1
  89. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/api-keys/route.js +1 -1
  91. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/auth/callback/route.js +1 -1
  93. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/auth/check-default/route.js +1 -1
  95. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/auth/company-oidc/route.js +1 -1
  97. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/auth/default-login/route.js +1 -1
  99. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/auth/identify/route.js +1 -1
  101. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/auth/logout/route.js +1 -1
  103. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/api/auth/me/route.js +1 -1
  105. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/auth/sync-token/route.js +1 -1
  107. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
  109. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js +1 -1
  111. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/daemon/control/route.js +1 -1
  113. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route.js +1 -1
  115. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js +1 -1
  117. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/daemon/executions/route.js +1 -1
  119. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -1
  121. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js +1 -1
  123. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -1
  125. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -1
  127. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
  129. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route.js +1 -1
  131. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route.js +1 -1
  133. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -1
  135. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js +1 -1
  137. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -1
  139. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -1
  141. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -1
  143. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js +1 -1
  145. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  146. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js +1 -1
  147. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/events/notifications/route.js +1 -1
  149. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/events/route.js +14 -6
  151. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/health/route.js +1 -1
  153. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  155. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
  157. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
  159. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js +1 -1
  161. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
  163. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
  165. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route.js +1 -1
  167. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  168. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js +1 -1
  169. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/api/mcp/route.js +4 -4
  171. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  172. package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
  173. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
  175. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js +1 -1
  177. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  178. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js +1 -1
  179. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  180. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js +1 -1
  181. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js +1 -1
  183. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  184. package/.next/standalone/.next/server/app/api/notifications/route.js +1 -1
  185. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  186. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js +1 -1
  187. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js +1 -1
  189. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  190. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js +1 -1
  191. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  192. package/.next/standalone/.next/server/app/api/project-groups/route.js +1 -1
  193. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  194. package/.next/standalone/.next/server/app/api/project-visits/pin/route.js +1 -1
  195. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  196. package/.next/standalone/.next/server/app/api/project-visits/route.js +1 -1
  197. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  198. package/.next/standalone/.next/server/app/api/project-visits/visit/route.js +1 -1
  199. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  200. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route.js +1 -1
  201. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  202. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route.js +1 -1
  203. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
  204. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  205. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  206. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js +1 -1
  207. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  208. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js +1 -1
  209. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  210. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
  211. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  212. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
  213. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  214. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
  215. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  216. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
  217. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  218. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
  219. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  220. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js +1 -1
  221. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  222. package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js +1 -1
  223. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  224. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js +1 -1
  225. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  226. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
  227. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  228. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
  229. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  230. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route.js +1 -1
  231. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
  232. package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
  233. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  234. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
  235. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  236. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
  237. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  238. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
  239. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  240. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
  241. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  242. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
  243. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  244. package/.next/standalone/.next/server/app/api/references/[uuid]/route.js +1 -1
  245. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  246. package/.next/standalone/.next/server/app/api/references/route.js +1 -1
  247. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  248. package/.next/standalone/.next/server/app/api/search/route.js +1 -1
  249. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  250. package/.next/standalone/.next/server/app/api/session/route.js +1 -1
  251. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  252. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
  253. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
  255. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  256. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
  257. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  258. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
  259. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  260. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
  261. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  262. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
  263. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  264. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
  265. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/app/favicon.ico/route.js +1 -1
  267. package/.next/standalone/.next/server/app/index.html +2 -2
  268. package/.next/standalone/.next/server/app/index.rsc +6 -6
  269. package/.next/standalone/.next/server/app/login/admin/page.js +2 -2
  270. package/.next/standalone/.next/server/app/login/admin/page.js.nft.json +1 -1
  271. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  272. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  273. package/.next/standalone/.next/server/app/login/admin.rsc +6 -6
  274. package/.next/standalone/.next/server/app/login/callback/page.js +2 -2
  275. package/.next/standalone/.next/server/app/login/callback/page.js.nft.json +1 -1
  276. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  277. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  278. package/.next/standalone/.next/server/app/login/callback.rsc +6 -6
  279. package/.next/standalone/.next/server/app/login/page.js +2 -2
  280. package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
  281. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  282. package/.next/standalone/.next/server/app/login/pick-workspace/page.js +2 -2
  283. package/.next/standalone/.next/server/app/login/pick-workspace/page.js.nft.json +1 -1
  284. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  285. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  286. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +6 -6
  287. package/.next/standalone/.next/server/app/login.html +2 -2
  288. package/.next/standalone/.next/server/app/login.rsc +6 -6
  289. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  290. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  291. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  292. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  293. package/.next/standalone/.next/server/app/onboarding.rsc +6 -6
  294. package/.next/standalone/.next/server/app/page.js +2 -2
  295. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  296. package/.next/standalone/.next/server/app/projects.html +2 -2
  297. package/.next/standalone/.next/server/app/projects.rsc +7 -7
  298. package/.next/standalone/.next/server/app/settings.html +2 -2
  299. package/.next/standalone/.next/server/app/settings.rsc +7 -7
  300. package/.next/standalone/.next/server/app-paths-manifest.json +44 -44
  301. package/.next/standalone/.next/server/chunks/1114.js +1 -1
  302. package/.next/standalone/.next/server/chunks/1267.js +1 -0
  303. package/.next/standalone/.next/server/chunks/1318.js +1 -1
  304. package/.next/standalone/.next/server/chunks/1559.js +2 -2
  305. package/.next/standalone/.next/server/chunks/{3831.js → 2536.js} +6 -4
  306. package/.next/standalone/.next/server/chunks/2570.js +2 -2
  307. package/.next/standalone/.next/server/chunks/2572.js +1 -1
  308. package/.next/standalone/.next/server/chunks/2940.js +1 -1
  309. package/.next/standalone/.next/server/chunks/2953.js +1 -0
  310. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  311. package/.next/standalone/.next/server/chunks/3197.js +1 -1
  312. package/.next/standalone/.next/server/chunks/378.js +4 -4
  313. package/.next/standalone/.next/server/chunks/4827.js +1 -1
  314. package/.next/standalone/.next/server/chunks/5162.js +1 -0
  315. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  316. package/.next/standalone/.next/server/chunks/{5706.js → 6080.js} +1 -1
  317. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  318. package/.next/standalone/.next/server/chunks/6145.js +1 -0
  319. package/.next/standalone/.next/server/chunks/6506.js +1 -1
  320. package/.next/standalone/.next/server/chunks/6515.js +2 -2
  321. package/.next/standalone/.next/server/chunks/6689.js +1 -0
  322. package/.next/standalone/.next/server/chunks/6753.js +3 -3
  323. package/.next/standalone/.next/server/chunks/679.js +1 -1
  324. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  325. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  326. package/.next/standalone/.next/server/chunks/8454.js +1 -1
  327. package/.next/standalone/.next/server/chunks/920.js +1 -1
  328. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  329. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  330. package/.next/standalone/.next/server/chunks/9667.js +1 -0
  331. package/.next/standalone/.next/server/chunks/9931.js +1 -0
  332. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  333. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  334. package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  335. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  336. package/.next/standalone/.next/server/next-font-manifest.json +1 -1
  337. package/.next/standalone/.next/server/pages/404.html +2 -2
  338. package/.next/standalone/.next/server/pages/500.html +1 -1
  339. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  340. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  341. package/.next/standalone/.next/server/src/middleware.js +2 -2
  342. package/.next/standalone/.next/static/chunks/{11595.bbe40924d18958bf.js → 11595.b81c0bf7732c3b62.js} +1 -1
  343. package/.next/standalone/.next/static/chunks/24808-e3d95efc7ec039c5.js +1 -0
  344. package/.next/standalone/.next/static/chunks/{31308-bb4a97b3f39c22dd.js → 31308-32614efb88305738.js} +1 -1
  345. package/.next/standalone/.next/static/chunks/{33456.5499eb8e892b110a.js → 33456.cfc9aa607a62e879.js} +1 -1
  346. package/.next/standalone/.next/static/chunks/38366.fb931fab9c756890.js +1 -0
  347. package/.next/standalone/.next/static/chunks/{4860.be77046fb2b3a2bd.js → 4860.41351a823cf400e4.js} +1 -1
  348. package/.next/standalone/.next/static/chunks/51468-194d894e563580dd.js +1 -0
  349. package/.next/standalone/.next/static/chunks/61570-527701d072d00a24.js +1 -0
  350. package/.next/standalone/.next/static/chunks/65066-6da35d5cb080c7f5.js +1 -0
  351. package/.next/standalone/.next/static/chunks/{65096-f756aac39efad7a3.js → 65096-8295f53f97c40d47.js} +1 -1
  352. package/.next/standalone/.next/static/chunks/72875-0987d09cd8406614.js +1 -0
  353. package/.next/standalone/.next/static/chunks/75936-79860953212592fd.js +1 -0
  354. package/.next/standalone/.next/static/chunks/{78917-a8a8dff98857c045.js → 79919-e02963faee5cb563.js} +1 -1
  355. package/.next/standalone/.next/static/chunks/94643-e8f5fa25e2340cc8.js +1 -0
  356. package/.next/standalone/.next/static/chunks/{99373.111493dc260a2a04.js → 99373.633f7c25e64bcdac.js} +1 -1
  357. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-bb5ef11586301c72.js +1 -0
  358. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/{page-974781e4886529f8.js → page-82e90e222d6bc547.js} +1 -1
  359. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/activity/page-f1eccb50d38d8982.js +1 -0
  360. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-eecb38fa4b8eb4e8.js +1 -0
  361. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-725373108da1b08c.js +1 -0
  362. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-cd7ec77596304a07.js +1 -0
  363. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-97a9e6f949002004.js +1 -0
  364. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-7d2f4713697eb0a7.js +1 -0
  365. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-cec15f4b835d34fc.js +1 -0
  366. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0225f87552b977d9.js +1 -0
  367. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-15bb6e1696668512.js → page-4ee117e690fda56f.js} +1 -1
  368. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-2bea97214b1595cc.js → page-7fbc46dfb7b22bd3.js} +1 -1
  369. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/page-069c9738e516436b.js +1 -0
  370. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-8b30678a58e7b2ee.js +1 -0
  371. package/.next/standalone/.next/static/chunks/app/_not-found/{page-166b410da84336d4.js → page-b9d672df79b35e87.js} +1 -1
  372. package/.next/standalone/.next/static/chunks/app/admin/companies/[uuid]/{page-b2458ed001dc8177.js → page-56118c51122ad639.js} +1 -1
  373. package/.next/standalone/.next/static/chunks/app/admin/companies/new/page-4e20deb41357171c.js +1 -0
  374. package/.next/standalone/.next/static/chunks/app/admin/companies/page-0632f245bf9c1c27.js +1 -0
  375. package/.next/standalone/.next/static/chunks/app/admin/layout-725ab2331c642f36.js +1 -0
  376. package/.next/standalone/.next/static/chunks/app/admin/{page-0cc8cf246db43e5d.js → page-5a0271dd2b8b36fd.js} +1 -1
  377. package/.next/standalone/.next/static/chunks/app/{layout-985054e973f66999.js → layout-098288cec4490c5d.js} +1 -1
  378. package/.next/standalone/.next/static/chunks/app/login/admin/page-c8e40259e5d3d9e0.js +1 -0
  379. package/.next/standalone/.next/static/chunks/app/login/callback/page-527652f6c1a39274.js +1 -0
  380. package/.next/standalone/.next/static/chunks/app/login/{page-9b34375d1b5579d7.js → page-0a16a64855b771ef.js} +1 -1
  381. package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-47375a86e2375202.js +1 -0
  382. package/.next/standalone/.next/static/chunks/app/onboarding/{page-540da64d7ba16dc7.js → page-4fce966dc96d4ff1.js} +1 -1
  383. package/.next/standalone/.next/static/chunks/app/{page-79e2d32e69788bd2.js → page-91dbf7dfd85f805f.js} +1 -1
  384. package/.next/standalone/.next/static/chunks/main-app-1a7cacecc8900a4d.js +1 -0
  385. package/.next/standalone/.next/static/chunks/{webpack-7cbb3ba6792f1fb3.js → webpack-1bfc783412a06fc5.js} +1 -1
  386. package/.next/standalone/.next/static/css/1d9cf83f50b6db00.css +1 -0
  387. package/.next/standalone/package.json +2 -1
  388. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  389. package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +1 -1
  390. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  391. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +2 -2
  392. package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +11 -1
  393. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +2 -2
  394. package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
  395. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +2 -2
  396. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
  397. package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +1 -1
  398. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
  399. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  400. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  401. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +3 -3
  402. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  403. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-cli/SKILL.md +11 -1
  404. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +2 -2
  405. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
  406. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +2 -2
  407. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +1 -1
  408. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +1 -1
  409. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
  410. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
  411. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
  412. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +3 -3
  413. package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +1 -1
  414. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  415. package/.next/standalone/public/kiro-plugin/manifest.txt +1 -0
  416. package/.next/standalone/public/skill/chorus/SKILL.md +1 -1
  417. package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
  418. package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
  419. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +2 -2
  420. package/.next/standalone/server.js +1 -1
  421. package/README.ja.md +5 -1
  422. package/README.ko.md +5 -1
  423. package/README.md +5 -1
  424. package/README.zh.md +5 -1
  425. package/cli/agent-backend-prompt.mjs +5 -0
  426. package/cli/agent-launcher.mjs +341 -0
  427. package/cli/agents.mjs +12 -0
  428. package/cli/claude-spawner.mjs +52 -15
  429. package/cli/credentials.mjs +107 -1
  430. package/cli/daemon-agent.mjs +4 -2
  431. package/cli/init/adapters.mjs +5 -5
  432. package/cli/init/agent-type-map.mjs +5 -5
  433. package/cli/init/contracts.mjs +2 -0
  434. package/cli/init/install-methods.mjs +206 -31
  435. package/cli/init/pi-mcp-config.mjs +166 -0
  436. package/cli/init/steps/credential-seed.mjs +56 -3
  437. package/cli/init-args.mjs +4 -1
  438. package/cli/init.mjs +47 -2
  439. package/cli/kiro-spawner.mjs +1 -0
  440. package/cli/pi-spawner.mjs +286 -0
  441. package/cli/spawner-select.mjs +7 -1
  442. package/cli/upload-hooks.mjs +25 -1
  443. package/cli/waker.mjs +89 -38
  444. package/package.json +2 -1
  445. package/.next/standalone/.env +0 -18
  446. package/.next/standalone/.next/server/chunks/1437.js +0 -1
  447. package/.next/standalone/.next/server/chunks/3045.js +0 -1
  448. package/.next/standalone/.next/server/chunks/4545.js +0 -1
  449. package/.next/standalone/.next/server/chunks/6207.js +0 -1
  450. package/.next/standalone/.next/server/chunks/7091.js +0 -1
  451. package/.next/standalone/.next/server/chunks/9449.js +0 -1
  452. package/.next/standalone/.next/server/chunks/9458.js +0 -1
  453. package/.next/standalone/.next/static/chunks/18139-e6ef4b5869593f8e.js +0 -1
  454. package/.next/standalone/.next/static/chunks/28856-ef2cb58fbd404ef9.js +0 -1
  455. package/.next/standalone/.next/static/chunks/38366.e6e0132b8ba873d6.js +0 -1
  456. package/.next/standalone/.next/static/chunks/66873-e3be53f41b3f2255.js +0 -1
  457. package/.next/standalone/.next/static/chunks/70303-aec3d52ad87602a3.js +0 -1
  458. package/.next/standalone/.next/static/chunks/76201-83b26515f85ce37c.js +0 -1
  459. package/.next/standalone/.next/static/chunks/94643-ffa140f765c73daf.js +0 -1
  460. package/.next/standalone/.next/static/chunks/97663-9c3ae4fd60b353db.js +0 -1
  461. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-40fe7d026c5a7c6d.js +0 -1
  462. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/activity/page-20632dbec5a6dbc0.js +0 -1
  463. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-87d4d0fe90fca28c.js +0 -1
  464. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-1206abaee85dc915.js +0 -1
  465. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-474e494097c8945f.js +0 -1
  466. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-e902b19328092ccf.js +0 -1
  467. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-f273288c3530aa0f.js +0 -1
  468. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-6568a7b08bf9a54b.js +0 -1
  469. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-fbd3c27b68666234.js +0 -1
  470. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/page-9d79e285b6fd2f8d.js +0 -1
  471. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-2bf7ceee62b574c7.js +0 -1
  472. package/.next/standalone/.next/static/chunks/app/admin/companies/new/page-e35dce890d6dfd8d.js +0 -1
  473. package/.next/standalone/.next/static/chunks/app/admin/companies/page-ef720c2b0856166c.js +0 -1
  474. package/.next/standalone/.next/static/chunks/app/admin/layout-c66ce38cbd88982a.js +0 -1
  475. package/.next/standalone/.next/static/chunks/app/login/admin/page-f032b6db3bd20a2c.js +0 -1
  476. package/.next/standalone/.next/static/chunks/app/login/callback/page-ec23211506e688ee.js +0 -1
  477. package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-7e4664af2c787d08.js +0 -1
  478. package/.next/standalone/.next/static/chunks/main-app-ec87f2c9ef083ff1.js +0 -1
  479. package/.next/standalone/.next/static/css/5f52bd39b284ccdf.css +0 -1
  480. /package/.next/standalone/.next/static/{0spgxl3lP26Fl1otd1D7R → WSN4XeA1kUCI6CeEHcaT_}/_buildManifest.js +0 -0
  481. /package/.next/standalone/.next/static/{0spgxl3lP26Fl1otd1D7R → WSN4XeA1kUCI6CeEHcaT_}/_ssgManifest.js +0 -0
@@ -53,6 +53,7 @@ import {
53
53
  import { resolveInstallCwds as defaultResolveInstallCwds } from "../../daemon-install-config.mjs";
54
54
  import { validateAndFetchIdentity } from "../../chorus-client.mjs";
55
55
  import { agentTypeForSelection, isWakeableAgentType } from "../agent-type-map.mjs";
56
+ import { writePiMcpServer, resolvePiMcpConfigPath } from "../pi-mcp-config.mjs";
56
57
 
57
58
  const STEP_ID = "credential-seed";
58
59
  const { SEEDED, SKIPPED, FAILED } = OUTCOME_ACTIONS;
@@ -421,6 +422,23 @@ export function readCodexEnvProfile(envPath, deps = {}) {
421
422
  }
422
423
  }
423
424
 
425
+ /**
426
+ * Whether an init selection id is Pi (`pi`). Pi's Chorus MCP access is via the ADAPTER
427
+ * path (`pi-mcp-adapter` reads an mcp.json — chorus.ts never registers tools itself), so
428
+ * — like Codex's `[mcp_servers.chorus]` — `chorus agents add` writes pi's global
429
+ * `~/.pi/agent/mcp.json` with an `mcpServers.chorus` entry whose Authorization references
430
+ * the API key by ENV VAR (`Bearer ${CHORUS_API_KEY}`), NO literal key on disk. Unlike dsh /
431
+ * Claude Code / Codex, pi has NO settings env-file to persist the key + profile into, so this
432
+ * write does NOT suppress the CHORUS_AGENT_PROFILE export hint: interactive pi still needs
433
+ * CHORUS_API_KEY (+ CHORUS_AGENT_PROFILE) exported in its shell. We gate on the selection id,
434
+ * NOT the mapped daemon agentType (`pi` → the shared "offline" type, so it can't single pi
435
+ * out). Mirrors {@link isDshSelection} / {@link isClaudeSelection} / {@link isCodexSelection}.
436
+ * @param {string} id
437
+ */
438
+ function isPiSelection(id) {
439
+ return id === "pi";
440
+ }
441
+
424
442
  /**
425
443
  * @param {import("../contracts.mjs").StepContext & {
426
444
  * validateCredentials?: Function, appendAgent?: Function, writeLogin?: Function,
@@ -442,6 +460,7 @@ export async function seedCredentials(ctx) {
442
460
  const readSettingsProfile = ctx.readClaudeSettingsProfile ?? readClaudeSettingsProfile;
443
461
  const writeCodexEnv = ctx.writeCodexEnv ?? writeCodexEnvFile;
444
462
  const readCodexProfile = ctx.readCodexEnvProfile ?? readCodexEnvProfile;
463
+ const writePiMcp = ctx.writePiMcp ?? writePiMcpServer;
445
464
 
446
465
  const selection = Array.isArray(ctx.selection) ? ctx.selection.filter((id) => nonEmpty(id)) : [];
447
466
  if (selection.length === 0) {
@@ -708,13 +727,47 @@ export async function seedCredentials(ctx) {
708
727
  }
709
728
  }
710
729
 
711
- // Combined side-file note + hint-suppression flags (dsh, claude, and codex are mutually
712
- // exclusive selection ids, so at most one note/flag is set per iteration).
713
- const sideNote = `${dshNote}${claudeNote}${codexNote}`;
730
+ // pi-only: ALSO write pi's global ~/.pi/agent/mcp.json so `pi-mcp-adapter` exposes the
731
+ // chorus_* tools to the pi agent (the ADAPTER path chorus.ts never registers tools). The
732
+ // Authorization header references the key by env var (`Bearer ${CHORUS_API_KEY}`), so NO
733
+ // literal cho_ key is written — the pi analogue of Codex's keyless [mcp_servers.chorus]
734
+ // bearer_token_env_var and CC's plugin .mcp.json ${VAR} interpolation. The URL is not a
735
+ // secret, so it is a resolved literal. UNGATED by daemon.json dedup (an idempotent re-run
736
+ // still repairs a missing/stale mcp.json). Unlike dsh/claude/codex this write does NOT
737
+ // suppress the CHORUS_AGENT_PROFILE export hint: pi has NO settings env-file to persist the
738
+ // key + profile into, so interactive pi still needs CHORUS_API_KEY (+ CHORUS_AGENT_PROFILE)
739
+ // in its shell — the daemon spawner injects them for the wake path. `piMcpWritten` is
740
+ // reported for observability only; it is intentionally NOT in the hint-suppression set.
741
+ let piNote = "";
742
+ let piMcpWritten = false;
743
+ if (isPiSelection(id)) {
744
+ const configPath = resolvePiMcpConfigPath(env);
745
+ try {
746
+ const p = writePiMcp({ configPath, url });
747
+ piMcpWritten = true;
748
+ piNote =
749
+ `; wrote mcpServers.chorus (Authorization: Bearer \${CHORUS_API_KEY}) into ${p} (0600) — ` +
750
+ "pi-mcp-adapter exposes the chorus_* tools with the cho_ key env-sourced (no literal key on " +
751
+ "disk). Interactive pi still needs CHORUS_API_KEY (+ CHORUS_AGENT_PROFILE) exported in its " +
752
+ "shell; the daemon injects them for the wake path. Your cho_ key is not shown here.";
753
+ } catch (err) {
754
+ piNote =
755
+ `; WARNING: could not write ${configPath} (${err?.message ?? String(err)}). ` +
756
+ "pi will not reach Chorus MCP until an mcpServers.chorus entry with an env-referenced " +
757
+ `Authorization (Bearer \${CHORUS_API_KEY}) exists — add it to ${configPath}. ` +
758
+ "Your cho_ key is not shown here.";
759
+ }
760
+ }
761
+
762
+ // Combined side-file note + hint-suppression flags (dsh, claude, codex, and pi are mutually
763
+ // exclusive selection ids, so at most one note is set per iteration). piMcpWritten is carried
764
+ // for observability but is NOT a hint-suppression flag (see the pi branch above).
765
+ const sideNote = `${dshNote}${claudeNote}${codexNote}${piNote}`;
714
766
  const hintFlags = {
715
767
  ...(profileInEnv ? { profileInEnv: true } : {}),
716
768
  ...(settingsEnvWritten ? { settingsEnvWritten: true } : {}),
717
769
  ...(codexEnvWritten ? { codexEnvWritten: true } : {}),
770
+ ...(piMcpWritten ? { piMcpWritten: true } : {}),
718
771
  };
719
772
 
720
773
  if (!res.ok) {
package/cli/init-args.mjs CHANGED
@@ -113,7 +113,8 @@ OPTIONS
113
113
  auto-start is unsupported (e.g. Windows). In an
114
114
  interactive TTY run the daemon-setup step prompts instead
115
115
  (default: No).
116
- -y, --yes Skip confirmation prompts (implied when non-TTY).
116
+ -y, --yes Accept confirmation prompts, including refreshing
117
+ installed plugins to latest (implied when non-TTY).
117
118
  -h, --help Show this help message.
118
119
 
119
120
  NON-INTERACTIVE
@@ -121,6 +122,8 @@ NON-INTERACTIVE
121
122
  will not guess which agents to configure and aborts otherwise. The daemon boot service is
122
123
  installed non-interactively ONLY when you pass --daemon-autostart; otherwise the
123
124
  daemon config is written and you start it yourself with 'chorus daemon'.
125
+ With an explicit selection, --yes and non-TTY runs refresh selected installed
126
+ plugins to their latest available versions without prompting.
124
127
 
125
128
  SCOPE
126
129
  This installs the plugin SURFACE, seeds credentials into the daemon config, and
package/cli/init.mjs CHANGED
@@ -97,11 +97,26 @@ export async function runInit(argv = [], deps = {}) {
97
97
 
98
98
  io.log(`[chorus agents add] Configuring: ${selectedIds.join(", ")}`);
99
99
 
100
+ // Resolve adapters once: update-intent detection and per-agent steps must see
101
+ // the same adapter instances/state readers.
102
+ const adapters = new Map();
103
+ for (const agentId of selectedIds) {
104
+ adapters.set(agentId, await getAdapter(agentId));
105
+ }
106
+ const updateInstalled = await resolveUpdateInstalled({
107
+ selectedIds,
108
+ adapters,
109
+ flags,
110
+ env,
111
+ io,
112
+ });
113
+ const resolvedFlags = { ...flags, updateInstalled };
114
+
100
115
  const steps = await orderedSteps();
101
116
  // `ctxExtras` lets a caller/test inject step-context collaborators (e.g. a
102
117
  // fake credential validator or command runner) so an end-to-end run is
103
118
  // hermetic; production passes none and steps use their real defaults.
104
- const baseCtx = { selection: selectedIds, flags, io, env, backup, ...(deps.ctxExtras ?? {}) };
119
+ const baseCtx = { selection: selectedIds, flags: resolvedFlags, io, env, backup, ...(deps.ctxExtras ?? {}) };
105
120
  /** @type {import("./init/contracts.mjs").StepOutcome[]} */
106
121
  const outcomes = [];
107
122
 
@@ -109,7 +124,7 @@ export async function runInit(argv = [], deps = {}) {
109
124
  try {
110
125
  if (step.scope === STEP_SCOPES.PER_AGENT) {
111
126
  for (const agentId of selectedIds) {
112
- const adapter = await getAdapter(agentId);
127
+ const adapter = adapters.get(agentId);
113
128
  outcomes.push(await step.run({ ...baseCtx, agentId, adapter }));
114
129
  }
115
130
  } else {
@@ -129,6 +144,36 @@ export async function runInit(argv = [], deps = {}) {
129
144
  return outcomes.flat().some(isFailureOutcome) ? 1 : 0;
130
145
  }
131
146
 
147
+ /**
148
+ * Resolve one installed-plugin update decision for the whole invocation.
149
+ * Unsupported/guided adapters and selected adapters without an installed
150
+ * Chorus payload do not trigger the question. `--yes` and non-TTY runs accept
151
+ * automatically; an interactive answer defaults to no.
152
+ */
153
+ export async function resolveUpdateInstalled({ selectedIds, adapters, flags, env, io }) {
154
+ let anyInstalled = false;
155
+ for (const agentId of selectedIds) {
156
+ const adapter = adapters.get(agentId);
157
+ if (!adapter || typeof adapter.readInstallState !== "function") continue;
158
+ try {
159
+ const profile = flags.dshProfile ?? env.CHORUS_DSH_PROFILE;
160
+ const state = await adapter.readInstallState({ env, profile });
161
+ if (state?.supported === true && state?.pluginInstalled === true) {
162
+ anyInstalled = true;
163
+ break;
164
+ }
165
+ } catch {
166
+ // State probes are advisory and read-only. A broken probe must not block
167
+ // normal repair/install work; the installer will report its own outcome.
168
+ }
169
+ }
170
+ if (!anyInstalled) return false;
171
+ if (flags.yes || !io.isTTY) return true;
172
+ if (typeof io.ask !== "function") return false;
173
+ const answer = String(await io.ask("Update installed Chorus plugins to the latest available versions? [y/N] ")).trim();
174
+ return /^(?:y|yes)$/i.test(answer);
175
+ }
176
+
132
177
  /** Print the per-outcome summary table. */
133
178
  export function summarize(outcomes, io, selectedIds = []) {
134
179
  io.log("");
@@ -222,6 +222,7 @@ export function pickNewSessionId(before, after) {
222
222
  export class KiroSpawner {
223
223
  /** @param {KiroSpawnerOptions} [opts] */
224
224
  constructor(opts = {}) {
225
+ this.sessionDecision = { probeIsAuthoritative: false };
225
226
  this.kiroPath = opts.kiroPath ?? null;
226
227
  this.spawnImpl = opts.spawnImpl ?? spawn;
227
228
  this.logger = opts.logger ?? NOOP_LOGGER;
@@ -0,0 +1,286 @@
1
+ // cli/pi-spawner.mjs
2
+ // Cross-platform headless pi spawner — the `pi` counterpart to ClaudeSpawner /
3
+ // CodexSpawner, satisfying the SAME backend-agnostic Spawner.wake(...) contract so
4
+ // the daemon's wake pipeline (queue, waker, directed delivery, headless guard,
5
+ // reporters) stays backend-neutral and drives whichever spawner is injected purely
6
+ // through the shared wake(...) contract.
7
+ //
8
+ // Verified against the pi source (earendil-works/pi, packages/coding-agent) before
9
+ // coding — NOT guessed:
10
+ // • `pi --mode json -p` runs headless and emits a JSONL event stream on stdout
11
+ // (one JSON object per line): the session header first, then AgentSessionEvents
12
+ // (`message_start` / `message_update` / `message_end` / `tool_execution_*` /
13
+ // `turn_end` / `agent_end`). Verified against src/modes/print-mode.ts +
14
+ // src/modes/json-event.ts + docs/json.md.
15
+ // • The prompt is read from PIPED STDIN (never argv): main.ts `readPipedStdin()`
16
+ // folds stdin into the initial message when stdin is not a TTY. We pipe the
17
+ // prompt and close stdin, exactly like the Claude/Codex spawners.
18
+ // • SESSION MODEL — client-owned id (like Claude, unlike Codex). pi accepts a
19
+ // caller-provided `--session-id <id>` which is IDEMPOTENT create-or-resume:
20
+ // main.ts createSessionManager() resumes the existing session when one with
21
+ // that exact id already exists in the cwd-scoped session dir, otherwise creates
22
+ // a fresh session WITH that id. (`--session <id>` is the resume-ONLY flag — it
23
+ // hard-errors when the session is absent — so it is the wrong choice for a wake
24
+ // that must create-if-missing.) So we pass `--session-id <anchor>` for BOTH the
25
+ // first wake and every resume; pi owns the new-vs-resume decision from its own
26
+ // on-disk state. No persisted anchor→id map is needed (that is only for Codex,
27
+ // which generates its own id). We NEVER pass `--no-session` (that flag is for
28
+ // ephemeral subagent children only).
29
+ // • pi has NO permission system (no sandbox / no tool-approval prompt in headless
30
+ // mode), so `permissionMode` is a NO-OP: we emit no sandbox / skip-permissions
31
+ // flag. `chorus` and `yolo` modes run identically.
32
+ // • pi has no native MCP: a woken pi reaches Chorus tools only via the chorus-pi
33
+ // extension / pi-mcp-adapter installed in the woken environment. This spawner
34
+ // does not inject MCP; it exports the daemon's creds into the child env, which
35
+ // the extension consumes (CHORUS_URL / CHORUS_API_KEY / CHORUS_AGENT_PROFILE).
36
+ //
37
+ // Reuses claude-spawner's platform-neutral NDJSON parser (parseNdjsonChunk) and the
38
+ // PATH-walk / .cmd-shim shape of the other spawners' path resolution.
39
+
40
+ import { spawn } from "node:child_process";
41
+ import { statSync } from "node:fs";
42
+ import { win32 as pathWin32, posix as pathPosix } from "node:path";
43
+ import { parseNdjsonChunk } from "./claude-spawner.mjs";
44
+
45
+ const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
46
+
47
+ /**
48
+ * Build the argv for a headless pi run. The prompt is NEVER here — it goes over
49
+ * stdin (`pi -p` folds piped stdin into the initial message).
50
+ *
51
+ * `--session-id <anchor>` is pi's idempotent create-or-resume flag (verified against
52
+ * pi main.ts createSessionManager): it resumes the session with that exact id if one
53
+ * exists in the cwd-scoped dir, else creates a new session with that id — so the SAME
54
+ * args serve both the first wake and every resume, and pi owns the decision. `-p` is
55
+ * placed LAST so pi's arg parser can never mistake a following token for a message
56
+ * positional (its `-p` handler slurps the next bare, non-flag arg as a message).
57
+ *
58
+ * @param {{ sessionId: string }} o
59
+ * @returns {string[]}
60
+ */
61
+ export function buildPiArgs({ sessionId }) {
62
+ return ["--mode", "json", "--session-id", sessionId, "-p"];
63
+ }
64
+
65
+ /**
66
+ * Resolve the real `pi` executable WITHOUT a shell — same approach as
67
+ * resolveClaudePath / resolveCodexPath. On Windows the bin may be `pi.cmd` (npm
68
+ * shim), which `spawn` can't exec directly without shell:true; we walk PATH for the
69
+ * platform candidates. `CHORUS_PI_PATH` overrides.
70
+ * @param {{ env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, isFile?: (p: string) => boolean }} [deps]
71
+ * @returns {string | null}
72
+ */
73
+ export function resolvePiPath(deps = {}) {
74
+ const env = deps.env ?? process.env;
75
+ const platform = deps.platform ?? process.platform;
76
+ const isFile =
77
+ deps.isFile ??
78
+ ((p) => {
79
+ try {
80
+ return statSync(p).isFile();
81
+ } catch {
82
+ return false;
83
+ }
84
+ });
85
+
86
+ if (env.CHORUS_PI_PATH && isFile(env.CHORUS_PI_PATH)) {
87
+ return env.CHORUS_PI_PATH;
88
+ }
89
+
90
+ const isWin = platform === "win32";
91
+ const p = isWin ? pathWin32 : pathPosix;
92
+ const names = isWin ? ["pi.cmd", "pi.exe", "pi"] : ["pi"];
93
+ const pathVar = env.PATH || env.Path || "";
94
+ const dirs = pathVar.split(p.delimiter).filter(Boolean);
95
+ for (const dir of dirs) {
96
+ for (const name of names) {
97
+ const candidate = p.join(dir, name);
98
+ if (isFile(candidate)) return candidate;
99
+ }
100
+ }
101
+ return null;
102
+ }
103
+
104
+ /**
105
+ * Resolve the actual command + argv to spawn. On Windows a `.cmd`/`.bat` shim is
106
+ * not a PE executable, so it must run via `cmd.exe /d /s /c <path> ...args`; we keep
107
+ * shell:false and pass argv as an array (no shell word-splitting/injection).
108
+ * @param {string} piPath @param {string[]} args
109
+ * @param {NodeJS.Platform} [platform] @param {NodeJS.ProcessEnv} [env]
110
+ * @returns {{ command: string, argv: string[] }}
111
+ */
112
+ export function resolveSpawnCommand(piPath, args, platform = process.platform, env = process.env) {
113
+ const isWin = platform === "win32";
114
+ const lower = piPath.toLowerCase();
115
+ if (isWin && (lower.endsWith(".cmd") || lower.endsWith(".bat"))) {
116
+ const comspec = env.ComSpec || env.COMSPEC || "cmd.exe";
117
+ return { command: comspec, argv: ["/d", "/s", "/c", piPath, ...args] };
118
+ }
119
+ return { command: piPath, argv: args };
120
+ }
121
+
122
+ /**
123
+ * @typedef {Object} PiSpawnerOptions
124
+ * @property {string} [piPath] Resolved pi path (resolved lazily if omitted).
125
+ * @property {(o: object) => any} [spawnImpl] Injectable spawn (tests).
126
+ * @property {{info(m:string):void,warn(m:string):void,error(m:string):void}} [logger]
127
+ * @property {"chorus"|"yolo"} [permissionMode] Accepted for a uniform selectSpawner
128
+ * call, but a NO-OP: pi has no permission system, so no flag is emitted either way.
129
+ * @property {{ url: string, apiKey: string, agentUuid?: string, agentName?: string }} [creds]
130
+ * Daemon creds exported into the child env for the chorus-pi extension's MCP-over-HTTP
131
+ * tooling and SessionStart bookkeeping.
132
+ * @property {NodeJS.Platform} [platform] Injectable for tests; gates POSIX `detached`.
133
+ * @property {(deps?: object) => (string|null)} [resolvePiPathFn] Injectable resolver.
134
+ */
135
+
136
+ export class PiSpawner {
137
+ /** @param {PiSpawnerOptions} [opts] */
138
+ constructor(opts = {}) {
139
+ // pi manages new-vs-resume internally from its own on-disk session state (the
140
+ // `--session-id` anchor is idempotent create-or-resume), so the daemon's shared
141
+ // Claude transcript probe is NOT authoritative for pi. Setting this false makes
142
+ // the waker skip the Claude-specific "take over with `claude --resume`" log line
143
+ // (mirrors CodexSpawner) — pi is not resumable via `claude --resume`.
144
+ this.sessionDecision = { probeIsAuthoritative: false };
145
+ this.piPath = opts.piPath ?? null;
146
+ this.spawnImpl = opts.spawnImpl ?? spawn;
147
+ this.logger = opts.logger ?? NOOP_LOGGER;
148
+ // Stored for a uniform construction shape, but never consulted when building
149
+ // args — pi has no permission surface, so no sandbox / skip-permissions flag.
150
+ this.permissionMode = opts.permissionMode ?? "chorus";
151
+ this.creds = opts.creds ?? null;
152
+ this.platform = opts.platform ?? process.platform;
153
+ this.resolvePiPathFn = opts.resolvePiPathFn ?? resolvePiPath;
154
+ }
155
+
156
+ /**
157
+ * Spawn a headless pi run. Resolves when the subprocess exits. The prompt is
158
+ * written to stdin (never argv). `sessionId` is the Chorus anchor (direct idea
159
+ * uuid, or the entity uuid for an ad-hoc session) and is passed straight through as
160
+ * pi's client-owned `--session-id`, which pi resolves as create-or-resume from its
161
+ * own on-disk session dir — so the passed `isNew` (derived by the waker's
162
+ * Claude-specific transcript probe, which never matches a pi session) does NOT
163
+ * drive the flag; it is only echoed back for the waker's log line.
164
+ *
165
+ * @param {{ prompt: string, sessionId: string|null, isNew?: boolean, cwd?: string,
166
+ * onMessage?: (obj: any) => void,
167
+ * onChild?: (child: import("node:child_process").ChildProcess) => void }} params
168
+ * @returns {Promise<{ sessionId: string, backendSessionId: string|null, exitCode: number|null, isNew: boolean }>}
169
+ * `backendSessionId` is the resumable anchor (the input `sessionId`) after a spawn,
170
+ * so the conversation UI can offer a resumable id — mirrors the other spawners.
171
+ * `null` on the pre-spawn failure paths (no run started, nothing to resume).
172
+ */
173
+ async wake({ prompt, sessionId, isNew, cwd, onMessage, onChild }) {
174
+ const anchor = typeof sessionId === "string" ? sessionId : "";
175
+ const isNewFlag = Boolean(isNew);
176
+
177
+ const piPath = this.piPath ?? this.resolvePiPathFn();
178
+ if (!piPath) {
179
+ // No crash — surface visibly and resolve with a failure result (matches the
180
+ // other spawners' "skipping wake" convention: exitCode null, no throw).
181
+ this.logger.error("[Chorus] cannot locate the `pi` executable on PATH; skipping wake");
182
+ return { sessionId: anchor, backendSessionId: null, exitCode: null, isNew: isNewFlag };
183
+ }
184
+
185
+ const args = buildPiArgs({ sessionId: anchor });
186
+ const { command, argv } = resolveSpawnCommand(piPath, args, this.platform);
187
+
188
+ // POSIX: detached process group so the interrupt path can group-kill the tree
189
+ // (pi may fork child shells / subagents). Windows uses taskkill /T. stdio stays
190
+ // piped — prompt over stdin + NDJSON stdout parse are unaffected.
191
+ const detached = this.platform !== "win32";
192
+
193
+ // Export the daemon's resolved connection pair for the chorus-pi extension's
194
+ // Chorus tooling. Explicitly overwrite inherited values so the extension and the
195
+ // daemon cannot disagree about which Chorus instance this wake belongs to.
196
+ const childEnv = { ...process.env, CHORUS_DAEMON_HEADLESS: "1" };
197
+ if (this.creds) {
198
+ if (this.creds.url) childEnv.CHORUS_URL = this.creds.url;
199
+ if (this.creds.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
200
+ // Identity profile for the woken session — its extension/skills pass this to
201
+ // `chorus mcp --agent`, which resolves the key from ~/.chorus/daemon.json.
202
+ if (this.creds.agentUuid || this.creds.agentName)
203
+ childEnv.CHORUS_AGENT_PROFILE = this.creds.agentUuid || this.creds.agentName;
204
+ }
205
+
206
+ return new Promise((resolve) => {
207
+ let child;
208
+ try {
209
+ child = this.spawnImpl(command, argv, {
210
+ cwd: cwd ?? process.cwd(),
211
+ stdio: ["pipe", "pipe", "pipe"],
212
+ env: childEnv,
213
+ shell: false,
214
+ detached,
215
+ windowsHide: true,
216
+ });
217
+ } catch (err) {
218
+ this.logger.error(`[Chorus] failed to spawn pi: ${err}`);
219
+ resolve({ sessionId: anchor, backendSessionId: null, exitCode: null, isNew: isNewFlag });
220
+ return;
221
+ }
222
+
223
+ // Hand the live child to the caller (interrupt registry) before resolving.
224
+ // Never let a throwing callback escape into the spawn path.
225
+ if (onChild) {
226
+ try {
227
+ onChild(child);
228
+ } catch (err) {
229
+ this.logger.warn(`[Chorus] onChild handler threw: ${err}`);
230
+ }
231
+ }
232
+
233
+ let stdoutBuf = "";
234
+
235
+ child.stdout?.setEncoding?.("utf8");
236
+ child.stdout?.on("data", (chunk) => {
237
+ stdoutBuf = parseNdjsonChunk(
238
+ stdoutBuf,
239
+ String(chunk),
240
+ (obj) => {
241
+ if (onMessage) {
242
+ try {
243
+ onMessage(obj);
244
+ } catch (err) {
245
+ this.logger.warn(`[Chorus] onMessage handler threw: ${err}`);
246
+ }
247
+ }
248
+ },
249
+ (msg) => this.logger.warn(`[Chorus] ${msg}`)
250
+ );
251
+ });
252
+
253
+ child.stderr?.setEncoding?.("utf8");
254
+ child.stderr?.on("data", (chunk) => {
255
+ const text = String(chunk).trim();
256
+ if (text) this.logger.warn(`[Chorus] pi stderr: ${text}`);
257
+ });
258
+
259
+ child.on("error", (err) => {
260
+ this.logger.error(`[Chorus] pi process error: ${err}`);
261
+ resolve({ sessionId: anchor, backendSessionId: anchor || null, exitCode: null, isNew: isNewFlag });
262
+ });
263
+
264
+ child.on("close", (code) => {
265
+ if (code !== 0) {
266
+ this.logger.warn(`[Chorus] pi exited with code ${code}`);
267
+ }
268
+ resolve({ sessionId: anchor, backendSessionId: anchor || null, exitCode: code, isNew: isNewFlag });
269
+ });
270
+
271
+ // Guard against an ASYNC stdin error (EPIPE) so it never becomes an
272
+ // uncaughtException that kills the daemon.
273
+ child.stdin?.on?.("error", (err) => {
274
+ this.logger.warn(`[Chorus] pi stdin error (ignored): ${err}`);
275
+ });
276
+
277
+ // Feed the prompt over stdin, then close it so the model runs.
278
+ try {
279
+ child.stdin?.write(prompt);
280
+ child.stdin?.end();
281
+ } catch (err) {
282
+ this.logger.warn(`[Chorus] failed writing prompt to pi stdin: ${err}`);
283
+ }
284
+ });
285
+ }
286
+ }
@@ -20,6 +20,7 @@ import { ClaudeSpawner } from "./claude-spawner.mjs";
20
20
  import { CodexSpawner } from "./codex-spawner.mjs";
21
21
  import { DshSpawner } from "./dsh-spawner.mjs";
22
22
  import { KiroSpawner } from "./kiro-spawner.mjs";
23
+ import { PiSpawner } from "./pi-spawner.mjs";
23
24
 
24
25
  /**
25
26
  * A fail-closed spawner for the `offline` agentType. It satisfies the shared
@@ -52,7 +53,7 @@ export class OfflineSpawner {
52
53
 
53
54
  /**
54
55
  * Construct the spawner backend for `agentType`.
55
- * @param {string} agentType "claude-code" | "codex" | "kiro" | "dsh" | "offline"
56
+ * @param {string} agentType "claude-code" | "codex" | "kiro" | "dsh" | "pi" | "offline"
56
57
  * (already validated upstream). "offline" → OfflineSpawner (fail-closed no-op).
57
58
  * @param {{ logger?: any, permissionMode?: "chorus"|"yolo", creds?: { url: string, apiKey: string } }} [opts]
58
59
  * @returns {import("./codex-spawner.mjs").Spawner}
@@ -79,5 +80,10 @@ export function selectSpawner(agentType, opts = {}) {
79
80
  prepareManagedConfigFn: opts.prepareManagedConfigFn,
80
81
  });
81
82
  }
83
+ if (agentType === "pi") {
84
+ // pi is a first-class wakeable backend — an explicit branch so it NEVER falls
85
+ // through to the claude-code default below (nor is treated as offline).
86
+ return new PiSpawner({ logger, permissionMode, creds });
87
+ }
82
88
  return new ClaudeSpawner({ logger, permissionMode, creds });
83
89
  }
@@ -399,15 +399,26 @@ function stripSystemReminders(s) {
399
399
  * the caller can skip it). Never throws — a shape it doesn't recognize yields null
400
400
  * rather than an error (defensive against CLI drift).
401
401
  *
402
- * Two stream dialects are recognized (their top-level shapes are disjoint, so no
402
+ * Four stream dialects are recognized (their top-level shapes are disjoint, so no
403
403
  * backend flag is needed):
404
404
  * - Claude Code stream-json: `{ type: "user"|"assistant", message: { content … } }`.
405
+ * - DeepSeek Harness (dsh): `{ type: "user/message"|"assistant/message", data: { message } }`.
405
406
  * - codex `codex exec --json`: conversation/tool output rides on `item.completed`
406
407
  * events discriminated by `item.type`; assistant text is an `agent_message`
407
408
  * item with a top-level `item.text` (verified against codex-cli 0.142.3). codex
408
409
  * does NOT echo the user prompt (the chat UI renders that from the turn's
409
410
  * promptText), and `reasoning` / `command_execution` / lifecycle envelopes are
410
411
  * not conversation text — all dropped.
412
+ * - pi (@earendil-works/pi-coding-agent) `pi --mode json`: AgentSessionEvents whose
413
+ * authoritative final text is a `message_end` carrying a full AgentMessage
414
+ * (`{ role, content }`). We keep ONLY the assistant message: pi UNCONDITIONALLY
415
+ * re-emits the wake prompt as a `message_end` with role "user" (agent-loop.ts),
416
+ * which the daemon already stores as the turn's promptText — so echoing it would
417
+ * duplicate the prompt (same reason codex drops the user echo). `toolResult`
418
+ * messages and `tool_execution_end` tool-output events are not conversation text.
419
+ * pi's content-block shape is identical to Claude's (text blocks `{type:"text",text}`,
420
+ * thinking `{type:"thinking"}`, tool calls `{type:"toolCall"}`), so we normalize the
421
+ * assistant envelope to the Claude shape and reuse the same block extractor.
411
422
  *
412
423
  * @param {any} obj One parsed stream NDJSON object.
413
424
  * @returns {{ role: "user"|"assistant", text: string } | null}
@@ -438,6 +449,19 @@ export function extractTranscriptText(obj) {
438
449
  return { role: "assistant", text: itemText };
439
450
  }
440
451
 
452
+ // ── pi `pi --mode json` dialect ──
453
+ // pi's authoritative final text of each step is a `message_end` carrying a full
454
+ // AgentMessage `{ role, content }`. Keep ONLY the assistant message: pi re-emits the
455
+ // wake prompt as a role:"user" message_end (already stored as the turn's promptText),
456
+ // and role:"toolResult" / `tool_execution_end` events are tool output, not text.
457
+ // pi's content-block shape matches Claude's, so we hand the message to the Claude-shape
458
+ // extractor below (which keeps only `{type:"text"}` blocks, strips reminders, drops empties).
459
+ if (obj.type === "message_end") {
460
+ const message = obj.message;
461
+ if (!message || typeof message !== "object" || message.role !== "assistant") return null;
462
+ return extractTranscriptText({ type: "assistant", message });
463
+ }
464
+
441
465
  // ── Claude Code stream-json dialect ──
442
466
  if (!CONVERSATION_TYPES.has(obj.type)) return null;
443
467