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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (1807) hide show
  1. claude_code_tools/__init__.py +3 -0
  2. claude_code_tools/action_rpc.py +403 -0
  3. claude_code_tools/aichat.py +1718 -0
  4. claude_code_tools/claude_continue.py +299 -0
  5. claude_code_tools/codex_continue.py +309 -0
  6. claude_code_tools/config.py +93 -0
  7. claude_code_tools/delete_session.py +194 -0
  8. claude_code_tools/dotenv_vault.py +268 -0
  9. claude_code_tools/env_safe.py +235 -0
  10. claude_code_tools/export_all.py +342 -0
  11. claude_code_tools/export_claude_session.py +481 -0
  12. claude_code_tools/export_codex_session.py +466 -0
  13. claude_code_tools/export_session.py +573 -0
  14. claude_code_tools/find_claude_session.py +1741 -0
  15. claude_code_tools/find_codex_session.py +1329 -0
  16. claude_code_tools/find_original_session.py +134 -0
  17. claude_code_tools/find_session.py +1086 -0
  18. claude_code_tools/find_trimmed_sessions.py +259 -0
  19. claude_code_tools/node_menu_ui.py +406 -0
  20. claude_code_tools/search_index.py +1247 -0
  21. claude_code_tools/session_lineage.py +260 -0
  22. claude_code_tools/session_menu.py +187 -0
  23. claude_code_tools/session_menu_cli.py +448 -0
  24. claude_code_tools/session_tui.py +516 -0
  25. claude_code_tools/session_utils.py +1313 -0
  26. claude_code_tools/smart_trim.py +424 -0
  27. claude_code_tools/smart_trim_core.py +616 -0
  28. claude_code_tools/tmux_cli_controller.py +928 -0
  29. claude_code_tools/tmux_remote_controller.py +229 -0
  30. claude_code_tools/trim_session.py +817 -0
  31. claude_code_tools/trim_session_claude.py +319 -0
  32. claude_code_tools/trim_session_codex.py +344 -0
  33. claude_code_tools-1.0.10.dist-info/METADATA +685 -0
  34. claude_code_tools-1.0.10.dist-info/RECORD +1807 -0
  35. claude_code_tools-1.0.10.dist-info/WHEEL +4 -0
  36. claude_code_tools-1.0.10.dist-info/entry_points.txt +5 -0
  37. claude_code_tools-1.0.10.dist-info/licenses/LICENSE +21 -0
  38. docs/cc-codex-instructions.md +37 -0
  39. docs/claude-code-chutes.md +138 -0
  40. docs/claude-code-tmux-tutorials.md +105 -0
  41. docs/dot-zshrc.md +307 -0
  42. docs/find-claude-session.md +149 -0
  43. docs/lmsh.md +70 -0
  44. docs/reddit-post.md +55 -0
  45. docs/tmux-cli-instructions.md +186 -0
  46. docs/vault-documentation.md +161 -0
  47. node_ui/action_config.js +72 -0
  48. node_ui/menu.js +2367 -0
  49. node_ui/node_modules/.bin/is-in-ci +5 -0
  50. node_ui/node_modules/.bin/loose-envify +16 -0
  51. node_ui/node_modules/.package-lock.json +714 -0
  52. node_ui/node_modules/@alcalzone/ansi-tokenize/README.md +248 -0
  53. node_ui/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.d.ts +11 -0
  54. node_ui/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.js +41 -0
  55. node_ui/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.js.map +1 -0
  56. node_ui/node_modules/@alcalzone/ansi-tokenize/build/diff.d.ts +6 -0
  57. node_ui/node_modules/@alcalzone/ansi-tokenize/build/diff.js +17 -0
  58. node_ui/node_modules/@alcalzone/ansi-tokenize/build/diff.js.map +1 -0
  59. node_ui/node_modules/@alcalzone/ansi-tokenize/build/index.d.ts +6 -0
  60. node_ui/node_modules/@alcalzone/ansi-tokenize/build/index.js +7 -0
  61. node_ui/node_modules/@alcalzone/ansi-tokenize/build/index.js.map +1 -0
  62. node_ui/node_modules/@alcalzone/ansi-tokenize/build/reduce.d.ts +5 -0
  63. node_ui/node_modules/@alcalzone/ansi-tokenize/build/reduce.js +27 -0
  64. node_ui/node_modules/@alcalzone/ansi-tokenize/build/reduce.js.map +1 -0
  65. node_ui/node_modules/@alcalzone/ansi-tokenize/build/styledChars.d.ts +6 -0
  66. node_ui/node_modules/@alcalzone/ansi-tokenize/build/styledChars.js +38 -0
  67. node_ui/node_modules/@alcalzone/ansi-tokenize/build/styledChars.js.map +1 -0
  68. node_ui/node_modules/@alcalzone/ansi-tokenize/build/tokenize.d.ts +12 -0
  69. node_ui/node_modules/@alcalzone/ansi-tokenize/build/tokenize.js +70 -0
  70. node_ui/node_modules/@alcalzone/ansi-tokenize/build/tokenize.js.map +1 -0
  71. node_ui/node_modules/@alcalzone/ansi-tokenize/build/undo.d.ts +3 -0
  72. node_ui/node_modules/@alcalzone/ansi-tokenize/build/undo.js +11 -0
  73. node_ui/node_modules/@alcalzone/ansi-tokenize/build/undo.js.map +1 -0
  74. node_ui/node_modules/@alcalzone/ansi-tokenize/package.json +63 -0
  75. node_ui/node_modules/ansi-escapes/base.d.ts +292 -0
  76. node_ui/node_modules/ansi-escapes/base.js +198 -0
  77. node_ui/node_modules/ansi-escapes/index.d.ts +2 -0
  78. node_ui/node_modules/ansi-escapes/index.js +2 -0
  79. node_ui/node_modules/ansi-escapes/license +9 -0
  80. node_ui/node_modules/ansi-escapes/package.json +70 -0
  81. node_ui/node_modules/ansi-escapes/readme.md +284 -0
  82. node_ui/node_modules/ansi-regex/index.d.ts +33 -0
  83. node_ui/node_modules/ansi-regex/index.js +14 -0
  84. node_ui/node_modules/ansi-regex/license +9 -0
  85. node_ui/node_modules/ansi-regex/package.json +61 -0
  86. node_ui/node_modules/ansi-regex/readme.md +66 -0
  87. node_ui/node_modules/ansi-styles/index.d.ts +236 -0
  88. node_ui/node_modules/ansi-styles/index.js +223 -0
  89. node_ui/node_modules/ansi-styles/license +9 -0
  90. node_ui/node_modules/ansi-styles/package.json +54 -0
  91. node_ui/node_modules/ansi-styles/readme.md +173 -0
  92. node_ui/node_modules/auto-bind/index.d.ts +50 -0
  93. node_ui/node_modules/auto-bind/index.js +41 -0
  94. node_ui/node_modules/auto-bind/license +9 -0
  95. node_ui/node_modules/auto-bind/package.json +51 -0
  96. node_ui/node_modules/auto-bind/react.d.ts +26 -0
  97. node_ui/node_modules/auto-bind/react.js +28 -0
  98. node_ui/node_modules/auto-bind/readme.md +92 -0
  99. node_ui/node_modules/chalk/license +9 -0
  100. node_ui/node_modules/chalk/package.json +83 -0
  101. node_ui/node_modules/chalk/readme.md +325 -0
  102. node_ui/node_modules/chalk/source/index.d.ts +320 -0
  103. node_ui/node_modules/chalk/source/index.js +225 -0
  104. node_ui/node_modules/chalk/source/utilities.js +33 -0
  105. node_ui/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
  106. node_ui/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
  107. node_ui/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
  108. node_ui/node_modules/chalk/source/vendor/supports-color/browser.js +30 -0
  109. node_ui/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
  110. node_ui/node_modules/chalk/source/vendor/supports-color/index.js +182 -0
  111. node_ui/node_modules/cli-boxes/boxes.json +82 -0
  112. node_ui/node_modules/cli-boxes/index.d.ts +127 -0
  113. node_ui/node_modules/cli-boxes/index.js +6 -0
  114. node_ui/node_modules/cli-boxes/license +9 -0
  115. node_ui/node_modules/cli-boxes/package.json +42 -0
  116. node_ui/node_modules/cli-boxes/readme.md +115 -0
  117. node_ui/node_modules/cli-cursor/index.d.ts +47 -0
  118. node_ui/node_modules/cli-cursor/index.js +39 -0
  119. node_ui/node_modules/cli-cursor/license +9 -0
  120. node_ui/node_modules/cli-cursor/package.json +49 -0
  121. node_ui/node_modules/cli-cursor/readme.md +51 -0
  122. node_ui/node_modules/cli-truncate/index.d.ts +116 -0
  123. node_ui/node_modules/cli-truncate/index.js +99 -0
  124. node_ui/node_modules/cli-truncate/license +9 -0
  125. node_ui/node_modules/cli-truncate/node_modules/slice-ansi/index.js +105 -0
  126. node_ui/node_modules/cli-truncate/node_modules/slice-ansi/license +10 -0
  127. node_ui/node_modules/cli-truncate/node_modules/slice-ansi/package.json +53 -0
  128. node_ui/node_modules/cli-truncate/node_modules/slice-ansi/readme.md +66 -0
  129. node_ui/node_modules/cli-truncate/package.json +51 -0
  130. node_ui/node_modules/cli-truncate/readme.md +150 -0
  131. node_ui/node_modules/code-excerpt/dist/index.d.ts +9 -0
  132. node_ui/node_modules/code-excerpt/dist/index.js +27 -0
  133. node_ui/node_modules/code-excerpt/license +21 -0
  134. node_ui/node_modules/code-excerpt/package.json +43 -0
  135. node_ui/node_modules/code-excerpt/readme.md +65 -0
  136. node_ui/node_modules/convert-to-spaces/dist/index.d.ts +2 -0
  137. node_ui/node_modules/convert-to-spaces/dist/index.js +4 -0
  138. node_ui/node_modules/convert-to-spaces/license +21 -0
  139. node_ui/node_modules/convert-to-spaces/package.json +40 -0
  140. node_ui/node_modules/convert-to-spaces/readme.md +39 -0
  141. node_ui/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
  142. node_ui/node_modules/emoji-regex/README.md +107 -0
  143. node_ui/node_modules/emoji-regex/index.d.ts +3 -0
  144. node_ui/node_modules/emoji-regex/index.js +4 -0
  145. node_ui/node_modules/emoji-regex/index.mjs +4 -0
  146. node_ui/node_modules/emoji-regex/package.json +45 -0
  147. node_ui/node_modules/environment/index.d.ts +74 -0
  148. node_ui/node_modules/environment/index.js +47 -0
  149. node_ui/node_modules/environment/license +9 -0
  150. node_ui/node_modules/environment/package.json +74 -0
  151. node_ui/node_modules/environment/readme.md +94 -0
  152. node_ui/node_modules/escape-string-regexp/index.d.ts +16 -0
  153. node_ui/node_modules/escape-string-regexp/index.js +11 -0
  154. node_ui/node_modules/escape-string-regexp/license +9 -0
  155. node_ui/node_modules/escape-string-regexp/package.json +40 -0
  156. node_ui/node_modules/escape-string-regexp/readme.md +34 -0
  157. node_ui/node_modules/figures/index.d.ts +269 -0
  158. node_ui/node_modules/figures/index.js +322 -0
  159. node_ui/node_modules/figures/license +9 -0
  160. node_ui/node_modules/figures/package.json +46 -0
  161. node_ui/node_modules/figures/readme.md +328 -0
  162. node_ui/node_modules/get-east-asian-width/index.d.ts +60 -0
  163. node_ui/node_modules/get-east-asian-width/index.js +30 -0
  164. node_ui/node_modules/get-east-asian-width/license +9 -0
  165. node_ui/node_modules/get-east-asian-width/lookup.js +403 -0
  166. node_ui/node_modules/get-east-asian-width/package.json +70 -0
  167. node_ui/node_modules/get-east-asian-width/readme.md +65 -0
  168. node_ui/node_modules/indent-string/index.d.ts +38 -0
  169. node_ui/node_modules/indent-string/index.js +38 -0
  170. node_ui/node_modules/indent-string/license +9 -0
  171. node_ui/node_modules/indent-string/package.json +40 -0
  172. node_ui/node_modules/indent-string/readme.md +73 -0
  173. node_ui/node_modules/ink/build/apply-styles.js +175 -0
  174. node_ui/node_modules/ink/build/build-layout.js +77 -0
  175. node_ui/node_modules/ink/build/calculate-wrapped-text.js +53 -0
  176. node_ui/node_modules/ink/build/colorize.d.ts +3 -0
  177. node_ui/node_modules/ink/build/colorize.js +48 -0
  178. node_ui/node_modules/ink/build/colorize.js.map +1 -0
  179. node_ui/node_modules/ink/build/components/App.d.ts +61 -0
  180. node_ui/node_modules/ink/build/components/App.js +286 -0
  181. node_ui/node_modules/ink/build/components/App.js.map +1 -0
  182. node_ui/node_modules/ink/build/components/AppContext.d.ts +12 -0
  183. node_ui/node_modules/ink/build/components/AppContext.js +11 -0
  184. node_ui/node_modules/ink/build/components/AppContext.js.map +1 -0
  185. node_ui/node_modules/ink/build/components/Box.d.ts +62 -0
  186. node_ui/node_modules/ink/build/components/Box.js +20 -0
  187. node_ui/node_modules/ink/build/components/Box.js.map +1 -0
  188. node_ui/node_modules/ink/build/components/Color.js +62 -0
  189. node_ui/node_modules/ink/build/components/ErrorOverview.d.ts +6 -0
  190. node_ui/node_modules/ink/build/components/ErrorOverview.js +79 -0
  191. node_ui/node_modules/ink/build/components/ErrorOverview.js.map +1 -0
  192. node_ui/node_modules/ink/build/components/FocusContext.d.ts +17 -0
  193. node_ui/node_modules/ink/build/components/FocusContext.js +17 -0
  194. node_ui/node_modules/ink/build/components/FocusContext.js.map +1 -0
  195. node_ui/node_modules/ink/build/components/Newline.d.ts +13 -0
  196. node_ui/node_modules/ink/build/components/Newline.js +8 -0
  197. node_ui/node_modules/ink/build/components/Newline.js.map +1 -0
  198. node_ui/node_modules/ink/build/components/Spacer.d.ts +6 -0
  199. node_ui/node_modules/ink/build/components/Spacer.js +10 -0
  200. node_ui/node_modules/ink/build/components/Spacer.js.map +1 -0
  201. node_ui/node_modules/ink/build/components/Static.d.ts +31 -0
  202. node_ui/node_modules/ink/build/components/Static.js +33 -0
  203. node_ui/node_modules/ink/build/components/Static.js.map +1 -0
  204. node_ui/node_modules/ink/build/components/StderrContext.d.ts +19 -0
  205. node_ui/node_modules/ink/build/components/StderrContext.js +13 -0
  206. node_ui/node_modules/ink/build/components/StderrContext.js.map +1 -0
  207. node_ui/node_modules/ink/build/components/StdinContext.d.ts +26 -0
  208. node_ui/node_modules/ink/build/components/StdinContext.js +19 -0
  209. node_ui/node_modules/ink/build/components/StdinContext.js.map +1 -0
  210. node_ui/node_modules/ink/build/components/StdoutContext.d.ts +19 -0
  211. node_ui/node_modules/ink/build/components/StdoutContext.js +13 -0
  212. node_ui/node_modules/ink/build/components/StdoutContext.js.map +1 -0
  213. node_ui/node_modules/ink/build/components/Text.d.ts +49 -0
  214. node_ui/node_modules/ink/build/components/Text.js +40 -0
  215. node_ui/node_modules/ink/build/components/Text.js.map +1 -0
  216. node_ui/node_modules/ink/build/components/Transform.d.ts +15 -0
  217. node_ui/node_modules/ink/build/components/Transform.js +14 -0
  218. node_ui/node_modules/ink/build/components/Transform.js.map +1 -0
  219. node_ui/node_modules/ink/build/devtools-window-polyfill.d.ts +1 -0
  220. node_ui/node_modules/ink/build/devtools-window-polyfill.js +64 -0
  221. node_ui/node_modules/ink/build/devtools-window-polyfill.js.map +1 -0
  222. node_ui/node_modules/ink/build/devtools.d.ts +1 -0
  223. node_ui/node_modules/ink/build/devtools.js +9 -0
  224. node_ui/node_modules/ink/build/devtools.js.map +1 -0
  225. node_ui/node_modules/ink/build/dom.d.ts +42 -0
  226. node_ui/node_modules/ink/build/dom.js +117 -0
  227. node_ui/node_modules/ink/build/dom.js.map +1 -0
  228. node_ui/node_modules/ink/build/experimental/apply-style.js +140 -0
  229. node_ui/node_modules/ink/build/experimental/dom.js +123 -0
  230. node_ui/node_modules/ink/build/experimental/output.js +91 -0
  231. node_ui/node_modules/ink/build/experimental/reconciler.js +141 -0
  232. node_ui/node_modules/ink/build/experimental/renderer.js +81 -0
  233. node_ui/node_modules/ink/build/get-max-width.d.ts +3 -0
  234. node_ui/node_modules/ink/build/get-max-width.js +10 -0
  235. node_ui/node_modules/ink/build/get-max-width.js.map +1 -0
  236. node_ui/node_modules/ink/build/hooks/use-app.d.ts +5 -0
  237. node_ui/node_modules/ink/build/hooks/use-app.js +8 -0
  238. node_ui/node_modules/ink/build/hooks/use-app.js.map +1 -0
  239. node_ui/node_modules/ink/build/hooks/use-focus-manager.d.ts +34 -0
  240. node_ui/node_modules/ink/build/hooks/use-focus-manager.js +18 -0
  241. node_ui/node_modules/ink/build/hooks/use-focus-manager.js.map +1 -0
  242. node_ui/node_modules/ink/build/hooks/use-focus.d.ts +34 -0
  243. node_ui/node_modules/ink/build/hooks/use-focus.js +47 -0
  244. node_ui/node_modules/ink/build/hooks/use-focus.js.map +1 -0
  245. node_ui/node_modules/ink/build/hooks/use-input.d.ts +97 -0
  246. node_ui/node_modules/ink/build/hooks/use-input.js +96 -0
  247. node_ui/node_modules/ink/build/hooks/use-input.js.map +1 -0
  248. node_ui/node_modules/ink/build/hooks/use-stderr.d.ts +5 -0
  249. node_ui/node_modules/ink/build/hooks/use-stderr.js +8 -0
  250. node_ui/node_modules/ink/build/hooks/use-stderr.js.map +1 -0
  251. node_ui/node_modules/ink/build/hooks/use-stdin.d.ts +5 -0
  252. node_ui/node_modules/ink/build/hooks/use-stdin.js +8 -0
  253. node_ui/node_modules/ink/build/hooks/use-stdin.js.map +1 -0
  254. node_ui/node_modules/ink/build/hooks/use-stdout.d.ts +5 -0
  255. node_ui/node_modules/ink/build/hooks/use-stdout.js +8 -0
  256. node_ui/node_modules/ink/build/hooks/use-stdout.js.map +1 -0
  257. node_ui/node_modules/ink/build/hooks/useInput.js +38 -0
  258. node_ui/node_modules/ink/build/index.d.ts +27 -0
  259. node_ui/node_modules/ink/build/index.js +16 -0
  260. node_ui/node_modules/ink/build/index.js.map +1 -0
  261. node_ui/node_modules/ink/build/ink.d.ts +38 -0
  262. node_ui/node_modules/ink/build/ink.js +235 -0
  263. node_ui/node_modules/ink/build/ink.js.map +1 -0
  264. node_ui/node_modules/ink/build/instance.js +205 -0
  265. node_ui/node_modules/ink/build/instances.d.ts +4 -0
  266. node_ui/node_modules/ink/build/instances.js +8 -0
  267. node_ui/node_modules/ink/build/instances.js.map +1 -0
  268. node_ui/node_modules/ink/build/log-update.d.ts +13 -0
  269. node_ui/node_modules/ink/build/log-update.js +37 -0
  270. node_ui/node_modules/ink/build/log-update.js.map +1 -0
  271. node_ui/node_modules/ink/build/measure-element.d.ts +16 -0
  272. node_ui/node_modules/ink/build/measure-element.js +9 -0
  273. node_ui/node_modules/ink/build/measure-element.js.map +1 -0
  274. node_ui/node_modules/ink/build/measure-text.d.ts +6 -0
  275. node_ui/node_modules/ink/build/measure-text.js +20 -0
  276. node_ui/node_modules/ink/build/measure-text.js.map +1 -0
  277. node_ui/node_modules/ink/build/output.d.ts +35 -0
  278. node_ui/node_modules/ink/build/output.js +148 -0
  279. node_ui/node_modules/ink/build/output.js.map +1 -0
  280. node_ui/node_modules/ink/build/parse-keypress.d.ts +15 -0
  281. node_ui/node_modules/ink/build/parse-keypress.js +225 -0
  282. node_ui/node_modules/ink/build/parse-keypress.js.map +1 -0
  283. node_ui/node_modules/ink/build/reconciler.d.ts +4 -0
  284. node_ui/node_modules/ink/build/reconciler.js +219 -0
  285. node_ui/node_modules/ink/build/reconciler.js.map +1 -0
  286. node_ui/node_modules/ink/build/render-border.d.ts +4 -0
  287. node_ui/node_modules/ink/build/render-border.js +73 -0
  288. node_ui/node_modules/ink/build/render-border.js.map +1 -0
  289. node_ui/node_modules/ink/build/render-node-to-output.d.ts +10 -0
  290. node_ui/node_modules/ink/build/render-node-to-output.js +99 -0
  291. node_ui/node_modules/ink/build/render-node-to-output.js.map +1 -0
  292. node_ui/node_modules/ink/build/render.d.ts +68 -0
  293. node_ui/node_modules/ink/build/render.js +48 -0
  294. node_ui/node_modules/ink/build/render.js.map +1 -0
  295. node_ui/node_modules/ink/build/renderer.d.ts +8 -0
  296. node_ui/node_modules/ink/build/renderer.js +36 -0
  297. node_ui/node_modules/ink/build/renderer.js.map +1 -0
  298. node_ui/node_modules/ink/build/squash-text-nodes.d.ts +3 -0
  299. node_ui/node_modules/ink/build/squash-text-nodes.js +35 -0
  300. node_ui/node_modules/ink/build/squash-text-nodes.js.map +1 -0
  301. node_ui/node_modules/ink/build/styles.d.ts +243 -0
  302. node_ui/node_modules/ink/build/styles.js +229 -0
  303. node_ui/node_modules/ink/build/styles.js.map +1 -0
  304. node_ui/node_modules/ink/build/wrap-text.d.ts +3 -0
  305. node_ui/node_modules/ink/build/wrap-text.js +31 -0
  306. node_ui/node_modules/ink/build/wrap-text.js.map +1 -0
  307. node_ui/node_modules/ink/license +9 -0
  308. node_ui/node_modules/ink/package.json +197 -0
  309. node_ui/node_modules/ink/readme.md +2153 -0
  310. node_ui/node_modules/ink-select-input/build/Indicator.d.ts +6 -0
  311. node_ui/node_modules/ink-select-input/build/Indicator.js +8 -0
  312. node_ui/node_modules/ink-select-input/build/Indicator.js.map +1 -0
  313. node_ui/node_modules/ink-select-input/build/Item.d.ts +7 -0
  314. node_ui/node_modules/ink-select-input/build/Item.js +7 -0
  315. node_ui/node_modules/ink-select-input/build/Item.js.map +1 -0
  316. node_ui/node_modules/ink-select-input/build/SelectInput.d.ts +49 -0
  317. node_ui/node_modules/ink-select-input/build/SelectInput.js +83 -0
  318. node_ui/node_modules/ink-select-input/build/SelectInput.js.map +1 -0
  319. node_ui/node_modules/ink-select-input/build/index.d.ts +3 -0
  320. node_ui/node_modules/ink-select-input/build/index.js +4 -0
  321. node_ui/node_modules/ink-select-input/build/index.js.map +1 -0
  322. node_ui/node_modules/ink-select-input/license +9 -0
  323. node_ui/node_modules/ink-select-input/node_modules/figures/index.d.ts +279 -0
  324. node_ui/node_modules/ink-select-input/node_modules/figures/index.js +292 -0
  325. node_ui/node_modules/ink-select-input/node_modules/figures/license +9 -0
  326. node_ui/node_modules/ink-select-input/node_modules/figures/package.json +49 -0
  327. node_ui/node_modules/ink-select-input/node_modules/figures/readme.md +337 -0
  328. node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/index.d.ts +12 -0
  329. node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/index.js +21 -0
  330. node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/license +9 -0
  331. node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/package.json +47 -0
  332. node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/readme.md +35 -0
  333. node_ui/node_modules/ink-select-input/package.json +83 -0
  334. node_ui/node_modules/ink-select-input/readme.md +98 -0
  335. node_ui/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
  336. node_ui/node_modules/is-fullwidth-code-point/index.js +40 -0
  337. node_ui/node_modules/is-fullwidth-code-point/license +9 -0
  338. node_ui/node_modules/is-fullwidth-code-point/package.json +45 -0
  339. node_ui/node_modules/is-fullwidth-code-point/readme.md +43 -0
  340. node_ui/node_modules/is-in-ci/cli.js +5 -0
  341. node_ui/node_modules/is-in-ci/index.d.ts +15 -0
  342. node_ui/node_modules/is-in-ci/index.js +11 -0
  343. node_ui/node_modules/is-in-ci/license +9 -0
  344. node_ui/node_modules/is-in-ci/package.json +48 -0
  345. node_ui/node_modules/is-in-ci/readme.md +43 -0
  346. node_ui/node_modules/is-unicode-supported/index.d.ts +12 -0
  347. node_ui/node_modules/is-unicode-supported/index.js +17 -0
  348. node_ui/node_modules/is-unicode-supported/license +9 -0
  349. node_ui/node_modules/is-unicode-supported/package.json +43 -0
  350. node_ui/node_modules/is-unicode-supported/readme.md +35 -0
  351. node_ui/node_modules/js-tokens/CHANGELOG.md +151 -0
  352. node_ui/node_modules/js-tokens/LICENSE +21 -0
  353. node_ui/node_modules/js-tokens/README.md +240 -0
  354. node_ui/node_modules/js-tokens/index.js +23 -0
  355. node_ui/node_modules/js-tokens/package.json +30 -0
  356. node_ui/node_modules/lodash/LICENSE +47 -0
  357. node_ui/node_modules/lodash/README.md +39 -0
  358. node_ui/node_modules/lodash/_DataView.js +7 -0
  359. node_ui/node_modules/lodash/_Hash.js +32 -0
  360. node_ui/node_modules/lodash/_LazyWrapper.js +28 -0
  361. node_ui/node_modules/lodash/_ListCache.js +32 -0
  362. node_ui/node_modules/lodash/_LodashWrapper.js +22 -0
  363. node_ui/node_modules/lodash/_Map.js +7 -0
  364. node_ui/node_modules/lodash/_MapCache.js +32 -0
  365. node_ui/node_modules/lodash/_Promise.js +7 -0
  366. node_ui/node_modules/lodash/_Set.js +7 -0
  367. node_ui/node_modules/lodash/_SetCache.js +27 -0
  368. node_ui/node_modules/lodash/_Stack.js +27 -0
  369. node_ui/node_modules/lodash/_Symbol.js +6 -0
  370. node_ui/node_modules/lodash/_Uint8Array.js +6 -0
  371. node_ui/node_modules/lodash/_WeakMap.js +7 -0
  372. node_ui/node_modules/lodash/_apply.js +21 -0
  373. node_ui/node_modules/lodash/_arrayAggregator.js +22 -0
  374. node_ui/node_modules/lodash/_arrayEach.js +22 -0
  375. node_ui/node_modules/lodash/_arrayEachRight.js +21 -0
  376. node_ui/node_modules/lodash/_arrayEvery.js +23 -0
  377. node_ui/node_modules/lodash/_arrayFilter.js +25 -0
  378. node_ui/node_modules/lodash/_arrayIncludes.js +17 -0
  379. node_ui/node_modules/lodash/_arrayIncludesWith.js +22 -0
  380. node_ui/node_modules/lodash/_arrayLikeKeys.js +49 -0
  381. node_ui/node_modules/lodash/_arrayMap.js +21 -0
  382. node_ui/node_modules/lodash/_arrayPush.js +20 -0
  383. node_ui/node_modules/lodash/_arrayReduce.js +26 -0
  384. node_ui/node_modules/lodash/_arrayReduceRight.js +24 -0
  385. node_ui/node_modules/lodash/_arraySample.js +15 -0
  386. node_ui/node_modules/lodash/_arraySampleSize.js +17 -0
  387. node_ui/node_modules/lodash/_arrayShuffle.js +15 -0
  388. node_ui/node_modules/lodash/_arraySome.js +23 -0
  389. node_ui/node_modules/lodash/_asciiSize.js +12 -0
  390. node_ui/node_modules/lodash/_asciiToArray.js +12 -0
  391. node_ui/node_modules/lodash/_asciiWords.js +15 -0
  392. node_ui/node_modules/lodash/_assignMergeValue.js +20 -0
  393. node_ui/node_modules/lodash/_assignValue.js +28 -0
  394. node_ui/node_modules/lodash/_assocIndexOf.js +21 -0
  395. node_ui/node_modules/lodash/_baseAggregator.js +21 -0
  396. node_ui/node_modules/lodash/_baseAssign.js +17 -0
  397. node_ui/node_modules/lodash/_baseAssignIn.js +17 -0
  398. node_ui/node_modules/lodash/_baseAssignValue.js +25 -0
  399. node_ui/node_modules/lodash/_baseAt.js +23 -0
  400. node_ui/node_modules/lodash/_baseClamp.js +22 -0
  401. node_ui/node_modules/lodash/_baseClone.js +166 -0
  402. node_ui/node_modules/lodash/_baseConforms.js +18 -0
  403. node_ui/node_modules/lodash/_baseConformsTo.js +27 -0
  404. node_ui/node_modules/lodash/_baseCreate.js +30 -0
  405. node_ui/node_modules/lodash/_baseDelay.js +21 -0
  406. node_ui/node_modules/lodash/_baseDifference.js +67 -0
  407. node_ui/node_modules/lodash/_baseEach.js +14 -0
  408. node_ui/node_modules/lodash/_baseEachRight.js +14 -0
  409. node_ui/node_modules/lodash/_baseEvery.js +21 -0
  410. node_ui/node_modules/lodash/_baseExtremum.js +32 -0
  411. node_ui/node_modules/lodash/_baseFill.js +32 -0
  412. node_ui/node_modules/lodash/_baseFilter.js +21 -0
  413. node_ui/node_modules/lodash/_baseFindIndex.js +24 -0
  414. node_ui/node_modules/lodash/_baseFindKey.js +23 -0
  415. node_ui/node_modules/lodash/_baseFlatten.js +38 -0
  416. node_ui/node_modules/lodash/_baseFor.js +16 -0
  417. node_ui/node_modules/lodash/_baseForOwn.js +16 -0
  418. node_ui/node_modules/lodash/_baseForOwnRight.js +16 -0
  419. node_ui/node_modules/lodash/_baseForRight.js +15 -0
  420. node_ui/node_modules/lodash/_baseFunctions.js +19 -0
  421. node_ui/node_modules/lodash/_baseGet.js +24 -0
  422. node_ui/node_modules/lodash/_baseGetAllKeys.js +20 -0
  423. node_ui/node_modules/lodash/_baseGetTag.js +28 -0
  424. node_ui/node_modules/lodash/_baseGt.js +14 -0
  425. node_ui/node_modules/lodash/_baseHas.js +19 -0
  426. node_ui/node_modules/lodash/_baseHasIn.js +13 -0
  427. node_ui/node_modules/lodash/_baseInRange.js +18 -0
  428. node_ui/node_modules/lodash/_baseIndexOf.js +20 -0
  429. node_ui/node_modules/lodash/_baseIndexOfWith.js +23 -0
  430. node_ui/node_modules/lodash/_baseIntersection.js +74 -0
  431. node_ui/node_modules/lodash/_baseInverter.js +21 -0
  432. node_ui/node_modules/lodash/_baseInvoke.js +24 -0
  433. node_ui/node_modules/lodash/_baseIsArguments.js +18 -0
  434. node_ui/node_modules/lodash/_baseIsArrayBuffer.js +17 -0
  435. node_ui/node_modules/lodash/_baseIsDate.js +18 -0
  436. node_ui/node_modules/lodash/_baseIsEqual.js +28 -0
  437. node_ui/node_modules/lodash/_baseIsEqualDeep.js +83 -0
  438. node_ui/node_modules/lodash/_baseIsMap.js +18 -0
  439. node_ui/node_modules/lodash/_baseIsMatch.js +62 -0
  440. node_ui/node_modules/lodash/_baseIsNaN.js +12 -0
  441. node_ui/node_modules/lodash/_baseIsNative.js +47 -0
  442. node_ui/node_modules/lodash/_baseIsRegExp.js +18 -0
  443. node_ui/node_modules/lodash/_baseIsSet.js +18 -0
  444. node_ui/node_modules/lodash/_baseIsTypedArray.js +60 -0
  445. node_ui/node_modules/lodash/_baseIteratee.js +31 -0
  446. node_ui/node_modules/lodash/_baseKeys.js +30 -0
  447. node_ui/node_modules/lodash/_baseKeysIn.js +33 -0
  448. node_ui/node_modules/lodash/_baseLodash.js +10 -0
  449. node_ui/node_modules/lodash/_baseLt.js +14 -0
  450. node_ui/node_modules/lodash/_baseMap.js +22 -0
  451. node_ui/node_modules/lodash/_baseMatches.js +22 -0
  452. node_ui/node_modules/lodash/_baseMatchesProperty.js +33 -0
  453. node_ui/node_modules/lodash/_baseMean.js +20 -0
  454. node_ui/node_modules/lodash/_baseMerge.js +42 -0
  455. node_ui/node_modules/lodash/_baseMergeDeep.js +94 -0
  456. node_ui/node_modules/lodash/_baseNth.js +20 -0
  457. node_ui/node_modules/lodash/_baseOrderBy.js +49 -0
  458. node_ui/node_modules/lodash/_basePick.js +19 -0
  459. node_ui/node_modules/lodash/_basePickBy.js +30 -0
  460. node_ui/node_modules/lodash/_baseProperty.js +14 -0
  461. node_ui/node_modules/lodash/_basePropertyDeep.js +16 -0
  462. node_ui/node_modules/lodash/_basePropertyOf.js +14 -0
  463. node_ui/node_modules/lodash/_basePullAll.js +51 -0
  464. node_ui/node_modules/lodash/_basePullAt.js +37 -0
  465. node_ui/node_modules/lodash/_baseRandom.js +18 -0
  466. node_ui/node_modules/lodash/_baseRange.js +28 -0
  467. node_ui/node_modules/lodash/_baseReduce.js +23 -0
  468. node_ui/node_modules/lodash/_baseRepeat.js +35 -0
  469. node_ui/node_modules/lodash/_baseRest.js +17 -0
  470. node_ui/node_modules/lodash/_baseSample.js +15 -0
  471. node_ui/node_modules/lodash/_baseSampleSize.js +18 -0
  472. node_ui/node_modules/lodash/_baseSet.js +51 -0
  473. node_ui/node_modules/lodash/_baseSetData.js +17 -0
  474. node_ui/node_modules/lodash/_baseSetToString.js +22 -0
  475. node_ui/node_modules/lodash/_baseShuffle.js +15 -0
  476. node_ui/node_modules/lodash/_baseSlice.js +31 -0
  477. node_ui/node_modules/lodash/_baseSome.js +22 -0
  478. node_ui/node_modules/lodash/_baseSortBy.js +21 -0
  479. node_ui/node_modules/lodash/_baseSortedIndex.js +42 -0
  480. node_ui/node_modules/lodash/_baseSortedIndexBy.js +67 -0
  481. node_ui/node_modules/lodash/_baseSortedUniq.js +30 -0
  482. node_ui/node_modules/lodash/_baseSum.js +24 -0
  483. node_ui/node_modules/lodash/_baseTimes.js +20 -0
  484. node_ui/node_modules/lodash/_baseToNumber.js +24 -0
  485. node_ui/node_modules/lodash/_baseToPairs.js +18 -0
  486. node_ui/node_modules/lodash/_baseToString.js +37 -0
  487. node_ui/node_modules/lodash/_baseTrim.js +19 -0
  488. node_ui/node_modules/lodash/_baseUnary.js +14 -0
  489. node_ui/node_modules/lodash/_baseUniq.js +72 -0
  490. node_ui/node_modules/lodash/_baseUnset.js +20 -0
  491. node_ui/node_modules/lodash/_baseUpdate.js +18 -0
  492. node_ui/node_modules/lodash/_baseValues.js +19 -0
  493. node_ui/node_modules/lodash/_baseWhile.js +26 -0
  494. node_ui/node_modules/lodash/_baseWrapperValue.js +25 -0
  495. node_ui/node_modules/lodash/_baseXor.js +36 -0
  496. node_ui/node_modules/lodash/_baseZipObject.js +23 -0
  497. node_ui/node_modules/lodash/_cacheHas.js +13 -0
  498. node_ui/node_modules/lodash/_castArrayLikeObject.js +14 -0
  499. node_ui/node_modules/lodash/_castFunction.js +14 -0
  500. node_ui/node_modules/lodash/_castPath.js +21 -0
  501. node_ui/node_modules/lodash/_castRest.js +14 -0
  502. node_ui/node_modules/lodash/_castSlice.js +18 -0
  503. node_ui/node_modules/lodash/_charsEndIndex.js +19 -0
  504. node_ui/node_modules/lodash/_charsStartIndex.js +20 -0
  505. node_ui/node_modules/lodash/_cloneArrayBuffer.js +16 -0
  506. node_ui/node_modules/lodash/_cloneBuffer.js +35 -0
  507. node_ui/node_modules/lodash/_cloneDataView.js +16 -0
  508. node_ui/node_modules/lodash/_cloneRegExp.js +17 -0
  509. node_ui/node_modules/lodash/_cloneSymbol.js +18 -0
  510. node_ui/node_modules/lodash/_cloneTypedArray.js +16 -0
  511. node_ui/node_modules/lodash/_compareAscending.js +41 -0
  512. node_ui/node_modules/lodash/_compareMultiple.js +44 -0
  513. node_ui/node_modules/lodash/_composeArgs.js +39 -0
  514. node_ui/node_modules/lodash/_composeArgsRight.js +41 -0
  515. node_ui/node_modules/lodash/_copyArray.js +20 -0
  516. node_ui/node_modules/lodash/_copyObject.js +40 -0
  517. node_ui/node_modules/lodash/_copySymbols.js +16 -0
  518. node_ui/node_modules/lodash/_copySymbolsIn.js +16 -0
  519. node_ui/node_modules/lodash/_coreJsData.js +6 -0
  520. node_ui/node_modules/lodash/_countHolders.js +21 -0
  521. node_ui/node_modules/lodash/_createAggregator.js +23 -0
  522. node_ui/node_modules/lodash/_createAssigner.js +37 -0
  523. node_ui/node_modules/lodash/_createBaseEach.js +32 -0
  524. node_ui/node_modules/lodash/_createBaseFor.js +25 -0
  525. node_ui/node_modules/lodash/_createBind.js +28 -0
  526. node_ui/node_modules/lodash/_createCaseFirst.js +33 -0
  527. node_ui/node_modules/lodash/_createCompounder.js +24 -0
  528. node_ui/node_modules/lodash/_createCtor.js +37 -0
  529. node_ui/node_modules/lodash/_createCurry.js +46 -0
  530. node_ui/node_modules/lodash/_createFind.js +25 -0
  531. node_ui/node_modules/lodash/_createFlow.js +78 -0
  532. node_ui/node_modules/lodash/_createHybrid.js +92 -0
  533. node_ui/node_modules/lodash/_createInverter.js +17 -0
  534. node_ui/node_modules/lodash/_createMathOperation.js +38 -0
  535. node_ui/node_modules/lodash/_createOver.js +27 -0
  536. node_ui/node_modules/lodash/_createPadding.js +33 -0
  537. node_ui/node_modules/lodash/_createPartial.js +43 -0
  538. node_ui/node_modules/lodash/_createRange.js +30 -0
  539. node_ui/node_modules/lodash/_createRecurry.js +56 -0
  540. node_ui/node_modules/lodash/_createRelationalOperation.js +20 -0
  541. node_ui/node_modules/lodash/_createRound.js +35 -0
  542. node_ui/node_modules/lodash/_createSet.js +19 -0
  543. node_ui/node_modules/lodash/_createToPairs.js +30 -0
  544. node_ui/node_modules/lodash/_createWrap.js +106 -0
  545. node_ui/node_modules/lodash/_customDefaultsAssignIn.js +29 -0
  546. node_ui/node_modules/lodash/_customDefaultsMerge.js +28 -0
  547. node_ui/node_modules/lodash/_customOmitClone.js +16 -0
  548. node_ui/node_modules/lodash/_deburrLetter.js +71 -0
  549. node_ui/node_modules/lodash/_defineProperty.js +11 -0
  550. node_ui/node_modules/lodash/_equalArrays.js +84 -0
  551. node_ui/node_modules/lodash/_equalByTag.js +112 -0
  552. node_ui/node_modules/lodash/_equalObjects.js +90 -0
  553. node_ui/node_modules/lodash/_escapeHtmlChar.js +21 -0
  554. node_ui/node_modules/lodash/_escapeStringChar.js +22 -0
  555. node_ui/node_modules/lodash/_flatRest.js +16 -0
  556. node_ui/node_modules/lodash/_freeGlobal.js +4 -0
  557. node_ui/node_modules/lodash/_getAllKeys.js +16 -0
  558. node_ui/node_modules/lodash/_getAllKeysIn.js +17 -0
  559. node_ui/node_modules/lodash/_getData.js +15 -0
  560. node_ui/node_modules/lodash/_getFuncName.js +31 -0
  561. node_ui/node_modules/lodash/_getHolder.js +13 -0
  562. node_ui/node_modules/lodash/_getMapData.js +18 -0
  563. node_ui/node_modules/lodash/_getMatchData.js +24 -0
  564. node_ui/node_modules/lodash/_getNative.js +17 -0
  565. node_ui/node_modules/lodash/_getPrototype.js +6 -0
  566. node_ui/node_modules/lodash/_getRawTag.js +46 -0
  567. node_ui/node_modules/lodash/_getSymbols.js +30 -0
  568. node_ui/node_modules/lodash/_getSymbolsIn.js +25 -0
  569. node_ui/node_modules/lodash/_getTag.js +58 -0
  570. node_ui/node_modules/lodash/_getValue.js +13 -0
  571. node_ui/node_modules/lodash/_getView.js +33 -0
  572. node_ui/node_modules/lodash/_getWrapDetails.js +17 -0
  573. node_ui/node_modules/lodash/_hasPath.js +39 -0
  574. node_ui/node_modules/lodash/_hasUnicode.js +26 -0
  575. node_ui/node_modules/lodash/_hasUnicodeWord.js +15 -0
  576. node_ui/node_modules/lodash/_hashClear.js +15 -0
  577. node_ui/node_modules/lodash/_hashDelete.js +17 -0
  578. node_ui/node_modules/lodash/_hashGet.js +30 -0
  579. node_ui/node_modules/lodash/_hashHas.js +23 -0
  580. node_ui/node_modules/lodash/_hashSet.js +23 -0
  581. node_ui/node_modules/lodash/_initCloneArray.js +26 -0
  582. node_ui/node_modules/lodash/_initCloneByTag.js +77 -0
  583. node_ui/node_modules/lodash/_initCloneObject.js +18 -0
  584. node_ui/node_modules/lodash/_insertWrapDetails.js +23 -0
  585. node_ui/node_modules/lodash/_isFlattenable.js +20 -0
  586. node_ui/node_modules/lodash/_isIndex.js +25 -0
  587. node_ui/node_modules/lodash/_isIterateeCall.js +30 -0
  588. node_ui/node_modules/lodash/_isKey.js +29 -0
  589. node_ui/node_modules/lodash/_isKeyable.js +15 -0
  590. node_ui/node_modules/lodash/_isLaziable.js +28 -0
  591. node_ui/node_modules/lodash/_isMaskable.js +14 -0
  592. node_ui/node_modules/lodash/_isMasked.js +20 -0
  593. node_ui/node_modules/lodash/_isPrototype.js +18 -0
  594. node_ui/node_modules/lodash/_isStrictComparable.js +15 -0
  595. node_ui/node_modules/lodash/_iteratorToArray.js +18 -0
  596. node_ui/node_modules/lodash/_lazyClone.js +23 -0
  597. node_ui/node_modules/lodash/_lazyReverse.js +23 -0
  598. node_ui/node_modules/lodash/_lazyValue.js +69 -0
  599. node_ui/node_modules/lodash/_listCacheClear.js +13 -0
  600. node_ui/node_modules/lodash/_listCacheDelete.js +35 -0
  601. node_ui/node_modules/lodash/_listCacheGet.js +19 -0
  602. node_ui/node_modules/lodash/_listCacheHas.js +16 -0
  603. node_ui/node_modules/lodash/_listCacheSet.js +26 -0
  604. node_ui/node_modules/lodash/_mapCacheClear.js +21 -0
  605. node_ui/node_modules/lodash/_mapCacheDelete.js +18 -0
  606. node_ui/node_modules/lodash/_mapCacheGet.js +16 -0
  607. node_ui/node_modules/lodash/_mapCacheHas.js +16 -0
  608. node_ui/node_modules/lodash/_mapCacheSet.js +22 -0
  609. node_ui/node_modules/lodash/_mapToArray.js +18 -0
  610. node_ui/node_modules/lodash/_matchesStrictComparable.js +20 -0
  611. node_ui/node_modules/lodash/_memoizeCapped.js +26 -0
  612. node_ui/node_modules/lodash/_mergeData.js +90 -0
  613. node_ui/node_modules/lodash/_metaMap.js +6 -0
  614. node_ui/node_modules/lodash/_nativeCreate.js +6 -0
  615. node_ui/node_modules/lodash/_nativeKeys.js +6 -0
  616. node_ui/node_modules/lodash/_nativeKeysIn.js +20 -0
  617. node_ui/node_modules/lodash/_nodeUtil.js +30 -0
  618. node_ui/node_modules/lodash/_objectToString.js +22 -0
  619. node_ui/node_modules/lodash/_overArg.js +15 -0
  620. node_ui/node_modules/lodash/_overRest.js +36 -0
  621. node_ui/node_modules/lodash/_parent.js +16 -0
  622. node_ui/node_modules/lodash/_reEscape.js +4 -0
  623. node_ui/node_modules/lodash/_reEvaluate.js +4 -0
  624. node_ui/node_modules/lodash/_reInterpolate.js +4 -0
  625. node_ui/node_modules/lodash/_realNames.js +4 -0
  626. node_ui/node_modules/lodash/_reorder.js +29 -0
  627. node_ui/node_modules/lodash/_replaceHolders.js +29 -0
  628. node_ui/node_modules/lodash/_root.js +9 -0
  629. node_ui/node_modules/lodash/_safeGet.js +21 -0
  630. node_ui/node_modules/lodash/_setCacheAdd.js +19 -0
  631. node_ui/node_modules/lodash/_setCacheHas.js +14 -0
  632. node_ui/node_modules/lodash/_setData.js +20 -0
  633. node_ui/node_modules/lodash/_setToArray.js +18 -0
  634. node_ui/node_modules/lodash/_setToPairs.js +18 -0
  635. node_ui/node_modules/lodash/_setToString.js +14 -0
  636. node_ui/node_modules/lodash/_setWrapToString.js +21 -0
  637. node_ui/node_modules/lodash/_shortOut.js +37 -0
  638. node_ui/node_modules/lodash/_shuffleSelf.js +28 -0
  639. node_ui/node_modules/lodash/_stackClear.js +15 -0
  640. node_ui/node_modules/lodash/_stackDelete.js +18 -0
  641. node_ui/node_modules/lodash/_stackGet.js +14 -0
  642. node_ui/node_modules/lodash/_stackHas.js +14 -0
  643. node_ui/node_modules/lodash/_stackSet.js +34 -0
  644. node_ui/node_modules/lodash/_strictIndexOf.js +23 -0
  645. node_ui/node_modules/lodash/_strictLastIndexOf.js +21 -0
  646. node_ui/node_modules/lodash/_stringSize.js +18 -0
  647. node_ui/node_modules/lodash/_stringToArray.js +18 -0
  648. node_ui/node_modules/lodash/_stringToPath.js +27 -0
  649. node_ui/node_modules/lodash/_toKey.js +21 -0
  650. node_ui/node_modules/lodash/_toSource.js +26 -0
  651. node_ui/node_modules/lodash/_trimmedEndIndex.js +19 -0
  652. node_ui/node_modules/lodash/_unescapeHtmlChar.js +21 -0
  653. node_ui/node_modules/lodash/_unicodeSize.js +44 -0
  654. node_ui/node_modules/lodash/_unicodeToArray.js +40 -0
  655. node_ui/node_modules/lodash/_unicodeWords.js +69 -0
  656. node_ui/node_modules/lodash/_updateWrapDetails.js +46 -0
  657. node_ui/node_modules/lodash/_wrapperClone.js +23 -0
  658. node_ui/node_modules/lodash/add.js +22 -0
  659. node_ui/node_modules/lodash/after.js +42 -0
  660. node_ui/node_modules/lodash/array.js +67 -0
  661. node_ui/node_modules/lodash/ary.js +29 -0
  662. node_ui/node_modules/lodash/assign.js +58 -0
  663. node_ui/node_modules/lodash/assignIn.js +40 -0
  664. node_ui/node_modules/lodash/assignInWith.js +38 -0
  665. node_ui/node_modules/lodash/assignWith.js +37 -0
  666. node_ui/node_modules/lodash/at.js +23 -0
  667. node_ui/node_modules/lodash/attempt.js +35 -0
  668. node_ui/node_modules/lodash/before.js +40 -0
  669. node_ui/node_modules/lodash/bind.js +57 -0
  670. node_ui/node_modules/lodash/bindAll.js +41 -0
  671. node_ui/node_modules/lodash/bindKey.js +68 -0
  672. node_ui/node_modules/lodash/camelCase.js +29 -0
  673. node_ui/node_modules/lodash/capitalize.js +23 -0
  674. node_ui/node_modules/lodash/castArray.js +44 -0
  675. node_ui/node_modules/lodash/ceil.js +26 -0
  676. node_ui/node_modules/lodash/chain.js +38 -0
  677. node_ui/node_modules/lodash/chunk.js +50 -0
  678. node_ui/node_modules/lodash/clamp.js +39 -0
  679. node_ui/node_modules/lodash/clone.js +36 -0
  680. node_ui/node_modules/lodash/cloneDeep.js +29 -0
  681. node_ui/node_modules/lodash/cloneDeepWith.js +40 -0
  682. node_ui/node_modules/lodash/cloneWith.js +42 -0
  683. node_ui/node_modules/lodash/collection.js +30 -0
  684. node_ui/node_modules/lodash/commit.js +33 -0
  685. node_ui/node_modules/lodash/compact.js +31 -0
  686. node_ui/node_modules/lodash/concat.js +43 -0
  687. node_ui/node_modules/lodash/cond.js +60 -0
  688. node_ui/node_modules/lodash/conforms.js +35 -0
  689. node_ui/node_modules/lodash/conformsTo.js +32 -0
  690. node_ui/node_modules/lodash/constant.js +26 -0
  691. node_ui/node_modules/lodash/core.js +3877 -0
  692. node_ui/node_modules/lodash/core.min.js +29 -0
  693. node_ui/node_modules/lodash/countBy.js +40 -0
  694. node_ui/node_modules/lodash/create.js +43 -0
  695. node_ui/node_modules/lodash/curry.js +57 -0
  696. node_ui/node_modules/lodash/curryRight.js +54 -0
  697. node_ui/node_modules/lodash/date.js +3 -0
  698. node_ui/node_modules/lodash/debounce.js +191 -0
  699. node_ui/node_modules/lodash/deburr.js +45 -0
  700. node_ui/node_modules/lodash/defaultTo.js +25 -0
  701. node_ui/node_modules/lodash/defaults.js +64 -0
  702. node_ui/node_modules/lodash/defaultsDeep.js +30 -0
  703. node_ui/node_modules/lodash/defer.js +26 -0
  704. node_ui/node_modules/lodash/delay.js +28 -0
  705. node_ui/node_modules/lodash/difference.js +33 -0
  706. node_ui/node_modules/lodash/differenceBy.js +44 -0
  707. node_ui/node_modules/lodash/differenceWith.js +40 -0
  708. node_ui/node_modules/lodash/divide.js +22 -0
  709. node_ui/node_modules/lodash/drop.js +38 -0
  710. node_ui/node_modules/lodash/dropRight.js +39 -0
  711. node_ui/node_modules/lodash/dropRightWhile.js +45 -0
  712. node_ui/node_modules/lodash/dropWhile.js +45 -0
  713. node_ui/node_modules/lodash/each.js +1 -0
  714. node_ui/node_modules/lodash/eachRight.js +1 -0
  715. node_ui/node_modules/lodash/endsWith.js +43 -0
  716. node_ui/node_modules/lodash/entries.js +1 -0
  717. node_ui/node_modules/lodash/entriesIn.js +1 -0
  718. node_ui/node_modules/lodash/eq.js +37 -0
  719. node_ui/node_modules/lodash/escape.js +43 -0
  720. node_ui/node_modules/lodash/escapeRegExp.js +32 -0
  721. node_ui/node_modules/lodash/every.js +56 -0
  722. node_ui/node_modules/lodash/extend.js +1 -0
  723. node_ui/node_modules/lodash/extendWith.js +1 -0
  724. node_ui/node_modules/lodash/fill.js +45 -0
  725. node_ui/node_modules/lodash/filter.js +52 -0
  726. node_ui/node_modules/lodash/find.js +42 -0
  727. node_ui/node_modules/lodash/findIndex.js +55 -0
  728. node_ui/node_modules/lodash/findKey.js +44 -0
  729. node_ui/node_modules/lodash/findLast.js +25 -0
  730. node_ui/node_modules/lodash/findLastIndex.js +59 -0
  731. node_ui/node_modules/lodash/findLastKey.js +44 -0
  732. node_ui/node_modules/lodash/first.js +1 -0
  733. node_ui/node_modules/lodash/flake.lock +40 -0
  734. node_ui/node_modules/lodash/flake.nix +20 -0
  735. node_ui/node_modules/lodash/flatMap.js +29 -0
  736. node_ui/node_modules/lodash/flatMapDeep.js +31 -0
  737. node_ui/node_modules/lodash/flatMapDepth.js +31 -0
  738. node_ui/node_modules/lodash/flatten.js +22 -0
  739. node_ui/node_modules/lodash/flattenDeep.js +25 -0
  740. node_ui/node_modules/lodash/flattenDepth.js +33 -0
  741. node_ui/node_modules/lodash/flip.js +28 -0
  742. node_ui/node_modules/lodash/floor.js +26 -0
  743. node_ui/node_modules/lodash/flow.js +27 -0
  744. node_ui/node_modules/lodash/flowRight.js +26 -0
  745. node_ui/node_modules/lodash/forEach.js +41 -0
  746. node_ui/node_modules/lodash/forEachRight.js +31 -0
  747. node_ui/node_modules/lodash/forIn.js +39 -0
  748. node_ui/node_modules/lodash/forInRight.js +37 -0
  749. node_ui/node_modules/lodash/forOwn.js +36 -0
  750. node_ui/node_modules/lodash/forOwnRight.js +34 -0
  751. node_ui/node_modules/lodash/fp/F.js +1 -0
  752. node_ui/node_modules/lodash/fp/T.js +1 -0
  753. node_ui/node_modules/lodash/fp/__.js +1 -0
  754. node_ui/node_modules/lodash/fp/_baseConvert.js +569 -0
  755. node_ui/node_modules/lodash/fp/_convertBrowser.js +18 -0
  756. node_ui/node_modules/lodash/fp/_falseOptions.js +7 -0
  757. node_ui/node_modules/lodash/fp/_mapping.js +358 -0
  758. node_ui/node_modules/lodash/fp/_util.js +16 -0
  759. node_ui/node_modules/lodash/fp/add.js +5 -0
  760. node_ui/node_modules/lodash/fp/after.js +5 -0
  761. node_ui/node_modules/lodash/fp/all.js +1 -0
  762. node_ui/node_modules/lodash/fp/allPass.js +1 -0
  763. node_ui/node_modules/lodash/fp/always.js +1 -0
  764. node_ui/node_modules/lodash/fp/any.js +1 -0
  765. node_ui/node_modules/lodash/fp/anyPass.js +1 -0
  766. node_ui/node_modules/lodash/fp/apply.js +1 -0
  767. node_ui/node_modules/lodash/fp/array.js +2 -0
  768. node_ui/node_modules/lodash/fp/ary.js +5 -0
  769. node_ui/node_modules/lodash/fp/assign.js +5 -0
  770. node_ui/node_modules/lodash/fp/assignAll.js +5 -0
  771. node_ui/node_modules/lodash/fp/assignAllWith.js +5 -0
  772. node_ui/node_modules/lodash/fp/assignIn.js +5 -0
  773. node_ui/node_modules/lodash/fp/assignInAll.js +5 -0
  774. node_ui/node_modules/lodash/fp/assignInAllWith.js +5 -0
  775. node_ui/node_modules/lodash/fp/assignInWith.js +5 -0
  776. node_ui/node_modules/lodash/fp/assignWith.js +5 -0
  777. node_ui/node_modules/lodash/fp/assoc.js +1 -0
  778. node_ui/node_modules/lodash/fp/assocPath.js +1 -0
  779. node_ui/node_modules/lodash/fp/at.js +5 -0
  780. node_ui/node_modules/lodash/fp/attempt.js +5 -0
  781. node_ui/node_modules/lodash/fp/before.js +5 -0
  782. node_ui/node_modules/lodash/fp/bind.js +5 -0
  783. node_ui/node_modules/lodash/fp/bindAll.js +5 -0
  784. node_ui/node_modules/lodash/fp/bindKey.js +5 -0
  785. node_ui/node_modules/lodash/fp/camelCase.js +5 -0
  786. node_ui/node_modules/lodash/fp/capitalize.js +5 -0
  787. node_ui/node_modules/lodash/fp/castArray.js +5 -0
  788. node_ui/node_modules/lodash/fp/ceil.js +5 -0
  789. node_ui/node_modules/lodash/fp/chain.js +5 -0
  790. node_ui/node_modules/lodash/fp/chunk.js +5 -0
  791. node_ui/node_modules/lodash/fp/clamp.js +5 -0
  792. node_ui/node_modules/lodash/fp/clone.js +5 -0
  793. node_ui/node_modules/lodash/fp/cloneDeep.js +5 -0
  794. node_ui/node_modules/lodash/fp/cloneDeepWith.js +5 -0
  795. node_ui/node_modules/lodash/fp/cloneWith.js +5 -0
  796. node_ui/node_modules/lodash/fp/collection.js +2 -0
  797. node_ui/node_modules/lodash/fp/commit.js +5 -0
  798. node_ui/node_modules/lodash/fp/compact.js +5 -0
  799. node_ui/node_modules/lodash/fp/complement.js +1 -0
  800. node_ui/node_modules/lodash/fp/compose.js +1 -0
  801. node_ui/node_modules/lodash/fp/concat.js +5 -0
  802. node_ui/node_modules/lodash/fp/cond.js +5 -0
  803. node_ui/node_modules/lodash/fp/conforms.js +1 -0
  804. node_ui/node_modules/lodash/fp/conformsTo.js +5 -0
  805. node_ui/node_modules/lodash/fp/constant.js +5 -0
  806. node_ui/node_modules/lodash/fp/contains.js +1 -0
  807. node_ui/node_modules/lodash/fp/convert.js +18 -0
  808. node_ui/node_modules/lodash/fp/countBy.js +5 -0
  809. node_ui/node_modules/lodash/fp/create.js +5 -0
  810. node_ui/node_modules/lodash/fp/curry.js +5 -0
  811. node_ui/node_modules/lodash/fp/curryN.js +5 -0
  812. node_ui/node_modules/lodash/fp/curryRight.js +5 -0
  813. node_ui/node_modules/lodash/fp/curryRightN.js +5 -0
  814. node_ui/node_modules/lodash/fp/date.js +2 -0
  815. node_ui/node_modules/lodash/fp/debounce.js +5 -0
  816. node_ui/node_modules/lodash/fp/deburr.js +5 -0
  817. node_ui/node_modules/lodash/fp/defaultTo.js +5 -0
  818. node_ui/node_modules/lodash/fp/defaults.js +5 -0
  819. node_ui/node_modules/lodash/fp/defaultsAll.js +5 -0
  820. node_ui/node_modules/lodash/fp/defaultsDeep.js +5 -0
  821. node_ui/node_modules/lodash/fp/defaultsDeepAll.js +5 -0
  822. node_ui/node_modules/lodash/fp/defer.js +5 -0
  823. node_ui/node_modules/lodash/fp/delay.js +5 -0
  824. node_ui/node_modules/lodash/fp/difference.js +5 -0
  825. node_ui/node_modules/lodash/fp/differenceBy.js +5 -0
  826. node_ui/node_modules/lodash/fp/differenceWith.js +5 -0
  827. node_ui/node_modules/lodash/fp/dissoc.js +1 -0
  828. node_ui/node_modules/lodash/fp/dissocPath.js +1 -0
  829. node_ui/node_modules/lodash/fp/divide.js +5 -0
  830. node_ui/node_modules/lodash/fp/drop.js +5 -0
  831. node_ui/node_modules/lodash/fp/dropLast.js +1 -0
  832. node_ui/node_modules/lodash/fp/dropLastWhile.js +1 -0
  833. node_ui/node_modules/lodash/fp/dropRight.js +5 -0
  834. node_ui/node_modules/lodash/fp/dropRightWhile.js +5 -0
  835. node_ui/node_modules/lodash/fp/dropWhile.js +5 -0
  836. node_ui/node_modules/lodash/fp/each.js +1 -0
  837. node_ui/node_modules/lodash/fp/eachRight.js +1 -0
  838. node_ui/node_modules/lodash/fp/endsWith.js +5 -0
  839. node_ui/node_modules/lodash/fp/entries.js +1 -0
  840. node_ui/node_modules/lodash/fp/entriesIn.js +1 -0
  841. node_ui/node_modules/lodash/fp/eq.js +5 -0
  842. node_ui/node_modules/lodash/fp/equals.js +1 -0
  843. node_ui/node_modules/lodash/fp/escape.js +5 -0
  844. node_ui/node_modules/lodash/fp/escapeRegExp.js +5 -0
  845. node_ui/node_modules/lodash/fp/every.js +5 -0
  846. node_ui/node_modules/lodash/fp/extend.js +1 -0
  847. node_ui/node_modules/lodash/fp/extendAll.js +1 -0
  848. node_ui/node_modules/lodash/fp/extendAllWith.js +1 -0
  849. node_ui/node_modules/lodash/fp/extendWith.js +1 -0
  850. node_ui/node_modules/lodash/fp/fill.js +5 -0
  851. node_ui/node_modules/lodash/fp/filter.js +5 -0
  852. node_ui/node_modules/lodash/fp/find.js +5 -0
  853. node_ui/node_modules/lodash/fp/findFrom.js +5 -0
  854. node_ui/node_modules/lodash/fp/findIndex.js +5 -0
  855. node_ui/node_modules/lodash/fp/findIndexFrom.js +5 -0
  856. node_ui/node_modules/lodash/fp/findKey.js +5 -0
  857. node_ui/node_modules/lodash/fp/findLast.js +5 -0
  858. node_ui/node_modules/lodash/fp/findLastFrom.js +5 -0
  859. node_ui/node_modules/lodash/fp/findLastIndex.js +5 -0
  860. node_ui/node_modules/lodash/fp/findLastIndexFrom.js +5 -0
  861. node_ui/node_modules/lodash/fp/findLastKey.js +5 -0
  862. node_ui/node_modules/lodash/fp/first.js +1 -0
  863. node_ui/node_modules/lodash/fp/flatMap.js +5 -0
  864. node_ui/node_modules/lodash/fp/flatMapDeep.js +5 -0
  865. node_ui/node_modules/lodash/fp/flatMapDepth.js +5 -0
  866. node_ui/node_modules/lodash/fp/flatten.js +5 -0
  867. node_ui/node_modules/lodash/fp/flattenDeep.js +5 -0
  868. node_ui/node_modules/lodash/fp/flattenDepth.js +5 -0
  869. node_ui/node_modules/lodash/fp/flip.js +5 -0
  870. node_ui/node_modules/lodash/fp/floor.js +5 -0
  871. node_ui/node_modules/lodash/fp/flow.js +5 -0
  872. node_ui/node_modules/lodash/fp/flowRight.js +5 -0
  873. node_ui/node_modules/lodash/fp/forEach.js +5 -0
  874. node_ui/node_modules/lodash/fp/forEachRight.js +5 -0
  875. node_ui/node_modules/lodash/fp/forIn.js +5 -0
  876. node_ui/node_modules/lodash/fp/forInRight.js +5 -0
  877. node_ui/node_modules/lodash/fp/forOwn.js +5 -0
  878. node_ui/node_modules/lodash/fp/forOwnRight.js +5 -0
  879. node_ui/node_modules/lodash/fp/fromPairs.js +5 -0
  880. node_ui/node_modules/lodash/fp/function.js +2 -0
  881. node_ui/node_modules/lodash/fp/functions.js +5 -0
  882. node_ui/node_modules/lodash/fp/functionsIn.js +5 -0
  883. node_ui/node_modules/lodash/fp/get.js +5 -0
  884. node_ui/node_modules/lodash/fp/getOr.js +5 -0
  885. node_ui/node_modules/lodash/fp/groupBy.js +5 -0
  886. node_ui/node_modules/lodash/fp/gt.js +5 -0
  887. node_ui/node_modules/lodash/fp/gte.js +5 -0
  888. node_ui/node_modules/lodash/fp/has.js +5 -0
  889. node_ui/node_modules/lodash/fp/hasIn.js +5 -0
  890. node_ui/node_modules/lodash/fp/head.js +5 -0
  891. node_ui/node_modules/lodash/fp/identical.js +1 -0
  892. node_ui/node_modules/lodash/fp/identity.js +5 -0
  893. node_ui/node_modules/lodash/fp/inRange.js +5 -0
  894. node_ui/node_modules/lodash/fp/includes.js +5 -0
  895. node_ui/node_modules/lodash/fp/includesFrom.js +5 -0
  896. node_ui/node_modules/lodash/fp/indexBy.js +1 -0
  897. node_ui/node_modules/lodash/fp/indexOf.js +5 -0
  898. node_ui/node_modules/lodash/fp/indexOfFrom.js +5 -0
  899. node_ui/node_modules/lodash/fp/init.js +1 -0
  900. node_ui/node_modules/lodash/fp/initial.js +5 -0
  901. node_ui/node_modules/lodash/fp/intersection.js +5 -0
  902. node_ui/node_modules/lodash/fp/intersectionBy.js +5 -0
  903. node_ui/node_modules/lodash/fp/intersectionWith.js +5 -0
  904. node_ui/node_modules/lodash/fp/invert.js +5 -0
  905. node_ui/node_modules/lodash/fp/invertBy.js +5 -0
  906. node_ui/node_modules/lodash/fp/invertObj.js +1 -0
  907. node_ui/node_modules/lodash/fp/invoke.js +5 -0
  908. node_ui/node_modules/lodash/fp/invokeArgs.js +5 -0
  909. node_ui/node_modules/lodash/fp/invokeArgsMap.js +5 -0
  910. node_ui/node_modules/lodash/fp/invokeMap.js +5 -0
  911. node_ui/node_modules/lodash/fp/isArguments.js +5 -0
  912. node_ui/node_modules/lodash/fp/isArray.js +5 -0
  913. node_ui/node_modules/lodash/fp/isArrayBuffer.js +5 -0
  914. node_ui/node_modules/lodash/fp/isArrayLike.js +5 -0
  915. node_ui/node_modules/lodash/fp/isArrayLikeObject.js +5 -0
  916. node_ui/node_modules/lodash/fp/isBoolean.js +5 -0
  917. node_ui/node_modules/lodash/fp/isBuffer.js +5 -0
  918. node_ui/node_modules/lodash/fp/isDate.js +5 -0
  919. node_ui/node_modules/lodash/fp/isElement.js +5 -0
  920. node_ui/node_modules/lodash/fp/isEmpty.js +5 -0
  921. node_ui/node_modules/lodash/fp/isEqual.js +5 -0
  922. node_ui/node_modules/lodash/fp/isEqualWith.js +5 -0
  923. node_ui/node_modules/lodash/fp/isError.js +5 -0
  924. node_ui/node_modules/lodash/fp/isFinite.js +5 -0
  925. node_ui/node_modules/lodash/fp/isFunction.js +5 -0
  926. node_ui/node_modules/lodash/fp/isInteger.js +5 -0
  927. node_ui/node_modules/lodash/fp/isLength.js +5 -0
  928. node_ui/node_modules/lodash/fp/isMap.js +5 -0
  929. node_ui/node_modules/lodash/fp/isMatch.js +5 -0
  930. node_ui/node_modules/lodash/fp/isMatchWith.js +5 -0
  931. node_ui/node_modules/lodash/fp/isNaN.js +5 -0
  932. node_ui/node_modules/lodash/fp/isNative.js +5 -0
  933. node_ui/node_modules/lodash/fp/isNil.js +5 -0
  934. node_ui/node_modules/lodash/fp/isNull.js +5 -0
  935. node_ui/node_modules/lodash/fp/isNumber.js +5 -0
  936. node_ui/node_modules/lodash/fp/isObject.js +5 -0
  937. node_ui/node_modules/lodash/fp/isObjectLike.js +5 -0
  938. node_ui/node_modules/lodash/fp/isPlainObject.js +5 -0
  939. node_ui/node_modules/lodash/fp/isRegExp.js +5 -0
  940. node_ui/node_modules/lodash/fp/isSafeInteger.js +5 -0
  941. node_ui/node_modules/lodash/fp/isSet.js +5 -0
  942. node_ui/node_modules/lodash/fp/isString.js +5 -0
  943. node_ui/node_modules/lodash/fp/isSymbol.js +5 -0
  944. node_ui/node_modules/lodash/fp/isTypedArray.js +5 -0
  945. node_ui/node_modules/lodash/fp/isUndefined.js +5 -0
  946. node_ui/node_modules/lodash/fp/isWeakMap.js +5 -0
  947. node_ui/node_modules/lodash/fp/isWeakSet.js +5 -0
  948. node_ui/node_modules/lodash/fp/iteratee.js +5 -0
  949. node_ui/node_modules/lodash/fp/join.js +5 -0
  950. node_ui/node_modules/lodash/fp/juxt.js +1 -0
  951. node_ui/node_modules/lodash/fp/kebabCase.js +5 -0
  952. node_ui/node_modules/lodash/fp/keyBy.js +5 -0
  953. node_ui/node_modules/lodash/fp/keys.js +5 -0
  954. node_ui/node_modules/lodash/fp/keysIn.js +5 -0
  955. node_ui/node_modules/lodash/fp/lang.js +2 -0
  956. node_ui/node_modules/lodash/fp/last.js +5 -0
  957. node_ui/node_modules/lodash/fp/lastIndexOf.js +5 -0
  958. node_ui/node_modules/lodash/fp/lastIndexOfFrom.js +5 -0
  959. node_ui/node_modules/lodash/fp/lowerCase.js +5 -0
  960. node_ui/node_modules/lodash/fp/lowerFirst.js +5 -0
  961. node_ui/node_modules/lodash/fp/lt.js +5 -0
  962. node_ui/node_modules/lodash/fp/lte.js +5 -0
  963. node_ui/node_modules/lodash/fp/map.js +5 -0
  964. node_ui/node_modules/lodash/fp/mapKeys.js +5 -0
  965. node_ui/node_modules/lodash/fp/mapValues.js +5 -0
  966. node_ui/node_modules/lodash/fp/matches.js +1 -0
  967. node_ui/node_modules/lodash/fp/matchesProperty.js +5 -0
  968. node_ui/node_modules/lodash/fp/math.js +2 -0
  969. node_ui/node_modules/lodash/fp/max.js +5 -0
  970. node_ui/node_modules/lodash/fp/maxBy.js +5 -0
  971. node_ui/node_modules/lodash/fp/mean.js +5 -0
  972. node_ui/node_modules/lodash/fp/meanBy.js +5 -0
  973. node_ui/node_modules/lodash/fp/memoize.js +5 -0
  974. node_ui/node_modules/lodash/fp/merge.js +5 -0
  975. node_ui/node_modules/lodash/fp/mergeAll.js +5 -0
  976. node_ui/node_modules/lodash/fp/mergeAllWith.js +5 -0
  977. node_ui/node_modules/lodash/fp/mergeWith.js +5 -0
  978. node_ui/node_modules/lodash/fp/method.js +5 -0
  979. node_ui/node_modules/lodash/fp/methodOf.js +5 -0
  980. node_ui/node_modules/lodash/fp/min.js +5 -0
  981. node_ui/node_modules/lodash/fp/minBy.js +5 -0
  982. node_ui/node_modules/lodash/fp/mixin.js +5 -0
  983. node_ui/node_modules/lodash/fp/multiply.js +5 -0
  984. node_ui/node_modules/lodash/fp/nAry.js +1 -0
  985. node_ui/node_modules/lodash/fp/negate.js +5 -0
  986. node_ui/node_modules/lodash/fp/next.js +5 -0
  987. node_ui/node_modules/lodash/fp/noop.js +5 -0
  988. node_ui/node_modules/lodash/fp/now.js +5 -0
  989. node_ui/node_modules/lodash/fp/nth.js +5 -0
  990. node_ui/node_modules/lodash/fp/nthArg.js +5 -0
  991. node_ui/node_modules/lodash/fp/number.js +2 -0
  992. node_ui/node_modules/lodash/fp/object.js +2 -0
  993. node_ui/node_modules/lodash/fp/omit.js +5 -0
  994. node_ui/node_modules/lodash/fp/omitAll.js +1 -0
  995. node_ui/node_modules/lodash/fp/omitBy.js +5 -0
  996. node_ui/node_modules/lodash/fp/once.js +5 -0
  997. node_ui/node_modules/lodash/fp/orderBy.js +5 -0
  998. node_ui/node_modules/lodash/fp/over.js +5 -0
  999. node_ui/node_modules/lodash/fp/overArgs.js +5 -0
  1000. node_ui/node_modules/lodash/fp/overEvery.js +5 -0
  1001. node_ui/node_modules/lodash/fp/overSome.js +5 -0
  1002. node_ui/node_modules/lodash/fp/pad.js +5 -0
  1003. node_ui/node_modules/lodash/fp/padChars.js +5 -0
  1004. node_ui/node_modules/lodash/fp/padCharsEnd.js +5 -0
  1005. node_ui/node_modules/lodash/fp/padCharsStart.js +5 -0
  1006. node_ui/node_modules/lodash/fp/padEnd.js +5 -0
  1007. node_ui/node_modules/lodash/fp/padStart.js +5 -0
  1008. node_ui/node_modules/lodash/fp/parseInt.js +5 -0
  1009. node_ui/node_modules/lodash/fp/partial.js +5 -0
  1010. node_ui/node_modules/lodash/fp/partialRight.js +5 -0
  1011. node_ui/node_modules/lodash/fp/partition.js +5 -0
  1012. node_ui/node_modules/lodash/fp/path.js +1 -0
  1013. node_ui/node_modules/lodash/fp/pathEq.js +1 -0
  1014. node_ui/node_modules/lodash/fp/pathOr.js +1 -0
  1015. node_ui/node_modules/lodash/fp/paths.js +1 -0
  1016. node_ui/node_modules/lodash/fp/pick.js +5 -0
  1017. node_ui/node_modules/lodash/fp/pickAll.js +1 -0
  1018. node_ui/node_modules/lodash/fp/pickBy.js +5 -0
  1019. node_ui/node_modules/lodash/fp/pipe.js +1 -0
  1020. node_ui/node_modules/lodash/fp/placeholder.js +6 -0
  1021. node_ui/node_modules/lodash/fp/plant.js +5 -0
  1022. node_ui/node_modules/lodash/fp/pluck.js +1 -0
  1023. node_ui/node_modules/lodash/fp/prop.js +1 -0
  1024. node_ui/node_modules/lodash/fp/propEq.js +1 -0
  1025. node_ui/node_modules/lodash/fp/propOr.js +1 -0
  1026. node_ui/node_modules/lodash/fp/property.js +1 -0
  1027. node_ui/node_modules/lodash/fp/propertyOf.js +5 -0
  1028. node_ui/node_modules/lodash/fp/props.js +1 -0
  1029. node_ui/node_modules/lodash/fp/pull.js +5 -0
  1030. node_ui/node_modules/lodash/fp/pullAll.js +5 -0
  1031. node_ui/node_modules/lodash/fp/pullAllBy.js +5 -0
  1032. node_ui/node_modules/lodash/fp/pullAllWith.js +5 -0
  1033. node_ui/node_modules/lodash/fp/pullAt.js +5 -0
  1034. node_ui/node_modules/lodash/fp/random.js +5 -0
  1035. node_ui/node_modules/lodash/fp/range.js +5 -0
  1036. node_ui/node_modules/lodash/fp/rangeRight.js +5 -0
  1037. node_ui/node_modules/lodash/fp/rangeStep.js +5 -0
  1038. node_ui/node_modules/lodash/fp/rangeStepRight.js +5 -0
  1039. node_ui/node_modules/lodash/fp/rearg.js +5 -0
  1040. node_ui/node_modules/lodash/fp/reduce.js +5 -0
  1041. node_ui/node_modules/lodash/fp/reduceRight.js +5 -0
  1042. node_ui/node_modules/lodash/fp/reject.js +5 -0
  1043. node_ui/node_modules/lodash/fp/remove.js +5 -0
  1044. node_ui/node_modules/lodash/fp/repeat.js +5 -0
  1045. node_ui/node_modules/lodash/fp/replace.js +5 -0
  1046. node_ui/node_modules/lodash/fp/rest.js +5 -0
  1047. node_ui/node_modules/lodash/fp/restFrom.js +5 -0
  1048. node_ui/node_modules/lodash/fp/result.js +5 -0
  1049. node_ui/node_modules/lodash/fp/reverse.js +5 -0
  1050. node_ui/node_modules/lodash/fp/round.js +5 -0
  1051. node_ui/node_modules/lodash/fp/sample.js +5 -0
  1052. node_ui/node_modules/lodash/fp/sampleSize.js +5 -0
  1053. node_ui/node_modules/lodash/fp/seq.js +2 -0
  1054. node_ui/node_modules/lodash/fp/set.js +5 -0
  1055. node_ui/node_modules/lodash/fp/setWith.js +5 -0
  1056. node_ui/node_modules/lodash/fp/shuffle.js +5 -0
  1057. node_ui/node_modules/lodash/fp/size.js +5 -0
  1058. node_ui/node_modules/lodash/fp/slice.js +5 -0
  1059. node_ui/node_modules/lodash/fp/snakeCase.js +5 -0
  1060. node_ui/node_modules/lodash/fp/some.js +5 -0
  1061. node_ui/node_modules/lodash/fp/sortBy.js +5 -0
  1062. node_ui/node_modules/lodash/fp/sortedIndex.js +5 -0
  1063. node_ui/node_modules/lodash/fp/sortedIndexBy.js +5 -0
  1064. node_ui/node_modules/lodash/fp/sortedIndexOf.js +5 -0
  1065. node_ui/node_modules/lodash/fp/sortedLastIndex.js +5 -0
  1066. node_ui/node_modules/lodash/fp/sortedLastIndexBy.js +5 -0
  1067. node_ui/node_modules/lodash/fp/sortedLastIndexOf.js +5 -0
  1068. node_ui/node_modules/lodash/fp/sortedUniq.js +5 -0
  1069. node_ui/node_modules/lodash/fp/sortedUniqBy.js +5 -0
  1070. node_ui/node_modules/lodash/fp/split.js +5 -0
  1071. node_ui/node_modules/lodash/fp/spread.js +5 -0
  1072. node_ui/node_modules/lodash/fp/spreadFrom.js +5 -0
  1073. node_ui/node_modules/lodash/fp/startCase.js +5 -0
  1074. node_ui/node_modules/lodash/fp/startsWith.js +5 -0
  1075. node_ui/node_modules/lodash/fp/string.js +2 -0
  1076. node_ui/node_modules/lodash/fp/stubArray.js +5 -0
  1077. node_ui/node_modules/lodash/fp/stubFalse.js +5 -0
  1078. node_ui/node_modules/lodash/fp/stubObject.js +5 -0
  1079. node_ui/node_modules/lodash/fp/stubString.js +5 -0
  1080. node_ui/node_modules/lodash/fp/stubTrue.js +5 -0
  1081. node_ui/node_modules/lodash/fp/subtract.js +5 -0
  1082. node_ui/node_modules/lodash/fp/sum.js +5 -0
  1083. node_ui/node_modules/lodash/fp/sumBy.js +5 -0
  1084. node_ui/node_modules/lodash/fp/symmetricDifference.js +1 -0
  1085. node_ui/node_modules/lodash/fp/symmetricDifferenceBy.js +1 -0
  1086. node_ui/node_modules/lodash/fp/symmetricDifferenceWith.js +1 -0
  1087. node_ui/node_modules/lodash/fp/tail.js +5 -0
  1088. node_ui/node_modules/lodash/fp/take.js +5 -0
  1089. node_ui/node_modules/lodash/fp/takeLast.js +1 -0
  1090. node_ui/node_modules/lodash/fp/takeLastWhile.js +1 -0
  1091. node_ui/node_modules/lodash/fp/takeRight.js +5 -0
  1092. node_ui/node_modules/lodash/fp/takeRightWhile.js +5 -0
  1093. node_ui/node_modules/lodash/fp/takeWhile.js +5 -0
  1094. node_ui/node_modules/lodash/fp/tap.js +5 -0
  1095. node_ui/node_modules/lodash/fp/template.js +5 -0
  1096. node_ui/node_modules/lodash/fp/templateSettings.js +5 -0
  1097. node_ui/node_modules/lodash/fp/throttle.js +5 -0
  1098. node_ui/node_modules/lodash/fp/thru.js +5 -0
  1099. node_ui/node_modules/lodash/fp/times.js +5 -0
  1100. node_ui/node_modules/lodash/fp/toArray.js +5 -0
  1101. node_ui/node_modules/lodash/fp/toFinite.js +5 -0
  1102. node_ui/node_modules/lodash/fp/toInteger.js +5 -0
  1103. node_ui/node_modules/lodash/fp/toIterator.js +5 -0
  1104. node_ui/node_modules/lodash/fp/toJSON.js +5 -0
  1105. node_ui/node_modules/lodash/fp/toLength.js +5 -0
  1106. node_ui/node_modules/lodash/fp/toLower.js +5 -0
  1107. node_ui/node_modules/lodash/fp/toNumber.js +5 -0
  1108. node_ui/node_modules/lodash/fp/toPairs.js +5 -0
  1109. node_ui/node_modules/lodash/fp/toPairsIn.js +5 -0
  1110. node_ui/node_modules/lodash/fp/toPath.js +5 -0
  1111. node_ui/node_modules/lodash/fp/toPlainObject.js +5 -0
  1112. node_ui/node_modules/lodash/fp/toSafeInteger.js +5 -0
  1113. node_ui/node_modules/lodash/fp/toString.js +5 -0
  1114. node_ui/node_modules/lodash/fp/toUpper.js +5 -0
  1115. node_ui/node_modules/lodash/fp/transform.js +5 -0
  1116. node_ui/node_modules/lodash/fp/trim.js +5 -0
  1117. node_ui/node_modules/lodash/fp/trimChars.js +5 -0
  1118. node_ui/node_modules/lodash/fp/trimCharsEnd.js +5 -0
  1119. node_ui/node_modules/lodash/fp/trimCharsStart.js +5 -0
  1120. node_ui/node_modules/lodash/fp/trimEnd.js +5 -0
  1121. node_ui/node_modules/lodash/fp/trimStart.js +5 -0
  1122. node_ui/node_modules/lodash/fp/truncate.js +5 -0
  1123. node_ui/node_modules/lodash/fp/unapply.js +1 -0
  1124. node_ui/node_modules/lodash/fp/unary.js +5 -0
  1125. node_ui/node_modules/lodash/fp/unescape.js +5 -0
  1126. node_ui/node_modules/lodash/fp/union.js +5 -0
  1127. node_ui/node_modules/lodash/fp/unionBy.js +5 -0
  1128. node_ui/node_modules/lodash/fp/unionWith.js +5 -0
  1129. node_ui/node_modules/lodash/fp/uniq.js +5 -0
  1130. node_ui/node_modules/lodash/fp/uniqBy.js +5 -0
  1131. node_ui/node_modules/lodash/fp/uniqWith.js +5 -0
  1132. node_ui/node_modules/lodash/fp/uniqueId.js +5 -0
  1133. node_ui/node_modules/lodash/fp/unnest.js +1 -0
  1134. node_ui/node_modules/lodash/fp/unset.js +5 -0
  1135. node_ui/node_modules/lodash/fp/unzip.js +5 -0
  1136. node_ui/node_modules/lodash/fp/unzipWith.js +5 -0
  1137. node_ui/node_modules/lodash/fp/update.js +5 -0
  1138. node_ui/node_modules/lodash/fp/updateWith.js +5 -0
  1139. node_ui/node_modules/lodash/fp/upperCase.js +5 -0
  1140. node_ui/node_modules/lodash/fp/upperFirst.js +5 -0
  1141. node_ui/node_modules/lodash/fp/useWith.js +1 -0
  1142. node_ui/node_modules/lodash/fp/util.js +2 -0
  1143. node_ui/node_modules/lodash/fp/value.js +5 -0
  1144. node_ui/node_modules/lodash/fp/valueOf.js +5 -0
  1145. node_ui/node_modules/lodash/fp/values.js +5 -0
  1146. node_ui/node_modules/lodash/fp/valuesIn.js +5 -0
  1147. node_ui/node_modules/lodash/fp/where.js +1 -0
  1148. node_ui/node_modules/lodash/fp/whereEq.js +1 -0
  1149. node_ui/node_modules/lodash/fp/without.js +5 -0
  1150. node_ui/node_modules/lodash/fp/words.js +5 -0
  1151. node_ui/node_modules/lodash/fp/wrap.js +5 -0
  1152. node_ui/node_modules/lodash/fp/wrapperAt.js +5 -0
  1153. node_ui/node_modules/lodash/fp/wrapperChain.js +5 -0
  1154. node_ui/node_modules/lodash/fp/wrapperLodash.js +5 -0
  1155. node_ui/node_modules/lodash/fp/wrapperReverse.js +5 -0
  1156. node_ui/node_modules/lodash/fp/wrapperValue.js +5 -0
  1157. node_ui/node_modules/lodash/fp/xor.js +5 -0
  1158. node_ui/node_modules/lodash/fp/xorBy.js +5 -0
  1159. node_ui/node_modules/lodash/fp/xorWith.js +5 -0
  1160. node_ui/node_modules/lodash/fp/zip.js +5 -0
  1161. node_ui/node_modules/lodash/fp/zipAll.js +5 -0
  1162. node_ui/node_modules/lodash/fp/zipObj.js +1 -0
  1163. node_ui/node_modules/lodash/fp/zipObject.js +5 -0
  1164. node_ui/node_modules/lodash/fp/zipObjectDeep.js +5 -0
  1165. node_ui/node_modules/lodash/fp/zipWith.js +5 -0
  1166. node_ui/node_modules/lodash/fp.js +2 -0
  1167. node_ui/node_modules/lodash/fromPairs.js +28 -0
  1168. node_ui/node_modules/lodash/function.js +25 -0
  1169. node_ui/node_modules/lodash/functions.js +31 -0
  1170. node_ui/node_modules/lodash/functionsIn.js +31 -0
  1171. node_ui/node_modules/lodash/get.js +33 -0
  1172. node_ui/node_modules/lodash/groupBy.js +41 -0
  1173. node_ui/node_modules/lodash/gt.js +29 -0
  1174. node_ui/node_modules/lodash/gte.js +30 -0
  1175. node_ui/node_modules/lodash/has.js +35 -0
  1176. node_ui/node_modules/lodash/hasIn.js +34 -0
  1177. node_ui/node_modules/lodash/head.js +23 -0
  1178. node_ui/node_modules/lodash/identity.js +21 -0
  1179. node_ui/node_modules/lodash/inRange.js +55 -0
  1180. node_ui/node_modules/lodash/includes.js +53 -0
  1181. node_ui/node_modules/lodash/index.js +1 -0
  1182. node_ui/node_modules/lodash/indexOf.js +42 -0
  1183. node_ui/node_modules/lodash/initial.js +22 -0
  1184. node_ui/node_modules/lodash/intersection.js +30 -0
  1185. node_ui/node_modules/lodash/intersectionBy.js +45 -0
  1186. node_ui/node_modules/lodash/intersectionWith.js +41 -0
  1187. node_ui/node_modules/lodash/invert.js +42 -0
  1188. node_ui/node_modules/lodash/invertBy.js +56 -0
  1189. node_ui/node_modules/lodash/invoke.js +24 -0
  1190. node_ui/node_modules/lodash/invokeMap.js +41 -0
  1191. node_ui/node_modules/lodash/isArguments.js +36 -0
  1192. node_ui/node_modules/lodash/isArray.js +26 -0
  1193. node_ui/node_modules/lodash/isArrayBuffer.js +27 -0
  1194. node_ui/node_modules/lodash/isArrayLike.js +33 -0
  1195. node_ui/node_modules/lodash/isArrayLikeObject.js +33 -0
  1196. node_ui/node_modules/lodash/isBoolean.js +29 -0
  1197. node_ui/node_modules/lodash/isBuffer.js +38 -0
  1198. node_ui/node_modules/lodash/isDate.js +27 -0
  1199. node_ui/node_modules/lodash/isElement.js +25 -0
  1200. node_ui/node_modules/lodash/isEmpty.js +77 -0
  1201. node_ui/node_modules/lodash/isEqual.js +35 -0
  1202. node_ui/node_modules/lodash/isEqualWith.js +41 -0
  1203. node_ui/node_modules/lodash/isError.js +36 -0
  1204. node_ui/node_modules/lodash/isFinite.js +36 -0
  1205. node_ui/node_modules/lodash/isFunction.js +37 -0
  1206. node_ui/node_modules/lodash/isInteger.js +33 -0
  1207. node_ui/node_modules/lodash/isLength.js +35 -0
  1208. node_ui/node_modules/lodash/isMap.js +27 -0
  1209. node_ui/node_modules/lodash/isMatch.js +36 -0
  1210. node_ui/node_modules/lodash/isMatchWith.js +41 -0
  1211. node_ui/node_modules/lodash/isNaN.js +38 -0
  1212. node_ui/node_modules/lodash/isNative.js +40 -0
  1213. node_ui/node_modules/lodash/isNil.js +25 -0
  1214. node_ui/node_modules/lodash/isNull.js +22 -0
  1215. node_ui/node_modules/lodash/isNumber.js +38 -0
  1216. node_ui/node_modules/lodash/isObject.js +31 -0
  1217. node_ui/node_modules/lodash/isObjectLike.js +29 -0
  1218. node_ui/node_modules/lodash/isPlainObject.js +62 -0
  1219. node_ui/node_modules/lodash/isRegExp.js +27 -0
  1220. node_ui/node_modules/lodash/isSafeInteger.js +37 -0
  1221. node_ui/node_modules/lodash/isSet.js +27 -0
  1222. node_ui/node_modules/lodash/isString.js +30 -0
  1223. node_ui/node_modules/lodash/isSymbol.js +29 -0
  1224. node_ui/node_modules/lodash/isTypedArray.js +27 -0
  1225. node_ui/node_modules/lodash/isUndefined.js +22 -0
  1226. node_ui/node_modules/lodash/isWeakMap.js +28 -0
  1227. node_ui/node_modules/lodash/isWeakSet.js +28 -0
  1228. node_ui/node_modules/lodash/iteratee.js +53 -0
  1229. node_ui/node_modules/lodash/join.js +26 -0
  1230. node_ui/node_modules/lodash/kebabCase.js +28 -0
  1231. node_ui/node_modules/lodash/keyBy.js +36 -0
  1232. node_ui/node_modules/lodash/keys.js +37 -0
  1233. node_ui/node_modules/lodash/keysIn.js +32 -0
  1234. node_ui/node_modules/lodash/lang.js +58 -0
  1235. node_ui/node_modules/lodash/last.js +20 -0
  1236. node_ui/node_modules/lodash/lastIndexOf.js +46 -0
  1237. node_ui/node_modules/lodash/lodash.js +17209 -0
  1238. node_ui/node_modules/lodash/lodash.min.js +140 -0
  1239. node_ui/node_modules/lodash/lowerCase.js +27 -0
  1240. node_ui/node_modules/lodash/lowerFirst.js +22 -0
  1241. node_ui/node_modules/lodash/lt.js +29 -0
  1242. node_ui/node_modules/lodash/lte.js +30 -0
  1243. node_ui/node_modules/lodash/map.js +53 -0
  1244. node_ui/node_modules/lodash/mapKeys.js +36 -0
  1245. node_ui/node_modules/lodash/mapValues.js +43 -0
  1246. node_ui/node_modules/lodash/matches.js +46 -0
  1247. node_ui/node_modules/lodash/matchesProperty.js +44 -0
  1248. node_ui/node_modules/lodash/math.js +17 -0
  1249. node_ui/node_modules/lodash/max.js +29 -0
  1250. node_ui/node_modules/lodash/maxBy.js +34 -0
  1251. node_ui/node_modules/lodash/mean.js +22 -0
  1252. node_ui/node_modules/lodash/meanBy.js +31 -0
  1253. node_ui/node_modules/lodash/memoize.js +73 -0
  1254. node_ui/node_modules/lodash/merge.js +39 -0
  1255. node_ui/node_modules/lodash/mergeWith.js +39 -0
  1256. node_ui/node_modules/lodash/method.js +34 -0
  1257. node_ui/node_modules/lodash/methodOf.js +33 -0
  1258. node_ui/node_modules/lodash/min.js +29 -0
  1259. node_ui/node_modules/lodash/minBy.js +34 -0
  1260. node_ui/node_modules/lodash/mixin.js +74 -0
  1261. node_ui/node_modules/lodash/multiply.js +22 -0
  1262. node_ui/node_modules/lodash/negate.js +40 -0
  1263. node_ui/node_modules/lodash/next.js +35 -0
  1264. node_ui/node_modules/lodash/noop.js +17 -0
  1265. node_ui/node_modules/lodash/now.js +23 -0
  1266. node_ui/node_modules/lodash/nth.js +29 -0
  1267. node_ui/node_modules/lodash/nthArg.js +32 -0
  1268. node_ui/node_modules/lodash/number.js +5 -0
  1269. node_ui/node_modules/lodash/object.js +49 -0
  1270. node_ui/node_modules/lodash/omit.js +57 -0
  1271. node_ui/node_modules/lodash/omitBy.js +29 -0
  1272. node_ui/node_modules/lodash/once.js +25 -0
  1273. node_ui/node_modules/lodash/orderBy.js +47 -0
  1274. node_ui/node_modules/lodash/over.js +24 -0
  1275. node_ui/node_modules/lodash/overArgs.js +61 -0
  1276. node_ui/node_modules/lodash/overEvery.js +34 -0
  1277. node_ui/node_modules/lodash/overSome.js +37 -0
  1278. node_ui/node_modules/lodash/package.json +17 -0
  1279. node_ui/node_modules/lodash/pad.js +49 -0
  1280. node_ui/node_modules/lodash/padEnd.js +39 -0
  1281. node_ui/node_modules/lodash/padStart.js +39 -0
  1282. node_ui/node_modules/lodash/parseInt.js +43 -0
  1283. node_ui/node_modules/lodash/partial.js +50 -0
  1284. node_ui/node_modules/lodash/partialRight.js +49 -0
  1285. node_ui/node_modules/lodash/partition.js +43 -0
  1286. node_ui/node_modules/lodash/pick.js +25 -0
  1287. node_ui/node_modules/lodash/pickBy.js +37 -0
  1288. node_ui/node_modules/lodash/plant.js +48 -0
  1289. node_ui/node_modules/lodash/property.js +32 -0
  1290. node_ui/node_modules/lodash/propertyOf.js +30 -0
  1291. node_ui/node_modules/lodash/pull.js +29 -0
  1292. node_ui/node_modules/lodash/pullAll.js +29 -0
  1293. node_ui/node_modules/lodash/pullAllBy.js +33 -0
  1294. node_ui/node_modules/lodash/pullAllWith.js +32 -0
  1295. node_ui/node_modules/lodash/pullAt.js +43 -0
  1296. node_ui/node_modules/lodash/random.js +82 -0
  1297. node_ui/node_modules/lodash/range.js +46 -0
  1298. node_ui/node_modules/lodash/rangeRight.js +41 -0
  1299. node_ui/node_modules/lodash/rearg.js +33 -0
  1300. node_ui/node_modules/lodash/reduce.js +51 -0
  1301. node_ui/node_modules/lodash/reduceRight.js +36 -0
  1302. node_ui/node_modules/lodash/reject.js +46 -0
  1303. node_ui/node_modules/lodash/release.md +48 -0
  1304. node_ui/node_modules/lodash/remove.js +53 -0
  1305. node_ui/node_modules/lodash/repeat.js +37 -0
  1306. node_ui/node_modules/lodash/replace.js +29 -0
  1307. node_ui/node_modules/lodash/rest.js +40 -0
  1308. node_ui/node_modules/lodash/result.js +56 -0
  1309. node_ui/node_modules/lodash/reverse.js +34 -0
  1310. node_ui/node_modules/lodash/round.js +26 -0
  1311. node_ui/node_modules/lodash/sample.js +24 -0
  1312. node_ui/node_modules/lodash/sampleSize.js +37 -0
  1313. node_ui/node_modules/lodash/seq.js +16 -0
  1314. node_ui/node_modules/lodash/set.js +35 -0
  1315. node_ui/node_modules/lodash/setWith.js +32 -0
  1316. node_ui/node_modules/lodash/shuffle.js +25 -0
  1317. node_ui/node_modules/lodash/size.js +46 -0
  1318. node_ui/node_modules/lodash/slice.js +37 -0
  1319. node_ui/node_modules/lodash/snakeCase.js +28 -0
  1320. node_ui/node_modules/lodash/some.js +51 -0
  1321. node_ui/node_modules/lodash/sortBy.js +48 -0
  1322. node_ui/node_modules/lodash/sortedIndex.js +24 -0
  1323. node_ui/node_modules/lodash/sortedIndexBy.js +33 -0
  1324. node_ui/node_modules/lodash/sortedIndexOf.js +31 -0
  1325. node_ui/node_modules/lodash/sortedLastIndex.js +25 -0
  1326. node_ui/node_modules/lodash/sortedLastIndexBy.js +33 -0
  1327. node_ui/node_modules/lodash/sortedLastIndexOf.js +31 -0
  1328. node_ui/node_modules/lodash/sortedUniq.js +24 -0
  1329. node_ui/node_modules/lodash/sortedUniqBy.js +26 -0
  1330. node_ui/node_modules/lodash/split.js +52 -0
  1331. node_ui/node_modules/lodash/spread.js +63 -0
  1332. node_ui/node_modules/lodash/startCase.js +29 -0
  1333. node_ui/node_modules/lodash/startsWith.js +39 -0
  1334. node_ui/node_modules/lodash/string.js +33 -0
  1335. node_ui/node_modules/lodash/stubArray.js +23 -0
  1336. node_ui/node_modules/lodash/stubFalse.js +18 -0
  1337. node_ui/node_modules/lodash/stubObject.js +23 -0
  1338. node_ui/node_modules/lodash/stubString.js +18 -0
  1339. node_ui/node_modules/lodash/stubTrue.js +18 -0
  1340. node_ui/node_modules/lodash/subtract.js +22 -0
  1341. node_ui/node_modules/lodash/sum.js +24 -0
  1342. node_ui/node_modules/lodash/sumBy.js +33 -0
  1343. node_ui/node_modules/lodash/tail.js +22 -0
  1344. node_ui/node_modules/lodash/take.js +37 -0
  1345. node_ui/node_modules/lodash/takeRight.js +39 -0
  1346. node_ui/node_modules/lodash/takeRightWhile.js +45 -0
  1347. node_ui/node_modules/lodash/takeWhile.js +45 -0
  1348. node_ui/node_modules/lodash/tap.js +29 -0
  1349. node_ui/node_modules/lodash/template.js +272 -0
  1350. node_ui/node_modules/lodash/templateSettings.js +67 -0
  1351. node_ui/node_modules/lodash/throttle.js +69 -0
  1352. node_ui/node_modules/lodash/thru.js +28 -0
  1353. node_ui/node_modules/lodash/times.js +51 -0
  1354. node_ui/node_modules/lodash/toArray.js +58 -0
  1355. node_ui/node_modules/lodash/toFinite.js +42 -0
  1356. node_ui/node_modules/lodash/toInteger.js +36 -0
  1357. node_ui/node_modules/lodash/toIterator.js +23 -0
  1358. node_ui/node_modules/lodash/toJSON.js +1 -0
  1359. node_ui/node_modules/lodash/toLength.js +38 -0
  1360. node_ui/node_modules/lodash/toLower.js +28 -0
  1361. node_ui/node_modules/lodash/toNumber.js +64 -0
  1362. node_ui/node_modules/lodash/toPairs.js +30 -0
  1363. node_ui/node_modules/lodash/toPairsIn.js +30 -0
  1364. node_ui/node_modules/lodash/toPath.js +33 -0
  1365. node_ui/node_modules/lodash/toPlainObject.js +32 -0
  1366. node_ui/node_modules/lodash/toSafeInteger.js +37 -0
  1367. node_ui/node_modules/lodash/toString.js +28 -0
  1368. node_ui/node_modules/lodash/toUpper.js +28 -0
  1369. node_ui/node_modules/lodash/transform.js +65 -0
  1370. node_ui/node_modules/lodash/trim.js +47 -0
  1371. node_ui/node_modules/lodash/trimEnd.js +41 -0
  1372. node_ui/node_modules/lodash/trimStart.js +43 -0
  1373. node_ui/node_modules/lodash/truncate.js +111 -0
  1374. node_ui/node_modules/lodash/unary.js +22 -0
  1375. node_ui/node_modules/lodash/unescape.js +34 -0
  1376. node_ui/node_modules/lodash/union.js +26 -0
  1377. node_ui/node_modules/lodash/unionBy.js +39 -0
  1378. node_ui/node_modules/lodash/unionWith.js +34 -0
  1379. node_ui/node_modules/lodash/uniq.js +25 -0
  1380. node_ui/node_modules/lodash/uniqBy.js +31 -0
  1381. node_ui/node_modules/lodash/uniqWith.js +28 -0
  1382. node_ui/node_modules/lodash/uniqueId.js +28 -0
  1383. node_ui/node_modules/lodash/unset.js +34 -0
  1384. node_ui/node_modules/lodash/unzip.js +45 -0
  1385. node_ui/node_modules/lodash/unzipWith.js +39 -0
  1386. node_ui/node_modules/lodash/update.js +35 -0
  1387. node_ui/node_modules/lodash/updateWith.js +33 -0
  1388. node_ui/node_modules/lodash/upperCase.js +27 -0
  1389. node_ui/node_modules/lodash/upperFirst.js +22 -0
  1390. node_ui/node_modules/lodash/util.js +34 -0
  1391. node_ui/node_modules/lodash/value.js +1 -0
  1392. node_ui/node_modules/lodash/valueOf.js +1 -0
  1393. node_ui/node_modules/lodash/values.js +34 -0
  1394. node_ui/node_modules/lodash/valuesIn.js +32 -0
  1395. node_ui/node_modules/lodash/without.js +31 -0
  1396. node_ui/node_modules/lodash/words.js +35 -0
  1397. node_ui/node_modules/lodash/wrap.js +30 -0
  1398. node_ui/node_modules/lodash/wrapperAt.js +48 -0
  1399. node_ui/node_modules/lodash/wrapperChain.js +34 -0
  1400. node_ui/node_modules/lodash/wrapperLodash.js +147 -0
  1401. node_ui/node_modules/lodash/wrapperReverse.js +44 -0
  1402. node_ui/node_modules/lodash/wrapperValue.js +21 -0
  1403. node_ui/node_modules/lodash/xor.js +28 -0
  1404. node_ui/node_modules/lodash/xorBy.js +39 -0
  1405. node_ui/node_modules/lodash/xorWith.js +34 -0
  1406. node_ui/node_modules/lodash/zip.js +22 -0
  1407. node_ui/node_modules/lodash/zipObject.js +24 -0
  1408. node_ui/node_modules/lodash/zipObjectDeep.js +23 -0
  1409. node_ui/node_modules/lodash/zipWith.js +32 -0
  1410. node_ui/node_modules/lodash.isequal/LICENSE +47 -0
  1411. node_ui/node_modules/lodash.isequal/README.md +18 -0
  1412. node_ui/node_modules/lodash.isequal/index.js +1848 -0
  1413. node_ui/node_modules/lodash.isequal/package.json +16 -0
  1414. node_ui/node_modules/loose-envify/LICENSE +21 -0
  1415. node_ui/node_modules/loose-envify/README.md +45 -0
  1416. node_ui/node_modules/loose-envify/cli.js +16 -0
  1417. node_ui/node_modules/loose-envify/custom.js +4 -0
  1418. node_ui/node_modules/loose-envify/index.js +3 -0
  1419. node_ui/node_modules/loose-envify/loose-envify.js +36 -0
  1420. node_ui/node_modules/loose-envify/package.json +36 -0
  1421. node_ui/node_modules/loose-envify/replace.js +65 -0
  1422. node_ui/node_modules/meow/build/dependencies.js +8828 -0
  1423. node_ui/node_modules/meow/build/index.d.ts +1425 -0
  1424. node_ui/node_modules/meow/build/index.js +95 -0
  1425. node_ui/node_modules/meow/build/licenses.md +1620 -0
  1426. node_ui/node_modules/meow/build/options.js +92 -0
  1427. node_ui/node_modules/meow/build/parser.js +84 -0
  1428. node_ui/node_modules/meow/build/utils.js +7 -0
  1429. node_ui/node_modules/meow/build/validate.js +122 -0
  1430. node_ui/node_modules/meow/license +9 -0
  1431. node_ui/node_modules/meow/package.json +105 -0
  1432. node_ui/node_modules/meow/readme.md +314 -0
  1433. node_ui/node_modules/mimic-fn/index.d.ts +54 -0
  1434. node_ui/node_modules/mimic-fn/index.js +13 -0
  1435. node_ui/node_modules/mimic-fn/license +9 -0
  1436. node_ui/node_modules/mimic-fn/package.json +42 -0
  1437. node_ui/node_modules/mimic-fn/readme.md +69 -0
  1438. node_ui/node_modules/onetime/index.d.ts +64 -0
  1439. node_ui/node_modules/onetime/index.js +44 -0
  1440. node_ui/node_modules/onetime/license +9 -0
  1441. node_ui/node_modules/onetime/package.json +43 -0
  1442. node_ui/node_modules/onetime/readme.md +94 -0
  1443. node_ui/node_modules/patch-console/dist/index.d.ts +4 -0
  1444. node_ui/node_modules/patch-console/dist/index.js +45 -0
  1445. node_ui/node_modules/patch-console/dist/index.js.map +1 -0
  1446. node_ui/node_modules/patch-console/license +9 -0
  1447. node_ui/node_modules/patch-console/package.json +53 -0
  1448. node_ui/node_modules/patch-console/readme.md +62 -0
  1449. node_ui/node_modules/react/LICENSE +21 -0
  1450. node_ui/node_modules/react/README.md +37 -0
  1451. node_ui/node_modules/react/cjs/react-jsx-dev-runtime.development.js +1315 -0
  1452. node_ui/node_modules/react/cjs/react-jsx-dev-runtime.production.min.js +10 -0
  1453. node_ui/node_modules/react/cjs/react-jsx-dev-runtime.profiling.min.js +10 -0
  1454. node_ui/node_modules/react/cjs/react-jsx-runtime.development.js +1333 -0
  1455. node_ui/node_modules/react/cjs/react-jsx-runtime.production.min.js +11 -0
  1456. node_ui/node_modules/react/cjs/react-jsx-runtime.profiling.min.js +11 -0
  1457. node_ui/node_modules/react/cjs/react.development.js +2740 -0
  1458. node_ui/node_modules/react/cjs/react.production.min.js +26 -0
  1459. node_ui/node_modules/react/cjs/react.shared-subset.development.js +20 -0
  1460. node_ui/node_modules/react/cjs/react.shared-subset.production.min.js +10 -0
  1461. node_ui/node_modules/react/index.js +7 -0
  1462. node_ui/node_modules/react/jsx-dev-runtime.js +7 -0
  1463. node_ui/node_modules/react/jsx-runtime.js +7 -0
  1464. node_ui/node_modules/react/package.json +47 -0
  1465. node_ui/node_modules/react/react.shared-subset.js +7 -0
  1466. node_ui/node_modules/react/umd/react.development.js +3343 -0
  1467. node_ui/node_modules/react/umd/react.production.min.js +31 -0
  1468. node_ui/node_modules/react/umd/react.profiling.min.js +31 -0
  1469. node_ui/node_modules/react-devtools-core/README.md +131 -0
  1470. node_ui/node_modules/react-devtools-core/backend.js +1 -0
  1471. node_ui/node_modules/react-devtools-core/dist/backend.js +16888 -0
  1472. node_ui/node_modules/react-devtools-core/dist/backend.js.map +1 -0
  1473. node_ui/node_modules/react-devtools-core/dist/importFile.worker.worker.js +2 -0
  1474. node_ui/node_modules/react-devtools-core/dist/importFile.worker.worker.js.map +1 -0
  1475. node_ui/node_modules/react-devtools-core/dist/parseHookNames.chunk.js +2 -0
  1476. node_ui/node_modules/react-devtools-core/dist/parseHookNames.chunk.js.map +1 -0
  1477. node_ui/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js +2 -0
  1478. node_ui/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js.map +1 -0
  1479. node_ui/node_modules/react-devtools-core/dist/standalone.js +3 -0
  1480. node_ui/node_modules/react-devtools-core/dist/standalone.js.LICENSE.txt +41 -0
  1481. node_ui/node_modules/react-devtools-core/dist/standalone.js.map +1 -0
  1482. node_ui/node_modules/react-devtools-core/node_modules/ws/LICENSE +21 -0
  1483. node_ui/node_modules/react-devtools-core/node_modules/ws/README.md +495 -0
  1484. node_ui/node_modules/react-devtools-core/node_modules/ws/browser.js +8 -0
  1485. node_ui/node_modules/react-devtools-core/node_modules/ws/index.js +10 -0
  1486. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/buffer-util.js +129 -0
  1487. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/constants.js +10 -0
  1488. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/event-target.js +184 -0
  1489. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/extension.js +223 -0
  1490. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/limiter.js +55 -0
  1491. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/permessage-deflate.js +518 -0
  1492. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/receiver.js +607 -0
  1493. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/sender.js +409 -0
  1494. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/stream.js +180 -0
  1495. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/validation.js +104 -0
  1496. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/websocket-server.js +449 -0
  1497. node_ui/node_modules/react-devtools-core/node_modules/ws/lib/websocket.js +1197 -0
  1498. node_ui/node_modules/react-devtools-core/node_modules/ws/package.json +56 -0
  1499. node_ui/node_modules/react-devtools-core/package.json +38 -0
  1500. node_ui/node_modules/react-devtools-core/standalone.js +1 -0
  1501. node_ui/node_modules/react-reconciler/LICENSE +21 -0
  1502. node_ui/node_modules/react-reconciler/README.md +337 -0
  1503. node_ui/node_modules/react-reconciler/cjs/react-reconciler-constants.development.js +45 -0
  1504. node_ui/node_modules/react-reconciler/cjs/react-reconciler-constants.production.min.js +10 -0
  1505. node_ui/node_modules/react-reconciler/cjs/react-reconciler-reflection.development.js +660 -0
  1506. node_ui/node_modules/react-reconciler/cjs/react-reconciler-reflection.production.min.js +15 -0
  1507. node_ui/node_modules/react-reconciler/cjs/react-reconciler.development.js +21531 -0
  1508. node_ui/node_modules/react-reconciler/cjs/react-reconciler.production.min.js +234 -0
  1509. node_ui/node_modules/react-reconciler/cjs/react-reconciler.profiling.min.js +255 -0
  1510. node_ui/node_modules/react-reconciler/constants.js +7 -0
  1511. node_ui/node_modules/react-reconciler/index.js +7 -0
  1512. node_ui/node_modules/react-reconciler/package.json +40 -0
  1513. node_ui/node_modules/react-reconciler/reflection.js +7 -0
  1514. node_ui/node_modules/restore-cursor/index.d.ts +11 -0
  1515. node_ui/node_modules/restore-cursor/index.js +11 -0
  1516. node_ui/node_modules/restore-cursor/license +9 -0
  1517. node_ui/node_modules/restore-cursor/package.json +55 -0
  1518. node_ui/node_modules/restore-cursor/readme.md +31 -0
  1519. node_ui/node_modules/scheduler/LICENSE +21 -0
  1520. node_ui/node_modules/scheduler/README.md +9 -0
  1521. node_ui/node_modules/scheduler/cjs/scheduler-unstable_mock.development.js +700 -0
  1522. node_ui/node_modules/scheduler/cjs/scheduler-unstable_mock.production.min.js +20 -0
  1523. node_ui/node_modules/scheduler/cjs/scheduler-unstable_post_task.development.js +207 -0
  1524. node_ui/node_modules/scheduler/cjs/scheduler-unstable_post_task.production.min.js +14 -0
  1525. node_ui/node_modules/scheduler/cjs/scheduler.development.js +634 -0
  1526. node_ui/node_modules/scheduler/cjs/scheduler.production.min.js +19 -0
  1527. node_ui/node_modules/scheduler/index.js +7 -0
  1528. node_ui/node_modules/scheduler/package.json +36 -0
  1529. node_ui/node_modules/scheduler/umd/scheduler-unstable_mock.development.js +699 -0
  1530. node_ui/node_modules/scheduler/umd/scheduler-unstable_mock.production.min.js +19 -0
  1531. node_ui/node_modules/scheduler/umd/scheduler.development.js +152 -0
  1532. node_ui/node_modules/scheduler/umd/scheduler.production.min.js +146 -0
  1533. node_ui/node_modules/scheduler/umd/scheduler.profiling.min.js +146 -0
  1534. node_ui/node_modules/scheduler/unstable_mock.js +7 -0
  1535. node_ui/node_modules/scheduler/unstable_post_task.js +7 -0
  1536. node_ui/node_modules/shell-quote/.eslintrc +30 -0
  1537. node_ui/node_modules/shell-quote/.github/FUNDING.yml +12 -0
  1538. node_ui/node_modules/shell-quote/.nycrc +14 -0
  1539. node_ui/node_modules/shell-quote/LICENSE +24 -0
  1540. node_ui/node_modules/shell-quote/README.md +161 -0
  1541. node_ui/node_modules/shell-quote/index.js +4 -0
  1542. node_ui/node_modules/shell-quote/package.json +72 -0
  1543. node_ui/node_modules/shell-quote/parse.js +226 -0
  1544. node_ui/node_modules/shell-quote/print.py +3 -0
  1545. node_ui/node_modules/shell-quote/quote.js +19 -0
  1546. node_ui/node_modules/shell-quote/security.md +11 -0
  1547. node_ui/node_modules/shell-quote/test/comment.js +16 -0
  1548. node_ui/node_modules/shell-quote/test/env.js +52 -0
  1549. node_ui/node_modules/shell-quote/test/env_fn.js +21 -0
  1550. node_ui/node_modules/shell-quote/test/op.js +102 -0
  1551. node_ui/node_modules/shell-quote/test/parse.js +44 -0
  1552. node_ui/node_modules/shell-quote/test/quote.js +60 -0
  1553. node_ui/node_modules/shell-quote/test/set.js +31 -0
  1554. node_ui/node_modules/signal-exit/LICENSE.txt +16 -0
  1555. node_ui/node_modules/signal-exit/README.md +39 -0
  1556. node_ui/node_modules/signal-exit/index.js +202 -0
  1557. node_ui/node_modules/signal-exit/package.json +38 -0
  1558. node_ui/node_modules/signal-exit/signals.js +53 -0
  1559. node_ui/node_modules/slice-ansi/index.d.ts +19 -0
  1560. node_ui/node_modules/slice-ansi/index.js +169 -0
  1561. node_ui/node_modules/slice-ansi/license +10 -0
  1562. node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
  1563. node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/index.js +12 -0
  1564. node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/license +9 -0
  1565. node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/package.json +53 -0
  1566. node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/readme.md +31 -0
  1567. node_ui/node_modules/slice-ansi/package.json +58 -0
  1568. node_ui/node_modules/slice-ansi/readme.md +54 -0
  1569. node_ui/node_modules/stack-utils/LICENSE.md +21 -0
  1570. node_ui/node_modules/stack-utils/index.js +344 -0
  1571. node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/index.d.ts +18 -0
  1572. node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/index.js +11 -0
  1573. node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/license +9 -0
  1574. node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/package.json +43 -0
  1575. node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/readme.md +29 -0
  1576. node_ui/node_modules/stack-utils/package.json +39 -0
  1577. node_ui/node_modules/stack-utils/readme.md +143 -0
  1578. node_ui/node_modules/string-width/index.d.ts +39 -0
  1579. node_ui/node_modules/string-width/index.js +82 -0
  1580. node_ui/node_modules/string-width/license +9 -0
  1581. node_ui/node_modules/string-width/package.json +64 -0
  1582. node_ui/node_modules/string-width/readme.md +66 -0
  1583. node_ui/node_modules/strip-ansi/index.d.ts +15 -0
  1584. node_ui/node_modules/strip-ansi/index.js +14 -0
  1585. node_ui/node_modules/strip-ansi/license +9 -0
  1586. node_ui/node_modules/strip-ansi/package.json +59 -0
  1587. node_ui/node_modules/strip-ansi/readme.md +37 -0
  1588. node_ui/node_modules/to-rotated/index.d.ts +18 -0
  1589. node_ui/node_modules/to-rotated/index.js +24 -0
  1590. node_ui/node_modules/to-rotated/license +9 -0
  1591. node_ui/node_modules/to-rotated/package.json +46 -0
  1592. node_ui/node_modules/to-rotated/readme.md +29 -0
  1593. node_ui/node_modules/type-fest/index.d.ts +178 -0
  1594. node_ui/node_modules/type-fest/license-cc0 +121 -0
  1595. node_ui/node_modules/type-fest/license-mit +9 -0
  1596. node_ui/node_modules/type-fest/package.json +91 -0
  1597. node_ui/node_modules/type-fest/readme.md +1060 -0
  1598. node_ui/node_modules/type-fest/source/all-union-fields.d.ts +88 -0
  1599. node_ui/node_modules/type-fest/source/and.d.ts +25 -0
  1600. node_ui/node_modules/type-fest/source/array-indices.d.ts +23 -0
  1601. node_ui/node_modules/type-fest/source/array-slice.d.ts +109 -0
  1602. node_ui/node_modules/type-fest/source/array-splice.d.ts +99 -0
  1603. node_ui/node_modules/type-fest/source/array-tail.d.ts +76 -0
  1604. node_ui/node_modules/type-fest/source/array-values.d.ts +22 -0
  1605. node_ui/node_modules/type-fest/source/arrayable.d.ts +29 -0
  1606. node_ui/node_modules/type-fest/source/async-return-type.d.ts +23 -0
  1607. node_ui/node_modules/type-fest/source/asyncify.d.ts +32 -0
  1608. node_ui/node_modules/type-fest/source/basic.d.ts +68 -0
  1609. node_ui/node_modules/type-fest/source/camel-case.d.ts +89 -0
  1610. node_ui/node_modules/type-fest/source/camel-cased-properties-deep.d.ts +97 -0
  1611. node_ui/node_modules/type-fest/source/camel-cased-properties.d.ts +43 -0
  1612. node_ui/node_modules/type-fest/source/conditional-except.d.ts +45 -0
  1613. node_ui/node_modules/type-fest/source/conditional-keys.d.ts +47 -0
  1614. node_ui/node_modules/type-fest/source/conditional-pick-deep.d.ts +118 -0
  1615. node_ui/node_modules/type-fest/source/conditional-pick.d.ts +44 -0
  1616. node_ui/node_modules/type-fest/source/conditional-simplify.d.ts +32 -0
  1617. node_ui/node_modules/type-fest/source/delimiter-case.d.ts +78 -0
  1618. node_ui/node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts +106 -0
  1619. node_ui/node_modules/type-fest/source/delimiter-cased-properties.d.ts +46 -0
  1620. node_ui/node_modules/type-fest/source/distributed-omit.d.ts +89 -0
  1621. node_ui/node_modules/type-fest/source/distributed-pick.d.ts +85 -0
  1622. node_ui/node_modules/type-fest/source/empty-object.d.ts +46 -0
  1623. node_ui/node_modules/type-fest/source/enforce-optional.d.ts +47 -0
  1624. node_ui/node_modules/type-fest/source/entries.d.ts +62 -0
  1625. node_ui/node_modules/type-fest/source/entry.d.ts +65 -0
  1626. node_ui/node_modules/type-fest/source/exact.d.ts +68 -0
  1627. node_ui/node_modules/type-fest/source/except.d.ts +108 -0
  1628. node_ui/node_modules/type-fest/source/find-global-type.d.ts +64 -0
  1629. node_ui/node_modules/type-fest/source/fixed-length-array.d.ts +43 -0
  1630. node_ui/node_modules/type-fest/source/get.d.ts +219 -0
  1631. node_ui/node_modules/type-fest/source/global-this.d.ts +21 -0
  1632. node_ui/node_modules/type-fest/source/greater-than-or-equal.d.ts +22 -0
  1633. node_ui/node_modules/type-fest/source/greater-than.d.ts +56 -0
  1634. node_ui/node_modules/type-fest/source/has-optional-keys.d.ts +21 -0
  1635. node_ui/node_modules/type-fest/source/has-readonly-keys.d.ts +21 -0
  1636. node_ui/node_modules/type-fest/source/has-required-keys.d.ts +59 -0
  1637. node_ui/node_modules/type-fest/source/has-writable-keys.d.ts +21 -0
  1638. node_ui/node_modules/type-fest/source/if-any.d.ts +24 -0
  1639. node_ui/node_modules/type-fest/source/if-empty-object.d.ts +26 -0
  1640. node_ui/node_modules/type-fest/source/if-never.d.ts +24 -0
  1641. node_ui/node_modules/type-fest/source/if-null.d.ts +24 -0
  1642. node_ui/node_modules/type-fest/source/if-unknown.d.ts +24 -0
  1643. node_ui/node_modules/type-fest/source/includes.d.ts +22 -0
  1644. node_ui/node_modules/type-fest/source/int-closed-range.d.ts +35 -0
  1645. node_ui/node_modules/type-fest/source/int-range.d.ts +55 -0
  1646. node_ui/node_modules/type-fest/source/internal/array.d.ts +126 -0
  1647. node_ui/node_modules/type-fest/source/internal/characters.d.ts +67 -0
  1648. node_ui/node_modules/type-fest/source/internal/index.d.ts +8 -0
  1649. node_ui/node_modules/type-fest/source/internal/keys.d.ts +97 -0
  1650. node_ui/node_modules/type-fest/source/internal/numeric.d.ts +118 -0
  1651. node_ui/node_modules/type-fest/source/internal/object.d.ts +236 -0
  1652. node_ui/node_modules/type-fest/source/internal/string.d.ts +210 -0
  1653. node_ui/node_modules/type-fest/source/internal/tuple.d.ts +90 -0
  1654. node_ui/node_modules/type-fest/source/internal/type.d.ts +139 -0
  1655. node_ui/node_modules/type-fest/source/invariant-of.d.ts +76 -0
  1656. node_ui/node_modules/type-fest/source/is-any.d.ts +33 -0
  1657. node_ui/node_modules/type-fest/source/is-equal.d.ts +31 -0
  1658. node_ui/node_modules/type-fest/source/is-float.d.ts +41 -0
  1659. node_ui/node_modules/type-fest/source/is-integer.d.ts +58 -0
  1660. node_ui/node_modules/type-fest/source/is-literal.d.ts +296 -0
  1661. node_ui/node_modules/type-fest/source/is-never.d.ts +42 -0
  1662. node_ui/node_modules/type-fest/source/is-null.d.ts +20 -0
  1663. node_ui/node_modules/type-fest/source/is-tuple.d.ts +89 -0
  1664. node_ui/node_modules/type-fest/source/is-unknown.d.ts +52 -0
  1665. node_ui/node_modules/type-fest/source/iterable-element.d.ts +64 -0
  1666. node_ui/node_modules/type-fest/source/join.d.ts +68 -0
  1667. node_ui/node_modules/type-fest/source/jsonifiable.d.ts +37 -0
  1668. node_ui/node_modules/type-fest/source/jsonify.d.ts +122 -0
  1669. node_ui/node_modules/type-fest/source/kebab-case.d.ts +44 -0
  1670. node_ui/node_modules/type-fest/source/kebab-cased-properties-deep.d.ts +63 -0
  1671. node_ui/node_modules/type-fest/source/kebab-cased-properties.d.ts +40 -0
  1672. node_ui/node_modules/type-fest/source/keys-of-union.d.ts +42 -0
  1673. node_ui/node_modules/type-fest/source/last-array-element.d.ts +38 -0
  1674. node_ui/node_modules/type-fest/source/less-than-or-equal.d.ts +22 -0
  1675. node_ui/node_modules/type-fest/source/less-than.d.ts +26 -0
  1676. node_ui/node_modules/type-fest/source/literal-to-primitive-deep.d.ts +36 -0
  1677. node_ui/node_modules/type-fest/source/literal-to-primitive.d.ts +36 -0
  1678. node_ui/node_modules/type-fest/source/literal-union.d.ts +37 -0
  1679. node_ui/node_modules/type-fest/source/merge-deep.d.ts +486 -0
  1680. node_ui/node_modules/type-fest/source/merge-exclusive.d.ts +41 -0
  1681. node_ui/node_modules/type-fest/source/merge.d.ts +48 -0
  1682. node_ui/node_modules/type-fest/source/multidimensional-array.d.ts +44 -0
  1683. node_ui/node_modules/type-fest/source/multidimensional-readonly-array.d.ts +48 -0
  1684. node_ui/node_modules/type-fest/source/non-empty-object.d.ts +35 -0
  1685. node_ui/node_modules/type-fest/source/non-empty-string.d.ts +28 -0
  1686. node_ui/node_modules/type-fest/source/non-empty-tuple.d.ts +21 -0
  1687. node_ui/node_modules/type-fest/source/numeric.d.ts +222 -0
  1688. node_ui/node_modules/type-fest/source/observable-like.d.ts +63 -0
  1689. node_ui/node_modules/type-fest/source/omit-deep.d.ts +167 -0
  1690. node_ui/node_modules/type-fest/source/omit-index-signature.d.ts +95 -0
  1691. node_ui/node_modules/type-fest/source/opaque.d.ts +1 -0
  1692. node_ui/node_modules/type-fest/source/optional-keys-of.d.ts +39 -0
  1693. node_ui/node_modules/type-fest/source/or.d.ts +25 -0
  1694. node_ui/node_modules/type-fest/source/override-properties.d.ts +36 -0
  1695. node_ui/node_modules/type-fest/source/package-json.d.ts +676 -0
  1696. node_ui/node_modules/type-fest/source/partial-deep.d.ts +151 -0
  1697. node_ui/node_modules/type-fest/source/partial-on-undefined-deep.d.ts +78 -0
  1698. node_ui/node_modules/type-fest/source/pascal-case.d.ts +42 -0
  1699. node_ui/node_modules/type-fest/source/pascal-cased-properties-deep.d.ts +62 -0
  1700. node_ui/node_modules/type-fest/source/pascal-cased-properties.d.ts +36 -0
  1701. node_ui/node_modules/type-fest/source/paths.d.ts +262 -0
  1702. node_ui/node_modules/type-fest/source/pick-deep.d.ts +149 -0
  1703. node_ui/node_modules/type-fest/source/pick-index-signature.d.ts +50 -0
  1704. node_ui/node_modules/type-fest/source/primitive.d.ts +13 -0
  1705. node_ui/node_modules/type-fest/source/promisable.d.ts +25 -0
  1706. node_ui/node_modules/type-fest/source/readonly-deep.d.ts +81 -0
  1707. node_ui/node_modules/type-fest/source/readonly-keys-of.d.ts +30 -0
  1708. node_ui/node_modules/type-fest/source/readonly-tuple.d.ts +41 -0
  1709. node_ui/node_modules/type-fest/source/replace.d.ts +85 -0
  1710. node_ui/node_modules/type-fest/source/require-all-or-none.d.ts +51 -0
  1711. node_ui/node_modules/type-fest/source/require-at-least-one.d.ts +47 -0
  1712. node_ui/node_modules/type-fest/source/require-exactly-one.d.ts +45 -0
  1713. node_ui/node_modules/type-fest/source/require-one-or-none.d.ts +46 -0
  1714. node_ui/node_modules/type-fest/source/required-deep.d.ts +78 -0
  1715. node_ui/node_modules/type-fest/source/required-keys-of.d.ts +30 -0
  1716. node_ui/node_modules/type-fest/source/schema.d.ts +114 -0
  1717. node_ui/node_modules/type-fest/source/screaming-snake-case.d.ts +28 -0
  1718. node_ui/node_modules/type-fest/source/set-field-type.d.ts +65 -0
  1719. node_ui/node_modules/type-fest/source/set-non-nullable-deep.d.ts +83 -0
  1720. node_ui/node_modules/type-fest/source/set-non-nullable.d.ts +39 -0
  1721. node_ui/node_modules/type-fest/source/set-optional.d.ts +38 -0
  1722. node_ui/node_modules/type-fest/source/set-parameter-type.d.ts +117 -0
  1723. node_ui/node_modules/type-fest/source/set-readonly.d.ts +39 -0
  1724. node_ui/node_modules/type-fest/source/set-required-deep.d.ts +68 -0
  1725. node_ui/node_modules/type-fest/source/set-required.d.ts +70 -0
  1726. node_ui/node_modules/type-fest/source/set-return-type.d.ts +29 -0
  1727. node_ui/node_modules/type-fest/source/shared-union-fields-deep.d.ts +178 -0
  1728. node_ui/node_modules/type-fest/source/shared-union-fields.d.ts +76 -0
  1729. node_ui/node_modules/type-fest/source/simplify-deep.d.ts +115 -0
  1730. node_ui/node_modules/type-fest/source/simplify.d.ts +58 -0
  1731. node_ui/node_modules/type-fest/source/single-key-object.d.ts +29 -0
  1732. node_ui/node_modules/type-fest/source/snake-case.d.ts +45 -0
  1733. node_ui/node_modules/type-fest/source/snake-cased-properties-deep.d.ts +63 -0
  1734. node_ui/node_modules/type-fest/source/snake-cased-properties.d.ts +40 -0
  1735. node_ui/node_modules/type-fest/source/split.d.ts +88 -0
  1736. node_ui/node_modules/type-fest/source/spread.d.ts +84 -0
  1737. node_ui/node_modules/type-fest/source/string-key-of.d.ts +25 -0
  1738. node_ui/node_modules/type-fest/source/string-repeat.d.ts +47 -0
  1739. node_ui/node_modules/type-fest/source/string-slice.d.ts +37 -0
  1740. node_ui/node_modules/type-fest/source/stringified.d.ts +23 -0
  1741. node_ui/node_modules/type-fest/source/structured-cloneable.d.ts +92 -0
  1742. node_ui/node_modules/type-fest/source/subtract.d.ts +83 -0
  1743. node_ui/node_modules/type-fest/source/sum.d.ts +78 -0
  1744. node_ui/node_modules/type-fest/source/tagged-union.d.ts +51 -0
  1745. node_ui/node_modules/type-fest/source/tagged.d.ts +256 -0
  1746. node_ui/node_modules/type-fest/source/trim.d.ts +27 -0
  1747. node_ui/node_modules/type-fest/source/tsconfig-json.d.ts +1294 -0
  1748. node_ui/node_modules/type-fest/source/tuple-to-object.d.ts +42 -0
  1749. node_ui/node_modules/type-fest/source/tuple-to-union.d.ts +51 -0
  1750. node_ui/node_modules/type-fest/source/typed-array.d.ts +17 -0
  1751. node_ui/node_modules/type-fest/source/undefined-on-partial-deep.d.ts +80 -0
  1752. node_ui/node_modules/type-fest/source/union-to-intersection.d.ts +61 -0
  1753. node_ui/node_modules/type-fest/source/union-to-tuple.d.ts +56 -0
  1754. node_ui/node_modules/type-fest/source/unknown-array.d.ts +25 -0
  1755. node_ui/node_modules/type-fest/source/unknown-map.d.ts +24 -0
  1756. node_ui/node_modules/type-fest/source/unknown-record.d.ts +31 -0
  1757. node_ui/node_modules/type-fest/source/unknown-set.d.ts +24 -0
  1758. node_ui/node_modules/type-fest/source/value-of.d.ts +42 -0
  1759. node_ui/node_modules/type-fest/source/words.d.ts +118 -0
  1760. node_ui/node_modules/type-fest/source/writable-deep.d.ts +83 -0
  1761. node_ui/node_modules/type-fest/source/writable-keys-of.d.ts +33 -0
  1762. node_ui/node_modules/type-fest/source/writable.d.ts +68 -0
  1763. node_ui/node_modules/widest-line/index.d.ts +12 -0
  1764. node_ui/node_modules/widest-line/index.js +11 -0
  1765. node_ui/node_modules/widest-line/license +9 -0
  1766. node_ui/node_modules/widest-line/package.json +60 -0
  1767. node_ui/node_modules/widest-line/readme.md +26 -0
  1768. node_ui/node_modules/wrap-ansi/index.d.ts +41 -0
  1769. node_ui/node_modules/wrap-ansi/index.js +222 -0
  1770. node_ui/node_modules/wrap-ansi/license +9 -0
  1771. node_ui/node_modules/wrap-ansi/package.json +69 -0
  1772. node_ui/node_modules/wrap-ansi/readme.md +75 -0
  1773. node_ui/node_modules/ws/LICENSE +20 -0
  1774. node_ui/node_modules/ws/README.md +548 -0
  1775. node_ui/node_modules/ws/browser.js +8 -0
  1776. node_ui/node_modules/ws/index.js +13 -0
  1777. node_ui/node_modules/ws/lib/buffer-util.js +131 -0
  1778. node_ui/node_modules/ws/lib/constants.js +18 -0
  1779. node_ui/node_modules/ws/lib/event-target.js +292 -0
  1780. node_ui/node_modules/ws/lib/extension.js +203 -0
  1781. node_ui/node_modules/ws/lib/limiter.js +55 -0
  1782. node_ui/node_modules/ws/lib/permessage-deflate.js +528 -0
  1783. node_ui/node_modules/ws/lib/receiver.js +706 -0
  1784. node_ui/node_modules/ws/lib/sender.js +602 -0
  1785. node_ui/node_modules/ws/lib/stream.js +161 -0
  1786. node_ui/node_modules/ws/lib/subprotocol.js +62 -0
  1787. node_ui/node_modules/ws/lib/validation.js +152 -0
  1788. node_ui/node_modules/ws/lib/websocket-server.js +550 -0
  1789. node_ui/node_modules/ws/lib/websocket.js +1388 -0
  1790. node_ui/node_modules/ws/package.json +69 -0
  1791. node_ui/node_modules/ws/wrapper.mjs +8 -0
  1792. node_ui/node_modules/yoga-wasm-web/LICENSE +21 -0
  1793. node_ui/node_modules/yoga-wasm-web/README.md +70 -0
  1794. node_ui/node_modules/yoga-wasm-web/dist/asm.d.ts +6 -0
  1795. node_ui/node_modules/yoga-wasm-web/dist/asm.js +1 -0
  1796. node_ui/node_modules/yoga-wasm-web/dist/auto.d.ts +7 -0
  1797. node_ui/node_modules/yoga-wasm-web/dist/browser.js +1 -0
  1798. node_ui/node_modules/yoga-wasm-web/dist/generated/YGEnums.d.ts +328 -0
  1799. node_ui/node_modules/yoga-wasm-web/dist/index.d.ts +7 -0
  1800. node_ui/node_modules/yoga-wasm-web/dist/index.js +1 -0
  1801. node_ui/node_modules/yoga-wasm-web/dist/node.js +1 -0
  1802. node_ui/node_modules/yoga-wasm-web/dist/wrapAsm-57389177.js +1 -0
  1803. node_ui/node_modules/yoga-wasm-web/dist/wrapAsm-f766f97f.js +1 -0
  1804. node_ui/node_modules/yoga-wasm-web/dist/wrapAsm.d.ts +176 -0
  1805. node_ui/node_modules/yoga-wasm-web/dist/yoga.wasm +0 -0
  1806. node_ui/node_modules/yoga-wasm-web/package.json +56 -0
  1807. node_ui/package.json +21 -0
@@ -0,0 +1,1718 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ aichat - Unified CLI for AI chat session management tools.
4
+
5
+ This provides a grouped command interface for managing Claude Code and
6
+ Codex sessions, following the pattern of tools like git, docker, etc.
7
+
8
+ All session-related tools are accessible as subcommands:
9
+ aichat search - Full-text search across all sessions
10
+ aichat resume - Resume a session (latest or by ID)
11
+ aichat menu - Interactive session menu
12
+ aichat trim - Trim session content
13
+ ... and more
14
+
15
+ For backward compatibility, all flat commands (find-claude-session,
16
+ etc.) are still available.
17
+ """
18
+
19
+ import click
20
+
21
+
22
+ class SessionIDGroup(click.Group):
23
+ """Custom group that treats unknown commands as session IDs for menu."""
24
+
25
+ def parse_args(self, ctx, args):
26
+ # If the first arg looks like a session ID (not a known command), route to menu
27
+ if args and args[0] not in self.commands and not args[0].startswith('-'):
28
+ # Treat as session ID - prepend 'menu' to make it a menu command
29
+ args = ['menu'] + args
30
+ return super().parse_args(ctx, args)
31
+
32
+
33
+ @click.group(cls=SessionIDGroup, invoke_without_command=True)
34
+ @click.version_option()
35
+ @click.pass_context
36
+ def main(ctx):
37
+ """
38
+ Session management tools for Claude Code and Codex.
39
+
40
+ This is the recommended interface for managing AI chat sessions.
41
+ Each subcommand provides specialized functionality for finding,
42
+ managing, and manipulating session files.
43
+
44
+ For help on any subcommand, use:
45
+
46
+ \b
47
+ aichat COMMAND --help
48
+
49
+ Examples:
50
+
51
+ \b
52
+ aichat # Action menu for latest session(s)
53
+ aichat abc123-def456 # Shortcut for: aichat menu abc123-def456
54
+ aichat search "langroid" # Full-text search
55
+ aichat resume # Resume latest session
56
+ aichat resume abc123-def456 # Resume specific session
57
+ aichat menu abc123-def456
58
+ aichat trim session-id.jsonl
59
+ """
60
+ # Auto-index sessions on every aichat command (incremental, fast if up-to-date)
61
+ # Skip for build-index/clear-index to avoid double-indexing or state conflicts
62
+ # In JSON mode (-j/--json), suppress all output for clean parsing
63
+ import sys
64
+ skip_auto_index_cmds = ['build-index', 'clear-index', 'index-stats']
65
+ should_skip = any(cmd in sys.argv for cmd in skip_auto_index_cmds)
66
+ json_mode = any(arg in sys.argv for arg in ['-j', '--json'])
67
+ if not should_skip:
68
+ try:
69
+ from claude_code_tools.search_index import auto_index
70
+ from claude_code_tools.session_utils import get_claude_home, get_codex_home
71
+ # Respect CLAUDE_CONFIG_DIR and CODEX_HOME environment variables
72
+ auto_index(
73
+ claude_home=get_claude_home(),
74
+ codex_home=get_codex_home(),
75
+ verbose=False,
76
+ silent=json_mode,
77
+ )
78
+ except ImportError:
79
+ pass # tantivy not installed
80
+ except Exception:
81
+ pass # Index errors shouldn't block commands
82
+
83
+ if ctx.invoked_subcommand is None:
84
+ # No subcommand - find latest sessions and show action menu
85
+ _find_and_run_session_ui(
86
+ session_id=None,
87
+ agent_constraint='both',
88
+ start_screen='action',
89
+ select_target='action',
90
+ results_title=' Select a session ',
91
+ )
92
+
93
+
94
+ # Shared help text for find commands
95
+ _FIND_OPTIONS_COMMON = """
96
+ Options:
97
+ KEYWORDS Comma-separated keywords to search (AND logic)
98
+ -g, --global Search across all projects
99
+ -n, --num-matches N Number of matches to display (default: 10)
100
+ --original Show only original sessions
101
+ --no-sub Exclude sub-agent sessions
102
+ --no-trim Exclude trimmed sessions
103
+ --no-roll Exclude rollover sessions
104
+ --min-lines N Only sessions with at least N lines
105
+ --before TIMESTAMP Sessions modified before (inclusive)
106
+ --after TIMESTAMP Sessions modified after (inclusive)
107
+ --no-ui Skip options menu, run search with CLI args directly
108
+ --simple-ui Use Rich table UI instead of Node UI"""
109
+
110
+ _FIND_OPTIONS_CODEX = _FIND_OPTIONS_COMMON.replace(
111
+ " --no-sub Exclude sub-agent sessions\n", ""
112
+ )
113
+
114
+ _FIND_TIMESTAMP_HELP = """
115
+ Timestamp formats: YYYYMMDD, YYYY-MM-DD, MM/DD/YY, MM/DD/YYYY
116
+ Optional time: T16:45:23, T16:45, T16"""
117
+
118
+ _FIND_CTX_SETTINGS = {
119
+ "ignore_unknown_options": True,
120
+ "allow_extra_args": True,
121
+ "allow_interspersed_args": False,
122
+ }
123
+
124
+
125
+ def _find_and_run_session_ui(
126
+ session_id: str | None,
127
+ agent_constraint: str, # 'claude', 'codex', or 'both'
128
+ start_screen: str,
129
+ select_target: str | None = None,
130
+ results_title: str | None = None,
131
+ direct_action: str | None = None,
132
+ action_kwargs: dict | None = None,
133
+ ) -> None:
134
+ """
135
+ Find session(s) and run Node UI for the specified action.
136
+
137
+ If session_id is provided, routes to session_menu_cli.
138
+ Otherwise, finds latest sessions for current project/branch and shows UI.
139
+
140
+ Args:
141
+ session_id: Optional explicit session ID or path
142
+ agent_constraint: 'claude', 'codex', or 'both'
143
+ start_screen: Screen to show when single session found
144
+ select_target: Screen to go to after selection (multiple sessions)
145
+ results_title: Title for selection screen
146
+ direct_action: If set, execute this action directly instead of showing UI
147
+ action_kwargs: Optional kwargs to pass to action
148
+ """
149
+ import os
150
+ import subprocess
151
+ import sys
152
+ from pathlib import Path
153
+
154
+ from claude_code_tools.node_menu_ui import run_node_menu_ui
155
+ from claude_code_tools.search_index import SessionIndex
156
+ from claude_code_tools.session_menu_cli import execute_action
157
+ from claude_code_tools.session_utils import default_export_path
158
+
159
+ if session_id:
160
+ # Route to session_menu_cli with appropriate start screen
161
+ sys.argv = [
162
+ sys.argv[0].replace('aichat', 'session-menu'),
163
+ '--start-screen', start_screen,
164
+ session_id,
165
+ ]
166
+ from claude_code_tools.session_menu_cli import main as menu_main
167
+ menu_main()
168
+ return
169
+
170
+ # No session provided - find latest sessions for current project and branch
171
+ current_cwd = os.getcwd()
172
+ current_branch = None
173
+ try:
174
+ result = subprocess.run(
175
+ ["git", "rev-parse", "--abbrev-ref", "HEAD"],
176
+ capture_output=True, text=True, check=True
177
+ )
178
+ current_branch = result.stdout.strip()
179
+ except (subprocess.CalledProcessError, FileNotFoundError):
180
+ pass
181
+
182
+ # Use the Tantivy index for fast session lookup
183
+ index_path = Path.home() / ".cctools" / "search-index"
184
+ if not index_path.exists():
185
+ print(
186
+ "Session index not found. Run 'aichat search' first to build the index.",
187
+ file=sys.stderr
188
+ )
189
+ sys.exit(1)
190
+
191
+ try:
192
+ idx = SessionIndex(index_path)
193
+ except Exception as e:
194
+ print(f"Failed to open session index: {e}", file=sys.stderr)
195
+ sys.exit(1)
196
+
197
+ candidates = []
198
+ used_fallback = False # Track if any agent fell back to any-branch
199
+
200
+ def _get_latest_session(agent: str) -> tuple[dict | None, bool]:
201
+ """Get latest session for agent, with fallback to any branch.
202
+
203
+ Returns (session_dict, used_fallback).
204
+ """
205
+ # First try with branch filter
206
+ if current_branch:
207
+ session = idx.get_latest_session(
208
+ cwd=current_cwd, branch=current_branch, agent=agent
209
+ )
210
+ if session:
211
+ return session, False
212
+
213
+ # Fallback: try without branch filter
214
+ session = idx.get_latest_session(cwd=current_cwd, agent=agent)
215
+ return session, bool(session) # used_fallback=True only if we found one
216
+
217
+ def _session_to_candidate(s: dict) -> dict:
218
+ """Convert index session dict to UI candidate format."""
219
+ export_path = s.get("export_path", "")
220
+ session_file = Path(export_path) if export_path else None
221
+ agent = s.get("agent", "claude")
222
+
223
+ # Parse timestamps - index stores as ISO strings
224
+ mod_time = 0
225
+ create_time = 0
226
+ if s.get("modified"):
227
+ try:
228
+ from datetime import datetime
229
+ mod_time = datetime.fromisoformat(
230
+ s["modified"].replace("Z", "+00:00")
231
+ ).timestamp()
232
+ except (ValueError, TypeError):
233
+ pass
234
+ if s.get("created"):
235
+ try:
236
+ from datetime import datetime
237
+ create_time = datetime.fromisoformat(
238
+ s["created"].replace("Z", "+00:00")
239
+ ).timestamp()
240
+ except (ValueError, TypeError):
241
+ pass
242
+
243
+ # Build preview from last message content (convention: show most recent)
244
+ preview = ""
245
+ if s.get("last_msg_content"):
246
+ role = s.get("last_msg_role", "assistant")
247
+ preview = f"[{role}] {s['last_msg_content'][:200]}"
248
+
249
+ return {
250
+ "agent": agent,
251
+ "agent_display": "Claude" if agent == "claude" else "Codex",
252
+ "session_id": s.get("session_id", ""),
253
+ "mod_time": mod_time,
254
+ "create_time": create_time,
255
+ "lines": s.get("lines", 0),
256
+ "project": s.get("project", ""),
257
+ "preview": preview,
258
+ "cwd": s.get("cwd", ""),
259
+ "branch": s.get("branch", ""),
260
+ "file_path": export_path,
261
+ "default_export_path": str(
262
+ default_export_path(session_file, agent)
263
+ ) if session_file and session_file.exists() else "",
264
+ "is_trimmed": s.get("derivation_type") == "trimmed",
265
+ "derivation_type": s.get("derivation_type"),
266
+ "is_sidechain": s.get("is_sidechain") == "true",
267
+ }
268
+
269
+ # Find Claude sessions if applicable
270
+ if agent_constraint in ('claude', 'both'):
271
+ session, fallback = _get_latest_session("claude")
272
+ if session:
273
+ candidates.append(_session_to_candidate(session))
274
+ if fallback:
275
+ used_fallback = True
276
+
277
+ # Find Codex sessions if applicable
278
+ if agent_constraint in ('codex', 'both'):
279
+ session, fallback = _get_latest_session("codex")
280
+ if session:
281
+ candidates.append(_session_to_candidate(session))
282
+ if fallback:
283
+ used_fallback = True
284
+
285
+ # Build the unified scope message
286
+ project_name = Path(current_cwd).name
287
+ agent_desc = {
288
+ 'claude': 'Claude',
289
+ 'codex': 'Codex',
290
+ 'both': 'Claude/Codex',
291
+ }.get(agent_constraint, 'Claude/Codex')
292
+ branch_part = f" on branch '{current_branch}'" if current_branch else ""
293
+ fallback_note = " (fallback to any branch if none found)" if current_branch else ""
294
+ scope_text = (
295
+ f"Latest {agent_desc} sessions for '{project_name}'{branch_part}{fallback_note}"
296
+ )
297
+
298
+ if not candidates:
299
+ print(
300
+ f"No {agent_desc} sessions found for '{project_name}'"
301
+ f"{branch_part} (even with fallback to any branch).",
302
+ file=sys.stderr
303
+ )
304
+ sys.exit(1)
305
+
306
+ # Handler for when user selects and acts - returns 'back' if user wants to
307
+ # go back to menu
308
+ def handler(sess, action, kwargs=None):
309
+ session_file = Path(sess["file_path"])
310
+ merged_kwargs = {**(action_kwargs or {}), **(kwargs or {})}
311
+ return execute_action(
312
+ action,
313
+ sess["agent"],
314
+ session_file,
315
+ sess["cwd"],
316
+ action_kwargs=merged_kwargs if merged_kwargs else None,
317
+ session_id=sess.get("session_id"),
318
+ )
319
+
320
+ rpc_path = str(Path(__file__).parent / "action_rpc.py")
321
+
322
+ # If direct_action specified, execute it immediately for single session
323
+ if direct_action and len(candidates) == 1:
324
+ handler(candidates[0], direct_action, action_kwargs)
325
+ return
326
+
327
+ # Create handler that may execute direct_action after selection
328
+ def selection_handler(sess, action, kwargs=None):
329
+ if direct_action:
330
+ # Execute direct_action instead of whatever came from UI
331
+ return handler(sess, direct_action, action_kwargs)
332
+ else:
333
+ return handler(sess, action, kwargs)
334
+
335
+ if len(candidates) == 1:
336
+ # Single session - go directly to start_screen
337
+ run_node_menu_ui(
338
+ candidates,
339
+ [],
340
+ selection_handler,
341
+ start_screen=start_screen,
342
+ scope_line=scope_text,
343
+ rpc_path=rpc_path,
344
+ direct_action=direct_action,
345
+ )
346
+ else:
347
+ # Multiple sessions - show selection first
348
+ run_node_menu_ui(
349
+ candidates,
350
+ [],
351
+ selection_handler,
352
+ start_screen="results",
353
+ select_target=select_target or start_screen,
354
+ results_title=results_title or f" Select session for {start_screen} ",
355
+ start_zoomed=True,
356
+ scope_line=scope_text,
357
+ rpc_path=rpc_path,
358
+ direct_action=direct_action,
359
+ )
360
+
361
+
362
+ @main.command("find", context_settings=_FIND_CTX_SETTINGS, add_help_option=False, hidden=True)
363
+ @click.pass_context
364
+ def find(ctx):
365
+ """Find sessions across all agents (Claude Code, Codex, etc.)."""
366
+ import sys
367
+ sys.argv = [sys.argv[0].replace('aichat', 'find-session')] + ctx.args
368
+ from claude_code_tools.find_session import main as find_main
369
+ find_main()
370
+
371
+
372
+ find.__doc__ = f"""Find sessions across all agents (Claude Code, Codex, etc.).
373
+ {_FIND_OPTIONS_COMMON}
374
+ --agents AGENT [...] Limit to one or more agents (e.g., --agents claude,
375
+ --agents claude codex). Default: all.
376
+ {_FIND_TIMESTAMP_HELP}
377
+
378
+ Examples:
379
+ aichat find "langroid,MCP"
380
+ aichat find -g --min-lines 50 --agents claude
381
+ aichat find --after 11/20/25 --before 11/25/25
382
+ """
383
+
384
+
385
+ @main.command("find-claude", context_settings=_FIND_CTX_SETTINGS, add_help_option=False, hidden=True)
386
+ @click.pass_context
387
+ def find_claude(ctx):
388
+ """Find Claude Code sessions by keywords."""
389
+ import sys
390
+ sys.argv = [sys.argv[0].replace('aichat', 'find-claude-session')] + ctx.args
391
+ from claude_code_tools.find_claude_session import main as find_claude_main
392
+ find_claude_main()
393
+
394
+
395
+ find_claude.__doc__ = f"""Find Claude Code sessions by keywords.
396
+ {_FIND_OPTIONS_COMMON}
397
+ {_FIND_TIMESTAMP_HELP}
398
+
399
+ Examples:
400
+ aichat find-claude "bug fix"
401
+ aichat find-claude -g --min-lines 100
402
+ aichat find-claude --after 2025-11-01
403
+ """
404
+
405
+
406
+ @main.command("find-codex", context_settings=_FIND_CTX_SETTINGS, add_help_option=False, hidden=True)
407
+ @click.pass_context
408
+ def find_codex(ctx):
409
+ """Find Codex sessions by keywords."""
410
+ import sys
411
+ sys.argv = [sys.argv[0].replace('aichat', 'find-codex-session')] + ctx.args
412
+ from claude_code_tools.find_codex_session import main as find_codex_main
413
+ find_codex_main()
414
+
415
+
416
+ find_codex.__doc__ = f"""Find Codex sessions by keywords.
417
+ {_FIND_OPTIONS_CODEX}
418
+ {_FIND_TIMESTAMP_HELP}
419
+
420
+ Examples:
421
+ aichat find-codex "error"
422
+ aichat find-codex -g --after 11/15/25
423
+ """
424
+
425
+
426
+ @main.command("find-original", context_settings={"ignore_unknown_options": True, "allow_extra_args": True, "allow_interspersed_args": False})
427
+ @click.pass_context
428
+ def find_original(ctx):
429
+ """Find the original session from a trimmed/continued session."""
430
+ import sys
431
+ sys.argv = [sys.argv[0].replace('aichat', 'find-original-session')] + ctx.args
432
+ from claude_code_tools.find_original_session import (
433
+ main as find_original_main,
434
+ )
435
+ find_original_main()
436
+
437
+
438
+ @main.command("find-derived", context_settings={"ignore_unknown_options": True, "allow_extra_args": True, "allow_interspersed_args": False})
439
+ @click.pass_context
440
+ def find_derived(ctx):
441
+ """Find derived sessions (trimmed/continued) from an original."""
442
+ import sys
443
+ sys.argv = [sys.argv[0].replace('aichat', 'find-trimmed-sessions')] + ctx.args
444
+ from claude_code_tools.find_trimmed_sessions import (
445
+ main as find_derived_main,
446
+ )
447
+ find_derived_main()
448
+
449
+
450
+ @main.command("menu", context_settings={"ignore_unknown_options": True, "allow_extra_args": True, "allow_interspersed_args": False})
451
+ @click.pass_context
452
+ def menu(ctx):
453
+ """Interactive menu for a specific session (by ID or path)."""
454
+ import sys
455
+ sys.argv = [sys.argv[0].replace('aichat', 'session-menu')] + ctx.args
456
+ from claude_code_tools.session_menu_cli import main as menu_main
457
+ menu_main()
458
+
459
+
460
+ @main.command("trim")
461
+ @click.argument("session", required=False)
462
+ @click.option("--simple-ui", is_flag=True, help="Use simple CLI trim instead of Node UI")
463
+ def trim(session, simple_ui):
464
+ """Trim/resume session - shows menu of trim options.
465
+
466
+ If no session ID provided, finds latest session for current project/branch.
467
+ Opens Node UI with trim/resume options (trim+resume, smart-trim).
468
+ Use --simple-ui for direct CLI trim.
469
+ """
470
+ import sys
471
+
472
+ if simple_ui:
473
+ if not session:
474
+ print("Error: --simple-ui requires a session ID", file=sys.stderr)
475
+ sys.exit(1)
476
+ # Fall back to old trim-session CLI
477
+ sys.argv = [sys.argv[0].replace('aichat', 'trim-session'), session]
478
+ from claude_code_tools.trim_session import main as trim_main
479
+ trim_main()
480
+ return
481
+
482
+ _find_and_run_session_ui(
483
+ session_id=session,
484
+ agent_constraint='both',
485
+ start_screen='trim_menu',
486
+ select_target='trim_menu',
487
+ results_title=' Which session to trim? ',
488
+ )
489
+
490
+
491
+ @main.command("smart-trim", context_settings={"ignore_unknown_options": True, "allow_extra_args": True, "allow_interspersed_args": False})
492
+ @click.pass_context
493
+ def smart_trim(ctx):
494
+ """Smart trim using Claude SDK agents (EXPERIMENTAL).
495
+
496
+ If no session ID provided, finds latest session for current project/branch.
497
+ """
498
+ import sys
499
+ args = ctx.args
500
+ session_id = args[0] if args and not args[0].startswith('-') else None
501
+
502
+ if session_id:
503
+ # Pass to existing smart_trim CLI
504
+ sys.argv = [sys.argv[0].replace('aichat', 'smart-trim')] + args
505
+ from claude_code_tools.smart_trim import main as smart_trim_main
506
+ smart_trim_main()
507
+ else:
508
+ # Find latest session and execute smart_trim_resume directly
509
+ _find_and_run_session_ui(
510
+ session_id=None,
511
+ agent_constraint='both',
512
+ start_screen='trim_menu', # Fallback if multiple sessions
513
+ select_target='trim_menu',
514
+ results_title=' Which session to smart-trim? ',
515
+ direct_action='smart_trim_resume',
516
+ )
517
+
518
+
519
+ @main.command("export", context_settings={"ignore_unknown_options": True, "allow_extra_args": True, "allow_interspersed_args": False})
520
+ @click.option("--agent", type=click.Choice(["claude", "codex"], case_sensitive=False), help="Force export with specific agent")
521
+ @click.argument("session", required=False)
522
+ @click.pass_context
523
+ def export_session(ctx, agent, session):
524
+ """Export session to text/markdown format.
525
+
526
+ If no session ID provided, finds latest session for current project/branch.
527
+ Auto-detects session type and uses matching export command.
528
+ Use --agent to override and force export with a specific agent.
529
+ """
530
+ import sys
531
+ from pathlib import Path
532
+ from claude_code_tools.session_utils import detect_agent_from_path, find_session_file
533
+
534
+ if not session:
535
+ # No session provided - find latest and export directly
536
+ _find_and_run_session_ui(
537
+ session_id=None,
538
+ agent_constraint='both',
539
+ start_screen='action',
540
+ results_title=' Which session to export? ',
541
+ direct_action='export',
542
+ )
543
+ return
544
+
545
+ # Session provided - existing behavior
546
+ # Try to detect session type
547
+ detected_agent = None
548
+ session_file = None
549
+
550
+ # First check if it's a file path
551
+ input_path = Path(session).expanduser()
552
+ if input_path.exists() and input_path.is_file():
553
+ session_file = input_path
554
+ detected_agent = detect_agent_from_path(session_file)
555
+ else:
556
+ # Try to find by session ID
557
+ result = find_session_file(session)
558
+ if result:
559
+ detected_agent, session_file, _, _ = result
560
+
561
+ # Determine which agent to use
562
+ if agent:
563
+ # User explicitly specified agent
564
+ export_agent = agent.lower()
565
+ if detected_agent and detected_agent != export_agent:
566
+ print(f"\nDetected {detected_agent.upper()} session")
567
+ print(f"Exporting with {export_agent.upper()} (user specified)")
568
+ else:
569
+ print(f"\nExporting with {export_agent.upper()} (user specified)")
570
+ elif detected_agent:
571
+ # Use detected agent
572
+ export_agent = detected_agent
573
+ print(f"\nDetected {detected_agent.upper()} session")
574
+ print(f"Exporting with {export_agent.upper()}")
575
+ else:
576
+ # Default to Claude if cannot detect
577
+ export_agent = "claude"
578
+ print(f"\nCould not detect session type, defaulting to CLAUDE")
579
+
580
+ print()
581
+
582
+ # Route to appropriate export command
583
+ if export_agent == "claude":
584
+ sys.argv = [sys.argv[0].replace('aichat', 'export-claude-session'), session] + ctx.args
585
+ from claude_code_tools.export_claude_session import main as export_main
586
+ export_main()
587
+ else:
588
+ sys.argv = [sys.argv[0].replace('aichat', 'export-codex-session'), session] + ctx.args
589
+ from claude_code_tools.export_codex_session import main as export_main
590
+ export_main()
591
+
592
+
593
+ @main.command("export-claude", context_settings={"ignore_unknown_options": True, "allow_extra_args": True, "allow_interspersed_args": False})
594
+ @click.pass_context
595
+ def export_claude(ctx):
596
+ """Export Claude Code session to text/markdown format.
597
+
598
+ If no session ID provided, finds latest Claude session for current
599
+ project/branch.
600
+ """
601
+ import sys
602
+ args = ctx.args
603
+ session_id = args[0] if args and not args[0].startswith('-') else None
604
+
605
+ if session_id:
606
+ # Pass to existing export CLI
607
+ sys.argv = [sys.argv[0].replace('aichat', 'export-claude-session')] + args
608
+ from claude_code_tools.export_claude_session import (
609
+ main as export_claude_main,
610
+ )
611
+ export_claude_main()
612
+ else:
613
+ # Find latest Claude session and export directly
614
+ _find_and_run_session_ui(
615
+ session_id=None,
616
+ agent_constraint='claude',
617
+ start_screen='action',
618
+ results_title=' Which Claude session to export? ',
619
+ direct_action='export',
620
+ )
621
+
622
+
623
+ @main.command("export-codex", context_settings={"ignore_unknown_options": True, "allow_extra_args": True, "allow_interspersed_args": False})
624
+ @click.pass_context
625
+ def export_codex(ctx):
626
+ """Export Codex session to text/markdown format.
627
+
628
+ If no session ID provided, finds latest Codex session for current
629
+ project/branch.
630
+ """
631
+ import sys
632
+ args = ctx.args
633
+ session_id = args[0] if args and not args[0].startswith('-') else None
634
+
635
+ if session_id:
636
+ # Pass to existing export CLI
637
+ sys.argv = [sys.argv[0].replace('aichat', 'export-codex-session')] + args
638
+ from claude_code_tools.export_codex_session import (
639
+ main as export_codex_main,
640
+ )
641
+ export_codex_main()
642
+ else:
643
+ # Find latest Codex session and export directly
644
+ _find_and_run_session_ui(
645
+ session_id=None,
646
+ agent_constraint='codex',
647
+ start_screen='action',
648
+ results_title=' Which Codex session to export? ',
649
+ direct_action='export',
650
+ )
651
+
652
+
653
+ @main.command("delete", context_settings={"ignore_unknown_options": True, "allow_extra_args": True, "allow_interspersed_args": False})
654
+ @click.pass_context
655
+ def delete(ctx):
656
+ """Delete a session file with safety confirmation."""
657
+ import sys
658
+ sys.argv = [sys.argv[0].replace('aichat', 'delete-session')] + ctx.args
659
+ from claude_code_tools.delete_session import main as delete_main
660
+ delete_main()
661
+
662
+
663
+ @main.command("resume", context_settings={"ignore_unknown_options": True, "allow_extra_args": True, "allow_interspersed_args": False})
664
+ @click.pass_context
665
+ def resume_session(ctx):
666
+ """Resume a session with various options (resume, clone, trim, continue).
667
+
668
+ If no session ID provided, finds latest session for current project/branch.
669
+ Shows resume menu with options: resume as-is, clone, trim+resume,
670
+ smart-trim, or continue with context.
671
+ """
672
+ args = ctx.args
673
+ session_id = args[0] if args and not args[0].startswith('-') else None
674
+ _find_and_run_session_ui(
675
+ session_id=session_id,
676
+ agent_constraint='both',
677
+ start_screen='resume',
678
+ select_target='resume',
679
+ results_title=' Which session to resume? ',
680
+ )
681
+
682
+
683
+ # =============================================================================
684
+ # Search Infrastructure Commands
685
+ # =============================================================================
686
+
687
+
688
+ @main.command("clear-index")
689
+ @click.option(
690
+ "--index", "-i",
691
+ type=click.Path(),
692
+ default="~/.cctools/search-index",
693
+ help="Index directory (default: ~/.cctools/search-index/)",
694
+ )
695
+ @click.option("--dry-run", "-n", is_flag=True, help="Show what would be deleted")
696
+ def clear_index(index, dry_run):
697
+ """Clear the Tantivy search index.
698
+
699
+ Deletes the entire index directory to allow a fresh rebuild.
700
+ """
701
+ import shutil
702
+ from pathlib import Path
703
+
704
+ index_path = Path(index).expanduser()
705
+
706
+ if not index_path.exists():
707
+ print(f"Index directory does not exist: {index_path}")
708
+ return
709
+
710
+ # Count files for info
711
+ file_count = sum(1 for _ in index_path.rglob("*") if _.is_file())
712
+
713
+ if dry_run:
714
+ print(f"Dry run: would delete index at {index_path}")
715
+ print(f" {file_count} files would be removed")
716
+ else:
717
+ shutil.rmtree(index_path)
718
+ print(f"✅ Cleared index at {index_path}")
719
+ print(f" {file_count} files removed")
720
+
721
+
722
+ @main.command("clear-exports", hidden=True)
723
+ @click.option("--verbose", "-v", is_flag=True, help="Show what's being deleted")
724
+ @click.option("--dry-run", "-n", is_flag=True, help="Show what would be deleted")
725
+ def clear_exports(verbose, dry_run):
726
+ """Clear all exported session files from project directories.
727
+
728
+ Finds export files in per-project directories:
729
+ {project}/exported-sessions/{agent}/*.txt
730
+
731
+ Use this before re-exporting to ensure a clean slate.
732
+ """
733
+ from claude_code_tools.export_all import (
734
+ collect_sessions_to_export,
735
+ extract_export_dir_from_session,
736
+ )
737
+
738
+ print("Scanning for export files to delete...")
739
+ sessions = collect_sessions_to_export()
740
+ print(f"Found {len(sessions)} sessions to check")
741
+
742
+ deleted_count = 0
743
+ dirs_cleaned = set()
744
+
745
+ with click.progressbar(
746
+ sessions,
747
+ label="Scanning",
748
+ show_pos=True,
749
+ item_show_func=lambda x: x[0].name if x else "",
750
+ ) as bar:
751
+ for session_file, agent in bar:
752
+ export_dir = extract_export_dir_from_session(session_file, agent=agent)
753
+ if export_dir and export_dir.exists():
754
+ export_file = export_dir / f"{session_file.stem}.txt"
755
+ if export_file.exists():
756
+ if dry_run:
757
+ if verbose:
758
+ print(f"\nWould delete: {export_file}")
759
+ else:
760
+ if verbose:
761
+ print(f"\nDeleting: {export_file}")
762
+ export_file.unlink()
763
+ deleted_count += 1
764
+ dirs_cleaned.add(export_dir)
765
+
766
+ if dry_run:
767
+ print(f"\nDry run: would delete {deleted_count} files "
768
+ f"from {len(dirs_cleaned)} directories")
769
+ else:
770
+ print(f"\n✅ Cleared {deleted_count} export files "
771
+ f"from {len(dirs_cleaned)} directories")
772
+
773
+
774
+ @main.command("export-all", hidden=True)
775
+ @click.option("--force", "-f", is_flag=True, help="Re-export all (ignore mtime)")
776
+ @click.option("--verbose", "-v", is_flag=True, help="Show detailed progress and failures")
777
+ def export_all(force, verbose):
778
+ """Export all sessions with YAML front matter for indexing.
779
+
780
+ Each session is exported to its own project directory:
781
+ {project}/exported-sessions/{agent}/{session_id}.txt
782
+
783
+ Skips sessions that haven't changed since last export (unless --force).
784
+ """
785
+ from claude_code_tools.export_all import (
786
+ collect_sessions_to_export,
787
+ export_single_session,
788
+ )
789
+
790
+ print("Collecting sessions...")
791
+ sessions = collect_sessions_to_export()
792
+ print(f"Found {len(sessions)} sessions to process")
793
+
794
+ stats: dict = {
795
+ "exported": 0,
796
+ "skipped": 0,
797
+ "failed": 0,
798
+ "exported_files": [],
799
+ "failures": [],
800
+ }
801
+
802
+ with click.progressbar(
803
+ sessions,
804
+ label="Exporting",
805
+ show_pos=True,
806
+ item_show_func=lambda x: x[0].name if x else "",
807
+ ) as bar:
808
+ for session_file, agent in bar:
809
+ result = export_single_session(session_file, agent, force)
810
+
811
+ if result["status"] == "exported":
812
+ stats["exported"] += 1
813
+ stats["exported_files"].append(result["export_file"])
814
+ elif result["status"] == "skipped":
815
+ stats["skipped"] += 1
816
+ if result["export_file"]:
817
+ stats["exported_files"].append(result["export_file"])
818
+ else: # failed
819
+ stats["failed"] += 1
820
+ stats["failures"].append({
821
+ "session": str(session_file),
822
+ "agent": agent,
823
+ "error": result["error"],
824
+ })
825
+
826
+ print(f"\n✅ Export complete:")
827
+ print(f" Exported: {stats['exported']}")
828
+ print(f" Skipped: {stats['skipped']} (up-to-date)")
829
+ print(f" Failed: {stats['failed']}")
830
+ print(f" Total export files: {len(stats['exported_files'])}")
831
+
832
+ if stats["failures"] and verbose:
833
+ print(f"\n⚠️ Failures ({len(stats['failures'])}):")
834
+ for failure in stats["failures"]:
835
+ print(f" {failure['session']}")
836
+ print(f" Error: {failure['error']}")
837
+
838
+
839
+ @main.command("build-index")
840
+ @click.option(
841
+ "--claude-home",
842
+ type=click.Path(),
843
+ default=None,
844
+ help="Claude home directory (default: ~/.claude or CLAUDE_CONFIG_DIR)",
845
+ )
846
+ @click.option(
847
+ "--codex-home",
848
+ type=click.Path(),
849
+ default=None,
850
+ help="Codex home directory (default: ~/.codex or CODEX_HOME)",
851
+ )
852
+ def build_index(claude_home, codex_home):
853
+ """Build/update the Tantivy search index from JSONL session files.
854
+
855
+ Indexes sessions directly from JSONL files (no export step needed).
856
+ Incremental by default - only indexes new/modified sessions.
857
+
858
+ Use 'aichat clear-index' first if you want a full rebuild.
859
+ """
860
+ from claude_code_tools.search_index import auto_index
861
+ from claude_code_tools.session_utils import get_claude_home, get_codex_home
862
+
863
+ claude_home_path = get_claude_home(cli_arg=claude_home)
864
+ codex_home_path = get_codex_home(cli_arg=codex_home)
865
+
866
+ print("Building search index...")
867
+ stats = auto_index(
868
+ claude_home=claude_home_path,
869
+ codex_home=codex_home_path,
870
+ verbose=True,
871
+ silent=False, # Show tqdm progress bar
872
+ )
873
+
874
+ print(f"\n✅ Index build complete:")
875
+ print(f" Indexed: {stats['indexed']}")
876
+ print(f" Skipped: {stats['skipped']} (unchanged)")
877
+ failed = stats['failed']
878
+ if failed > 0:
879
+ empty = stats.get('empty', 0)
880
+ parse_err = stats.get('parse_error', 0)
881
+ index_err = stats.get('index_error', 0)
882
+ print(f" Failed: {failed} (empty: {empty}, parse: {parse_err}, "
883
+ f"index: {index_err})")
884
+ else:
885
+ print(f" Failed: 0")
886
+ print(f" Total: {stats['total_files']} "
887
+ f"(Claude: {stats.get('claude_files', '?')}, "
888
+ f"Codex: {stats.get('codex_files', '?')})")
889
+
890
+
891
+ def _scan_session_files(
892
+ claude_home: "Path",
893
+ codex_home: "Path",
894
+ ) -> dict:
895
+ """
896
+ Scan filesystem for all JSONL session files and read their metadata.
897
+
898
+ Returns dict with:
899
+ - files: dict mapping file_path (str) -> {path, is_subagent, agent, ...}
900
+ - counts: {claude_resumable, claude_subagent, codex_resumable, codex_subagent}
901
+ - errors: list of files that couldn't be parsed
902
+ """
903
+ import json
904
+ from claude_code_tools.session_utils import is_valid_session
905
+
906
+ files = {}
907
+ counts = {
908
+ "claude_resumable": 0,
909
+ "claude_subagent": 0,
910
+ "codex_resumable": 0,
911
+ "codex_subagent": 0,
912
+ "claude_invalid": 0,
913
+ "codex_invalid": 0,
914
+ }
915
+ errors = []
916
+
917
+ # Scan Claude sessions
918
+ claude_projects = claude_home / "projects"
919
+ if claude_projects.exists():
920
+ for jsonl_path in claude_projects.glob("**/*.jsonl"):
921
+ is_subagent = jsonl_path.name.startswith("agent-")
922
+ try:
923
+ with open(jsonl_path) as f:
924
+ first_line = f.readline().strip()
925
+ if first_line:
926
+ data = json.loads(first_line)
927
+
928
+ # Skip sessions run from inside claude_home or codex_home
929
+ cwd = data.get("cwd", "")
930
+ claude_home_str = str(claude_home)
931
+ codex_home_str = str(codex_home)
932
+ if cwd and (
933
+ cwd.startswith(claude_home_str)
934
+ or cwd.startswith(codex_home_str)
935
+ ):
936
+ continue
937
+ # Use file path as key (unique per file)
938
+ file_key = str(jsonl_path)
939
+
940
+ # Check if actually resumable (has user/assistant messages)
941
+ if is_subagent:
942
+ is_resumable = True # Subagents are always valid
943
+ else:
944
+ is_resumable = is_valid_session(jsonl_path)
945
+
946
+ if not is_resumable:
947
+ counts["claude_invalid"] += 1
948
+ continue # Skip non-resumable files
949
+
950
+ files[file_key] = {
951
+ "path": jsonl_path,
952
+ "is_subagent": is_subagent,
953
+ "agent": "claude",
954
+ "session_id": data.get("sessionId", ""),
955
+ }
956
+ if is_subagent:
957
+ counts["claude_subagent"] += 1
958
+ else:
959
+ counts["claude_resumable"] += 1
960
+ except Exception as e:
961
+ errors.append({"path": jsonl_path, "error": str(e)})
962
+
963
+ # Scan Codex sessions
964
+ if codex_home.exists():
965
+ for jsonl_path in codex_home.glob("**/*.jsonl"):
966
+ is_subagent = jsonl_path.name.startswith("agent-")
967
+ try:
968
+ with open(jsonl_path) as f:
969
+ first_line = f.readline().strip()
970
+ if first_line:
971
+ data = json.loads(first_line)
972
+
973
+ # Skip sessions run from inside claude_home or codex_home
974
+ cwd = data.get("cwd", "")
975
+ claude_home_str = str(claude_home)
976
+ codex_home_str = str(codex_home)
977
+ if cwd and (
978
+ cwd.startswith(claude_home_str)
979
+ or cwd.startswith(codex_home_str)
980
+ ):
981
+ continue
982
+ # Use file path as key (unique per file)
983
+ file_key = str(jsonl_path)
984
+
985
+ # Check if actually resumable (has user/assistant messages)
986
+ if is_subagent:
987
+ is_resumable = True # Subagents are always valid
988
+ else:
989
+ is_resumable = is_valid_session(jsonl_path)
990
+
991
+ if not is_resumable:
992
+ counts["codex_invalid"] += 1
993
+ continue # Skip non-resumable files
994
+
995
+ files[file_key] = {
996
+ "path": jsonl_path,
997
+ "is_subagent": is_subagent,
998
+ "agent": "codex",
999
+ "session_id": data.get("sessionId", "") or data.get("id", ""),
1000
+ }
1001
+ if is_subagent:
1002
+ counts["codex_subagent"] += 1
1003
+ else:
1004
+ counts["codex_resumable"] += 1
1005
+ except Exception as e:
1006
+ errors.append({"path": jsonl_path, "error": str(e)})
1007
+
1008
+ return {"files": files, "counts": counts, "errors": errors}
1009
+
1010
+
1011
+ @main.command("index-stats")
1012
+ @click.option(
1013
+ "--index", "-i",
1014
+ type=click.Path(),
1015
+ default="~/.cctools/search-index",
1016
+ help="Index directory",
1017
+ )
1018
+ @click.option("--cwd", "-c", help="Filter to specific cwd path")
1019
+ @click.option(
1020
+ "--claude-home",
1021
+ type=click.Path(),
1022
+ default=None,
1023
+ help="Claude home directory (default: ~/.claude or CLAUDE_CONFIG_DIR)",
1024
+ )
1025
+ @click.option(
1026
+ "--codex-home",
1027
+ type=click.Path(),
1028
+ default=None,
1029
+ help="Codex home directory (default: ~/.codex or CODEX_HOME)",
1030
+ )
1031
+ def index_stats(index, cwd, claude_home, codex_home):
1032
+ """Show statistics about the Tantivy search index with reconciliation.
1033
+
1034
+ Compares index contents against actual session files on disk to identify
1035
+ missing or orphaned sessions.
1036
+ """
1037
+ from collections import Counter
1038
+ from pathlib import Path
1039
+
1040
+ try:
1041
+ from claude_code_tools.search_index import SessionIndex
1042
+ except ImportError:
1043
+ print("Error: tantivy not installed")
1044
+ return
1045
+
1046
+ from claude_code_tools.session_utils import get_claude_home, get_codex_home
1047
+
1048
+ index_path = Path(index).expanduser()
1049
+ claude_home_path = get_claude_home(cli_arg=claude_home)
1050
+ codex_home_path = get_codex_home(cli_arg=codex_home)
1051
+
1052
+ if not index_path.exists():
1053
+ print(f"Index not found at {index_path}")
1054
+ return
1055
+
1056
+ # === Filesystem scan ===
1057
+ print("Scanning filesystem...")
1058
+ fs_data = _scan_session_files(claude_home_path, codex_home_path)
1059
+ fs_files = fs_data["files"]
1060
+ fs_counts = fs_data["counts"]
1061
+ fs_errors = fs_data["errors"]
1062
+
1063
+ print("\n=== Filesystem ===")
1064
+ print(f"Claude resumable: {fs_counts['claude_resumable']}")
1065
+ print(f"Claude subagent: {fs_counts['claude_subagent']}")
1066
+ print(f"Codex resumable: {fs_counts['codex_resumable']}")
1067
+ print(f"Codex subagent: {fs_counts['codex_subagent']}")
1068
+ total_valid = (
1069
+ fs_counts['claude_resumable'] + fs_counts['claude_subagent'] +
1070
+ fs_counts['codex_resumable'] + fs_counts['codex_subagent']
1071
+ )
1072
+ total_invalid = fs_counts['claude_invalid'] + fs_counts['codex_invalid']
1073
+ print(f"Total valid: {total_valid}")
1074
+ if total_invalid > 0:
1075
+ print(f"Skipped invalid: {total_invalid} (no resumable messages)")
1076
+
1077
+ if fs_errors:
1078
+ print(f"Parse errors: {len(fs_errors)}")
1079
+
1080
+ # === Index stats ===
1081
+ idx = SessionIndex(index_path)
1082
+ results = idx.get_recent(limit=100000)
1083
+
1084
+ print("\n=== Index ===")
1085
+ print(f"Total documents: {len(results)}")
1086
+
1087
+ # Build index lookup by export_path (unique key for each indexed file)
1088
+ # Filter to only entries matching the specified claude_home/codex_home
1089
+ indexed_by_path = {}
1090
+ claude_home_str = str(claude_home_path)
1091
+ codex_home_str = str(codex_home_path)
1092
+
1093
+ for r in results:
1094
+ fpath = r.get("export_path", "")
1095
+ stored_home = r.get("claude_home", "")
1096
+ # Only include if home matches (claude or codex)
1097
+ if fpath and (stored_home == claude_home_str or stored_home == codex_home_str):
1098
+ indexed_by_path[fpath] = {
1099
+ "agent": r.get("agent", ""),
1100
+ "session_id": r.get("session_id", ""),
1101
+ "is_subagent": "agent-" in fpath,
1102
+ }
1103
+
1104
+ # Also count unique session IDs for display (filtered)
1105
+ unique_session_ids = set(
1106
+ r.get("session_id", "") for r in results
1107
+ if r.get("session_id") and r.get("claude_home") in (claude_home_str, codex_home_str)
1108
+ )
1109
+ print(f"Unique session IDs: {len(unique_session_ids)} (for specified homes)")
1110
+ print(f"Total file paths: {len(indexed_by_path)}")
1111
+
1112
+ # === Reconciliation ===
1113
+ print("\n=== Reconciliation (by file path) ===")
1114
+
1115
+ fs_paths = set(fs_files.keys())
1116
+ idx_paths = set(indexed_by_path.keys())
1117
+
1118
+ missing_from_index = fs_paths - idx_paths
1119
+ orphaned_in_index = idx_paths - fs_paths
1120
+ in_sync = fs_paths & idx_paths
1121
+
1122
+ print(f"Files on disk: {len(fs_paths)}")
1123
+ print(f"Files indexed: {len(idx_paths)}")
1124
+ print(f"In sync: {len(in_sync)}")
1125
+
1126
+ if not missing_from_index and not orphaned_in_index:
1127
+ print("✅ Index is fully in sync with filesystem")
1128
+ else:
1129
+ if missing_from_index:
1130
+ print(f"❌ Missing from index: {len(missing_from_index)}")
1131
+ # Count by type
1132
+ missing_subagent = sum(
1133
+ 1 for p in missing_from_index if fs_files[p]["is_subagent"]
1134
+ )
1135
+ missing_resumable = len(missing_from_index) - missing_subagent
1136
+ print(f" ({missing_resumable} resumable, {missing_subagent} subagent)")
1137
+ # Show a few examples
1138
+ for fpath in list(missing_from_index)[:3]:
1139
+ info = fs_files[fpath]
1140
+ stype = "subagent" if info["is_subagent"] else "resumable"
1141
+ fname = info["path"].name
1142
+ print(f" - {fname} ({info['agent']}, {stype})")
1143
+ if len(missing_from_index) > 3:
1144
+ print(f" ... and {len(missing_from_index) - 3} more")
1145
+
1146
+ if orphaned_in_index:
1147
+ print(f"⚠️ Orphaned in index (file gone): {len(orphaned_in_index)}")
1148
+ # Count by type
1149
+ orphan_subagent = sum(
1150
+ 1 for p in orphaned_in_index if indexed_by_path[p]["is_subagent"]
1151
+ )
1152
+ orphan_resumable = len(orphaned_in_index) - orphan_subagent
1153
+ print(f" ({orphan_resumable} resumable, {orphan_subagent} subagent)")
1154
+ for fpath in list(orphaned_in_index)[:3]:
1155
+ info = indexed_by_path[fpath]
1156
+ fname = fpath.split("/")[-1]
1157
+ print(f" - {fname} ({info['agent']})")
1158
+ if len(orphaned_in_index) > 3:
1159
+ print(f" ... and {len(orphaned_in_index) - 3} more")
1160
+
1161
+ # Count by cwd if filter specified
1162
+ if cwd:
1163
+ matching = [r for r in results if r.get("cwd") == cwd]
1164
+ matching_unique = set(r.get("session_id") for r in matching)
1165
+ print(f"\nWith cwd '{cwd}':")
1166
+ print(f" Documents: {len(matching)}")
1167
+ print(f" Unique sessions: {len(matching_unique)}")
1168
+
1169
+ # Top cwds
1170
+ cwd_counts = Counter(r.get("cwd", "unknown") for r in results)
1171
+ print("\nTop 5 cwds:")
1172
+ for path, count in cwd_counts.most_common(5):
1173
+ short = path[-50:] if len(path) > 50 else path
1174
+ print(f" {count:4d} | ...{short}" if len(path) > 50 else f" {count:4d} | {short}")
1175
+
1176
+ # Claude home stats
1177
+ claude_home_counts = Counter(r.get("claude_home", "") for r in results)
1178
+ print("\nClaude homes:")
1179
+ for home, count in claude_home_counts.most_common(10):
1180
+ home_display = home if home else "(empty)"
1181
+ print(f" {count:4d} | {home_display}")
1182
+
1183
+
1184
+ @main.command("search")
1185
+ @click.option(
1186
+ '--claude-home',
1187
+ 'claude_home_arg',
1188
+ type=click.Path(exists=True, file_okay=False, dir_okay=True),
1189
+ help='Path to Claude home directory (overrides CLAUDE_CONFIG_DIR env var)',
1190
+ )
1191
+ @click.option(
1192
+ '--codex-home',
1193
+ 'codex_home_arg',
1194
+ type=click.Path(exists=True, file_okay=False, dir_okay=True),
1195
+ help='Path to Codex home directory (overrides CODEX_HOME env var)',
1196
+ )
1197
+ @click.option('-g', '--global', 'global_search', is_flag=True,
1198
+ help='Search across all projects (not just current)')
1199
+ @click.option('--dir', 'filter_dir',
1200
+ help='Filter to directory[:branch] (overrides -g)')
1201
+ @click.option('--branch', 'filter_branch',
1202
+ help='Filter to specific git branch (only effective when not global)')
1203
+ @click.option('-n', '--num-results', type=int, default=None,
1204
+ help='Limit number of results displayed')
1205
+ @click.option('--original', is_flag=True, help='Include original sessions')
1206
+ @click.option('--sub-agent', is_flag=True, help='Include sub-agent sessions')
1207
+ @click.option('--trimmed', is_flag=True, help='Include trimmed sessions')
1208
+ @click.option('--rollover', is_flag=True, help='Include rollover sessions')
1209
+ @click.option('--min-lines', type=int, default=None,
1210
+ help='Only show sessions with at least N lines')
1211
+ @click.option('--after', metavar='DATE',
1212
+ help='Sessions modified after date (YYYYMMDD, MM/DD/YY)')
1213
+ @click.option('--before', metavar='DATE',
1214
+ help='Sessions modified before date (YYYYMMDD, MM/DD/YY)')
1215
+ @click.option('--agent', type=click.Choice(['claude', 'codex', 'all']),
1216
+ default='all', help='Filter by agent type')
1217
+ @click.option('--json', 'json_output', is_flag=True,
1218
+ help='Output as JSONL for AI agents. Fields per line: session_id, '
1219
+ 'agent, project, branch, cwd, lines, created, modified, '
1220
+ 'first_msg, last_msg, file_path, derivation_type, '
1221
+ 'is_sidechain, snippet')
1222
+ @click.option('--by-time', 'by_time', is_flag=True,
1223
+ help='Sort results by last-modified time (default: sort by relevance)')
1224
+ @click.argument('query', required=False)
1225
+ def search(
1226
+ claude_home_arg, codex_home_arg, global_search, filter_dir, filter_branch,
1227
+ num_results, original, sub_agent, trimmed, rollover, min_lines,
1228
+ after, before, agent, json_output, by_time, query
1229
+ ):
1230
+ """Launch interactive TUI for full-text session search.
1231
+
1232
+ Provides fast Tantivy-based search across all Claude and Codex sessions
1233
+ with auto-indexing, keyword highlighting, and session actions.
1234
+
1235
+ \b
1236
+ Examples:
1237
+ aichat search # Interactive TUI
1238
+ aichat search "langroid agent" # Pre-fill search query
1239
+ aichat search -g --after 11/20/25 # Global, recent sessions
1240
+ aichat search --dir ~/Git/myproj # Filter to specific directory
1241
+ aichat search --json "MCP" # JSON output (sorted by relevance)
1242
+ aichat search --json --by-time # JSON output sorted by time
1243
+
1244
+ \b
1245
+ Notes:
1246
+ --dir overrides -g (global) when both are specified.
1247
+ --by-time sorts by last-modified time; default is relevance.
1248
+
1249
+ \b
1250
+ Environment variables:
1251
+ CLAUDE_CONFIG_DIR - Default Claude home (overridden by --claude-home)
1252
+ CODEX_HOME - Default Codex home (overridden by --codex-home)
1253
+ """
1254
+ import json as json_lib
1255
+ import os
1256
+ import subprocess
1257
+ import sys
1258
+ import tempfile
1259
+ from pathlib import Path
1260
+
1261
+ # Find Rust binary - check PATH first (cargo install), then local dev build
1262
+ import shutil
1263
+ rust_binary_name = "aichat-search"
1264
+ rust_binary = shutil.which(rust_binary_name)
1265
+ if rust_binary:
1266
+ rust_binary = Path(rust_binary)
1267
+ else:
1268
+ # Fall back to local development build
1269
+ rust_binary = (
1270
+ Path(__file__).parent.parent
1271
+ / "rust-search-ui"
1272
+ / "target"
1273
+ / "release"
1274
+ / rust_binary_name
1275
+ )
1276
+ if not rust_binary.exists():
1277
+ print(f"Error: {rust_binary_name} not found.", file=sys.stderr)
1278
+ print("Install with: cargo install aichat-search", file=sys.stderr)
1279
+ print("Or build locally: cd rust-search-ui && cargo build --release",
1280
+ file=sys.stderr)
1281
+ return
1282
+
1283
+ # Resolve home directories (CLI arg > env var > default)
1284
+ from claude_code_tools.session_utils import get_claude_home, get_codex_home
1285
+ claude_home = get_claude_home(cli_arg=claude_home_arg)
1286
+ codex_home = get_codex_home(cli_arg=codex_home_arg)
1287
+
1288
+ # Build CLI args for Rust binary
1289
+ rust_args = [str(rust_binary)]
1290
+
1291
+ # Home directories
1292
+ rust_args.extend(["--claude-home", str(claude_home)])
1293
+ rust_args.extend(["--codex-home", str(codex_home)])
1294
+
1295
+ # Filter options
1296
+ if filter_dir:
1297
+ # --dir overrides -g
1298
+ # Support dir:branch format - extract branch if present before resolving path
1299
+ if ':' in filter_dir and not filter_dir.startswith('/') or (
1300
+ ':' in filter_dir and filter_dir.count(':') == 1 and
1301
+ '/' not in filter_dir.split(':')[-1]
1302
+ ):
1303
+ # Has branch suffix (dir:branch format)
1304
+ parts = filter_dir.rsplit(':', 1)
1305
+ dir_part = parts[0]
1306
+ branch_part = parts[1] if len(parts) > 1 else None
1307
+ resolved_dir = str(Path(dir_part).resolve())
1308
+ if branch_part:
1309
+ rust_args.extend(["--dir", f"{resolved_dir}:{branch_part}"])
1310
+ else:
1311
+ rust_args.extend(["--dir", resolved_dir])
1312
+ else:
1313
+ rust_args.extend(["--dir", str(Path(filter_dir).resolve())])
1314
+ elif global_search:
1315
+ rust_args.append("--global")
1316
+ if filter_branch:
1317
+ rust_args.extend(["--branch", filter_branch])
1318
+ if num_results:
1319
+ rust_args.extend(["--num-results", str(num_results)])
1320
+ if original:
1321
+ rust_args.append("--original")
1322
+ if sub_agent:
1323
+ rust_args.append("--sub-agent")
1324
+ if trimmed:
1325
+ rust_args.append("--trimmed")
1326
+ if rollover:
1327
+ rust_args.append("--rollover")
1328
+ if min_lines:
1329
+ rust_args.extend(["--min-lines", str(min_lines)])
1330
+ if after:
1331
+ rust_args.extend(["--after", after])
1332
+ if before:
1333
+ rust_args.extend(["--before", before])
1334
+ if agent and agent != "all":
1335
+ rust_args.extend(["--agent", agent])
1336
+ if query:
1337
+ rust_args.extend(["--query", query])
1338
+ if by_time:
1339
+ rust_args.append("--by-time")
1340
+
1341
+ # JSON output mode - run Rust with --json, output to stdout, exit
1342
+ if json_output:
1343
+ rust_args.append("--json")
1344
+ try:
1345
+ result = subprocess.run(rust_args, capture_output=True, text=True)
1346
+ # Output JSON to stdout (errors to stderr)
1347
+ # Use end='' to avoid double newline (Rust already adds one)
1348
+ if result.stdout:
1349
+ print(result.stdout, end='')
1350
+ if result.returncode != 0 and result.stderr:
1351
+ print(result.stderr, file=sys.stderr)
1352
+ sys.exit(result.returncode)
1353
+ except Exception as e:
1354
+ print(f"Error running search: {e}", file=sys.stderr)
1355
+ sys.exit(1)
1356
+
1357
+ # Import for interactive TUI mode
1358
+ from claude_code_tools.node_menu_ui import run_node_menu_ui, run_dir_confirm_ui
1359
+ from claude_code_tools.session_menu_cli import execute_action
1360
+
1361
+ # RPC path for action execution
1362
+ rpc_path = str(Path(__file__).parent / "action_rpc.py")
1363
+
1364
+ def action_handler(sess, action, kwargs):
1365
+ """Handle action from Node menu."""
1366
+ agent_type = sess.get("agent", "claude")
1367
+ file_path = sess.get("file_path")
1368
+ cwd = sess.get("cwd") or "."
1369
+
1370
+ if not file_path:
1371
+ print(f"Error: No file_path for session {sess.get('session_id')}")
1372
+ return
1373
+
1374
+ return execute_action(
1375
+ action=action,
1376
+ agent=agent_type,
1377
+ session_file=Path(file_path),
1378
+ project_path=cwd,
1379
+ action_kwargs=kwargs,
1380
+ session_id=sess.get("session_id"),
1381
+ )
1382
+
1383
+ def check_directory_and_confirm(sess):
1384
+ """Check if session is from different directory and get user confirmation.
1385
+
1386
+ Returns:
1387
+ (proceed, original_dir) tuple:
1388
+ - proceed: True if user wants to proceed, False if cancelled
1389
+ - original_dir: The directory before any change (to restore on cancel),
1390
+ or None if no directory change was made
1391
+ """
1392
+ session_dir = sess.get("cwd") or "."
1393
+ current_dir = os.getcwd()
1394
+
1395
+ # If same directory, proceed (no restore needed)
1396
+ if os.path.realpath(session_dir) == os.path.realpath(current_dir):
1397
+ return (True, None)
1398
+
1399
+ # Show confirmation dialog
1400
+ choice = run_dir_confirm_ui(current_dir, session_dir)
1401
+
1402
+ if choice == "yes":
1403
+ # Change directory and proceed
1404
+ original_dir = current_dir
1405
+ try:
1406
+ os.chdir(session_dir)
1407
+ except Exception as e:
1408
+ print(f"Error changing directory: {e}")
1409
+ original_dir = None # No restore needed if change failed
1410
+ return (True, original_dir)
1411
+ elif choice == "no":
1412
+ # Proceed without changing directory (no restore needed)
1413
+ return (True, None)
1414
+ else:
1415
+ # 'cancel' or None - user wants to go back
1416
+ return (False, None)
1417
+
1418
+ # Main loop: Rust TUI → Node menu → back to Rust TUI
1419
+ while True:
1420
+ # Create temp file for IPC
1421
+ fd, out_path = tempfile.mkstemp(suffix="-rust-ui.json")
1422
+ os.close(fd)
1423
+
1424
+ # Run Rust TUI (interactive - needs TTY)
1425
+ tui_args = rust_args + [out_path]
1426
+ try:
1427
+ result = subprocess.run(tui_args)
1428
+ except Exception as e:
1429
+ print(f"Error running Rust TUI: {e}")
1430
+ try:
1431
+ os.unlink(out_path)
1432
+ except Exception:
1433
+ pass
1434
+ return
1435
+
1436
+ if result.returncode != 0:
1437
+ try:
1438
+ os.unlink(out_path)
1439
+ except Exception:
1440
+ pass
1441
+ return
1442
+
1443
+ # Read JSON from temp file
1444
+ try:
1445
+ content = Path(out_path).read_text().strip()
1446
+ except Exception:
1447
+ content = ""
1448
+ finally:
1449
+ try:
1450
+ os.unlink(out_path)
1451
+ except Exception:
1452
+ pass
1453
+
1454
+ if not content:
1455
+ # User quit without selecting - exit the loop
1456
+ return
1457
+
1458
+ try:
1459
+ result = json_lib.loads(content)
1460
+ except json_lib.JSONDecodeError as e:
1461
+ print(f"Error parsing Rust output: {e}")
1462
+ print(f"Output was: {content[:200]}")
1463
+ return
1464
+
1465
+ # New format: {"session": {...}, "action": "...", "filter_state": {...}}
1466
+ # Legacy format: just the session object
1467
+ if "session" in result and "action" in result:
1468
+ selected = result["session"]
1469
+ action = result["action"]
1470
+ else:
1471
+ # Legacy: session only, show Node menu
1472
+ selected = result
1473
+ action = "menu"
1474
+
1475
+ # Extract and apply filter state for next loop iteration
1476
+ filter_state = result.get("filter_state", {})
1477
+ if filter_state:
1478
+ # Rebuild rust_args with preserved filter state
1479
+ rust_args = [str(rust_binary)]
1480
+ rust_args.extend(["--claude-home", str(claude_home)])
1481
+ rust_args.extend(["--codex-home", str(codex_home)])
1482
+
1483
+ # Scope: --dir overrides --global
1484
+ if filter_state.get("filter_dir"):
1485
+ rust_args.extend(["--dir", filter_state["filter_dir"]])
1486
+ elif filter_state.get("scope_global"):
1487
+ rust_args.append("--global")
1488
+
1489
+ # Branch filter
1490
+ if filter_state.get("filter_branch"):
1491
+ rust_args.extend(["--branch", filter_state["filter_branch"]])
1492
+
1493
+ # Session type filters (only add if true)
1494
+ if filter_state.get("include_original"):
1495
+ rust_args.append("--original")
1496
+ if filter_state.get("include_sub"):
1497
+ rust_args.append("--sub-agent")
1498
+ if filter_state.get("include_trimmed"):
1499
+ rust_args.append("--trimmed")
1500
+ if filter_state.get("include_continued"):
1501
+ rust_args.append("--rollover")
1502
+
1503
+ # Other filters
1504
+ if filter_state.get("filter_min_lines"):
1505
+ rust_args.extend(["--min-lines", str(filter_state["filter_min_lines"])])
1506
+ if filter_state.get("filter_after_date"):
1507
+ rust_args.extend(["--after", filter_state["filter_after_date"]])
1508
+ if filter_state.get("filter_before_date"):
1509
+ rust_args.extend(["--before", filter_state["filter_before_date"]])
1510
+ if filter_state.get("filter_agent"):
1511
+ rust_args.extend(["--agent", filter_state["filter_agent"]])
1512
+ if filter_state.get("query"):
1513
+ rust_args.extend(["--query", filter_state["query"]])
1514
+ if filter_state.get("sort_by_time"):
1515
+ rust_args.append("--by-time")
1516
+
1517
+ # Restore scroll/selection state
1518
+ if filter_state.get("selected") is not None:
1519
+ rust_args.extend(["--selected", str(filter_state["selected"])])
1520
+ if filter_state.get("list_scroll") is not None:
1521
+ rust_args.extend(["--scroll", str(filter_state["list_scroll"])])
1522
+
1523
+ # Preserve num_results if originally specified
1524
+ if num_results:
1525
+ rust_args.extend(["--num-results", str(num_results)])
1526
+
1527
+ # Convert ISO date strings from Rust to Unix timestamps
1528
+ def iso_to_timestamp(iso_str: str) -> float:
1529
+ """Convert ISO date string to Unix timestamp."""
1530
+ if not iso_str:
1531
+ return 0.0
1532
+ try:
1533
+ from datetime import datetime
1534
+ # Handle both formats: with and without 'Z' suffix
1535
+ iso_str = iso_str.replace("Z", "+00:00")
1536
+ dt = datetime.fromisoformat(iso_str)
1537
+ return dt.timestamp()
1538
+ except (ValueError, TypeError):
1539
+ return 0.0
1540
+
1541
+ # Convert to session format expected by handlers
1542
+ # Rust sends 'created'/'modified' as ISO strings, Node UI expects
1543
+ # 'create_time'/'mod_time' as Unix timestamps
1544
+ session = {
1545
+ "session_id": selected.get("session_id", ""),
1546
+ "agent": selected.get("agent", "claude"),
1547
+ "agent_display": selected.get("agent", "claude").title(),
1548
+ "project": selected.get("project", ""),
1549
+ "branch": selected.get("branch", ""),
1550
+ "lines": selected.get("lines", 0),
1551
+ "file_path": selected.get("file_path", ""),
1552
+ "cwd": selected.get("cwd", ""),
1553
+ "is_sidechain": selected.get("is_sidechain", False),
1554
+ "create_time": iso_to_timestamp(selected.get("created", "")),
1555
+ "mod_time": iso_to_timestamp(selected.get("modified", "")),
1556
+ }
1557
+
1558
+ # Extract cwd from file_path metadata if needed (for older export format)
1559
+ file_path = selected.get("file_path", "")
1560
+ if file_path and file_path.endswith(".txt"):
1561
+ try:
1562
+ with open(file_path, "r") as f:
1563
+ file_content = f.read(2000)
1564
+ if file_content.startswith("---\n"):
1565
+ end_idx = file_content.find("\n---\n", 4)
1566
+ if end_idx != -1:
1567
+ import yaml
1568
+ metadata = yaml.safe_load(file_content[4:end_idx])
1569
+ if metadata:
1570
+ session["cwd"] = metadata.get("cwd") or session["cwd"]
1571
+ session["file_path"] = metadata.get("file_path", file_path)
1572
+ except Exception:
1573
+ pass
1574
+
1575
+ print(f"Selected: {session['project']} / {session['session_id'][:12]}...")
1576
+
1577
+ # Track original directory for restoration on Ctrl+C
1578
+ original_dir_for_interrupt = None
1579
+
1580
+ try:
1581
+ # Dispatch based on action
1582
+ if action == "menu":
1583
+ # Legacy: show Node action menu, loop back on Escape
1584
+ run_node_menu_ui(
1585
+ sessions=[session],
1586
+ keywords=[],
1587
+ action_handler=action_handler,
1588
+ start_action=True,
1589
+ focus_session_id=session["session_id"],
1590
+ rpc_path=rpc_path,
1591
+ )
1592
+ # Loop back to Rust TUI
1593
+ elif action == "view":
1594
+ # View is handled in Rust, shouldn't reach here
1595
+ pass
1596
+ elif action in ("path", "copy", "export"):
1597
+ # Non-launch actions: go directly to nonlaunch screen
1598
+ run_node_menu_ui(
1599
+ sessions=[session],
1600
+ keywords=[],
1601
+ action_handler=action_handler,
1602
+ start_action=False,
1603
+ focus_session_id=session["session_id"],
1604
+ rpc_path=rpc_path,
1605
+ start_screen="nonlaunch",
1606
+ direct_action=action,
1607
+ )
1608
+ # Continue loop to return to Rust TUI
1609
+ elif action == "query":
1610
+ # Query: go directly to query screen
1611
+ run_node_menu_ui(
1612
+ sessions=[session],
1613
+ keywords=[],
1614
+ action_handler=action_handler,
1615
+ start_action=False,
1616
+ focus_session_id=session["session_id"],
1617
+ rpc_path=rpc_path,
1618
+ start_screen="query",
1619
+ direct_action="query",
1620
+ )
1621
+ # Continue loop to return to Rust TUI
1622
+ elif action == "suppress_resume":
1623
+ # Trim + resume: check directory first, then show trim form
1624
+ proceed, original_dir = check_directory_and_confirm(session)
1625
+ if not proceed:
1626
+ continue # User cancelled - pop back to Rust search
1627
+ original_dir_for_interrupt = original_dir
1628
+ run_node_menu_ui(
1629
+ sessions=[session],
1630
+ keywords=[],
1631
+ action_handler=action_handler,
1632
+ start_action=False,
1633
+ focus_session_id=session["session_id"],
1634
+ rpc_path=rpc_path,
1635
+ start_screen="trim",
1636
+ direct_action="suppress_resume",
1637
+ exit_on_back=True, # Pop back to Rust search on cancel
1638
+ )
1639
+ # If we return here, user cancelled - restore directory and pop back
1640
+ if original_dir:
1641
+ os.chdir(original_dir)
1642
+ elif action == "smart_trim_resume":
1643
+ # Smart trim: check directory first, then show options form
1644
+ proceed, original_dir = check_directory_and_confirm(session)
1645
+ if not proceed:
1646
+ continue # User cancelled - pop back to Rust search
1647
+ original_dir_for_interrupt = original_dir
1648
+ run_node_menu_ui(
1649
+ sessions=[session],
1650
+ keywords=[],
1651
+ action_handler=action_handler,
1652
+ start_action=False,
1653
+ focus_session_id=session["session_id"],
1654
+ rpc_path=rpc_path,
1655
+ start_screen="smart_trim_form",
1656
+ direct_action="smart_trim_resume",
1657
+ exit_on_back=True, # Pop back to Rust search on cancel
1658
+ )
1659
+ # If we return here, user cancelled - restore directory and pop back
1660
+ if original_dir:
1661
+ os.chdir(original_dir)
1662
+ elif action == "continue":
1663
+ # Continue with context: check directory first, then show options form
1664
+ proceed, original_dir = check_directory_and_confirm(session)
1665
+ if not proceed:
1666
+ continue # User cancelled - pop back to Rust search
1667
+ original_dir_for_interrupt = original_dir
1668
+ run_node_menu_ui(
1669
+ sessions=[session],
1670
+ keywords=[],
1671
+ action_handler=action_handler,
1672
+ start_action=False,
1673
+ focus_session_id=session["session_id"],
1674
+ rpc_path=rpc_path,
1675
+ start_screen="continue_form",
1676
+ direct_action="continue",
1677
+ exit_on_back=True, # Pop back to Rust search on cancel
1678
+ )
1679
+ # If we return here, user cancelled - restore directory and pop back
1680
+ if original_dir:
1681
+ os.chdir(original_dir)
1682
+ elif action in ("resume", "clone"):
1683
+ # Resume/clone: check directory first, then execute
1684
+ proceed, original_dir = check_directory_and_confirm(session)
1685
+ if not proceed:
1686
+ continue # User cancelled - pop back to Rust search
1687
+ original_dir_for_interrupt = original_dir
1688
+ # Note: if successful, action_handler calls os.execvp and never returns
1689
+ action_handler(session, action, {})
1690
+ # If we get here, something failed - restore directory and pop back
1691
+ if original_dir:
1692
+ os.chdir(original_dir)
1693
+ elif action == "delete":
1694
+ # Delete: already confirmed in Rust UI, just execute
1695
+ action_handler(session, action, {})
1696
+ # Remove deleted session from search index
1697
+ try:
1698
+ from claude_code_tools.search_index import SessionIndex
1699
+ idx = SessionIndex(Path("~/.cctools/search-index").expanduser())
1700
+ idx.prune_deleted()
1701
+ except Exception:
1702
+ pass # Index errors shouldn't block the UI
1703
+ # Loop back to Rust TUI (session list will refresh)
1704
+ else:
1705
+ print(f"Unknown action: {action}")
1706
+ # Continue loop
1707
+ except KeyboardInterrupt:
1708
+ # Ctrl+C pressed - restore directory if changed and pop back to search
1709
+ if original_dir_for_interrupt:
1710
+ try:
1711
+ os.chdir(original_dir_for_interrupt)
1712
+ except Exception:
1713
+ pass
1714
+ # Continue loop to return to Rust TUI
1715
+
1716
+
1717
+ if __name__ == "__main__":
1718
+ main()