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