@dungle-scrubs/tallow 0.8.23 → 0.8.24

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 (224) hide show
  1. package/dist/config.d.ts +1 -1
  2. package/dist/config.js +1 -1
  3. package/dist/workspace-transition-interactive.d.ts +1 -0
  4. package/dist/workspace-transition-interactive.d.ts.map +1 -1
  5. package/dist/workspace-transition-interactive.js +3 -0
  6. package/dist/workspace-transition-interactive.js.map +1 -1
  7. package/extensions/_shared/__tests__/shell-policy.test.ts +16 -13
  8. package/extensions/_shared/shell-policy.ts +8 -3
  9. package/extensions/hooks/__tests__/stale-cwd.test.ts +108 -0
  10. package/extensions/hooks/index.ts +52 -2
  11. package/extensions/plan-mode-tool/__tests__/index.test.ts +0 -1
  12. package/extensions/plan-mode-tool/__tests__/utils.test.ts +0 -57
  13. package/extensions/plan-mode-tool/extension.json +1 -10
  14. package/extensions/plan-mode-tool/index.ts +11 -284
  15. package/extensions/plan-mode-tool/utils.ts +0 -29
  16. package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/HISTORY.md +541 -0
  17. package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/LICENSE +23 -0
  18. package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/README.md +109 -0
  19. package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/db.json +9342 -0
  20. package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/index.js +12 -0
  21. package/node_modules/.bun/mime-types@3.0.2/node_modules/mime-db/package.json +56 -0
  22. package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/tui.d.ts +13 -0
  23. package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/tui.d.ts.map +1 -1
  24. package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/tui.js +22 -2
  25. package/node_modules/@mariozechner/pi-tui/dist/tui.js.map +1 -0
  26. package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/package.json +1 -1
  27. package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/tui-diff-regression.test.ts +52 -0
  28. package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/tui.ts +23 -2
  29. package/package.json +11 -9
  30. package/packages/tallow-tui/node_modules/@types/mime-types/LICENSE +21 -0
  31. package/packages/tallow-tui/node_modules/@types/mime-types/README.md +28 -0
  32. package/packages/tallow-tui/node_modules/@types/mime-types/index.d.ts +9 -0
  33. package/packages/tallow-tui/node_modules/@types/mime-types/package.json +25 -0
  34. package/packages/tallow-tui/node_modules/chalk/license +9 -0
  35. package/packages/tallow-tui/node_modules/chalk/package.json +83 -0
  36. package/packages/tallow-tui/node_modules/chalk/readme.md +297 -0
  37. package/packages/tallow-tui/node_modules/chalk/source/index.d.ts +325 -0
  38. package/packages/tallow-tui/node_modules/chalk/source/index.js +225 -0
  39. package/packages/tallow-tui/node_modules/chalk/source/utilities.js +33 -0
  40. package/packages/tallow-tui/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
  41. package/packages/tallow-tui/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
  42. package/packages/tallow-tui/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
  43. package/packages/tallow-tui/node_modules/chalk/source/vendor/supports-color/browser.js +34 -0
  44. package/packages/tallow-tui/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
  45. package/packages/tallow-tui/node_modules/chalk/source/vendor/supports-color/index.js +190 -0
  46. package/packages/tallow-tui/node_modules/get-east-asian-width/index.d.ts +60 -0
  47. package/packages/tallow-tui/node_modules/get-east-asian-width/index.js +30 -0
  48. package/packages/tallow-tui/node_modules/get-east-asian-width/license +9 -0
  49. package/packages/tallow-tui/node_modules/get-east-asian-width/lookup.js +403 -0
  50. package/packages/tallow-tui/node_modules/get-east-asian-width/package.json +70 -0
  51. package/packages/tallow-tui/node_modules/get-east-asian-width/readme.md +65 -0
  52. package/packages/tallow-tui/node_modules/marked/LICENSE.md +44 -0
  53. package/packages/tallow-tui/node_modules/marked/README.md +106 -0
  54. package/packages/tallow-tui/node_modules/marked/bin/main.js +282 -0
  55. package/packages/tallow-tui/node_modules/marked/bin/marked.js +15 -0
  56. package/packages/tallow-tui/node_modules/marked/lib/marked.cjs +2211 -0
  57. package/packages/tallow-tui/node_modules/marked/lib/marked.cjs.map +7 -0
  58. package/packages/tallow-tui/node_modules/marked/lib/marked.d.cts +728 -0
  59. package/packages/tallow-tui/node_modules/marked/lib/marked.d.ts +728 -0
  60. package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js +2189 -0
  61. package/packages/tallow-tui/node_modules/marked/lib/marked.esm.js.map +7 -0
  62. package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js +2213 -0
  63. package/packages/tallow-tui/node_modules/marked/lib/marked.umd.js.map +7 -0
  64. package/packages/tallow-tui/node_modules/marked/man/marked.1 +111 -0
  65. package/packages/tallow-tui/node_modules/marked/man/marked.1.md +92 -0
  66. package/packages/tallow-tui/node_modules/marked/marked.min.js +69 -0
  67. package/packages/tallow-tui/node_modules/marked/package.json +111 -0
  68. package/packages/tallow-tui/node_modules/mime-types/HISTORY.md +428 -0
  69. package/packages/tallow-tui/node_modules/mime-types/LICENSE +23 -0
  70. package/packages/tallow-tui/node_modules/mime-types/README.md +126 -0
  71. package/packages/tallow-tui/node_modules/mime-types/index.js +211 -0
  72. package/packages/tallow-tui/node_modules/mime-types/mimeScore.js +57 -0
  73. package/packages/tallow-tui/node_modules/mime-types/package.json +49 -0
  74. package/extensions/plan-mode-tool/__tests__/agent-end-execution.test.ts +0 -373
  75. package/packages/tallow-tui/dist/tui.js.map +0 -1
  76. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/README.md +0 -0
  77. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/autocomplete.d.ts +0 -0
  78. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/autocomplete.d.ts.map +0 -0
  79. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/autocomplete.js +0 -0
  80. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/autocomplete.js.map +0 -0
  81. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/border-styles.d.ts +0 -0
  82. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/border-styles.d.ts.map +0 -0
  83. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/border-styles.js +0 -0
  84. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/border-styles.js.map +0 -0
  85. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/bordered-box.d.ts +0 -0
  86. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/bordered-box.d.ts.map +0 -0
  87. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/bordered-box.js +0 -0
  88. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/bordered-box.js.map +0 -0
  89. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/box.d.ts +0 -0
  90. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/box.d.ts.map +0 -0
  91. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/box.js +0 -0
  92. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/box.js.map +0 -0
  93. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/cancellable-loader.d.ts +0 -0
  94. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/cancellable-loader.d.ts.map +0 -0
  95. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/cancellable-loader.js +0 -0
  96. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/cancellable-loader.js.map +0 -0
  97. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/editor.d.ts +0 -0
  98. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/editor.d.ts.map +0 -0
  99. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/editor.js +0 -0
  100. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/editor.js.map +0 -0
  101. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/image.d.ts +0 -0
  102. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/image.d.ts.map +0 -0
  103. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/image.js +0 -0
  104. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/image.js.map +0 -0
  105. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/input.d.ts +0 -0
  106. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/input.d.ts.map +0 -0
  107. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/input.js +0 -0
  108. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/input.js.map +0 -0
  109. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/loader.d.ts +0 -0
  110. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/loader.d.ts.map +0 -0
  111. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/loader.js +0 -0
  112. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/loader.js.map +0 -0
  113. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/markdown.d.ts +0 -0
  114. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/markdown.d.ts.map +0 -0
  115. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/markdown.js +0 -0
  116. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/markdown.js.map +0 -0
  117. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/select-list.d.ts +0 -0
  118. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/select-list.d.ts.map +0 -0
  119. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/select-list.js +0 -0
  120. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/select-list.js.map +0 -0
  121. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/settings-list.d.ts +0 -0
  122. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/settings-list.d.ts.map +0 -0
  123. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/settings-list.js +0 -0
  124. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/settings-list.js.map +0 -0
  125. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/spacer.d.ts +0 -0
  126. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/spacer.d.ts.map +0 -0
  127. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/spacer.js +0 -0
  128. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/spacer.js.map +0 -0
  129. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/text.d.ts +0 -0
  130. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/text.d.ts.map +0 -0
  131. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/text.js +0 -0
  132. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/text.js.map +0 -0
  133. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/truncated-text.d.ts +0 -0
  134. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/truncated-text.d.ts.map +0 -0
  135. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/truncated-text.js +0 -0
  136. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/components/truncated-text.js.map +0 -0
  137. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/editor-component.d.ts +0 -0
  138. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/editor-component.d.ts.map +0 -0
  139. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/editor-component.js +0 -0
  140. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/editor-component.js.map +0 -0
  141. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/fuzzy.d.ts +0 -0
  142. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/fuzzy.d.ts.map +0 -0
  143. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/fuzzy.js +0 -0
  144. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/fuzzy.js.map +0 -0
  145. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/index.d.ts +0 -0
  146. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/index.d.ts.map +0 -0
  147. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/index.js +0 -0
  148. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/index.js.map +0 -0
  149. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keybindings.d.ts +0 -0
  150. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keybindings.d.ts.map +0 -0
  151. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keybindings.js +0 -0
  152. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keybindings.js.map +0 -0
  153. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keys.d.ts +0 -0
  154. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keys.d.ts.map +0 -0
  155. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keys.js +0 -0
  156. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/keys.js.map +0 -0
  157. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/kill-ring.d.ts +0 -0
  158. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/kill-ring.d.ts.map +0 -0
  159. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/kill-ring.js +0 -0
  160. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/kill-ring.js.map +0 -0
  161. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/stdin-buffer.d.ts +0 -0
  162. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/stdin-buffer.d.ts.map +0 -0
  163. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/stdin-buffer.js +0 -0
  164. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/stdin-buffer.js.map +0 -0
  165. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal-image.d.ts +0 -0
  166. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal-image.d.ts.map +0 -0
  167. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal-image.js +0 -0
  168. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal-image.js.map +0 -0
  169. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal.d.ts +0 -0
  170. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal.d.ts.map +0 -0
  171. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal.js +0 -0
  172. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/terminal.js.map +0 -0
  173. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/test-utils/capability-env.d.ts +0 -0
  174. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/test-utils/capability-env.d.ts.map +0 -0
  175. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/test-utils/capability-env.js +0 -0
  176. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/test-utils/capability-env.js.map +0 -0
  177. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/undo-stack.d.ts +0 -0
  178. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/undo-stack.d.ts.map +0 -0
  179. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/undo-stack.js +0 -0
  180. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/undo-stack.js.map +0 -0
  181. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/utils.d.ts +0 -0
  182. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/utils.d.ts.map +0 -0
  183. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/utils.js +0 -0
  184. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/dist/utils.js.map +0 -0
  185. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/__snapshots__/render.test.ts.snap +0 -0
  186. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/editor-border.test.ts +0 -0
  187. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/editor-change-listener.test.ts +0 -0
  188. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/editor-ghost-text.test.ts +0 -0
  189. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/fuzzy.test.ts +0 -0
  190. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/image-component.test.ts +0 -0
  191. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/keys.test.ts +0 -0
  192. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/render.test.ts +0 -0
  193. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/stdin-buffer.test.ts +0 -0
  194. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/terminal-image.test.ts +0 -0
  195. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/tui-render-scheduling.test.ts +0 -0
  196. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/__tests__/utils.test.ts +0 -0
  197. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/autocomplete.ts +0 -0
  198. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/border-styles.ts +0 -0
  199. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/bordered-box.ts +0 -0
  200. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/box.ts +0 -0
  201. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/cancellable-loader.ts +0 -0
  202. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/editor.ts +0 -0
  203. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/image.ts +0 -0
  204. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/input.ts +0 -0
  205. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/loader.ts +0 -0
  206. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/markdown.ts +0 -0
  207. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/select-list.ts +0 -0
  208. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/settings-list.ts +0 -0
  209. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/spacer.ts +0 -0
  210. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/text.ts +0 -0
  211. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/components/truncated-text.ts +0 -0
  212. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/editor-component.ts +0 -0
  213. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/fuzzy.ts +0 -0
  214. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/index.ts +0 -0
  215. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/keybindings.ts +0 -0
  216. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/keys.ts +0 -0
  217. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/kill-ring.ts +0 -0
  218. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/stdin-buffer.ts +0 -0
  219. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/terminal-image.ts +0 -0
  220. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/terminal.ts +0 -0
  221. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/test-utils/capability-env.ts +0 -0
  222. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/undo-stack.ts +0 -0
  223. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/src/utils.ts +0 -0
  224. /package/{packages/tallow-tui → node_modules/@mariozechner/pi-tui}/tsconfig.build.json +0 -0
package/dist/config.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { type RuntimePathProvider } from "./runtime-path-provider.js";
2
2
  export declare const APP_NAME = "tallow";
3
- export declare const TALLOW_VERSION = "0.8.23";
3
+ export declare const TALLOW_VERSION = "0.8.24";
4
4
  export declare const CONFIG_DIR = ".tallow";
5
5
  /** ~/.tallow (or override from ~/.config/tallow-work-dirs) — all user config, sessions, auth, extensions */
6
6
  export declare const TALLOW_HOME: string;
package/dist/config.js CHANGED
@@ -6,7 +6,7 @@ import { fileURLToPath } from "node:url";
6
6
  import { createRuntimePathProvider } from "./runtime-path-provider.js";
7
7
  // ─── Identity ────────────────────────────────────────────────────────────────
8
8
  export const APP_NAME = "tallow";
9
- export const TALLOW_VERSION = "0.8.23"; // x-release-please-version
9
+ export const TALLOW_VERSION = "0.8.24"; // x-release-please-version
10
10
  export const CONFIG_DIR = ".tallow";
11
11
  // ─── Paths ───────────────────────────────────────────────────────────────────
12
12
  /** ~/.tallow (or override from ~/.config/tallow-work-dirs) — all user config, sessions, auth, extensions */
@@ -25,6 +25,7 @@ interface InteractiveModeLike {
25
25
  subscribeToAgent(): void;
26
26
  ui: {
27
27
  requestRender(force?: boolean): void;
28
+ requestScrollbackClear?(): void;
28
29
  };
29
30
  unsubscribe?: (() => void) | undefined;
30
31
  updateTerminalTitle(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-transition-interactive.d.ts","sourceRoot":"","sources":["../src/workspace-transition-interactive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-transition-interactive.d.ts","sourceRoot":"","sources":["../src/workspace-transition-interactive.ts"],"names":[],"mappings":"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"}
@@ -115,6 +115,9 @@ function resetInteractiveModeState(mode) {
115
115
  mode.resetExtensionUI();
116
116
  mode.unsubscribe?.();
117
117
  mode.unsubscribe = undefined;
118
+ // Clear terminal scrollback so stale content from the previous session
119
+ // doesn't visually flow into the new session's startup output.
120
+ mode.ui.requestScrollbackClear?.();
118
121
  }
119
122
  /**
120
123
  * Emit session_shutdown on the previous session before it is discarded.
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-transition-interactive.js","sourceRoot":"","sources":["../src/workspace-transition-interactive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace-transition-interactive.js","sourceRoot":"","sources":["../src/workspace-transition-interactive.ts"],"names":[],"mappings":"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"}
@@ -181,11 +181,15 @@ describe("policy evaluation", () => {
181
181
  expect(verdict.trustLevel).toBe("explicit");
182
182
  });
183
183
 
184
- test("rm -rf in home directory is high-risk but not denylisted", () => {
184
+ test("rm -rf of non-root targets is allowed without confirmation", () => {
185
185
  const verdict = evaluateCommand("rm -rf ~/tmp/demo", "bash", process.cwd());
186
186
  expect(verdict.allowed).toBe(true);
187
- expect(verdict.requiresConfirmation).toBe(true);
188
- expect(verdict.reason).toContain("high-risk");
187
+ expect(verdict.requiresConfirmation).toBe(false);
188
+ });
189
+
190
+ test("rm -rf / is still hard-denied", () => {
191
+ const verdict = evaluateCommand("rm -rf /", "bash", process.cwd());
192
+ expect(verdict.allowed).toBe(false);
189
193
  });
190
194
 
191
195
  test("implicit commands are blocked while disabled", () => {
@@ -447,8 +451,8 @@ describe("process wrappers", () => {
447
451
  });
448
452
 
449
453
  describe("deriveAllowPattern", () => {
450
- test("rm -rf → exact command", () => {
451
- expect(deriveAllowPattern("rm -rf ./dist")).toBe("Bash(rm -rf ./dist)");
454
+ test("rm -rf → null (not high-risk, guarded by denylist and hooks)", () => {
455
+ expect(deriveAllowPattern("rm -rf ./dist")).toBeNull();
452
456
  });
453
457
 
454
458
  test("sudo → exact command", () => {
@@ -494,21 +498,20 @@ describe("deriveAllowPattern", () => {
494
498
  expect(deriveAllowPattern("ls -la")).toBeNull();
495
499
  });
496
500
 
497
- test("uses first match but returns exact command regardless", () => {
498
- // "sudo rm -rf" matches rm -rf first (it appears first in pattern list)
501
+ test("sudo rm -rf matches sudo pattern", () => {
499
502
  const pattern = deriveAllowPattern("sudo rm -rf /tmp/test");
500
503
  expect(pattern).toBe("Bash(sudo rm -rf /tmp/test)");
501
504
  });
502
505
 
503
506
  test("trims whitespace from command", () => {
504
- expect(deriveAllowPattern(" rm -rf ./cache ")).toBe("Bash(rm -rf ./cache)");
507
+ expect(deriveAllowPattern(" sudo apt upgrade ")).toBe("Bash(sudo apt upgrade)");
505
508
  });
506
509
 
507
- test("different paths produce different patterns", () => {
508
- const pattern1 = deriveAllowPattern("rm -rf apps/foo/.cache");
509
- const pattern2 = deriveAllowPattern("rm -rf apps/bar/.cache");
510
- expect(pattern1).toBe("Bash(rm -rf apps/foo/.cache)");
511
- expect(pattern2).toBe("Bash(rm -rf apps/bar/.cache)");
510
+ test("different args produce different patterns", () => {
511
+ const pattern1 = deriveAllowPattern("sudo apt install foo");
512
+ const pattern2 = deriveAllowPattern("sudo apt install bar");
513
+ expect(pattern1).toBe("Bash(sudo apt install foo)");
514
+ expect(pattern2).toBe("Bash(sudo apt install bar)");
512
515
  expect(pattern1).not.toBe(pattern2);
513
516
  });
514
517
  });
@@ -133,9 +133,15 @@ const ALWAYS_BLOCK_PATTERNS: readonly RegExp[] = [
133
133
  ),
134
134
  ];
135
135
 
136
- /** High-risk patterns: explicit sources require confirmation. */
136
+ /** High-risk patterns: explicit sources require confirmation.
137
+ *
138
+ * NOTE: `rm -r` is intentionally absent. Catastrophic rm targets (/, ~, ., ..)
139
+ * are hard-denied by ALWAYS_BLOCK_PATTERNS above. Non-catastrophic recursive
140
+ * deletes (build dirs, caches, project subdirs) are normal dev workflow and
141
+ * should not prompt. Additional rm guardrails live in tallow-plugins hooks
142
+ * (rm_protection.py) which do proper token-parsed analysis.
143
+ */
137
144
  const HIGH_RISK_PATTERNS: readonly RegExp[] = [
138
- new RegExp(`${COMMAND_SEGMENT_PREFIX}rm\\s+-\\w*r\\w*`, "i"),
139
145
  new RegExp(`${COMMAND_SEGMENT_PREFIX}sudo\\b`, "i"),
140
146
  new RegExp(`${COMMAND_SEGMENT_PREFIX}curl\\b[^\\n|]*\\|\\s*(?:ba)?sh\\b`, "i"),
141
147
  new RegExp(`${COMMAND_SEGMENT_PREFIX}wget\\b[^\\n|]*\\|\\s*(?:ba)?sh\\b`, "i"),
@@ -184,7 +190,6 @@ const auditTrail: ShellAuditEntry[] =
184
190
  * rather than a wildcard pattern.
185
191
  */
186
192
  const HIGH_RISK_ALLOW_PATTERNS: readonly RegExp[] = [
187
- /\brm\s+-\w*r\w*/i,
188
193
  /\bsudo\b/i,
189
194
  /\bcurl\b[^\n|]*\|\s*(?:ba)?sh\b/i,
190
195
  /\bwget\b[^\n|]*\|\s*(?:ba)?sh\b/i,
@@ -0,0 +1,108 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { type HookHandler, runAgentHook, runCommandHook } from "../index.js";
3
+
4
+ /** Nonexistent directory path — guaranteed to not exist on any system. */
5
+ const MISSING_CWD = "/tmp/tallow-test-nonexistent-dir-stale-cwd-bug193";
6
+
7
+ /**
8
+ * Build a minimal command hook handler for testing.
9
+ *
10
+ * @param command - Shell command to execute
11
+ * @returns Command-type hook handler
12
+ */
13
+ function createCommandHandler(command: string): HookHandler {
14
+ return {
15
+ command,
16
+ timeout: 5,
17
+ type: "command",
18
+ };
19
+ }
20
+
21
+ /**
22
+ * Build a minimal agent hook handler for testing.
23
+ *
24
+ * @param agent - Agent name
25
+ * @returns Agent-type hook handler
26
+ */
27
+ function createAgentHandler(agent: string): HookHandler {
28
+ return {
29
+ agent,
30
+ prompt: "test prompt",
31
+ timeout: 5,
32
+ type: "agent",
33
+ };
34
+ }
35
+
36
+ describe("stale cwd handling", () => {
37
+ describe("runCommandHook", () => {
38
+ test("returns infrastructure error for nonexistent cwd", async () => {
39
+ const handler = createCommandHandler("echo ok");
40
+ const result = await runCommandHook(handler, {}, MISSING_CWD);
41
+
42
+ expect(result.ok).toBe(false);
43
+ expect(result.infrastructureError).toBe(true);
44
+ expect(result.reason).toContain("cwd no longer exists");
45
+ expect(result.reason).toContain(MISSING_CWD);
46
+ });
47
+
48
+ test("does not set decision: block for missing cwd", async () => {
49
+ const handler = createCommandHandler("echo ok");
50
+ const result = await runCommandHook(handler, {}, MISSING_CWD);
51
+
52
+ expect(result.decision).toBeUndefined();
53
+ });
54
+
55
+ test("still works normally with valid cwd", async () => {
56
+ const handler = createCommandHandler(
57
+ 'node -e "process.stdout.write(JSON.stringify({ok:true}))"'
58
+ );
59
+ const result = await runCommandHook(handler, {}, process.cwd());
60
+
61
+ expect(result.ok).toBe(true);
62
+ expect(result.infrastructureError).toBeUndefined();
63
+ });
64
+ });
65
+
66
+ describe("runAgentHook", () => {
67
+ test("returns infrastructure error for nonexistent cwd", async () => {
68
+ const handler = createAgentHandler("test-agent");
69
+ const result = await runAgentHook(handler, {}, MISSING_CWD, "/tmp");
70
+
71
+ expect(result.ok).toBe(false);
72
+ expect(result.infrastructureError).toBe(true);
73
+ expect(result.reason).toContain("cwd no longer exists");
74
+ expect(result.reason).toContain(MISSING_CWD);
75
+ });
76
+
77
+ test("does not set decision: block for missing cwd", async () => {
78
+ const handler = createAgentHandler("test-agent");
79
+ const result = await runAgentHook(handler, {}, MISSING_CWD, "/tmp");
80
+
81
+ expect(result.decision).toBeUndefined();
82
+ });
83
+ });
84
+
85
+ describe("infrastructure vs policy distinction", () => {
86
+ test("infrastructure error result shape differs from policy block", async () => {
87
+ // Infrastructure error: missing cwd
88
+ const infraHandler = createCommandHandler("echo ok");
89
+ const infraResult = await runCommandHook(infraHandler, {}, MISSING_CWD);
90
+
91
+ // Policy block: exit code 2
92
+ const policyHandler = createCommandHandler("exit 2");
93
+ const policyResult = await runCommandHook(policyHandler, {}, process.cwd());
94
+
95
+ // Both are ok: false
96
+ expect(infraResult.ok).toBe(false);
97
+ expect(policyResult.ok).toBe(false);
98
+
99
+ // Infrastructure error is flagged, policy block is not
100
+ expect(infraResult.infrastructureError).toBe(true);
101
+ expect(policyResult.infrastructureError).toBeUndefined();
102
+
103
+ // Policy block has decision: "block", infrastructure error does not
104
+ expect(policyResult.decision).toBe("block");
105
+ expect(infraResult.decision).toBeUndefined();
106
+ });
107
+ });
108
+ });
@@ -75,6 +75,8 @@ export interface HookResult {
75
75
  reason?: string;
76
76
  additionalContext?: string;
77
77
  decision?: "block" | "allow";
78
+ /** True when the hook failed due to infrastructure (missing cwd, spawn error), not a policy decision. */
79
+ infrastructureError?: boolean;
78
80
  }
79
81
 
80
82
  // Events that support blocking via hook decisions.
@@ -831,6 +833,16 @@ export async function runCommandHook(
831
833
  };
832
834
  }
833
835
 
836
+ // Pre-spawn guard: bail early if the working directory no longer exists.
837
+ // This catches the common case of a workspace rename/delete while the session is active.
838
+ if (!fs.existsSync(cwd)) {
839
+ return {
840
+ ok: false,
841
+ reason: `Hook cwd no longer exists: ${cwd}`,
842
+ infrastructureError: true,
843
+ };
844
+ }
845
+
834
846
  const timeoutMs = (handler.timeout ?? 600) * 1000;
835
847
  const maxBufferBytes = getHookOutputMaxBufferBytes();
836
848
  const hookEventJson = JSON.stringify(eventData);
@@ -894,7 +906,18 @@ export async function runCommandHook(
894
906
  }
895
907
 
896
908
  proc.once("error", (error) => {
897
- settle({ ok: false, reason: error.message || "Hook command failed to start" });
909
+ const spawnError = error as NodeJS.ErrnoException;
910
+ // Belt-and-suspenders: if the cwd was deleted between the pre-spawn
911
+ // check and the actual spawn(), detect it here via ENOENT.
912
+ const isCwdMissing = spawnError.code === "ENOENT" && !fs.existsSync(cwd);
913
+ const reason = isCwdMissing
914
+ ? `Hook cwd no longer exists: ${cwd}`
915
+ : error.message || "Hook command failed to start";
916
+ settle({
917
+ ok: false,
918
+ reason,
919
+ infrastructureError: isCwdMissing || spawnError.code === "ENOENT",
920
+ });
898
921
  });
899
922
 
900
923
  proc.once("close", (code) => {
@@ -962,6 +985,15 @@ export async function runAgentHook(
962
985
  agentsDir: string,
963
986
  signal?: AbortSignal
964
987
  ): Promise<HookResult> {
988
+ // Pre-spawn guard: bail early if the working directory no longer exists.
989
+ if (!fs.existsSync(cwd)) {
990
+ return {
991
+ ok: false,
992
+ reason: `Hook cwd no longer exists: ${cwd}`,
993
+ infrastructureError: true,
994
+ };
995
+ }
996
+
965
997
  const timeoutMs = (handler.timeout ?? 60) * 1000;
966
998
  const maxBufferBytes = getHookOutputMaxBufferBytes();
967
999
 
@@ -1136,6 +1168,9 @@ export default function (pi: ExtensionAPI) {
1136
1168
  let ctx: ExtensionContext | null = null;
1137
1169
  let stateManager: HookStateManager | null = null;
1138
1170
 
1171
+ /** Tracks whether the stale-cwd warning has been shown this session. */
1172
+ let staleCwdWarningShown = false;
1173
+
1139
1174
  // Pending async hook results to deliver on next turn
1140
1175
  const pendingAsyncResults: Array<{ event: string; result: HookResult }> = [];
1141
1176
 
@@ -1426,7 +1461,22 @@ export default function (pi: ExtensionAPI) {
1426
1461
  additionalContext = `${(additionalContext || "") + result.additionalContext}\n`;
1427
1462
  }
1428
1463
 
1429
- if (!result.ok && canBlock) {
1464
+ // Surface a user-visible warning once per session when hooks are
1465
+ // skipped due to infrastructure errors (e.g. workspace renamed).
1466
+ if (result.infrastructureError && !staleCwdWarningShown) {
1467
+ staleCwdWarningShown = true;
1468
+ ctx?.ui?.notify(
1469
+ `⚠️ Hook skipped: workspace directory no longer exists (${currentCwd}). ` +
1470
+ `Use /cd to switch to the new location.`,
1471
+ "warning"
1472
+ );
1473
+ }
1474
+
1475
+ // Block only on deliberate policy decisions (decision: "block" or
1476
+ // exit code 2), never on infrastructure errors (missing cwd, spawn
1477
+ // failure). Infrastructure errors still produce ok: false so callers
1478
+ // know the hook didn't succeed, but they must not freeze the session.
1479
+ if (!result.ok && canBlock && !result.infrastructureError) {
1430
1480
  shouldBlock = true;
1431
1481
  blockReason = result.reason;
1432
1482
  break; // First blocking hook wins
@@ -160,7 +160,6 @@ describe("plan-mode strict readonly enforcement", () => {
160
160
  customType: "plan-mode",
161
161
  data: {
162
162
  enabled: true,
163
- executing: false,
164
163
  normalTools: [...BASELINE_TOOLS],
165
164
  todos: [],
166
165
  },
@@ -2,14 +2,11 @@ import { describe, expect, test } from "bun:test";
2
2
  import {
3
3
  cleanStepText,
4
4
  detectPlanIntent,
5
- extractDoneSteps,
6
5
  extractTodoItems,
7
6
  isPlanModeToolAllowed,
8
7
  isSafeCommand,
9
- markCompletedSteps,
10
8
  PLAN_MODE_ALLOWED_TOOLS,
11
9
  stripPlanIntent,
12
- type TodoItem,
13
10
  } from "../utils.js";
14
11
 
15
12
  describe("isPlanModeToolAllowed", () => {
@@ -205,60 +202,6 @@ Let me know if this works.`;
205
202
  });
206
203
  });
207
204
 
208
- describe("extractDoneSteps", () => {
209
- test("extracts single done marker", () => {
210
- expect(extractDoneSteps("I completed the task [DONE:1]")).toEqual([1]);
211
- });
212
-
213
- test("extracts multiple done markers", () => {
214
- expect(extractDoneSteps("[DONE:1] and [DONE:3] are complete")).toEqual([1, 3]);
215
- });
216
-
217
- test("is case-insensitive", () => {
218
- expect(extractDoneSteps("[done:2] finished")).toEqual([2]);
219
- expect(extractDoneSteps("[Done:5] finished")).toEqual([5]);
220
- });
221
-
222
- test("returns empty for no markers", () => {
223
- expect(extractDoneSteps("No completion markers here")).toEqual([]);
224
- });
225
- });
226
-
227
- describe("markCompletedSteps", () => {
228
- test("marks matching steps as completed", () => {
229
- const items: TodoItem[] = [
230
- { step: 1, text: "First", completed: false },
231
- { step: 2, text: "Second", completed: false },
232
- { step: 3, text: "Third", completed: false },
233
- ];
234
-
235
- const count = markCompletedSteps("[DONE:1] [DONE:3]", items);
236
- expect(count).toBe(2);
237
- expect(items[0].completed).toBe(true);
238
- expect(items[1].completed).toBe(false);
239
- expect(items[2].completed).toBe(true);
240
- });
241
-
242
- test("returns 0 when no markers match", () => {
243
- const items: TodoItem[] = [{ step: 1, text: "First", completed: false }];
244
- expect(markCompletedSteps("No markers", items)).toBe(0);
245
- expect(items[0].completed).toBe(false);
246
- });
247
-
248
- test("ignores markers for non-existent steps", () => {
249
- const items: TodoItem[] = [{ step: 1, text: "First", completed: false }];
250
- const count = markCompletedSteps("[DONE:99]", items);
251
- expect(count).toBe(1); // extractDoneSteps found 1 marker
252
- expect(items[0].completed).toBe(false); // but step 1 wasn't marked
253
- });
254
-
255
- test("does not un-complete already completed steps", () => {
256
- const items: TodoItem[] = [{ step: 1, text: "First", completed: true }];
257
- markCompletedSteps("No new markers", items);
258
- expect(items[0].completed).toBe(true);
259
- });
260
- });
261
-
262
205
  describe("detectPlanIntent", () => {
263
206
  // ── True positives ──────────────────────────────────────────────
264
207
  test("detects 'plan only'", () => {
@@ -6,16 +6,7 @@
6
6
  "capabilities": {
7
7
  "tools": ["plan_mode"],
8
8
  "commands": ["plan-mode", "todos"],
9
- "events": [
10
- "agent_end",
11
- "before_agent_start",
12
- "context",
13
- "input",
14
- "session_start",
15
- "tool_call",
16
- "tool_result",
17
- "turn_end"
18
- ]
9
+ "events": ["agent_end", "before_agent_start", "context", "input", "session_start", "tool_call"]
19
10
  },
20
11
  "permissionSurface": {
21
12
  "filesystem": "none",