toyon 0.18.0 → 0.20.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 (220) hide show
  1. package/dist/CHANGELOG.md +74 -0
  2. package/dist/bridge.js +1 -1
  3. package/dist/cli.js +2 -2
  4. package/dist/daemon.js +2279 -731
  5. package/dist/shell/assets/{Editor-CU91PIeX.js → Editor--Z8ktewC.js} +3 -3
  6. package/dist/shell/assets/Editor--Z8ktewC.js.br +0 -0
  7. package/dist/shell/assets/Editor--Z8ktewC.js.gz +0 -0
  8. package/dist/shell/assets/Editor-CB2SckMT.css.br +0 -0
  9. package/dist/shell/assets/Editor-CB2SckMT.css.gz +0 -0
  10. package/dist/shell/assets/XTerm-6GBZ9nXN.css.br +0 -0
  11. package/dist/shell/assets/XTerm-6GBZ9nXN.css.gz +0 -0
  12. package/dist/shell/assets/{XTerm-y7vQoOEu.js → XTerm-DsUQ0Xew.js} +1 -1
  13. package/dist/shell/assets/XTerm-DsUQ0Xew.js.br +0 -0
  14. package/dist/shell/assets/XTerm-DsUQ0Xew.js.gz +0 -0
  15. package/dist/shell/assets/abap-DLDM7-KI.js.br +0 -0
  16. package/dist/shell/assets/abap-DLDM7-KI.js.gz +0 -0
  17. package/dist/shell/assets/apex-DNDY2TF8.js.br +0 -0
  18. package/dist/shell/assets/apex-DNDY2TF8.js.gz +0 -0
  19. package/dist/shell/assets/bat-BwHxbl9M.js.br +0 -0
  20. package/dist/shell/assets/bat-BwHxbl9M.js.gz +0 -0
  21. package/dist/shell/assets/bicep-CFznDFnq.js.br +0 -0
  22. package/dist/shell/assets/bicep-CFznDFnq.js.gz +0 -0
  23. package/dist/shell/assets/cameligo-Bf6VGUru.js.br +0 -0
  24. package/dist/shell/assets/cameligo-Bf6VGUru.js.gz +0 -0
  25. package/dist/shell/assets/clojure-Dnu-v4kV.js.br +0 -0
  26. package/dist/shell/assets/clojure-Dnu-v4kV.js.gz +0 -0
  27. package/dist/shell/assets/coffee-Bd8akH9Z.js.br +0 -0
  28. package/dist/shell/assets/coffee-Bd8akH9Z.js.gz +0 -0
  29. package/dist/shell/assets/cpp-BbWJElDN.js.br +0 -0
  30. package/dist/shell/assets/cpp-BbWJElDN.js.gz +0 -0
  31. package/dist/shell/assets/csharp-Co3qMtFm.js.br +0 -0
  32. package/dist/shell/assets/csharp-Co3qMtFm.js.gz +0 -0
  33. package/dist/shell/assets/csp-D-4FJmMZ.js.br +0 -0
  34. package/dist/shell/assets/csp-D-4FJmMZ.js.gz +0 -0
  35. package/dist/shell/assets/css-DdJfP1eB.js.br +0 -0
  36. package/dist/shell/assets/css-DdJfP1eB.js.gz +0 -0
  37. package/dist/shell/assets/css.worker-CqwWTjeG.js.br +0 -0
  38. package/dist/shell/assets/css.worker-CqwWTjeG.js.gz +0 -0
  39. package/dist/shell/assets/{cssMode-B7sFzM6K.js → cssMode-BjAkCPrp.js} +1 -1
  40. package/dist/shell/assets/cssMode-BjAkCPrp.js.br +0 -0
  41. package/dist/shell/assets/cssMode-BjAkCPrp.js.gz +0 -0
  42. package/dist/shell/assets/cypher-cTPe9QuQ.js.br +0 -0
  43. package/dist/shell/assets/cypher-cTPe9QuQ.js.gz +0 -0
  44. package/dist/shell/assets/dart-BOtBlQCF.js.br +0 -0
  45. package/dist/shell/assets/dart-BOtBlQCF.js.gz +0 -0
  46. package/dist/shell/assets/dockerfile-BG73LgW2.js.br +0 -0
  47. package/dist/shell/assets/dockerfile-BG73LgW2.js.gz +0 -0
  48. package/dist/shell/assets/ecl-BEgZUVRK.js.br +0 -0
  49. package/dist/shell/assets/ecl-BEgZUVRK.js.gz +0 -0
  50. package/dist/shell/assets/editor.worker-DCKwvLbM.js.br +0 -0
  51. package/dist/shell/assets/editor.worker-DCKwvLbM.js.gz +0 -0
  52. package/dist/shell/assets/elixir-BkW5O-1t.js.br +0 -0
  53. package/dist/shell/assets/elixir-BkW5O-1t.js.gz +0 -0
  54. package/dist/shell/assets/flow9-BeJ5waoc.js.br +0 -0
  55. package/dist/shell/assets/flow9-BeJ5waoc.js.gz +0 -0
  56. package/dist/shell/assets/{freemarker2-ChTLQoDC.js → freemarker2-BZCFxXwq.js} +1 -1
  57. package/dist/shell/assets/freemarker2-BZCFxXwq.js.br +0 -0
  58. package/dist/shell/assets/freemarker2-BZCFxXwq.js.gz +0 -0
  59. package/dist/shell/assets/fsharp-PahG7c26.js.br +0 -0
  60. package/dist/shell/assets/fsharp-PahG7c26.js.gz +0 -0
  61. package/dist/shell/assets/go-acbASCJo.js.br +0 -0
  62. package/dist/shell/assets/go-acbASCJo.js.gz +0 -0
  63. package/dist/shell/assets/{grammar-xXcxTc3V.js → grammar-CQ1uaD6_.js} +1 -1
  64. package/dist/shell/assets/grammar-CQ1uaD6_.js.br +0 -0
  65. package/dist/shell/assets/grammar-CQ1uaD6_.js.gz +0 -0
  66. package/dist/shell/assets/graphql-BxJiqAUM.js.br +0 -0
  67. package/dist/shell/assets/graphql-BxJiqAUM.js.gz +0 -0
  68. package/dist/shell/assets/{handlebars-DPJSozQx.js → handlebars-G1zJeDLP.js} +1 -1
  69. package/dist/shell/assets/handlebars-G1zJeDLP.js.br +0 -0
  70. package/dist/shell/assets/handlebars-G1zJeDLP.js.gz +0 -0
  71. package/dist/shell/assets/hcl-DtV1sZF8.js.br +0 -0
  72. package/dist/shell/assets/hcl-DtV1sZF8.js.gz +0 -0
  73. package/dist/shell/assets/{html-Cog2rLcD.js → html-CUHSCFMy.js} +1 -1
  74. package/dist/shell/assets/html-CUHSCFMy.js.br +0 -0
  75. package/dist/shell/assets/html-CUHSCFMy.js.gz +0 -0
  76. package/dist/shell/assets/html.worker-DhJ4VZMp.js.br +0 -0
  77. package/dist/shell/assets/html.worker-DhJ4VZMp.js.gz +0 -0
  78. package/dist/shell/assets/{htmlMode-Xm5_ujKb.js → htmlMode-gpMedtd9.js} +1 -1
  79. package/dist/shell/assets/htmlMode-gpMedtd9.js.br +0 -0
  80. package/dist/shell/assets/htmlMode-gpMedtd9.js.gz +0 -0
  81. package/dist/shell/assets/index-B3Alj0WH.css +1 -0
  82. package/dist/shell/assets/index-B3Alj0WH.css.br +0 -0
  83. package/dist/shell/assets/index-B3Alj0WH.css.gz +0 -0
  84. package/dist/shell/assets/index-VVd_p5tJ.js +278 -0
  85. package/dist/shell/assets/index-VVd_p5tJ.js.br +0 -0
  86. package/dist/shell/assets/index-VVd_p5tJ.js.gz +0 -0
  87. package/dist/shell/assets/java-CXBNlu9o.js.br +0 -0
  88. package/dist/shell/assets/java-CXBNlu9o.js.gz +0 -0
  89. package/dist/shell/assets/{javascript-Dcv6lw7b.js → javascript-BHWH8gQN.js} +1 -1
  90. package/dist/shell/assets/json.worker-BF9eV5mS.js.br +0 -0
  91. package/dist/shell/assets/json.worker-BF9eV5mS.js.gz +0 -0
  92. package/dist/shell/assets/{jsonMode-D5_V0TW5.js → jsonMode-DyV5nvVT.js} +1 -1
  93. package/dist/shell/assets/jsonMode-DyV5nvVT.js.br +0 -0
  94. package/dist/shell/assets/jsonMode-DyV5nvVT.js.gz +0 -0
  95. package/dist/shell/assets/julia-cl7-CwDS.js.br +0 -0
  96. package/dist/shell/assets/julia-cl7-CwDS.js.gz +0 -0
  97. package/dist/shell/assets/kotlin-s7OhZKlX.js.br +0 -0
  98. package/dist/shell/assets/kotlin-s7OhZKlX.js.gz +0 -0
  99. package/dist/shell/assets/less-9HpZscsL.js.br +0 -0
  100. package/dist/shell/assets/less-9HpZscsL.js.gz +0 -0
  101. package/dist/shell/assets/lexon-OrD6JF1K.js.br +0 -0
  102. package/dist/shell/assets/lexon-OrD6JF1K.js.gz +0 -0
  103. package/dist/shell/assets/{liquid-C_zXIF5F.js → liquid-Dy3tUgRC.js} +1 -1
  104. package/dist/shell/assets/liquid-Dy3tUgRC.js.br +0 -0
  105. package/dist/shell/assets/liquid-Dy3tUgRC.js.gz +0 -0
  106. package/dist/shell/assets/{lspLanguageFeatures-CkiTdLmp.js → lspLanguageFeatures-CB_Ow-w5.js} +1 -1
  107. package/dist/shell/assets/lspLanguageFeatures-CB_Ow-w5.js.br +0 -0
  108. package/dist/shell/assets/lspLanguageFeatures-CB_Ow-w5.js.gz +0 -0
  109. package/dist/shell/assets/lua-Cyyb5UIc.js.br +0 -0
  110. package/dist/shell/assets/lua-Cyyb5UIc.js.gz +0 -0
  111. package/dist/shell/assets/m3-B8OfTtLu.js.br +0 -0
  112. package/dist/shell/assets/m3-B8OfTtLu.js.gz +0 -0
  113. package/dist/shell/assets/markdown-BFxVWTOG.js.br +0 -0
  114. package/dist/shell/assets/markdown-BFxVWTOG.js.gz +0 -0
  115. package/dist/shell/assets/{mdx-gvbILQkr.js → mdx-DD5jgco_.js} +1 -1
  116. package/dist/shell/assets/mdx-DD5jgco_.js.br +0 -0
  117. package/dist/shell/assets/mdx-DD5jgco_.js.gz +0 -0
  118. package/dist/shell/assets/mips-CiqrrVzr.js.br +0 -0
  119. package/dist/shell/assets/mips-CiqrrVzr.js.gz +0 -0
  120. package/dist/shell/assets/msdax-DmeGPVcC.js.br +0 -0
  121. package/dist/shell/assets/msdax-DmeGPVcC.js.gz +0 -0
  122. package/dist/shell/assets/mysql-C_tMU-Nz.js.br +0 -0
  123. package/dist/shell/assets/mysql-C_tMU-Nz.js.gz +0 -0
  124. package/dist/shell/assets/objective-c-BDtDVThU.js.br +0 -0
  125. package/dist/shell/assets/objective-c-BDtDVThU.js.gz +0 -0
  126. package/dist/shell/assets/pascal-vHIfCaH5.js.br +0 -0
  127. package/dist/shell/assets/pascal-vHIfCaH5.js.gz +0 -0
  128. package/dist/shell/assets/pascaligo-DtZ0uQbO.js.br +0 -0
  129. package/dist/shell/assets/pascaligo-DtZ0uQbO.js.gz +0 -0
  130. package/dist/shell/assets/perl-Ub6l9XKa.js.br +0 -0
  131. package/dist/shell/assets/perl-Ub6l9XKa.js.gz +0 -0
  132. package/dist/shell/assets/pgsql-BlNEE0v7.js.br +0 -0
  133. package/dist/shell/assets/pgsql-BlNEE0v7.js.gz +0 -0
  134. package/dist/shell/assets/php-BBUBE1dy.js.br +0 -0
  135. package/dist/shell/assets/php-BBUBE1dy.js.gz +0 -0
  136. package/dist/shell/assets/pla-DSh2-awV.js.br +0 -0
  137. package/dist/shell/assets/pla-DSh2-awV.js.gz +0 -0
  138. package/dist/shell/assets/postiats-CocnycG-.js.br +0 -0
  139. package/dist/shell/assets/postiats-CocnycG-.js.gz +0 -0
  140. package/dist/shell/assets/powerquery-tScXyioY.js.br +0 -0
  141. package/dist/shell/assets/powerquery-tScXyioY.js.gz +0 -0
  142. package/dist/shell/assets/powershell-COWaemsV.js.br +0 -0
  143. package/dist/shell/assets/powershell-COWaemsV.js.gz +0 -0
  144. package/dist/shell/assets/protobuf-Brw8urJB.js.br +0 -0
  145. package/dist/shell/assets/protobuf-Brw8urJB.js.gz +0 -0
  146. package/dist/shell/assets/pug-8SOpv6rk.js.br +0 -0
  147. package/dist/shell/assets/pug-8SOpv6rk.js.gz +0 -0
  148. package/dist/shell/assets/{python-CZTrOkh_.js → python-BvLKUXll.js} +1 -1
  149. package/dist/shell/assets/python-BvLKUXll.js.br +0 -0
  150. package/dist/shell/assets/python-BvLKUXll.js.gz +0 -0
  151. package/dist/shell/assets/qsharp-Bw9ernYp.js.br +0 -0
  152. package/dist/shell/assets/qsharp-Bw9ernYp.js.gz +0 -0
  153. package/dist/shell/assets/r-j7ic8hl3.js.br +0 -0
  154. package/dist/shell/assets/r-j7ic8hl3.js.gz +0 -0
  155. package/dist/shell/assets/{razor-DowlBj1i.js → razor-B2tUlbzR.js} +1 -1
  156. package/dist/shell/assets/razor-B2tUlbzR.js.br +0 -0
  157. package/dist/shell/assets/razor-B2tUlbzR.js.gz +0 -0
  158. package/dist/shell/assets/redis-Bu5POkcn.js.br +0 -0
  159. package/dist/shell/assets/redis-Bu5POkcn.js.gz +0 -0
  160. package/dist/shell/assets/redshift-Bs9aos_-.js.br +0 -0
  161. package/dist/shell/assets/redshift-Bs9aos_-.js.gz +0 -0
  162. package/dist/shell/assets/restructuredtext-CqXO7rUv.js.br +0 -0
  163. package/dist/shell/assets/restructuredtext-CqXO7rUv.js.gz +0 -0
  164. package/dist/shell/assets/ruby-zBfavPgS.js.br +0 -0
  165. package/dist/shell/assets/ruby-zBfavPgS.js.gz +0 -0
  166. package/dist/shell/assets/rust-BzKRNQWT.js.br +0 -0
  167. package/dist/shell/assets/rust-BzKRNQWT.js.gz +0 -0
  168. package/dist/shell/assets/sb-BBc9UKZt.js.br +0 -0
  169. package/dist/shell/assets/sb-BBc9UKZt.js.gz +0 -0
  170. package/dist/shell/assets/scala-D9hQfWCl.js.br +0 -0
  171. package/dist/shell/assets/scala-D9hQfWCl.js.gz +0 -0
  172. package/dist/shell/assets/scheme-BPhDTwHR.js.br +0 -0
  173. package/dist/shell/assets/scheme-BPhDTwHR.js.gz +0 -0
  174. package/dist/shell/assets/scss-CBJaRo0y.js.br +0 -0
  175. package/dist/shell/assets/scss-CBJaRo0y.js.gz +0 -0
  176. package/dist/shell/assets/shell-DiJ1NA_G.js.br +0 -0
  177. package/dist/shell/assets/shell-DiJ1NA_G.js.gz +0 -0
  178. package/dist/shell/assets/solidity-Db0IVjzk.js.br +0 -0
  179. package/dist/shell/assets/solidity-Db0IVjzk.js.gz +0 -0
  180. package/dist/shell/assets/sophia-CnS9iZB_.js.br +0 -0
  181. package/dist/shell/assets/sophia-CnS9iZB_.js.gz +0 -0
  182. package/dist/shell/assets/sparql-CJmd_6j2.js.br +0 -0
  183. package/dist/shell/assets/sparql-CJmd_6j2.js.gz +0 -0
  184. package/dist/shell/assets/sql-ClhHkBeG.js.br +0 -0
  185. package/dist/shell/assets/sql-ClhHkBeG.js.gz +0 -0
  186. package/dist/shell/assets/st-CHwy0fLd.js.br +0 -0
  187. package/dist/shell/assets/st-CHwy0fLd.js.gz +0 -0
  188. package/dist/shell/assets/swift-Bqt4WxQ4.js.br +0 -0
  189. package/dist/shell/assets/swift-Bqt4WxQ4.js.gz +0 -0
  190. package/dist/shell/assets/systemverilog-Bs9z6M-B.js.br +0 -0
  191. package/dist/shell/assets/systemverilog-Bs9z6M-B.js.gz +0 -0
  192. package/dist/shell/assets/tcl-Dm6ycUr_.js.br +0 -0
  193. package/dist/shell/assets/tcl-Dm6ycUr_.js.gz +0 -0
  194. package/dist/shell/assets/ts.worker-DTZAwq0V.js.br +0 -0
  195. package/dist/shell/assets/ts.worker-DTZAwq0V.js.gz +0 -0
  196. package/dist/shell/assets/{tsMode-BNl2cV_K.js → tsMode-DMuNnqM7.js} +1 -1
  197. package/dist/shell/assets/tsMode-DMuNnqM7.js.br +0 -0
  198. package/dist/shell/assets/tsMode-DMuNnqM7.js.gz +0 -0
  199. package/dist/shell/assets/twig-Csy3S7wG.js.br +0 -0
  200. package/dist/shell/assets/twig-Csy3S7wG.js.gz +0 -0
  201. package/dist/shell/assets/typespec-Btyra-wh.js.br +0 -0
  202. package/dist/shell/assets/typespec-Btyra-wh.js.gz +0 -0
  203. package/dist/shell/assets/vb-Db0cS2oM.js.br +0 -0
  204. package/dist/shell/assets/vb-Db0cS2oM.js.gz +0 -0
  205. package/dist/shell/assets/wasm-inlined-CG6Dc4jp.js.br +0 -0
  206. package/dist/shell/assets/wasm-inlined-CG6Dc4jp.js.gz +0 -0
  207. package/dist/shell/assets/wgsl-BTesnYfV.js.br +0 -0
  208. package/dist/shell/assets/wgsl-BTesnYfV.js.gz +0 -0
  209. package/dist/shell/assets/{xml-DIiuHFHw.js → xml-DdYgb5a2.js} +1 -1
  210. package/dist/shell/assets/xml-DdYgb5a2.js.br +0 -0
  211. package/dist/shell/assets/xml-DdYgb5a2.js.gz +0 -0
  212. package/dist/shell/assets/{yaml-CBnMyn4j.js → yaml-BDujJdoL.js} +1 -1
  213. package/dist/shell/assets/yaml-BDujJdoL.js.br +0 -0
  214. package/dist/shell/assets/yaml-BDujJdoL.js.gz +0 -0
  215. package/dist/shell/index.html +11 -8
  216. package/dist/shell/manifest.json +13 -0
  217. package/dist/shell/sw.js +117 -22
  218. package/package.json +2 -2
  219. package/dist/shell/assets/index-BpW1Kufz.css +0 -1
  220. package/dist/shell/assets/index-CdY8WF4P.js +0 -270
package/dist/CHANGELOG.md CHANGED
@@ -2,6 +2,80 @@
2
2
 
3
3
  What changed in each release of Toyon, newest first.
4
4
 
5
+ ## 0.20.0 (2026-10-28)
6
+
7
+ The rail shows work that goes on while the chat is quiet, agents find their sibling worktrees on their own, and the phone moves between the list and a worktree in one swipe.
8
+
9
+ ### New
10
+ - A rail row shows a purple dot while its agent runs a command in the background or has a wakeup booked, and while Toyon commits or lands the worktree, so the row reads as busy with its chat closed.
11
+ - An agent can look up the project's other open worktrees and recently archived ones, by title, branch or the words you wrote in them.
12
+ - Web addresses in code blocks and in a tool's output are links that open in a new tab.
13
+ - A landed card links the PR it merged when the land went through one.
14
+ - The right-click menu on a worktree or archived row offers reveal transcript in Finder, once the chat has its first message.
15
+ - An answered question card shows the description of each option you picked beneath the pick.
16
+ - On a phone, one edge swipe from the chat, the preview or the code returns to the list, and a swipe the other way within a second and a half goes back to the worktree you left. The bar's marker now moves with the screen instead of trailing it.
17
+
18
+ ### Changed
19
+ - Archiving a row with an unsent draft or a busy agent asks first and names the reason. The menu item ends in an ellipsis exactly when it will ask.
20
+ - An archived row shows in the archive list the moment you archive it.
21
+ - A single piece proposed from a worktree that holds no work yet is offered to run here, in that worktree, rather than in a new one. The agent is told why.
22
+ - Agents are asked to split work into worktrees before starting on their own part, so the card shows at once and the sibling agents start alongside.
23
+ - `/split` reads its first word as a project only when it names an open project exactly, or is `here`. Anything else is the whole message for this project.
24
+ - A pieces list with one piece shows as a plain line with its text open beneath it.
25
+ - The pieces card for another project shows that worktree's current mode, not the mode it had when the card was made.
26
+ - When you answer a plan card, the agent hears that its pieces list came back with the plan, instead of taking it as lost.
27
+ - A worktree mention puts its dot after the title, outside the underline.
28
+
29
+ ### Fixed
30
+ - A split piece always gets a worktree of its own. Before, it could take over the new row you were typing in and leave your draft stranded there.
31
+ - Agents can list worktrees with git; only the commands that change worktrees are refused.
32
+ - Claude's quick model is picked from the models Claude offers, so Bedrock and dated model names work without a setting.
33
+ - A Mac with its screen dark no longer goes to sleep in the moment Toyon restarts.
34
+ - On a phone, closing the plan no longer opens it again.
35
+ - A piece queued after the branch you are in says it starts when this branch lands, instead of linking to your own worktree.
36
+ - A settings row keeps its name on one line when the value beside it is long.
37
+
38
+ ## 0.19.0 (2026-10-26)
39
+
40
+ A plan can be split into pieces that each get their own worktree, worktrees go by their titles everywhere, and the phone shell becomes a place you can work from: screens you swipe between, chats you can read offline, a share sheet that lands in a chat, and a true black background.
41
+
42
+ ### New
43
+ - An agent can split its plan into pieces. The list shows at the head of the plan, one line per piece, each bound for this worktree, a new worktree of this project or of another one you have open, or an open worktree already on that part. You read and move each piece before you approve; nothing starts until you do. A worktree made from a piece is born with that text as its approved plan, its first message says who wrote it, and a piece can wait on an earlier one. The `/split` verb raises the same card from your own words.
44
+ - A worktree made from a piece shows a brief row beside its chat with the origin agent's words, your note and the file they came from; pressing it opens that file, or the archived copy once the origin is gone.
45
+ - Rail rows, changes rows, file rows and the editor head can be dragged into the composer, which inserts a mention at the drop point. A pasted branch name or worktree directory that matches a sibling becomes its mention as well, on the desk and from a phone keyboard.
46
+ - The phone's screens sit in one line and a sideways swipe moves between them, including the preview, with each screen keeping its scroll position. One swipe back also closes the keyboard.
47
+ - The phone keeps your chats and transcripts in its own storage. When the daemon cannot be reached it shows the last known rows read-only, and sends are refused until it is back.
48
+ - Sharing a file to Toyon from a phone goes to the worktree list, where the row you tap receives it, skipping the attach button's picker. The attach button itself takes any file now, not only pictures.
49
+ - A phone can turn on OLED black in settings: the chosen dark theme's grounds go to true black, text and accents stay as they were, and an installed app paints its status bar to match.
50
+ - A quick flick on a phone rail row archives it without reaching the rung.
51
+ - A note field on a card draws a send at the end of its row on touch, so a note goes without reaching for the composer.
52
+ - The composer, agent prose and Toyon's own rows name a worktree by its title with a status dot, never by its id or branch. The agent is told the title and branch on each send and renames show up live, and a mention still reaches an archived worktree, whose tip says so and opens its page.
53
+
54
+ ### Changed
55
+ - Handoff is folded into pieces: the one tool and the one card cover sending work to an open worktree as well as a new one. Stored handoff rows in old chats are rewritten once when the daemon starts, so nothing is lost.
56
+ - The variants count on the new-worktree row and the batch button are gone. Pasting feedback into one box gave no view of what would happen; the pieces list is that view.
57
+ - Open terminal left the worktree row menu and the palette, since cmd+J already opens the app terminal. The menu now leads with copy branch name, reveal in Finder and copy path, puts stop agent and view changes under one rule, and drops copy transcript path and copy session id, which stay in the palette.
58
+ - The swipe ladder on a phone rail row no longer offers land. Landing stays a press from the composer, where its line says what it will do.
59
+ - On a phone the composer rides with the end of the transcript and folds to one line as you read back, the name strip folds while you type, a tap on the folded box takes you to the end, and the keyboard drops after a send.
60
+ - Each message tells the agent where the worktree stands: clean or dirty, how far ahead of main, landed or not, and any PR on it. Before, it only heard about a sibling's land and answered from a stale picture after your own land, commit or push.
61
+ - The model picker labels the default row with the model and effort the agent actually ran, instead of a fixed name.
62
+ - The spinner is the four-square mark everywhere; the ring is gone.
63
+ - A Write followed by Edits of the same file folds into one row with a count, and a tool-search row is dropped once the next item lands, staying only when nothing followed it.
64
+ - On the desk the log's scrollbar stops above the composer instead of running alongside it.
65
+ - The daemon row's byline sits under its sentence in the dim tier, and a grafted row stacks its branch on a phone instead of truncating it. Tips on the changes rows sit on the chat's side of the row.
66
+ - The shell loads faster over a slow link: assets ship precompressed, the first request goes out before the stylesheet, a reopened chat fetches only what changed, and a fold's body is built the first time it opens. The largest transcript paints in less than half the time on a throttled phone.
67
+ - Phone type is sized from the phone: inline code sits one point under the prose, and tool rows return to the small mono.
68
+ - The Claude Code adapter is pinned to 0.95.0.
69
+
70
+ ### Fixed
71
+ - An Edit cut off after its path went out left a running row that hid the spinner for the whole turn, and a tool call steered into could keep shining after the agent moved on.
72
+ - A nameless notice from Claude Code ran into the model's next reply as one line of text.
73
+ - A worktree mention lost its link once the worktree was archived, @- listed every worktree, and a lone digit or hex letter matched through the directory name. Mentions now match by title and branch only.
74
+ - Hovering a card option moved the cursor but left the keyboard on a transcript row, so the digit and letter keys went there.
75
+ - cmd+R reloads only the preview in every state; where the app is crashed, stopped or asleep it starts the preview instead of reloading the shell.
76
+ - The "Toyon was updated" card showed on a phone only for other machines, so a phone could not tell its own daemon needed a restart.
77
+ - In a browser without scroll-driven animations the first column of a wide table was dimmed at rest.
78
+
5
79
  ## 0.18.0 (2026-10-23)
6
80
 
7
81
  Stop and the ask cards say what they are doing while they do it, and the phone rail's swipe reads as one gesture with the rungs the row actually offers.
package/dist/bridge.js CHANGED
@@ -1 +1 @@
1
- var b=[{id:"quick-open",key:"p"},{id:"commands",key:"p",shift:!0,bareAlias:"F1"},{id:"search",key:"f",shift:!0},{id:"chats",key:"g"},{id:"changes",key:"b",ctrlAlias:{key:"g",shift:!0}},{id:"files",key:"e",shift:!0},{id:"panel-tab-prev",key:"ArrowLeft",alt:!0,textKeeps:!0},{id:"panel-tab-next",key:"ArrowRight",alt:!0,textKeeps:!0},{id:"composer",key:"l"},{id:"rail",key:"k",shift:!0},{id:"keys",key:","},{id:"terminal",key:"j",ctrlAlias:{key:"`"}},{id:"design",key:"d"},{id:"term-tab",key:"`",ctrl:!0,shift:!0},{id:"pick",key:"e"},{id:"inspect",key:"i"},{id:"zen",key:"."},{id:"new",key:"k",aliases:["n"]},{id:"worktree",key:"1-9"},{id:"wt-prev",key:"ArrowUp",alt:!0,ctrlAlias:{key:"Tab",shift:!0},cmdShiftAlias:["[","{"]},{id:"wt-next",key:"ArrowDown",alt:!0,ctrlAlias:{key:"Tab"},cmdShiftAlias:["]","}"]},{id:"wt-unseen-prev",key:"ArrowUp",alt:!0,shift:!0},{id:"wt-unseen-next",key:"ArrowDown",alt:!0,shift:!0},{id:"wt-archive",key:"Backspace",alt:!0,textKeeps:!0,emptyGives:!0},{id:"mark-unread",key:"u",alt:!0,textKeeps:!0},{id:"project",key:"o",ctrlAlias:{key:"r",hostOnly:!0},cmdShiftAlias:["o"]},{id:"refs",key:"g",shift:!0},{id:"routes",key:"u"},{id:"reload",key:"r"},{id:"back",key:"ArrowLeft",textKeeps:!0},{id:"forward",key:"ArrowRight",textKeeps:!0},{id:"close",key:"w"}],X=new Set(["zen","close","back","forward"]);function U(e,{guest:t=!1}={}){if(e.altKey){if(e.metaKey||e.ctrlKey)return null;let r=b.find((i)=>i.alt&&!!i.shift===e.shiftKey&&(i.key===e.key||i.key.length===1&&e.code===`Key${i.key.toUpperCase()}`));return r&&r.id!=="worktree"?{id:r.id}:null}if(!e.metaKey&&!e.ctrlKey){if(e.shiftKey||t)return null;let r=b.find((i)=>i.bareAlias===e.key);return r&&r.id!=="worktree"?{id:r.id}:null}if(!!e.ctrlKey===e.metaKey)return null;let n=e.key.length===1?e.key.toLowerCase():e.key;if(e.metaKey&&!e.shiftKey&&n>="1"&&n<="9")return{id:"worktree",digit:Number(n)};for(let r of b){if(r.id==="worktree")continue;let i=r.ctrlAlias;if(i&&e.ctrlKey&&i.key===n&&!!i.shift===e.shiftKey&&!(t&&i.hostOnly))return{id:r.id};if(e.metaKey&&e.shiftKey&&r.cmdShiftAlias?.includes(n))return{id:r.id};if(r.alt)continue;if(e.ctrlKey&&!r.ctrl||!!r.shift!==e.shiftKey)continue;if(r.key===n||r.aliases?.includes(n))return{id:r.id}}return null}function q(e){if(e.altKey||e.key.toLowerCase()!=="s")return!1;return!!e.ctrlKey!==e.metaKey}function z(e){let t=b.find((n)=>n.id===e);if(!t)throw Error(`unknown chord ${e}`);return t}function V(e){let t=e;if(!t?.tagName)return!1;if(t.isContentEditable||t.tagName==="TEXTAREA")return!0;return t.tagName==="INPUT"&&!["button","checkbox","radio","range","submit","reset"].includes(t.type??"")}var ie=Symbol.for("react.forward_ref"),oe=Symbol.for("react.memo");function Y(e){if(e._debugSource?.fileName)return{file:e._debugSource.fileName,line:e._debugSource.lineNumber};let t=e._debugStack?.stack;if(t){let n=t.match(/https?:\/\/[^/]+(\/src\/[^)\s?]+)(?:\?[^:)\s]*)?:(\d+):\d+/);if(n?.[1])return{file:n[1],line:Number(n[2])||void 0}}return null}function L(e){for(let t=e;t;t=t.return){let n=Y(t);if(n)return n}return null}function C(e){if(typeof e==="function")return e.displayName||e.name||null;let t=e;if(t?.$$typeof===ie)return t.displayName||C(t.render);if(t?.$$typeof===oe)return t.displayName||C(t.type);return null}var le=(e)=>typeof e.type==="string"||e.tag===6,se=(e,t)=>!!e&&(e===t||!!e.stateNode&&e.stateNode===t.stateNode);function ae(e){let t=null,n=(r)=>{for(let i=r.child??null;i;i=i.sibling??null)if(le(i)){if(t)return!1;t=i}else if(!n(i))return!1;return!0};return n(e)?t:null}function ce(e){for(let t=e;t;t=t.return){let n=Y(t);if(n)return t._debugOwner===null?null:n}return null}function N(e){let t=L(e),n=null,r=null,i=!1;for(let o=e;o;o=o.return){let s=C(o.type);if(!s)continue;let l=!!e&&se(ae(o),e),a=ce(o);if(n&&!(l&&a))break;if(n=s,r=a,i=l,!l)break}if(r&&t&&r.file===t.file&&r.line===t.line)r=null;return{src:t,comp:n,call:r,wraps:i}}function _({src:e,call:t,wraps:n},r){let i=n?t:e,o=n?e:t;return(r?o??i:i??o)??null}if(window.__toyonBridge)throw Error("Toyon bridge already installed");window.__toyonBridge=!0;var v=window.__toyonShellOrigins??[],P=null,c=(e)=>{try{let t=P?[P]:v.length?v:["*"];for(let n of t)window.parent.postMessage({__toyon:!0,...e},n)}catch{}};c({type:"loaded",url:location.href,title:document.title});var E="#fa891e",J="#1d2021";window.addEventListener("vite:afterUpdate",()=>c({type:"hmr"}));window.addEventListener("error",(e)=>{c({type:"page-error",message:String(e.message),source:e.filename,line:e.lineno})});window.addEventListener("unhandledrejection",(e)=>{c({type:"page-error",message:`unhandled rejection: ${String(e.reason)}`})});var K=()=>c({type:"navigated",url:location.href,title:document.title}),ue=history.pushState.bind(history);history.pushState=(...e)=>{ue(...e),D(),K()};var de=history.replaceState.bind(history);history.replaceState=(...e)=>{de(...e),K()};window.addEventListener("popstate",K);window.addEventListener("hashchange",K);var fe=window.navigation,g=null;function D(){g=fe?.currentEntry?.index??null}D();window.addEventListener("popstate",()=>{let e=g;D();let t=e===null||g===null||e===g?void 0:g<e?"back":"forward";c({type:"traversed",...t?{dir:t}:{}})});var pe=performance.getEntriesByType("navigation")[0];if(pe?.type==="back_forward")c({type:"traversed"});window.addEventListener("pageshow",(e)=>{if(e.persisted)c({type:"traversed"})});var F=document.title;if(document.head)new MutationObserver(()=>{if(document.title===F)return;F=document.title,c({type:"title",title:F})}).observe(document.head,{childList:!0,subtree:!0,characterData:!0});var Q=!1,R=null;window.addEventListener("keyup",(e)=>{if(window.__toyonShell||e.key!==R)return;R=null,c({type:"key",key:e.key,meta:!1,up:!0})},!0);window.addEventListener("keydown",(e)=>{if(window.__toyonShell)return;if(q(e))e.preventDefault();let t=U(e,{guest:!0});if(t&&z(t.id).textKeeps&&V(e.target))return;if(Q){if(!t||!X.has(t.id))return}else if(e.key==="Escape"){c({type:"key",key:"Escape",meta:!1});return}else if(!t)return;e.preventDefault(),e.stopPropagation(),c({type:"key",key:e.key,code:e.code,meta:e.metaKey,ctrl:e.ctrlKey,shift:e.shiftKey,alt:e.altKey}),R=e.altKey?"Alt":e.ctrlKey?"Control":e.metaKey?"Meta":null},!0);var H=()=>c({type:"focus",gesture:navigator.userActivation?.isActive??!0});window.addEventListener("focusin",H,!0);window.addEventListener("focus",H);if(document.hasFocus()&&document.activeElement&&document.activeElement!==document.body)H();var I=(e)=>!e.defaultPrevented&&!!e.dataTransfer?.types.includes("Files");window.addEventListener("dragover",(e)=>{if(!I(e))return;if(e.preventDefault(),e.dataTransfer)e.dataTransfer.dropEffect="copy";c({type:"drag-files",over:!0})});window.addEventListener("dragleave",(e)=>{if(I(e))c({type:"drag-files",over:!1})});window.addEventListener("drop",(e)=>{if(!I(e))return;e.preventDefault(),c({type:"drop-files",files:Array.from(e.dataTransfer?.files??[])})});function W(e){for(let t of Object.keys(e))if(t.startsWith("__reactFiber$"))return e[t]??null;return null}var u=null,B=typeof HTMLElement<"u"&&"showPopover"in HTMLElement.prototype;function ye(){if(!u?.isConnected){if(u=document.createElement("div"),u.style.cssText="position:fixed;inset:0;width:auto;height:auto;max-width:none;max-height:none;margin:0;padding:0;border:0;background:transparent;overflow:visible;pointer-events:none;z-index:2147483647;",B)u.popover="manual";document.documentElement.appendChild(u)}if(B&&!u.matches(":popover-open"))u.showPopover();return u}function m(){if(!u)return;if(u.innerHTML="",B&&u.matches(":popover-open"))u.hidePopover()}var O=20;function x(e,t,n=!0){let r=document.createElement("div");if(r.style.cssText=`position:fixed;left:${e.left}px;top:${e.top}px;width:${e.width}px;height:${e.height}px;outline:2px solid ${E};outline-offset:-1px;${n?`background:${E}14;`:""}border-radius:2px;`,t){let i=e.top>=O,o=e.bottom+O<=window.innerHeight;if(t.style.top=i?`${-O}px`:o?`${e.height+4}px`:"2px",!i&&!o)t.style.left="2px";r.appendChild(t)}if(ye().appendChild(r),t){let i=t.getBoundingClientRect(),o=i.right-(window.innerWidth-2);if(o>0){let s=Number.parseFloat(t.style.left||"0");t.style.left=`${s-Math.min(o,Math.max(0,i.left-2))}px`}}}function k(e,t){let n=document.createElement("div");if(n.textContent=e,n.style.cssText=`position:absolute;left:0;background:${E};color:${J};font:11px -apple-system,sans-serif;padding:1px 6px;border-radius:3px;white-space:nowrap;`,t){let r=document.createElement("span");r.textContent=` ${t}`,r.style.opacity="0.55",n.appendChild(r)}return n}var S=!1,f=null,y=!1,p=!1,h=!1,M=(e)=>`${ne(e.file)}${e.line?`:${e.line}`:""}`;function T(e){f=e,m();let t=N(W(e)),{src:n,comp:r,call:i}=t,o=_(t,p),s=o===n?i:n,l=y!==h,a=(...w)=>w.filter(Boolean).join(" ")||void 0,d=l?o?k(`open ${M(o)}`,a(s&&`⇧ ${M(s)}`,h&&"⌥ chat")):k(`find ${Z(e)}`,a(h&&"⌥ chat")):k(r?`<${r} />${o?` · ${M(o)}`:""}`:Z(e),a(!h&&"⌥ code"));x(e.getBoundingClientRect(),d,l)}function Z(e){let t=e.tagName.toLowerCase(),n=e.classList[0];return(e.id?`${t}#${e.id}`:n?`${t}.${n}`:t).slice(0,48)}var he=new Set(["name","placeholder","aria-label","title","alt","for","href","type","role","src"]);function me(e){let t="";for(let r of Array.from(e.childNodes))if(r.nodeType===Node.TEXT_NODE)t+=r.textContent??"";let n=[];for(let r of Array.from(e.attributes)){if(n.length===12)break;if(r.value&&(he.has(r.name)||r.name.startsWith("data-")))n.push([r.name.slice(0,40),r.value.slice(0,200)])}return{tag:e.tagName.toLowerCase().slice(0,40),id:e.id.slice(0,200),classes:Array.from(e.classList).slice(0,16).map((r)=>r.slice(0,120)),text:t.replace(/\s+/g," ").trim().slice(0,200),attrs:n}}function ee(e){let t=document.elementFromPoint(e.clientX,e.clientY);if(!t)return;let n=t!==f||e.altKey!==y||e.shiftKey!==p;if(y=e.altKey,p=e.shiftKey,n)T(t)}function te(e){e.preventDefault(),e.stopPropagation();let t=f??document.elementFromPoint(e.clientX,e.clientY),n=N(t?W(t):null),{src:r,comp:i,call:o}=n;p=e.shiftKey;let s=_(n,p),l=e.altKey!==h;if(j(),!t)return;c({type:"picked",verb:l?"code":"chat",site:s&&s===o?"call":"source",component:i,file:r?.file??null,line:r?.line??null,callFile:o?.file??null,callLine:o?.line??null,selector:ke(t),tag:t.tagName.toLowerCase(),classes:t.className?.toString?.().slice(0,200)??"",text:t.textContent?.trim().slice(0,120)??"",html:t.outerHTML.slice(0,600),route:location.pathname+location.search,element:me(t)})}function A(e){if(e.key==="Escape"&&e.type==="keydown"){e.preventDefault(),e.stopPropagation(),j(),c({type:"pick-cancel"});return}if((e.key==="Alt"||e.key==="Shift")&&(y!==e.altKey||p!==e.shiftKey)){if(y=e.altKey,p=e.shiftKey,f)T(f)}}function ge(e){if(h=e,S){if(f)T(f);return}S=!0,f=null,y=!1,p=!1,document.addEventListener("mousemove",ee,!0),document.addEventListener("click",te,!0),document.addEventListener("keydown",A,!0),document.addEventListener("keyup",A,!0),document.documentElement.style.cursor="crosshair"}function j(){S=!1,h=!1,f=null,y=!1,p=!1,m(),document.removeEventListener("mousemove",ee,!0),document.removeEventListener("click",te,!0),document.removeEventListener("keydown",A,!0),document.removeEventListener("keyup",A,!0),document.documentElement.style.cursor=""}function ke(e){let t=[],n=e;for(let r=0;n&&n!==document.documentElement&&r<6;r++){if(n.id){t.unshift(`#${CSS.escape(n.id)}`);break}let i=n.parentElement,o=i?Array.from(i.children).indexOf(n)+1:1;t.unshift(`${n.tagName.toLowerCase()}:nth-child(${o})`),n=i}return t.join(" > ")}function ne(e){let t=e.lastIndexOf("/src/");return t>=0?e.slice(t+1):e.split("/").slice(-2).join("/")}function we(e,t){return e.endsWith(t)||t.endsWith(ne(e))}function be(e,t){let n=[],r=0;for(let s of Array.from(document.querySelectorAll("*"))){let l=L(W(s));if(l)r++;if(!l||!we(l.file,e))continue;n.push({el:s,line:l.line??-1})}if(!t||t.length===0)return{matched:n,fromFile:n,withSource:r};if(t.length===1&&t[0][0]===t[0][1]){let s=t[0][0],l=n.filter((d)=>d.line===s);if(l.length>0)return{matched:l,fromFile:n,withSource:r};let a=n.filter((d)=>d.line>0&&d.line<s);return a.sort((d,w)=>w.line-d.line),{matched:a.slice(0,1),fromFile:n,withSource:r}}return{matched:n.filter((s)=>t.some(([l,a])=>s.line>=l-8&&s.line<=a+1)),fromFile:n,withSource:r}}function ve(e,t){m();let{matched:n,fromFile:r,withSource:i}=be(e,t),o=0;for(let{el:s}of n){if(o>=40)break;let l=s.getBoundingClientRect();if(l.width>0&&l.height>0)x(l),o++}if(o===0)c({type:"highlight-miss",path:e,fileMatched:r.length,withSource:i,ranges:t})}window.addEventListener("message",(e)=>{if(e.source!==window.parent)return;if(v.length&&!v.includes(e.origin))return;let t=e.data;if(!t?.__toyon)return;P=e.origin;let n=t;switch(n.type){case"reload":location.reload();break;case"navigate":if(/^[/?#]/.test(n.path))location.assign(n.path);break;case"back":case"forward":{let r=window.navigation;if((n.type==="back"?r?.canGoBack:r?.canGoForward)===!1)break;if(n.type==="back")history.back();else history.forward();break}case"links":{let r=new Set,i=[];for(let o of Array.from(document.querySelectorAll("a[href]"))){if(o.origin!==location.origin||o.target==="_blank"||o.hasAttribute("download"))continue;let s=o.pathname+(o.hash.startsWith("#/")?o.hash:"");if(s.startsWith("/__toyon")||r.has(s))continue;r.add(s);let l=(o.textContent||o.getAttribute("aria-label")||"").replace(/\s+/g," ").trim();if(i.push({path:s,text:l.slice(0,80)}),i.length>=200)break}c({type:"links",links:i});break}case"pick-start":ge(n.verb==="code");break;case"pick-mods":if(S&&(y!==n.alt||p!==n.shift)){if(y=n.alt,p=n.shift,f)T(f)}break;case"pick-cancel":j();break;case"highlight-file":ve(n.path,n.ranges??null);break;case"highlight-computed":{m();let r=/^(color|font|line-height|letter-|text-|word-)/,i=(l)=>{if(/^(INPUT|TEXTAREA|SELECT)$/.test(l.tagName))return!0;for(let a=l.firstChild;a;a=a.nextSibling)if(a.nodeType===3&&a.textContent&&a.textContent.trim())return!0;return!1},o=document.querySelectorAll("*"),s=!0;for(let l=0;l<o.length;l++){let a=getComputedStyle(o[l]),d=([G,re])=>a.getPropertyValue(G)===re&&(!r.test(G)||i(o[l]));if(n.match==="any"?n.props.some(d):n.props.every(d))x(o[l].getBoundingClientRect(),s&&n.label?k(n.label):void 0),s=!1}break}case"highlight-selector":{m();try{let r=document.querySelectorAll(n.selector);for(let i=0;i<r.length;i++)x(r[i].getBoundingClientRect(),i===0&&n.label?k(n.label):void 0)}catch{}break}case"highlight-clear":m();break;case"zen":Q=n.on;break;case"theme":if(/^#[0-9a-f]{3,8}$/i.test(n.accent))E=n.accent;if(/^#[0-9a-f]{3,8}$/i.test(n.accentFg))J=n.accentFg;break}});
1
+ var v=[{id:"quick-open",key:"p"},{id:"commands",key:"p",shift:!0,bareAlias:"F1"},{id:"search",key:"f",shift:!0},{id:"chats",key:"g"},{id:"changes",key:"b",ctrlAlias:{key:"g",shift:!0}},{id:"files",key:"e",shift:!0},{id:"panel-tab-prev",key:"ArrowLeft",alt:!0,textKeeps:!0},{id:"panel-tab-next",key:"ArrowRight",alt:!0,textKeeps:!0},{id:"composer",key:"l"},{id:"rail",key:"k",shift:!0},{id:"keys",key:","},{id:"terminal",key:"j",ctrlAlias:{key:"`"}},{id:"design",key:"d"},{id:"term-tab",key:"`",ctrl:!0,shift:!0},{id:"pick",key:"e"},{id:"inspect",key:"i"},{id:"zen",key:"."},{id:"new",key:"k",aliases:["n"]},{id:"worktree",key:"1-9"},{id:"wt-prev",key:"ArrowUp",alt:!0,ctrlAlias:{key:"Tab",shift:!0},cmdShiftAlias:["[","{"]},{id:"wt-next",key:"ArrowDown",alt:!0,ctrlAlias:{key:"Tab"},cmdShiftAlias:["]","}"]},{id:"wt-unseen-prev",key:"ArrowUp",alt:!0,shift:!0},{id:"wt-unseen-next",key:"ArrowDown",alt:!0,shift:!0},{id:"wt-archive",key:"Backspace",alt:!0,textKeeps:!0,emptyGives:!0},{id:"mark-unread",key:"u",alt:!0,textKeeps:!0},{id:"project",key:"o",ctrlAlias:{key:"r",hostOnly:!0},cmdShiftAlias:["o"]},{id:"refs",key:"g",shift:!0},{id:"routes",key:"u"},{id:"reload",key:"r"},{id:"back",key:"ArrowLeft",textKeeps:!0},{id:"forward",key:"ArrowRight",textKeeps:!0},{id:"close",key:"w"}],q=new Set(["zen","close","back","forward"]);function z(e,{guest:t=!1}={}){if(e.altKey){if(e.metaKey||e.ctrlKey)return null;let r=v.find((o)=>o.alt&&!!o.shift===e.shiftKey&&(o.key===e.key||o.key.length===1&&e.code===`Key${o.key.toUpperCase()}`));return r&&r.id!=="worktree"?{id:r.id}:null}if(!e.metaKey&&!e.ctrlKey){if(e.shiftKey||t)return null;let r=v.find((o)=>o.bareAlias===e.key);return r&&r.id!=="worktree"?{id:r.id}:null}if(!!e.ctrlKey===e.metaKey)return null;let n=e.key.length===1?e.key.toLowerCase():e.key;if(e.metaKey&&!e.shiftKey&&n>="1"&&n<="9")return{id:"worktree",digit:Number(n)};for(let r of v){if(r.id==="worktree")continue;let o=r.ctrlAlias;if(o&&e.ctrlKey&&o.key===n&&!!o.shift===e.shiftKey&&!(t&&o.hostOnly))return{id:r.id};if(e.metaKey&&e.shiftKey&&r.cmdShiftAlias?.includes(n))return{id:r.id};if(r.alt)continue;if(e.ctrlKey&&!r.ctrl||!!r.shift!==e.shiftKey)continue;if(r.key===n||r.aliases?.includes(n))return{id:r.id}}return null}function Y(e){if(e.altKey||e.key.toLowerCase()!=="s")return!1;return!!e.ctrlKey!==e.metaKey}function V(e){let t=v.find((n)=>n.id===e);if(!t)throw Error(`unknown chord ${e}`);return t}function Z(e){let t=e;if(!t?.tagName)return!1;if(t.isContentEditable||t.tagName==="TEXTAREA")return!0;return t.tagName==="INPUT"&&!["button","checkbox","radio","range","submit","reset"].includes(t.type??"")}var ae=Symbol.for("react.forward_ref"),ce=Symbol.for("react.memo");function J(e){if(e._debugSource?.fileName)return{file:e._debugSource.fileName,line:e._debugSource.lineNumber};let t=e._debugStack?.stack;if(t){let n=t.match(/https?:\/\/[^/]+(\/src\/[^)\s?]+)(?:\?[^:)\s]*)?:(\d+):\d+/);if(n?.[1])return{file:n[1],line:Number(n[2])||void 0}}return null}function _(e){for(let t=e;t;t=t.return){let n=J(t);if(n)return n}return null}function L(e){if(typeof e==="function")return e.displayName||e.name||null;let t=e;if(t?.$$typeof===ae)return t.displayName||L(t.render);if(t?.$$typeof===ce)return t.displayName||L(t.type);return null}var ue=(e)=>typeof e.type==="string"||e.tag===6,de=(e,t)=>!!e&&(e===t||!!e.stateNode&&e.stateNode===t.stateNode);function fe(e){let t=null,n=(r)=>{for(let o=r.child??null;o;o=o.sibling??null)if(ue(o)){if(t)return!1;t=o}else if(!n(o))return!1;return!0};return n(e)?t:null}function pe(e){for(let t=e;t;t=t.return){let n=J(t);if(n)return t._debugOwner===null?null:n}return null}function N(e){let t=_(e),n=null,r=null,o=!1;for(let i=e;i;i=i.return){let s=L(i.type);if(!s)continue;let l=!!e&&de(fe(i),e),c=pe(i);if(n&&!(l&&c))break;if(n=s,r=c,o=l,!l)break}if(r&&t&&r.file===t.file&&r.line===t.line)r=null;return{src:t,comp:n,call:r,wraps:o}}function F({src:e,call:t,wraps:n},r){let o=n?t:e,i=n?e:t;return(r?i??o:o??i)??null}if(window.__toyonBridge)throw Error("Toyon bridge already installed");window.__toyonBridge=!0;var E=window.__toyonShellOrigins??[],R=null,a=(e)=>{try{let t=R?[R]:E.length?E:["*"];for(let n of t)window.parent.postMessage({__toyon:!0,...e},n)}catch{}};a({type:"loaded",url:location.href,title:document.title});var x="#fa891e",ee="#1d2021";window.addEventListener("vite:afterUpdate",()=>a({type:"hmr"}));window.addEventListener("error",(e)=>{a({type:"page-error",message:String(e.message),source:e.filename,line:e.lineno})});window.addEventListener("unhandledrejection",(e)=>{a({type:"page-error",message:`unhandled rejection: ${String(e.reason)}`})});var K=()=>a({type:"navigated",url:location.href,title:document.title}),he=history.pushState.bind(history);history.pushState=(...e)=>{he(...e),H(),K()};var ye=history.replaceState.bind(history);history.replaceState=(...e)=>{ye(...e),K()};window.addEventListener("popstate",K);window.addEventListener("hashchange",K);var me=window.navigation,g=null;function H(){g=me?.currentEntry?.index??null}H();window.addEventListener("popstate",()=>{let e=g;H();let t=e===null||g===null||e===g?void 0:g<e?"back":"forward";a({type:"traversed",...t?{dir:t}:{}})});var ge=performance.getEntriesByType("navigation")[0];if(ge?.type==="back_forward")a({type:"traversed"});window.addEventListener("pageshow",(e)=>{if(e.persisted)a({type:"traversed"})});var O=document.title;if(document.head)new MutationObserver(()=>{if(document.title===O)return;O=document.title,a({type:"title",title:O})}).observe(document.head,{childList:!0,subtree:!0,characterData:!0});var te=!1,B=null;window.addEventListener("keyup",(e)=>{if(window.__toyonShell||e.key!==B)return;B=null,a({type:"key",key:e.key,meta:!1,up:!0})},!0);window.addEventListener("keydown",(e)=>{if(window.__toyonShell)return;if(Y(e))e.preventDefault();let t=z(e,{guest:!0});if(t&&V(t.id).textKeeps&&Z(e.target))return;if(te){if(!t||!q.has(t.id))return}else if(e.key==="Escape"){a({type:"key",key:"Escape",meta:!1});return}else if(!t)return;e.preventDefault(),e.stopPropagation(),a({type:"key",key:e.key,code:e.code,meta:e.metaKey,ctrl:e.ctrlKey,shift:e.shiftKey,alt:e.altKey}),B=e.altKey?"Alt":e.ctrlKey?"Control":e.metaKey?"Meta":null},!0);var I=()=>a({type:"focus",gesture:navigator.userActivation?.isActive??!0});window.addEventListener("focusin",I,!0);window.addEventListener("focus",I);if(document.hasFocus()&&document.activeElement&&document.activeElement!==document.body)I();var W=(e)=>!e.defaultPrevented&&!!e.dataTransfer?.types.includes("Files");window.addEventListener("dragover",(e)=>{if(!W(e))return;if(e.preventDefault(),e.dataTransfer)e.dataTransfer.dropEffect="copy";a({type:"drag-files",over:!0})});window.addEventListener("dragleave",(e)=>{if(W(e))a({type:"drag-files",over:!1})});window.addEventListener("drop",(e)=>{if(!W(e))return;e.preventDefault(),a({type:"drop-files",files:Array.from(e.dataTransfer?.files??[])})});function X(e){for(let t of Object.keys(e))if(t.startsWith("__reactFiber$"))return e[t]??null;return null}var u=null,D=typeof HTMLElement<"u"&&"showPopover"in HTMLElement.prototype;function ke(){if(!u?.isConnected){if(u=document.createElement("div"),u.style.cssText="position:fixed;inset:0;width:auto;height:auto;max-width:none;max-height:none;margin:0;padding:0;border:0;background:transparent;overflow:visible;pointer-events:none;z-index:2147483647;",D)u.popover="manual";document.documentElement.appendChild(u)}if(D&&!u.matches(":popover-open"))u.showPopover();return u}function m(){if(!u)return;if(u.innerHTML="",D&&u.matches(":popover-open"))u.hidePopover()}var P=20;function S(e,t,n=!0){let r=document.createElement("div");if(r.style.cssText=`position:fixed;left:${e.left}px;top:${e.top}px;width:${e.width}px;height:${e.height}px;outline:2px solid ${x};outline-offset:-1px;${n?`background:${x}14;`:""}border-radius:2px;`,t){let o=e.top>=P,i=e.bottom+P<=window.innerHeight;if(t.style.top=o?`${-P}px`:i?`${e.height+4}px`:"2px",!o&&!i)t.style.left="2px";r.appendChild(t)}if(ke().appendChild(r),t){let o=t.getBoundingClientRect(),i=o.right-(window.innerWidth-2);if(i>0){let s=Number.parseFloat(t.style.left||"0");t.style.left=`${s-Math.min(i,Math.max(0,o.left-2))}px`}}}function k(e,t){let n=document.createElement("div");if(n.textContent=e,n.style.cssText=`position:absolute;left:0;background:${x};color:${ee};font:11px -apple-system,sans-serif;padding:1px 6px;border-radius:3px;white-space:nowrap;`,t){let r=document.createElement("span");r.textContent=` ${t}`,r.style.opacity="0.55",n.appendChild(r)}return n}var A=!1,f=null,h=!1,p=!1,y=!1,M=(e)=>`${oe(e.file)}${e.line?`:${e.line}`:""}`;function C(e){f=e,m();let t=N(X(e)),{src:n,comp:r,call:o}=t,i=F(t,p),s=i===n?o:n,l=h!==y,c=(...b)=>b.filter(Boolean).join(" ")||void 0,d=l?i?k(`open ${M(i)}`,c(s&&`⇧ ${M(s)}`,y&&"⌥ chat")):k(`find ${Q(e)}`,c(y&&"⌥ chat")):k(r?`<${r} />${i?` · ${M(i)}`:""}`:Q(e),c(!y&&"⌥ code"));S(e.getBoundingClientRect(),d,l)}function Q(e){let t=e.tagName.toLowerCase(),n=e.classList[0];return(e.id?`${t}#${e.id}`:n?`${t}.${n}`:t).slice(0,48)}var we=new Set(["name","placeholder","aria-label","title","alt","for","href","type","role","src"]);function be(e){let t="";for(let r of Array.from(e.childNodes))if(r.nodeType===Node.TEXT_NODE)t+=r.textContent??"";let n=[];for(let r of Array.from(e.attributes)){if(n.length===12)break;if(r.value&&(we.has(r.name)||r.name.startsWith("data-")))n.push([r.name.slice(0,40),r.value.slice(0,200)])}return{tag:e.tagName.toLowerCase().slice(0,40),id:e.id.slice(0,200),classes:Array.from(e.classList).slice(0,16).map((r)=>r.slice(0,120)),text:t.replace(/\s+/g," ").trim().slice(0,200),attrs:n}}function ne(e){let t=document.elementFromPoint(e.clientX,e.clientY);if(!t)return;let n=t!==f||e.altKey!==h||e.shiftKey!==p;if(h=e.altKey,p=e.shiftKey,n)C(t)}function re(e){e.preventDefault(),e.stopPropagation();let t=f??document.elementFromPoint(e.clientX,e.clientY),n=N(t?X(t):null),{src:r,comp:o,call:i}=n;p=e.shiftKey;let s=F(n,p),l=e.altKey!==y;if(j(),!t)return;a({type:"picked",verb:l?"code":"chat",site:s&&s===i?"call":"source",component:o,file:r?.file??null,line:r?.line??null,callFile:i?.file??null,callLine:i?.line??null,selector:Ee(t),tag:t.tagName.toLowerCase(),classes:t.className?.toString?.().slice(0,200)??"",text:t.textContent?.trim().slice(0,120)??"",html:t.outerHTML.slice(0,600),route:location.pathname+location.search,element:be(t)})}function T(e){if(e.key==="Escape"&&e.type==="keydown"){e.preventDefault(),e.stopPropagation(),j(),a({type:"pick-cancel"});return}if((e.key==="Alt"||e.key==="Shift")&&(h!==e.altKey||p!==e.shiftKey)){if(h=e.altKey,p=e.shiftKey,f)C(f)}}function ve(e){if(y=e,A){if(f)C(f);return}A=!0,f=null,h=!1,p=!1,document.addEventListener("mousemove",ne,!0),document.addEventListener("click",re,!0),document.addEventListener("keydown",T,!0),document.addEventListener("keyup",T,!0),document.documentElement.style.cursor="crosshair"}function j(){A=!1,y=!1,f=null,h=!1,p=!1,m(),document.removeEventListener("mousemove",ne,!0),document.removeEventListener("click",re,!0),document.removeEventListener("keydown",T,!0),document.removeEventListener("keyup",T,!0),document.documentElement.style.cursor=""}function Ee(e){let t=[],n=e;for(let r=0;n&&n!==document.documentElement&&r<6;r++){if(n.id){t.unshift(`#${CSS.escape(n.id)}`);break}let o=n.parentElement,i=o?Array.from(o.children).indexOf(n)+1:1;t.unshift(`${n.tagName.toLowerCase()}:nth-child(${i})`),n=o}return t.join(" > ")}function oe(e){let t=e.lastIndexOf("/src/");return t>=0?e.slice(t+1):e.split("/").slice(-2).join("/")}function xe(e,t){return e.endsWith(t)||t.endsWith(oe(e))}function Se(e,t){let n=[],r=0;for(let s of Array.from(document.querySelectorAll("*"))){let l=_(X(s));if(l)r++;if(!l||!xe(l.file,e))continue;n.push({el:s,line:l.line??-1})}if(!t||t.length===0)return{matched:n,fromFile:n,withSource:r};if(t.length===1&&t[0][0]===t[0][1]){let s=t[0][0],l=n.filter((d)=>d.line===s);if(l.length>0)return{matched:l,fromFile:n,withSource:r};let c=n.filter((d)=>d.line>0&&d.line<s);return c.sort((d,b)=>b.line-d.line),{matched:c.slice(0,1),fromFile:n,withSource:r}}return{matched:n.filter((s)=>t.some(([l,c])=>s.line>=l-8&&s.line<=c+1)),fromFile:n,withSource:r}}function Ae(e,t){m();let{matched:n,fromFile:r,withSource:o}=Se(e,t),i=0;for(let{el:s}of n){if(i>=40)break;let l=s.getBoundingClientRect();if(l.width>0&&l.height>0)S(l),i++}if(i===0)a({type:"highlight-miss",path:e,fileMatched:r.length,withSource:o,ranges:t})}var ie=!1,w=!1,Te=(e)=>{for(let t=e;t&&t!==document.documentElement;t=t.parentElement){let n=getComputedStyle(t),r=n.overflowX;if((r==="auto"||r==="scroll")&&t.scrollWidth>t.clientWidth+1)return!0;if(window.__toyonShell)continue;let o=n.touchAction;if(o!=="auto"&&o!=="manipulation"&&!o.includes("pan-x"))return!0}return!1},le=(e,t)=>{let n=e.touches[0]??e.changedTouches[0];if(n)a({type:"touch",phase:t,x:n.clientX,y:n.clientY})};window.addEventListener("touchstart",(e)=>{if(w=!1,!ie||e.touches.length!==1)return;let t=e.target instanceof Element?e.target:null;if(t?.closest("input, textarea, [contenteditable]")||Te(t))return;w=!0,le(e,"start")},{capture:!0,passive:!0});var G=(e,t)=>{if(!w)return;setTimeout(()=>{if(!w)return;let n=t==="move"&&(e.defaultPrevented||e.touches.length!==1);if(t!=="move"||n)w=!1;le(e,n?"cancel":t)},0)};window.addEventListener("touchmove",(e)=>G(e,"move"),{passive:!0});window.addEventListener("touchend",(e)=>G(e,"end"),!0);window.addEventListener("touchcancel",(e)=>G(e,"cancel"),!0);window.addEventListener("message",(e)=>{if(e.source!==window.parent)return;if(E.length&&!E.includes(e.origin))return;let t=e.data;if(!t?.__toyon)return;R=e.origin;let n=t;switch(n.type){case"reload":location.reload();break;case"navigate":if(/^[/?#]/.test(n.path))location.assign(n.path);break;case"back":case"forward":{let r=window.navigation;if((n.type==="back"?r?.canGoBack:r?.canGoForward)===!1)break;if(n.type==="back")history.back();else history.forward();break}case"touches":ie=n.on;break;case"links":{let r=new Set,o=[];for(let i of Array.from(document.querySelectorAll("a[href]"))){if(i.origin!==location.origin||i.target==="_blank"||i.hasAttribute("download"))continue;let s=i.pathname+(i.hash.startsWith("#/")?i.hash:"");if(s.startsWith("/__toyon")||r.has(s))continue;r.add(s);let l=(i.textContent||i.getAttribute("aria-label")||"").replace(/\s+/g," ").trim();if(o.push({path:s,text:l.slice(0,80)}),o.length>=200)break}a({type:"links",links:o});break}case"pick-start":ve(n.verb==="code");break;case"pick-mods":if(A&&(h!==n.alt||p!==n.shift)){if(h=n.alt,p=n.shift,f)C(f)}break;case"pick-cancel":j();break;case"highlight-file":Ae(n.path,n.ranges??null);break;case"highlight-computed":{m();let r=/^(color|font|line-height|letter-|text-|word-)/,o=(l)=>{if(/^(INPUT|TEXTAREA|SELECT)$/.test(l.tagName))return!0;for(let c=l.firstChild;c;c=c.nextSibling)if(c.nodeType===3&&c.textContent&&c.textContent.trim())return!0;return!1},i=document.querySelectorAll("*"),s=!0;for(let l=0;l<i.length;l++){let c=getComputedStyle(i[l]),d=([U,se])=>c.getPropertyValue(U)===se&&(!r.test(U)||o(i[l]));if(n.match==="any"?n.props.some(d):n.props.every(d))S(i[l].getBoundingClientRect(),s&&n.label?k(n.label):void 0),s=!1}break}case"highlight-selector":{m();try{let r=document.querySelectorAll(n.selector);for(let o=0;o<r.length;o++)S(r[o].getBoundingClientRect(),o===0&&n.label?k(n.label):void 0)}catch{}break}case"highlight-clear":m();break;case"zen":te=n.on;break;case"theme":if(/^#[0-9a-f]{3,8}$/i.test(n.accent))x=n.accent;if(/^#[0-9a-f]{3,8}$/i.test(n.accentFg))ee=n.accentFg;break}});
package/dist/cli.js CHANGED
@@ -7,7 +7,7 @@ import { join as join7, resolve } from "path";
7
7
  // package.json
8
8
  var package_default = {
9
9
  name: "toyon",
10
- version: "0.18.0",
10
+ version: "0.20.0",
11
11
  description: "Toyon is where coding agents work on your web app while you check each change by using it. Every chat gets its own running copy with a live preview.",
12
12
  license: "MIT",
13
13
  type: "module",
@@ -47,7 +47,7 @@ var package_default = {
47
47
  prepublishOnly: "bun ../../scripts/pack.ts"
48
48
  },
49
49
  dependencies: {
50
- bun: "1.4.2",
50
+ bun: "1.4.4",
51
51
  "bun-pty": "0.4.10"
52
52
  },
53
53
  devDependencies: {