@namzu/cli 38.2.0 → 39.0.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 (391) hide show
  1. package/CHANGELOG.md +111 -50
  2. package/dist/bin.js +1 -1
  3. package/dist/chunks/{acp-JU4DX3RK.js → acp-NZITIX4C.js} +40 -37
  4. package/dist/chunks/acp-NZITIX4C.js.map +6 -0
  5. package/dist/chunks/{activity-command-TERANSMO.js → activity-command-NKOTZ5FK.js} +11 -11
  6. package/dist/chunks/{add-MZ6KIHY3.js → add-AONYUNXG.js} +17 -17
  7. package/dist/chunks/{agent-JZFFS4IP.js → agent-YPKFE66C.js} +29 -28
  8. package/dist/chunks/agent-session-HFOLAFFL.js +53 -0
  9. package/dist/chunks/{archive-SXYHKL3H.js → archive-SUE5OUZZ.js} +9 -9
  10. package/dist/chunks/{bin-main-TFKZQ7NF.js → bin-main-55PUHGTA.js} +3 -3
  11. package/dist/chunks/{browser-3U3YBKL6.js → browser-HYPSUDAZ.js} +6 -6
  12. package/dist/chunks/{chat-37QA7HHN.js → chat-6OULID33.js} +14 -14
  13. package/dist/chunks/{chunk-7S5UB6DX.js → chunk-233DQVSC.js} +6 -6
  14. package/dist/chunks/{chunk-D5SIC3SF.js → chunk-263WNQB4.js} +9 -9
  15. package/dist/chunks/{chunk-XKEMUEI5.js → chunk-2KKF45DQ.js} +2 -2
  16. package/dist/chunks/{chunk-N57QO3AA.js → chunk-2VMMTC2V.js} +2 -2
  17. package/dist/chunks/{chunk-KUNQW3N3.js → chunk-2WQFRVVQ.js} +4 -4
  18. package/dist/chunks/{chunk-FOGCQUIH.js → chunk-3JB5NDB4.js} +11 -23
  19. package/dist/chunks/chunk-3JB5NDB4.js.map +6 -0
  20. package/dist/chunks/{chunk-LPYWPRIF.js → chunk-3OAGXDRM.js} +4 -4
  21. package/dist/chunks/{chunk-CDZT7WGY.js → chunk-47TGPZWD.js} +3 -3
  22. package/dist/chunks/{chunk-IG4O4UAL.js → chunk-4K2NRXHJ.js} +2 -2
  23. package/dist/chunks/{chunk-2SVXX5QK.js → chunk-5CGH647C.js} +5 -5
  24. package/dist/chunks/{chunk-ZJHOWWXZ.js → chunk-74U3P65Q.js} +12 -12
  25. package/dist/chunks/{chunk-ZJMUPGWD.js → chunk-7EASYULO.js} +8 -8
  26. package/dist/chunks/{chunk-KG2YA6TI.js → chunk-7YXHOSHD.js} +3 -3
  27. package/dist/chunks/{chunk-EKMOETAY.js → chunk-AZ3YHVFA.js} +2 -2
  28. package/dist/chunks/{chunk-7O4X4GYL.js → chunk-B2357ETN.js} +7 -7
  29. package/dist/chunks/{chunk-TCXFKEYW.js → chunk-B73OIFL6.js} +4 -4
  30. package/dist/chunks/{chunk-TCXFKEYW.js.map → chunk-B73OIFL6.js.map} +1 -1
  31. package/dist/chunks/{chunk-XIURI2PQ.js → chunk-BEFTUDYP.js} +7 -7
  32. package/dist/chunks/chunk-CDYUGK7F.js +70 -0
  33. package/dist/chunks/chunk-CDYUGK7F.js.map +6 -0
  34. package/dist/chunks/{chunk-DQICYFIG.js → chunk-CL5TCY4F.js} +2 -2
  35. package/dist/chunks/{chunk-5G3VKTLZ.js → chunk-CUOWARJI.js} +2 -2
  36. package/dist/chunks/{chunk-WLHI2QSC.js → chunk-CZEU2JYJ.js} +3 -3
  37. package/dist/chunks/{chunk-WLHI2QSC.js.map → chunk-CZEU2JYJ.js.map} +1 -1
  38. package/dist/chunks/{chunk-M2EJQU3F.js → chunk-DFA5OB46.js} +4 -4
  39. package/dist/chunks/{chunk-B5344NIV.js → chunk-E3HCZYGN.js} +3 -3
  40. package/dist/chunks/{chunk-Z4LTK3HY.js → chunk-EA6SWPO4.js} +4 -4
  41. package/dist/chunks/{chunk-XNHYUV6G.js → chunk-EUU4TDTH.js} +2 -2
  42. package/dist/chunks/{chunk-VFBIR3UC.js → chunk-FBNKKDIY.js} +4 -4
  43. package/dist/chunks/{chunk-PETRJVXF.js → chunk-FQZFVLJB.js} +4 -4
  44. package/dist/chunks/{chunk-FMJCN6JZ.js → chunk-GU5YARBU.js} +90 -6
  45. package/dist/chunks/chunk-GU5YARBU.js.map +6 -0
  46. package/dist/chunks/{chunk-5PDW6VPO.js → chunk-HI2KXIGA.js} +3 -3
  47. package/dist/chunks/{chunk-LC5VGZO2.js → chunk-HU35YAIZ.js} +2 -2
  48. package/dist/chunks/{chunk-S5U4BG57.js → chunk-HV77F4SF.js} +3 -52
  49. package/dist/chunks/chunk-HV77F4SF.js.map +6 -0
  50. package/dist/chunks/{chunk-2UT6U22B.js → chunk-IAYIUJMI.js} +2 -2
  51. package/dist/chunks/{chunk-6A7P3I3N.js → chunk-ID334ALD.js} +29 -28
  52. package/dist/chunks/{chunk-6A7P3I3N.js.map → chunk-ID334ALD.js.map} +1 -1
  53. package/dist/chunks/{chunk-U3JIZFOS.js → chunk-IE5XIE4W.js} +2 -2
  54. package/dist/chunks/{chunk-2UUBILYI.js → chunk-II57E2QW.js} +4 -4
  55. package/dist/chunks/{chunk-CZVHXYGD.js → chunk-IYPP6HSK.js} +4 -32
  56. package/dist/chunks/chunk-IYPP6HSK.js.map +6 -0
  57. package/dist/chunks/{chunk-OA5772RG.js → chunk-LFVQSMJG.js} +4 -4
  58. package/dist/chunks/{chunk-2WHVZCLT.js → chunk-M3TJHQF7.js} +18 -2
  59. package/dist/chunks/{chunk-2WHVZCLT.js.map → chunk-M3TJHQF7.js.map} +1 -1
  60. package/dist/chunks/{chunk-U75JG2RT.js → chunk-MCNEFI5Q.js} +2 -2
  61. package/dist/chunks/{chunk-JN6M424Z.js → chunk-N3FI7O4U.js} +2 -2
  62. package/dist/chunks/{chunk-3NIZKJJG.js → chunk-N72DH6D5.js} +2 -2
  63. package/dist/chunks/{chunk-V2VHVH5S.js → chunk-NLKIBRXJ.js} +3 -3
  64. package/dist/chunks/{chunk-LBPM46OY.js → chunk-OLOTFDTU.js} +2 -2
  65. package/dist/chunks/{chunk-LLZ32DHS.js → chunk-OXJEMOBQ.js} +860 -253
  66. package/dist/chunks/chunk-OXJEMOBQ.js.map +6 -0
  67. package/dist/chunks/{chunk-7MLTWXEW.js → chunk-P2Y4LUPJ.js} +2 -2
  68. package/dist/chunks/{chunk-KONWJQLM.js → chunk-QNF6COCY.js} +2 -2
  69. package/dist/chunks/{chunk-TNTP3CNT.js → chunk-QO5JUKFG.js} +2 -2
  70. package/dist/chunks/{chunk-GTXD263T.js → chunk-RB36O3CE.js} +2 -2
  71. package/dist/chunks/{chunk-A64X23MU.js → chunk-RQBT4RVE.js} +401 -56
  72. package/dist/chunks/chunk-RQBT4RVE.js.map +6 -0
  73. package/dist/chunks/{chunk-LH6J5QQ7.js → chunk-SBPCN24X.js} +2 -2
  74. package/dist/chunks/{chunk-CK4TOW2N.js → chunk-SIK62TDI.js} +2 -2
  75. package/dist/chunks/{chunk-XEOZYKPJ.js → chunk-T75ITEN6.js} +3 -3
  76. package/dist/chunks/{chunk-2T7TZDUE.js → chunk-TJTRVZFN.js} +2 -2
  77. package/dist/chunks/{chunk-AHVF22PV.js → chunk-UBOPUGDN.js} +5 -5
  78. package/dist/chunks/{chunk-UQZNYNX7.js → chunk-UIDLXA2K.js} +2 -2
  79. package/dist/chunks/{chunk-FI7TIM5P.js → chunk-UTMGJDC3.js} +2 -2
  80. package/dist/chunks/{chunk-CLIP7QVU.js → chunk-UUUNXKL3.js} +3 -3
  81. package/dist/chunks/{chunk-EUHPTASG.js → chunk-UZCA37QE.js} +2 -2
  82. package/dist/chunks/{chunk-Z56MZ7UW.js → chunk-W27ZDC4R.js} +4 -4
  83. package/dist/chunks/{chunk-ICBHR27I.js → chunk-XEHLRJXR.js} +16 -13
  84. package/dist/chunks/{chunk-ICBHR27I.js.map → chunk-XEHLRJXR.js.map} +1 -1
  85. package/dist/chunks/{chunk-HOOY63EB.js → chunk-XJ4IUCH6.js} +15 -15
  86. package/dist/chunks/{chunk-Q6SF7T77.js → chunk-YKEPC6NH.js} +3 -3
  87. package/dist/chunks/{chunk-3PBSWF6X.js → chunk-Z7XA4Y43.js} +3 -3
  88. package/dist/chunks/{cli-runtime-PRG53LL6.js → cli-runtime-G3FHYTCI.js} +13 -13
  89. package/dist/chunks/{commands-QMF4AHAY.js → commands-TIRZH2TK.js} +5 -5
  90. package/dist/chunks/{crash-report-BSZ6SUOF.js → crash-report-E4J7KQ32.js} +6 -6
  91. package/dist/chunks/{dist-HRWBXBF3.js → dist-2IUQEIEI.js} +2 -2
  92. package/dist/chunks/{dist-GNI4DIHI.js → dist-2U6NNEPY.js} +3 -3
  93. package/dist/chunks/{dist-QSOTJL6Z.js → dist-CVDGKJEI.js} +2 -2
  94. package/dist/chunks/{dist-JDUOF4K7.js → dist-MKQZKCB4.js} +2 -2
  95. package/dist/chunks/{dist-MYWLKPXK.js → dist-QCKKBLDW.js} +2 -2
  96. package/dist/chunks/{dist-SO6XBKFN.js → dist-QHKTYYMX.js} +2 -2
  97. package/dist/chunks/{dist-XDA5OMB2.js → dist-YX7Q3EJR.js} +3 -3
  98. package/dist/chunks/{doctor-5MS7V3JB.js → doctor-ASXICRC5.js} +10 -10
  99. package/dist/chunks/{drain-YGGEC4UE.js → drain-CGS3KBU3.js} +10 -10
  100. package/dist/chunks/{eval-GWP6MISH.js → eval-XWC3UCFI.js} +2 -2
  101. package/dist/chunks/{exec-YDIFQY7C.js → exec-FOUQBA6I.js} +42 -30
  102. package/dist/chunks/{exec-YDIFQY7C.js.map → exec-FOUQBA6I.js.map} +1 -1
  103. package/dist/chunks/{home-IZ2H7PM3.js → home-76YLI2M6.js} +3 -3
  104. package/dist/chunks/{host-queries-UCVJBJXU.js → host-queries-ODUQHYBN.js} +14 -14
  105. package/dist/chunks/{lifecycle-U52Z5ZMZ.js → lifecycle-JN43XQSS.js} +25 -25
  106. package/dist/chunks/{list-SVKI2XOL.js → list-TC7TYJDR.js} +11 -11
  107. package/dist/chunks/{login-MNDG4XIT.js → login-CTC6CAM4.js} +10 -10
  108. package/dist/chunks/{logs-M7RCXYPY.js → logs-2NGJFIQI.js} +4 -4
  109. package/dist/chunks/{mcp-KEQMYKDA.js → mcp-BPH7KWZ6.js} +18 -18
  110. package/dist/chunks/{message-command-FZ6VEUK5.js → message-command-A4XU7QQQ.js} +35 -34
  111. package/dist/chunks/message-command-A4XU7QQQ.js.map +6 -0
  112. package/dist/chunks/{operator-tools-C57ZIYRG.js → operator-tools-6RYAHVSL.js} +12 -12
  113. package/dist/chunks/{output-schema-IYQRSIUA.js → output-schema-GSWZHKSI.js} +3 -3
  114. package/dist/chunks/{pal-NXMTLY6Z.js → pal-4QXXG42H.js} +13 -13
  115. package/dist/chunks/{providers-TZBRQDXE.js → providers-6PIIF3WR.js} +8 -8
  116. package/dist/chunks/{resident-DBIZBLOV.js → resident-UP7W6MV6.js} +20 -20
  117. package/dist/chunks/resume-GJHTPMJS.js +22 -0
  118. package/dist/chunks/{resume-command-36S3HXPO.js → resume-command-2RFT7AGW.js} +4 -4
  119. package/dist/chunks/{schedule-UR54S44B.js → schedule-FZISVF6A.js} +8 -8
  120. package/dist/chunks/{service-VMXEAJCI.js → service-4WADXOUI.js} +24 -24
  121. package/dist/chunks/session-step-FX6B4TSE.js +29 -0
  122. package/dist/chunks/{skills-RXYS26H3.js → skills-BJQGVQ23.js} +8 -8
  123. package/dist/chunks/{state-NS47IVWW.js → state-2KKVQPZ2.js} +2 -2
  124. package/dist/chunks/{store-3U2GZAZS.js → store-LO4SSRYI.js} +9 -9
  125. package/dist/chunks/{store-TO65IAIZ.js → store-TKJKR5NM.js} +6 -6
  126. package/dist/chunks/{store-GNFHH2LZ.js → store-YFTJ24WU.js} +4 -4
  127. package/dist/chunks/{tui-STU5UZBC.js → tui-HA3JIVON.js} +1802 -1076
  128. package/dist/chunks/tui-HA3JIVON.js.map +6 -0
  129. package/dist/chunks/{upgrade-USIXROFG.js → upgrade-3QLPPCII.js} +4 -3
  130. package/dist/chunks/upgrade-3QLPPCII.js.map +6 -0
  131. package/dist/chunks/{worktree-AYI5VJ5H.js → worktree-3HYAYSGW.js} +11 -11
  132. package/dist/cli.d.ts.map +1 -1
  133. package/dist/commands/acp.d.ts.map +1 -1
  134. package/dist/commands/desktop-model-catalogue.d.ts +1 -1
  135. package/dist/commands/exec-json.d.ts.map +1 -1
  136. package/dist/commands/exec.d.ts.map +1 -1
  137. package/dist/commands/resume.d.ts +1 -1
  138. package/dist/config/load.d.ts +1 -2
  139. package/dist/config/load.d.ts.map +1 -1
  140. package/dist/config/schema.d.ts +20 -3
  141. package/dist/config/schema.d.ts.map +1 -1
  142. package/dist/context/doctrine.d.ts +4 -4
  143. package/dist/context/doctrine.d.ts.map +1 -1
  144. package/dist/index.js +14 -14
  145. package/dist/integrations/harness/codex-protocol.d.ts +1 -1
  146. package/dist/integrations/harness/codex-protocol.d.ts.map +1 -1
  147. package/dist/integrations/mcp/tool-search.d.ts +3 -4
  148. package/dist/integrations/mcp/tool-search.d.ts.map +1 -1
  149. package/dist/integrations/notifications/idle.d.ts +2 -2
  150. package/dist/integrations/notifications/idle.d.ts.map +1 -1
  151. package/dist/integrations/providers/identity.d.ts +1 -1
  152. package/dist/integrations/resident/runner-worker.js +20 -20
  153. package/dist/integrations/subagents/activity.d.ts +4 -0
  154. package/dist/integrations/subagents/activity.d.ts.map +1 -1
  155. package/dist/integrations/subagents/label-ledger.d.ts +2 -3
  156. package/dist/integrations/subagents/label-ledger.d.ts.map +1 -1
  157. package/dist/integrations/subagents/runtime.d.ts +40 -6
  158. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  159. package/dist/integrations/subagents/workflow-assignment.d.ts +13 -0
  160. package/dist/integrations/subagents/workflow-assignment.d.ts.map +1 -0
  161. package/dist/integrations/workflows/doctrine.d.ts +4 -3
  162. package/dist/integrations/workflows/doctrine.d.ts.map +1 -1
  163. package/dist/integrations/workflows/host.d.ts +5 -0
  164. package/dist/integrations/workflows/host.d.ts.map +1 -1
  165. package/dist/integrations/workflows/offering.d.ts +9 -27
  166. package/dist/integrations/workflows/offering.d.ts.map +1 -1
  167. package/dist/integrations/workflows/size.d.ts +51 -0
  168. package/dist/integrations/workflows/size.d.ts.map +1 -0
  169. package/dist/permissions/live-mode.d.ts +1 -2
  170. package/dist/permissions/live-mode.d.ts.map +1 -1
  171. package/dist/permissions/local-settings.d.ts +4 -4
  172. package/dist/permissions/mode.d.ts +1 -1
  173. package/dist/permissions/rules.d.ts +1 -2
  174. package/dist/permissions/rules.d.ts.map +1 -1
  175. package/dist/permissions/session-allow.d.ts +12 -12
  176. package/dist/permissions/session-allow.d.ts.map +1 -1
  177. package/dist/plan/approval.d.ts +1 -2
  178. package/dist/plan/approval.d.ts.map +1 -1
  179. package/dist/reminders/frame.d.ts +1 -1
  180. package/dist/reminders/frame.d.ts.map +1 -1
  181. package/dist/reminders/hypermode.d.ts +31 -0
  182. package/dist/reminders/hypermode.d.ts.map +1 -0
  183. package/dist/reminders/index.d.ts +7 -1
  184. package/dist/reminders/index.d.ts.map +1 -1
  185. package/dist/reminders/plan-mode.d.ts +1 -1
  186. package/dist/reminders/task-nudge.d.ts +1 -1
  187. package/dist/schedule/fire/fire.d.ts.map +1 -1
  188. package/dist/tui/AgentExplorer.d.ts +25 -6
  189. package/dist/tui/AgentExplorer.d.ts.map +1 -1
  190. package/dist/tui/App.d.ts +10 -1
  191. package/dist/tui/App.d.ts.map +1 -1
  192. package/dist/tui/BackgroundAgentRows.d.ts +13 -0
  193. package/dist/tui/BackgroundAgentRows.d.ts.map +1 -0
  194. package/dist/tui/BackgroundJobsPanel.d.ts.map +1 -1
  195. package/dist/tui/ChoicePicker.d.ts.map +1 -1
  196. package/dist/tui/Composer.d.ts +8 -4
  197. package/dist/tui/Composer.d.ts.map +1 -1
  198. package/dist/tui/ComposerFrame.d.ts +1 -1
  199. package/dist/tui/EffortSlider.d.ts +4 -4
  200. package/dist/tui/EffortSlider.d.ts.map +1 -1
  201. package/dist/tui/LiveActivity.d.ts.map +1 -1
  202. package/dist/tui/PendingInputPanel.d.ts +1 -1
  203. package/dist/tui/PendingInputPanel.d.ts.map +1 -1
  204. package/dist/tui/PermissionOverlay.d.ts +1 -1
  205. package/dist/tui/PlanApprovalOverlay.d.ts +2 -2
  206. package/dist/tui/QuestionDialog.d.ts +1 -1
  207. package/dist/tui/StatusBar.d.ts +6 -3
  208. package/dist/tui/StatusBar.d.ts.map +1 -1
  209. package/dist/tui/Transcript.d.ts +5 -6
  210. package/dist/tui/Transcript.d.ts.map +1 -1
  211. package/dist/tui/agent-stop-all.d.ts +11 -0
  212. package/dist/tui/agent-stop-all.d.ts.map +1 -1
  213. package/dist/tui/agent-transcript-rows.d.ts +28 -15
  214. package/dist/tui/agent-transcript-rows.d.ts.map +1 -1
  215. package/dist/tui/agent-view-commands.d.ts +3 -5
  216. package/dist/tui/agent-view-commands.d.ts.map +1 -1
  217. package/dist/tui/agent.d.ts +26 -12
  218. package/dist/tui/agent.d.ts.map +1 -1
  219. package/dist/tui/background-agents.d.ts +46 -0
  220. package/dist/tui/background-agents.d.ts.map +1 -0
  221. package/dist/tui/choice-selection.d.ts +3 -1
  222. package/dist/tui/choice-selection.d.ts.map +1 -1
  223. package/dist/tui/composer-hints.d.ts +26 -0
  224. package/dist/tui/composer-hints.d.ts.map +1 -0
  225. package/dist/tui/context-meter.d.ts +1 -1
  226. package/dist/tui/diff-rows.d.ts +30 -18
  227. package/dist/tui/diff-rows.d.ts.map +1 -1
  228. package/dist/tui/diff-view.d.ts +99 -0
  229. package/dist/tui/diff-view.d.ts.map +1 -0
  230. package/dist/tui/hint-counts.d.ts +7 -0
  231. package/dist/tui/hint-counts.d.ts.map +1 -0
  232. package/dist/tui/hypermode.d.ts +20 -26
  233. package/dist/tui/hypermode.d.ts.map +1 -1
  234. package/dist/tui/index.d.ts.map +1 -1
  235. package/dist/tui/live-window.d.ts +1 -1
  236. package/dist/tui/live-window.d.ts.map +1 -1
  237. package/dist/tui/markdown-table.d.ts +1 -2
  238. package/dist/tui/markdown-table.d.ts.map +1 -1
  239. package/dist/tui/paste-chips.d.ts +22 -0
  240. package/dist/tui/paste-chips.d.ts.map +1 -0
  241. package/dist/tui/placeholder-examples.d.ts +5 -0
  242. package/dist/tui/placeholder-examples.d.ts.map +1 -0
  243. package/dist/tui/restored-rows.d.ts +3 -1
  244. package/dist/tui/restored-rows.d.ts.map +1 -1
  245. package/dist/tui/schedule/source-deliveries.d.ts +1 -1
  246. package/dist/tui/schedule/source-deliveries.d.ts.map +1 -1
  247. package/dist/tui/shell-cell.d.ts +15 -0
  248. package/dist/tui/shell-cell.d.ts.map +1 -1
  249. package/dist/tui/slashCommands.d.ts.map +1 -1
  250. package/dist/tui/status-line/StatusLineRows.d.ts +1 -2
  251. package/dist/tui/status-line/StatusLineRows.d.ts.map +1 -1
  252. package/dist/tui/status-line/controller.d.ts +1 -1
  253. package/dist/tui/status-line/output.d.ts +2 -2
  254. package/dist/tui/status-line/payload.d.ts +2 -2
  255. package/dist/tui/status-line/run-command.d.ts +1 -1
  256. package/dist/tui/system-rows.d.ts +8 -0
  257. package/dist/tui/system-rows.d.ts.map +1 -1
  258. package/dist/tui/terminal-choice-text.d.ts +7 -0
  259. package/dist/tui/terminal-choice-text.d.ts.map +1 -1
  260. package/dist/tui/theme.d.ts +21 -0
  261. package/dist/tui/theme.d.ts.map +1 -1
  262. package/dist/tui/tool-end-rows.d.ts +9 -1
  263. package/dist/tui/tool-end-rows.d.ts.map +1 -1
  264. package/dist/tui/tool-failure-text.d.ts +13 -0
  265. package/dist/tui/tool-failure-text.d.ts.map +1 -0
  266. package/dist/tui/triggers/context-text.d.ts +3 -3
  267. package/dist/tui/triggers/context-text.d.ts.map +1 -1
  268. package/dist/tui/triggers/copy.d.ts +7 -11
  269. package/dist/tui/triggers/copy.d.ts.map +1 -1
  270. package/dist/tui/triggers/registry.d.ts +2 -3
  271. package/dist/tui/triggers/registry.d.ts.map +1 -1
  272. package/dist/tui/typed-input.d.ts +14 -0
  273. package/dist/tui/typed-input.d.ts.map +1 -0
  274. package/dist/tui/types.d.ts +7 -5
  275. package/dist/tui/types.d.ts.map +1 -1
  276. package/dist/tui/user-text-view.d.ts +25 -0
  277. package/dist/tui/user-text-view.d.ts.map +1 -0
  278. package/dist/tui/workflow-runs.d.ts.map +1 -1
  279. package/dist/tui/workspace-diff.d.ts +3 -4
  280. package/dist/tui/workspace-diff.d.ts.map +1 -1
  281. package/package.json +6 -5
  282. package/dist/chunks/acp-JU4DX3RK.js.map +0 -6
  283. package/dist/chunks/agent-session-YS3JWF6Z.js +0 -52
  284. package/dist/chunks/chunk-A64X23MU.js.map +0 -6
  285. package/dist/chunks/chunk-CZVHXYGD.js.map +0 -6
  286. package/dist/chunks/chunk-FMJCN6JZ.js.map +0 -6
  287. package/dist/chunks/chunk-FOGCQUIH.js.map +0 -6
  288. package/dist/chunks/chunk-LLZ32DHS.js.map +0 -6
  289. package/dist/chunks/chunk-S5U4BG57.js.map +0 -6
  290. package/dist/chunks/message-command-FZ6VEUK5.js.map +0 -6
  291. package/dist/chunks/resume-GG6RMJXQ.js +0 -22
  292. package/dist/chunks/session-step-VJCHKPWD.js +0 -29
  293. package/dist/chunks/tui-STU5UZBC.js.map +0 -6
  294. package/dist/chunks/upgrade-USIXROFG.js.map +0 -6
  295. package/dist/integrations/subagents/failure-text.d.ts +0 -13
  296. package/dist/integrations/subagents/failure-text.d.ts.map +0 -1
  297. /package/dist/chunks/{activity-command-TERANSMO.js.map → activity-command-NKOTZ5FK.js.map} +0 -0
  298. /package/dist/chunks/{add-MZ6KIHY3.js.map → add-AONYUNXG.js.map} +0 -0
  299. /package/dist/chunks/{agent-JZFFS4IP.js.map → agent-YPKFE66C.js.map} +0 -0
  300. /package/dist/chunks/{agent-session-YS3JWF6Z.js.map → agent-session-HFOLAFFL.js.map} +0 -0
  301. /package/dist/chunks/{archive-SXYHKL3H.js.map → archive-SUE5OUZZ.js.map} +0 -0
  302. /package/dist/chunks/{bin-main-TFKZQ7NF.js.map → bin-main-55PUHGTA.js.map} +0 -0
  303. /package/dist/chunks/{browser-3U3YBKL6.js.map → browser-HYPSUDAZ.js.map} +0 -0
  304. /package/dist/chunks/{chat-37QA7HHN.js.map → chat-6OULID33.js.map} +0 -0
  305. /package/dist/chunks/{chunk-7S5UB6DX.js.map → chunk-233DQVSC.js.map} +0 -0
  306. /package/dist/chunks/{chunk-D5SIC3SF.js.map → chunk-263WNQB4.js.map} +0 -0
  307. /package/dist/chunks/{chunk-XKEMUEI5.js.map → chunk-2KKF45DQ.js.map} +0 -0
  308. /package/dist/chunks/{chunk-N57QO3AA.js.map → chunk-2VMMTC2V.js.map} +0 -0
  309. /package/dist/chunks/{chunk-KUNQW3N3.js.map → chunk-2WQFRVVQ.js.map} +0 -0
  310. /package/dist/chunks/{chunk-LPYWPRIF.js.map → chunk-3OAGXDRM.js.map} +0 -0
  311. /package/dist/chunks/{chunk-CDZT7WGY.js.map → chunk-47TGPZWD.js.map} +0 -0
  312. /package/dist/chunks/{chunk-IG4O4UAL.js.map → chunk-4K2NRXHJ.js.map} +0 -0
  313. /package/dist/chunks/{chunk-2SVXX5QK.js.map → chunk-5CGH647C.js.map} +0 -0
  314. /package/dist/chunks/{chunk-ZJHOWWXZ.js.map → chunk-74U3P65Q.js.map} +0 -0
  315. /package/dist/chunks/{chunk-ZJMUPGWD.js.map → chunk-7EASYULO.js.map} +0 -0
  316. /package/dist/chunks/{chunk-KG2YA6TI.js.map → chunk-7YXHOSHD.js.map} +0 -0
  317. /package/dist/chunks/{chunk-EKMOETAY.js.map → chunk-AZ3YHVFA.js.map} +0 -0
  318. /package/dist/chunks/{chunk-7O4X4GYL.js.map → chunk-B2357ETN.js.map} +0 -0
  319. /package/dist/chunks/{chunk-XIURI2PQ.js.map → chunk-BEFTUDYP.js.map} +0 -0
  320. /package/dist/chunks/{chunk-DQICYFIG.js.map → chunk-CL5TCY4F.js.map} +0 -0
  321. /package/dist/chunks/{chunk-5G3VKTLZ.js.map → chunk-CUOWARJI.js.map} +0 -0
  322. /package/dist/chunks/{chunk-M2EJQU3F.js.map → chunk-DFA5OB46.js.map} +0 -0
  323. /package/dist/chunks/{chunk-B5344NIV.js.map → chunk-E3HCZYGN.js.map} +0 -0
  324. /package/dist/chunks/{chunk-Z4LTK3HY.js.map → chunk-EA6SWPO4.js.map} +0 -0
  325. /package/dist/chunks/{chunk-XNHYUV6G.js.map → chunk-EUU4TDTH.js.map} +0 -0
  326. /package/dist/chunks/{chunk-VFBIR3UC.js.map → chunk-FBNKKDIY.js.map} +0 -0
  327. /package/dist/chunks/{chunk-PETRJVXF.js.map → chunk-FQZFVLJB.js.map} +0 -0
  328. /package/dist/chunks/{chunk-5PDW6VPO.js.map → chunk-HI2KXIGA.js.map} +0 -0
  329. /package/dist/chunks/{chunk-LC5VGZO2.js.map → chunk-HU35YAIZ.js.map} +0 -0
  330. /package/dist/chunks/{chunk-2UT6U22B.js.map → chunk-IAYIUJMI.js.map} +0 -0
  331. /package/dist/chunks/{chunk-U3JIZFOS.js.map → chunk-IE5XIE4W.js.map} +0 -0
  332. /package/dist/chunks/{chunk-2UUBILYI.js.map → chunk-II57E2QW.js.map} +0 -0
  333. /package/dist/chunks/{chunk-OA5772RG.js.map → chunk-LFVQSMJG.js.map} +0 -0
  334. /package/dist/chunks/{chunk-U75JG2RT.js.map → chunk-MCNEFI5Q.js.map} +0 -0
  335. /package/dist/chunks/{chunk-JN6M424Z.js.map → chunk-N3FI7O4U.js.map} +0 -0
  336. /package/dist/chunks/{chunk-3NIZKJJG.js.map → chunk-N72DH6D5.js.map} +0 -0
  337. /package/dist/chunks/{chunk-V2VHVH5S.js.map → chunk-NLKIBRXJ.js.map} +0 -0
  338. /package/dist/chunks/{chunk-LBPM46OY.js.map → chunk-OLOTFDTU.js.map} +0 -0
  339. /package/dist/chunks/{chunk-7MLTWXEW.js.map → chunk-P2Y4LUPJ.js.map} +0 -0
  340. /package/dist/chunks/{chunk-KONWJQLM.js.map → chunk-QNF6COCY.js.map} +0 -0
  341. /package/dist/chunks/{chunk-TNTP3CNT.js.map → chunk-QO5JUKFG.js.map} +0 -0
  342. /package/dist/chunks/{chunk-GTXD263T.js.map → chunk-RB36O3CE.js.map} +0 -0
  343. /package/dist/chunks/{chunk-LH6J5QQ7.js.map → chunk-SBPCN24X.js.map} +0 -0
  344. /package/dist/chunks/{chunk-CK4TOW2N.js.map → chunk-SIK62TDI.js.map} +0 -0
  345. /package/dist/chunks/{chunk-XEOZYKPJ.js.map → chunk-T75ITEN6.js.map} +0 -0
  346. /package/dist/chunks/{chunk-2T7TZDUE.js.map → chunk-TJTRVZFN.js.map} +0 -0
  347. /package/dist/chunks/{chunk-AHVF22PV.js.map → chunk-UBOPUGDN.js.map} +0 -0
  348. /package/dist/chunks/{chunk-UQZNYNX7.js.map → chunk-UIDLXA2K.js.map} +0 -0
  349. /package/dist/chunks/{chunk-FI7TIM5P.js.map → chunk-UTMGJDC3.js.map} +0 -0
  350. /package/dist/chunks/{chunk-CLIP7QVU.js.map → chunk-UUUNXKL3.js.map} +0 -0
  351. /package/dist/chunks/{chunk-EUHPTASG.js.map → chunk-UZCA37QE.js.map} +0 -0
  352. /package/dist/chunks/{chunk-Z56MZ7UW.js.map → chunk-W27ZDC4R.js.map} +0 -0
  353. /package/dist/chunks/{chunk-HOOY63EB.js.map → chunk-XJ4IUCH6.js.map} +0 -0
  354. /package/dist/chunks/{chunk-Q6SF7T77.js.map → chunk-YKEPC6NH.js.map} +0 -0
  355. /package/dist/chunks/{chunk-3PBSWF6X.js.map → chunk-Z7XA4Y43.js.map} +0 -0
  356. /package/dist/chunks/{cli-runtime-PRG53LL6.js.map → cli-runtime-G3FHYTCI.js.map} +0 -0
  357. /package/dist/chunks/{commands-QMF4AHAY.js.map → commands-TIRZH2TK.js.map} +0 -0
  358. /package/dist/chunks/{crash-report-BSZ6SUOF.js.map → crash-report-E4J7KQ32.js.map} +0 -0
  359. /package/dist/chunks/{dist-HRWBXBF3.js.map → dist-2IUQEIEI.js.map} +0 -0
  360. /package/dist/chunks/{dist-GNI4DIHI.js.map → dist-2U6NNEPY.js.map} +0 -0
  361. /package/dist/chunks/{dist-QSOTJL6Z.js.map → dist-CVDGKJEI.js.map} +0 -0
  362. /package/dist/chunks/{dist-JDUOF4K7.js.map → dist-MKQZKCB4.js.map} +0 -0
  363. /package/dist/chunks/{dist-MYWLKPXK.js.map → dist-QCKKBLDW.js.map} +0 -0
  364. /package/dist/chunks/{dist-SO6XBKFN.js.map → dist-QHKTYYMX.js.map} +0 -0
  365. /package/dist/chunks/{dist-XDA5OMB2.js.map → dist-YX7Q3EJR.js.map} +0 -0
  366. /package/dist/chunks/{doctor-5MS7V3JB.js.map → doctor-ASXICRC5.js.map} +0 -0
  367. /package/dist/chunks/{drain-YGGEC4UE.js.map → drain-CGS3KBU3.js.map} +0 -0
  368. /package/dist/chunks/{eval-GWP6MISH.js.map → eval-XWC3UCFI.js.map} +0 -0
  369. /package/dist/chunks/{home-IZ2H7PM3.js.map → home-76YLI2M6.js.map} +0 -0
  370. /package/dist/chunks/{host-queries-UCVJBJXU.js.map → host-queries-ODUQHYBN.js.map} +0 -0
  371. /package/dist/chunks/{lifecycle-U52Z5ZMZ.js.map → lifecycle-JN43XQSS.js.map} +0 -0
  372. /package/dist/chunks/{list-SVKI2XOL.js.map → list-TC7TYJDR.js.map} +0 -0
  373. /package/dist/chunks/{login-MNDG4XIT.js.map → login-CTC6CAM4.js.map} +0 -0
  374. /package/dist/chunks/{logs-M7RCXYPY.js.map → logs-2NGJFIQI.js.map} +0 -0
  375. /package/dist/chunks/{mcp-KEQMYKDA.js.map → mcp-BPH7KWZ6.js.map} +0 -0
  376. /package/dist/chunks/{operator-tools-C57ZIYRG.js.map → operator-tools-6RYAHVSL.js.map} +0 -0
  377. /package/dist/chunks/{output-schema-IYQRSIUA.js.map → output-schema-GSWZHKSI.js.map} +0 -0
  378. /package/dist/chunks/{pal-NXMTLY6Z.js.map → pal-4QXXG42H.js.map} +0 -0
  379. /package/dist/chunks/{providers-TZBRQDXE.js.map → providers-6PIIF3WR.js.map} +0 -0
  380. /package/dist/chunks/{resident-DBIZBLOV.js.map → resident-UP7W6MV6.js.map} +0 -0
  381. /package/dist/chunks/{resume-GG6RMJXQ.js.map → resume-GJHTPMJS.js.map} +0 -0
  382. /package/dist/chunks/{resume-command-36S3HXPO.js.map → resume-command-2RFT7AGW.js.map} +0 -0
  383. /package/dist/chunks/{schedule-UR54S44B.js.map → schedule-FZISVF6A.js.map} +0 -0
  384. /package/dist/chunks/{service-VMXEAJCI.js.map → service-4WADXOUI.js.map} +0 -0
  385. /package/dist/chunks/{session-step-VJCHKPWD.js.map → session-step-FX6B4TSE.js.map} +0 -0
  386. /package/dist/chunks/{skills-RXYS26H3.js.map → skills-BJQGVQ23.js.map} +0 -0
  387. /package/dist/chunks/{state-NS47IVWW.js.map → state-2KKVQPZ2.js.map} +0 -0
  388. /package/dist/chunks/{store-3U2GZAZS.js.map → store-LO4SSRYI.js.map} +0 -0
  389. /package/dist/chunks/{store-GNFHH2LZ.js.map → store-TKJKR5NM.js.map} +0 -0
  390. /package/dist/chunks/{store-TO65IAIZ.js.map → store-YFTJ24WU.js.map} +0 -0
  391. /package/dist/chunks/{worktree-AYI5VJ5H.js.map → worktree-3HYAYSGW.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,66 @@
1
1
  # @namzu/cli
2
2
 
3
+ ## 39.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - 7608640: `/workflow <task>` is removed; typing it now gets the usual "Unknown command" answer. To ask for a workflow, start or end your message with the word workflow, or turn hypermode on with `/hypermode on`. `/workflows` is unchanged.
8
+ - 7608640: Background agents no longer keep a turn open. In the terminal, `Agent` now runs in the background by default, and a turn ends as soon as the model has answered even though agents it started are still running.
9
+
10
+ What breaks:
11
+
12
+ - The `Agent` tool's `run_in_background` default is now `true` in the terminal (it stays `false` for headless runs: `-p`, ACP, scheduled runs). A prompt, skill or hook that relied on `Agent` waiting for the result must say `run_in_background: false`. The tool description the model reads changed with it.
13
+ - Esc no longer stops background agents. Only the model's reply is interrupted; stop agents with Ctrl+C on an idle composer, `ctrl+x ctrl+k`, or `x` on a rail row. The first Ctrl+C on an idle composer now stops running background agents instead of arming the exit reminder; press it again (with none left) to exit.
14
+ - Text typed while only background agents are running is a new message, no longer a correction to the running turn. The `Working (esc to interrupt)` spinner no longer runs for them; a dim `Waiting for N background agents to finish` line shows instead.
15
+ - A finished agent now leaves one row, `Agent "…" finished · 8s (ctrl+o to expand)`, instead of a `Message from @type` row plus a `finished` row. Anything matching the old two-row text must be updated.
16
+
17
+ New: every agent that ends while the conversation is idle wakes the model once, with all of them in one message; a batch the turn waits on shows a live `Running N agents…` group and writes `N agents finished`.
18
+
19
+ To keep the old behaviour in a script, set `run_in_background: false` in the call.
20
+
21
+ - 7608640: Hypermode no longer changes the reasoning effort. Before, `/hypermode on`, the effort picker's last stop and the one-turn `hypermode` keyword pinned the effort to `xhigh` (or the highest level below it), and turning the mode off put the old effort back; the picker stop was named `xhigh + hypermode (workflows)`. Now hypermode is an independent on/off: turning it on or off, with the picker's Tab key or its last row, or typing the keyword, leaves the effort as it was, and the messages say so (`Effort stays high.`). The picker row is `hypermode (workflows)` and the footer's effort item reads `effort high · Hypermode on`. A model switch no longer re-pins an effort, and the effort chooser that follows a `/model` pick now opens whether or not hypermode is on. If you relied on hypermode to raise the effort, choose the level yourself with `/effort xhigh`; nothing else is needed to keep the mode. Choosing a level while hypermode is on leaves it on.
22
+
23
+ What the model is told also changed. The `workflow` tool is now in the tool list on every turn of a terminal or `exec` run that can start one (before, it was added only on turns with hypermode on, or the `workflow` keyword), and the model is gated by wording: the tool text and a stable system-prompt note say it may be called only after an opt-in (the `hypermode` or `workflow` keyword, hypermode on, your own words, a named saved workflow). The hypermode delegation text left the system prompt; while the mode is on the model gets a short hidden reminder instead, kept in the conversation: in full on the first message, sparsely after ten of your messages, and once when the mode ends (the mode no longer changes the cached prompt, and a resumed conversation does not hear the full text again). The one-turn keyword now opts that turn into the `workflow` tool rather than into `Agent` delegation, and its tag row says so (`Hypermode · this reply: offers workflows, effort unchanged`). The tool text gains the quality patterns (adversarial verify, judge panel, loop until dry, completeness critic). Any script that parsed the old `Hypermode is on for this conversation: xhigh effort, …` messages, or that expected the tool list to differ with the mode, needs updating.
24
+
25
+ New config key `hypermode: true` (boolean, default off, file only): conversations in the terminal start with the mode on, and `namzu exec`, `exec --json` and scheduled runs tell the model it is on (a run that cannot start a workflow is told to delegate to parallel agents with `Agent`).
26
+
27
+ ### Minor Changes
28
+
29
+ - 7608640: Workflows: a standalone `+500k` (or `+1.5m`, `+2b`; the k, m or b is required) in a message you type is now the turn's token target; a workflow started in it sees it as `budget.total` and its `agent()` calls throw once that many tokens are spent. The new `workflow.sizeGuideline` setting (`small`, `medium`, `large`, `unrestricted`; default `medium`) tells the model how large a workflow to write, and a running workflow past 25 agents or 1.5 million tokens now shows `Large workflow · /workflows to stop` on the agents rail unless hypermode is on (`NAMZU_WORKFLOW_SIZE_WARNING_AGENTS` and `NAMZU_WORKFLOW_SIZE_WARNING_TOKENS` change the thresholds). The default workflow limits are now 16 agents at once and 1000 per run; set `workflow.maxConcurrency` and `workflow.maxAgents` to keep the old 8 and 200. Scripts written for the old `pipeline()` stage order must swap the 2nd and 3rd parameters (see the SDK release).
30
+
31
+ ### Patch Changes
32
+
33
+ - 7608640: The terminal message box now shows a pasted block as a short label inside your text, for example `[Pasted text #1 +40 lines]`, and a pasted image as `[Image #1]`, instead of a separate row above the box. Backspace removes a label whole, and the full text is sent when you press Enter. Pastes of up to a few lines now stay as ordinary text. On a fresh conversation the empty box suggests an example such as `Try "fix lint errors"` (naming a file you edit often when it can), and the hint for queued messages (`Press up to edit queued messages`) is shown for its first three appearances, counted across launches in `~/.namzu/hint-counts.json`; Enter on an empty box still loads a queued message for editing and does not send the queue. A label that leaves the text by any route also drops its image. Nothing to change on your side.
34
+ - 7608640: Changes to files are drawn with line numbers, full-width colour and word highlights. An edit's call row now reads `Update(path)` (it read `Edit(path)`); its result says `Added 2 lines, removed 1 line` with the numbers in bold, and the hunks sit under it with a line-number gutter, full-width green and red rows, the changed words highlighted when little of a changed pair differs, a dim `...` between hunks and no vertical rule. An edit shows every hunk the kernel carried (it used to stop after 40 rows); a created file reads `Wrote 14 lines to notes.txt` with its first 10 lines. A declined edit or write keeps `You declined this, so it did not run.` and shows what it would have changed in dimmed colours. Terminals that report truecolor get these colours, others the named ANSI ones. `/diff` and resumed conversations draw the same rows; a resumed conversation without a journal keeps the line counts from the receipt. Anything that matched the old `Edit(...)` call text or the `Edited a.ts +2 -1` / `Created n.txt +2` result text in the terminal transcript should match the new wording; the structured events and the Desktop are unchanged. Adds `diff` 9.0.0 as a dependency.
35
+ - 7608640: Display text only; nothing to change when you upgrade. If a script, test or screen-scrape reads the terminal's wording, these lines changed: composer tag rows no longer start with a `✦`/`✧` mark and are sentence case (`Hypermode · this reply: …`); `Press ctrl+x ctrl+k again to stop background agents` is a footer hint, not a transcript row, and the stop leaves `All background agents stopped`; an agent stopped by Esc or Ctrl+C now reads `was stopped by user` like one stopped from the rail; tool results hang from ` ⎿ ` (two spaces after the glyph) everywhere; `/workflows` rows read `finished` (not `completed`) with the duration first; `/compact` echoes `› /compact` and prints its result below the turns that stay. `@namzu/sdk` workflow scripts log `Step N stopped: <reason>` from `parallel()` (was `parallel item N failed: …`) and `Item N stopped at step M: <reason>` from `pipeline()` (was `pipeline item N stopped at stage M: …`); a script that matches on those log lines must change the match.
36
+ - 7608640: Stopping background agents now leaves one row. Ctrl+C on an idle composer and `ctrl+x ctrl+k` write `All background agents stopped` and nothing else: the stopped agents no longer add a `was stopped by user` row each, and no `Worked for` line lands between them. Anything that matched those per-agent rows after a stop must expect one row.
37
+
38
+ Other visible changes:
39
+
40
+ - The `Waiting for N background agents to finish` line has a blank row above it.
41
+ - Every row of the agents rail shows the type column. Before, it was left out when all rows had the same type, so a lone failed agent looked different from its running neighbours.
42
+ - A turn's closing line now reads `Worked for 46s · done 3:45 PM`, with the clock time in your locale right after the duration. Text that matched `Worked for 46s` exactly must allow the suffix.
43
+ - A background agent that asks for approval after its turn has ended (to write a file, for example) now reaches you. Before, the request was refused with `Turn is no longer active.` and the agent carried on without the file.
44
+ - A foreground agent whose wait you released by typing keeps running after the turn, like a background agent; this is now covered by a test.
45
+
46
+ - 7608640: Diff rows and result bodies are laid out consistently. A changed row of an edit no longer ends in a stray `…` once the row has moved into scrollback; the line numbers of a hunk start from the line the hunk begins at before the change; the room the live view reserves for a change counts every wrapped row; a declined edit in a forked conversation is numbered like the live one; a created file's lines and every other result body hang from the same column as a shell call's output (a result body no longer carries a `▏` rule); and a message you sent that was longer than 10,000 characters is echoed by its first and last 2,500 characters with a `(N lines, ~M KB hidden)` divider (the model still receives all of it). The persisted hint counter in `hint-counts.json` is now named `queuedMessagesHint`; a counter saved by an earlier prerelease under the old name is ignored and counts again from zero.
47
+ - 7608640: Terminal: a dialog or picker no longer shows a half footer under it (the model name alone, or the mode without its cycle hint); the footer is drawn only with the message box. A workflow whose agent failed now says `1 failed` beside the count in the workflow view and on the rail where the row has room. A `+500k` token target is read only from what you typed, so a note Namzu adds on its own (a finished job, peer mail, a goal round) can no longer set one. `namzu exec`, `exec --json` and ACP still read a `+500k` in the prompt you give them, on the first turn only; scheduled and resident runs never carry one.
48
+ - 7608640: A background agent that asks for approval after its turn has ended no longer leaves the conversation stuck on `Working`. Once you answer, the composer is free again, the agent's end wakes the model as usual, and the launch turn closes with its `Worked for` line. Before, the screen stayed in the working state with no model request sent for the finished agent.
49
+ - 7608640: A workflow run with a failed agent is counted the same way everywhere (`2/3 agents · 1 failed`): the closing line used to say `3 agents`, and the `/workflows` list lacked the failure. The rail row keeps `1 failed` at narrow widths and drops the time and token spend first. `/hypermode on` and `/hypermode off` no longer say `Effort stays at the model default.` for a model that publishes no effort levels. A headless run (`exec`, `exec --json`) of a conversation that was told hypermode is on now tells the model it is off when it is.
50
+ - 7608640: A finished workflow with a failed agent now reads `3 agents` in its closing line and `2/3 agents` in the `/workflows` list and the detail header, with no failure count beside the counter; the rail row keeps `2/3`, its dot is green for a finished run, red for a failed or stopped run, and red for a running run that has a failed agent, and the phase's agent list shows `· 1 failed` in red after its agent count.
51
+ - 7608640: A failed agent and a workflow script that could not start now show the error text itself in red (the call's first 10 lines then `… +N lines (ctrl+o to expand)`, the whole message under an `Error` heading in the agent's own view, ` — <error>` on the agent's row in a workflow, and `✘` plus the first line for a script that did not start) instead of a plain sentence. Each line of the text is wrapped to the width at word boundaries (a break falls at a space; only a word longer than the whole width is cut inside), and the 10-line cap and the `+N` count are the text's own lines, not wrapped rows. A failed agent's row in a workflow's two-pane agent list keeps its `✘` mark and label however long the error after it is.
52
+ - Updated dependencies [7608640]
53
+ - Updated dependencies [7608640]
54
+ - Updated dependencies [7608640]
55
+ - @namzu/sdk@53.0.0
56
+ - @namzu/browser@2.0.1
57
+ - @namzu/computer-use@3.1.0
58
+ - @namzu/anthropic@6.3.0
59
+ - @namzu/ollama@2.2.5
60
+ - @namzu/openai@4.2.0
61
+ - @namzu/openrouter@3.0.4
62
+ - @namzu/sandbox@28.0.0
63
+
3
64
  ## 38.2.0
4
65
 
5
66
  ### Minor Changes
@@ -41,7 +102,7 @@
41
102
 
42
103
  ### Minor Changes
43
104
 
44
- - 167f8c4: External tool servers no longer fill the model's context before the first message. When the connected servers' tool definitions (name, description and input schema) come to 10% of the turn model's context window or more, they are offered by name and the first sentence of their description, and the model loads a tool's full definition with `search_tools` before it calls it. This is the reference client's automatic tool search with the same threshold, measured at 2.5 characters per token. A large server such as REA (207 tools, about 792,000 characters) used to make every message fail on a 200,000-token model with "This conversation is too long for the model". That failure is gone.
105
+ - 167f8c4: External tool servers no longer fill the model's context before the first message. When the connected servers' tool definitions (name, description and input schema) come to 10% of the turn model's context window or more, they are offered by name and the first sentence of their description, and the model loads a tool's full definition with `search_tools` before it calls it. The threshold is measured at 2.5 characters per token. A large server (207 tools, about 792,000 characters) used to make every message fail on a 200,000-token model with "This conversation is too long for the model". That failure is gone.
45
106
 
46
107
  What changes for you: below the threshold, nothing. Above it, the model makes one `search_tools` call the first time it uses a server's tool, and that tool stays loaded for the rest of the conversation. The decision is made per turn, so switching to a smaller model can defer tools a larger one carried. To keep a server's tools loaded up front, keep their definitions under the threshold, for example with the server's `allow` list.
47
108
 
@@ -141,7 +202,7 @@
141
202
 
142
203
  Breaking, in the order a hook author meets them:
143
204
 
144
- - **Hooks of one event now run in parallel.** They used to run one after another (`post_*` in reverse registration order), each seeing the previous hook's `modify`, and a refusal stopped the chain. Now all of an event's hooks start together on the same original context and nothing short-circuits. Their answers combine as the reference terminal's do: a refusal beats `ask`, which beats `allow`; of several rewrites (`modify`, `replace`) the last in priority/registration order wins and no hook sees another's rewrite; every `context` is kept and every `halt` honoured. A hook that relied on running after another (a formatter before a linter) must be one script or one hook. Plugins that registered with `priority` still get the first refusal quoted in priority order, but priority no longer sets who starts first.
205
+ - **Hooks of one event now run in parallel.** They used to run one after another (`post_*` in reverse registration order), each seeing the previous hook's `modify`, and a refusal stopped the chain. Now all of an event's hooks start together on the same original context and nothing short-circuits. Their answers combine by one rule: a refusal beats `ask`, which beats `allow`; of several rewrites (`modify`, `replace`) the last in priority/registration order wins and no hook sees another's rewrite; every `context` is kept and every `halt` honoured. A hook that relied on running after another (a formatter before a linter) must be one script or one hook. Plugins that registered with `priority` still get the first refusal quoted in priority order, but priority no longer sets who starts first.
145
206
  - **The default hook deadline is ten minutes, not 30 s** (`DEFAULT_SHELL_HOOK_TIMEOUT_MS`, and `HOOK_TIMEOUT_MS` for the lifecycle manager's own per-hook limit, which was 5 s). To keep the old limit set `timeoutMs: 30000` on the hook (shell hooks), or `hookTimeoutMs` on the plugin manager or in the CLI's `plugins` config.
146
207
  - **Exit code `2` now acts** where it used to be logged and ignored: on `turn_end` and `subagent_stop` it keeps the model working, with stderr as its next message (the turn's iteration limit still ends a hook that never relents); on `pre_compact` it cancels a compaction the context threshold asked for (never one the provider forced); on `post_tool_use` the stderr is shown to the model beside that call's result. A hook that exits `2` on these events by habit and meant "ignore" should exit `1`, which is still logged and ignored.
147
208
  - **JSON on stdout is now read.** A hook that exits `0` and prints a JSON object starting with `{` is taken as an answer. A hook that printed such text on purpose and wants it left alone should not start its output with `{`.
@@ -156,7 +217,7 @@
156
217
 
157
218
  Loaded configs carry a new `permissionLayers` list beside `permissions` (now the combined view); a file that writes `permissionLayers` is refused. Hosts that compile `config.permissions` themselves should call `compilePermissionLayers(permissionLayersOf(config), config.permissionChecks)` instead.
158
219
 
159
- - 5258c05: Conversations are now named by a small model, as in the reference terminal. After the first message of a conversation, one extra request (no tools, 60 tokens) asks a small model for a two-to-five-word, sentence-case noun phrase in the message's language, and `/resume` lists the conversation under it instead of under your first sentence. A name you chose with `/rename` is never replaced, and removing it falls back to the first message. If the request fails nothing is shown and the first message stays the title.
220
+ - 5258c05: Conversations are now named by a small model. After the first message of a conversation, one extra request (no tools, 60 tokens) asks a small model for a two-to-five-word, sentence-case noun phrase in the message's language, and `/resume` lists the conversation under it instead of under your first sentence. A name you chose with `/rename` is never replaced, and removing it falls back to the first message. If the request fails nothing is shown and the first message stays the title.
160
221
 
161
222
  What changes for you:
162
223
 
@@ -165,11 +226,11 @@
165
226
 
166
227
  To keep a name of your own, rename the conversation with `/rename`; there is no switch to turn the model-written title off.
167
228
 
168
- - 5258c05: The terminal's title now says what the conversation is, as in the reference terminal. It reads `✳ <name>` while Namzu waits (`◐` while a turn runs), where the name is the one you gave with `/rename`, else the title the small model wrote, else `Namzu`, and it is reset when Namzu exits so your shell's title comes back. Before, Namzu never touched the title. Set `NAMZU_DISABLE_TERMINAL_TITLE=1` to keep the title as your shell had it.
229
+ - 5258c05: The terminal's title now says what the conversation is. It reads `✳ <name>` while Namzu waits (`◐` while a turn runs), where the name is the one you gave with `/rename`, else the title the small model wrote, else `Namzu`, and it is reset when Namzu exits so your shell's title comes back. Before, Namzu never touched the title. Set `NAMZU_DISABLE_TERMINAL_TITLE=1` to keep the title as your shell had it.
169
230
 
170
231
  To keep the terminal title as it was, set `NAMZU_DISABLE_TERMINAL_TITLE=1`.
171
232
 
172
- - 5258c05: `web_fetch` now works like the reference terminal's WebFetch, which changes its input and its default output.
233
+ - 5258c05: `web_fetch` changes its input and its default output.
173
234
 
174
235
  What breaks, and what to do:
175
236
 
@@ -185,9 +246,9 @@
185
246
  ### Minor Changes
186
247
 
187
248
  - 5258c05: When the model asks several questions in one call, the terminal shows them as one card instead of one card after another: a tab for each question with a mark on the answered ones, a review tab that submits them together, multiple choice with Space, `Something else…` typed in place, and an option's preview beside the list. Esc or Cancel skips the whole call and the model is told nothing was answered; a question you leave alone is reported to it as not answered. A lone single-choice question looks and works as before, and a multiple-choice question now gets the card too (it was shown as a single choice). A Pal's answer to a batch of questions is checked question by question.
188
- - 5258c05: Plan mode in the terminal now ends in an approval, as it does in the reference terminal. While the mode is `plan` the model may write exactly one file, its plan (`plans/plan.md` in the session's directory under `~/.namzu`), and every other change is still refused. It presents the plan with a new `exit_plan_mode` tool, which opens a box showing the plan with three rows: "Yes, and auto-approve edits", "Yes, and ask before each edit" and a text row, "No, keep planning", whose typed words go back to the model (Esc keeps planning without words, Shift+Tab approves the first row with what is typed). A session launched in `auto`, or allowed to reach it, is offered "approve every tool without asking" in place of the first row. Approving switches the permission mode through the same change Shift+Tab makes, so the footer follows; the approved plan is written into the transcript and the file stays. Hidden reminders restate the rules on the reference's cadence: one when plan mode is on and none was sent in the last 5 operator turns, the full text on the first and every 5th, one line between, and one note when the mode is left. A model that used to end a plan-mode reply with its plan as text now calls `exit_plan_mode`; you can still leave plan mode with Shift+Tab or `/permissions` at any time. Desktop and `namzu exec` are unchanged.
249
+ - 5258c05: Plan mode in the terminal now ends in an approval. While the mode is `plan` the model may write exactly one file, its plan (`plans/plan.md` in the session's directory under `~/.namzu`), and every other change is still refused. It presents the plan with a new `exit_plan_mode` tool, which opens a box showing the plan with three rows: "Yes, and auto-approve edits", "Yes, and ask before each edit" and a text row, "No, keep planning", whose typed words go back to the model (Esc keeps planning without words, Shift+Tab approves the first row with what is typed). A session launched in `auto`, or allowed to reach it, is offered "approve every tool without asking" in place of the first row. Approving switches the permission mode through the same change Shift+Tab makes, so the footer follows; the approved plan is written into the transcript and the file stays. Hidden reminders restate the rules: one when plan mode is on and none was sent in the last 5 operator turns, the full text on the first and every 5th, one line between, and one note when the mode is left. A model that used to end a plan-mode reply with its plan as text now calls `exit_plan_mode`; you can still leave plan mode with Shift+Tab or `/permissions` at any time. Desktop and `namzu exec` are unchanged.
189
250
  - 5258c05: The model is now reminded of its task list when it has let it go stale. After 10 model turns without `task_create` or `task_update`, and at most once per 10 model turns, it gets a hidden note that the task tools exist, with the list as it stands (`#<id>. [<status>] <subject>`), and is told to ignore it when the work does not call for a list. The counts are read from the conversation, so they survive a resume and start again after compaction. It appears in the interactive terminal only; `namzu exec` and Desktop are unchanged.
190
- - 5258c05: Context limits follow Claude Code, and every new rule that stops something is opt-in in the SDK. Nothing a host gets without asking changes in this entry.
251
+ - 5258c05: Context limits are derived from the model's window, and every new rule that stops something is opt-in in the SDK. Nothing a host gets without asking changes in this entry.
191
252
 
192
253
  SDK, all additive:
193
254
 
@@ -202,7 +263,7 @@
202
263
  - `/compact <text>` steers the summary.
203
264
  - The CLI turns on `maxOutputContinuations: 3` and `circuitBreaker`, so a looping model or a window that refills stops the turn with a one-line explanation.
204
265
 
205
- - 5258c05: Read-only shell commands no longer ask. `ls`, `cat`, `head`, `wc`, `git status`, `git diff`, `git log`, `git show` and the rest of the reference terminal's vetted list run without a prompt in `prompt` and `accept-edits`, are allowed in `plan`, and run beside other read-only tool calls instead of one at a time. Anything the list does not vouch for still asks: a write redirection, a `$variable`, a substitution, a subshell, a here-document, a glob on a command that is not a plain reader, `cd` next to `git`, and any git flag outside the vetted table (`--output`, `-c`, `--exec-path`, `--config-env`, `fetch`, `commit`, branch or tag creation).
266
+ - 5258c05: Read-only shell commands no longer ask. `ls`, `cat`, `head`, `wc`, `git status`, `git diff`, `git log`, `git show` and the rest of the vetted list run without a prompt in `prompt` and `accept-edits`, are allowed in `plan`, and run beside other read-only tool calls instead of one at a time. Anything the list does not vouch for still asks: a write redirection, a `$variable`, a substitution, a subshell, a here-document, a glob on a command that is not a plain reader, `cd` next to `git`, and any git flag outside the vetted table (`--output`, `-c`, `--exec-path`, `--config-env`, `fetch`, `commit`, branch or tag creation).
206
267
 
207
268
  What changes for you: a turn that used to stop at `git status` now runs it. A read-only command that reads outside the working directory and added directories is still asked about, and so are protected paths and catastrophic removals. If you embed the SDK and rely on `bash` never being exempt from review, a host that wants the old behaviour passes its own `isReviewExempt` that returns false for `bash`.
208
269
 
@@ -214,7 +275,7 @@
214
275
 
215
276
  `namzu.config.local.json` is added to the SDK's protected paths, so a model write to it is asked about in every mode.
216
277
 
217
- - 5258c05: Three safety floors follow the reference terminal, so a turn in `auto` (`--yolo`) now stops and asks where it used to run silently. No exported name, option or default value changes; `ToolCallEscalation` gains two optional fields (`protectedPaths`, `dangerousRemoval`).
278
+ - 5258c05: Three safety floors now stop a turn in `auto` (`--yolo`) and ask, where it used to run silently. No exported name, option or default value changes; `ToolCallEscalation` gains two optional fields (`protectedPaths`, `dangerousRemoval`).
218
279
 
219
280
  What changes for you:
220
281
 
@@ -225,13 +286,13 @@
225
286
  If you embed the SDK with your own resume handler, read `ToolCallSummary.escalation.protectedPaths` and `.dangerousRemoval` the way you read `outsidePaths`; `createReviewHandler` does it for you. If your turn runs `bash` with no one to ask and relies on `auto`, expect those calls to be refused with a reason the model can act on.
226
287
 
227
288
  - 5258c05: Terminal notifications gain an "idle" notice and two more channels. Add `"idle-prompt"` to `tui.notifications` to be told, once, when a finished turn has sat for a minute with nobody at the keyboard (no key pressed, no prompt or picker open, nothing queued or looping, background work done). `tui.notificationMethod` now also accepts `"kitty"` and `"ghostty"`. Nothing changes unless you opt in: `notifications: true` still means a settled reply and an approval prompt only, and `osc9` stays the default method.
228
- - 5258c05: `@` file mentions in the composer now follow the reference terminal. A path with spaces or other characters outside the bare set is written `@"my docs/a b.ts"` (completion offers such files and writes the quotes), names in any script work, and `@file.ts#L10-20` sends only lines 10 to 20 (`#L7` sends one line). A closing `)` or `]` after a mention is no longer read as part of the name. Existing mentions keep working; the file size cap (60,000 characters) now applies to the lines sent.
289
+ - 5258c05: `@` file mentions in the composer now accept quoted paths. A path with spaces or other characters outside the bare set is written `@"my docs/a b.ts"` (completion offers such files and writes the quotes), names in any script work, and `@file.ts#L10-20` sends only lines 10 to 20 (`#L7` sends one line). A closing `)` or `]` after a mention is no longer read as part of the name. Existing mentions keep working; the file size cap (60,000 characters) now applies to the lines sent.
229
290
  - 5258c05: `namzu` now takes `-c` / `--continue` and `-r` / `--resume [value]` for the interactive session. `-c` opens the most recent conversation in this folder; `--resume` with no value opens the `/resume` picker; with a conversation id it resumes that conversation; with any other value it resumes the conversation of that exact title, or opens the picker searched by the value. Nothing changes for existing use: the flags are new, `namzu exec` keeps its own `--continue` / `--resume`, and `namzu resume <id>` is unchanged. Written before a subcommand or before `resume` they are refused (exit 64), like the other launch flags.
230
- - 5258c05: A new `statusLine` config key runs your command and draws its output, dimmed, above the interactive footer. Set `statusLine: { command, padding?, refreshInterval? }` in `~/.namzu/config.yaml` or a trusted project's `namzu.config.json`; the command receives the session as JSON on stdin (model, workspace, cost, context window, effort, pull request, and more, under the reference terminal's field names) and re-runs 300 ms after the session changes. A failed or empty run shows nothing. Nothing changes for anyone who does not set the key, except that the type `StatusLineConfig` is exported.
291
+ - 5258c05: A new `statusLine` config key runs your command and draws its output, dimmed, above the interactive footer. Set `statusLine: { command, padding?, refreshInterval? }` in `~/.namzu/config.yaml` or a trusted project's `namzu.config.json`; the command receives the session as JSON on stdin (model, workspace, cost, context window, effort, pull request, and more) and re-runs 300 ms after the session changes. A failed or empty run shows nothing. Nothing changes for anyone who does not set the key, except that the type `StatusLineConfig` is exported.
231
292
 
232
293
  ### Patch Changes
233
294
 
234
- - 5258c05: The default point at which older history is summarised changes. `compactionConfig.triggerThreshold` no longer defaults to `0.7`; it is optional, and when absent the kernel derives the trigger as the reference terminal does: the window, less room for the reply (the model's output cap, at most 20,000 tokens), less a 13,000-token buffer. That is 167,000 tokens (83.5%) of a 200,000-token window and 967,000 (96.7%) of a 1,000,000-token one, and never less than half the window. A host with long contexts compacts later than before, so a conversation keeps more of its history and runs closer to the provider's limit.
295
+ - 5258c05: The default point at which older history is summarised changes. `compactionConfig.triggerThreshold` no longer defaults to `0.7`; it is optional, and when absent the kernel derives the trigger as follows: the window, less room for the reply (the model's output cap, at most 20,000 tokens), less a 13,000-token buffer. That is 167,000 tokens (83.5%) of a 200,000-token window and 967,000 (96.7%) of a 1,000,000-token one, and never less than half the window. A host with long contexts compacts later than before, so a conversation keeps more of its history and runs closer to the provider's limit.
235
296
 
236
297
  The type of `triggerThreshold` is now `number | undefined` (it was `number` after parsing), so code that reads it from a parsed `CompactionConfig` must handle `undefined`; `resolveTriggerThreshold(configured, windowTokens, maxOutputTokens?)` is exported and returns the fraction actually used.
237
298
 
@@ -273,7 +334,7 @@
273
334
 
274
335
  ### Minor Changes
275
336
 
276
- - 9e63191: The terminal now retries a model call that fails for a reason that may pass (a dropped connection, a 5xx, an overloaded server, a rate limit with a short wait) the way the reference terminal does, instead of stopping after three tries. It tries ten times, waits from half a second doubling to thirty-two seconds with a little added on top, treats a `Retry-After` as a minimum, gives up on a wait longer than a minute (the reply then pauses and Enter tries again), and believes a provider that says `x-should-retry: false`. A reply cut off by a dropped connection starts over and the half-drawn text is taken back. While it waits, the Working row reads `Retrying in 5s · attempt 2/10` and counts down; Esc interrupts it. Nothing needs changing in your setup.
337
+ - 9e63191: The terminal now retries a model call that fails for a reason that may pass (a dropped connection, a 5xx, an overloaded server, a rate limit with a short wait) instead of stopping after three tries. It tries ten times, waits from half a second doubling to thirty-two seconds with a little added on top, treats a `Retry-After` as a minimum, gives up on a wait longer than a minute (the reply then pauses and Enter tries again), and believes a provider that says `x-should-retry: false`. A reply cut off by a dropped connection starts over and the half-drawn text is taken back. While it waits, the Working row reads `Retrying in 5s · attempt 2/10` and counts down; Esc interrupts it. Nothing needs changing in your setup.
277
338
 
278
339
  SDK: `ProviderRetryConfig` gains optional `jitter` (`'full'` or `'proportional'`), `retryAfter` (`'exact'` or `'floor'`) and `retryMidStream`, `ProviderRetryNotice` and the `provider_retry` event gain an optional `restart`, `ProviderRequestError` gains `shouldRetry` (only `false` is acted on), `providerHttpError` takes `shouldRetry`, and `providerVendorError` reads `x-should-retry`. No default changed: `maxRetries` is still 3, jitter still full, `Retry-After` still exact, a stream that failed after output is still not retried unless a host sets `retryMidStream` (a host that does must drop what the failed attempt showed when it sees `restart`; the turn drops its own copy). Hosts that want the terminal's numbers pass them in `query({ retry })`.
279
340
 
@@ -294,7 +355,7 @@
294
355
 
295
356
  ### Minor Changes
296
357
 
297
- - b620273: Shift+Tab and the permission prompt now follow the reference terminal. What changes for you:
358
+ - b620273: Shift+Tab and the permission prompt have changed. What changes for you:
298
359
 
299
360
  - Shift+Tab goes `prompt`, `accept-edits`, `plan`, then `auto` ("bypass permissions on") when the session may use it, then back to `prompt`; from `auto` or `strict` it returns to `prompt`. Starting with `--yolo`, `--dangerously-skip-permissions` or `--permission-mode auto` allows the stop, so one press no longer loses bypass for good. The new `--allow-dangerously-skip-permissions` allows it without starting in `auto`, and choosing `auto` by name in `/permissions` allows it for the rest of the session. Without any of these the key behaves as before (`plan` returns to `prompt`).
300
361
  - "Yes, allow all tools for this conversation" is gone from the terminal's prompts, along with the `a` key and the "Start and allow all tools" answer for agents and workflows. It turned every later tool call into an approval while the mode still read `prompt`, then showed `bypass permissions on`. Prompts now offer Yes and No, and at most one more answer that holds for the whole prompt: for an edit, "Yes, and switch to accept edits for this session" (the same switch Shift+Tab makes); for a plain shell command, a fetch of one host or an MCP tool, "Yes, and don't ask again for <it> this session". The remembered answer covers exactly the command line, host or tool shown, is consulted after your `[permissions]` table, and is never offered for a sandbox escape, a path outside the working directory, a call a rule asks about, or a destructive command; it ends with the session. If you relied on the old answer to stop being asked, start with `--permission-mode accept-edits`, press Shift+Tab to the mode you want, or add `allow` rules to `[permissions]`. Agent and workflow starts keep asking, with Yes and No only. The Desktop app and ACP clients keep their own approve-all answer.
@@ -303,7 +364,7 @@
303
364
 
304
365
  ### Minor Changes
305
366
 
306
- - 8d6b262: The agents rail, the workflow detail and talking to a sub-agent now follow the reference terminal. What changes for you:
367
+ - 8d6b262: The agents rail, the workflow detail and talking to a sub-agent have changed. What changes for you:
307
368
 
308
369
  - The rail has a blank row above it, its bullet sits under the footer line's first glyph, rows stop two cells short of the edge, and the pointer and bullets use no accent colour. While the rail has the keys its key line (`Enter to view · x to stop`, plus `ctrl+x ctrl+k to stop all agents` when several run) replaces the footer's mode line instead of being printed under the rows. A background agent that completes leaves the rail at once; a failed or stopped one stays 30 seconds. `ctrl+x ctrl+k` on the rail stops every running agent.
309
370
  - A running background agent's description column becomes a live three-to-five-word label, refreshed at most every 30 seconds by one tool-less request to the agent's own model; it adds model usage, and falls back to the launch description. A message waiting for an agent shows as `N queued`.
@@ -336,9 +397,9 @@
336
397
 
337
398
  - 692466e: The message box in Namzu Desktop now shows, beside the mode, how many background shells are running ("2 shells", which opens the list) and the pull request of the conversation's branch ("PR #607", coloured by review state, which opens it in the browser). The pull request comes from the GitHub command line tool the terminal already uses; with `gh` missing, signed out, or no pull request, nothing is shown. The CLI host gains a read-only `namzu/project/pr` request for it.
338
399
  - 692466e: A message typed in Namzu Desktop while a reply is running now reaches that reply at its next model request, as the terminal does. Before, the desktop host reported live input as unavailable for the whole of every turn, so each such message silently waited for the reply to finish. Nothing to change on your side.
339
- - 437dd6d: The composer footer is now one row of items in the reference's order: the mode in plain words (`⏵⏵ bypass permissions on`, `⏵⏵ accept edits on`, `‖ plan mode on`), `PR #592` for the current branch's pull request (coloured by review state and linked where the terminal supports it), a `N shells` pill for running background shells (the separate "shells running" line is gone), then `esc to interrupt` while a turn runs, `← N agents` and `↓ to manage`. From an empty composer `←` opens the agents and `↓` focuses the shell pill first (Enter opens the `/jobs` screen) and then the agents rail; with anything typed both keys keep moving the cursor, and the hints leave the row. The agents rail's own `↓ to manage` on its `main` row is gone, since the footer says it. A running shell takes the `(shift+tab to cycle)` reminder off the row. The model name now yields first when the row is narrow. The pull request comes from the `gh` command line tool, read in the background, only on a real terminal; `NAMZU_PR_STATUS=off` turns it off. The working directory no longer appears on the footer row. The composer's frame is now two plain horizontal rules with a dim `❯ ` prompt between them: the boxed frame with corners, side borders and a `MESSAGE` caption is gone, and `hypermode` is named at the upper rule's right end.
400
+ - 437dd6d: The composer footer is now one row of items in this order: the mode in plain words (`⏵⏵ bypass permissions on`, `⏵⏵ accept edits on`, `‖ plan mode on`), `PR #592` for the current branch's pull request (coloured by review state and linked where the terminal supports it), a `N shells` pill for running background shells (the separate "shells running" line is gone), then `esc to interrupt` while a turn runs, `← N agents` and `↓ to manage`. From an empty composer `←` opens the agents and `↓` focuses the shell pill first (Enter opens the `/jobs` screen) and then the agents rail; with anything typed both keys keep moving the cursor, and the hints leave the row. The agents rail's own `↓ to manage` on its `main` row is gone, since the footer says it. A running shell takes the `(shift+tab to cycle)` reminder off the row. The model name now yields first when the row is narrow. The pull request comes from the `gh` command line tool, read in the background, only on a real terminal; `NAMZU_PR_STATUS=off` turns it off. The working directory no longer appears on the footer row. The composer's frame is now two plain horizontal rules with a dim `❯ ` prompt between them: the boxed frame with corners, side borders and a `MESSAGE` caption is gone, and `hypermode` is named at the upper rule's right end.
340
401
  - 437dd6d: The startup header now shows the folder Namzu is working in on the row under the version, with the home folder written as `~` and a long path cut from the left to fit. The footer no longer carries it.
341
- - 437dd6d: Shell commands in the terminal now read like Claude Code's: a green or red dot in front of `Bash(command)` instead of a tick and a duration, the command's line breaks kept in the header, and the output hung under `⎿` as its first three lines followed by `… +N lines (ctrl+o to expand)`. A failed command now shows its error output and `Exit code N` instead of repeating the command, an empty result reads `(No output)`, and a command moved to a background job reads `Running in the background` instead of the instructions meant for the model. While a command runs it shows `Running…` with the elapsed time.
402
+ - 437dd6d: Shell commands in the terminal now show a green or red dot in front of `Bash(command)` instead of a tick and a duration, the command's line breaks kept in the header, and the output hung under `⎿` as its first three lines followed by `… +N lines (ctrl+o to expand)`. A failed command now shows its error output and `Exit code N` instead of repeating the command, an empty result reads `(No output)`, and a command moved to a background job reads `Running in the background` instead of the instructions meant for the model. While a command runs it shows `Running…` with the elapsed time.
342
403
  - 28eaee1: On Windows the `bash` tool, background jobs started with `run_in_background`, and plugin shell hooks now run in Git for Windows' bash instead of cmd.exe whenever Git for Windows is installed, and `hostCommandShell()` and `BashTool.commandDialect()` answer `bash` there instead of `cmd`. Before, every command a model wrote was refused or needed a person to approve it each time, because the permission rules cannot read cmd.exe lines. Git Bash is looked up as `NAMZU_BASH_SHELL`, then `%ProgramFiles%\Git\bin\bash.exe`, then `%ProgramFiles(x86)%\Git\bin\bash.exe`, then `%LOCALAPPDATA%\Programs\Git\bin\bash.exe`, then the install holding the first `git` that `where.exe git` lists outside the working directory. Commands now need Unix syntax (`/dev/null`, forward slashes, `$VAR`); the model is told so, and `>nul` is rewritten to `/dev/null`. A host that depends on cmd.exe syntax in the `bash` tool, or on `hostCommandShell().dialect === 'cmd'` on a machine with Git for Windows, sets `NAMZU_BASH_SHELL=cmd` (a path to `cmd.exe`, such as `%ComSpec%`, works too) to keep the old behaviour. Without Git for Windows nothing changes except that `windowsShellNotice()` returns a sentence saying commands run in cmd.exe and each asks for approval; the CLI shows it once at session start. New exports: `findGitBash`, `isWindowsBash`, `windowsShellNotice`, `rewriteWindowsNullRedirect`, `WINDOWS_BASH_GUIDANCE`, `WINDOWS_CMD_FALLBACK_NOTICE`, and an optional `windows` flag on `CommandShell`. Stopping a command or job on Windows now also ends processes that Git Bash forked, which `taskkill /T` alone missed.
343
404
  - 437dd6d: Agents that the model gave one `workflow` label now also appear as a single row on the rail under the message box: `◯ name`, a progress bar, `3/7 · elapsed · ↓ tokens`. Press ↓ to reach it; Enter opens that workflow's phases and agents (Esc comes back to the row), `x` stops its running agents or clears the row once it has finished, and the row leaves 30 seconds after the last agent ends. When a workflow's turn ends, one line in the conversation says how it ended. The rail's key line now reads `enter to view · x to stop`.
344
405
  - 437dd6d: Workflows and subagents are now separate in the terminal. An agent started with a `workflow` label no longer shows up as an agent row on the rail: it appears only inside its workflow, which is one row after the agent rows, and the `main` row shows only when there is an agent row. Enter on the workflow opens its phases (numbered, turning ✔ or ✘, with done/total), then the agents of a phase, then an agent's transcript; ← or Esc goes back up and `x` stops the whole workflow or one agent. In the conversation a workflow's launch is one `Workflow <name>` line instead of a row per agent, and the turn summary no longer counts phases.
@@ -575,7 +636,7 @@
575
636
 
576
637
  Agent sessions expose optional image/document attachment support declarations from their exact primary provider route. ACP rejects new attachments before a model request when that route explicitly cannot receive them; undeclared support retains the existing runtime policy.
577
638
 
578
- - a5e0038: Codex model names in the Desktop model list now read like the Codex app ("GPT-5.6 Sol" instead of "GPT-5.6-Sol"), and each engine's model list marks that engine's own recommended default with an optional `default: true` flag on the row. Namzu provider lists no longer say "Namzu default" in a row's note; the flagged row replaces it. Model ids are unchanged, so saved selections keep working; clients that read the model list can ignore the new flag.
639
+ - a5e0038: Codex model names in the Desktop model list now show as "GPT-5.6 Sol" instead of "GPT-5.6-Sol", and each engine's model list marks that engine's own recommended default with an optional `default: true` flag on the row. Namzu provider lists no longer say "Namzu default" in a row's note; the flagged row replaces it. Model ids are unchanged, so saved selections keep working; clients that read the model list can ignore the new flag.
579
640
  - e94e149: `namzu acp --desktop` gains four methods for the Desktop conversation header: `namzu/conversations/rename` (`{ sessionId, title }` returns `{ title }`; an empty title restores the title derived from the first message), `namzu/conversations/fork` (`{ sessionId }` returns `{ id, title }`; refused while a reply is running or when there is nothing to copy), `namzu/conversations/markdown` (`{ sessionId }` returns `{ markdown, truncated }`, cut at 4 MiB of UTF-8) and `namzu/project/git` (returns `{ branch, subject }`, or `null` when the folder is untrusted, not a repository, git is missing or git takes over 3 seconds). All are new; existing methods and clients are unaffected. Each conversation method needs a trusted folder and a conversation this project owns, the same as archive.
580
641
  - 9ef6506: Expose live tool progress and actual turn failure messages through optional fields on existing ACP update variants. Add explicit optional `namzu/*` ACP host extensions and advertise their method names. Gateway history loading now receives the requested workspace as an optional second argument; existing one-argument gateways remain compatible.
581
642
 
@@ -920,7 +981,7 @@
920
981
  unchanged. Update an existing guest bridge from the shipped asset while idle,
921
982
  then reconfigure normally to load its updated description.
922
983
 
923
- - b0b6afa: The Desktop model list writes a GPT display name such as "GPT-5.6-Sol" as "GPT-5.6 Sol", the way the Codex app does. Only names that start with "GPT-" and end in "-<Word>" change; model ids sent to providers, and every other family's labels, are unchanged. Nothing to do on upgrade.
984
+ - b0b6afa: The Desktop model list writes a GPT display name such as "GPT-5.6-Sol" as "GPT-5.6 Sol". Only names that start with "GPT-" and end in "-<Word>" change; model ids sent to providers, and every other family's labels, are unchanged. Nothing to do on upgrade.
924
985
  - e03a000: On Windows, `namzu upgrade` now removes the `namzu.ps1` wrapper that npm writes
925
986
  next to `namzu.cmd` after each update (only when it belongs to `@namzu/cli`).
926
987
  PowerShell prefers that wrapper and the default execution policy refuses it, so
@@ -1219,7 +1280,7 @@
1219
1280
 
1220
1281
  The default anonymous Zen model changes from `muse-spark-1.3-contributor-free` to `space-bunny-free` in both the SDK and CLI. Callers that need the old choice must pass `model: 'muse-spark-1.3-contributor-free'` explicitly and try credentialed Zen access, subject to gateway admission. The gateway currently rejects direct keyless Namzu requests to Muse and six other documented free models with HTTP 403; only Space Bunny Free completed a live keyless text and tool-continuation test. Anonymous model discovery now admits only that verified model while retaining the other free models for credentialed use.
1221
1282
 
1222
- Zen and Zen Go now follow the reference client's route overrides for DeepSeek V4 Flash and MiniMax, handle Muse Spark reasoning continuation without replaying gateway-bound ciphertext, and read the current Zen Go price table when refreshing the catalogue. These keyed routes have wire-fixture coverage but were not live-tested with an account. The CLI distinguishes model listing from verified inference and explains the gateway's specific HTTP 403 free-tier refusal.
1283
+ Zen and Zen Go now use the route overrides for DeepSeek V4 Flash and MiniMax, handle Muse Spark reasoning continuation without replaying gateway-bound ciphertext, and read the current Zen Go price table when refreshing the catalogue. These keyed routes have wire-fixture coverage but were not live-tested with an account. The CLI distinguishes model listing from verified inference and explains the gateway's specific HTTP 403 free-tier refusal.
1223
1284
 
1224
1285
  ### Patch Changes
1225
1286
 
@@ -1774,14 +1835,14 @@
1774
1835
 
1775
1836
  ### Minor Changes
1776
1837
 
1777
- - 64489b3: Delegated work split into phases reads by phase, as the reference terminal's workflow view does. Nothing is removed and no key changes meaning; screens and transcripts look different.
1838
+ - 64489b3: Delegated work split into phases reads by phase. Nothing is removed and no key changes meaning; screens and transcripts look different.
1778
1839
 
1779
1840
  - **The agent rail keeps a phased workflow together.** Agents sharing a `workflow` label stay on the rail as one piece for the parent turn: a finished phase is one line, `✓ Phase 1 · 2/2 · 4.0s`, and a live phase has its agents beneath it. Unlabelled agents are grouped by launch, as before. Under 24 rows a finished phase's line is left out.
1780
1841
  - **The rail's header counts the whole workflow**: `● <workflow> · 1 running · 2/3 done · 6.5s · 18.0k tokens · ↓ / ctrl+t`. Time and spend show from 96 columns.
1781
1842
  - **The agent cockpit opens on the phase still working**, and on its first working agent, instead of on the first phase. Its header reads `2/3 agents done · 1 running · 7.7s · 18.0k tokens` while work runs and `3/3 agents · 9.5s · 27.0k tokens · done` after, in place of `N active · N total`. Phase rows add the phase's time; the agent pane is titled by its phase (`Phase 2 · 1 agent`) instead of `Agents · 1/2`.
1782
1843
  - **The closing line** adds the phase count when two or more were named, the tokens spent, and failures: `✻ Worked for 11s · 3 agents in 2 phases · 27.0k tokens`.
1783
1844
 
1784
- - 5fb75c2: Delegated work reads more like the reference terminal. Nothing is removed and no key changes meaning; transcripts and screenshots will look different.
1845
+ - 5fb75c2: Delegated work has a clearer layout. Nothing is removed and no key changes meaning; transcripts and screenshots will look different.
1785
1846
 
1786
1847
  - **Launch receipts.** Each batch of agents one response launched now writes one `● Launched 2 agents · <workflow> / <phase> (ctrl+t to manage)` row, with the agents named beneath it as a `├`/`└` tree.
1787
1848
  - **Completion rows** read `✓ <name> · 1.7s · 9.0k tokens` or `✗ <name> · failed after 2.9s · <reason>` instead of `<name> · Completed · ctrl+t · agent details`. A completed agent's final answer is attached collapsed; Ctrl+O opens it. The hint is `ctrl+o result · ctrl+t details`.
@@ -1792,7 +1853,7 @@
1792
1853
  - **The `/effort` picker is a left-to-right slider** on terminals at least 60 columns wide: `default`, the model's levels, then `┆ orchestrate` in violet with `<highest> + delegate by default` under it. ←/→ (and ↑/↓) move it, digits select, Enter applies, Esc goes back. Narrower terminals, and menus too long for one row, keep the vertical list.
1793
1854
  - **Orchestrate mode shows on the message box**: the top border carries `orchestrate` in violet on the right, with a still colour gradient where colour is allowed; the footer's `orchestrate` is violet. Below 40 columns the border stays plain.
1794
1855
 
1795
- - 4375e72: The terminal draws research turns the way the reference terminal does.
1856
+ - 4375e72: The terminal draws research turns with their own layout.
1796
1857
 
1797
1858
  - **Web searches and fetches** are one row naming the query or address, `✓ Web search("…")` / `✓ Web fetch(https://…)`, with a `⎿` line that reads `Searching: …` while the call runs and settles to `Found 3 results in 4.1s`, `Did 1 search in 9.0s` or `Received 7.5KB in 1.2s`. Consecutive calls sit together without blank lines, and a long query is cut at the terminal's width with an ellipsis. A fetched page or result list stays behind Ctrl+O. They used to read `✓ Web search · 9.0s` with no query and a blank line between every row.
1798
1859
  - **Markdown tables** are drawn as a box (`┌┬┐ ├┼┤ └┴┘`) sized to the terminal, with long cells wrapped inside their column and `**bold**`, `` `code` `` and links drawn rather than shown as source. Where the columns cannot fit, the table becomes `Header: value` records separated by a `─` rule. A table streaming in no longer flashes raw `| a | b |` rows. Tables used to be a header, one rule and cells cut mid-word at 32 characters.
@@ -2512,7 +2573,7 @@ saved evidence. This child cannot be continued.` banner is the first thing on
2512
2573
 
2513
2574
  - 449642e: Add `/orchestrate`, a session mode layered above reasoning effort rather than inside it.
2514
2575
 
2515
- `@namzu/cli`: `/orchestrate [on|off]` (no argument toggles) turns the mode on or off for the current session. It is deliberately not a `ReasoningEffort` value — typing `/effort orchestrate` still reports "unavailable for this model", exactly as `ultracode` does today. When the `/effort` picker can open, the mode also appears there as its own row below a rule, apart from the model's own levels. Turning the mode on pins reasoning effort to the model's highest published level and strengthens delegation guidance for future turns toward delegating by default; when the model publishes no exact effort menu the mode still turns on and still strengthens guidance, but pins nothing and says so. Like effort, the mode is in-memory and per-session — nothing is written to preferences. A model switch still resets an explicit effort override to the new model's default, but while the mode is on it re-pins to the new model's highest level instead. The status line shows the level and the mode together (`effort high · orchestrate`), or the mode alone when nothing is pinned — never a fabricated effort value.
2576
+ `@namzu/cli`: `/orchestrate [on|off]` (no argument toggles) turns the mode on or off for the current session. It is deliberately not a `ReasoningEffort` value — typing `/effort orchestrate` still reports "unavailable for this model", exactly as the mode's earlier name did. When the `/effort` picker can open, the mode also appears there as its own row below a rule, apart from the model's own levels. Turning the mode on pins reasoning effort to the model's highest published level and strengthens delegation guidance for future turns toward delegating by default; when the model publishes no exact effort menu the mode still turns on and still strengthens guidance, but pins nothing and says so. Like effort, the mode is in-memory and per-session — nothing is written to preferences. A model switch still resets an explicit effort override to the new model's default, but while the mode is on it re-pins to the new model's highest level instead. The status line shows the level and the mode together (`effort high · orchestrate`), or the mode alone when nothing is pinned — never a fabricated effort value.
2516
2577
 
2517
2578
  `@namzu/sdk`: `codingAgentDoctrineContribution` gains an optional `orchestrate` field on `CodingAgentDoctrineOptions`, and a new exported `CODING_AGENT_ORCHESTRATE_DOCTRINE` constant. Passing `orchestrate: true` (and leaving `delegation` at its default) appends that text after the existing delegation doctrine. Leaving the new field unset — the only behavior any existing caller can observe — renders byte-identical output to before this field existed. No default changed and no export was renamed or removed, so this is additive for every current consumer.
2518
2579
 
@@ -7854,7 +7915,7 @@ progress in <a local notes directory>/...` — a runtime error
7854
7915
  returns 404, to explain the doctor's protocol/runtime split. The split is now
7855
7916
  explained in the sentence itself.
7856
7917
  - `@namzu/sdk` source comments cited design documents by path. They cite the
7857
- session by name instead, which is what the reference was ever worth.
7918
+ session by name instead, which is all such a citation was ever worth.
7858
7919
 
7859
7920
  No API, type, or behaviour change. The `@namzu/sandbox` message text is the
7860
7921
  only runtime string affected, and nothing asserts on it.
@@ -8959,7 +9020,7 @@ progress in <a local notes directory>/...` — a runtime error
8959
9020
  That is the failure the rule exists for. A design explained by reference to
8960
9021
  somebody else's product has handed over its rationale: the next reader
8961
9022
  reaches for that product's model instead of asking what namzu is trying to
8962
- achieve, and when the reference changes the comment becomes a claim nobody
9023
+ achieve, and when that product changes the comment becomes a claim nobody
8963
9024
  can check. Each one now states the same decision on its own terms — what it
8964
9025
  accomplishes, and what breaks without it.
8965
9026
 
@@ -9077,7 +9138,7 @@ progress in <a local notes directory>/...` — a runtime error
9077
9138
 
9078
9139
  Comments across the kernel explained namzu's design by naming another
9079
9140
  product: "mirrors X's container architecture", "reference: X's
9080
- `normalizePathForSandbox()`", "which is what Y and Z both do", "Claude Code
9141
+ `normalizePathForSandbox()`", "which is what Y and Z both do", "another tool
9081
9142
  uses 2000 for the same reason". Behaviour was correct throughout — this is
9082
9143
  about what the code says it is. A kernel that explains itself by citation
9083
9144
  reads as a reimplementation of something else, and namzu is not one.
@@ -9414,12 +9475,12 @@ progress in <a local notes directory>/...` — a runtime error
9414
9475
 
9415
9476
  Type `@path/to/file` in a message and namzu inlines that file's contents for the model while your message keeps the readable `@path` token (files are resolved inside the working directory and size-capped). Press `Esc` to interrupt a running turn — `Ctrl+C` is now reserved for exiting (press twice).
9416
9477
 
9417
- - 2837e6c: **Dark theme, trust-folder gate, bypass-permissions mode, Claude-Code-style tool rendering, and a big token-cost fix.**
9478
+ - 2837e6c: **Dark theme, trust-folder gate, bypass-permissions mode, tool rendering, and a big token-cost fix.**
9418
9479
 
9419
9480
  - **Fully dark theme.** The TUI now uses a curated dark hex palette on a black canvas (the root fills with the background and the screen is cleared on launch) for a cohesive, immersed look.
9420
- - **Trust folder gate.** On first launch in a directory, namzu shows the working directory and asks you to trust it before reading/running/editing files there (Claude-Code style). Trusted folders are remembered in `~/.namzu/trust.json`; trusting a repo root covers its subfolders. Declining exits.
9481
+ - **Trust folder gate.** On first launch in a directory, namzu shows the working directory and asks you to trust it before reading/running/editing files there. Trusted folders are remembered in `~/.namzu/trust.json`; trusting a repo root covers its subfolders. Declining exits.
9421
9482
  - **Bypass permissions.** `namzu --dangerously-skip-permissions` (alias `--yolo`) runs tools without the approval prompt; a red banner warns while it's active.
9422
- - **Claude-Code-style tool rendering.** Tool calls render as `⏺ Bash(ls -la)` with a dim `⎿ result` line hugging the call, grouped with one blank line between call+result units.
9483
+ - **Tool rendering.** Tool calls render as `⏺ Bash(ls -la)` with a dim `⎿ result` line hugging the call, grouped with one blank line between call+result units.
9423
9484
  - **Token-cost fix.** clawtool's ~70-tool catalog no longer inflates the prompt (it could push a single message past 200k tokens). It's registered as deferred tools the model loads on demand via `search_tools` — see the separate changeset.
9424
9485
 
9425
9486
  - 548689f: **Define sub-agents on the fly.** The `Agent` tool now takes an optional `role` — a system prompt describing a specialist persona (e.g. "You are a security auditor; flag vulnerabilities and rate severity"). namzu spins up a fresh sub-agent with that role at runtime, no pre-defined agent file needed; omit `role` for a general-purpose one. Call `Agent` several times in one turn (each with its own `role`) to fan out a parallel swarm of specialists. The persona is layered on top of namzu's anti-fabrication guardrails so a dynamic role can't opt out of "don't invent results".
@@ -9427,9 +9488,9 @@ progress in <a local notes directory>/...` — a runtime error
9427
9488
 
9428
9489
  Tool calls now feel alive: while a tool runs it shows in a live region with an animated spinner and a ticking elapsed timer, and on completion it settles into the transcript with a ✓ (green) / ✗ (red) status glyph and how long it took — e.g. `✓ Bash(npm test) · 1.2s` — above its `⎿` result. Before the first token of a reply the agent shows a `thinking…` line. The status bar gains a context-window fill gauge (`ctx ███░░░░░ 38%`, green→yellow→red as the window fills).
9429
9490
 
9430
- - 8385ac7: **Claude-Code-style header: a bloom icon next to the name / model / cwd.**
9491
+ - 8385ac7: **Header: a bloom icon next to the name / model / cwd.**
9431
9492
 
9432
- The startup header is now a compact icon + info block (like Claude Code) instead of a large wordmark: a teal→green diamond "bloom" mark (a terminal homage to the namzu.ai SVG) on the left, with `namzu vX.Y.Z`, the connected provider · model, and the working directory stacked to its right. Narrow terminals fall back to a one-line `❀ namzu`.
9493
+ The startup header is now a compact icon + info block instead of a large wordmark: a teal→green diamond "bloom" mark (a terminal homage to the namzu.ai SVG) on the left, with `namzu vX.Y.Z`, the connected provider · model, and the working directory stacked to its right. Narrow terminals fall back to a one-line `❀ namzu`.
9433
9494
 
9434
9495
  - 52af97e: **Paste images into the conversation (vision input).**
9435
9496
 
@@ -9437,7 +9498,7 @@ progress in <a local notes directory>/...` — a runtime error
9437
9498
 
9438
9499
  - eabdc0d: **Assistant replies now render as markdown.**
9439
9500
 
9440
- Responses were shown as flat text; they now render the way Claude Code / gemini-cli present them:
9501
+ Responses were shown as flat text; they now render with their structure kept:
9441
9502
 
9442
9503
  - **Code blocks** in a distinct color on a dim left rule, with the language label.
9443
9504
  - **Inline `code`** in a code color.
@@ -9464,7 +9525,7 @@ progress in <a local notes directory>/...` — a runtime error
9464
9525
 
9465
9526
  - c3b4c84: **Queue messages while the agent is working.**
9466
9527
 
9467
- You can now type and send a message while namzu is still responding — it's held in a queue (a "⏎ N messages queued" hint shows under the composer) and sent automatically as soon as the current turn settles, like Claude Code. The composer stays editable during a turn; queued messages run one at a time in order.
9528
+ You can now type and send a message while namzu is still responding — it's held in a queue (a "⏎ N messages queued" hint shows under the composer) and sent automatically as soon as the current turn settles. The composer stays editable during a turn; queued messages run one at a time in order.
9468
9529
 
9469
9530
  - b1e18c7: **Auto-renew the Claude Code OAuth token so it no longer 401s when it expires.**
9470
9531
 
@@ -9474,7 +9535,7 @@ progress in <a local notes directory>/...` — a runtime error
9474
9535
 
9475
9536
  - e16e4b3: **Paste affordance + a namzu bloom mark on the splash.**
9476
9537
 
9477
- - Pasting a large or multi-line block no longer floods the input. It's held as an attachment chip — `⎘ Pasted text #1 (+42 lines)` — above the composer, like Claude Code. Type your prompt alongside it and send; the full pasted text is folded into the message. Backspace on an empty line removes the last paste.
9538
+ - Pasting a large or multi-line block no longer floods the input. It's held as an attachment chip — `⎘ Pasted text #1 (+42 lines)` — above the composer. Type your prompt alongside it and send; the full pasted text is folded into the message. Backspace on an empty line removes the last paste.
9478
9539
  - The startup splash now shows the namzu bloom mark (`❀`, in the icon's signature green) above the NAMZU wordmark.
9479
9540
 
9480
9541
  - 8df8f74: **M2 — Provider profile management** (`ses_003-provider-profiles`)
@@ -9507,11 +9568,11 @@ progress in <a local notes directory>/...` — a runtime error
9507
9568
 
9508
9569
  namzu now persists each conversation to the SDK's session store (`DiskSessionStore`) under the working directory's `.namzu` — the same hierarchy `query()` writes its runs to, so a conversation's `session.json` and `runs/` live together. Every turn (your message + the reply) is appended to the active session.
9509
9570
 
9510
- `/resume` opens a Claude-Code-style picker of this folder's recent conversations (title + relative time); ↑/↓ navigate, Enter restores the transcript and continues in that session, Esc cancels. Each `cwd` is one project (a stable id kept in `.namzu/cli.json`); conversations are sessions under a shared CLI thread. This reuses the SDK's existing persistence rather than a parallel store.
9571
+ `/resume` opens a picker of this folder's recent conversations (title + relative time); ↑/↓ navigate, Enter restores the transcript and continues in that session, Esc cancels. Each `cwd` is one project (a stable id kept in `.namzu/cli.json`); conversations are sessions under a shared CLI thread. This reuses the SDK's existing persistence rather than a parallel store.
9511
9572
 
9512
9573
  - c8d6b66: **`namzu run` — headless one-shot mode for scripts and CI.**
9513
9574
 
9514
- `namzu run "your prompt"` runs a single prompt through the same agent the TUI uses and prints the reply to stdout (the equivalent of claude-code's `--print`). The prompt can also come from stdin (`echo "…" | namzu run`), and `--format json` emits `{"text": "…"}`. Status lines go to stderr (silenced by `--quiet`), so stdout is just the answer. It's non-interactive (tools auto-run, but the safety gate still hard-denies catastrophic commands) and uses an ephemeral session, so one-shots don't clutter `/resume`.
9575
+ `namzu run "your prompt"` runs a single prompt through the same agent the TUI uses and prints the reply to stdout. The prompt can also come from stdin (`echo "…" | namzu run`), and `--format json` emits `{"text": "…"}`. Status lines go to stderr (silenced by `--quiet`), so stdout is just the answer. It's non-interactive (tools auto-run, but the safety gate still hard-denies catastrophic commands) and uses an ephemeral session, so one-shots don't clutter `/resume`.
9515
9576
 
9516
9577
  - 1587792: **The agent gets the SDK's structured memory (search / read / save).**
9517
9578
 
@@ -9528,7 +9589,7 @@ progress in <a local notes directory>/...` — a runtime error
9528
9589
 
9529
9590
  - f768cc8: **Slash-command autocomplete in the composer.**
9530
9591
 
9531
- Typing `/` now opens a dropdown of matching commands (name + description) below the input, the way claude-code and gemini-cli do. Navigate with ↑/↓, press Tab to complete the highlighted command (ready for arguments), or Enter to run it. The dropdown closes once you type a space (moving on to arguments) or anything that isn't a command name; ↑/↓ fall back to input history when it's closed.
9592
+ Typing `/` now opens a dropdown of matching commands (name + description) below the input. Navigate with ↑/↓, press Tab to complete the highlighted command (ready for arguments), or Enter to run it. The dropdown closes once you type a space (moving on to arguments) or anything that isn't a command name; ↑/↓ fall back to input history when it's closed.
9532
9593
 
9533
9594
  - 6b74cd0: **Sub-agents do real work, and tool tracking is keyed on the SDK's tool-use id.**
9534
9595
 
@@ -9549,7 +9610,7 @@ progress in <a local notes directory>/...` — a runtime error
9549
9610
 
9550
9611
  - 31bc8ee: **The agent can track a plan with the SDK task system (todo-style).**
9551
9612
 
9552
- namzu now passes a `DiskTaskStore` to the agent loop, which auto-registers the SDK's `task_create` / `task_update` / `task_list` tools. The model can lay out and track a multi-step plan for the current request (like Claude Code's todos): new tasks appear as `☐ <subject>` and completed ones as `☑ <subject>` in the transcript. Tasks are scoped to the request.
9613
+ namzu now passes a `DiskTaskStore` to the agent loop, which auto-registers the SDK's `task_create` / `task_update` / `task_list` tools. The model can lay out and track a multi-step plan for the current request (a todo list): new tasks appear as `☐ <subject>` and completed ones as `☑ <subject>` in the transcript. Tasks are scoped to the request.
9553
9614
 
9554
9615
  - 4d56ee4: **Tool calls now show their diff / output, collapsible with Ctrl+O.**
9555
9616
 
@@ -9612,7 +9673,7 @@ progress in <a local notes directory>/...` — a runtime error
9612
9673
  **Keyboard model:**
9613
9674
 
9614
9675
  - Enter submits, Esc clears the composer, Up/Down browses input history.
9615
- - Ctrl+C twice exits (first press arms + warns; pattern matches claude-code / hermes).
9676
+ - Ctrl+C twice exits (first press arms + warns).
9616
9677
  - `exitOnCtrlC: false` so the TUI owns Ctrl+C semantics rather than Ink killing the process.
9617
9678
 
9618
9679
  **Provider coverage in this commit:** anthropic only. Other types (openai, openrouter, ollama, bedrock, http, lmstudio) gracefully error with a hint to add an anthropic profile or wait for a follow-up — each is one `register<Vendor>()` + type-case away.
@@ -9646,7 +9707,7 @@ progress in <a local notes directory>/...` — a runtime error
9646
9707
 
9647
9708
  The TUI's first-run picker now selects a primary LLM provider client (Anthropic / OpenAI / OpenRouter / Ollama / LM Studio / Bedrock) — what powers namzu's own chat. Clawtool peers (claude-code / codex / gemini-cli / opencode / aider / hermes) are a separate concern reserved for subagent dispatch and stay wired in the codebase as integration backbones, not as the picker target.
9648
9709
 
9649
- **Credential discovery (Hermes-style):**
9710
+ **Credential discovery:**
9650
9711
 
9651
9712
  For each provider in the declarative `PROVIDER_REGISTRY`, scan three sources in order:
9652
9713
 
@@ -9703,7 +9764,7 @@ progress in <a local notes directory>/...` — a runtime error
9703
9764
 
9704
9765
  **Credentials side (`@namzu/cli`):**
9705
9766
 
9706
- - New: macOS Keychain reader. Reads the `Claude Code-credentials` generic-password entry from the login Keychain and extracts the `claudeAiOauth.accessToken` JSON field. Pattern ported from Nous Research's hermes-agent (`agent/anthropic_adapter.py:_read_claude_code_credentials_from_keychain`). Non-throwing — every failure path (non-Darwin, security command missing, entry absent, payload malformed) returns null so the discoverer treats it as "no source" rather than crashing.
9767
+ - New: macOS Keychain reader. Reads the `Claude Code-credentials` generic-password entry from the login Keychain and extracts the `claudeAiOauth.accessToken` JSON field. Non-throwing — every failure path (non-Darwin, security command missing, entry absent, payload malformed) returns null so the discoverer treats it as "no source" rather than crashing.
9707
9768
  - Discoverer extended: after env vars and clawtool `secrets.toml`, anthropic also accepts the Keychain credential. Detection source is reported as `keychain · Claude Code-credentials` in the picker, so the user can see where their token came from.
9708
9769
  - Token-shape detector: `isAnthropicOAuthToken(value)` identifies OAuth tokens by prefix (`cc-`, `sk-ant-oat`, `eyJ`) vs console API keys (`sk-ant-api`). Drives the apiKey-vs-authToken decision when constructing the Anthropic provider.
9709
9770
 
@@ -9744,23 +9805,23 @@ progress in <a local notes directory>/...` — a runtime error
9744
9805
 
9745
9806
  - 142b695: **M0 hotfix** (`ses_002-clawtool-bridge`) — align CLI shape with the TUI-as-default product vision.
9746
9807
 
9747
- - **Removed:** `namzu chat` stub command. The `chat` subcommand was a misread of the product shape: namzu's primary user surface is a TUI (like claude-code, gemini-cli, opencode, and hermes-agent's TUI), and the TUI **is** the chat. Having a separate `chat` subcommand framed the CLI as "command-first" when it's actually "TUI-first with utility subcommands".
9808
+ - **Removed:** `namzu chat` stub command. The `chat` subcommand was a misread of the product shape: namzu's primary user surface is a TUI, and the TUI **is** the chat. Having a separate `chat` subcommand framed the CLI as "command-first" when it's actually "TUI-first with utility subcommands".
9748
9809
  - **Added:** default behavior for `namzu` (no args) — prints a one-line placeholder (`namzu — TUI coming in M3. For utility subcommands run namzu --help.`) and exits 0. M3 will replace this with the actual Ink + React TUI launch.
9749
9810
  - `namzu --help` still lists the utility surface (`doctor`, `tools`, `providers`, `skills`, `serve`).
9750
9811
 
9751
- Reference TUIs vendored at `cogitave.com/vendor/{google-gemini/gemini-cli, sst/opencode, NousResearch/hermes-agent}` guide the M3 shape: minimalist scrolling transcript + bottom composer + dialog overlays, slash-command registry, permission-with-inline-diff for tool calls.
9812
+ The M3 shape is a minimalist scrolling transcript + bottom composer + dialog overlays, slash-command registry, permission-with-inline-diff for tool calls.
9752
9813
 
9753
9814
  No library API changes; the doctor command and all M0 plumbing (Commander shell, output formatters, config cascade, sysexits mapping) remain identical.
9754
9815
 
9755
9816
  - 38c4b62: Harden two paths flagged by an adversarial review: `ToolRegistry.searchDeferred` no longer over-activates deferred tools — batched-query tokens match the tool name only (not descriptions) and short/generic tokens like `clawtool` are ignored, so a common word can't activate the whole catalog. The dynamic `Agent` sub-agent now unregisters its per-call `dyn-N` definition in a `finally`, so long sessions don't leak persona registrations on success, failure, or throw.
9756
9817
  - 2b08383: **Automatic context compression on long turns.** namzu now passes the SDK's structured compaction config to the agent loop, so very long, tool-heavy turns summarize old tool results/notes (keeping recent messages verbatim) instead of growing the context unbounded. Transparent for normal turns.
9757
9818
  - 5b1fe2f: Markdown links (`[text](url)`) in assistant replies now render with the link text in the accent color (underlined) followed by the URL dimmed, instead of raw `[text](url)` syntax.
9758
- - c12cd19: The header now shows a little **namzu mascot** — a bloom flower over a friendly `•◡•` face, in the teal/green brand palette (a nod to Claude Code's mascot, themed to the namzu.ai flower) — beside the **Cogitave Namzu** name, version, provider · model, and working directory.
9759
- - 38c4b62: Stop bridging clawtool's `Agent*` persona-file tools (`AgentNew`, `AgentList`, `AgentDetect`) into the agent. Those write Claude-Code-style definitions into `.claude/agents/` — a different, redundant mechanism that polluted Claude Code's directory and confused the model alongside namzu's own in-memory dynamic sub-agents. namzu owns sub-agent definition + dispatch natively, so these clawtool tools are excluded from the bridged catalog.
9819
+ - c12cd19: The header now shows a little **namzu mascot** — a bloom flower over a friendly `•◡•` face, in the teal/green brand palette — beside the **Cogitave Namzu** name, version, provider · model, and working directory.
9820
+ - 38c4b62: Stop bridging clawtool's `Agent*` persona-file tools (`AgentNew`, `AgentList`, `AgentDetect`) into the agent. Those write definitions into `.claude/agents/` — a different, redundant mechanism that polluted that directory and confused the model alongside namzu's own in-memory dynamic sub-agents. namzu owns sub-agent definition + dispatch natively, so these clawtool tools are excluded from the bridged catalog.
9760
9821
  - 38c4b62: Harden namzu's anti-fabrication guardrails against relaying another agent's claims as fact. A reply from a tool that delegates to a separate agent (clawtool `agent.run`, an A2A `tasks/send`, a remote peer) is that agent's unverified narrative — it can hallucinate (e.g. claiming a Windows file write when the box is actually WSL2 Ubuntu). namzu is now instructed to treat such replies as claims, confirm them with a deterministic tool (a real shell, a file read) before reporting them as done, and never present another agent's prose as its own verified result.
9761
- - d6b5bc1: **Remove the legacy `append` file tool.** `AppendFileTool` is gone — it was already excluded from `getBuiltinTools()` (Claude Code's tool distribution has no `Append`), and appending is canonical `edit` with `insertLine: "end"`. The export is removed from the public surface; hosts that relied on it should switch to `edit`. namzu's CLI no longer needs to filter `append` out of its tool set.
9822
+ - d6b5bc1: **Remove the legacy `append` file tool.** `AppendFileTool` is gone — it was already excluded from `getBuiltinTools()` (the default set has no `Append`), and appending is canonical `edit` with `insertLine: "end"`. The export is removed from the public surface; hosts that relied on it should switch to `edit`. namzu's CLI no longer needs to filter `append` out of its tool set.
9762
9823
  - 38c4b62: Match completed tool calls strictly by `toolUseId` in the TUI. The tool-end handler fell back to "the first active tool" when no id matched, which under parallel tool calls attributed a result to the wrong call. Now an unmatched completion renders on its own line and never closes the wrong spinner.
9763
- - 5b62e04: **Tool output reads cleaner.** Bash results drop their `STDOUT:` / `STDERR:` section labels (the ✓/✗ glyph already signals success), and every collapsible tool block (output, diffs, sub-agent trees) is now framed by a dim left rule `▏`, the way Claude Code / Warp set tool output apart from the conversation.
9824
+ - 5b62e04: **Tool output reads cleaner.** Bash results drop their `STDOUT:` / `STDERR:` section labels (the ✓/✗ glyph already signals success), and every collapsible tool block (output, diffs, sub-agent trees) is now framed by a dim left rule `▏`, which sets tool output apart from the conversation.
9764
9825
  - 88079b0: **Cleaner tool output in the transcript.**
9765
9826
 
9766
9827
  Tool results that come back as JSON (clawtool / MCP tools) no longer render as a raw one-line blob: a `{ output | result | content | text }` envelope is unwrapped to just its payload, and any other JSON is pretty-printed. The one-line `⎿` summary is derived the same way (the payload's first line, an error message, or a short key list) instead of a truncated JSON string — so a tool call reads at a glance.
@@ -9772,7 +9833,7 @@ progress in <a local notes directory>/...` — a runtime error
9772
9833
 
9773
9834
  The same change pins the header: because `<Static>` output is written above the live region, the banner (logo + provider + cwd) used to slide downward as messages accumulated. It is now the first static row, anchored to the top of the conversation.
9774
9835
 
9775
- - 6bd4c6b: **TUI redesign — cleaner, modern layout (gemini-cli / claude-code grade).**
9836
+ - 6bd4c6b: **TUI redesign — cleaner, modern layout.**
9776
9837
 
9777
9838
  The interactive UI was visually heavy and cramped. It's been reworked to match the patterns of leading agent CLIs:
9778
9839
 
@@ -9784,7 +9845,7 @@ progress in <a local notes directory>/...` — a runtime error
9784
9845
 
9785
9846
  - a96b5c0: **Clean-screen takeover + a gradient NAMZU splash on launch.**
9786
9847
 
9787
- namzu now clears the terminal (screen + scrollback) when it starts, so it opens on a fresh canvas instead of below leftover shell output — the clean "takeover" feel of claude-code / gemini-cli. It stays in the normal screen buffer, so native scrollback still works as the conversation grows.
9848
+ namzu now clears the terminal (screen + scrollback) when it starts, so it opens on a fresh canvas instead of below leftover shell output. It stays in the normal screen buffer, so native scrollback still works as the conversation grows.
9788
9849
 
9789
9850
  The startup banner is now an ASCII "NAMZU" wordmark rendered as a vertical teal→violet gradient, with a tagline, version, and connected provider beneath it. On narrow terminals (< 48 cols) it falls back to a compact `▲ namzu` mark.
9790
9851
 
package/dist/bin.js CHANGED
@@ -81,6 +81,6 @@ __name(suppressSqliteExperimentalWarning, "suppressSqliteExperimentalWarning");
81
81
  suppressSqliteExperimentalWarning();
82
82
 
83
83
  // src/bin.ts
84
- var { main } = await import("./chunks/bin-main-TFKZQ7NF.js");
84
+ var { main } = await import("./chunks/bin-main-55PUHGTA.js");
85
85
  main(fileURLToPath(new URL("./", import.meta.url).href + "bin.js"));
86
86
  //# sourceMappingURL=bin.js.map