toyon 0.17.0 → 0.19.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 (223) hide show
  1. package/dist/CHANGELOG.md +77 -0
  2. package/dist/bridge.js +1 -1
  3. package/dist/cli.js +2 -2
  4. package/dist/daemon.js +2279 -1016
  5. package/dist/shell/assets/{Editor-BMBnZV2V.js → Editor-B-1lrUVF.js} +131 -131
  6. package/dist/shell/assets/Editor-B-1lrUVF.js.br +0 -0
  7. package/dist/shell/assets/Editor-B-1lrUVF.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-xxm4nCyN.js → XTerm-CZl-vWEO.js} +1 -1
  13. package/dist/shell/assets/XTerm-CZl-vWEO.js.br +0 -0
  14. package/dist/shell/assets/XTerm-CZl-vWEO.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-DRRmIKjD.js → cssMode-BpigOakf.js} +1 -1
  40. package/dist/shell/assets/cssMode-BpigOakf.js.br +0 -0
  41. package/dist/shell/assets/cssMode-BpigOakf.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-BWXbPnFF.js → freemarker2-vvh2KLdJ.js} +1 -1
  57. package/dist/shell/assets/freemarker2-vvh2KLdJ.js.br +0 -0
  58. package/dist/shell/assets/freemarker2-vvh2KLdJ.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-BlgE3B1J.js → grammar-DBMSnNcB.js} +1 -1
  64. package/dist/shell/assets/grammar-DBMSnNcB.js.br +0 -0
  65. package/dist/shell/assets/grammar-DBMSnNcB.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-swdzvdWB.js → handlebars-ExFAR1bz.js} +1 -1
  69. package/dist/shell/assets/handlebars-ExFAR1bz.js.br +0 -0
  70. package/dist/shell/assets/handlebars-ExFAR1bz.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-GPVhANjL.js → html-DpIWoe_L.js} +1 -1
  74. package/dist/shell/assets/html-DpIWoe_L.js.br +0 -0
  75. package/dist/shell/assets/html-DpIWoe_L.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-BTtuR8kD.js → htmlMode-vCEOKCM-.js} +1 -1
  79. package/dist/shell/assets/htmlMode-vCEOKCM-.js.br +0 -0
  80. package/dist/shell/assets/htmlMode-vCEOKCM-.js.gz +0 -0
  81. package/dist/shell/assets/index-CHbNBHbD.css +1 -0
  82. package/dist/shell/assets/index-CHbNBHbD.css.br +0 -0
  83. package/dist/shell/assets/index-CHbNBHbD.css.gz +0 -0
  84. package/dist/shell/assets/index-D5GN5OOv.js +276 -0
  85. package/dist/shell/assets/index-D5GN5OOv.js.br +0 -0
  86. package/dist/shell/assets/index-D5GN5OOv.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-CFXn2iKE.js → javascript-CF6f9y1O.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-wmrRCrSu.js → jsonMode-CZzpDv9U.js} +1 -1
  93. package/dist/shell/assets/jsonMode-CZzpDv9U.js.br +0 -0
  94. package/dist/shell/assets/jsonMode-CZzpDv9U.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-Bz7Svg4V.js → liquid-5T0ZgJhW.js} +1 -1
  104. package/dist/shell/assets/liquid-5T0ZgJhW.js.br +0 -0
  105. package/dist/shell/assets/liquid-5T0ZgJhW.js.gz +0 -0
  106. package/dist/shell/assets/{lspLanguageFeatures-BDP4BowE.js → lspLanguageFeatures-DrkNrp6u.js} +1 -1
  107. package/dist/shell/assets/lspLanguageFeatures-DrkNrp6u.js.br +0 -0
  108. package/dist/shell/assets/lspLanguageFeatures-DrkNrp6u.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-CzERTPdi.js → mdx-DnLcCYKb.js} +1 -1
  116. package/dist/shell/assets/mdx-DnLcCYKb.js.br +0 -0
  117. package/dist/shell/assets/mdx-DnLcCYKb.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-3OsSAVmo.js → python-Di4WuyJe.js} +1 -1
  149. package/dist/shell/assets/python-Di4WuyJe.js.br +0 -0
  150. package/dist/shell/assets/python-Di4WuyJe.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-BKY4SJuy.js → razor-NpEB1IHs.js} +1 -1
  156. package/dist/shell/assets/razor-NpEB1IHs.js.br +0 -0
  157. package/dist/shell/assets/razor-NpEB1IHs.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-BESW693Z.js → tsMode-BylSuxTF.js} +1 -1
  197. package/dist/shell/assets/tsMode-BylSuxTF.js.br +0 -0
  198. package/dist/shell/assets/tsMode-BylSuxTF.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-SaTEQQ9V.js → xml-BYRl5HAh.js} +1 -1
  210. package/dist/shell/assets/xml-BYRl5HAh.js.br +0 -0
  211. package/dist/shell/assets/xml-BYRl5HAh.js.gz +0 -0
  212. package/dist/shell/assets/{yaml-gHi84-nk.js → yaml-DeSD0TUR.js} +1 -1
  213. package/dist/shell/assets/yaml-DeSD0TUR.js.br +0 -0
  214. package/dist/shell/assets/yaml-DeSD0TUR.js.gz +0 -0
  215. package/dist/shell/icon-192.png +0 -0
  216. package/dist/shell/icon-512.png +0 -0
  217. package/dist/shell/icon-maskable-512.png +0 -0
  218. package/dist/shell/index.html +101 -17
  219. package/dist/shell/manifest.json +32 -1
  220. package/dist/shell/sw.js +117 -22
  221. package/package.json +2 -2
  222. package/dist/shell/assets/index-9aG0ri4Y.css +0 -1
  223. package/dist/shell/assets/index-miqqiN7Z.js +0 -269
package/dist/CHANGELOG.md CHANGED
@@ -2,6 +2,83 @@
2
2
 
3
3
  What changed in each release of Toyon, newest first.
4
4
 
5
+ ## 0.19.0 (2026-10-26)
6
+
7
+ 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.
8
+
9
+ ### New
10
+ - 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.
11
+ - 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.
12
+ - 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.
13
+ - 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.
14
+ - 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.
15
+ - 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.
16
+ - 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.
17
+ - A quick flick on a phone rail row archives it without reaching the rung.
18
+ - 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.
19
+ - 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.
20
+
21
+ ### Changed
22
+ - 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.
23
+ - 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.
24
+ - 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.
25
+ - 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.
26
+ - 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.
27
+ - 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.
28
+ - The model picker labels the default row with the model and effort the agent actually ran, instead of a fixed name.
29
+ - The spinner is the four-square mark everywhere; the ring is gone.
30
+ - 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.
31
+ - On the desk the log's scrollbar stops above the composer instead of running alongside it.
32
+ - 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.
33
+ - 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.
34
+ - Phone type is sized from the phone: inline code sits one point under the prose, and tool rows return to the small mono.
35
+ - The Claude Code adapter is pinned to 0.95.0.
36
+
37
+ ### Fixed
38
+ - 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.
39
+ - A nameless notice from Claude Code ran into the model's next reply as one line of text.
40
+ - 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.
41
+ - Hovering a card option moved the cursor but left the keyboard on a transcript row, so the digit and letter keys went there.
42
+ - 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.
43
+ - 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.
44
+ - In a browser without scroll-driven animations the first column of a wide table was dimmed at rest.
45
+
46
+ ## 0.18.0 (2026-10-23)
47
+
48
+ 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.
49
+
50
+ ### New
51
+ - A plan card can take a note with its answer. Open the field under a row, write the note, and Enter answers with that row and sends the words after it, so a plan is accepted with a condition in one step. The draft stays with the card when you switch worktrees.
52
+ - Up in a blank composer walks onto the card answers you wrote a note for, and puts that note back in the box, in with your messages and bang commands.
53
+ - When Claude runs on Amazon Bedrock and the AWS sign-in has lapsed, the turn ends on a card instead of an error row. Its first button sets Claude Code to refresh the sign-in itself from then on; the others run a one-off login or send the message again.
54
+ - On a phone, tapping the usage ring opens the meters with the menu beneath them.
55
+ - An installed app and its splash screen get a full icon on one colour in place of the monogram.
56
+
57
+ ### Changed
58
+ - Pressing stop shows at once: the button breathes and the rail dot pulses red until the turn has really ended. Before, nothing moved for as long as the cancel took, up to half a minute, so the press read as ignored.
59
+ - An option's preview on an ask card sits under its own row and scrolls past twelve lines, instead of in a band that followed the cursor and resized the card.
60
+ - The editor pane head leads with the file name and dims the directory after it. The directory shortens and then drops when the pane is narrow, and copy path and reveal moved into the head's right-click menu.
61
+ - The phone rail's swipe follows one ladder, land, then archive, then more, and shows only the rungs the row's menu offers. A landed and clean row has no land rung, so archive takes the short drag. The well behind the row darkens with the slide and fades as the row settles.
62
+ - Opening a file under Toyon's home works for transcripts, logs, themes and launcher sources. Only the daemon's own state and credentials are refused, and the refusal says so.
63
+ - A slow first connection no longer flips the window to a reason: the shell tries twice before naming one, so the list stays on screen, and a wrong token is still named at once. The boot page draws the four-square mark after a short delay.
64
+ - A queued message shows its tag on a line above the text, and the commit row's tip sits on the chat's side of the row as a rail row's does.
65
+
66
+ ### Fixed
67
+ - With Fable at its weekly cap, the usage ring drew the next fullest window and the out-until warning matched no row. The Fable week is now a row of its own in the usage view, the ring and the warning.
68
+ - A message sent mid-turn that the agent went on to answer past a stop was queued and run a second time.
69
+ - A reply that ended in an error or on a sign-in card left its row marked as running, in the moment and in the stored chat.
70
+ - An image attached to a card answer was lost; it now reaches the agent with the words.
71
+ - A chat that paused to ask you something was listed twice on the updated card, as asking and as finished. It shows once, as asking.
72
+ - Typing a full @ worktree name and a space now closes the mention menu, and a trailing ?, ! or . no longer keeps it open or gets swallowed by Enter.
73
+ - Pressing go on after a stop or error now moves the row up the rail like any send.
74
+ - On a phone, the status bar matches the screen behind it once the app has booted, instead of a different shade above the body.
75
+ - A mostly vertical scroll in a diff no longer drifts it a pixel sideways.
76
+ - A code chip inside a table cell no longer wraps at its spaces; a table of chips scrolls sideways on a phone instead.
77
+ - The offer line under the composer clipped the focus ring on a long offer, and the sync note sat beside the behind-main count while a sync ran instead of at the row's end.
78
+
79
+ ### Not yet
80
+ - The app icon is a stand-in until the final one is drawn.
81
+
5
82
  ## 0.17.0 (2026-10-21)
6
83
 
7
84
  The composer's @ menu reaches the other worktrees of the project, the editor pane can wrap long lines, and a git command that hangs no longer holds up every later landing.
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.17.0",
10
+ version: "0.19.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: {