claude-code-tools 1.0.10__py3-none-any.whl

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.

Potentially problematic release.


This version of claude-code-tools might be problematic. Click here for more details.

Files changed (1807) hide show
  1. claude_code_tools/__init__.py +3 -0
  2. claude_code_tools/action_rpc.py +403 -0
  3. claude_code_tools/aichat.py +1718 -0
  4. claude_code_tools/claude_continue.py +299 -0
  5. claude_code_tools/codex_continue.py +309 -0
  6. claude_code_tools/config.py +93 -0
  7. claude_code_tools/delete_session.py +194 -0
  8. claude_code_tools/dotenv_vault.py +268 -0
  9. claude_code_tools/env_safe.py +235 -0
  10. claude_code_tools/export_all.py +342 -0
  11. claude_code_tools/export_claude_session.py +481 -0
  12. claude_code_tools/export_codex_session.py +466 -0
  13. claude_code_tools/export_session.py +573 -0
  14. claude_code_tools/find_claude_session.py +1741 -0
  15. claude_code_tools/find_codex_session.py +1329 -0
  16. claude_code_tools/find_original_session.py +134 -0
  17. claude_code_tools/find_session.py +1086 -0
  18. claude_code_tools/find_trimmed_sessions.py +259 -0
  19. claude_code_tools/node_menu_ui.py +406 -0
  20. claude_code_tools/search_index.py +1247 -0
  21. claude_code_tools/session_lineage.py +260 -0
  22. claude_code_tools/session_menu.py +187 -0
  23. claude_code_tools/session_menu_cli.py +448 -0
  24. claude_code_tools/session_tui.py +516 -0
  25. claude_code_tools/session_utils.py +1313 -0
  26. claude_code_tools/smart_trim.py +424 -0
  27. claude_code_tools/smart_trim_core.py +616 -0
  28. claude_code_tools/tmux_cli_controller.py +928 -0
  29. claude_code_tools/tmux_remote_controller.py +229 -0
  30. claude_code_tools/trim_session.py +817 -0
  31. claude_code_tools/trim_session_claude.py +319 -0
  32. claude_code_tools/trim_session_codex.py +344 -0
  33. claude_code_tools-1.0.10.dist-info/METADATA +685 -0
  34. claude_code_tools-1.0.10.dist-info/RECORD +1807 -0
  35. claude_code_tools-1.0.10.dist-info/WHEEL +4 -0
  36. claude_code_tools-1.0.10.dist-info/entry_points.txt +5 -0
  37. claude_code_tools-1.0.10.dist-info/licenses/LICENSE +21 -0
  38. docs/cc-codex-instructions.md +37 -0
  39. docs/claude-code-chutes.md +138 -0
  40. docs/claude-code-tmux-tutorials.md +105 -0
  41. docs/dot-zshrc.md +307 -0
  42. docs/find-claude-session.md +149 -0
  43. docs/lmsh.md +70 -0
  44. docs/reddit-post.md +55 -0
  45. docs/tmux-cli-instructions.md +186 -0
  46. docs/vault-documentation.md +161 -0
  47. node_ui/action_config.js +72 -0
  48. node_ui/menu.js +2367 -0
  49. node_ui/node_modules/.bin/is-in-ci +5 -0
  50. node_ui/node_modules/.bin/loose-envify +16 -0
  51. node_ui/node_modules/.package-lock.json +714 -0
  52. node_ui/node_modules/@alcalzone/ansi-tokenize/README.md +248 -0
  53. node_ui/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.d.ts +11 -0
  54. node_ui/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.js +41 -0
  55. node_ui/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.js.map +1 -0
  56. node_ui/node_modules/@alcalzone/ansi-tokenize/build/diff.d.ts +6 -0
  57. node_ui/node_modules/@alcalzone/ansi-tokenize/build/diff.js +17 -0
  58. node_ui/node_modules/@alcalzone/ansi-tokenize/build/diff.js.map +1 -0
  59. node_ui/node_modules/@alcalzone/ansi-tokenize/build/index.d.ts +6 -0
  60. node_ui/node_modules/@alcalzone/ansi-tokenize/build/index.js +7 -0
  61. node_ui/node_modules/@alcalzone/ansi-tokenize/build/index.js.map +1 -0
  62. node_ui/node_modules/@alcalzone/ansi-tokenize/build/reduce.d.ts +5 -0
  63. node_ui/node_modules/@alcalzone/ansi-tokenize/build/reduce.js +27 -0
  64. node_ui/node_modules/@alcalzone/ansi-tokenize/build/reduce.js.map +1 -0
  65. node_ui/node_modules/@alcalzone/ansi-tokenize/build/styledChars.d.ts +6 -0
  66. node_ui/node_modules/@alcalzone/ansi-tokenize/build/styledChars.js +38 -0
  67. node_ui/node_modules/@alcalzone/ansi-tokenize/build/styledChars.js.map +1 -0
  68. node_ui/node_modules/@alcalzone/ansi-tokenize/build/tokenize.d.ts +12 -0
  69. node_ui/node_modules/@alcalzone/ansi-tokenize/build/tokenize.js +70 -0
  70. node_ui/node_modules/@alcalzone/ansi-tokenize/build/tokenize.js.map +1 -0
  71. node_ui/node_modules/@alcalzone/ansi-tokenize/build/undo.d.ts +3 -0
  72. node_ui/node_modules/@alcalzone/ansi-tokenize/build/undo.js +11 -0
  73. node_ui/node_modules/@alcalzone/ansi-tokenize/build/undo.js.map +1 -0
  74. node_ui/node_modules/@alcalzone/ansi-tokenize/package.json +63 -0
  75. node_ui/node_modules/ansi-escapes/base.d.ts +292 -0
  76. node_ui/node_modules/ansi-escapes/base.js +198 -0
  77. node_ui/node_modules/ansi-escapes/index.d.ts +2 -0
  78. node_ui/node_modules/ansi-escapes/index.js +2 -0
  79. node_ui/node_modules/ansi-escapes/license +9 -0
  80. node_ui/node_modules/ansi-escapes/package.json +70 -0
  81. node_ui/node_modules/ansi-escapes/readme.md +284 -0
  82. node_ui/node_modules/ansi-regex/index.d.ts +33 -0
  83. node_ui/node_modules/ansi-regex/index.js +14 -0
  84. node_ui/node_modules/ansi-regex/license +9 -0
  85. node_ui/node_modules/ansi-regex/package.json +61 -0
  86. node_ui/node_modules/ansi-regex/readme.md +66 -0
  87. node_ui/node_modules/ansi-styles/index.d.ts +236 -0
  88. node_ui/node_modules/ansi-styles/index.js +223 -0
  89. node_ui/node_modules/ansi-styles/license +9 -0
  90. node_ui/node_modules/ansi-styles/package.json +54 -0
  91. node_ui/node_modules/ansi-styles/readme.md +173 -0
  92. node_ui/node_modules/auto-bind/index.d.ts +50 -0
  93. node_ui/node_modules/auto-bind/index.js +41 -0
  94. node_ui/node_modules/auto-bind/license +9 -0
  95. node_ui/node_modules/auto-bind/package.json +51 -0
  96. node_ui/node_modules/auto-bind/react.d.ts +26 -0
  97. node_ui/node_modules/auto-bind/react.js +28 -0
  98. node_ui/node_modules/auto-bind/readme.md +92 -0
  99. node_ui/node_modules/chalk/license +9 -0
  100. node_ui/node_modules/chalk/package.json +83 -0
  101. node_ui/node_modules/chalk/readme.md +325 -0
  102. node_ui/node_modules/chalk/source/index.d.ts +320 -0
  103. node_ui/node_modules/chalk/source/index.js +225 -0
  104. node_ui/node_modules/chalk/source/utilities.js +33 -0
  105. node_ui/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
  106. node_ui/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
  107. node_ui/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
  108. node_ui/node_modules/chalk/source/vendor/supports-color/browser.js +30 -0
  109. node_ui/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
  110. node_ui/node_modules/chalk/source/vendor/supports-color/index.js +182 -0
  111. node_ui/node_modules/cli-boxes/boxes.json +82 -0
  112. node_ui/node_modules/cli-boxes/index.d.ts +127 -0
  113. node_ui/node_modules/cli-boxes/index.js +6 -0
  114. node_ui/node_modules/cli-boxes/license +9 -0
  115. node_ui/node_modules/cli-boxes/package.json +42 -0
  116. node_ui/node_modules/cli-boxes/readme.md +115 -0
  117. node_ui/node_modules/cli-cursor/index.d.ts +47 -0
  118. node_ui/node_modules/cli-cursor/index.js +39 -0
  119. node_ui/node_modules/cli-cursor/license +9 -0
  120. node_ui/node_modules/cli-cursor/package.json +49 -0
  121. node_ui/node_modules/cli-cursor/readme.md +51 -0
  122. node_ui/node_modules/cli-truncate/index.d.ts +116 -0
  123. node_ui/node_modules/cli-truncate/index.js +99 -0
  124. node_ui/node_modules/cli-truncate/license +9 -0
  125. node_ui/node_modules/cli-truncate/node_modules/slice-ansi/index.js +105 -0
  126. node_ui/node_modules/cli-truncate/node_modules/slice-ansi/license +10 -0
  127. node_ui/node_modules/cli-truncate/node_modules/slice-ansi/package.json +53 -0
  128. node_ui/node_modules/cli-truncate/node_modules/slice-ansi/readme.md +66 -0
  129. node_ui/node_modules/cli-truncate/package.json +51 -0
  130. node_ui/node_modules/cli-truncate/readme.md +150 -0
  131. node_ui/node_modules/code-excerpt/dist/index.d.ts +9 -0
  132. node_ui/node_modules/code-excerpt/dist/index.js +27 -0
  133. node_ui/node_modules/code-excerpt/license +21 -0
  134. node_ui/node_modules/code-excerpt/package.json +43 -0
  135. node_ui/node_modules/code-excerpt/readme.md +65 -0
  136. node_ui/node_modules/convert-to-spaces/dist/index.d.ts +2 -0
  137. node_ui/node_modules/convert-to-spaces/dist/index.js +4 -0
  138. node_ui/node_modules/convert-to-spaces/license +21 -0
  139. node_ui/node_modules/convert-to-spaces/package.json +40 -0
  140. node_ui/node_modules/convert-to-spaces/readme.md +39 -0
  141. node_ui/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
  142. node_ui/node_modules/emoji-regex/README.md +107 -0
  143. node_ui/node_modules/emoji-regex/index.d.ts +3 -0
  144. node_ui/node_modules/emoji-regex/index.js +4 -0
  145. node_ui/node_modules/emoji-regex/index.mjs +4 -0
  146. node_ui/node_modules/emoji-regex/package.json +45 -0
  147. node_ui/node_modules/environment/index.d.ts +74 -0
  148. node_ui/node_modules/environment/index.js +47 -0
  149. node_ui/node_modules/environment/license +9 -0
  150. node_ui/node_modules/environment/package.json +74 -0
  151. node_ui/node_modules/environment/readme.md +94 -0
  152. node_ui/node_modules/escape-string-regexp/index.d.ts +16 -0
  153. node_ui/node_modules/escape-string-regexp/index.js +11 -0
  154. node_ui/node_modules/escape-string-regexp/license +9 -0
  155. node_ui/node_modules/escape-string-regexp/package.json +40 -0
  156. node_ui/node_modules/escape-string-regexp/readme.md +34 -0
  157. node_ui/node_modules/figures/index.d.ts +269 -0
  158. node_ui/node_modules/figures/index.js +322 -0
  159. node_ui/node_modules/figures/license +9 -0
  160. node_ui/node_modules/figures/package.json +46 -0
  161. node_ui/node_modules/figures/readme.md +328 -0
  162. node_ui/node_modules/get-east-asian-width/index.d.ts +60 -0
  163. node_ui/node_modules/get-east-asian-width/index.js +30 -0
  164. node_ui/node_modules/get-east-asian-width/license +9 -0
  165. node_ui/node_modules/get-east-asian-width/lookup.js +403 -0
  166. node_ui/node_modules/get-east-asian-width/package.json +70 -0
  167. node_ui/node_modules/get-east-asian-width/readme.md +65 -0
  168. node_ui/node_modules/indent-string/index.d.ts +38 -0
  169. node_ui/node_modules/indent-string/index.js +38 -0
  170. node_ui/node_modules/indent-string/license +9 -0
  171. node_ui/node_modules/indent-string/package.json +40 -0
  172. node_ui/node_modules/indent-string/readme.md +73 -0
  173. node_ui/node_modules/ink/build/apply-styles.js +175 -0
  174. node_ui/node_modules/ink/build/build-layout.js +77 -0
  175. node_ui/node_modules/ink/build/calculate-wrapped-text.js +53 -0
  176. node_ui/node_modules/ink/build/colorize.d.ts +3 -0
  177. node_ui/node_modules/ink/build/colorize.js +48 -0
  178. node_ui/node_modules/ink/build/colorize.js.map +1 -0
  179. node_ui/node_modules/ink/build/components/App.d.ts +61 -0
  180. node_ui/node_modules/ink/build/components/App.js +286 -0
  181. node_ui/node_modules/ink/build/components/App.js.map +1 -0
  182. node_ui/node_modules/ink/build/components/AppContext.d.ts +12 -0
  183. node_ui/node_modules/ink/build/components/AppContext.js +11 -0
  184. node_ui/node_modules/ink/build/components/AppContext.js.map +1 -0
  185. node_ui/node_modules/ink/build/components/Box.d.ts +62 -0
  186. node_ui/node_modules/ink/build/components/Box.js +20 -0
  187. node_ui/node_modules/ink/build/components/Box.js.map +1 -0
  188. node_ui/node_modules/ink/build/components/Color.js +62 -0
  189. node_ui/node_modules/ink/build/components/ErrorOverview.d.ts +6 -0
  190. node_ui/node_modules/ink/build/components/ErrorOverview.js +79 -0
  191. node_ui/node_modules/ink/build/components/ErrorOverview.js.map +1 -0
  192. node_ui/node_modules/ink/build/components/FocusContext.d.ts +17 -0
  193. node_ui/node_modules/ink/build/components/FocusContext.js +17 -0
  194. node_ui/node_modules/ink/build/components/FocusContext.js.map +1 -0
  195. node_ui/node_modules/ink/build/components/Newline.d.ts +13 -0
  196. node_ui/node_modules/ink/build/components/Newline.js +8 -0
  197. node_ui/node_modules/ink/build/components/Newline.js.map +1 -0
  198. node_ui/node_modules/ink/build/components/Spacer.d.ts +6 -0
  199. node_ui/node_modules/ink/build/components/Spacer.js +10 -0
  200. node_ui/node_modules/ink/build/components/Spacer.js.map +1 -0
  201. node_ui/node_modules/ink/build/components/Static.d.ts +31 -0
  202. node_ui/node_modules/ink/build/components/Static.js +33 -0
  203. node_ui/node_modules/ink/build/components/Static.js.map +1 -0
  204. node_ui/node_modules/ink/build/components/StderrContext.d.ts +19 -0
  205. node_ui/node_modules/ink/build/components/StderrContext.js +13 -0
  206. node_ui/node_modules/ink/build/components/StderrContext.js.map +1 -0
  207. node_ui/node_modules/ink/build/components/StdinContext.d.ts +26 -0
  208. node_ui/node_modules/ink/build/components/StdinContext.js +19 -0
  209. node_ui/node_modules/ink/build/components/StdinContext.js.map +1 -0
  210. node_ui/node_modules/ink/build/components/StdoutContext.d.ts +19 -0
  211. node_ui/node_modules/ink/build/components/StdoutContext.js +13 -0
  212. node_ui/node_modules/ink/build/components/StdoutContext.js.map +1 -0
  213. node_ui/node_modules/ink/build/components/Text.d.ts +49 -0
  214. node_ui/node_modules/ink/build/components/Text.js +40 -0
  215. node_ui/node_modules/ink/build/components/Text.js.map +1 -0
  216. node_ui/node_modules/ink/build/components/Transform.d.ts +15 -0
  217. node_ui/node_modules/ink/build/components/Transform.js +14 -0
  218. node_ui/node_modules/ink/build/components/Transform.js.map +1 -0
  219. node_ui/node_modules/ink/build/devtools-window-polyfill.d.ts +1 -0
  220. node_ui/node_modules/ink/build/devtools-window-polyfill.js +64 -0
  221. node_ui/node_modules/ink/build/devtools-window-polyfill.js.map +1 -0
  222. node_ui/node_modules/ink/build/devtools.d.ts +1 -0
  223. node_ui/node_modules/ink/build/devtools.js +9 -0
  224. node_ui/node_modules/ink/build/devtools.js.map +1 -0
  225. node_ui/node_modules/ink/build/dom.d.ts +42 -0
  226. node_ui/node_modules/ink/build/dom.js +117 -0
  227. node_ui/node_modules/ink/build/dom.js.map +1 -0
  228. node_ui/node_modules/ink/build/experimental/apply-style.js +140 -0
  229. node_ui/node_modules/ink/build/experimental/dom.js +123 -0
  230. node_ui/node_modules/ink/build/experimental/output.js +91 -0
  231. node_ui/node_modules/ink/build/experimental/reconciler.js +141 -0
  232. node_ui/node_modules/ink/build/experimental/renderer.js +81 -0
  233. node_ui/node_modules/ink/build/get-max-width.d.ts +3 -0
  234. node_ui/node_modules/ink/build/get-max-width.js +10 -0
  235. node_ui/node_modules/ink/build/get-max-width.js.map +1 -0
  236. node_ui/node_modules/ink/build/hooks/use-app.d.ts +5 -0
  237. node_ui/node_modules/ink/build/hooks/use-app.js +8 -0
  238. node_ui/node_modules/ink/build/hooks/use-app.js.map +1 -0
  239. node_ui/node_modules/ink/build/hooks/use-focus-manager.d.ts +34 -0
  240. node_ui/node_modules/ink/build/hooks/use-focus-manager.js +18 -0
  241. node_ui/node_modules/ink/build/hooks/use-focus-manager.js.map +1 -0
  242. node_ui/node_modules/ink/build/hooks/use-focus.d.ts +34 -0
  243. node_ui/node_modules/ink/build/hooks/use-focus.js +47 -0
  244. node_ui/node_modules/ink/build/hooks/use-focus.js.map +1 -0
  245. node_ui/node_modules/ink/build/hooks/use-input.d.ts +97 -0
  246. node_ui/node_modules/ink/build/hooks/use-input.js +96 -0
  247. node_ui/node_modules/ink/build/hooks/use-input.js.map +1 -0
  248. node_ui/node_modules/ink/build/hooks/use-stderr.d.ts +5 -0
  249. node_ui/node_modules/ink/build/hooks/use-stderr.js +8 -0
  250. node_ui/node_modules/ink/build/hooks/use-stderr.js.map +1 -0
  251. node_ui/node_modules/ink/build/hooks/use-stdin.d.ts +5 -0
  252. node_ui/node_modules/ink/build/hooks/use-stdin.js +8 -0
  253. node_ui/node_modules/ink/build/hooks/use-stdin.js.map +1 -0
  254. node_ui/node_modules/ink/build/hooks/use-stdout.d.ts +5 -0
  255. node_ui/node_modules/ink/build/hooks/use-stdout.js +8 -0
  256. node_ui/node_modules/ink/build/hooks/use-stdout.js.map +1 -0
  257. node_ui/node_modules/ink/build/hooks/useInput.js +38 -0
  258. node_ui/node_modules/ink/build/index.d.ts +27 -0
  259. node_ui/node_modules/ink/build/index.js +16 -0
  260. node_ui/node_modules/ink/build/index.js.map +1 -0
  261. node_ui/node_modules/ink/build/ink.d.ts +38 -0
  262. node_ui/node_modules/ink/build/ink.js +235 -0
  263. node_ui/node_modules/ink/build/ink.js.map +1 -0
  264. node_ui/node_modules/ink/build/instance.js +205 -0
  265. node_ui/node_modules/ink/build/instances.d.ts +4 -0
  266. node_ui/node_modules/ink/build/instances.js +8 -0
  267. node_ui/node_modules/ink/build/instances.js.map +1 -0
  268. node_ui/node_modules/ink/build/log-update.d.ts +13 -0
  269. node_ui/node_modules/ink/build/log-update.js +37 -0
  270. node_ui/node_modules/ink/build/log-update.js.map +1 -0
  271. node_ui/node_modules/ink/build/measure-element.d.ts +16 -0
  272. node_ui/node_modules/ink/build/measure-element.js +9 -0
  273. node_ui/node_modules/ink/build/measure-element.js.map +1 -0
  274. node_ui/node_modules/ink/build/measure-text.d.ts +6 -0
  275. node_ui/node_modules/ink/build/measure-text.js +20 -0
  276. node_ui/node_modules/ink/build/measure-text.js.map +1 -0
  277. node_ui/node_modules/ink/build/output.d.ts +35 -0
  278. node_ui/node_modules/ink/build/output.js +148 -0
  279. node_ui/node_modules/ink/build/output.js.map +1 -0
  280. node_ui/node_modules/ink/build/parse-keypress.d.ts +15 -0
  281. node_ui/node_modules/ink/build/parse-keypress.js +225 -0
  282. node_ui/node_modules/ink/build/parse-keypress.js.map +1 -0
  283. node_ui/node_modules/ink/build/reconciler.d.ts +4 -0
  284. node_ui/node_modules/ink/build/reconciler.js +219 -0
  285. node_ui/node_modules/ink/build/reconciler.js.map +1 -0
  286. node_ui/node_modules/ink/build/render-border.d.ts +4 -0
  287. node_ui/node_modules/ink/build/render-border.js +73 -0
  288. node_ui/node_modules/ink/build/render-border.js.map +1 -0
  289. node_ui/node_modules/ink/build/render-node-to-output.d.ts +10 -0
  290. node_ui/node_modules/ink/build/render-node-to-output.js +99 -0
  291. node_ui/node_modules/ink/build/render-node-to-output.js.map +1 -0
  292. node_ui/node_modules/ink/build/render.d.ts +68 -0
  293. node_ui/node_modules/ink/build/render.js +48 -0
  294. node_ui/node_modules/ink/build/render.js.map +1 -0
  295. node_ui/node_modules/ink/build/renderer.d.ts +8 -0
  296. node_ui/node_modules/ink/build/renderer.js +36 -0
  297. node_ui/node_modules/ink/build/renderer.js.map +1 -0
  298. node_ui/node_modules/ink/build/squash-text-nodes.d.ts +3 -0
  299. node_ui/node_modules/ink/build/squash-text-nodes.js +35 -0
  300. node_ui/node_modules/ink/build/squash-text-nodes.js.map +1 -0
  301. node_ui/node_modules/ink/build/styles.d.ts +243 -0
  302. node_ui/node_modules/ink/build/styles.js +229 -0
  303. node_ui/node_modules/ink/build/styles.js.map +1 -0
  304. node_ui/node_modules/ink/build/wrap-text.d.ts +3 -0
  305. node_ui/node_modules/ink/build/wrap-text.js +31 -0
  306. node_ui/node_modules/ink/build/wrap-text.js.map +1 -0
  307. node_ui/node_modules/ink/license +9 -0
  308. node_ui/node_modules/ink/package.json +197 -0
  309. node_ui/node_modules/ink/readme.md +2153 -0
  310. node_ui/node_modules/ink-select-input/build/Indicator.d.ts +6 -0
  311. node_ui/node_modules/ink-select-input/build/Indicator.js +8 -0
  312. node_ui/node_modules/ink-select-input/build/Indicator.js.map +1 -0
  313. node_ui/node_modules/ink-select-input/build/Item.d.ts +7 -0
  314. node_ui/node_modules/ink-select-input/build/Item.js +7 -0
  315. node_ui/node_modules/ink-select-input/build/Item.js.map +1 -0
  316. node_ui/node_modules/ink-select-input/build/SelectInput.d.ts +49 -0
  317. node_ui/node_modules/ink-select-input/build/SelectInput.js +83 -0
  318. node_ui/node_modules/ink-select-input/build/SelectInput.js.map +1 -0
  319. node_ui/node_modules/ink-select-input/build/index.d.ts +3 -0
  320. node_ui/node_modules/ink-select-input/build/index.js +4 -0
  321. node_ui/node_modules/ink-select-input/build/index.js.map +1 -0
  322. node_ui/node_modules/ink-select-input/license +9 -0
  323. node_ui/node_modules/ink-select-input/node_modules/figures/index.d.ts +279 -0
  324. node_ui/node_modules/ink-select-input/node_modules/figures/index.js +292 -0
  325. node_ui/node_modules/ink-select-input/node_modules/figures/license +9 -0
  326. node_ui/node_modules/ink-select-input/node_modules/figures/package.json +49 -0
  327. node_ui/node_modules/ink-select-input/node_modules/figures/readme.md +337 -0
  328. node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/index.d.ts +12 -0
  329. node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/index.js +21 -0
  330. node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/license +9 -0
  331. node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/package.json +47 -0
  332. node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/readme.md +35 -0
  333. node_ui/node_modules/ink-select-input/package.json +83 -0
  334. node_ui/node_modules/ink-select-input/readme.md +98 -0
  335. node_ui/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
  336. node_ui/node_modules/is-fullwidth-code-point/index.js +40 -0
  337. node_ui/node_modules/is-fullwidth-code-point/license +9 -0
  338. node_ui/node_modules/is-fullwidth-code-point/package.json +45 -0
  339. node_ui/node_modules/is-fullwidth-code-point/readme.md +43 -0
  340. node_ui/node_modules/is-in-ci/cli.js +5 -0
  341. node_ui/node_modules/is-in-ci/index.d.ts +15 -0
  342. node_ui/node_modules/is-in-ci/index.js +11 -0
  343. node_ui/node_modules/is-in-ci/license +9 -0
  344. node_ui/node_modules/is-in-ci/package.json +48 -0
  345. node_ui/node_modules/is-in-ci/readme.md +43 -0
  346. node_ui/node_modules/is-unicode-supported/index.d.ts +12 -0
  347. node_ui/node_modules/is-unicode-supported/index.js +17 -0
  348. node_ui/node_modules/is-unicode-supported/license +9 -0
  349. node_ui/node_modules/is-unicode-supported/package.json +43 -0
  350. node_ui/node_modules/is-unicode-supported/readme.md +35 -0
  351. node_ui/node_modules/js-tokens/CHANGELOG.md +151 -0
  352. node_ui/node_modules/js-tokens/LICENSE +21 -0
  353. node_ui/node_modules/js-tokens/README.md +240 -0
  354. node_ui/node_modules/js-tokens/index.js +23 -0
  355. node_ui/node_modules/js-tokens/package.json +30 -0
  356. node_ui/node_modules/lodash/LICENSE +47 -0
  357. node_ui/node_modules/lodash/README.md +39 -0
  358. node_ui/node_modules/lodash/_DataView.js +7 -0
  359. node_ui/node_modules/lodash/_Hash.js +32 -0
  360. node_ui/node_modules/lodash/_LazyWrapper.js +28 -0
  361. node_ui/node_modules/lodash/_ListCache.js +32 -0
  362. node_ui/node_modules/lodash/_LodashWrapper.js +22 -0
  363. node_ui/node_modules/lodash/_Map.js +7 -0
  364. node_ui/node_modules/lodash/_MapCache.js +32 -0
  365. node_ui/node_modules/lodash/_Promise.js +7 -0
  366. node_ui/node_modules/lodash/_Set.js +7 -0
  367. node_ui/node_modules/lodash/_SetCache.js +27 -0
  368. node_ui/node_modules/lodash/_Stack.js +27 -0
  369. node_ui/node_modules/lodash/_Symbol.js +6 -0
  370. node_ui/node_modules/lodash/_Uint8Array.js +6 -0
  371. node_ui/node_modules/lodash/_WeakMap.js +7 -0
  372. node_ui/node_modules/lodash/_apply.js +21 -0
  373. node_ui/node_modules/lodash/_arrayAggregator.js +22 -0
  374. node_ui/node_modules/lodash/_arrayEach.js +22 -0
  375. node_ui/node_modules/lodash/_arrayEachRight.js +21 -0
  376. node_ui/node_modules/lodash/_arrayEvery.js +23 -0
  377. node_ui/node_modules/lodash/_arrayFilter.js +25 -0
  378. node_ui/node_modules/lodash/_arrayIncludes.js +17 -0
  379. node_ui/node_modules/lodash/_arrayIncludesWith.js +22 -0
  380. node_ui/node_modules/lodash/_arrayLikeKeys.js +49 -0
  381. node_ui/node_modules/lodash/_arrayMap.js +21 -0
  382. node_ui/node_modules/lodash/_arrayPush.js +20 -0
  383. node_ui/node_modules/lodash/_arrayReduce.js +26 -0
  384. node_ui/node_modules/lodash/_arrayReduceRight.js +24 -0
  385. node_ui/node_modules/lodash/_arraySample.js +15 -0
  386. node_ui/node_modules/lodash/_arraySampleSize.js +17 -0
  387. node_ui/node_modules/lodash/_arrayShuffle.js +15 -0
  388. node_ui/node_modules/lodash/_arraySome.js +23 -0
  389. node_ui/node_modules/lodash/_asciiSize.js +12 -0
  390. node_ui/node_modules/lodash/_asciiToArray.js +12 -0
  391. node_ui/node_modules/lodash/_asciiWords.js +15 -0
  392. node_ui/node_modules/lodash/_assignMergeValue.js +20 -0
  393. node_ui/node_modules/lodash/_assignValue.js +28 -0
  394. node_ui/node_modules/lodash/_assocIndexOf.js +21 -0
  395. node_ui/node_modules/lodash/_baseAggregator.js +21 -0
  396. node_ui/node_modules/lodash/_baseAssign.js +17 -0
  397. node_ui/node_modules/lodash/_baseAssignIn.js +17 -0
  398. node_ui/node_modules/lodash/_baseAssignValue.js +25 -0
  399. node_ui/node_modules/lodash/_baseAt.js +23 -0
  400. node_ui/node_modules/lodash/_baseClamp.js +22 -0
  401. node_ui/node_modules/lodash/_baseClone.js +166 -0
  402. node_ui/node_modules/lodash/_baseConforms.js +18 -0
  403. node_ui/node_modules/lodash/_baseConformsTo.js +27 -0
  404. node_ui/node_modules/lodash/_baseCreate.js +30 -0
  405. node_ui/node_modules/lodash/_baseDelay.js +21 -0
  406. node_ui/node_modules/lodash/_baseDifference.js +67 -0
  407. node_ui/node_modules/lodash/_baseEach.js +14 -0
  408. node_ui/node_modules/lodash/_baseEachRight.js +14 -0
  409. node_ui/node_modules/lodash/_baseEvery.js +21 -0
  410. node_ui/node_modules/lodash/_baseExtremum.js +32 -0
  411. node_ui/node_modules/lodash/_baseFill.js +32 -0
  412. node_ui/node_modules/lodash/_baseFilter.js +21 -0
  413. node_ui/node_modules/lodash/_baseFindIndex.js +24 -0
  414. node_ui/node_modules/lodash/_baseFindKey.js +23 -0
  415. node_ui/node_modules/lodash/_baseFlatten.js +38 -0
  416. node_ui/node_modules/lodash/_baseFor.js +16 -0
  417. node_ui/node_modules/lodash/_baseForOwn.js +16 -0
  418. node_ui/node_modules/lodash/_baseForOwnRight.js +16 -0
  419. node_ui/node_modules/lodash/_baseForRight.js +15 -0
  420. node_ui/node_modules/lodash/_baseFunctions.js +19 -0
  421. node_ui/node_modules/lodash/_baseGet.js +24 -0
  422. node_ui/node_modules/lodash/_baseGetAllKeys.js +20 -0
  423. node_ui/node_modules/lodash/_baseGetTag.js +28 -0
  424. node_ui/node_modules/lodash/_baseGt.js +14 -0
  425. node_ui/node_modules/lodash/_baseHas.js +19 -0
  426. node_ui/node_modules/lodash/_baseHasIn.js +13 -0
  427. node_ui/node_modules/lodash/_baseInRange.js +18 -0
  428. node_ui/node_modules/lodash/_baseIndexOf.js +20 -0
  429. node_ui/node_modules/lodash/_baseIndexOfWith.js +23 -0
  430. node_ui/node_modules/lodash/_baseIntersection.js +74 -0
  431. node_ui/node_modules/lodash/_baseInverter.js +21 -0
  432. node_ui/node_modules/lodash/_baseInvoke.js +24 -0
  433. node_ui/node_modules/lodash/_baseIsArguments.js +18 -0
  434. node_ui/node_modules/lodash/_baseIsArrayBuffer.js +17 -0
  435. node_ui/node_modules/lodash/_baseIsDate.js +18 -0
  436. node_ui/node_modules/lodash/_baseIsEqual.js +28 -0
  437. node_ui/node_modules/lodash/_baseIsEqualDeep.js +83 -0
  438. node_ui/node_modules/lodash/_baseIsMap.js +18 -0
  439. node_ui/node_modules/lodash/_baseIsMatch.js +62 -0
  440. node_ui/node_modules/lodash/_baseIsNaN.js +12 -0
  441. node_ui/node_modules/lodash/_baseIsNative.js +47 -0
  442. node_ui/node_modules/lodash/_baseIsRegExp.js +18 -0
  443. node_ui/node_modules/lodash/_baseIsSet.js +18 -0
  444. node_ui/node_modules/lodash/_baseIsTypedArray.js +60 -0
  445. node_ui/node_modules/lodash/_baseIteratee.js +31 -0
  446. node_ui/node_modules/lodash/_baseKeys.js +30 -0
  447. node_ui/node_modules/lodash/_baseKeysIn.js +33 -0
  448. node_ui/node_modules/lodash/_baseLodash.js +10 -0
  449. node_ui/node_modules/lodash/_baseLt.js +14 -0
  450. node_ui/node_modules/lodash/_baseMap.js +22 -0
  451. node_ui/node_modules/lodash/_baseMatches.js +22 -0
  452. node_ui/node_modules/lodash/_baseMatchesProperty.js +33 -0
  453. node_ui/node_modules/lodash/_baseMean.js +20 -0
  454. node_ui/node_modules/lodash/_baseMerge.js +42 -0
  455. node_ui/node_modules/lodash/_baseMergeDeep.js +94 -0
  456. node_ui/node_modules/lodash/_baseNth.js +20 -0
  457. node_ui/node_modules/lodash/_baseOrderBy.js +49 -0
  458. node_ui/node_modules/lodash/_basePick.js +19 -0
  459. node_ui/node_modules/lodash/_basePickBy.js +30 -0
  460. node_ui/node_modules/lodash/_baseProperty.js +14 -0
  461. node_ui/node_modules/lodash/_basePropertyDeep.js +16 -0
  462. node_ui/node_modules/lodash/_basePropertyOf.js +14 -0
  463. node_ui/node_modules/lodash/_basePullAll.js +51 -0
  464. node_ui/node_modules/lodash/_basePullAt.js +37 -0
  465. node_ui/node_modules/lodash/_baseRandom.js +18 -0
  466. node_ui/node_modules/lodash/_baseRange.js +28 -0
  467. node_ui/node_modules/lodash/_baseReduce.js +23 -0
  468. node_ui/node_modules/lodash/_baseRepeat.js +35 -0
  469. node_ui/node_modules/lodash/_baseRest.js +17 -0
  470. node_ui/node_modules/lodash/_baseSample.js +15 -0
  471. node_ui/node_modules/lodash/_baseSampleSize.js +18 -0
  472. node_ui/node_modules/lodash/_baseSet.js +51 -0
  473. node_ui/node_modules/lodash/_baseSetData.js +17 -0
  474. node_ui/node_modules/lodash/_baseSetToString.js +22 -0
  475. node_ui/node_modules/lodash/_baseShuffle.js +15 -0
  476. node_ui/node_modules/lodash/_baseSlice.js +31 -0
  477. node_ui/node_modules/lodash/_baseSome.js +22 -0
  478. node_ui/node_modules/lodash/_baseSortBy.js +21 -0
  479. node_ui/node_modules/lodash/_baseSortedIndex.js +42 -0
  480. node_ui/node_modules/lodash/_baseSortedIndexBy.js +67 -0
  481. node_ui/node_modules/lodash/_baseSortedUniq.js +30 -0
  482. node_ui/node_modules/lodash/_baseSum.js +24 -0
  483. node_ui/node_modules/lodash/_baseTimes.js +20 -0
  484. node_ui/node_modules/lodash/_baseToNumber.js +24 -0
  485. node_ui/node_modules/lodash/_baseToPairs.js +18 -0
  486. node_ui/node_modules/lodash/_baseToString.js +37 -0
  487. node_ui/node_modules/lodash/_baseTrim.js +19 -0
  488. node_ui/node_modules/lodash/_baseUnary.js +14 -0
  489. node_ui/node_modules/lodash/_baseUniq.js +72 -0
  490. node_ui/node_modules/lodash/_baseUnset.js +20 -0
  491. node_ui/node_modules/lodash/_baseUpdate.js +18 -0
  492. node_ui/node_modules/lodash/_baseValues.js +19 -0
  493. node_ui/node_modules/lodash/_baseWhile.js +26 -0
  494. node_ui/node_modules/lodash/_baseWrapperValue.js +25 -0
  495. node_ui/node_modules/lodash/_baseXor.js +36 -0
  496. node_ui/node_modules/lodash/_baseZipObject.js +23 -0
  497. node_ui/node_modules/lodash/_cacheHas.js +13 -0
  498. node_ui/node_modules/lodash/_castArrayLikeObject.js +14 -0
  499. node_ui/node_modules/lodash/_castFunction.js +14 -0
  500. node_ui/node_modules/lodash/_castPath.js +21 -0
  501. node_ui/node_modules/lodash/_castRest.js +14 -0
  502. node_ui/node_modules/lodash/_castSlice.js +18 -0
  503. node_ui/node_modules/lodash/_charsEndIndex.js +19 -0
  504. node_ui/node_modules/lodash/_charsStartIndex.js +20 -0
  505. node_ui/node_modules/lodash/_cloneArrayBuffer.js +16 -0
  506. node_ui/node_modules/lodash/_cloneBuffer.js +35 -0
  507. node_ui/node_modules/lodash/_cloneDataView.js +16 -0
  508. node_ui/node_modules/lodash/_cloneRegExp.js +17 -0
  509. node_ui/node_modules/lodash/_cloneSymbol.js +18 -0
  510. node_ui/node_modules/lodash/_cloneTypedArray.js +16 -0
  511. node_ui/node_modules/lodash/_compareAscending.js +41 -0
  512. node_ui/node_modules/lodash/_compareMultiple.js +44 -0
  513. node_ui/node_modules/lodash/_composeArgs.js +39 -0
  514. node_ui/node_modules/lodash/_composeArgsRight.js +41 -0
  515. node_ui/node_modules/lodash/_copyArray.js +20 -0
  516. node_ui/node_modules/lodash/_copyObject.js +40 -0
  517. node_ui/node_modules/lodash/_copySymbols.js +16 -0
  518. node_ui/node_modules/lodash/_copySymbolsIn.js +16 -0
  519. node_ui/node_modules/lodash/_coreJsData.js +6 -0
  520. node_ui/node_modules/lodash/_countHolders.js +21 -0
  521. node_ui/node_modules/lodash/_createAggregator.js +23 -0
  522. node_ui/node_modules/lodash/_createAssigner.js +37 -0
  523. node_ui/node_modules/lodash/_createBaseEach.js +32 -0
  524. node_ui/node_modules/lodash/_createBaseFor.js +25 -0
  525. node_ui/node_modules/lodash/_createBind.js +28 -0
  526. node_ui/node_modules/lodash/_createCaseFirst.js +33 -0
  527. node_ui/node_modules/lodash/_createCompounder.js +24 -0
  528. node_ui/node_modules/lodash/_createCtor.js +37 -0
  529. node_ui/node_modules/lodash/_createCurry.js +46 -0
  530. node_ui/node_modules/lodash/_createFind.js +25 -0
  531. node_ui/node_modules/lodash/_createFlow.js +78 -0
  532. node_ui/node_modules/lodash/_createHybrid.js +92 -0
  533. node_ui/node_modules/lodash/_createInverter.js +17 -0
  534. node_ui/node_modules/lodash/_createMathOperation.js +38 -0
  535. node_ui/node_modules/lodash/_createOver.js +27 -0
  536. node_ui/node_modules/lodash/_createPadding.js +33 -0
  537. node_ui/node_modules/lodash/_createPartial.js +43 -0
  538. node_ui/node_modules/lodash/_createRange.js +30 -0
  539. node_ui/node_modules/lodash/_createRecurry.js +56 -0
  540. node_ui/node_modules/lodash/_createRelationalOperation.js +20 -0
  541. node_ui/node_modules/lodash/_createRound.js +35 -0
  542. node_ui/node_modules/lodash/_createSet.js +19 -0
  543. node_ui/node_modules/lodash/_createToPairs.js +30 -0
  544. node_ui/node_modules/lodash/_createWrap.js +106 -0
  545. node_ui/node_modules/lodash/_customDefaultsAssignIn.js +29 -0
  546. node_ui/node_modules/lodash/_customDefaultsMerge.js +28 -0
  547. node_ui/node_modules/lodash/_customOmitClone.js +16 -0
  548. node_ui/node_modules/lodash/_deburrLetter.js +71 -0
  549. node_ui/node_modules/lodash/_defineProperty.js +11 -0
  550. node_ui/node_modules/lodash/_equalArrays.js +84 -0
  551. node_ui/node_modules/lodash/_equalByTag.js +112 -0
  552. node_ui/node_modules/lodash/_equalObjects.js +90 -0
  553. node_ui/node_modules/lodash/_escapeHtmlChar.js +21 -0
  554. node_ui/node_modules/lodash/_escapeStringChar.js +22 -0
  555. node_ui/node_modules/lodash/_flatRest.js +16 -0
  556. node_ui/node_modules/lodash/_freeGlobal.js +4 -0
  557. node_ui/node_modules/lodash/_getAllKeys.js +16 -0
  558. node_ui/node_modules/lodash/_getAllKeysIn.js +17 -0
  559. node_ui/node_modules/lodash/_getData.js +15 -0
  560. node_ui/node_modules/lodash/_getFuncName.js +31 -0
  561. node_ui/node_modules/lodash/_getHolder.js +13 -0
  562. node_ui/node_modules/lodash/_getMapData.js +18 -0
  563. node_ui/node_modules/lodash/_getMatchData.js +24 -0
  564. node_ui/node_modules/lodash/_getNative.js +17 -0
  565. node_ui/node_modules/lodash/_getPrototype.js +6 -0
  566. node_ui/node_modules/lodash/_getRawTag.js +46 -0
  567. node_ui/node_modules/lodash/_getSymbols.js +30 -0
  568. node_ui/node_modules/lodash/_getSymbolsIn.js +25 -0
  569. node_ui/node_modules/lodash/_getTag.js +58 -0
  570. node_ui/node_modules/lodash/_getValue.js +13 -0
  571. node_ui/node_modules/lodash/_getView.js +33 -0
  572. node_ui/node_modules/lodash/_getWrapDetails.js +17 -0
  573. node_ui/node_modules/lodash/_hasPath.js +39 -0
  574. node_ui/node_modules/lodash/_hasUnicode.js +26 -0
  575. node_ui/node_modules/lodash/_hasUnicodeWord.js +15 -0
  576. node_ui/node_modules/lodash/_hashClear.js +15 -0
  577. node_ui/node_modules/lodash/_hashDelete.js +17 -0
  578. node_ui/node_modules/lodash/_hashGet.js +30 -0
  579. node_ui/node_modules/lodash/_hashHas.js +23 -0
  580. node_ui/node_modules/lodash/_hashSet.js +23 -0
  581. node_ui/node_modules/lodash/_initCloneArray.js +26 -0
  582. node_ui/node_modules/lodash/_initCloneByTag.js +77 -0
  583. node_ui/node_modules/lodash/_initCloneObject.js +18 -0
  584. node_ui/node_modules/lodash/_insertWrapDetails.js +23 -0
  585. node_ui/node_modules/lodash/_isFlattenable.js +20 -0
  586. node_ui/node_modules/lodash/_isIndex.js +25 -0
  587. node_ui/node_modules/lodash/_isIterateeCall.js +30 -0
  588. node_ui/node_modules/lodash/_isKey.js +29 -0
  589. node_ui/node_modules/lodash/_isKeyable.js +15 -0
  590. node_ui/node_modules/lodash/_isLaziable.js +28 -0
  591. node_ui/node_modules/lodash/_isMaskable.js +14 -0
  592. node_ui/node_modules/lodash/_isMasked.js +20 -0
  593. node_ui/node_modules/lodash/_isPrototype.js +18 -0
  594. node_ui/node_modules/lodash/_isStrictComparable.js +15 -0
  595. node_ui/node_modules/lodash/_iteratorToArray.js +18 -0
  596. node_ui/node_modules/lodash/_lazyClone.js +23 -0
  597. node_ui/node_modules/lodash/_lazyReverse.js +23 -0
  598. node_ui/node_modules/lodash/_lazyValue.js +69 -0
  599. node_ui/node_modules/lodash/_listCacheClear.js +13 -0
  600. node_ui/node_modules/lodash/_listCacheDelete.js +35 -0
  601. node_ui/node_modules/lodash/_listCacheGet.js +19 -0
  602. node_ui/node_modules/lodash/_listCacheHas.js +16 -0
  603. node_ui/node_modules/lodash/_listCacheSet.js +26 -0
  604. node_ui/node_modules/lodash/_mapCacheClear.js +21 -0
  605. node_ui/node_modules/lodash/_mapCacheDelete.js +18 -0
  606. node_ui/node_modules/lodash/_mapCacheGet.js +16 -0
  607. node_ui/node_modules/lodash/_mapCacheHas.js +16 -0
  608. node_ui/node_modules/lodash/_mapCacheSet.js +22 -0
  609. node_ui/node_modules/lodash/_mapToArray.js +18 -0
  610. node_ui/node_modules/lodash/_matchesStrictComparable.js +20 -0
  611. node_ui/node_modules/lodash/_memoizeCapped.js +26 -0
  612. node_ui/node_modules/lodash/_mergeData.js +90 -0
  613. node_ui/node_modules/lodash/_metaMap.js +6 -0
  614. node_ui/node_modules/lodash/_nativeCreate.js +6 -0
  615. node_ui/node_modules/lodash/_nativeKeys.js +6 -0
  616. node_ui/node_modules/lodash/_nativeKeysIn.js +20 -0
  617. node_ui/node_modules/lodash/_nodeUtil.js +30 -0
  618. node_ui/node_modules/lodash/_objectToString.js +22 -0
  619. node_ui/node_modules/lodash/_overArg.js +15 -0
  620. node_ui/node_modules/lodash/_overRest.js +36 -0
  621. node_ui/node_modules/lodash/_parent.js +16 -0
  622. node_ui/node_modules/lodash/_reEscape.js +4 -0
  623. node_ui/node_modules/lodash/_reEvaluate.js +4 -0
  624. node_ui/node_modules/lodash/_reInterpolate.js +4 -0
  625. node_ui/node_modules/lodash/_realNames.js +4 -0
  626. node_ui/node_modules/lodash/_reorder.js +29 -0
  627. node_ui/node_modules/lodash/_replaceHolders.js +29 -0
  628. node_ui/node_modules/lodash/_root.js +9 -0
  629. node_ui/node_modules/lodash/_safeGet.js +21 -0
  630. node_ui/node_modules/lodash/_setCacheAdd.js +19 -0
  631. node_ui/node_modules/lodash/_setCacheHas.js +14 -0
  632. node_ui/node_modules/lodash/_setData.js +20 -0
  633. node_ui/node_modules/lodash/_setToArray.js +18 -0
  634. node_ui/node_modules/lodash/_setToPairs.js +18 -0
  635. node_ui/node_modules/lodash/_setToString.js +14 -0
  636. node_ui/node_modules/lodash/_setWrapToString.js +21 -0
  637. node_ui/node_modules/lodash/_shortOut.js +37 -0
  638. node_ui/node_modules/lodash/_shuffleSelf.js +28 -0
  639. node_ui/node_modules/lodash/_stackClear.js +15 -0
  640. node_ui/node_modules/lodash/_stackDelete.js +18 -0
  641. node_ui/node_modules/lodash/_stackGet.js +14 -0
  642. node_ui/node_modules/lodash/_stackHas.js +14 -0
  643. node_ui/node_modules/lodash/_stackSet.js +34 -0
  644. node_ui/node_modules/lodash/_strictIndexOf.js +23 -0
  645. node_ui/node_modules/lodash/_strictLastIndexOf.js +21 -0
  646. node_ui/node_modules/lodash/_stringSize.js +18 -0
  647. node_ui/node_modules/lodash/_stringToArray.js +18 -0
  648. node_ui/node_modules/lodash/_stringToPath.js +27 -0
  649. node_ui/node_modules/lodash/_toKey.js +21 -0
  650. node_ui/node_modules/lodash/_toSource.js +26 -0
  651. node_ui/node_modules/lodash/_trimmedEndIndex.js +19 -0
  652. node_ui/node_modules/lodash/_unescapeHtmlChar.js +21 -0
  653. node_ui/node_modules/lodash/_unicodeSize.js +44 -0
  654. node_ui/node_modules/lodash/_unicodeToArray.js +40 -0
  655. node_ui/node_modules/lodash/_unicodeWords.js +69 -0
  656. node_ui/node_modules/lodash/_updateWrapDetails.js +46 -0
  657. node_ui/node_modules/lodash/_wrapperClone.js +23 -0
  658. node_ui/node_modules/lodash/add.js +22 -0
  659. node_ui/node_modules/lodash/after.js +42 -0
  660. node_ui/node_modules/lodash/array.js +67 -0
  661. node_ui/node_modules/lodash/ary.js +29 -0
  662. node_ui/node_modules/lodash/assign.js +58 -0
  663. node_ui/node_modules/lodash/assignIn.js +40 -0
  664. node_ui/node_modules/lodash/assignInWith.js +38 -0
  665. node_ui/node_modules/lodash/assignWith.js +37 -0
  666. node_ui/node_modules/lodash/at.js +23 -0
  667. node_ui/node_modules/lodash/attempt.js +35 -0
  668. node_ui/node_modules/lodash/before.js +40 -0
  669. node_ui/node_modules/lodash/bind.js +57 -0
  670. node_ui/node_modules/lodash/bindAll.js +41 -0
  671. node_ui/node_modules/lodash/bindKey.js +68 -0
  672. node_ui/node_modules/lodash/camelCase.js +29 -0
  673. node_ui/node_modules/lodash/capitalize.js +23 -0
  674. node_ui/node_modules/lodash/castArray.js +44 -0
  675. node_ui/node_modules/lodash/ceil.js +26 -0
  676. node_ui/node_modules/lodash/chain.js +38 -0
  677. node_ui/node_modules/lodash/chunk.js +50 -0
  678. node_ui/node_modules/lodash/clamp.js +39 -0
  679. node_ui/node_modules/lodash/clone.js +36 -0
  680. node_ui/node_modules/lodash/cloneDeep.js +29 -0
  681. node_ui/node_modules/lodash/cloneDeepWith.js +40 -0
  682. node_ui/node_modules/lodash/cloneWith.js +42 -0
  683. node_ui/node_modules/lodash/collection.js +30 -0
  684. node_ui/node_modules/lodash/commit.js +33 -0
  685. node_ui/node_modules/lodash/compact.js +31 -0
  686. node_ui/node_modules/lodash/concat.js +43 -0
  687. node_ui/node_modules/lodash/cond.js +60 -0
  688. node_ui/node_modules/lodash/conforms.js +35 -0
  689. node_ui/node_modules/lodash/conformsTo.js +32 -0
  690. node_ui/node_modules/lodash/constant.js +26 -0
  691. node_ui/node_modules/lodash/core.js +3877 -0
  692. node_ui/node_modules/lodash/core.min.js +29 -0
  693. node_ui/node_modules/lodash/countBy.js +40 -0
  694. node_ui/node_modules/lodash/create.js +43 -0
  695. node_ui/node_modules/lodash/curry.js +57 -0
  696. node_ui/node_modules/lodash/curryRight.js +54 -0
  697. node_ui/node_modules/lodash/date.js +3 -0
  698. node_ui/node_modules/lodash/debounce.js +191 -0
  699. node_ui/node_modules/lodash/deburr.js +45 -0
  700. node_ui/node_modules/lodash/defaultTo.js +25 -0
  701. node_ui/node_modules/lodash/defaults.js +64 -0
  702. node_ui/node_modules/lodash/defaultsDeep.js +30 -0
  703. node_ui/node_modules/lodash/defer.js +26 -0
  704. node_ui/node_modules/lodash/delay.js +28 -0
  705. node_ui/node_modules/lodash/difference.js +33 -0
  706. node_ui/node_modules/lodash/differenceBy.js +44 -0
  707. node_ui/node_modules/lodash/differenceWith.js +40 -0
  708. node_ui/node_modules/lodash/divide.js +22 -0
  709. node_ui/node_modules/lodash/drop.js +38 -0
  710. node_ui/node_modules/lodash/dropRight.js +39 -0
  711. node_ui/node_modules/lodash/dropRightWhile.js +45 -0
  712. node_ui/node_modules/lodash/dropWhile.js +45 -0
  713. node_ui/node_modules/lodash/each.js +1 -0
  714. node_ui/node_modules/lodash/eachRight.js +1 -0
  715. node_ui/node_modules/lodash/endsWith.js +43 -0
  716. node_ui/node_modules/lodash/entries.js +1 -0
  717. node_ui/node_modules/lodash/entriesIn.js +1 -0
  718. node_ui/node_modules/lodash/eq.js +37 -0
  719. node_ui/node_modules/lodash/escape.js +43 -0
  720. node_ui/node_modules/lodash/escapeRegExp.js +32 -0
  721. node_ui/node_modules/lodash/every.js +56 -0
  722. node_ui/node_modules/lodash/extend.js +1 -0
  723. node_ui/node_modules/lodash/extendWith.js +1 -0
  724. node_ui/node_modules/lodash/fill.js +45 -0
  725. node_ui/node_modules/lodash/filter.js +52 -0
  726. node_ui/node_modules/lodash/find.js +42 -0
  727. node_ui/node_modules/lodash/findIndex.js +55 -0
  728. node_ui/node_modules/lodash/findKey.js +44 -0
  729. node_ui/node_modules/lodash/findLast.js +25 -0
  730. node_ui/node_modules/lodash/findLastIndex.js +59 -0
  731. node_ui/node_modules/lodash/findLastKey.js +44 -0
  732. node_ui/node_modules/lodash/first.js +1 -0
  733. node_ui/node_modules/lodash/flake.lock +40 -0
  734. node_ui/node_modules/lodash/flake.nix +20 -0
  735. node_ui/node_modules/lodash/flatMap.js +29 -0
  736. node_ui/node_modules/lodash/flatMapDeep.js +31 -0
  737. node_ui/node_modules/lodash/flatMapDepth.js +31 -0
  738. node_ui/node_modules/lodash/flatten.js +22 -0
  739. node_ui/node_modules/lodash/flattenDeep.js +25 -0
  740. node_ui/node_modules/lodash/flattenDepth.js +33 -0
  741. node_ui/node_modules/lodash/flip.js +28 -0
  742. node_ui/node_modules/lodash/floor.js +26 -0
  743. node_ui/node_modules/lodash/flow.js +27 -0
  744. node_ui/node_modules/lodash/flowRight.js +26 -0
  745. node_ui/node_modules/lodash/forEach.js +41 -0
  746. node_ui/node_modules/lodash/forEachRight.js +31 -0
  747. node_ui/node_modules/lodash/forIn.js +39 -0
  748. node_ui/node_modules/lodash/forInRight.js +37 -0
  749. node_ui/node_modules/lodash/forOwn.js +36 -0
  750. node_ui/node_modules/lodash/forOwnRight.js +34 -0
  751. node_ui/node_modules/lodash/fp/F.js +1 -0
  752. node_ui/node_modules/lodash/fp/T.js +1 -0
  753. node_ui/node_modules/lodash/fp/__.js +1 -0
  754. node_ui/node_modules/lodash/fp/_baseConvert.js +569 -0
  755. node_ui/node_modules/lodash/fp/_convertBrowser.js +18 -0
  756. node_ui/node_modules/lodash/fp/_falseOptions.js +7 -0
  757. node_ui/node_modules/lodash/fp/_mapping.js +358 -0
  758. node_ui/node_modules/lodash/fp/_util.js +16 -0
  759. node_ui/node_modules/lodash/fp/add.js +5 -0
  760. node_ui/node_modules/lodash/fp/after.js +5 -0
  761. node_ui/node_modules/lodash/fp/all.js +1 -0
  762. node_ui/node_modules/lodash/fp/allPass.js +1 -0
  763. node_ui/node_modules/lodash/fp/always.js +1 -0
  764. node_ui/node_modules/lodash/fp/any.js +1 -0
  765. node_ui/node_modules/lodash/fp/anyPass.js +1 -0
  766. node_ui/node_modules/lodash/fp/apply.js +1 -0
  767. node_ui/node_modules/lodash/fp/array.js +2 -0
  768. node_ui/node_modules/lodash/fp/ary.js +5 -0
  769. node_ui/node_modules/lodash/fp/assign.js +5 -0
  770. node_ui/node_modules/lodash/fp/assignAll.js +5 -0
  771. node_ui/node_modules/lodash/fp/assignAllWith.js +5 -0
  772. node_ui/node_modules/lodash/fp/assignIn.js +5 -0
  773. node_ui/node_modules/lodash/fp/assignInAll.js +5 -0
  774. node_ui/node_modules/lodash/fp/assignInAllWith.js +5 -0
  775. node_ui/node_modules/lodash/fp/assignInWith.js +5 -0
  776. node_ui/node_modules/lodash/fp/assignWith.js +5 -0
  777. node_ui/node_modules/lodash/fp/assoc.js +1 -0
  778. node_ui/node_modules/lodash/fp/assocPath.js +1 -0
  779. node_ui/node_modules/lodash/fp/at.js +5 -0
  780. node_ui/node_modules/lodash/fp/attempt.js +5 -0
  781. node_ui/node_modules/lodash/fp/before.js +5 -0
  782. node_ui/node_modules/lodash/fp/bind.js +5 -0
  783. node_ui/node_modules/lodash/fp/bindAll.js +5 -0
  784. node_ui/node_modules/lodash/fp/bindKey.js +5 -0
  785. node_ui/node_modules/lodash/fp/camelCase.js +5 -0
  786. node_ui/node_modules/lodash/fp/capitalize.js +5 -0
  787. node_ui/node_modules/lodash/fp/castArray.js +5 -0
  788. node_ui/node_modules/lodash/fp/ceil.js +5 -0
  789. node_ui/node_modules/lodash/fp/chain.js +5 -0
  790. node_ui/node_modules/lodash/fp/chunk.js +5 -0
  791. node_ui/node_modules/lodash/fp/clamp.js +5 -0
  792. node_ui/node_modules/lodash/fp/clone.js +5 -0
  793. node_ui/node_modules/lodash/fp/cloneDeep.js +5 -0
  794. node_ui/node_modules/lodash/fp/cloneDeepWith.js +5 -0
  795. node_ui/node_modules/lodash/fp/cloneWith.js +5 -0
  796. node_ui/node_modules/lodash/fp/collection.js +2 -0
  797. node_ui/node_modules/lodash/fp/commit.js +5 -0
  798. node_ui/node_modules/lodash/fp/compact.js +5 -0
  799. node_ui/node_modules/lodash/fp/complement.js +1 -0
  800. node_ui/node_modules/lodash/fp/compose.js +1 -0
  801. node_ui/node_modules/lodash/fp/concat.js +5 -0
  802. node_ui/node_modules/lodash/fp/cond.js +5 -0
  803. node_ui/node_modules/lodash/fp/conforms.js +1 -0
  804. node_ui/node_modules/lodash/fp/conformsTo.js +5 -0
  805. node_ui/node_modules/lodash/fp/constant.js +5 -0
  806. node_ui/node_modules/lodash/fp/contains.js +1 -0
  807. node_ui/node_modules/lodash/fp/convert.js +18 -0
  808. node_ui/node_modules/lodash/fp/countBy.js +5 -0
  809. node_ui/node_modules/lodash/fp/create.js +5 -0
  810. node_ui/node_modules/lodash/fp/curry.js +5 -0
  811. node_ui/node_modules/lodash/fp/curryN.js +5 -0
  812. node_ui/node_modules/lodash/fp/curryRight.js +5 -0
  813. node_ui/node_modules/lodash/fp/curryRightN.js +5 -0
  814. node_ui/node_modules/lodash/fp/date.js +2 -0
  815. node_ui/node_modules/lodash/fp/debounce.js +5 -0
  816. node_ui/node_modules/lodash/fp/deburr.js +5 -0
  817. node_ui/node_modules/lodash/fp/defaultTo.js +5 -0
  818. node_ui/node_modules/lodash/fp/defaults.js +5 -0
  819. node_ui/node_modules/lodash/fp/defaultsAll.js +5 -0
  820. node_ui/node_modules/lodash/fp/defaultsDeep.js +5 -0
  821. node_ui/node_modules/lodash/fp/defaultsDeepAll.js +5 -0
  822. node_ui/node_modules/lodash/fp/defer.js +5 -0
  823. node_ui/node_modules/lodash/fp/delay.js +5 -0
  824. node_ui/node_modules/lodash/fp/difference.js +5 -0
  825. node_ui/node_modules/lodash/fp/differenceBy.js +5 -0
  826. node_ui/node_modules/lodash/fp/differenceWith.js +5 -0
  827. node_ui/node_modules/lodash/fp/dissoc.js +1 -0
  828. node_ui/node_modules/lodash/fp/dissocPath.js +1 -0
  829. node_ui/node_modules/lodash/fp/divide.js +5 -0
  830. node_ui/node_modules/lodash/fp/drop.js +5 -0
  831. node_ui/node_modules/lodash/fp/dropLast.js +1 -0
  832. node_ui/node_modules/lodash/fp/dropLastWhile.js +1 -0
  833. node_ui/node_modules/lodash/fp/dropRight.js +5 -0
  834. node_ui/node_modules/lodash/fp/dropRightWhile.js +5 -0
  835. node_ui/node_modules/lodash/fp/dropWhile.js +5 -0
  836. node_ui/node_modules/lodash/fp/each.js +1 -0
  837. node_ui/node_modules/lodash/fp/eachRight.js +1 -0
  838. node_ui/node_modules/lodash/fp/endsWith.js +5 -0
  839. node_ui/node_modules/lodash/fp/entries.js +1 -0
  840. node_ui/node_modules/lodash/fp/entriesIn.js +1 -0
  841. node_ui/node_modules/lodash/fp/eq.js +5 -0
  842. node_ui/node_modules/lodash/fp/equals.js +1 -0
  843. node_ui/node_modules/lodash/fp/escape.js +5 -0
  844. node_ui/node_modules/lodash/fp/escapeRegExp.js +5 -0
  845. node_ui/node_modules/lodash/fp/every.js +5 -0
  846. node_ui/node_modules/lodash/fp/extend.js +1 -0
  847. node_ui/node_modules/lodash/fp/extendAll.js +1 -0
  848. node_ui/node_modules/lodash/fp/extendAllWith.js +1 -0
  849. node_ui/node_modules/lodash/fp/extendWith.js +1 -0
  850. node_ui/node_modules/lodash/fp/fill.js +5 -0
  851. node_ui/node_modules/lodash/fp/filter.js +5 -0
  852. node_ui/node_modules/lodash/fp/find.js +5 -0
  853. node_ui/node_modules/lodash/fp/findFrom.js +5 -0
  854. node_ui/node_modules/lodash/fp/findIndex.js +5 -0
  855. node_ui/node_modules/lodash/fp/findIndexFrom.js +5 -0
  856. node_ui/node_modules/lodash/fp/findKey.js +5 -0
  857. node_ui/node_modules/lodash/fp/findLast.js +5 -0
  858. node_ui/node_modules/lodash/fp/findLastFrom.js +5 -0
  859. node_ui/node_modules/lodash/fp/findLastIndex.js +5 -0
  860. node_ui/node_modules/lodash/fp/findLastIndexFrom.js +5 -0
  861. node_ui/node_modules/lodash/fp/findLastKey.js +5 -0
  862. node_ui/node_modules/lodash/fp/first.js +1 -0
  863. node_ui/node_modules/lodash/fp/flatMap.js +5 -0
  864. node_ui/node_modules/lodash/fp/flatMapDeep.js +5 -0
  865. node_ui/node_modules/lodash/fp/flatMapDepth.js +5 -0
  866. node_ui/node_modules/lodash/fp/flatten.js +5 -0
  867. node_ui/node_modules/lodash/fp/flattenDeep.js +5 -0
  868. node_ui/node_modules/lodash/fp/flattenDepth.js +5 -0
  869. node_ui/node_modules/lodash/fp/flip.js +5 -0
  870. node_ui/node_modules/lodash/fp/floor.js +5 -0
  871. node_ui/node_modules/lodash/fp/flow.js +5 -0
  872. node_ui/node_modules/lodash/fp/flowRight.js +5 -0
  873. node_ui/node_modules/lodash/fp/forEach.js +5 -0
  874. node_ui/node_modules/lodash/fp/forEachRight.js +5 -0
  875. node_ui/node_modules/lodash/fp/forIn.js +5 -0
  876. node_ui/node_modules/lodash/fp/forInRight.js +5 -0
  877. node_ui/node_modules/lodash/fp/forOwn.js +5 -0
  878. node_ui/node_modules/lodash/fp/forOwnRight.js +5 -0
  879. node_ui/node_modules/lodash/fp/fromPairs.js +5 -0
  880. node_ui/node_modules/lodash/fp/function.js +2 -0
  881. node_ui/node_modules/lodash/fp/functions.js +5 -0
  882. node_ui/node_modules/lodash/fp/functionsIn.js +5 -0
  883. node_ui/node_modules/lodash/fp/get.js +5 -0
  884. node_ui/node_modules/lodash/fp/getOr.js +5 -0
  885. node_ui/node_modules/lodash/fp/groupBy.js +5 -0
  886. node_ui/node_modules/lodash/fp/gt.js +5 -0
  887. node_ui/node_modules/lodash/fp/gte.js +5 -0
  888. node_ui/node_modules/lodash/fp/has.js +5 -0
  889. node_ui/node_modules/lodash/fp/hasIn.js +5 -0
  890. node_ui/node_modules/lodash/fp/head.js +5 -0
  891. node_ui/node_modules/lodash/fp/identical.js +1 -0
  892. node_ui/node_modules/lodash/fp/identity.js +5 -0
  893. node_ui/node_modules/lodash/fp/inRange.js +5 -0
  894. node_ui/node_modules/lodash/fp/includes.js +5 -0
  895. node_ui/node_modules/lodash/fp/includesFrom.js +5 -0
  896. node_ui/node_modules/lodash/fp/indexBy.js +1 -0
  897. node_ui/node_modules/lodash/fp/indexOf.js +5 -0
  898. node_ui/node_modules/lodash/fp/indexOfFrom.js +5 -0
  899. node_ui/node_modules/lodash/fp/init.js +1 -0
  900. node_ui/node_modules/lodash/fp/initial.js +5 -0
  901. node_ui/node_modules/lodash/fp/intersection.js +5 -0
  902. node_ui/node_modules/lodash/fp/intersectionBy.js +5 -0
  903. node_ui/node_modules/lodash/fp/intersectionWith.js +5 -0
  904. node_ui/node_modules/lodash/fp/invert.js +5 -0
  905. node_ui/node_modules/lodash/fp/invertBy.js +5 -0
  906. node_ui/node_modules/lodash/fp/invertObj.js +1 -0
  907. node_ui/node_modules/lodash/fp/invoke.js +5 -0
  908. node_ui/node_modules/lodash/fp/invokeArgs.js +5 -0
  909. node_ui/node_modules/lodash/fp/invokeArgsMap.js +5 -0
  910. node_ui/node_modules/lodash/fp/invokeMap.js +5 -0
  911. node_ui/node_modules/lodash/fp/isArguments.js +5 -0
  912. node_ui/node_modules/lodash/fp/isArray.js +5 -0
  913. node_ui/node_modules/lodash/fp/isArrayBuffer.js +5 -0
  914. node_ui/node_modules/lodash/fp/isArrayLike.js +5 -0
  915. node_ui/node_modules/lodash/fp/isArrayLikeObject.js +5 -0
  916. node_ui/node_modules/lodash/fp/isBoolean.js +5 -0
  917. node_ui/node_modules/lodash/fp/isBuffer.js +5 -0
  918. node_ui/node_modules/lodash/fp/isDate.js +5 -0
  919. node_ui/node_modules/lodash/fp/isElement.js +5 -0
  920. node_ui/node_modules/lodash/fp/isEmpty.js +5 -0
  921. node_ui/node_modules/lodash/fp/isEqual.js +5 -0
  922. node_ui/node_modules/lodash/fp/isEqualWith.js +5 -0
  923. node_ui/node_modules/lodash/fp/isError.js +5 -0
  924. node_ui/node_modules/lodash/fp/isFinite.js +5 -0
  925. node_ui/node_modules/lodash/fp/isFunction.js +5 -0
  926. node_ui/node_modules/lodash/fp/isInteger.js +5 -0
  927. node_ui/node_modules/lodash/fp/isLength.js +5 -0
  928. node_ui/node_modules/lodash/fp/isMap.js +5 -0
  929. node_ui/node_modules/lodash/fp/isMatch.js +5 -0
  930. node_ui/node_modules/lodash/fp/isMatchWith.js +5 -0
  931. node_ui/node_modules/lodash/fp/isNaN.js +5 -0
  932. node_ui/node_modules/lodash/fp/isNative.js +5 -0
  933. node_ui/node_modules/lodash/fp/isNil.js +5 -0
  934. node_ui/node_modules/lodash/fp/isNull.js +5 -0
  935. node_ui/node_modules/lodash/fp/isNumber.js +5 -0
  936. node_ui/node_modules/lodash/fp/isObject.js +5 -0
  937. node_ui/node_modules/lodash/fp/isObjectLike.js +5 -0
  938. node_ui/node_modules/lodash/fp/isPlainObject.js +5 -0
  939. node_ui/node_modules/lodash/fp/isRegExp.js +5 -0
  940. node_ui/node_modules/lodash/fp/isSafeInteger.js +5 -0
  941. node_ui/node_modules/lodash/fp/isSet.js +5 -0
  942. node_ui/node_modules/lodash/fp/isString.js +5 -0
  943. node_ui/node_modules/lodash/fp/isSymbol.js +5 -0
  944. node_ui/node_modules/lodash/fp/isTypedArray.js +5 -0
  945. node_ui/node_modules/lodash/fp/isUndefined.js +5 -0
  946. node_ui/node_modules/lodash/fp/isWeakMap.js +5 -0
  947. node_ui/node_modules/lodash/fp/isWeakSet.js +5 -0
  948. node_ui/node_modules/lodash/fp/iteratee.js +5 -0
  949. node_ui/node_modules/lodash/fp/join.js +5 -0
  950. node_ui/node_modules/lodash/fp/juxt.js +1 -0
  951. node_ui/node_modules/lodash/fp/kebabCase.js +5 -0
  952. node_ui/node_modules/lodash/fp/keyBy.js +5 -0
  953. node_ui/node_modules/lodash/fp/keys.js +5 -0
  954. node_ui/node_modules/lodash/fp/keysIn.js +5 -0
  955. node_ui/node_modules/lodash/fp/lang.js +2 -0
  956. node_ui/node_modules/lodash/fp/last.js +5 -0
  957. node_ui/node_modules/lodash/fp/lastIndexOf.js +5 -0
  958. node_ui/node_modules/lodash/fp/lastIndexOfFrom.js +5 -0
  959. node_ui/node_modules/lodash/fp/lowerCase.js +5 -0
  960. node_ui/node_modules/lodash/fp/lowerFirst.js +5 -0
  961. node_ui/node_modules/lodash/fp/lt.js +5 -0
  962. node_ui/node_modules/lodash/fp/lte.js +5 -0
  963. node_ui/node_modules/lodash/fp/map.js +5 -0
  964. node_ui/node_modules/lodash/fp/mapKeys.js +5 -0
  965. node_ui/node_modules/lodash/fp/mapValues.js +5 -0
  966. node_ui/node_modules/lodash/fp/matches.js +1 -0
  967. node_ui/node_modules/lodash/fp/matchesProperty.js +5 -0
  968. node_ui/node_modules/lodash/fp/math.js +2 -0
  969. node_ui/node_modules/lodash/fp/max.js +5 -0
  970. node_ui/node_modules/lodash/fp/maxBy.js +5 -0
  971. node_ui/node_modules/lodash/fp/mean.js +5 -0
  972. node_ui/node_modules/lodash/fp/meanBy.js +5 -0
  973. node_ui/node_modules/lodash/fp/memoize.js +5 -0
  974. node_ui/node_modules/lodash/fp/merge.js +5 -0
  975. node_ui/node_modules/lodash/fp/mergeAll.js +5 -0
  976. node_ui/node_modules/lodash/fp/mergeAllWith.js +5 -0
  977. node_ui/node_modules/lodash/fp/mergeWith.js +5 -0
  978. node_ui/node_modules/lodash/fp/method.js +5 -0
  979. node_ui/node_modules/lodash/fp/methodOf.js +5 -0
  980. node_ui/node_modules/lodash/fp/min.js +5 -0
  981. node_ui/node_modules/lodash/fp/minBy.js +5 -0
  982. node_ui/node_modules/lodash/fp/mixin.js +5 -0
  983. node_ui/node_modules/lodash/fp/multiply.js +5 -0
  984. node_ui/node_modules/lodash/fp/nAry.js +1 -0
  985. node_ui/node_modules/lodash/fp/negate.js +5 -0
  986. node_ui/node_modules/lodash/fp/next.js +5 -0
  987. node_ui/node_modules/lodash/fp/noop.js +5 -0
  988. node_ui/node_modules/lodash/fp/now.js +5 -0
  989. node_ui/node_modules/lodash/fp/nth.js +5 -0
  990. node_ui/node_modules/lodash/fp/nthArg.js +5 -0
  991. node_ui/node_modules/lodash/fp/number.js +2 -0
  992. node_ui/node_modules/lodash/fp/object.js +2 -0
  993. node_ui/node_modules/lodash/fp/omit.js +5 -0
  994. node_ui/node_modules/lodash/fp/omitAll.js +1 -0
  995. node_ui/node_modules/lodash/fp/omitBy.js +5 -0
  996. node_ui/node_modules/lodash/fp/once.js +5 -0
  997. node_ui/node_modules/lodash/fp/orderBy.js +5 -0
  998. node_ui/node_modules/lodash/fp/over.js +5 -0
  999. node_ui/node_modules/lodash/fp/overArgs.js +5 -0
  1000. node_ui/node_modules/lodash/fp/overEvery.js +5 -0
  1001. node_ui/node_modules/lodash/fp/overSome.js +5 -0
  1002. node_ui/node_modules/lodash/fp/pad.js +5 -0
  1003. node_ui/node_modules/lodash/fp/padChars.js +5 -0
  1004. node_ui/node_modules/lodash/fp/padCharsEnd.js +5 -0
  1005. node_ui/node_modules/lodash/fp/padCharsStart.js +5 -0
  1006. node_ui/node_modules/lodash/fp/padEnd.js +5 -0
  1007. node_ui/node_modules/lodash/fp/padStart.js +5 -0
  1008. node_ui/node_modules/lodash/fp/parseInt.js +5 -0
  1009. node_ui/node_modules/lodash/fp/partial.js +5 -0
  1010. node_ui/node_modules/lodash/fp/partialRight.js +5 -0
  1011. node_ui/node_modules/lodash/fp/partition.js +5 -0
  1012. node_ui/node_modules/lodash/fp/path.js +1 -0
  1013. node_ui/node_modules/lodash/fp/pathEq.js +1 -0
  1014. node_ui/node_modules/lodash/fp/pathOr.js +1 -0
  1015. node_ui/node_modules/lodash/fp/paths.js +1 -0
  1016. node_ui/node_modules/lodash/fp/pick.js +5 -0
  1017. node_ui/node_modules/lodash/fp/pickAll.js +1 -0
  1018. node_ui/node_modules/lodash/fp/pickBy.js +5 -0
  1019. node_ui/node_modules/lodash/fp/pipe.js +1 -0
  1020. node_ui/node_modules/lodash/fp/placeholder.js +6 -0
  1021. node_ui/node_modules/lodash/fp/plant.js +5 -0
  1022. node_ui/node_modules/lodash/fp/pluck.js +1 -0
  1023. node_ui/node_modules/lodash/fp/prop.js +1 -0
  1024. node_ui/node_modules/lodash/fp/propEq.js +1 -0
  1025. node_ui/node_modules/lodash/fp/propOr.js +1 -0
  1026. node_ui/node_modules/lodash/fp/property.js +1 -0
  1027. node_ui/node_modules/lodash/fp/propertyOf.js +5 -0
  1028. node_ui/node_modules/lodash/fp/props.js +1 -0
  1029. node_ui/node_modules/lodash/fp/pull.js +5 -0
  1030. node_ui/node_modules/lodash/fp/pullAll.js +5 -0
  1031. node_ui/node_modules/lodash/fp/pullAllBy.js +5 -0
  1032. node_ui/node_modules/lodash/fp/pullAllWith.js +5 -0
  1033. node_ui/node_modules/lodash/fp/pullAt.js +5 -0
  1034. node_ui/node_modules/lodash/fp/random.js +5 -0
  1035. node_ui/node_modules/lodash/fp/range.js +5 -0
  1036. node_ui/node_modules/lodash/fp/rangeRight.js +5 -0
  1037. node_ui/node_modules/lodash/fp/rangeStep.js +5 -0
  1038. node_ui/node_modules/lodash/fp/rangeStepRight.js +5 -0
  1039. node_ui/node_modules/lodash/fp/rearg.js +5 -0
  1040. node_ui/node_modules/lodash/fp/reduce.js +5 -0
  1041. node_ui/node_modules/lodash/fp/reduceRight.js +5 -0
  1042. node_ui/node_modules/lodash/fp/reject.js +5 -0
  1043. node_ui/node_modules/lodash/fp/remove.js +5 -0
  1044. node_ui/node_modules/lodash/fp/repeat.js +5 -0
  1045. node_ui/node_modules/lodash/fp/replace.js +5 -0
  1046. node_ui/node_modules/lodash/fp/rest.js +5 -0
  1047. node_ui/node_modules/lodash/fp/restFrom.js +5 -0
  1048. node_ui/node_modules/lodash/fp/result.js +5 -0
  1049. node_ui/node_modules/lodash/fp/reverse.js +5 -0
  1050. node_ui/node_modules/lodash/fp/round.js +5 -0
  1051. node_ui/node_modules/lodash/fp/sample.js +5 -0
  1052. node_ui/node_modules/lodash/fp/sampleSize.js +5 -0
  1053. node_ui/node_modules/lodash/fp/seq.js +2 -0
  1054. node_ui/node_modules/lodash/fp/set.js +5 -0
  1055. node_ui/node_modules/lodash/fp/setWith.js +5 -0
  1056. node_ui/node_modules/lodash/fp/shuffle.js +5 -0
  1057. node_ui/node_modules/lodash/fp/size.js +5 -0
  1058. node_ui/node_modules/lodash/fp/slice.js +5 -0
  1059. node_ui/node_modules/lodash/fp/snakeCase.js +5 -0
  1060. node_ui/node_modules/lodash/fp/some.js +5 -0
  1061. node_ui/node_modules/lodash/fp/sortBy.js +5 -0
  1062. node_ui/node_modules/lodash/fp/sortedIndex.js +5 -0
  1063. node_ui/node_modules/lodash/fp/sortedIndexBy.js +5 -0
  1064. node_ui/node_modules/lodash/fp/sortedIndexOf.js +5 -0
  1065. node_ui/node_modules/lodash/fp/sortedLastIndex.js +5 -0
  1066. node_ui/node_modules/lodash/fp/sortedLastIndexBy.js +5 -0
  1067. node_ui/node_modules/lodash/fp/sortedLastIndexOf.js +5 -0
  1068. node_ui/node_modules/lodash/fp/sortedUniq.js +5 -0
  1069. node_ui/node_modules/lodash/fp/sortedUniqBy.js +5 -0
  1070. node_ui/node_modules/lodash/fp/split.js +5 -0
  1071. node_ui/node_modules/lodash/fp/spread.js +5 -0
  1072. node_ui/node_modules/lodash/fp/spreadFrom.js +5 -0
  1073. node_ui/node_modules/lodash/fp/startCase.js +5 -0
  1074. node_ui/node_modules/lodash/fp/startsWith.js +5 -0
  1075. node_ui/node_modules/lodash/fp/string.js +2 -0
  1076. node_ui/node_modules/lodash/fp/stubArray.js +5 -0
  1077. node_ui/node_modules/lodash/fp/stubFalse.js +5 -0
  1078. node_ui/node_modules/lodash/fp/stubObject.js +5 -0
  1079. node_ui/node_modules/lodash/fp/stubString.js +5 -0
  1080. node_ui/node_modules/lodash/fp/stubTrue.js +5 -0
  1081. node_ui/node_modules/lodash/fp/subtract.js +5 -0
  1082. node_ui/node_modules/lodash/fp/sum.js +5 -0
  1083. node_ui/node_modules/lodash/fp/sumBy.js +5 -0
  1084. node_ui/node_modules/lodash/fp/symmetricDifference.js +1 -0
  1085. node_ui/node_modules/lodash/fp/symmetricDifferenceBy.js +1 -0
  1086. node_ui/node_modules/lodash/fp/symmetricDifferenceWith.js +1 -0
  1087. node_ui/node_modules/lodash/fp/tail.js +5 -0
  1088. node_ui/node_modules/lodash/fp/take.js +5 -0
  1089. node_ui/node_modules/lodash/fp/takeLast.js +1 -0
  1090. node_ui/node_modules/lodash/fp/takeLastWhile.js +1 -0
  1091. node_ui/node_modules/lodash/fp/takeRight.js +5 -0
  1092. node_ui/node_modules/lodash/fp/takeRightWhile.js +5 -0
  1093. node_ui/node_modules/lodash/fp/takeWhile.js +5 -0
  1094. node_ui/node_modules/lodash/fp/tap.js +5 -0
  1095. node_ui/node_modules/lodash/fp/template.js +5 -0
  1096. node_ui/node_modules/lodash/fp/templateSettings.js +5 -0
  1097. node_ui/node_modules/lodash/fp/throttle.js +5 -0
  1098. node_ui/node_modules/lodash/fp/thru.js +5 -0
  1099. node_ui/node_modules/lodash/fp/times.js +5 -0
  1100. node_ui/node_modules/lodash/fp/toArray.js +5 -0
  1101. node_ui/node_modules/lodash/fp/toFinite.js +5 -0
  1102. node_ui/node_modules/lodash/fp/toInteger.js +5 -0
  1103. node_ui/node_modules/lodash/fp/toIterator.js +5 -0
  1104. node_ui/node_modules/lodash/fp/toJSON.js +5 -0
  1105. node_ui/node_modules/lodash/fp/toLength.js +5 -0
  1106. node_ui/node_modules/lodash/fp/toLower.js +5 -0
  1107. node_ui/node_modules/lodash/fp/toNumber.js +5 -0
  1108. node_ui/node_modules/lodash/fp/toPairs.js +5 -0
  1109. node_ui/node_modules/lodash/fp/toPairsIn.js +5 -0
  1110. node_ui/node_modules/lodash/fp/toPath.js +5 -0
  1111. node_ui/node_modules/lodash/fp/toPlainObject.js +5 -0
  1112. node_ui/node_modules/lodash/fp/toSafeInteger.js +5 -0
  1113. node_ui/node_modules/lodash/fp/toString.js +5 -0
  1114. node_ui/node_modules/lodash/fp/toUpper.js +5 -0
  1115. node_ui/node_modules/lodash/fp/transform.js +5 -0
  1116. node_ui/node_modules/lodash/fp/trim.js +5 -0
  1117. node_ui/node_modules/lodash/fp/trimChars.js +5 -0
  1118. node_ui/node_modules/lodash/fp/trimCharsEnd.js +5 -0
  1119. node_ui/node_modules/lodash/fp/trimCharsStart.js +5 -0
  1120. node_ui/node_modules/lodash/fp/trimEnd.js +5 -0
  1121. node_ui/node_modules/lodash/fp/trimStart.js +5 -0
  1122. node_ui/node_modules/lodash/fp/truncate.js +5 -0
  1123. node_ui/node_modules/lodash/fp/unapply.js +1 -0
  1124. node_ui/node_modules/lodash/fp/unary.js +5 -0
  1125. node_ui/node_modules/lodash/fp/unescape.js +5 -0
  1126. node_ui/node_modules/lodash/fp/union.js +5 -0
  1127. node_ui/node_modules/lodash/fp/unionBy.js +5 -0
  1128. node_ui/node_modules/lodash/fp/unionWith.js +5 -0
  1129. node_ui/node_modules/lodash/fp/uniq.js +5 -0
  1130. node_ui/node_modules/lodash/fp/uniqBy.js +5 -0
  1131. node_ui/node_modules/lodash/fp/uniqWith.js +5 -0
  1132. node_ui/node_modules/lodash/fp/uniqueId.js +5 -0
  1133. node_ui/node_modules/lodash/fp/unnest.js +1 -0
  1134. node_ui/node_modules/lodash/fp/unset.js +5 -0
  1135. node_ui/node_modules/lodash/fp/unzip.js +5 -0
  1136. node_ui/node_modules/lodash/fp/unzipWith.js +5 -0
  1137. node_ui/node_modules/lodash/fp/update.js +5 -0
  1138. node_ui/node_modules/lodash/fp/updateWith.js +5 -0
  1139. node_ui/node_modules/lodash/fp/upperCase.js +5 -0
  1140. node_ui/node_modules/lodash/fp/upperFirst.js +5 -0
  1141. node_ui/node_modules/lodash/fp/useWith.js +1 -0
  1142. node_ui/node_modules/lodash/fp/util.js +2 -0
  1143. node_ui/node_modules/lodash/fp/value.js +5 -0
  1144. node_ui/node_modules/lodash/fp/valueOf.js +5 -0
  1145. node_ui/node_modules/lodash/fp/values.js +5 -0
  1146. node_ui/node_modules/lodash/fp/valuesIn.js +5 -0
  1147. node_ui/node_modules/lodash/fp/where.js +1 -0
  1148. node_ui/node_modules/lodash/fp/whereEq.js +1 -0
  1149. node_ui/node_modules/lodash/fp/without.js +5 -0
  1150. node_ui/node_modules/lodash/fp/words.js +5 -0
  1151. node_ui/node_modules/lodash/fp/wrap.js +5 -0
  1152. node_ui/node_modules/lodash/fp/wrapperAt.js +5 -0
  1153. node_ui/node_modules/lodash/fp/wrapperChain.js +5 -0
  1154. node_ui/node_modules/lodash/fp/wrapperLodash.js +5 -0
  1155. node_ui/node_modules/lodash/fp/wrapperReverse.js +5 -0
  1156. node_ui/node_modules/lodash/fp/wrapperValue.js +5 -0
  1157. node_ui/node_modules/lodash/fp/xor.js +5 -0
  1158. node_ui/node_modules/lodash/fp/xorBy.js +5 -0
  1159. node_ui/node_modules/lodash/fp/xorWith.js +5 -0
  1160. node_ui/node_modules/lodash/fp/zip.js +5 -0
  1161. node_ui/node_modules/lodash/fp/zipAll.js +5 -0
  1162. node_ui/node_modules/lodash/fp/zipObj.js +1 -0
  1163. node_ui/node_modules/lodash/fp/zipObject.js +5 -0
  1164. node_ui/node_modules/lodash/fp/zipObjectDeep.js +5 -0
  1165. node_ui/node_modules/lodash/fp/zipWith.js +5 -0
  1166. node_ui/node_modules/lodash/fp.js +2 -0
  1167. node_ui/node_modules/lodash/fromPairs.js +28 -0
  1168. node_ui/node_modules/lodash/function.js +25 -0
  1169. node_ui/node_modules/lodash/functions.js +31 -0
  1170. node_ui/node_modules/lodash/functionsIn.js +31 -0
  1171. node_ui/node_modules/lodash/get.js +33 -0
  1172. node_ui/node_modules/lodash/groupBy.js +41 -0
  1173. node_ui/node_modules/lodash/gt.js +29 -0
  1174. node_ui/node_modules/lodash/gte.js +30 -0
  1175. node_ui/node_modules/lodash/has.js +35 -0
  1176. node_ui/node_modules/lodash/hasIn.js +34 -0
  1177. node_ui/node_modules/lodash/head.js +23 -0
  1178. node_ui/node_modules/lodash/identity.js +21 -0
  1179. node_ui/node_modules/lodash/inRange.js +55 -0
  1180. node_ui/node_modules/lodash/includes.js +53 -0
  1181. node_ui/node_modules/lodash/index.js +1 -0
  1182. node_ui/node_modules/lodash/indexOf.js +42 -0
  1183. node_ui/node_modules/lodash/initial.js +22 -0
  1184. node_ui/node_modules/lodash/intersection.js +30 -0
  1185. node_ui/node_modules/lodash/intersectionBy.js +45 -0
  1186. node_ui/node_modules/lodash/intersectionWith.js +41 -0
  1187. node_ui/node_modules/lodash/invert.js +42 -0
  1188. node_ui/node_modules/lodash/invertBy.js +56 -0
  1189. node_ui/node_modules/lodash/invoke.js +24 -0
  1190. node_ui/node_modules/lodash/invokeMap.js +41 -0
  1191. node_ui/node_modules/lodash/isArguments.js +36 -0
  1192. node_ui/node_modules/lodash/isArray.js +26 -0
  1193. node_ui/node_modules/lodash/isArrayBuffer.js +27 -0
  1194. node_ui/node_modules/lodash/isArrayLike.js +33 -0
  1195. node_ui/node_modules/lodash/isArrayLikeObject.js +33 -0
  1196. node_ui/node_modules/lodash/isBoolean.js +29 -0
  1197. node_ui/node_modules/lodash/isBuffer.js +38 -0
  1198. node_ui/node_modules/lodash/isDate.js +27 -0
  1199. node_ui/node_modules/lodash/isElement.js +25 -0
  1200. node_ui/node_modules/lodash/isEmpty.js +77 -0
  1201. node_ui/node_modules/lodash/isEqual.js +35 -0
  1202. node_ui/node_modules/lodash/isEqualWith.js +41 -0
  1203. node_ui/node_modules/lodash/isError.js +36 -0
  1204. node_ui/node_modules/lodash/isFinite.js +36 -0
  1205. node_ui/node_modules/lodash/isFunction.js +37 -0
  1206. node_ui/node_modules/lodash/isInteger.js +33 -0
  1207. node_ui/node_modules/lodash/isLength.js +35 -0
  1208. node_ui/node_modules/lodash/isMap.js +27 -0
  1209. node_ui/node_modules/lodash/isMatch.js +36 -0
  1210. node_ui/node_modules/lodash/isMatchWith.js +41 -0
  1211. node_ui/node_modules/lodash/isNaN.js +38 -0
  1212. node_ui/node_modules/lodash/isNative.js +40 -0
  1213. node_ui/node_modules/lodash/isNil.js +25 -0
  1214. node_ui/node_modules/lodash/isNull.js +22 -0
  1215. node_ui/node_modules/lodash/isNumber.js +38 -0
  1216. node_ui/node_modules/lodash/isObject.js +31 -0
  1217. node_ui/node_modules/lodash/isObjectLike.js +29 -0
  1218. node_ui/node_modules/lodash/isPlainObject.js +62 -0
  1219. node_ui/node_modules/lodash/isRegExp.js +27 -0
  1220. node_ui/node_modules/lodash/isSafeInteger.js +37 -0
  1221. node_ui/node_modules/lodash/isSet.js +27 -0
  1222. node_ui/node_modules/lodash/isString.js +30 -0
  1223. node_ui/node_modules/lodash/isSymbol.js +29 -0
  1224. node_ui/node_modules/lodash/isTypedArray.js +27 -0
  1225. node_ui/node_modules/lodash/isUndefined.js +22 -0
  1226. node_ui/node_modules/lodash/isWeakMap.js +28 -0
  1227. node_ui/node_modules/lodash/isWeakSet.js +28 -0
  1228. node_ui/node_modules/lodash/iteratee.js +53 -0
  1229. node_ui/node_modules/lodash/join.js +26 -0
  1230. node_ui/node_modules/lodash/kebabCase.js +28 -0
  1231. node_ui/node_modules/lodash/keyBy.js +36 -0
  1232. node_ui/node_modules/lodash/keys.js +37 -0
  1233. node_ui/node_modules/lodash/keysIn.js +32 -0
  1234. node_ui/node_modules/lodash/lang.js +58 -0
  1235. node_ui/node_modules/lodash/last.js +20 -0
  1236. node_ui/node_modules/lodash/lastIndexOf.js +46 -0
  1237. node_ui/node_modules/lodash/lodash.js +17209 -0
  1238. node_ui/node_modules/lodash/lodash.min.js +140 -0
  1239. node_ui/node_modules/lodash/lowerCase.js +27 -0
  1240. node_ui/node_modules/lodash/lowerFirst.js +22 -0
  1241. node_ui/node_modules/lodash/lt.js +29 -0
  1242. node_ui/node_modules/lodash/lte.js +30 -0
  1243. node_ui/node_modules/lodash/map.js +53 -0
  1244. node_ui/node_modules/lodash/mapKeys.js +36 -0
  1245. node_ui/node_modules/lodash/mapValues.js +43 -0
  1246. node_ui/node_modules/lodash/matches.js +46 -0
  1247. node_ui/node_modules/lodash/matchesProperty.js +44 -0
  1248. node_ui/node_modules/lodash/math.js +17 -0
  1249. node_ui/node_modules/lodash/max.js +29 -0
  1250. node_ui/node_modules/lodash/maxBy.js +34 -0
  1251. node_ui/node_modules/lodash/mean.js +22 -0
  1252. node_ui/node_modules/lodash/meanBy.js +31 -0
  1253. node_ui/node_modules/lodash/memoize.js +73 -0
  1254. node_ui/node_modules/lodash/merge.js +39 -0
  1255. node_ui/node_modules/lodash/mergeWith.js +39 -0
  1256. node_ui/node_modules/lodash/method.js +34 -0
  1257. node_ui/node_modules/lodash/methodOf.js +33 -0
  1258. node_ui/node_modules/lodash/min.js +29 -0
  1259. node_ui/node_modules/lodash/minBy.js +34 -0
  1260. node_ui/node_modules/lodash/mixin.js +74 -0
  1261. node_ui/node_modules/lodash/multiply.js +22 -0
  1262. node_ui/node_modules/lodash/negate.js +40 -0
  1263. node_ui/node_modules/lodash/next.js +35 -0
  1264. node_ui/node_modules/lodash/noop.js +17 -0
  1265. node_ui/node_modules/lodash/now.js +23 -0
  1266. node_ui/node_modules/lodash/nth.js +29 -0
  1267. node_ui/node_modules/lodash/nthArg.js +32 -0
  1268. node_ui/node_modules/lodash/number.js +5 -0
  1269. node_ui/node_modules/lodash/object.js +49 -0
  1270. node_ui/node_modules/lodash/omit.js +57 -0
  1271. node_ui/node_modules/lodash/omitBy.js +29 -0
  1272. node_ui/node_modules/lodash/once.js +25 -0
  1273. node_ui/node_modules/lodash/orderBy.js +47 -0
  1274. node_ui/node_modules/lodash/over.js +24 -0
  1275. node_ui/node_modules/lodash/overArgs.js +61 -0
  1276. node_ui/node_modules/lodash/overEvery.js +34 -0
  1277. node_ui/node_modules/lodash/overSome.js +37 -0
  1278. node_ui/node_modules/lodash/package.json +17 -0
  1279. node_ui/node_modules/lodash/pad.js +49 -0
  1280. node_ui/node_modules/lodash/padEnd.js +39 -0
  1281. node_ui/node_modules/lodash/padStart.js +39 -0
  1282. node_ui/node_modules/lodash/parseInt.js +43 -0
  1283. node_ui/node_modules/lodash/partial.js +50 -0
  1284. node_ui/node_modules/lodash/partialRight.js +49 -0
  1285. node_ui/node_modules/lodash/partition.js +43 -0
  1286. node_ui/node_modules/lodash/pick.js +25 -0
  1287. node_ui/node_modules/lodash/pickBy.js +37 -0
  1288. node_ui/node_modules/lodash/plant.js +48 -0
  1289. node_ui/node_modules/lodash/property.js +32 -0
  1290. node_ui/node_modules/lodash/propertyOf.js +30 -0
  1291. node_ui/node_modules/lodash/pull.js +29 -0
  1292. node_ui/node_modules/lodash/pullAll.js +29 -0
  1293. node_ui/node_modules/lodash/pullAllBy.js +33 -0
  1294. node_ui/node_modules/lodash/pullAllWith.js +32 -0
  1295. node_ui/node_modules/lodash/pullAt.js +43 -0
  1296. node_ui/node_modules/lodash/random.js +82 -0
  1297. node_ui/node_modules/lodash/range.js +46 -0
  1298. node_ui/node_modules/lodash/rangeRight.js +41 -0
  1299. node_ui/node_modules/lodash/rearg.js +33 -0
  1300. node_ui/node_modules/lodash/reduce.js +51 -0
  1301. node_ui/node_modules/lodash/reduceRight.js +36 -0
  1302. node_ui/node_modules/lodash/reject.js +46 -0
  1303. node_ui/node_modules/lodash/release.md +48 -0
  1304. node_ui/node_modules/lodash/remove.js +53 -0
  1305. node_ui/node_modules/lodash/repeat.js +37 -0
  1306. node_ui/node_modules/lodash/replace.js +29 -0
  1307. node_ui/node_modules/lodash/rest.js +40 -0
  1308. node_ui/node_modules/lodash/result.js +56 -0
  1309. node_ui/node_modules/lodash/reverse.js +34 -0
  1310. node_ui/node_modules/lodash/round.js +26 -0
  1311. node_ui/node_modules/lodash/sample.js +24 -0
  1312. node_ui/node_modules/lodash/sampleSize.js +37 -0
  1313. node_ui/node_modules/lodash/seq.js +16 -0
  1314. node_ui/node_modules/lodash/set.js +35 -0
  1315. node_ui/node_modules/lodash/setWith.js +32 -0
  1316. node_ui/node_modules/lodash/shuffle.js +25 -0
  1317. node_ui/node_modules/lodash/size.js +46 -0
  1318. node_ui/node_modules/lodash/slice.js +37 -0
  1319. node_ui/node_modules/lodash/snakeCase.js +28 -0
  1320. node_ui/node_modules/lodash/some.js +51 -0
  1321. node_ui/node_modules/lodash/sortBy.js +48 -0
  1322. node_ui/node_modules/lodash/sortedIndex.js +24 -0
  1323. node_ui/node_modules/lodash/sortedIndexBy.js +33 -0
  1324. node_ui/node_modules/lodash/sortedIndexOf.js +31 -0
  1325. node_ui/node_modules/lodash/sortedLastIndex.js +25 -0
  1326. node_ui/node_modules/lodash/sortedLastIndexBy.js +33 -0
  1327. node_ui/node_modules/lodash/sortedLastIndexOf.js +31 -0
  1328. node_ui/node_modules/lodash/sortedUniq.js +24 -0
  1329. node_ui/node_modules/lodash/sortedUniqBy.js +26 -0
  1330. node_ui/node_modules/lodash/split.js +52 -0
  1331. node_ui/node_modules/lodash/spread.js +63 -0
  1332. node_ui/node_modules/lodash/startCase.js +29 -0
  1333. node_ui/node_modules/lodash/startsWith.js +39 -0
  1334. node_ui/node_modules/lodash/string.js +33 -0
  1335. node_ui/node_modules/lodash/stubArray.js +23 -0
  1336. node_ui/node_modules/lodash/stubFalse.js +18 -0
  1337. node_ui/node_modules/lodash/stubObject.js +23 -0
  1338. node_ui/node_modules/lodash/stubString.js +18 -0
  1339. node_ui/node_modules/lodash/stubTrue.js +18 -0
  1340. node_ui/node_modules/lodash/subtract.js +22 -0
  1341. node_ui/node_modules/lodash/sum.js +24 -0
  1342. node_ui/node_modules/lodash/sumBy.js +33 -0
  1343. node_ui/node_modules/lodash/tail.js +22 -0
  1344. node_ui/node_modules/lodash/take.js +37 -0
  1345. node_ui/node_modules/lodash/takeRight.js +39 -0
  1346. node_ui/node_modules/lodash/takeRightWhile.js +45 -0
  1347. node_ui/node_modules/lodash/takeWhile.js +45 -0
  1348. node_ui/node_modules/lodash/tap.js +29 -0
  1349. node_ui/node_modules/lodash/template.js +272 -0
  1350. node_ui/node_modules/lodash/templateSettings.js +67 -0
  1351. node_ui/node_modules/lodash/throttle.js +69 -0
  1352. node_ui/node_modules/lodash/thru.js +28 -0
  1353. node_ui/node_modules/lodash/times.js +51 -0
  1354. node_ui/node_modules/lodash/toArray.js +58 -0
  1355. node_ui/node_modules/lodash/toFinite.js +42 -0
  1356. node_ui/node_modules/lodash/toInteger.js +36 -0
  1357. node_ui/node_modules/lodash/toIterator.js +23 -0
  1358. node_ui/node_modules/lodash/toJSON.js +1 -0
  1359. node_ui/node_modules/lodash/toLength.js +38 -0
  1360. node_ui/node_modules/lodash/toLower.js +28 -0
  1361. node_ui/node_modules/lodash/toNumber.js +64 -0
  1362. node_ui/node_modules/lodash/toPairs.js +30 -0
  1363. node_ui/node_modules/lodash/toPairsIn.js +30 -0
  1364. node_ui/node_modules/lodash/toPath.js +33 -0
  1365. node_ui/node_modules/lodash/toPlainObject.js +32 -0
  1366. node_ui/node_modules/lodash/toSafeInteger.js +37 -0
  1367. node_ui/node_modules/lodash/toString.js +28 -0
  1368. node_ui/node_modules/lodash/toUpper.js +28 -0
  1369. node_ui/node_modules/lodash/transform.js +65 -0
  1370. node_ui/node_modules/lodash/trim.js +47 -0
  1371. node_ui/node_modules/lodash/trimEnd.js +41 -0
  1372. node_ui/node_modules/lodash/trimStart.js +43 -0
  1373. node_ui/node_modules/lodash/truncate.js +111 -0
  1374. node_ui/node_modules/lodash/unary.js +22 -0
  1375. node_ui/node_modules/lodash/unescape.js +34 -0
  1376. node_ui/node_modules/lodash/union.js +26 -0
  1377. node_ui/node_modules/lodash/unionBy.js +39 -0
  1378. node_ui/node_modules/lodash/unionWith.js +34 -0
  1379. node_ui/node_modules/lodash/uniq.js +25 -0
  1380. node_ui/node_modules/lodash/uniqBy.js +31 -0
  1381. node_ui/node_modules/lodash/uniqWith.js +28 -0
  1382. node_ui/node_modules/lodash/uniqueId.js +28 -0
  1383. node_ui/node_modules/lodash/unset.js +34 -0
  1384. node_ui/node_modules/lodash/unzip.js +45 -0
  1385. node_ui/node_modules/lodash/unzipWith.js +39 -0
  1386. node_ui/node_modules/lodash/update.js +35 -0
  1387. node_ui/node_modules/lodash/updateWith.js +33 -0
  1388. node_ui/node_modules/lodash/upperCase.js +27 -0
  1389. node_ui/node_modules/lodash/upperFirst.js +22 -0
  1390. node_ui/node_modules/lodash/util.js +34 -0
  1391. node_ui/node_modules/lodash/value.js +1 -0
  1392. node_ui/node_modules/lodash/valueOf.js +1 -0
  1393. node_ui/node_modules/lodash/values.js +34 -0
  1394. node_ui/node_modules/lodash/valuesIn.js +32 -0
  1395. node_ui/node_modules/lodash/without.js +31 -0
  1396. node_ui/node_modules/lodash/words.js +35 -0
  1397. node_ui/node_modules/lodash/wrap.js +30 -0
  1398. node_ui/node_modules/lodash/wrapperAt.js +48 -0
  1399. node_ui/node_modules/lodash/wrapperChain.js +34 -0
  1400. node_ui/node_modules/lodash/wrapperLodash.js +147 -0
  1401. node_ui/node_modules/lodash/wrapperReverse.js +44 -0
  1402. node_ui/node_modules/lodash/wrapperValue.js +21 -0
  1403. node_ui/node_modules/lodash/xor.js +28 -0
  1404. node_ui/node_modules/lodash/xorBy.js +39 -0
  1405. node_ui/node_modules/lodash/xorWith.js +34 -0
  1406. node_ui/node_modules/lodash/zip.js +22 -0
  1407. node_ui/node_modules/lodash/zipObject.js +24 -0
  1408. node_ui/node_modules/lodash/zipObjectDeep.js +23 -0
  1409. node_ui/node_modules/lodash/zipWith.js +32 -0
  1410. node_ui/node_modules/lodash.isequal/LICENSE +47 -0
  1411. node_ui/node_modules/lodash.isequal/README.md +18 -0
  1412. node_ui/node_modules/lodash.isequal/index.js +1848 -0
  1413. node_ui/node_modules/lodash.isequal/package.json +16 -0
  1414. node_ui/node_modules/loose-envify/LICENSE +21 -0
  1415. node_ui/node_modules/loose-envify/README.md +45 -0
  1416. node_ui/node_modules/loose-envify/cli.js +16 -0
  1417. node_ui/node_modules/loose-envify/custom.js +4 -0
  1418. node_ui/node_modules/loose-envify/index.js +3 -0
  1419. node_ui/node_modules/loose-envify/loose-envify.js +36 -0
  1420. node_ui/node_modules/loose-envify/package.json +36 -0
  1421. node_ui/node_modules/loose-envify/replace.js +65 -0
  1422. node_ui/node_modules/meow/build/dependencies.js +8828 -0
  1423. node_ui/node_modules/meow/build/index.d.ts +1425 -0
  1424. node_ui/node_modules/meow/build/index.js +95 -0
  1425. node_ui/node_modules/meow/build/licenses.md +1620 -0
  1426. node_ui/node_modules/meow/build/options.js +92 -0
  1427. node_ui/node_modules/meow/build/parser.js +84 -0
  1428. node_ui/node_modules/meow/build/utils.js +7 -0
  1429. node_ui/node_modules/meow/build/validate.js +122 -0
  1430. node_ui/node_modules/meow/license +9 -0
  1431. node_ui/node_modules/meow/package.json +105 -0
  1432. node_ui/node_modules/meow/readme.md +314 -0
  1433. node_ui/node_modules/mimic-fn/index.d.ts +54 -0
  1434. node_ui/node_modules/mimic-fn/index.js +13 -0
  1435. node_ui/node_modules/mimic-fn/license +9 -0
  1436. node_ui/node_modules/mimic-fn/package.json +42 -0
  1437. node_ui/node_modules/mimic-fn/readme.md +69 -0
  1438. node_ui/node_modules/onetime/index.d.ts +64 -0
  1439. node_ui/node_modules/onetime/index.js +44 -0
  1440. node_ui/node_modules/onetime/license +9 -0
  1441. node_ui/node_modules/onetime/package.json +43 -0
  1442. node_ui/node_modules/onetime/readme.md +94 -0
  1443. node_ui/node_modules/patch-console/dist/index.d.ts +4 -0
  1444. node_ui/node_modules/patch-console/dist/index.js +45 -0
  1445. node_ui/node_modules/patch-console/dist/index.js.map +1 -0
  1446. node_ui/node_modules/patch-console/license +9 -0
  1447. node_ui/node_modules/patch-console/package.json +53 -0
  1448. node_ui/node_modules/patch-console/readme.md +62 -0
  1449. node_ui/node_modules/react/LICENSE +21 -0
  1450. node_ui/node_modules/react/README.md +37 -0
  1451. node_ui/node_modules/react/cjs/react-jsx-dev-runtime.development.js +1315 -0
  1452. node_ui/node_modules/react/cjs/react-jsx-dev-runtime.production.min.js +10 -0
  1453. node_ui/node_modules/react/cjs/react-jsx-dev-runtime.profiling.min.js +10 -0
  1454. node_ui/node_modules/react/cjs/react-jsx-runtime.development.js +1333 -0
  1455. node_ui/node_modules/react/cjs/react-jsx-runtime.production.min.js +11 -0
  1456. node_ui/node_modules/react/cjs/react-jsx-runtime.profiling.min.js +11 -0
  1457. node_ui/node_modules/react/cjs/react.development.js +2740 -0
  1458. node_ui/node_modules/react/cjs/react.production.min.js +26 -0
  1459. node_ui/node_modules/react/cjs/react.shared-subset.development.js +20 -0
  1460. node_ui/node_modules/react/cjs/react.shared-subset.production.min.js +10 -0
  1461. node_ui/node_modules/react/index.js +7 -0
  1462. node_ui/node_modules/react/jsx-dev-runtime.js +7 -0
  1463. node_ui/node_modules/react/jsx-runtime.js +7 -0
  1464. node_ui/node_modules/react/package.json +47 -0
  1465. node_ui/node_modules/react/react.shared-subset.js +7 -0
  1466. node_ui/node_modules/react/umd/react.development.js +3343 -0
  1467. node_ui/node_modules/react/umd/react.production.min.js +31 -0
  1468. node_ui/node_modules/react/umd/react.profiling.min.js +31 -0
  1469. node_ui/node_modules/react-devtools-core/README.md +131 -0
  1470. node_ui/node_modules/react-devtools-core/backend.js +1 -0
  1471. node_ui/node_modules/react-devtools-core/dist/backend.js +16888 -0
  1472. node_ui/node_modules/react-devtools-core/dist/backend.js.map +1 -0
  1473. node_ui/node_modules/react-devtools-core/dist/importFile.worker.worker.js +2 -0
  1474. node_ui/node_modules/react-devtools-core/dist/importFile.worker.worker.js.map +1 -0
  1475. node_ui/node_modules/react-devtools-core/dist/parseHookNames.chunk.js +2 -0
  1476. node_ui/node_modules/react-devtools-core/dist/parseHookNames.chunk.js.map +1 -0
  1477. node_ui/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js +2 -0
  1478. node_ui/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js.map +1 -0
  1479. node_ui/node_modules/react-devtools-core/dist/standalone.js +3 -0
  1480. node_ui/node_modules/react-devtools-core/dist/standalone.js.LICENSE.txt +41 -0
  1481. node_ui/node_modules/react-devtools-core/dist/standalone.js.map +1 -0
  1482. node_ui/node_modules/react-devtools-core/node_modules/ws/LICENSE +21 -0
  1483. node_ui/node_modules/react-devtools-core/node_modules/ws/README.md +495 -0
  1484. node_ui/node_modules/react-devtools-core/node_modules/ws/browser.js +8 -0
  1485. node_ui/node_modules/react-devtools-core/node_modules/ws/index.js +10 -0
  1486. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/buffer-util.js +129 -0
  1487. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/constants.js +10 -0
  1488. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/event-target.js +184 -0
  1489. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/extension.js +223 -0
  1490. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/limiter.js +55 -0
  1491. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/permessage-deflate.js +518 -0
  1492. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/receiver.js +607 -0
  1493. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/sender.js +409 -0
  1494. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/stream.js +180 -0
  1495. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/validation.js +104 -0
  1496. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/websocket-server.js +449 -0
  1497. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/websocket.js +1197 -0
  1498. node_ui/node_modules/react-devtools-core/node_modules/ws/package.json +56 -0
  1499. node_ui/node_modules/react-devtools-core/package.json +38 -0
  1500. node_ui/node_modules/react-devtools-core/standalone.js +1 -0
  1501. node_ui/node_modules/react-reconciler/LICENSE +21 -0
  1502. node_ui/node_modules/react-reconciler/README.md +337 -0
  1503. node_ui/node_modules/react-reconciler/cjs/react-reconciler-constants.development.js +45 -0
  1504. node_ui/node_modules/react-reconciler/cjs/react-reconciler-constants.production.min.js +10 -0
  1505. node_ui/node_modules/react-reconciler/cjs/react-reconciler-reflection.development.js +660 -0
  1506. node_ui/node_modules/react-reconciler/cjs/react-reconciler-reflection.production.min.js +15 -0
  1507. node_ui/node_modules/react-reconciler/cjs/react-reconciler.development.js +21531 -0
  1508. node_ui/node_modules/react-reconciler/cjs/react-reconciler.production.min.js +234 -0
  1509. node_ui/node_modules/react-reconciler/cjs/react-reconciler.profiling.min.js +255 -0
  1510. node_ui/node_modules/react-reconciler/constants.js +7 -0
  1511. node_ui/node_modules/react-reconciler/index.js +7 -0
  1512. node_ui/node_modules/react-reconciler/package.json +40 -0
  1513. node_ui/node_modules/react-reconciler/reflection.js +7 -0
  1514. node_ui/node_modules/restore-cursor/index.d.ts +11 -0
  1515. node_ui/node_modules/restore-cursor/index.js +11 -0
  1516. node_ui/node_modules/restore-cursor/license +9 -0
  1517. node_ui/node_modules/restore-cursor/package.json +55 -0
  1518. node_ui/node_modules/restore-cursor/readme.md +31 -0
  1519. node_ui/node_modules/scheduler/LICENSE +21 -0
  1520. node_ui/node_modules/scheduler/README.md +9 -0
  1521. node_ui/node_modules/scheduler/cjs/scheduler-unstable_mock.development.js +700 -0
  1522. node_ui/node_modules/scheduler/cjs/scheduler-unstable_mock.production.min.js +20 -0
  1523. node_ui/node_modules/scheduler/cjs/scheduler-unstable_post_task.development.js +207 -0
  1524. node_ui/node_modules/scheduler/cjs/scheduler-unstable_post_task.production.min.js +14 -0
  1525. node_ui/node_modules/scheduler/cjs/scheduler.development.js +634 -0
  1526. node_ui/node_modules/scheduler/cjs/scheduler.production.min.js +19 -0
  1527. node_ui/node_modules/scheduler/index.js +7 -0
  1528. node_ui/node_modules/scheduler/package.json +36 -0
  1529. node_ui/node_modules/scheduler/umd/scheduler-unstable_mock.development.js +699 -0
  1530. node_ui/node_modules/scheduler/umd/scheduler-unstable_mock.production.min.js +19 -0
  1531. node_ui/node_modules/scheduler/umd/scheduler.development.js +152 -0
  1532. node_ui/node_modules/scheduler/umd/scheduler.production.min.js +146 -0
  1533. node_ui/node_modules/scheduler/umd/scheduler.profiling.min.js +146 -0
  1534. node_ui/node_modules/scheduler/unstable_mock.js +7 -0
  1535. node_ui/node_modules/scheduler/unstable_post_task.js +7 -0
  1536. node_ui/node_modules/shell-quote/.eslintrc +30 -0
  1537. node_ui/node_modules/shell-quote/.github/FUNDING.yml +12 -0
  1538. node_ui/node_modules/shell-quote/.nycrc +14 -0
  1539. node_ui/node_modules/shell-quote/LICENSE +24 -0
  1540. node_ui/node_modules/shell-quote/README.md +161 -0
  1541. node_ui/node_modules/shell-quote/index.js +4 -0
  1542. node_ui/node_modules/shell-quote/package.json +72 -0
  1543. node_ui/node_modules/shell-quote/parse.js +226 -0
  1544. node_ui/node_modules/shell-quote/print.py +3 -0
  1545. node_ui/node_modules/shell-quote/quote.js +19 -0
  1546. node_ui/node_modules/shell-quote/security.md +11 -0
  1547. node_ui/node_modules/shell-quote/test/comment.js +16 -0
  1548. node_ui/node_modules/shell-quote/test/env.js +52 -0
  1549. node_ui/node_modules/shell-quote/test/env_fn.js +21 -0
  1550. node_ui/node_modules/shell-quote/test/op.js +102 -0
  1551. node_ui/node_modules/shell-quote/test/parse.js +44 -0
  1552. node_ui/node_modules/shell-quote/test/quote.js +60 -0
  1553. node_ui/node_modules/shell-quote/test/set.js +31 -0
  1554. node_ui/node_modules/signal-exit/LICENSE.txt +16 -0
  1555. node_ui/node_modules/signal-exit/README.md +39 -0
  1556. node_ui/node_modules/signal-exit/index.js +202 -0
  1557. node_ui/node_modules/signal-exit/package.json +38 -0
  1558. node_ui/node_modules/signal-exit/signals.js +53 -0
  1559. node_ui/node_modules/slice-ansi/index.d.ts +19 -0
  1560. node_ui/node_modules/slice-ansi/index.js +169 -0
  1561. node_ui/node_modules/slice-ansi/license +10 -0
  1562. node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
  1563. node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/index.js +12 -0
  1564. node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/license +9 -0
  1565. node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/package.json +53 -0
  1566. node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/readme.md +31 -0
  1567. node_ui/node_modules/slice-ansi/package.json +58 -0
  1568. node_ui/node_modules/slice-ansi/readme.md +54 -0
  1569. node_ui/node_modules/stack-utils/LICENSE.md +21 -0
  1570. node_ui/node_modules/stack-utils/index.js +344 -0
  1571. node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/index.d.ts +18 -0
  1572. node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/index.js +11 -0
  1573. node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/license +9 -0
  1574. node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/package.json +43 -0
  1575. node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/readme.md +29 -0
  1576. node_ui/node_modules/stack-utils/package.json +39 -0
  1577. node_ui/node_modules/stack-utils/readme.md +143 -0
  1578. node_ui/node_modules/string-width/index.d.ts +39 -0
  1579. node_ui/node_modules/string-width/index.js +82 -0
  1580. node_ui/node_modules/string-width/license +9 -0
  1581. node_ui/node_modules/string-width/package.json +64 -0
  1582. node_ui/node_modules/string-width/readme.md +66 -0
  1583. node_ui/node_modules/strip-ansi/index.d.ts +15 -0
  1584. node_ui/node_modules/strip-ansi/index.js +14 -0
  1585. node_ui/node_modules/strip-ansi/license +9 -0
  1586. node_ui/node_modules/strip-ansi/package.json +59 -0
  1587. node_ui/node_modules/strip-ansi/readme.md +37 -0
  1588. node_ui/node_modules/to-rotated/index.d.ts +18 -0
  1589. node_ui/node_modules/to-rotated/index.js +24 -0
  1590. node_ui/node_modules/to-rotated/license +9 -0
  1591. node_ui/node_modules/to-rotated/package.json +46 -0
  1592. node_ui/node_modules/to-rotated/readme.md +29 -0
  1593. node_ui/node_modules/type-fest/index.d.ts +178 -0
  1594. node_ui/node_modules/type-fest/license-cc0 +121 -0
  1595. node_ui/node_modules/type-fest/license-mit +9 -0
  1596. node_ui/node_modules/type-fest/package.json +91 -0
  1597. node_ui/node_modules/type-fest/readme.md +1060 -0
  1598. node_ui/node_modules/type-fest/source/all-union-fields.d.ts +88 -0
  1599. node_ui/node_modules/type-fest/source/and.d.ts +25 -0
  1600. node_ui/node_modules/type-fest/source/array-indices.d.ts +23 -0
  1601. node_ui/node_modules/type-fest/source/array-slice.d.ts +109 -0
  1602. node_ui/node_modules/type-fest/source/array-splice.d.ts +99 -0
  1603. node_ui/node_modules/type-fest/source/array-tail.d.ts +76 -0
  1604. node_ui/node_modules/type-fest/source/array-values.d.ts +22 -0
  1605. node_ui/node_modules/type-fest/source/arrayable.d.ts +29 -0
  1606. node_ui/node_modules/type-fest/source/async-return-type.d.ts +23 -0
  1607. node_ui/node_modules/type-fest/source/asyncify.d.ts +32 -0
  1608. node_ui/node_modules/type-fest/source/basic.d.ts +68 -0
  1609. node_ui/node_modules/type-fest/source/camel-case.d.ts +89 -0
  1610. node_ui/node_modules/type-fest/source/camel-cased-properties-deep.d.ts +97 -0
  1611. node_ui/node_modules/type-fest/source/camel-cased-properties.d.ts +43 -0
  1612. node_ui/node_modules/type-fest/source/conditional-except.d.ts +45 -0
  1613. node_ui/node_modules/type-fest/source/conditional-keys.d.ts +47 -0
  1614. node_ui/node_modules/type-fest/source/conditional-pick-deep.d.ts +118 -0
  1615. node_ui/node_modules/type-fest/source/conditional-pick.d.ts +44 -0
  1616. node_ui/node_modules/type-fest/source/conditional-simplify.d.ts +32 -0
  1617. node_ui/node_modules/type-fest/source/delimiter-case.d.ts +78 -0
  1618. node_ui/node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts +106 -0
  1619. node_ui/node_modules/type-fest/source/delimiter-cased-properties.d.ts +46 -0
  1620. node_ui/node_modules/type-fest/source/distributed-omit.d.ts +89 -0
  1621. node_ui/node_modules/type-fest/source/distributed-pick.d.ts +85 -0
  1622. node_ui/node_modules/type-fest/source/empty-object.d.ts +46 -0
  1623. node_ui/node_modules/type-fest/source/enforce-optional.d.ts +47 -0
  1624. node_ui/node_modules/type-fest/source/entries.d.ts +62 -0
  1625. node_ui/node_modules/type-fest/source/entry.d.ts +65 -0
  1626. node_ui/node_modules/type-fest/source/exact.d.ts +68 -0
  1627. node_ui/node_modules/type-fest/source/except.d.ts +108 -0
  1628. node_ui/node_modules/type-fest/source/find-global-type.d.ts +64 -0
  1629. node_ui/node_modules/type-fest/source/fixed-length-array.d.ts +43 -0
  1630. node_ui/node_modules/type-fest/source/get.d.ts +219 -0
  1631. node_ui/node_modules/type-fest/source/global-this.d.ts +21 -0
  1632. node_ui/node_modules/type-fest/source/greater-than-or-equal.d.ts +22 -0
  1633. node_ui/node_modules/type-fest/source/greater-than.d.ts +56 -0
  1634. node_ui/node_modules/type-fest/source/has-optional-keys.d.ts +21 -0
  1635. node_ui/node_modules/type-fest/source/has-readonly-keys.d.ts +21 -0
  1636. node_ui/node_modules/type-fest/source/has-required-keys.d.ts +59 -0
  1637. node_ui/node_modules/type-fest/source/has-writable-keys.d.ts +21 -0
  1638. node_ui/node_modules/type-fest/source/if-any.d.ts +24 -0
  1639. node_ui/node_modules/type-fest/source/if-empty-object.d.ts +26 -0
  1640. node_ui/node_modules/type-fest/source/if-never.d.ts +24 -0
  1641. node_ui/node_modules/type-fest/source/if-null.d.ts +24 -0
  1642. node_ui/node_modules/type-fest/source/if-unknown.d.ts +24 -0
  1643. node_ui/node_modules/type-fest/source/includes.d.ts +22 -0
  1644. node_ui/node_modules/type-fest/source/int-closed-range.d.ts +35 -0
  1645. node_ui/node_modules/type-fest/source/int-range.d.ts +55 -0
  1646. node_ui/node_modules/type-fest/source/internal/array.d.ts +126 -0
  1647. node_ui/node_modules/type-fest/source/internal/characters.d.ts +67 -0
  1648. node_ui/node_modules/type-fest/source/internal/index.d.ts +8 -0
  1649. node_ui/node_modules/type-fest/source/internal/keys.d.ts +97 -0
  1650. node_ui/node_modules/type-fest/source/internal/numeric.d.ts +118 -0
  1651. node_ui/node_modules/type-fest/source/internal/object.d.ts +236 -0
  1652. node_ui/node_modules/type-fest/source/internal/string.d.ts +210 -0
  1653. node_ui/node_modules/type-fest/source/internal/tuple.d.ts +90 -0
  1654. node_ui/node_modules/type-fest/source/internal/type.d.ts +139 -0
  1655. node_ui/node_modules/type-fest/source/invariant-of.d.ts +76 -0
  1656. node_ui/node_modules/type-fest/source/is-any.d.ts +33 -0
  1657. node_ui/node_modules/type-fest/source/is-equal.d.ts +31 -0
  1658. node_ui/node_modules/type-fest/source/is-float.d.ts +41 -0
  1659. node_ui/node_modules/type-fest/source/is-integer.d.ts +58 -0
  1660. node_ui/node_modules/type-fest/source/is-literal.d.ts +296 -0
  1661. node_ui/node_modules/type-fest/source/is-never.d.ts +42 -0
  1662. node_ui/node_modules/type-fest/source/is-null.d.ts +20 -0
  1663. node_ui/node_modules/type-fest/source/is-tuple.d.ts +89 -0
  1664. node_ui/node_modules/type-fest/source/is-unknown.d.ts +52 -0
  1665. node_ui/node_modules/type-fest/source/iterable-element.d.ts +64 -0
  1666. node_ui/node_modules/type-fest/source/join.d.ts +68 -0
  1667. node_ui/node_modules/type-fest/source/jsonifiable.d.ts +37 -0
  1668. node_ui/node_modules/type-fest/source/jsonify.d.ts +122 -0
  1669. node_ui/node_modules/type-fest/source/kebab-case.d.ts +44 -0
  1670. node_ui/node_modules/type-fest/source/kebab-cased-properties-deep.d.ts +63 -0
  1671. node_ui/node_modules/type-fest/source/kebab-cased-properties.d.ts +40 -0
  1672. node_ui/node_modules/type-fest/source/keys-of-union.d.ts +42 -0
  1673. node_ui/node_modules/type-fest/source/last-array-element.d.ts +38 -0
  1674. node_ui/node_modules/type-fest/source/less-than-or-equal.d.ts +22 -0
  1675. node_ui/node_modules/type-fest/source/less-than.d.ts +26 -0
  1676. node_ui/node_modules/type-fest/source/literal-to-primitive-deep.d.ts +36 -0
  1677. node_ui/node_modules/type-fest/source/literal-to-primitive.d.ts +36 -0
  1678. node_ui/node_modules/type-fest/source/literal-union.d.ts +37 -0
  1679. node_ui/node_modules/type-fest/source/merge-deep.d.ts +486 -0
  1680. node_ui/node_modules/type-fest/source/merge-exclusive.d.ts +41 -0
  1681. node_ui/node_modules/type-fest/source/merge.d.ts +48 -0
  1682. node_ui/node_modules/type-fest/source/multidimensional-array.d.ts +44 -0
  1683. node_ui/node_modules/type-fest/source/multidimensional-readonly-array.d.ts +48 -0
  1684. node_ui/node_modules/type-fest/source/non-empty-object.d.ts +35 -0
  1685. node_ui/node_modules/type-fest/source/non-empty-string.d.ts +28 -0
  1686. node_ui/node_modules/type-fest/source/non-empty-tuple.d.ts +21 -0
  1687. node_ui/node_modules/type-fest/source/numeric.d.ts +222 -0
  1688. node_ui/node_modules/type-fest/source/observable-like.d.ts +63 -0
  1689. node_ui/node_modules/type-fest/source/omit-deep.d.ts +167 -0
  1690. node_ui/node_modules/type-fest/source/omit-index-signature.d.ts +95 -0
  1691. node_ui/node_modules/type-fest/source/opaque.d.ts +1 -0
  1692. node_ui/node_modules/type-fest/source/optional-keys-of.d.ts +39 -0
  1693. node_ui/node_modules/type-fest/source/or.d.ts +25 -0
  1694. node_ui/node_modules/type-fest/source/override-properties.d.ts +36 -0
  1695. node_ui/node_modules/type-fest/source/package-json.d.ts +676 -0
  1696. node_ui/node_modules/type-fest/source/partial-deep.d.ts +151 -0
  1697. node_ui/node_modules/type-fest/source/partial-on-undefined-deep.d.ts +78 -0
  1698. node_ui/node_modules/type-fest/source/pascal-case.d.ts +42 -0
  1699. node_ui/node_modules/type-fest/source/pascal-cased-properties-deep.d.ts +62 -0
  1700. node_ui/node_modules/type-fest/source/pascal-cased-properties.d.ts +36 -0
  1701. node_ui/node_modules/type-fest/source/paths.d.ts +262 -0
  1702. node_ui/node_modules/type-fest/source/pick-deep.d.ts +149 -0
  1703. node_ui/node_modules/type-fest/source/pick-index-signature.d.ts +50 -0
  1704. node_ui/node_modules/type-fest/source/primitive.d.ts +13 -0
  1705. node_ui/node_modules/type-fest/source/promisable.d.ts +25 -0
  1706. node_ui/node_modules/type-fest/source/readonly-deep.d.ts +81 -0
  1707. node_ui/node_modules/type-fest/source/readonly-keys-of.d.ts +30 -0
  1708. node_ui/node_modules/type-fest/source/readonly-tuple.d.ts +41 -0
  1709. node_ui/node_modules/type-fest/source/replace.d.ts +85 -0
  1710. node_ui/node_modules/type-fest/source/require-all-or-none.d.ts +51 -0
  1711. node_ui/node_modules/type-fest/source/require-at-least-one.d.ts +47 -0
  1712. node_ui/node_modules/type-fest/source/require-exactly-one.d.ts +45 -0
  1713. node_ui/node_modules/type-fest/source/require-one-or-none.d.ts +46 -0
  1714. node_ui/node_modules/type-fest/source/required-deep.d.ts +78 -0
  1715. node_ui/node_modules/type-fest/source/required-keys-of.d.ts +30 -0
  1716. node_ui/node_modules/type-fest/source/schema.d.ts +114 -0
  1717. node_ui/node_modules/type-fest/source/screaming-snake-case.d.ts +28 -0
  1718. node_ui/node_modules/type-fest/source/set-field-type.d.ts +65 -0
  1719. node_ui/node_modules/type-fest/source/set-non-nullable-deep.d.ts +83 -0
  1720. node_ui/node_modules/type-fest/source/set-non-nullable.d.ts +39 -0
  1721. node_ui/node_modules/type-fest/source/set-optional.d.ts +38 -0
  1722. node_ui/node_modules/type-fest/source/set-parameter-type.d.ts +117 -0
  1723. node_ui/node_modules/type-fest/source/set-readonly.d.ts +39 -0
  1724. node_ui/node_modules/type-fest/source/set-required-deep.d.ts +68 -0
  1725. node_ui/node_modules/type-fest/source/set-required.d.ts +70 -0
  1726. node_ui/node_modules/type-fest/source/set-return-type.d.ts +29 -0
  1727. node_ui/node_modules/type-fest/source/shared-union-fields-deep.d.ts +178 -0
  1728. node_ui/node_modules/type-fest/source/shared-union-fields.d.ts +76 -0
  1729. node_ui/node_modules/type-fest/source/simplify-deep.d.ts +115 -0
  1730. node_ui/node_modules/type-fest/source/simplify.d.ts +58 -0
  1731. node_ui/node_modules/type-fest/source/single-key-object.d.ts +29 -0
  1732. node_ui/node_modules/type-fest/source/snake-case.d.ts +45 -0
  1733. node_ui/node_modules/type-fest/source/snake-cased-properties-deep.d.ts +63 -0
  1734. node_ui/node_modules/type-fest/source/snake-cased-properties.d.ts +40 -0
  1735. node_ui/node_modules/type-fest/source/split.d.ts +88 -0
  1736. node_ui/node_modules/type-fest/source/spread.d.ts +84 -0
  1737. node_ui/node_modules/type-fest/source/string-key-of.d.ts +25 -0
  1738. node_ui/node_modules/type-fest/source/string-repeat.d.ts +47 -0
  1739. node_ui/node_modules/type-fest/source/string-slice.d.ts +37 -0
  1740. node_ui/node_modules/type-fest/source/stringified.d.ts +23 -0
  1741. node_ui/node_modules/type-fest/source/structured-cloneable.d.ts +92 -0
  1742. node_ui/node_modules/type-fest/source/subtract.d.ts +83 -0
  1743. node_ui/node_modules/type-fest/source/sum.d.ts +78 -0
  1744. node_ui/node_modules/type-fest/source/tagged-union.d.ts +51 -0
  1745. node_ui/node_modules/type-fest/source/tagged.d.ts +256 -0
  1746. node_ui/node_modules/type-fest/source/trim.d.ts +27 -0
  1747. node_ui/node_modules/type-fest/source/tsconfig-json.d.ts +1294 -0
  1748. node_ui/node_modules/type-fest/source/tuple-to-object.d.ts +42 -0
  1749. node_ui/node_modules/type-fest/source/tuple-to-union.d.ts +51 -0
  1750. node_ui/node_modules/type-fest/source/typed-array.d.ts +17 -0
  1751. node_ui/node_modules/type-fest/source/undefined-on-partial-deep.d.ts +80 -0
  1752. node_ui/node_modules/type-fest/source/union-to-intersection.d.ts +61 -0
  1753. node_ui/node_modules/type-fest/source/union-to-tuple.d.ts +56 -0
  1754. node_ui/node_modules/type-fest/source/unknown-array.d.ts +25 -0
  1755. node_ui/node_modules/type-fest/source/unknown-map.d.ts +24 -0
  1756. node_ui/node_modules/type-fest/source/unknown-record.d.ts +31 -0
  1757. node_ui/node_modules/type-fest/source/unknown-set.d.ts +24 -0
  1758. node_ui/node_modules/type-fest/source/value-of.d.ts +42 -0
  1759. node_ui/node_modules/type-fest/source/words.d.ts +118 -0
  1760. node_ui/node_modules/type-fest/source/writable-deep.d.ts +83 -0
  1761. node_ui/node_modules/type-fest/source/writable-keys-of.d.ts +33 -0
  1762. node_ui/node_modules/type-fest/source/writable.d.ts +68 -0
  1763. node_ui/node_modules/widest-line/index.d.ts +12 -0
  1764. node_ui/node_modules/widest-line/index.js +11 -0
  1765. node_ui/node_modules/widest-line/license +9 -0
  1766. node_ui/node_modules/widest-line/package.json +60 -0
  1767. node_ui/node_modules/widest-line/readme.md +26 -0
  1768. node_ui/node_modules/wrap-ansi/index.d.ts +41 -0
  1769. node_ui/node_modules/wrap-ansi/index.js +222 -0
  1770. node_ui/node_modules/wrap-ansi/license +9 -0
  1771. node_ui/node_modules/wrap-ansi/package.json +69 -0
  1772. node_ui/node_modules/wrap-ansi/readme.md +75 -0
  1773. node_ui/node_modules/ws/LICENSE +20 -0
  1774. node_ui/node_modules/ws/README.md +548 -0
  1775. node_ui/node_modules/ws/browser.js +8 -0
  1776. node_ui/node_modules/ws/index.js +13 -0
  1777. node_ui/node_modules/ws/lib/buffer-util.js +131 -0
  1778. node_ui/node_modules/ws/lib/constants.js +18 -0
  1779. node_ui/node_modules/ws/lib/event-target.js +292 -0
  1780. node_ui/node_modules/ws/lib/extension.js +203 -0
  1781. node_ui/node_modules/ws/lib/limiter.js +55 -0
  1782. node_ui/node_modules/ws/lib/permessage-deflate.js +528 -0
  1783. node_ui/node_modules/ws/lib/receiver.js +706 -0
  1784. node_ui/node_modules/ws/lib/sender.js +602 -0
  1785. node_ui/node_modules/ws/lib/stream.js +161 -0
  1786. node_ui/node_modules/ws/lib/subprotocol.js +62 -0
  1787. node_ui/node_modules/ws/lib/validation.js +152 -0
  1788. node_ui/node_modules/ws/lib/websocket-server.js +550 -0
  1789. node_ui/node_modules/ws/lib/websocket.js +1388 -0
  1790. node_ui/node_modules/ws/package.json +69 -0
  1791. node_ui/node_modules/ws/wrapper.mjs +8 -0
  1792. node_ui/node_modules/yoga-wasm-web/LICENSE +21 -0
  1793. node_ui/node_modules/yoga-wasm-web/README.md +70 -0
  1794. node_ui/node_modules/yoga-wasm-web/dist/asm.d.ts +6 -0
  1795. node_ui/node_modules/yoga-wasm-web/dist/asm.js +1 -0
  1796. node_ui/node_modules/yoga-wasm-web/dist/auto.d.ts +7 -0
  1797. node_ui/node_modules/yoga-wasm-web/dist/browser.js +1 -0
  1798. node_ui/node_modules/yoga-wasm-web/dist/generated/YGEnums.d.ts +328 -0
  1799. node_ui/node_modules/yoga-wasm-web/dist/index.d.ts +7 -0
  1800. node_ui/node_modules/yoga-wasm-web/dist/index.js +1 -0
  1801. node_ui/node_modules/yoga-wasm-web/dist/node.js +1 -0
  1802. node_ui/node_modules/yoga-wasm-web/dist/wrapAsm-57389177.js +1 -0
  1803. node_ui/node_modules/yoga-wasm-web/dist/wrapAsm-f766f97f.js +1 -0
  1804. node_ui/node_modules/yoga-wasm-web/dist/wrapAsm.d.ts +176 -0
  1805. node_ui/node_modules/yoga-wasm-web/dist/yoga.wasm +0 -0
  1806. node_ui/node_modules/yoga-wasm-web/package.json +56 -0
  1807. node_ui/package.json +21 -0
@@ -0,0 +1,1741 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ find-claude-session: Search Claude Code session files by keywords
4
+
5
+ Usage:
6
+ find-claude-session "keyword1,keyword2,keyword3..." [-g/--global]
7
+
8
+ This tool searches for Claude Code session JSONL files that contain ALL specified keywords,
9
+ and returns matching session IDs in reverse chronological order.
10
+
11
+ With -g/--global flag, searches across all Claude projects, not just the current one.
12
+
13
+ For the directory change to persist, use the shell function:
14
+ fcs() { eval $(find-claude-session --shell "$@"); }
15
+ """
16
+
17
+ import argparse
18
+ import json
19
+ import os
20
+ import re
21
+ import shlex
22
+ import sys
23
+ import time
24
+ import termios
25
+ import tty
26
+ from datetime import datetime
27
+ from pathlib import Path
28
+ from typing import List, Set, Tuple, Optional
29
+
30
+ from claude_code_tools.session_menu import (
31
+ show_action_menu as menu_show_action_menu,
32
+ show_resume_submenu as menu_show_resume_submenu,
33
+ prompt_suppress_options as menu_prompt_suppress_options,
34
+ )
35
+ from claude_code_tools.node_menu_ui import run_node_menu_ui, run_find_options_ui
36
+ from claude_code_tools.trim_session import (
37
+ trim_and_create_session,
38
+ is_trimmed_session,
39
+ get_session_derivation_type,
40
+ )
41
+
42
+
43
+ def get_session_start_timestamp(jsonl_file: Path) -> Optional[float]:
44
+ """Extract session start timestamp from first entry with timestamp field.
45
+
46
+ Args:
47
+ jsonl_file: Path to Claude session JSONL file
48
+
49
+ Returns:
50
+ Unix timestamp as float, or None if not found
51
+ """
52
+ try:
53
+ with open(jsonl_file, "r", encoding="utf-8") as f:
54
+ for i, line in enumerate(f):
55
+ if i >= 10: # Only check first 10 lines
56
+ break
57
+ line = line.strip()
58
+ if not line:
59
+ continue
60
+ try:
61
+ data = json.loads(line)
62
+ if data.get("timestamp"):
63
+ ts = data["timestamp"]
64
+ # Parse ISO format (e.g., "2025-10-22T16:05:28.707Z")
65
+ if ts.endswith("Z"):
66
+ ts = ts[:-1] + "+00:00"
67
+ return datetime.fromisoformat(ts).timestamp()
68
+ except (json.JSONDecodeError, ValueError, TypeError):
69
+ continue
70
+ except (OSError, IOError):
71
+ pass
72
+ return None
73
+
74
+
75
+ def _read_key() -> str:
76
+ """Read a single keypress (Enter/Esc)."""
77
+ fd = sys.stdin.fileno()
78
+ old = termios.tcgetattr(fd)
79
+ try:
80
+ tty.setcbreak(fd)
81
+ ch = sys.stdin.read(1)
82
+ finally:
83
+ termios.tcsetattr(fd, termios.TCSADRAIN, old)
84
+ return ch
85
+
86
+
87
+ def prompt_post_action() -> str:
88
+ """After non-launch actions: Enter exits, Esc returns to menu."""
89
+ print("\n[Action complete] Press Enter to exit, or Esc to return to menu", file=sys.stderr)
90
+ ch = _read_key()
91
+ if ch == "\x1b":
92
+ return "back"
93
+ return "exit"
94
+
95
+ # Try to import TUI - it's optional
96
+ try:
97
+ from claude_code_tools.session_tui import run_session_tui
98
+ TUI_AVAILABLE = True
99
+ except ImportError:
100
+ TUI_AVAILABLE = False
101
+ from claude_code_tools.smart_trim_core import identify_trimmable_lines_cli
102
+ from claude_code_tools.smart_trim import trim_lines
103
+ from claude_code_tools.session_utils import (
104
+ get_claude_home,
105
+ encode_claude_project_path,
106
+ is_valid_session,
107
+ is_malformed_session,
108
+ extract_cwd_from_session,
109
+ format_session_id_display,
110
+ filter_sessions_by_time,
111
+ )
112
+
113
+ try:
114
+ from rich.console import Console
115
+ from rich.table import Table
116
+ from rich.prompt import Prompt, Confirm
117
+ from rich.progress import Progress, SpinnerColumn, TextColumn
118
+ from rich import box
119
+ RICH_AVAILABLE = True
120
+ except ImportError:
121
+ RICH_AVAILABLE = False
122
+
123
+ console = Console() if RICH_AVAILABLE else None
124
+
125
+
126
+ def get_claude_project_dir(claude_home: Optional[str] = None) -> Path:
127
+ """Convert current working directory to Claude project directory path."""
128
+ cwd = os.getcwd()
129
+
130
+ # Use provided claude_home, CLAUDE_CONFIG_DIR env var, or default to ~/.claude
131
+ base_dir = get_claude_home(claude_home)
132
+
133
+ # Encode path to match Claude's directory naming convention
134
+ project_path = encode_claude_project_path(cwd)
135
+ claude_dir = base_dir / "projects" / project_path
136
+ return claude_dir
137
+
138
+
139
+ def get_all_claude_projects(claude_home: Optional[str] = None) -> List[Tuple[Path, str]]:
140
+ """Get all Claude project directories with their original paths."""
141
+ # Use provided claude_home, CLAUDE_CONFIG_DIR env var, or default to ~/.claude
142
+ base_dir = get_claude_home(claude_home)
143
+
144
+ projects_dir = base_dir / "projects"
145
+
146
+ if not projects_dir.exists():
147
+ return []
148
+
149
+ projects = []
150
+ for project_dir in projects_dir.iterdir():
151
+ if project_dir.is_dir():
152
+ # Convert back from Claude's naming to original path
153
+ # Claude's pattern: -Users-username-path-to-project
154
+ # where only path separators (/) are replaced with -
155
+ dir_name = project_dir.name
156
+
157
+ # Split by - but need to be smart about it
158
+ # Pattern is like: -Users-pchalasani-Git-project-name
159
+ # We need to identify which hyphens are path separators vs part of names
160
+
161
+ # Most reliable approach: use known path patterns
162
+ if dir_name.startswith("-Users-"):
163
+ # macOS path
164
+ parts = dir_name[1:].split("-")
165
+ # Reconstruct, assuming first few parts are the path
166
+ # Pattern: Users/username/...
167
+ if len(parts) >= 2:
168
+ # Try to reconstruct the path
169
+ # We know it starts with /Users/username
170
+ original_path = "/" + parts[0] + "/" + parts[1]
171
+
172
+ # For the rest, we need to be careful
173
+ # Common patterns: /Users/username/Git/project-name
174
+ remaining = "-".join(parts[2:])
175
+
176
+ # Check for common directories
177
+ if remaining.startswith("Git-"):
178
+ original_path += "/Git/" + remaining[4:]
179
+ elif remaining:
180
+ # Just append the rest as is
181
+ original_path += "/" + remaining
182
+ else:
183
+ original_path = "/" + dir_name[1:].replace("-", "/")
184
+ elif dir_name.startswith("-home-"):
185
+ # Linux path
186
+ original_path = "/" + dir_name[1:].replace("-", "/")
187
+ else:
188
+ # Unknown pattern, best guess
189
+ original_path = "/" + dir_name.replace("-", "/")
190
+
191
+ projects.append((project_dir, original_path))
192
+
193
+ return projects
194
+
195
+
196
+ def extract_project_name(original_path: str) -> str:
197
+ """Extract a readable project name from the original path."""
198
+ # Get the last component of the path as the project name
199
+ parts = original_path.rstrip("/").split("/")
200
+ return parts[-1] if parts else "unknown"
201
+
202
+
203
+ """
204
+ Check if all keywords are present in the JSONL file, count lines, and extract git branch.
205
+
206
+ Args:
207
+ filepath: Path to the JSONL file
208
+ keywords: List of keywords to search for (case-insensitive). Empty list matches all files.
209
+
210
+ Returns:
211
+ Tuple of (matches: bool, line_count: int, git_branch: Optional[str])
212
+ - matches: True if ALL keywords are found in the file (or True if no keywords)
213
+ - line_count: Total number of lines in the file
214
+ - git_branch: Git branch name from the first message that has it, or None
215
+ """
216
+ # If no keywords, match all files
217
+ if not keywords:
218
+ msg_count = 0
219
+ git_branch = None
220
+ try:
221
+ with open(filepath, 'r', encoding='utf-8') as f:
222
+ for line in f:
223
+ try:
224
+ data = json.loads(line.strip())
225
+ # Only count user/assistant messages
226
+ if data.get('type') in ('user', 'assistant'):
227
+ msg_count += 1
228
+ # Extract git branch from JSON if not already found
229
+ if git_branch is None:
230
+ if 'gitBranch' in data and data['gitBranch']:
231
+ git_branch = data['gitBranch']
232
+ except (json.JSONDecodeError, KeyError):
233
+ pass
234
+ except Exception:
235
+ return False, 0, None
236
+ return True, msg_count, git_branch
237
+
238
+ # Convert keywords to lowercase for case-insensitive search
239
+ keywords_lower = [k.lower() for k in keywords]
240
+ found_keywords = set()
241
+ msg_count = 0
242
+ git_branch = None
243
+
244
+ try:
245
+ with open(filepath, 'r', encoding='utf-8') as f:
246
+ for line in f:
247
+ line_lower = line.lower()
248
+
249
+ try:
250
+ data = json.loads(line.strip())
251
+ # Only count user/assistant messages
252
+ if data.get('type') in ('user', 'assistant'):
253
+ msg_count += 1
254
+ # Extract git branch from JSON if not already found
255
+ if git_branch is None:
256
+ if 'gitBranch' in data and data['gitBranch']:
257
+ git_branch = data['gitBranch']
258
+ except (json.JSONDecodeError, KeyError):
259
+ pass
260
+
261
+ # Check which keywords are in this line (search all lines)
262
+ for keyword in keywords_lower:
263
+ if keyword in line_lower:
264
+ found_keywords.add(keyword)
265
+ except Exception:
266
+ # Skip files that can't be read
267
+ return False, 0, None
268
+
269
+ matches = len(found_keywords) == len(keywords_lower)
270
+ return matches, msg_count, git_branch
271
+
272
+
273
+ def is_system_message(text: str) -> bool:
274
+ """Check if text is system-generated (XML tags, env context, etc)"""
275
+ if not text or len(text.strip()) < 5:
276
+ return True
277
+ text = text.strip()
278
+ # Check for XML-like tags (user_instructions, environment_context, etc)
279
+ if text.startswith("<") and ">" in text[:100]:
280
+ return True
281
+ return False
282
+
283
+
284
+ def is_sidechain_session(filepath: Path) -> bool:
285
+ """
286
+ Check if a session file is a sidechain (sub-agent) session.
287
+
288
+ Sidechain sessions are created when launching sub-agents via the Task tool
289
+ and cannot be resumed directly.
290
+
291
+ Args:
292
+ filepath: Path to session JSONL file.
293
+
294
+ Returns:
295
+ True if session is a sidechain, False otherwise.
296
+ """
297
+ if not filepath.exists():
298
+ return False
299
+
300
+ try:
301
+ with open(filepath, 'r', encoding='utf-8') as f:
302
+ # Check first few lines for isSidechain field
303
+ for i, line in enumerate(f):
304
+ if i >= 10: # Only check first 10 lines
305
+ break
306
+ try:
307
+ data = json.loads(line.strip())
308
+ if "isSidechain" in data:
309
+ return data["isSidechain"] is True
310
+ except (json.JSONDecodeError, KeyError):
311
+ continue
312
+ except (OSError, IOError):
313
+ pass
314
+
315
+ return False
316
+
317
+
318
+ def search_keywords_in_file(filepath: Path, keywords: List[str]) -> tuple[bool, int, Optional[str]]:
319
+ """
320
+ Check if all keywords are present in the JSONL file, count lines, and extract git branch.
321
+
322
+ Args:
323
+ filepath: Path to the JSONL file
324
+ keywords: List of keywords to search for (case-insensitive). Empty list matches all files.
325
+
326
+ Returns:
327
+ Tuple of (matches: bool, line_count: int, git_branch: Optional[str])
328
+ - matches: True if ALL keywords are found in the file (or True if no keywords)
329
+ - line_count: Total number of lines in the file
330
+ - git_branch: Git branch name from the first message that has it, or None
331
+ """
332
+ # If no keywords, match all files
333
+ if not keywords:
334
+ msg_count = 0
335
+ git_branch = None
336
+ try:
337
+ with open(filepath, 'r', encoding='utf-8') as f:
338
+ for line in f:
339
+ try:
340
+ data = json.loads(line.strip())
341
+ # Only count user/assistant messages
342
+ if data.get('type') in ('user', 'assistant'):
343
+ msg_count += 1
344
+ # Extract git branch from JSON if not already found
345
+ if git_branch is None:
346
+ if 'gitBranch' in data and data['gitBranch']:
347
+ git_branch = data['gitBranch']
348
+ except (json.JSONDecodeError, KeyError):
349
+ pass
350
+ except Exception:
351
+ return False, 0, None
352
+ return True, msg_count, git_branch
353
+
354
+ # Convert keywords to lowercase for case-insensitive search
355
+ keywords_lower = [k.lower() for k in keywords]
356
+ found_keywords = set()
357
+ msg_count = 0
358
+ git_branch = None
359
+
360
+ try:
361
+ with open(filepath, 'r', encoding='utf-8') as f:
362
+ for line in f:
363
+ line_lower = line.lower()
364
+
365
+ try:
366
+ data = json.loads(line.strip())
367
+ # Only count user/assistant messages
368
+ if data.get('type') in ('user', 'assistant'):
369
+ msg_count += 1
370
+ # Extract git branch from JSON if not already found
371
+ if git_branch is None:
372
+ if 'gitBranch' in data and data['gitBranch']:
373
+ git_branch = data['gitBranch']
374
+ except (json.JSONDecodeError, KeyError):
375
+ pass
376
+
377
+ # Check which keywords are in this line (search all lines)
378
+ for keyword in keywords_lower:
379
+ if keyword in line_lower:
380
+ found_keywords.add(keyword)
381
+ except Exception:
382
+ # Skip files that can't be read
383
+ return False, 0, None
384
+
385
+ matches = len(found_keywords) == len(keywords_lower)
386
+ return matches, msg_count, git_branch
387
+
388
+
389
+ def get_session_preview(filepath: Path) -> str:
390
+ """Get a preview of the session from the LAST message of any type."""
391
+ last_message = None # Tuple of (type_prefix, content)
392
+
393
+ try:
394
+ with open(filepath, 'r', encoding='utf-8') as f:
395
+ for line in f:
396
+ try:
397
+ data = json.loads(line.strip())
398
+ msg_type = data.get('type')
399
+ # Accept user or assistant messages
400
+ if msg_type in ('user', 'assistant'):
401
+ message = data.get('message', {})
402
+ content = message.get('content', '')
403
+ text = None
404
+
405
+ if isinstance(content, str):
406
+ text = content.strip()
407
+ elif isinstance(content, list):
408
+ # Handle structured content
409
+ for item in content:
410
+ if isinstance(item, dict) and item.get('type') == 'text':
411
+ text = item.get('text', '').strip()
412
+ break
413
+
414
+ # Filter out system messages and keep updating to get LAST
415
+ if text and not is_system_message(text):
416
+ cleaned = text.replace('\n', ' ')[:400]
417
+ type_prefix = f"[{msg_type}]"
418
+ # Prefer substantial messages (>20 chars)
419
+ if len(cleaned) > 20:
420
+ last_message = (type_prefix, cleaned)
421
+ elif last_message is None:
422
+ last_message = (type_prefix, cleaned)
423
+
424
+ except (json.JSONDecodeError, KeyError):
425
+ continue
426
+ except Exception:
427
+ pass
428
+
429
+ if last_message:
430
+ return f"{last_message[0]} {last_message[1]}"
431
+ return "No preview available"
432
+
433
+
434
+ def find_sessions(
435
+ keywords: List[str],
436
+ global_search: bool = False,
437
+ claude_home: Optional[str] = None,
438
+ original_only: bool = False,
439
+ no_sub: bool = False,
440
+ no_trim: bool = False,
441
+ no_cont: bool = False,
442
+ ) -> List[Tuple[str, float, float, int, str, str, str, Optional[str], bool]]:
443
+ """
444
+ Find all Claude Code sessions containing the specified keywords.
445
+
446
+ Args:
447
+ keywords: List of keywords to search for
448
+ global_search: If True, search all projects; if False, search current project only
449
+ claude_home: Optional custom Claude home directory (defaults to ~/.claude)
450
+ original_only: If True, show only original sessions (excludes trimmed, rollover, and sub-agent sessions)
451
+ no_sub: If True, exclude sub-agent sessions
452
+ no_trim: If True, exclude trimmed sessions
453
+ no_cont: If True, exclude rollover sessions (internally "continued")
454
+
455
+ Returns:
456
+ List of tuples (session_id, modification_time, creation_time, line_count, project_name, preview, project_path, git_branch, is_trimmed) sorted by modification time
457
+ """
458
+ matching_sessions = []
459
+
460
+ if global_search:
461
+ # Search all projects
462
+ projects = get_all_claude_projects(claude_home)
463
+
464
+ if RICH_AVAILABLE and console:
465
+ with Progress(
466
+ SpinnerColumn(),
467
+ TextColumn("[progress.description]{task.description}"),
468
+ console=console,
469
+ transient=True
470
+ ) as progress:
471
+ task = progress.add_task(f"Searching {len(projects)} projects...", total=len(projects))
472
+
473
+ for project_dir, original_path in projects:
474
+ project_name = extract_project_name(original_path)
475
+ progress.update(task, description=f"Searching {project_name}...")
476
+
477
+ # Search all JSONL files in this project directory
478
+ for jsonl_file in project_dir.glob("*.jsonl"):
479
+ matches, line_count, git_branch = search_keywords_in_file(jsonl_file, keywords)
480
+ if matches:
481
+ # Skip malformed sessions (missing metadata, cannot resume)
482
+ if is_malformed_session(jsonl_file):
483
+ continue
484
+
485
+ # Check if session is trimmed/continued
486
+ is_trimmed = is_trimmed_session(jsonl_file)
487
+ derivation_type = get_session_derivation_type(jsonl_file) if is_trimmed else None
488
+
489
+ # Check if session is sidechain (sub-agent)
490
+ is_sidechain = is_sidechain_session(jsonl_file)
491
+
492
+ # Apply filters (original_only overrides individual filters)
493
+ if original_only:
494
+ # Original only: exclude trimmed, continued, and sub-agents
495
+ if is_trimmed or is_sidechain:
496
+ continue
497
+ else:
498
+ # Individual filters
499
+ if no_sub and is_sidechain:
500
+ continue
501
+ if no_trim and derivation_type == "trimmed":
502
+ continue
503
+ if no_cont and derivation_type == "continued":
504
+ continue
505
+
506
+ session_id = jsonl_file.stem
507
+ stat = jsonl_file.stat()
508
+ mod_time = stat.st_mtime
509
+ # Get session start timestamp from JSON metadata, fall back to file stats
510
+ create_time = get_session_start_timestamp(jsonl_file)
511
+ if create_time is None:
512
+ create_time = getattr(stat, 'st_birthtime', stat.st_ctime)
513
+ preview = get_session_preview(jsonl_file)
514
+ # Extract actual cwd from session file - MUST NOT use reconstructed path as fallback
515
+ actual_cwd = extract_cwd_from_session(jsonl_file)
516
+ if not actual_cwd:
517
+ # Skip sessions without cwd metadata (shouldn't happen for valid Claude sessions)
518
+ continue
519
+ matching_sessions.append((session_id, mod_time, create_time, line_count, project_name, preview, actual_cwd, git_branch, derivation_type, is_sidechain))
520
+
521
+ progress.advance(task)
522
+ else:
523
+ # Fallback without rich
524
+ for project_dir, original_path in projects:
525
+ project_name = extract_project_name(original_path)
526
+
527
+ for jsonl_file in project_dir.glob("*.jsonl"):
528
+ matches, line_count, git_branch = search_keywords_in_file(jsonl_file, keywords)
529
+ if matches:
530
+ # Skip malformed sessions (missing metadata, cannot resume)
531
+ if is_malformed_session(jsonl_file):
532
+ continue
533
+
534
+ # Check if session is trimmed/continued
535
+ is_trimmed = is_trimmed_session(jsonl_file)
536
+ derivation_type = get_session_derivation_type(jsonl_file) if is_trimmed else None
537
+
538
+ # Check if session is sidechain (sub-agent)
539
+ is_sidechain = is_sidechain_session(jsonl_file)
540
+
541
+ # Apply filters (original_only overrides individual filters)
542
+ if original_only:
543
+ # Original only: exclude trimmed, continued, and sub-agents
544
+ if is_trimmed or is_sidechain:
545
+ continue
546
+ else:
547
+ # Individual filters
548
+ if no_sub and is_sidechain:
549
+ continue
550
+ if no_trim and derivation_type == "trimmed":
551
+ continue
552
+ if no_cont and derivation_type == "continued":
553
+ continue
554
+
555
+ session_id = jsonl_file.stem
556
+ stat = jsonl_file.stat()
557
+ mod_time = stat.st_mtime
558
+ # Get session start timestamp from JSON metadata, fall back to file stats
559
+ create_time = get_session_start_timestamp(jsonl_file)
560
+ if create_time is None:
561
+ create_time = getattr(stat, 'st_birthtime', stat.st_ctime)
562
+ preview = get_session_preview(jsonl_file)
563
+ # Extract actual cwd from session file - MUST NOT use reconstructed path as fallback
564
+ actual_cwd = extract_cwd_from_session(jsonl_file)
565
+ if not actual_cwd:
566
+ # Skip sessions without cwd metadata (shouldn't happen for valid Claude sessions)
567
+ continue
568
+ matching_sessions.append((session_id, mod_time, create_time, line_count, project_name, preview, actual_cwd, git_branch, derivation_type, is_sidechain))
569
+ else:
570
+ # Search current project only
571
+ claude_dir = get_claude_project_dir(claude_home)
572
+
573
+ if not claude_dir.exists():
574
+ return []
575
+
576
+ project_name = extract_project_name(os.getcwd())
577
+
578
+ # Search all JSONL files in the directory
579
+ for jsonl_file in claude_dir.glob("*.jsonl"):
580
+ matches, line_count, git_branch = search_keywords_in_file(jsonl_file, keywords)
581
+ if matches:
582
+ # Skip malformed sessions (missing metadata, cannot resume)
583
+ if is_malformed_session(jsonl_file):
584
+ continue
585
+
586
+ # Check if session is trimmed/continued
587
+ is_trimmed = is_trimmed_session(jsonl_file)
588
+ derivation_type = get_session_derivation_type(jsonl_file) if is_trimmed else None
589
+
590
+ # Check if session is sidechain (sub-agent)
591
+ is_sidechain = is_sidechain_session(jsonl_file)
592
+
593
+ # Apply filters (original_only overrides individual filters)
594
+ if original_only:
595
+ # Original only: exclude trimmed, continued, and sub-agents
596
+ if is_trimmed or is_sidechain:
597
+ continue
598
+ else:
599
+ # Individual filters
600
+ if no_sub and is_sidechain:
601
+ continue
602
+ if no_trim and derivation_type == "trimmed":
603
+ continue
604
+ if no_cont and derivation_type == "continued":
605
+ continue
606
+
607
+ session_id = jsonl_file.stem
608
+ stat = jsonl_file.stat()
609
+ mod_time = stat.st_mtime
610
+ # Get session start timestamp from JSON metadata, fall back to file stats
611
+ create_time = get_session_start_timestamp(jsonl_file)
612
+ if create_time is None:
613
+ create_time = getattr(stat, 'st_birthtime', stat.st_ctime)
614
+ preview = get_session_preview(jsonl_file)
615
+ # Extract actual cwd from session file for consistency
616
+ actual_cwd = extract_cwd_from_session(jsonl_file) or os.getcwd()
617
+ matching_sessions.append((session_id, mod_time, create_time, line_count, project_name, preview, actual_cwd, git_branch, derivation_type, is_sidechain))
618
+
619
+ # Sort by modification time (newest first)
620
+ matching_sessions.sort(key=lambda x: x[1], reverse=True)
621
+
622
+ return matching_sessions
623
+
624
+
625
+ def display_interactive_ui(sessions: List[Tuple[str, float, float, int, str, str, str, Optional[str], bool]], keywords: List[str], stderr_mode: bool = False, num_matches: int = 10) -> Optional[Tuple[str, str]]:
626
+ """Display interactive UI for session selection."""
627
+ if not RICH_AVAILABLE:
628
+ return None
629
+
630
+ # Use stderr console if in stderr mode
631
+ ui_console = Console(file=sys.stderr) if stderr_mode else console
632
+ if not ui_console:
633
+ return None
634
+
635
+ # Limit to specified number of sessions
636
+ display_sessions = sessions[:num_matches]
637
+
638
+ if not display_sessions:
639
+ ui_console.print("[red]No sessions found[/red]")
640
+ return None
641
+
642
+ # Create table
643
+ title = f"Sessions matching: {', '.join(keywords)}" if keywords else "All sessions"
644
+ table = Table(
645
+ title=title,
646
+ box=box.ROUNDED,
647
+ show_header=True,
648
+ header_style="bold cyan"
649
+ )
650
+
651
+ table.add_column("#", style="bold yellow", width=3)
652
+ table.add_column("Session ID", style="dim")
653
+ table.add_column("Project", style="green")
654
+ table.add_column("Branch", style="magenta")
655
+ table.add_column("Date-Range", style="blue")
656
+ table.add_column("Lines", style="cyan", justify="right")
657
+ table.add_column("Last User Message", style="white", max_width=60, overflow="fold")
658
+
659
+ for idx, (session_id, mod_time, create_time, line_count, project_name, preview, _, git_branch, derivation_type, is_sidechain) in enumerate(display_sessions, 1):
660
+ # Format: "10/04 - 10/09 13:45"
661
+ create_date = datetime.fromtimestamp(create_time).strftime('%m/%d')
662
+ mod_date = datetime.fromtimestamp(mod_time).strftime('%m/%d %H:%M')
663
+ date_display = f"{create_date} - {mod_date}"
664
+ branch_display = git_branch if git_branch else "N/A"
665
+
666
+ # Format session ID with annotations using centralized helper
667
+ session_id_display = format_session_id_display(
668
+ session_id,
669
+ is_trimmed=(derivation_type == "trimmed"),
670
+ is_continued=(derivation_type == "continued"),
671
+ is_sidechain=is_sidechain,
672
+ truncate_length=8,
673
+ )
674
+
675
+ table.add_row(
676
+ str(idx),
677
+ session_id_display,
678
+ project_name,
679
+ branch_display,
680
+ date_display,
681
+ str(line_count),
682
+ preview
683
+ )
684
+
685
+ ui_console.print(table)
686
+
687
+ # Show footnotes if any sessions are trimmed, continued, or sidechain
688
+ has_trimmed = any(s[8] == "trimmed" for s in display_sessions) # derivation_type is index 8
689
+ has_continued = any(s[8] == "continued" for s in display_sessions)
690
+ has_sidechain = any(s[9] for s in display_sessions) # is_sidechain is index 9
691
+ if has_trimmed or has_continued or has_sidechain:
692
+ footnotes = []
693
+ if has_trimmed:
694
+ footnotes.append("(t) = Trimmed session")
695
+ if has_continued:
696
+ footnotes.append("(c) = Continued session")
697
+ if has_sidechain:
698
+ footnotes.append("(sub) = Sub-agent session (not directly resumable)")
699
+ ui_console.print("[dim]" + " | ".join(footnotes) + "[/dim]")
700
+
701
+ # Auto-select if only one result
702
+ if len(display_sessions) == 1:
703
+ ui_console.print(f"\n[yellow]Auto-selecting only match: {display_sessions[0][0][:16]}...[/yellow]")
704
+ return display_sessions[0]
705
+
706
+ ui_console.print("\n[bold]Select a session:[/bold]")
707
+ ui_console.print(f" • Enter number (1-{len(display_sessions)}) to select")
708
+ ui_console.print(" • Press Enter to cancel\n")
709
+
710
+ while True:
711
+ try:
712
+ # In stderr mode, we need to ensure nothing goes to stdout
713
+ if stderr_mode:
714
+ # Temporarily redirect stdout to devnull
715
+ old_stdout = sys.stdout
716
+ sys.stdout = open(os.devnull, 'w')
717
+
718
+ choice = Prompt.ask(
719
+ "Your choice",
720
+ default="",
721
+ show_default=False,
722
+ console=ui_console
723
+ )
724
+
725
+ # Handle empty input - cancel
726
+ if not choice or not choice.strip():
727
+ # Restore stdout first
728
+ if stderr_mode:
729
+ sys.stdout.close()
730
+ sys.stdout = old_stdout
731
+ ui_console.print("[yellow]Cancelled[/yellow]")
732
+ return None
733
+
734
+ # Restore stdout
735
+ if stderr_mode:
736
+ sys.stdout.close()
737
+ sys.stdout = old_stdout
738
+
739
+ idx = int(choice) - 1
740
+ if 0 <= idx < len(display_sessions):
741
+ session_info = display_sessions[idx]
742
+ return session_info # Return full session tuple
743
+ else:
744
+ ui_console.print("[red]Invalid choice. Please try again.[/red]")
745
+
746
+ except KeyboardInterrupt:
747
+ # Restore stdout if needed
748
+ if stderr_mode and sys.stdout != old_stdout:
749
+ sys.stdout.close()
750
+ sys.stdout = old_stdout
751
+ ui_console.print("\n[yellow]Cancelled[/yellow]")
752
+ return None
753
+ except EOFError:
754
+ # Restore stdout if needed
755
+ if stderr_mode and sys.stdout != old_stdout:
756
+ sys.stdout.close()
757
+ sys.stdout = old_stdout
758
+ ui_console.print("\n[yellow]Cancelled (EOF)[/yellow]")
759
+ return None
760
+ except ValueError:
761
+ ui_console.print("[red]Invalid choice. Please try again.[/red]")
762
+
763
+
764
+ def show_resume_submenu() -> Optional[str]:
765
+ """Show resume options submenu."""
766
+ return menu_show_resume_submenu(stderr_mode=False)
767
+
768
+
769
+ def prompt_suppress_options() -> Optional[Tuple[Optional[str], int, Optional[int]]]:
770
+ """
771
+ Prompt user for suppress-tool-results options.
772
+
773
+ Returns:
774
+ Tuple of (tools, threshold, trim_assistant_messages) or None if cancelled
775
+ """
776
+ return menu_prompt_suppress_options(stderr_mode=False)
777
+
778
+
779
+ def extract_first_user_message_claude(session_file: Path) -> str:
780
+ """Extract first user message from Claude session file."""
781
+ with open(session_file, "r") as f:
782
+ for line in f:
783
+ try:
784
+ data = json.loads(line)
785
+ except json.JSONDecodeError:
786
+ continue
787
+
788
+ if data.get("type") == "user":
789
+ content = data.get("message", {}).get("content")
790
+ if isinstance(content, str):
791
+ return content
792
+ elif isinstance(content, list):
793
+ for item in content:
794
+ if isinstance(item, dict) and item.get("type") == "text":
795
+ return item.get("text", "")
796
+
797
+ return "Suppressed session"
798
+
799
+
800
+ def handle_suppress_resume_claude(
801
+ session_id: str,
802
+ project_path: str,
803
+ tools: Optional[str],
804
+ threshold: int,
805
+ trim_assistant_messages: Optional[int] = None,
806
+ claude_home: Optional[str] = None,
807
+ ) -> str | None:
808
+ """
809
+ Suppress tool results and resume Claude Code session.
810
+
811
+ Returns:
812
+ 'back' if user wants to go back to menu, None otherwise.
813
+ """
814
+ session_file = Path(get_session_file_path(session_id, project_path, claude_home))
815
+
816
+ print(f"\n🔧 Trimming session...")
817
+
818
+ # Parse tools into set if provided
819
+ target_tools = None
820
+ if tools:
821
+ target_tools = {tool.strip().lower() for tool in tools.split(",")}
822
+
823
+ try:
824
+ # Use helper function to trim and create new session
825
+ result = trim_and_create_session(
826
+ "claude",
827
+ session_file,
828
+ target_tools,
829
+ threshold,
830
+ trim_assistant_messages=trim_assistant_messages
831
+ )
832
+ except Exception as e:
833
+ print(f"❌ Error trimming session: {e}")
834
+ return None
835
+
836
+ # Check if nothing to trim (savings below threshold)
837
+ from claude_code_tools.node_menu_ui import run_trim_confirm_ui
838
+ if result.get("nothing_to_trim"):
839
+ print(f" Savings too small ({result['tokens_saved']} tokens)")
840
+ action = run_trim_confirm_ui(
841
+ nothing_to_trim=True,
842
+ original_session_id=session_id,
843
+ )
844
+ if action == 'resume':
845
+ resume_session(session_id, project_path, claude_home=claude_home)
846
+ return None
847
+ return 'back'
848
+
849
+ new_session_id = result["session_id"]
850
+ new_session_file = Path(result["output_file"])
851
+
852
+ # Calculate total lines trimmed for confirmation UI
853
+ total_trimmed = result['num_tools_trimmed'] + result['num_assistant_trimmed']
854
+
855
+ # Show confirmation UI
856
+ action = run_trim_confirm_ui(
857
+ new_session_id=new_session_id,
858
+ lines_trimmed=total_trimmed,
859
+ tokens_saved=result['tokens_saved'],
860
+ output_file=str(new_session_file),
861
+ )
862
+
863
+ if action == 'resume':
864
+ # Resume the new session
865
+ resume_session(new_session_id, project_path, claude_home=claude_home)
866
+ return None
867
+ elif action == 'delete':
868
+ # Delete the new session file and go back to menu
869
+ new_session_file.unlink(missing_ok=True)
870
+ print(f"\n🗑️ Deleted session file: {new_session_file.name}")
871
+ return 'back'
872
+ else:
873
+ # Cancel (escape) - keep file, go back to menu
874
+ print(f"\n📁 Session file kept: {new_session_file}")
875
+ print(f" Session ID: {new_session_id}")
876
+ return 'back'
877
+
878
+
879
+ def handle_smart_trim_resume_claude(
880
+ session_id: str,
881
+ project_path: str,
882
+ claude_home: Optional[str] = None,
883
+ custom_instructions: Optional[str] = None,
884
+ ) -> str | None:
885
+ """
886
+ Smart trim session using parallel agents and resume Claude Code session.
887
+
888
+ Args:
889
+ session_id: Session ID to trim
890
+ project_path: Project path
891
+ claude_home: Optional custom Claude home directory
892
+ custom_instructions: Optional custom instructions for the trim agents
893
+
894
+ Returns:
895
+ 'back' if user wants to go back to menu, None otherwise.
896
+ """
897
+ import uuid
898
+
899
+ session_file = Path(get_session_file_path(session_id, project_path, claude_home))
900
+
901
+ print(f"\n🤖 Smart trimming session using Claude CLI...")
902
+ if custom_instructions:
903
+ print(f" Instructions: {custom_instructions[:60]}...")
904
+ print(f" This may take a minute as Claude analyzes the session...")
905
+
906
+ try:
907
+ # Identify trimmable lines using CLI with parallel sub-agents
908
+ trimmable = identify_trimmable_lines_cli(
909
+ session_file,
910
+ exclude_types=[],
911
+ preserve_recent=10,
912
+ custom_instructions=custom_instructions,
913
+ )
914
+
915
+ if not trimmable:
916
+ # Show confirmation for "nothing to trim" case
917
+ from claude_code_tools.node_menu_ui import run_trim_confirm_ui
918
+ action = run_trim_confirm_ui(
919
+ nothing_to_trim=True,
920
+ original_session_id=session_id,
921
+ )
922
+
923
+ if action == 'resume':
924
+ resume_session(session_id, project_path, claude_home=claude_home)
925
+ return None
926
+ # 'back' or 'cancel' - return signal to go back to menu
927
+ return 'back'
928
+
929
+ print(f" Found {len(trimmable)} lines to trim")
930
+
931
+ # Extract line indices and descriptions from verbose tuples
932
+ # trimmable is list of (line_idx, rationale, description) tuples
933
+ line_indices = [item[0] for item in trimmable]
934
+ descriptions = {
935
+ item[0]: item[2] for item in trimmable if len(item) > 2 and item[2]
936
+ }
937
+
938
+ # Generate new session ID
939
+ new_session_id = str(uuid.uuid4())
940
+
941
+ # Create output path
942
+ output_file = session_file.parent / f"{new_session_id}.jsonl"
943
+
944
+ # Perform trimming
945
+ stats = trim_lines(
946
+ session_file, line_indices, output_file, descriptions=descriptions
947
+ )
948
+
949
+ # Check if savings are worth it (minimum 300 tokens)
950
+ MIN_TOKEN_SAVINGS = 300
951
+ if stats['tokens_saved'] < MIN_TOKEN_SAVINGS:
952
+ # Not worth trimming - delete output and show nothing to trim
953
+ output_file.unlink(missing_ok=True)
954
+ print(f" Savings too small ({stats['tokens_saved']} tokens < {MIN_TOKEN_SAVINGS})")
955
+ print(f" (Diagnostic file: .claude/trim-result-{session_id}.jsonl)")
956
+ from claude_code_tools.node_menu_ui import run_trim_confirm_ui
957
+ action = run_trim_confirm_ui(
958
+ nothing_to_trim=True,
959
+ original_session_id=session_id,
960
+ )
961
+ if action == 'resume':
962
+ resume_session(session_id, project_path, claude_home=claude_home)
963
+ return None
964
+ return 'back'
965
+
966
+ # Show confirmation UI
967
+ from claude_code_tools.node_menu_ui import run_trim_confirm_ui
968
+ action = run_trim_confirm_ui(
969
+ new_session_id=new_session_id,
970
+ lines_trimmed=stats['num_lines_trimmed'],
971
+ tokens_saved=stats['tokens_saved'],
972
+ output_file=str(output_file),
973
+ )
974
+
975
+ if action == 'resume':
976
+ # Resume the new session
977
+ resume_session(new_session_id, project_path, claude_home=claude_home)
978
+ return None
979
+ elif action == 'delete':
980
+ # Delete the new session file and go back to menu
981
+ output_file.unlink(missing_ok=True)
982
+ print(f"\n🗑️ Deleted session file: {output_file.name}")
983
+ return 'back'
984
+ else:
985
+ # Cancel (escape) - keep file, go back to menu
986
+ print(f"\n📁 Session file kept: {output_file}")
987
+ print(f" Session ID: {new_session_id}")
988
+ return 'back'
989
+
990
+ except Exception as e:
991
+ print(f"❌ Error during smart trim: {e}")
992
+ import traceback
993
+ traceback.print_exc()
994
+ return None
995
+
996
+
997
+ def show_action_menu(session_info: Tuple[str, float, float, int, str, str, str, Optional[str]]) -> Optional[str]:
998
+ """
999
+ Show action menu for selected session.
1000
+
1001
+ Returns: action choice ('resume', 'path', 'copy') or None if cancelled
1002
+ """
1003
+ session_id, _, _, _, project_name, _, project_path, git_branch, _, is_sidechain = session_info
1004
+
1005
+ return menu_show_action_menu(
1006
+ session_id=session_id,
1007
+ agent="claude",
1008
+ project_name=project_name,
1009
+ git_branch=git_branch,
1010
+ is_sidechain=is_sidechain,
1011
+ stderr_mode=False,
1012
+ )
1013
+
1014
+
1015
+ def get_session_file_path(
1016
+ session_id: str, project_path: str, claude_home: Optional[str] = None
1017
+ ) -> str:
1018
+ """Get the full file path for a session.
1019
+
1020
+ Supports both full and partial session IDs. If an exact match isn't found,
1021
+ searches for sessions containing the given ID string.
1022
+
1023
+ Args:
1024
+ session_id: Full or partial session UUID
1025
+ project_path: Project working directory path
1026
+ claude_home: Optional custom Claude home directory
1027
+
1028
+ Returns:
1029
+ Full path to the session file
1030
+
1031
+ Raises:
1032
+ FileNotFoundError: If session cannot be found
1033
+ ValueError: If partial ID matches multiple sessions
1034
+ """
1035
+ base_dir = get_claude_home(claude_home)
1036
+ encoded_path = encode_claude_project_path(project_path)
1037
+ claude_project_dir = base_dir / "projects" / encoded_path
1038
+
1039
+ # Try exact match first (fast path)
1040
+ exact_path = claude_project_dir / f"{session_id}.jsonl"
1041
+ if exact_path.exists():
1042
+ return str(exact_path)
1043
+
1044
+ # If project directory doesn't exist, return constructed path
1045
+ # (maintains backward compatibility - caller can handle non-existent path)
1046
+ if not claude_project_dir.exists():
1047
+ return str(exact_path)
1048
+
1049
+ # Search for partial matches in the project directory
1050
+ matches = []
1051
+ for jsonl_file in claude_project_dir.glob("*.jsonl"):
1052
+ if session_id in jsonl_file.stem:
1053
+ matches.append(jsonl_file)
1054
+
1055
+ if len(matches) == 0:
1056
+ # No partial matches found, return constructed path
1057
+ return str(exact_path)
1058
+ elif len(matches) == 1:
1059
+ return str(matches[0])
1060
+ else:
1061
+ match_list = "\n ".join(str(m.name) for m in matches)
1062
+ raise ValueError(
1063
+ f"Multiple sessions match '{session_id}':\n {match_list}\n"
1064
+ f"Please use a more specific session ID."
1065
+ )
1066
+
1067
+
1068
+ def handle_export_session(session_file_path: str, dest_override: str | None = None, silent: bool = False) -> None:
1069
+ """Export session to text file."""
1070
+ from claude_code_tools.export_claude_session import export_session_to_markdown as do_export
1071
+ from datetime import datetime
1072
+
1073
+ try:
1074
+ # Generate default export path using session's project directory
1075
+ session_file = Path(session_file_path)
1076
+ session_id = session_file.stem
1077
+ today = datetime.now().strftime("%Y%m%d")
1078
+
1079
+ # Infer project directory from session metadata
1080
+ project_dir = extract_cwd_from_session(session_file)
1081
+ if project_dir:
1082
+ output_dir = Path(project_dir) / "exported-sessions"
1083
+ else:
1084
+ output_dir = Path.cwd() / "exported-sessions"
1085
+
1086
+ default_path = output_dir / f"{today}-claude-session-{session_id}.txt"
1087
+
1088
+ if dest_override is None:
1089
+ print(f"\nDefault export path: {default_path}")
1090
+ dest = input("Path (or Enter for default): ").strip()
1091
+ if not dest:
1092
+ dest_path = default_path
1093
+ else:
1094
+ dest_path = Path(dest).expanduser()
1095
+
1096
+ # Force .txt extension
1097
+ if dest_path.suffix != ".txt":
1098
+ dest_path = dest_path.with_suffix(".txt")
1099
+ else:
1100
+ dest_path = Path(dest_override).expanduser()
1101
+ if dest_path.suffix != ".txt":
1102
+ dest_path = dest_path.with_suffix(".txt")
1103
+
1104
+ # Create parent directory if needed
1105
+ dest_path.parent.mkdir(parents=True, exist_ok=True)
1106
+
1107
+ # Export to text file
1108
+ print(f"\n📄 Exporting session...")
1109
+ with open(dest_path, 'w') as f:
1110
+ stats = do_export(Path(session_file_path), f, verbose=False)
1111
+
1112
+ if not silent:
1113
+ print(f"✅ Export complete!")
1114
+ print(f" User messages: {stats['user_messages']}")
1115
+ print(f" Assistant messages: {stats['assistant_messages']}")
1116
+ print(f" Tool calls: {stats['tool_calls']}")
1117
+ print(f" Tool results: {stats['tool_results']}")
1118
+ print(f" Skipped items: {stats['skipped']}")
1119
+ print(f"\n📄 Exported to: {dest_path}")
1120
+
1121
+ except Exception as e:
1122
+ print(f"\nError exporting session: {e}")
1123
+
1124
+
1125
+ def copy_session_file(session_file_path: str, dest_override: str | None = None, silent: bool = False) -> None:
1126
+ """Copy session file to user-specified file or directory."""
1127
+ try:
1128
+ if dest_override is None:
1129
+ dest = input("\nEnter destination file or directory path: ").strip()
1130
+ if not dest:
1131
+ print("Cancelled.")
1132
+ return
1133
+ else:
1134
+ dest = dest_override
1135
+
1136
+ dest_path = Path(dest).expanduser()
1137
+ source = Path(session_file_path)
1138
+
1139
+ # Determine if destination is a directory or file
1140
+ if dest_path.exists():
1141
+ if dest_path.is_dir():
1142
+ # Copy into directory with original filename
1143
+ dest_file = dest_path / source.name
1144
+ else:
1145
+ # Copy to specified file
1146
+ dest_file = dest_path
1147
+ else:
1148
+ # Destination doesn't exist - check if it looks like a directory
1149
+ if dest.endswith('/') or dest.endswith(os.sep):
1150
+ # Treat as directory - create it
1151
+ create = input(f"Directory {dest_path} does not exist. Create it? [y/N]: ").strip().lower()
1152
+ if create in ('y', 'yes'):
1153
+ dest_path.mkdir(parents=True, exist_ok=True)
1154
+ dest_file = dest_path / source.name
1155
+ else:
1156
+ print("Cancelled.")
1157
+ return
1158
+ else:
1159
+ # Treat as file - create parent directory if needed
1160
+ parent = dest_path.parent
1161
+ if not parent.exists():
1162
+ create = input(f"Parent directory {parent} does not exist. Create it? [y/N]: ").strip().lower()
1163
+ if create in ('y', 'yes'):
1164
+ parent.mkdir(parents=True, exist_ok=True)
1165
+ else:
1166
+ print("Cancelled.")
1167
+ return
1168
+ dest_file = dest_path
1169
+
1170
+ import shutil
1171
+ shutil.copy2(source, dest_file)
1172
+ if not silent:
1173
+ print(f"\nCopied to: {dest_file}")
1174
+
1175
+ except KeyboardInterrupt:
1176
+ print("\nCancelled.")
1177
+ except Exception as e:
1178
+ print(f"\nError copying file: {e}")
1179
+
1180
+
1181
+ def clone_session(session_id: str, project_path: str, shell_mode: bool = False, claude_home: Optional[str] = None):
1182
+ """Clone a Claude session to a new file with new UUID and resume it."""
1183
+ import shutil
1184
+ import uuid
1185
+
1186
+ # Get the original session file path
1187
+ source_path = Path(get_session_file_path(session_id, project_path, claude_home))
1188
+
1189
+ if not source_path.exists():
1190
+ print(f"\nError: Session file not found: {source_path}")
1191
+ return
1192
+
1193
+ # Generate new UUID for cloned session
1194
+ new_session_id = str(uuid.uuid4())
1195
+
1196
+ # Create destination path with new UUID in same directory
1197
+ dest_path = source_path.parent / f"{new_session_id}.jsonl"
1198
+
1199
+ try:
1200
+ # Copy the file
1201
+ shutil.copy2(source_path, dest_path)
1202
+
1203
+ # Update sessionId in all lines to match the new filename UUID
1204
+ from claude_code_tools.trim_session import update_session_id_in_file
1205
+ update_session_id_in_file(dest_path, new_session_id, agent="claude")
1206
+
1207
+ if not shell_mode:
1208
+ print(f"\nCloned session:")
1209
+ print(f" Original: {session_id}")
1210
+ print(f" New: {new_session_id}")
1211
+ print(f"\nResuming cloned session...")
1212
+
1213
+ # Resume the new cloned session
1214
+ resume_session(new_session_id, project_path, shell_mode=shell_mode, claude_home=claude_home)
1215
+
1216
+ except Exception as e:
1217
+ print(f"\nError cloning session: {e}")
1218
+ return
1219
+
1220
+
1221
+ def resume_session(session_id: str, project_path: str, shell_mode: bool = False, claude_home: Optional[str] = None):
1222
+ """Resume a Claude session using claude -r command."""
1223
+ current_dir = os.getcwd()
1224
+
1225
+ # In shell mode, output commands for the shell to evaluate
1226
+ if shell_mode:
1227
+ if project_path != current_dir:
1228
+ print(f'cd {shlex.quote(project_path)}')
1229
+ # Set CLAUDE_CONFIG_DIR environment variable if custom path specified
1230
+ # (either via CLI arg or already set via env var)
1231
+ if claude_home or os.environ.get('CLAUDE_CONFIG_DIR'):
1232
+ expanded_home = str(get_claude_home(claude_home).absolute())
1233
+ print(f'CLAUDE_CONFIG_DIR={shlex.quote(expanded_home)} claude -r {shlex.quote(session_id)}')
1234
+ else:
1235
+ print(f'claude -r {shlex.quote(session_id)}')
1236
+ return
1237
+
1238
+ # Check if we need to change directory
1239
+ change_dir = False
1240
+ if project_path != current_dir:
1241
+ if RICH_AVAILABLE and console:
1242
+ console.print(f"\n[yellow]This session is from a different project:[/yellow]")
1243
+ console.print(f" Current directory: {current_dir}")
1244
+ console.print(f" Session directory: {project_path}")
1245
+
1246
+ if Confirm.ask("\nChange to the session's directory?", default=True):
1247
+ change_dir = True
1248
+ else:
1249
+ console.print("[yellow]Staying in current directory. Session resume may fail.[/yellow]")
1250
+ else:
1251
+ print(f"\nThis session is from a different project:")
1252
+ print(f" Current directory: {current_dir}")
1253
+ print(f" Session directory: {project_path}")
1254
+
1255
+ response = input("\nChange to the session's directory? [Y/n]: ").strip().lower()
1256
+ if response != 'n':
1257
+ change_dir = True
1258
+ else:
1259
+ print("Staying in current directory. Session resume may fail.")
1260
+
1261
+ if RICH_AVAILABLE and console:
1262
+ console.print(f"\n[green]Resuming session:[/green] {session_id}")
1263
+ if change_dir:
1264
+ console.print("\n[yellow]Note:[/yellow] To persist directory changes, use this shell function:")
1265
+ console.print("[dim]fcs() { eval $(find-claude-session --shell \"$@\"); }[/dim]")
1266
+ console.print("Then use [bold]fcs[/bold] instead of [bold]find-claude-session[/bold]\n")
1267
+ else:
1268
+ print(f"\nResuming session: {session_id}")
1269
+ if change_dir:
1270
+ print("\nNote: To persist directory changes, use this shell function:")
1271
+ print("fcs() { eval $(find-claude-session --shell \"$@\"); }")
1272
+ print("Then use 'fcs' instead of 'find-claude-session'\n")
1273
+
1274
+ try:
1275
+ # Change directory if needed (won't persist after exit)
1276
+ if change_dir and project_path != current_dir:
1277
+ os.chdir(project_path)
1278
+
1279
+ # Set CLAUDE_CONFIG_DIR environment variable if custom path specified
1280
+ # (either via CLI arg or already set via env var)
1281
+ if claude_home or os.environ.get('CLAUDE_CONFIG_DIR'):
1282
+ # Get the resolved home directory (respects precedence)
1283
+ expanded_home = str(get_claude_home(claude_home).absolute())
1284
+ os.environ['CLAUDE_CONFIG_DIR'] = expanded_home
1285
+
1286
+ # Execute claude
1287
+ os.execvp("claude", ["claude", "-r", session_id])
1288
+
1289
+ except FileNotFoundError:
1290
+ if RICH_AVAILABLE and console:
1291
+ console.print("[red]Error:[/red] 'claude' command not found. Make sure Claude CLI is installed.")
1292
+ else:
1293
+ print("Error: 'claude' command not found. Make sure Claude CLI is installed.", file=sys.stderr)
1294
+ sys.exit(1)
1295
+ except Exception as e:
1296
+ if RICH_AVAILABLE and console:
1297
+ console.print(f"[red]Error:[/red] {e}")
1298
+ else:
1299
+ print(f"Error: {e}", file=sys.stderr)
1300
+ sys.exit(1)
1301
+
1302
+
1303
+ def create_action_handler(claude_home: Optional[str] = None, nonlaunch_flag: Optional[dict] = None):
1304
+ """
1305
+ Create an action handler function for TUI/UI integration.
1306
+
1307
+ Args:
1308
+ claude_home: Optional Claude home directory
1309
+
1310
+ Returns:
1311
+ Function that handles session actions
1312
+ """
1313
+ def handle_session_action(
1314
+ session: Tuple, action: str, kwargs: Optional[dict] = None
1315
+ ) -> None:
1316
+ """Handle actions for a selected session."""
1317
+ kwargs = kwargs or {}
1318
+
1319
+ if isinstance(session, dict):
1320
+ session_id = session.get("session_id")
1321
+ project_path = session.get("cwd")
1322
+ else:
1323
+ session_id = session[0]
1324
+ project_path = session[6]
1325
+
1326
+ if action == "resume":
1327
+ resume_session(session_id, project_path, shell_mode=False, claude_home=claude_home)
1328
+ elif action == "suppress_resume":
1329
+ tools = kwargs.get("tools")
1330
+ threshold = kwargs.get("threshold")
1331
+ trim_assistant = kwargs.get("trim_assistant")
1332
+ if tools is None and threshold is None and trim_assistant is None:
1333
+ options = prompt_suppress_options()
1334
+ if not options:
1335
+ return
1336
+ tools, threshold, trim_assistant = options
1337
+ handle_suppress_resume_claude(
1338
+ session_id, project_path, tools, threshold or 500, trim_assistant, claude_home
1339
+ )
1340
+ elif action == "smart_trim_resume":
1341
+ handle_smart_trim_resume_claude(session_id, project_path, claude_home)
1342
+ elif action == "path":
1343
+ # handled in Node UI via RPC
1344
+ if nonlaunch_flag is not None:
1345
+ nonlaunch_flag["done"] = True
1346
+ nonlaunch_flag["session_id"] = session_id
1347
+ elif action == "copy":
1348
+ if nonlaunch_flag is not None:
1349
+ nonlaunch_flag["done"] = True
1350
+ nonlaunch_flag["session_id"] = session_id
1351
+ elif action == "clone":
1352
+ clone_session(session_id, project_path, shell_mode=False, claude_home=claude_home)
1353
+ elif action == "export":
1354
+ session_file_path = get_session_file_path(session_id, project_path, claude_home)
1355
+ handle_export_session(session_file_path)
1356
+ if nonlaunch_flag is not None:
1357
+ nonlaunch_flag["done"] = True
1358
+ nonlaunch_flag["session_id"] = session_id
1359
+ elif action == "continue":
1360
+ from claude_code_tools.session_utils import continue_with_options
1361
+ session_file_path = get_session_file_path(session_id, project_path, claude_home)
1362
+ continue_with_options(
1363
+ session_file_path,
1364
+ "claude",
1365
+ claude_home=claude_home,
1366
+ codex_home=None
1367
+ )
1368
+
1369
+ return handle_session_action
1370
+
1371
+
1372
+ def main():
1373
+ parser = argparse.ArgumentParser(
1374
+ description="Search Claude Code session files by keywords",
1375
+ formatter_class=argparse.RawDescriptionHelpFormatter,
1376
+ epilog="""
1377
+ Examples:
1378
+ find-claude-session "langroid"
1379
+ find-claude-session "langroid,MCP"
1380
+ find-claude-session "error,TypeError,function" --global
1381
+ find-claude-session "bug fix" -g
1382
+
1383
+ To persist directory changes when resuming sessions:
1384
+ Add this to your shell config (.bashrc/.zshrc):
1385
+ fcs() { eval $(find-claude-session --shell "$@"); }
1386
+
1387
+ Then use: fcs "keyword" -g
1388
+ """
1389
+ )
1390
+ parser.add_argument(
1391
+ "keywords",
1392
+ nargs='?',
1393
+ default="",
1394
+ help="Comma-separated keywords to search for (case-insensitive). If omitted, shows all sessions."
1395
+ )
1396
+ parser.add_argument(
1397
+ "-g", "--global",
1398
+ action="store_true",
1399
+ help="Search across all Claude projects, not just the current one"
1400
+ )
1401
+ parser.add_argument(
1402
+ "-n", "--num-matches",
1403
+ type=int,
1404
+ default=10,
1405
+ help="Number of matching sessions to display (default: 10)"
1406
+ )
1407
+ parser.add_argument(
1408
+ "--shell",
1409
+ action="store_true",
1410
+ help="Output shell commands for evaluation (for use with shell function)"
1411
+ )
1412
+ parser.add_argument(
1413
+ "--claude-home",
1414
+ type=str,
1415
+ help="Path to Claude home directory (default: ~/.claude)"
1416
+ )
1417
+ parser.add_argument(
1418
+ "--original",
1419
+ action="store_true",
1420
+ help="Show only original sessions (excludes trimmed, continued, and sub-agent sessions)"
1421
+ )
1422
+ parser.add_argument(
1423
+ "--no-sub",
1424
+ action="store_true",
1425
+ help="Exclude sub-agent sessions from results"
1426
+ )
1427
+ parser.add_argument(
1428
+ "--no-trim",
1429
+ action="store_true",
1430
+ help="Exclude trimmed sessions from results"
1431
+ )
1432
+ parser.add_argument(
1433
+ "--no-roll",
1434
+ dest="no_cont", # Keep internal name for compatibility
1435
+ action="store_true",
1436
+ help="Exclude rollover sessions from results"
1437
+ )
1438
+ parser.add_argument(
1439
+ "--simple-ui",
1440
+ dest="simple_ui",
1441
+ action="store_true",
1442
+ help="Use simple Rich table UI instead of Node interactive UI"
1443
+ )
1444
+ parser.add_argument(
1445
+ "--min-lines",
1446
+ type=int,
1447
+ default=0,
1448
+ help="Only show sessions with at least this many lines (default: 0 = no minimum)"
1449
+ )
1450
+ parser.add_argument(
1451
+ "--before",
1452
+ type=str,
1453
+ help="Only show sessions modified before this time (inclusive). "
1454
+ "Formats: YYYYMMDD, YYYY-MM-DD, MM/DD/YY, with optional T or space + HH:MM:SS",
1455
+ )
1456
+ parser.add_argument(
1457
+ "--after",
1458
+ type=str,
1459
+ help="Only show sessions modified after this time (inclusive). "
1460
+ "Formats: YYYYMMDD, YYYY-MM-DD, MM/DD/YY, with optional T or space + HH:MM:SS",
1461
+ )
1462
+ parser.add_argument(
1463
+ "--no-ui",
1464
+ action="store_true",
1465
+ help="Skip interactive options menu and run search directly with CLI args",
1466
+ )
1467
+
1468
+ args = parser.parse_args()
1469
+
1470
+ # Show interactive options UI unless --no-ui or --simple-ui
1471
+ if not args.no_ui and not args.simple_ui:
1472
+ initial_options = {
1473
+ "keywords": args.keywords or "",
1474
+ "global": getattr(args, 'global', False),
1475
+ "num_matches": args.num_matches,
1476
+ "original": args.original,
1477
+ "no_sub": args.no_sub,
1478
+ "no_trim": args.no_trim,
1479
+ "no_cont": args.no_cont,
1480
+ "min_lines": args.min_lines or "",
1481
+ "before": args.before or "",
1482
+ "after": args.after or "",
1483
+ }
1484
+ opts = run_find_options_ui(initial_options, variant="find-claude")
1485
+ if opts is None:
1486
+ sys.exit(0)
1487
+ # Update args with user's selections
1488
+ args.keywords = opts.get("keywords") or ""
1489
+ setattr(args, 'global', opts.get("global", False))
1490
+ args.num_matches = opts.get("num_matches", 10)
1491
+ args.original = opts.get("original", False)
1492
+ args.no_sub = opts.get("no_sub", False)
1493
+ args.no_trim = opts.get("no_trim", False)
1494
+ args.no_cont = opts.get("no_cont", False)
1495
+ args.min_lines = opts.get("min_lines") or 0
1496
+ args.before = opts.get("before")
1497
+ args.after = opts.get("after")
1498
+
1499
+ # Build and display equivalent CLI command
1500
+ cmd_parts = ["aichat find-claude"]
1501
+ if args.keywords:
1502
+ cmd_parts.append(f'"{args.keywords}"')
1503
+ if getattr(args, 'global'):
1504
+ cmd_parts.append("-g")
1505
+ if args.num_matches != 10:
1506
+ cmd_parts.append(f"-n {args.num_matches}")
1507
+ if args.original:
1508
+ cmd_parts.append("--original")
1509
+ if args.no_sub:
1510
+ cmd_parts.append("--no-sub")
1511
+ if args.no_trim:
1512
+ cmd_parts.append("--no-trim")
1513
+ if args.no_cont:
1514
+ cmd_parts.append("--no-roll")
1515
+ if args.min_lines:
1516
+ cmd_parts.append(f"--min-lines {args.min_lines}")
1517
+ if args.before:
1518
+ cmd_parts.append(f"--before {args.before}")
1519
+ if args.after:
1520
+ cmd_parts.append(f"--after {args.after}")
1521
+ cmd_parts.append("--no-ui")
1522
+ print(f"\n→ {' '.join(cmd_parts)}\n", file=sys.stderr)
1523
+
1524
+ # Parse keywords
1525
+ keywords = [k.strip() for k in args.keywords.split(",") if k.strip()] if args.keywords else []
1526
+
1527
+ # Display informational message about what session types are being shown
1528
+ if args.original:
1529
+ print("Showing: Original sessions only (excluding trimmed, rollover, and sub-agent sessions)", file=sys.stderr)
1530
+ else:
1531
+ # Build list of included/excluded types
1532
+ excluded_types = []
1533
+ if args.no_sub:
1534
+ excluded_types.append("sub-agent")
1535
+ if args.no_trim:
1536
+ excluded_types.append("trimmed")
1537
+ if args.no_cont:
1538
+ excluded_types.append("rollover")
1539
+
1540
+ if excluded_types:
1541
+ excluded_str = ", ".join(excluded_types)
1542
+ print(f"Showing: All sessions except {excluded_str}", file=sys.stderr)
1543
+ else:
1544
+ print("Showing: All session types (original, trimmed, rollover, and sub-agent)", file=sys.stderr)
1545
+ print("Tip: Use --no-sub, --no-trim, or --no-roll to exclude specific types", file=sys.stderr)
1546
+ print(file=sys.stderr) # Blank line for readability
1547
+
1548
+ # Check if searching current project only
1549
+ if not getattr(args, 'global'):
1550
+ claude_dir = get_claude_project_dir(args.claude_home)
1551
+
1552
+ if not claude_dir.exists():
1553
+ print(f"No Claude project directory found for: {os.getcwd()}", file=sys.stderr)
1554
+ print(f"Expected directory: {claude_dir}", file=sys.stderr)
1555
+ sys.exit(1)
1556
+
1557
+ # Find matching sessions
1558
+ matching_sessions = find_sessions(
1559
+ keywords,
1560
+ global_search=getattr(args, 'global'),
1561
+ claude_home=args.claude_home,
1562
+ original_only=args.original,
1563
+ no_sub=args.no_sub,
1564
+ no_trim=args.no_trim,
1565
+ no_cont=args.no_cont,
1566
+ )
1567
+
1568
+ # Filter by minimum lines if specified (line_count is at index 3 in tuple)
1569
+ if args.min_lines > 0:
1570
+ matching_sessions = [s for s in matching_sessions if s[3] >= args.min_lines]
1571
+
1572
+ # Filter by time bounds if specified (mod_time is at index 1 in tuple)
1573
+ if args.before or args.after:
1574
+ matching_sessions = filter_sessions_by_time(
1575
+ matching_sessions, before=args.before, after=args.after, time_index=1
1576
+ )
1577
+
1578
+ if not matching_sessions:
1579
+ scope = "all projects" if getattr(args, 'global') else "current project"
1580
+ keyword_msg = f" containing all keywords: {', '.join(keywords)}" if keywords else ""
1581
+ if RICH_AVAILABLE and console and not args.shell:
1582
+ console.print(f"[yellow]No sessions found{keyword_msg} in {scope}[/yellow]")
1583
+ else:
1584
+ print(f"No sessions found{keyword_msg} in {scope}", file=sys.stderr)
1585
+ sys.exit(0)
1586
+
1587
+ # ============================================================
1588
+ # Default: Node UI (rich interactive interface)
1589
+ # --simple-ui: Falls back to Rich table UI
1590
+ # ============================================================
1591
+ nonlaunch_flag = {"done": False}
1592
+ action_handler = create_action_handler(args.claude_home, nonlaunch_flag=nonlaunch_flag)
1593
+ rpc_path = str(Path(__file__).parent / "action_rpc.py")
1594
+
1595
+ if not args.simple_ui:
1596
+ limited = [
1597
+ {
1598
+ "agent": "claude",
1599
+ "agent_display": "Claude",
1600
+ "session_id": s[0],
1601
+ "mod_time": s[1],
1602
+ "create_time": s[2],
1603
+ "lines": s[3],
1604
+ "project": s[4],
1605
+ "preview": s[5],
1606
+ "cwd": s[6],
1607
+ "branch": s[7] if len(s) > 7 else "",
1608
+ "file_path": get_session_file_path(s[0], s[6], args.claude_home),
1609
+ "claude_home": args.claude_home,
1610
+ "is_trimmed": s[8] if len(s) > 8 else False,
1611
+ "derivation_type": None,
1612
+ "is_sidechain": s[9] if len(s) > 9 else False,
1613
+ }
1614
+ for s in matching_sessions[: args.num_matches]
1615
+ ]
1616
+
1617
+ focus_id = None
1618
+ start_action = False
1619
+ while True:
1620
+ nonlaunch_flag["done"] = False
1621
+ run_node_menu_ui(
1622
+ limited,
1623
+ keywords,
1624
+ action_handler,
1625
+ stderr_mode=args.shell,
1626
+ focus_session_id=focus_id,
1627
+ start_action=start_action,
1628
+ rpc_path=rpc_path,
1629
+ )
1630
+ if nonlaunch_flag["done"]:
1631
+ choice = prompt_post_action()
1632
+ if choice == "back":
1633
+ focus_id = nonlaunch_flag.get("session_id")
1634
+ start_action = True
1635
+ continue
1636
+ break
1637
+ elif RICH_AVAILABLE and console:
1638
+ # Use Rich-based interactive UI
1639
+ selected_session = display_interactive_ui(matching_sessions, keywords, stderr_mode=args.shell, num_matches=args.num_matches)
1640
+ if selected_session:
1641
+ # Show action menu
1642
+ action = show_action_menu(selected_session)
1643
+ if not action:
1644
+ return
1645
+
1646
+ session_id = selected_session[0]
1647
+ project_path = selected_session[6] # Updated index after adding creation_time
1648
+
1649
+ # Perform selected action
1650
+ if action == "resume":
1651
+ resume_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
1652
+ elif action == "suppress_resume":
1653
+ # Prompt for suppress options
1654
+ options = prompt_suppress_options()
1655
+ if options:
1656
+ tools, threshold, trim_assistant = options
1657
+ handle_suppress_resume_claude(
1658
+ session_id, project_path, tools, threshold, trim_assistant, args.claude_home
1659
+ )
1660
+ elif action == "smart_trim_resume":
1661
+ # Smart trim using parallel agents
1662
+ handle_smart_trim_resume_claude(
1663
+ session_id, project_path, args.claude_home
1664
+ )
1665
+ elif action == "path":
1666
+ session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
1667
+ print(f"\nSession file path:")
1668
+ print(session_file_path)
1669
+ elif action == "copy":
1670
+ session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
1671
+ copy_session_file(session_file_path)
1672
+ elif action == "clone":
1673
+ clone_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
1674
+ elif action == "export":
1675
+ session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
1676
+ handle_export_session(session_file_path)
1677
+ elif action == "continue":
1678
+ # Continue with context in fresh session
1679
+ from claude_code_tools.session_utils import continue_with_options
1680
+ session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
1681
+ continue_with_options(
1682
+ session_file_path,
1683
+ "claude",
1684
+ claude_home=args.claude_home,
1685
+ codex_home=None
1686
+ )
1687
+ else:
1688
+ # Fallback: print session IDs as before
1689
+ if not args.shell:
1690
+ print("\nMatching sessions:")
1691
+ for idx, (session_id, mod_time, create_time, line_count, project_name, preview, project_path, git_branch) in enumerate(matching_sessions[:args.num_matches], 1):
1692
+ create_date = datetime.fromtimestamp(create_time).strftime('%m/%d')
1693
+ mod_date = datetime.fromtimestamp(mod_time).strftime('%m/%d %H:%M')
1694
+ date_display = f"{create_date} - {mod_date}"
1695
+ branch_display = git_branch if git_branch else "N/A"
1696
+ if getattr(args, 'global'):
1697
+ print(f"{idx}. {session_id} | {project_name} | {branch_display} | {date_display} | {line_count} lines", file=sys.stderr if args.shell else sys.stdout)
1698
+ else:
1699
+ print(f"{idx}. {session_id} | {branch_display} | {date_display} | {line_count} lines", file=sys.stderr if args.shell else sys.stdout)
1700
+
1701
+ if len(matching_sessions) > args.num_matches:
1702
+ print(f"\n... and {len(matching_sessions) - args.num_matches} more sessions", file=sys.stderr if args.shell else sys.stdout)
1703
+
1704
+ # Simple selection without rich
1705
+ if len(matching_sessions) == 1:
1706
+ if not args.shell:
1707
+ print("\nOnly one match found. Resuming automatically...")
1708
+ session_id, _, _, _, _, _, project_path, _, _, _ = matching_sessions[0]
1709
+ resume_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
1710
+ else:
1711
+ try:
1712
+ if args.shell:
1713
+ # In shell mode, read from stdin but prompt to stderr
1714
+ sys.stderr.write("\nEnter number to resume session (or Ctrl+C to cancel): ")
1715
+ sys.stderr.flush()
1716
+ choice = sys.stdin.readline().strip()
1717
+ else:
1718
+ choice = input("\nEnter number to resume session (or Ctrl+C to cancel): ")
1719
+
1720
+ # Handle empty input or EOF
1721
+ if not choice:
1722
+ print("Cancelled (EOF)", file=sys.stderr)
1723
+ sys.exit(0)
1724
+
1725
+ idx = int(choice) - 1
1726
+ if 0 <= idx < min(args.num_matches, len(matching_sessions)):
1727
+ session_id, _, _, _, _, _, project_path, _, _, _ = matching_sessions[idx]
1728
+ resume_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
1729
+ else:
1730
+ print("Invalid choice", file=sys.stderr)
1731
+ sys.exit(1)
1732
+ except (KeyboardInterrupt, EOFError):
1733
+ print("\nCancelled", file=sys.stderr)
1734
+ sys.exit(0)
1735
+ except ValueError:
1736
+ print("Invalid input", file=sys.stderr)
1737
+ sys.exit(1)
1738
+
1739
+
1740
+ if __name__ == "__main__":
1741
+ main()