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.
- claude_code_tools/__init__.py +3 -0
- claude_code_tools/action_rpc.py +403 -0
- claude_code_tools/aichat.py +1718 -0
- claude_code_tools/claude_continue.py +299 -0
- claude_code_tools/codex_continue.py +309 -0
- claude_code_tools/config.py +93 -0
- claude_code_tools/delete_session.py +194 -0
- claude_code_tools/dotenv_vault.py +268 -0
- claude_code_tools/env_safe.py +235 -0
- claude_code_tools/export_all.py +342 -0
- claude_code_tools/export_claude_session.py +481 -0
- claude_code_tools/export_codex_session.py +466 -0
- claude_code_tools/export_session.py +573 -0
- claude_code_tools/find_claude_session.py +1741 -0
- claude_code_tools/find_codex_session.py +1329 -0
- claude_code_tools/find_original_session.py +134 -0
- claude_code_tools/find_session.py +1086 -0
- claude_code_tools/find_trimmed_sessions.py +259 -0
- claude_code_tools/node_menu_ui.py +406 -0
- claude_code_tools/search_index.py +1247 -0
- claude_code_tools/session_lineage.py +260 -0
- claude_code_tools/session_menu.py +187 -0
- claude_code_tools/session_menu_cli.py +448 -0
- claude_code_tools/session_tui.py +516 -0
- claude_code_tools/session_utils.py +1313 -0
- claude_code_tools/smart_trim.py +424 -0
- claude_code_tools/smart_trim_core.py +616 -0
- claude_code_tools/tmux_cli_controller.py +928 -0
- claude_code_tools/tmux_remote_controller.py +229 -0
- claude_code_tools/trim_session.py +817 -0
- claude_code_tools/trim_session_claude.py +319 -0
- claude_code_tools/trim_session_codex.py +344 -0
- claude_code_tools-1.0.10.dist-info/METADATA +685 -0
- claude_code_tools-1.0.10.dist-info/RECORD +1807 -0
- claude_code_tools-1.0.10.dist-info/WHEEL +4 -0
- claude_code_tools-1.0.10.dist-info/entry_points.txt +5 -0
- claude_code_tools-1.0.10.dist-info/licenses/LICENSE +21 -0
- docs/cc-codex-instructions.md +37 -0
- docs/claude-code-chutes.md +138 -0
- docs/claude-code-tmux-tutorials.md +105 -0
- docs/dot-zshrc.md +307 -0
- docs/find-claude-session.md +149 -0
- docs/lmsh.md +70 -0
- docs/reddit-post.md +55 -0
- docs/tmux-cli-instructions.md +186 -0
- docs/vault-documentation.md +161 -0
- node_ui/action_config.js +72 -0
- node_ui/menu.js +2367 -0
- node_ui/node_modules/.bin/is-in-ci +5 -0
- node_ui/node_modules/.bin/loose-envify +16 -0
- node_ui/node_modules/.package-lock.json +714 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/README.md +248 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.d.ts +11 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.js +41 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/ansiCodes.js.map +1 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/diff.d.ts +6 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/diff.js +17 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/diff.js.map +1 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/index.d.ts +6 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/index.js +7 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/index.js.map +1 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/reduce.d.ts +5 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/reduce.js +27 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/reduce.js.map +1 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/styledChars.d.ts +6 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/styledChars.js +38 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/styledChars.js.map +1 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/tokenize.d.ts +12 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/tokenize.js +70 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/tokenize.js.map +1 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/undo.d.ts +3 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/undo.js +11 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/build/undo.js.map +1 -0
- node_ui/node_modules/@alcalzone/ansi-tokenize/package.json +63 -0
- node_ui/node_modules/ansi-escapes/base.d.ts +292 -0
- node_ui/node_modules/ansi-escapes/base.js +198 -0
- node_ui/node_modules/ansi-escapes/index.d.ts +2 -0
- node_ui/node_modules/ansi-escapes/index.js +2 -0
- node_ui/node_modules/ansi-escapes/license +9 -0
- node_ui/node_modules/ansi-escapes/package.json +70 -0
- node_ui/node_modules/ansi-escapes/readme.md +284 -0
- node_ui/node_modules/ansi-regex/index.d.ts +33 -0
- node_ui/node_modules/ansi-regex/index.js +14 -0
- node_ui/node_modules/ansi-regex/license +9 -0
- node_ui/node_modules/ansi-regex/package.json +61 -0
- node_ui/node_modules/ansi-regex/readme.md +66 -0
- node_ui/node_modules/ansi-styles/index.d.ts +236 -0
- node_ui/node_modules/ansi-styles/index.js +223 -0
- node_ui/node_modules/ansi-styles/license +9 -0
- node_ui/node_modules/ansi-styles/package.json +54 -0
- node_ui/node_modules/ansi-styles/readme.md +173 -0
- node_ui/node_modules/auto-bind/index.d.ts +50 -0
- node_ui/node_modules/auto-bind/index.js +41 -0
- node_ui/node_modules/auto-bind/license +9 -0
- node_ui/node_modules/auto-bind/package.json +51 -0
- node_ui/node_modules/auto-bind/react.d.ts +26 -0
- node_ui/node_modules/auto-bind/react.js +28 -0
- node_ui/node_modules/auto-bind/readme.md +92 -0
- node_ui/node_modules/chalk/license +9 -0
- node_ui/node_modules/chalk/package.json +83 -0
- node_ui/node_modules/chalk/readme.md +325 -0
- node_ui/node_modules/chalk/source/index.d.ts +320 -0
- node_ui/node_modules/chalk/source/index.js +225 -0
- node_ui/node_modules/chalk/source/utilities.js +33 -0
- node_ui/node_modules/chalk/source/vendor/ansi-styles/index.d.ts +236 -0
- node_ui/node_modules/chalk/source/vendor/ansi-styles/index.js +223 -0
- node_ui/node_modules/chalk/source/vendor/supports-color/browser.d.ts +1 -0
- node_ui/node_modules/chalk/source/vendor/supports-color/browser.js +30 -0
- node_ui/node_modules/chalk/source/vendor/supports-color/index.d.ts +55 -0
- node_ui/node_modules/chalk/source/vendor/supports-color/index.js +182 -0
- node_ui/node_modules/cli-boxes/boxes.json +82 -0
- node_ui/node_modules/cli-boxes/index.d.ts +127 -0
- node_ui/node_modules/cli-boxes/index.js +6 -0
- node_ui/node_modules/cli-boxes/license +9 -0
- node_ui/node_modules/cli-boxes/package.json +42 -0
- node_ui/node_modules/cli-boxes/readme.md +115 -0
- node_ui/node_modules/cli-cursor/index.d.ts +47 -0
- node_ui/node_modules/cli-cursor/index.js +39 -0
- node_ui/node_modules/cli-cursor/license +9 -0
- node_ui/node_modules/cli-cursor/package.json +49 -0
- node_ui/node_modules/cli-cursor/readme.md +51 -0
- node_ui/node_modules/cli-truncate/index.d.ts +116 -0
- node_ui/node_modules/cli-truncate/index.js +99 -0
- node_ui/node_modules/cli-truncate/license +9 -0
- node_ui/node_modules/cli-truncate/node_modules/slice-ansi/index.js +105 -0
- node_ui/node_modules/cli-truncate/node_modules/slice-ansi/license +10 -0
- node_ui/node_modules/cli-truncate/node_modules/slice-ansi/package.json +53 -0
- node_ui/node_modules/cli-truncate/node_modules/slice-ansi/readme.md +66 -0
- node_ui/node_modules/cli-truncate/package.json +51 -0
- node_ui/node_modules/cli-truncate/readme.md +150 -0
- node_ui/node_modules/code-excerpt/dist/index.d.ts +9 -0
- node_ui/node_modules/code-excerpt/dist/index.js +27 -0
- node_ui/node_modules/code-excerpt/license +21 -0
- node_ui/node_modules/code-excerpt/package.json +43 -0
- node_ui/node_modules/code-excerpt/readme.md +65 -0
- node_ui/node_modules/convert-to-spaces/dist/index.d.ts +2 -0
- node_ui/node_modules/convert-to-spaces/dist/index.js +4 -0
- node_ui/node_modules/convert-to-spaces/license +21 -0
- node_ui/node_modules/convert-to-spaces/package.json +40 -0
- node_ui/node_modules/convert-to-spaces/readme.md +39 -0
- node_ui/node_modules/emoji-regex/LICENSE-MIT.txt +20 -0
- node_ui/node_modules/emoji-regex/README.md +107 -0
- node_ui/node_modules/emoji-regex/index.d.ts +3 -0
- node_ui/node_modules/emoji-regex/index.js +4 -0
- node_ui/node_modules/emoji-regex/index.mjs +4 -0
- node_ui/node_modules/emoji-regex/package.json +45 -0
- node_ui/node_modules/environment/index.d.ts +74 -0
- node_ui/node_modules/environment/index.js +47 -0
- node_ui/node_modules/environment/license +9 -0
- node_ui/node_modules/environment/package.json +74 -0
- node_ui/node_modules/environment/readme.md +94 -0
- node_ui/node_modules/escape-string-regexp/index.d.ts +16 -0
- node_ui/node_modules/escape-string-regexp/index.js +11 -0
- node_ui/node_modules/escape-string-regexp/license +9 -0
- node_ui/node_modules/escape-string-regexp/package.json +40 -0
- node_ui/node_modules/escape-string-regexp/readme.md +34 -0
- node_ui/node_modules/figures/index.d.ts +269 -0
- node_ui/node_modules/figures/index.js +322 -0
- node_ui/node_modules/figures/license +9 -0
- node_ui/node_modules/figures/package.json +46 -0
- node_ui/node_modules/figures/readme.md +328 -0
- node_ui/node_modules/get-east-asian-width/index.d.ts +60 -0
- node_ui/node_modules/get-east-asian-width/index.js +30 -0
- node_ui/node_modules/get-east-asian-width/license +9 -0
- node_ui/node_modules/get-east-asian-width/lookup.js +403 -0
- node_ui/node_modules/get-east-asian-width/package.json +70 -0
- node_ui/node_modules/get-east-asian-width/readme.md +65 -0
- node_ui/node_modules/indent-string/index.d.ts +38 -0
- node_ui/node_modules/indent-string/index.js +38 -0
- node_ui/node_modules/indent-string/license +9 -0
- node_ui/node_modules/indent-string/package.json +40 -0
- node_ui/node_modules/indent-string/readme.md +73 -0
- node_ui/node_modules/ink/build/apply-styles.js +175 -0
- node_ui/node_modules/ink/build/build-layout.js +77 -0
- node_ui/node_modules/ink/build/calculate-wrapped-text.js +53 -0
- node_ui/node_modules/ink/build/colorize.d.ts +3 -0
- node_ui/node_modules/ink/build/colorize.js +48 -0
- node_ui/node_modules/ink/build/colorize.js.map +1 -0
- node_ui/node_modules/ink/build/components/App.d.ts +61 -0
- node_ui/node_modules/ink/build/components/App.js +286 -0
- node_ui/node_modules/ink/build/components/App.js.map +1 -0
- node_ui/node_modules/ink/build/components/AppContext.d.ts +12 -0
- node_ui/node_modules/ink/build/components/AppContext.js +11 -0
- node_ui/node_modules/ink/build/components/AppContext.js.map +1 -0
- node_ui/node_modules/ink/build/components/Box.d.ts +62 -0
- node_ui/node_modules/ink/build/components/Box.js +20 -0
- node_ui/node_modules/ink/build/components/Box.js.map +1 -0
- node_ui/node_modules/ink/build/components/Color.js +62 -0
- node_ui/node_modules/ink/build/components/ErrorOverview.d.ts +6 -0
- node_ui/node_modules/ink/build/components/ErrorOverview.js +79 -0
- node_ui/node_modules/ink/build/components/ErrorOverview.js.map +1 -0
- node_ui/node_modules/ink/build/components/FocusContext.d.ts +17 -0
- node_ui/node_modules/ink/build/components/FocusContext.js +17 -0
- node_ui/node_modules/ink/build/components/FocusContext.js.map +1 -0
- node_ui/node_modules/ink/build/components/Newline.d.ts +13 -0
- node_ui/node_modules/ink/build/components/Newline.js +8 -0
- node_ui/node_modules/ink/build/components/Newline.js.map +1 -0
- node_ui/node_modules/ink/build/components/Spacer.d.ts +6 -0
- node_ui/node_modules/ink/build/components/Spacer.js +10 -0
- node_ui/node_modules/ink/build/components/Spacer.js.map +1 -0
- node_ui/node_modules/ink/build/components/Static.d.ts +31 -0
- node_ui/node_modules/ink/build/components/Static.js +33 -0
- node_ui/node_modules/ink/build/components/Static.js.map +1 -0
- node_ui/node_modules/ink/build/components/StderrContext.d.ts +19 -0
- node_ui/node_modules/ink/build/components/StderrContext.js +13 -0
- node_ui/node_modules/ink/build/components/StderrContext.js.map +1 -0
- node_ui/node_modules/ink/build/components/StdinContext.d.ts +26 -0
- node_ui/node_modules/ink/build/components/StdinContext.js +19 -0
- node_ui/node_modules/ink/build/components/StdinContext.js.map +1 -0
- node_ui/node_modules/ink/build/components/StdoutContext.d.ts +19 -0
- node_ui/node_modules/ink/build/components/StdoutContext.js +13 -0
- node_ui/node_modules/ink/build/components/StdoutContext.js.map +1 -0
- node_ui/node_modules/ink/build/components/Text.d.ts +49 -0
- node_ui/node_modules/ink/build/components/Text.js +40 -0
- node_ui/node_modules/ink/build/components/Text.js.map +1 -0
- node_ui/node_modules/ink/build/components/Transform.d.ts +15 -0
- node_ui/node_modules/ink/build/components/Transform.js +14 -0
- node_ui/node_modules/ink/build/components/Transform.js.map +1 -0
- node_ui/node_modules/ink/build/devtools-window-polyfill.d.ts +1 -0
- node_ui/node_modules/ink/build/devtools-window-polyfill.js +64 -0
- node_ui/node_modules/ink/build/devtools-window-polyfill.js.map +1 -0
- node_ui/node_modules/ink/build/devtools.d.ts +1 -0
- node_ui/node_modules/ink/build/devtools.js +9 -0
- node_ui/node_modules/ink/build/devtools.js.map +1 -0
- node_ui/node_modules/ink/build/dom.d.ts +42 -0
- node_ui/node_modules/ink/build/dom.js +117 -0
- node_ui/node_modules/ink/build/dom.js.map +1 -0
- node_ui/node_modules/ink/build/experimental/apply-style.js +140 -0
- node_ui/node_modules/ink/build/experimental/dom.js +123 -0
- node_ui/node_modules/ink/build/experimental/output.js +91 -0
- node_ui/node_modules/ink/build/experimental/reconciler.js +141 -0
- node_ui/node_modules/ink/build/experimental/renderer.js +81 -0
- node_ui/node_modules/ink/build/get-max-width.d.ts +3 -0
- node_ui/node_modules/ink/build/get-max-width.js +10 -0
- node_ui/node_modules/ink/build/get-max-width.js.map +1 -0
- node_ui/node_modules/ink/build/hooks/use-app.d.ts +5 -0
- node_ui/node_modules/ink/build/hooks/use-app.js +8 -0
- node_ui/node_modules/ink/build/hooks/use-app.js.map +1 -0
- node_ui/node_modules/ink/build/hooks/use-focus-manager.d.ts +34 -0
- node_ui/node_modules/ink/build/hooks/use-focus-manager.js +18 -0
- node_ui/node_modules/ink/build/hooks/use-focus-manager.js.map +1 -0
- node_ui/node_modules/ink/build/hooks/use-focus.d.ts +34 -0
- node_ui/node_modules/ink/build/hooks/use-focus.js +47 -0
- node_ui/node_modules/ink/build/hooks/use-focus.js.map +1 -0
- node_ui/node_modules/ink/build/hooks/use-input.d.ts +97 -0
- node_ui/node_modules/ink/build/hooks/use-input.js +96 -0
- node_ui/node_modules/ink/build/hooks/use-input.js.map +1 -0
- node_ui/node_modules/ink/build/hooks/use-stderr.d.ts +5 -0
- node_ui/node_modules/ink/build/hooks/use-stderr.js +8 -0
- node_ui/node_modules/ink/build/hooks/use-stderr.js.map +1 -0
- node_ui/node_modules/ink/build/hooks/use-stdin.d.ts +5 -0
- node_ui/node_modules/ink/build/hooks/use-stdin.js +8 -0
- node_ui/node_modules/ink/build/hooks/use-stdin.js.map +1 -0
- node_ui/node_modules/ink/build/hooks/use-stdout.d.ts +5 -0
- node_ui/node_modules/ink/build/hooks/use-stdout.js +8 -0
- node_ui/node_modules/ink/build/hooks/use-stdout.js.map +1 -0
- node_ui/node_modules/ink/build/hooks/useInput.js +38 -0
- node_ui/node_modules/ink/build/index.d.ts +27 -0
- node_ui/node_modules/ink/build/index.js +16 -0
- node_ui/node_modules/ink/build/index.js.map +1 -0
- node_ui/node_modules/ink/build/ink.d.ts +38 -0
- node_ui/node_modules/ink/build/ink.js +235 -0
- node_ui/node_modules/ink/build/ink.js.map +1 -0
- node_ui/node_modules/ink/build/instance.js +205 -0
- node_ui/node_modules/ink/build/instances.d.ts +4 -0
- node_ui/node_modules/ink/build/instances.js +8 -0
- node_ui/node_modules/ink/build/instances.js.map +1 -0
- node_ui/node_modules/ink/build/log-update.d.ts +13 -0
- node_ui/node_modules/ink/build/log-update.js +37 -0
- node_ui/node_modules/ink/build/log-update.js.map +1 -0
- node_ui/node_modules/ink/build/measure-element.d.ts +16 -0
- node_ui/node_modules/ink/build/measure-element.js +9 -0
- node_ui/node_modules/ink/build/measure-element.js.map +1 -0
- node_ui/node_modules/ink/build/measure-text.d.ts +6 -0
- node_ui/node_modules/ink/build/measure-text.js +20 -0
- node_ui/node_modules/ink/build/measure-text.js.map +1 -0
- node_ui/node_modules/ink/build/output.d.ts +35 -0
- node_ui/node_modules/ink/build/output.js +148 -0
- node_ui/node_modules/ink/build/output.js.map +1 -0
- node_ui/node_modules/ink/build/parse-keypress.d.ts +15 -0
- node_ui/node_modules/ink/build/parse-keypress.js +225 -0
- node_ui/node_modules/ink/build/parse-keypress.js.map +1 -0
- node_ui/node_modules/ink/build/reconciler.d.ts +4 -0
- node_ui/node_modules/ink/build/reconciler.js +219 -0
- node_ui/node_modules/ink/build/reconciler.js.map +1 -0
- node_ui/node_modules/ink/build/render-border.d.ts +4 -0
- node_ui/node_modules/ink/build/render-border.js +73 -0
- node_ui/node_modules/ink/build/render-border.js.map +1 -0
- node_ui/node_modules/ink/build/render-node-to-output.d.ts +10 -0
- node_ui/node_modules/ink/build/render-node-to-output.js +99 -0
- node_ui/node_modules/ink/build/render-node-to-output.js.map +1 -0
- node_ui/node_modules/ink/build/render.d.ts +68 -0
- node_ui/node_modules/ink/build/render.js +48 -0
- node_ui/node_modules/ink/build/render.js.map +1 -0
- node_ui/node_modules/ink/build/renderer.d.ts +8 -0
- node_ui/node_modules/ink/build/renderer.js +36 -0
- node_ui/node_modules/ink/build/renderer.js.map +1 -0
- node_ui/node_modules/ink/build/squash-text-nodes.d.ts +3 -0
- node_ui/node_modules/ink/build/squash-text-nodes.js +35 -0
- node_ui/node_modules/ink/build/squash-text-nodes.js.map +1 -0
- node_ui/node_modules/ink/build/styles.d.ts +243 -0
- node_ui/node_modules/ink/build/styles.js +229 -0
- node_ui/node_modules/ink/build/styles.js.map +1 -0
- node_ui/node_modules/ink/build/wrap-text.d.ts +3 -0
- node_ui/node_modules/ink/build/wrap-text.js +31 -0
- node_ui/node_modules/ink/build/wrap-text.js.map +1 -0
- node_ui/node_modules/ink/license +9 -0
- node_ui/node_modules/ink/package.json +197 -0
- node_ui/node_modules/ink/readme.md +2153 -0
- node_ui/node_modules/ink-select-input/build/Indicator.d.ts +6 -0
- node_ui/node_modules/ink-select-input/build/Indicator.js +8 -0
- node_ui/node_modules/ink-select-input/build/Indicator.js.map +1 -0
- node_ui/node_modules/ink-select-input/build/Item.d.ts +7 -0
- node_ui/node_modules/ink-select-input/build/Item.js +7 -0
- node_ui/node_modules/ink-select-input/build/Item.js.map +1 -0
- node_ui/node_modules/ink-select-input/build/SelectInput.d.ts +49 -0
- node_ui/node_modules/ink-select-input/build/SelectInput.js +83 -0
- node_ui/node_modules/ink-select-input/build/SelectInput.js.map +1 -0
- node_ui/node_modules/ink-select-input/build/index.d.ts +3 -0
- node_ui/node_modules/ink-select-input/build/index.js +4 -0
- node_ui/node_modules/ink-select-input/build/index.js.map +1 -0
- node_ui/node_modules/ink-select-input/license +9 -0
- node_ui/node_modules/ink-select-input/node_modules/figures/index.d.ts +279 -0
- node_ui/node_modules/ink-select-input/node_modules/figures/index.js +292 -0
- node_ui/node_modules/ink-select-input/node_modules/figures/license +9 -0
- node_ui/node_modules/ink-select-input/node_modules/figures/package.json +49 -0
- node_ui/node_modules/ink-select-input/node_modules/figures/readme.md +337 -0
- node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/index.d.ts +12 -0
- node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/index.js +21 -0
- node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/license +9 -0
- node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/package.json +47 -0
- node_ui/node_modules/ink-select-input/node_modules/is-unicode-supported/readme.md +35 -0
- node_ui/node_modules/ink-select-input/package.json +83 -0
- node_ui/node_modules/ink-select-input/readme.md +98 -0
- node_ui/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
- node_ui/node_modules/is-fullwidth-code-point/index.js +40 -0
- node_ui/node_modules/is-fullwidth-code-point/license +9 -0
- node_ui/node_modules/is-fullwidth-code-point/package.json +45 -0
- node_ui/node_modules/is-fullwidth-code-point/readme.md +43 -0
- node_ui/node_modules/is-in-ci/cli.js +5 -0
- node_ui/node_modules/is-in-ci/index.d.ts +15 -0
- node_ui/node_modules/is-in-ci/index.js +11 -0
- node_ui/node_modules/is-in-ci/license +9 -0
- node_ui/node_modules/is-in-ci/package.json +48 -0
- node_ui/node_modules/is-in-ci/readme.md +43 -0
- node_ui/node_modules/is-unicode-supported/index.d.ts +12 -0
- node_ui/node_modules/is-unicode-supported/index.js +17 -0
- node_ui/node_modules/is-unicode-supported/license +9 -0
- node_ui/node_modules/is-unicode-supported/package.json +43 -0
- node_ui/node_modules/is-unicode-supported/readme.md +35 -0
- node_ui/node_modules/js-tokens/CHANGELOG.md +151 -0
- node_ui/node_modules/js-tokens/LICENSE +21 -0
- node_ui/node_modules/js-tokens/README.md +240 -0
- node_ui/node_modules/js-tokens/index.js +23 -0
- node_ui/node_modules/js-tokens/package.json +30 -0
- node_ui/node_modules/lodash/LICENSE +47 -0
- node_ui/node_modules/lodash/README.md +39 -0
- node_ui/node_modules/lodash/_DataView.js +7 -0
- node_ui/node_modules/lodash/_Hash.js +32 -0
- node_ui/node_modules/lodash/_LazyWrapper.js +28 -0
- node_ui/node_modules/lodash/_ListCache.js +32 -0
- node_ui/node_modules/lodash/_LodashWrapper.js +22 -0
- node_ui/node_modules/lodash/_Map.js +7 -0
- node_ui/node_modules/lodash/_MapCache.js +32 -0
- node_ui/node_modules/lodash/_Promise.js +7 -0
- node_ui/node_modules/lodash/_Set.js +7 -0
- node_ui/node_modules/lodash/_SetCache.js +27 -0
- node_ui/node_modules/lodash/_Stack.js +27 -0
- node_ui/node_modules/lodash/_Symbol.js +6 -0
- node_ui/node_modules/lodash/_Uint8Array.js +6 -0
- node_ui/node_modules/lodash/_WeakMap.js +7 -0
- node_ui/node_modules/lodash/_apply.js +21 -0
- node_ui/node_modules/lodash/_arrayAggregator.js +22 -0
- node_ui/node_modules/lodash/_arrayEach.js +22 -0
- node_ui/node_modules/lodash/_arrayEachRight.js +21 -0
- node_ui/node_modules/lodash/_arrayEvery.js +23 -0
- node_ui/node_modules/lodash/_arrayFilter.js +25 -0
- node_ui/node_modules/lodash/_arrayIncludes.js +17 -0
- node_ui/node_modules/lodash/_arrayIncludesWith.js +22 -0
- node_ui/node_modules/lodash/_arrayLikeKeys.js +49 -0
- node_ui/node_modules/lodash/_arrayMap.js +21 -0
- node_ui/node_modules/lodash/_arrayPush.js +20 -0
- node_ui/node_modules/lodash/_arrayReduce.js +26 -0
- node_ui/node_modules/lodash/_arrayReduceRight.js +24 -0
- node_ui/node_modules/lodash/_arraySample.js +15 -0
- node_ui/node_modules/lodash/_arraySampleSize.js +17 -0
- node_ui/node_modules/lodash/_arrayShuffle.js +15 -0
- node_ui/node_modules/lodash/_arraySome.js +23 -0
- node_ui/node_modules/lodash/_asciiSize.js +12 -0
- node_ui/node_modules/lodash/_asciiToArray.js +12 -0
- node_ui/node_modules/lodash/_asciiWords.js +15 -0
- node_ui/node_modules/lodash/_assignMergeValue.js +20 -0
- node_ui/node_modules/lodash/_assignValue.js +28 -0
- node_ui/node_modules/lodash/_assocIndexOf.js +21 -0
- node_ui/node_modules/lodash/_baseAggregator.js +21 -0
- node_ui/node_modules/lodash/_baseAssign.js +17 -0
- node_ui/node_modules/lodash/_baseAssignIn.js +17 -0
- node_ui/node_modules/lodash/_baseAssignValue.js +25 -0
- node_ui/node_modules/lodash/_baseAt.js +23 -0
- node_ui/node_modules/lodash/_baseClamp.js +22 -0
- node_ui/node_modules/lodash/_baseClone.js +166 -0
- node_ui/node_modules/lodash/_baseConforms.js +18 -0
- node_ui/node_modules/lodash/_baseConformsTo.js +27 -0
- node_ui/node_modules/lodash/_baseCreate.js +30 -0
- node_ui/node_modules/lodash/_baseDelay.js +21 -0
- node_ui/node_modules/lodash/_baseDifference.js +67 -0
- node_ui/node_modules/lodash/_baseEach.js +14 -0
- node_ui/node_modules/lodash/_baseEachRight.js +14 -0
- node_ui/node_modules/lodash/_baseEvery.js +21 -0
- node_ui/node_modules/lodash/_baseExtremum.js +32 -0
- node_ui/node_modules/lodash/_baseFill.js +32 -0
- node_ui/node_modules/lodash/_baseFilter.js +21 -0
- node_ui/node_modules/lodash/_baseFindIndex.js +24 -0
- node_ui/node_modules/lodash/_baseFindKey.js +23 -0
- node_ui/node_modules/lodash/_baseFlatten.js +38 -0
- node_ui/node_modules/lodash/_baseFor.js +16 -0
- node_ui/node_modules/lodash/_baseForOwn.js +16 -0
- node_ui/node_modules/lodash/_baseForOwnRight.js +16 -0
- node_ui/node_modules/lodash/_baseForRight.js +15 -0
- node_ui/node_modules/lodash/_baseFunctions.js +19 -0
- node_ui/node_modules/lodash/_baseGet.js +24 -0
- node_ui/node_modules/lodash/_baseGetAllKeys.js +20 -0
- node_ui/node_modules/lodash/_baseGetTag.js +28 -0
- node_ui/node_modules/lodash/_baseGt.js +14 -0
- node_ui/node_modules/lodash/_baseHas.js +19 -0
- node_ui/node_modules/lodash/_baseHasIn.js +13 -0
- node_ui/node_modules/lodash/_baseInRange.js +18 -0
- node_ui/node_modules/lodash/_baseIndexOf.js +20 -0
- node_ui/node_modules/lodash/_baseIndexOfWith.js +23 -0
- node_ui/node_modules/lodash/_baseIntersection.js +74 -0
- node_ui/node_modules/lodash/_baseInverter.js +21 -0
- node_ui/node_modules/lodash/_baseInvoke.js +24 -0
- node_ui/node_modules/lodash/_baseIsArguments.js +18 -0
- node_ui/node_modules/lodash/_baseIsArrayBuffer.js +17 -0
- node_ui/node_modules/lodash/_baseIsDate.js +18 -0
- node_ui/node_modules/lodash/_baseIsEqual.js +28 -0
- node_ui/node_modules/lodash/_baseIsEqualDeep.js +83 -0
- node_ui/node_modules/lodash/_baseIsMap.js +18 -0
- node_ui/node_modules/lodash/_baseIsMatch.js +62 -0
- node_ui/node_modules/lodash/_baseIsNaN.js +12 -0
- node_ui/node_modules/lodash/_baseIsNative.js +47 -0
- node_ui/node_modules/lodash/_baseIsRegExp.js +18 -0
- node_ui/node_modules/lodash/_baseIsSet.js +18 -0
- node_ui/node_modules/lodash/_baseIsTypedArray.js +60 -0
- node_ui/node_modules/lodash/_baseIteratee.js +31 -0
- node_ui/node_modules/lodash/_baseKeys.js +30 -0
- node_ui/node_modules/lodash/_baseKeysIn.js +33 -0
- node_ui/node_modules/lodash/_baseLodash.js +10 -0
- node_ui/node_modules/lodash/_baseLt.js +14 -0
- node_ui/node_modules/lodash/_baseMap.js +22 -0
- node_ui/node_modules/lodash/_baseMatches.js +22 -0
- node_ui/node_modules/lodash/_baseMatchesProperty.js +33 -0
- node_ui/node_modules/lodash/_baseMean.js +20 -0
- node_ui/node_modules/lodash/_baseMerge.js +42 -0
- node_ui/node_modules/lodash/_baseMergeDeep.js +94 -0
- node_ui/node_modules/lodash/_baseNth.js +20 -0
- node_ui/node_modules/lodash/_baseOrderBy.js +49 -0
- node_ui/node_modules/lodash/_basePick.js +19 -0
- node_ui/node_modules/lodash/_basePickBy.js +30 -0
- node_ui/node_modules/lodash/_baseProperty.js +14 -0
- node_ui/node_modules/lodash/_basePropertyDeep.js +16 -0
- node_ui/node_modules/lodash/_basePropertyOf.js +14 -0
- node_ui/node_modules/lodash/_basePullAll.js +51 -0
- node_ui/node_modules/lodash/_basePullAt.js +37 -0
- node_ui/node_modules/lodash/_baseRandom.js +18 -0
- node_ui/node_modules/lodash/_baseRange.js +28 -0
- node_ui/node_modules/lodash/_baseReduce.js +23 -0
- node_ui/node_modules/lodash/_baseRepeat.js +35 -0
- node_ui/node_modules/lodash/_baseRest.js +17 -0
- node_ui/node_modules/lodash/_baseSample.js +15 -0
- node_ui/node_modules/lodash/_baseSampleSize.js +18 -0
- node_ui/node_modules/lodash/_baseSet.js +51 -0
- node_ui/node_modules/lodash/_baseSetData.js +17 -0
- node_ui/node_modules/lodash/_baseSetToString.js +22 -0
- node_ui/node_modules/lodash/_baseShuffle.js +15 -0
- node_ui/node_modules/lodash/_baseSlice.js +31 -0
- node_ui/node_modules/lodash/_baseSome.js +22 -0
- node_ui/node_modules/lodash/_baseSortBy.js +21 -0
- node_ui/node_modules/lodash/_baseSortedIndex.js +42 -0
- node_ui/node_modules/lodash/_baseSortedIndexBy.js +67 -0
- node_ui/node_modules/lodash/_baseSortedUniq.js +30 -0
- node_ui/node_modules/lodash/_baseSum.js +24 -0
- node_ui/node_modules/lodash/_baseTimes.js +20 -0
- node_ui/node_modules/lodash/_baseToNumber.js +24 -0
- node_ui/node_modules/lodash/_baseToPairs.js +18 -0
- node_ui/node_modules/lodash/_baseToString.js +37 -0
- node_ui/node_modules/lodash/_baseTrim.js +19 -0
- node_ui/node_modules/lodash/_baseUnary.js +14 -0
- node_ui/node_modules/lodash/_baseUniq.js +72 -0
- node_ui/node_modules/lodash/_baseUnset.js +20 -0
- node_ui/node_modules/lodash/_baseUpdate.js +18 -0
- node_ui/node_modules/lodash/_baseValues.js +19 -0
- node_ui/node_modules/lodash/_baseWhile.js +26 -0
- node_ui/node_modules/lodash/_baseWrapperValue.js +25 -0
- node_ui/node_modules/lodash/_baseXor.js +36 -0
- node_ui/node_modules/lodash/_baseZipObject.js +23 -0
- node_ui/node_modules/lodash/_cacheHas.js +13 -0
- node_ui/node_modules/lodash/_castArrayLikeObject.js +14 -0
- node_ui/node_modules/lodash/_castFunction.js +14 -0
- node_ui/node_modules/lodash/_castPath.js +21 -0
- node_ui/node_modules/lodash/_castRest.js +14 -0
- node_ui/node_modules/lodash/_castSlice.js +18 -0
- node_ui/node_modules/lodash/_charsEndIndex.js +19 -0
- node_ui/node_modules/lodash/_charsStartIndex.js +20 -0
- node_ui/node_modules/lodash/_cloneArrayBuffer.js +16 -0
- node_ui/node_modules/lodash/_cloneBuffer.js +35 -0
- node_ui/node_modules/lodash/_cloneDataView.js +16 -0
- node_ui/node_modules/lodash/_cloneRegExp.js +17 -0
- node_ui/node_modules/lodash/_cloneSymbol.js +18 -0
- node_ui/node_modules/lodash/_cloneTypedArray.js +16 -0
- node_ui/node_modules/lodash/_compareAscending.js +41 -0
- node_ui/node_modules/lodash/_compareMultiple.js +44 -0
- node_ui/node_modules/lodash/_composeArgs.js +39 -0
- node_ui/node_modules/lodash/_composeArgsRight.js +41 -0
- node_ui/node_modules/lodash/_copyArray.js +20 -0
- node_ui/node_modules/lodash/_copyObject.js +40 -0
- node_ui/node_modules/lodash/_copySymbols.js +16 -0
- node_ui/node_modules/lodash/_copySymbolsIn.js +16 -0
- node_ui/node_modules/lodash/_coreJsData.js +6 -0
- node_ui/node_modules/lodash/_countHolders.js +21 -0
- node_ui/node_modules/lodash/_createAggregator.js +23 -0
- node_ui/node_modules/lodash/_createAssigner.js +37 -0
- node_ui/node_modules/lodash/_createBaseEach.js +32 -0
- node_ui/node_modules/lodash/_createBaseFor.js +25 -0
- node_ui/node_modules/lodash/_createBind.js +28 -0
- node_ui/node_modules/lodash/_createCaseFirst.js +33 -0
- node_ui/node_modules/lodash/_createCompounder.js +24 -0
- node_ui/node_modules/lodash/_createCtor.js +37 -0
- node_ui/node_modules/lodash/_createCurry.js +46 -0
- node_ui/node_modules/lodash/_createFind.js +25 -0
- node_ui/node_modules/lodash/_createFlow.js +78 -0
- node_ui/node_modules/lodash/_createHybrid.js +92 -0
- node_ui/node_modules/lodash/_createInverter.js +17 -0
- node_ui/node_modules/lodash/_createMathOperation.js +38 -0
- node_ui/node_modules/lodash/_createOver.js +27 -0
- node_ui/node_modules/lodash/_createPadding.js +33 -0
- node_ui/node_modules/lodash/_createPartial.js +43 -0
- node_ui/node_modules/lodash/_createRange.js +30 -0
- node_ui/node_modules/lodash/_createRecurry.js +56 -0
- node_ui/node_modules/lodash/_createRelationalOperation.js +20 -0
- node_ui/node_modules/lodash/_createRound.js +35 -0
- node_ui/node_modules/lodash/_createSet.js +19 -0
- node_ui/node_modules/lodash/_createToPairs.js +30 -0
- node_ui/node_modules/lodash/_createWrap.js +106 -0
- node_ui/node_modules/lodash/_customDefaultsAssignIn.js +29 -0
- node_ui/node_modules/lodash/_customDefaultsMerge.js +28 -0
- node_ui/node_modules/lodash/_customOmitClone.js +16 -0
- node_ui/node_modules/lodash/_deburrLetter.js +71 -0
- node_ui/node_modules/lodash/_defineProperty.js +11 -0
- node_ui/node_modules/lodash/_equalArrays.js +84 -0
- node_ui/node_modules/lodash/_equalByTag.js +112 -0
- node_ui/node_modules/lodash/_equalObjects.js +90 -0
- node_ui/node_modules/lodash/_escapeHtmlChar.js +21 -0
- node_ui/node_modules/lodash/_escapeStringChar.js +22 -0
- node_ui/node_modules/lodash/_flatRest.js +16 -0
- node_ui/node_modules/lodash/_freeGlobal.js +4 -0
- node_ui/node_modules/lodash/_getAllKeys.js +16 -0
- node_ui/node_modules/lodash/_getAllKeysIn.js +17 -0
- node_ui/node_modules/lodash/_getData.js +15 -0
- node_ui/node_modules/lodash/_getFuncName.js +31 -0
- node_ui/node_modules/lodash/_getHolder.js +13 -0
- node_ui/node_modules/lodash/_getMapData.js +18 -0
- node_ui/node_modules/lodash/_getMatchData.js +24 -0
- node_ui/node_modules/lodash/_getNative.js +17 -0
- node_ui/node_modules/lodash/_getPrototype.js +6 -0
- node_ui/node_modules/lodash/_getRawTag.js +46 -0
- node_ui/node_modules/lodash/_getSymbols.js +30 -0
- node_ui/node_modules/lodash/_getSymbolsIn.js +25 -0
- node_ui/node_modules/lodash/_getTag.js +58 -0
- node_ui/node_modules/lodash/_getValue.js +13 -0
- node_ui/node_modules/lodash/_getView.js +33 -0
- node_ui/node_modules/lodash/_getWrapDetails.js +17 -0
- node_ui/node_modules/lodash/_hasPath.js +39 -0
- node_ui/node_modules/lodash/_hasUnicode.js +26 -0
- node_ui/node_modules/lodash/_hasUnicodeWord.js +15 -0
- node_ui/node_modules/lodash/_hashClear.js +15 -0
- node_ui/node_modules/lodash/_hashDelete.js +17 -0
- node_ui/node_modules/lodash/_hashGet.js +30 -0
- node_ui/node_modules/lodash/_hashHas.js +23 -0
- node_ui/node_modules/lodash/_hashSet.js +23 -0
- node_ui/node_modules/lodash/_initCloneArray.js +26 -0
- node_ui/node_modules/lodash/_initCloneByTag.js +77 -0
- node_ui/node_modules/lodash/_initCloneObject.js +18 -0
- node_ui/node_modules/lodash/_insertWrapDetails.js +23 -0
- node_ui/node_modules/lodash/_isFlattenable.js +20 -0
- node_ui/node_modules/lodash/_isIndex.js +25 -0
- node_ui/node_modules/lodash/_isIterateeCall.js +30 -0
- node_ui/node_modules/lodash/_isKey.js +29 -0
- node_ui/node_modules/lodash/_isKeyable.js +15 -0
- node_ui/node_modules/lodash/_isLaziable.js +28 -0
- node_ui/node_modules/lodash/_isMaskable.js +14 -0
- node_ui/node_modules/lodash/_isMasked.js +20 -0
- node_ui/node_modules/lodash/_isPrototype.js +18 -0
- node_ui/node_modules/lodash/_isStrictComparable.js +15 -0
- node_ui/node_modules/lodash/_iteratorToArray.js +18 -0
- node_ui/node_modules/lodash/_lazyClone.js +23 -0
- node_ui/node_modules/lodash/_lazyReverse.js +23 -0
- node_ui/node_modules/lodash/_lazyValue.js +69 -0
- node_ui/node_modules/lodash/_listCacheClear.js +13 -0
- node_ui/node_modules/lodash/_listCacheDelete.js +35 -0
- node_ui/node_modules/lodash/_listCacheGet.js +19 -0
- node_ui/node_modules/lodash/_listCacheHas.js +16 -0
- node_ui/node_modules/lodash/_listCacheSet.js +26 -0
- node_ui/node_modules/lodash/_mapCacheClear.js +21 -0
- node_ui/node_modules/lodash/_mapCacheDelete.js +18 -0
- node_ui/node_modules/lodash/_mapCacheGet.js +16 -0
- node_ui/node_modules/lodash/_mapCacheHas.js +16 -0
- node_ui/node_modules/lodash/_mapCacheSet.js +22 -0
- node_ui/node_modules/lodash/_mapToArray.js +18 -0
- node_ui/node_modules/lodash/_matchesStrictComparable.js +20 -0
- node_ui/node_modules/lodash/_memoizeCapped.js +26 -0
- node_ui/node_modules/lodash/_mergeData.js +90 -0
- node_ui/node_modules/lodash/_metaMap.js +6 -0
- node_ui/node_modules/lodash/_nativeCreate.js +6 -0
- node_ui/node_modules/lodash/_nativeKeys.js +6 -0
- node_ui/node_modules/lodash/_nativeKeysIn.js +20 -0
- node_ui/node_modules/lodash/_nodeUtil.js +30 -0
- node_ui/node_modules/lodash/_objectToString.js +22 -0
- node_ui/node_modules/lodash/_overArg.js +15 -0
- node_ui/node_modules/lodash/_overRest.js +36 -0
- node_ui/node_modules/lodash/_parent.js +16 -0
- node_ui/node_modules/lodash/_reEscape.js +4 -0
- node_ui/node_modules/lodash/_reEvaluate.js +4 -0
- node_ui/node_modules/lodash/_reInterpolate.js +4 -0
- node_ui/node_modules/lodash/_realNames.js +4 -0
- node_ui/node_modules/lodash/_reorder.js +29 -0
- node_ui/node_modules/lodash/_replaceHolders.js +29 -0
- node_ui/node_modules/lodash/_root.js +9 -0
- node_ui/node_modules/lodash/_safeGet.js +21 -0
- node_ui/node_modules/lodash/_setCacheAdd.js +19 -0
- node_ui/node_modules/lodash/_setCacheHas.js +14 -0
- node_ui/node_modules/lodash/_setData.js +20 -0
- node_ui/node_modules/lodash/_setToArray.js +18 -0
- node_ui/node_modules/lodash/_setToPairs.js +18 -0
- node_ui/node_modules/lodash/_setToString.js +14 -0
- node_ui/node_modules/lodash/_setWrapToString.js +21 -0
- node_ui/node_modules/lodash/_shortOut.js +37 -0
- node_ui/node_modules/lodash/_shuffleSelf.js +28 -0
- node_ui/node_modules/lodash/_stackClear.js +15 -0
- node_ui/node_modules/lodash/_stackDelete.js +18 -0
- node_ui/node_modules/lodash/_stackGet.js +14 -0
- node_ui/node_modules/lodash/_stackHas.js +14 -0
- node_ui/node_modules/lodash/_stackSet.js +34 -0
- node_ui/node_modules/lodash/_strictIndexOf.js +23 -0
- node_ui/node_modules/lodash/_strictLastIndexOf.js +21 -0
- node_ui/node_modules/lodash/_stringSize.js +18 -0
- node_ui/node_modules/lodash/_stringToArray.js +18 -0
- node_ui/node_modules/lodash/_stringToPath.js +27 -0
- node_ui/node_modules/lodash/_toKey.js +21 -0
- node_ui/node_modules/lodash/_toSource.js +26 -0
- node_ui/node_modules/lodash/_trimmedEndIndex.js +19 -0
- node_ui/node_modules/lodash/_unescapeHtmlChar.js +21 -0
- node_ui/node_modules/lodash/_unicodeSize.js +44 -0
- node_ui/node_modules/lodash/_unicodeToArray.js +40 -0
- node_ui/node_modules/lodash/_unicodeWords.js +69 -0
- node_ui/node_modules/lodash/_updateWrapDetails.js +46 -0
- node_ui/node_modules/lodash/_wrapperClone.js +23 -0
- node_ui/node_modules/lodash/add.js +22 -0
- node_ui/node_modules/lodash/after.js +42 -0
- node_ui/node_modules/lodash/array.js +67 -0
- node_ui/node_modules/lodash/ary.js +29 -0
- node_ui/node_modules/lodash/assign.js +58 -0
- node_ui/node_modules/lodash/assignIn.js +40 -0
- node_ui/node_modules/lodash/assignInWith.js +38 -0
- node_ui/node_modules/lodash/assignWith.js +37 -0
- node_ui/node_modules/lodash/at.js +23 -0
- node_ui/node_modules/lodash/attempt.js +35 -0
- node_ui/node_modules/lodash/before.js +40 -0
- node_ui/node_modules/lodash/bind.js +57 -0
- node_ui/node_modules/lodash/bindAll.js +41 -0
- node_ui/node_modules/lodash/bindKey.js +68 -0
- node_ui/node_modules/lodash/camelCase.js +29 -0
- node_ui/node_modules/lodash/capitalize.js +23 -0
- node_ui/node_modules/lodash/castArray.js +44 -0
- node_ui/node_modules/lodash/ceil.js +26 -0
- node_ui/node_modules/lodash/chain.js +38 -0
- node_ui/node_modules/lodash/chunk.js +50 -0
- node_ui/node_modules/lodash/clamp.js +39 -0
- node_ui/node_modules/lodash/clone.js +36 -0
- node_ui/node_modules/lodash/cloneDeep.js +29 -0
- node_ui/node_modules/lodash/cloneDeepWith.js +40 -0
- node_ui/node_modules/lodash/cloneWith.js +42 -0
- node_ui/node_modules/lodash/collection.js +30 -0
- node_ui/node_modules/lodash/commit.js +33 -0
- node_ui/node_modules/lodash/compact.js +31 -0
- node_ui/node_modules/lodash/concat.js +43 -0
- node_ui/node_modules/lodash/cond.js +60 -0
- node_ui/node_modules/lodash/conforms.js +35 -0
- node_ui/node_modules/lodash/conformsTo.js +32 -0
- node_ui/node_modules/lodash/constant.js +26 -0
- node_ui/node_modules/lodash/core.js +3877 -0
- node_ui/node_modules/lodash/core.min.js +29 -0
- node_ui/node_modules/lodash/countBy.js +40 -0
- node_ui/node_modules/lodash/create.js +43 -0
- node_ui/node_modules/lodash/curry.js +57 -0
- node_ui/node_modules/lodash/curryRight.js +54 -0
- node_ui/node_modules/lodash/date.js +3 -0
- node_ui/node_modules/lodash/debounce.js +191 -0
- node_ui/node_modules/lodash/deburr.js +45 -0
- node_ui/node_modules/lodash/defaultTo.js +25 -0
- node_ui/node_modules/lodash/defaults.js +64 -0
- node_ui/node_modules/lodash/defaultsDeep.js +30 -0
- node_ui/node_modules/lodash/defer.js +26 -0
- node_ui/node_modules/lodash/delay.js +28 -0
- node_ui/node_modules/lodash/difference.js +33 -0
- node_ui/node_modules/lodash/differenceBy.js +44 -0
- node_ui/node_modules/lodash/differenceWith.js +40 -0
- node_ui/node_modules/lodash/divide.js +22 -0
- node_ui/node_modules/lodash/drop.js +38 -0
- node_ui/node_modules/lodash/dropRight.js +39 -0
- node_ui/node_modules/lodash/dropRightWhile.js +45 -0
- node_ui/node_modules/lodash/dropWhile.js +45 -0
- node_ui/node_modules/lodash/each.js +1 -0
- node_ui/node_modules/lodash/eachRight.js +1 -0
- node_ui/node_modules/lodash/endsWith.js +43 -0
- node_ui/node_modules/lodash/entries.js +1 -0
- node_ui/node_modules/lodash/entriesIn.js +1 -0
- node_ui/node_modules/lodash/eq.js +37 -0
- node_ui/node_modules/lodash/escape.js +43 -0
- node_ui/node_modules/lodash/escapeRegExp.js +32 -0
- node_ui/node_modules/lodash/every.js +56 -0
- node_ui/node_modules/lodash/extend.js +1 -0
- node_ui/node_modules/lodash/extendWith.js +1 -0
- node_ui/node_modules/lodash/fill.js +45 -0
- node_ui/node_modules/lodash/filter.js +52 -0
- node_ui/node_modules/lodash/find.js +42 -0
- node_ui/node_modules/lodash/findIndex.js +55 -0
- node_ui/node_modules/lodash/findKey.js +44 -0
- node_ui/node_modules/lodash/findLast.js +25 -0
- node_ui/node_modules/lodash/findLastIndex.js +59 -0
- node_ui/node_modules/lodash/findLastKey.js +44 -0
- node_ui/node_modules/lodash/first.js +1 -0
- node_ui/node_modules/lodash/flake.lock +40 -0
- node_ui/node_modules/lodash/flake.nix +20 -0
- node_ui/node_modules/lodash/flatMap.js +29 -0
- node_ui/node_modules/lodash/flatMapDeep.js +31 -0
- node_ui/node_modules/lodash/flatMapDepth.js +31 -0
- node_ui/node_modules/lodash/flatten.js +22 -0
- node_ui/node_modules/lodash/flattenDeep.js +25 -0
- node_ui/node_modules/lodash/flattenDepth.js +33 -0
- node_ui/node_modules/lodash/flip.js +28 -0
- node_ui/node_modules/lodash/floor.js +26 -0
- node_ui/node_modules/lodash/flow.js +27 -0
- node_ui/node_modules/lodash/flowRight.js +26 -0
- node_ui/node_modules/lodash/forEach.js +41 -0
- node_ui/node_modules/lodash/forEachRight.js +31 -0
- node_ui/node_modules/lodash/forIn.js +39 -0
- node_ui/node_modules/lodash/forInRight.js +37 -0
- node_ui/node_modules/lodash/forOwn.js +36 -0
- node_ui/node_modules/lodash/forOwnRight.js +34 -0
- node_ui/node_modules/lodash/fp/F.js +1 -0
- node_ui/node_modules/lodash/fp/T.js +1 -0
- node_ui/node_modules/lodash/fp/__.js +1 -0
- node_ui/node_modules/lodash/fp/_baseConvert.js +569 -0
- node_ui/node_modules/lodash/fp/_convertBrowser.js +18 -0
- node_ui/node_modules/lodash/fp/_falseOptions.js +7 -0
- node_ui/node_modules/lodash/fp/_mapping.js +358 -0
- node_ui/node_modules/lodash/fp/_util.js +16 -0
- node_ui/node_modules/lodash/fp/add.js +5 -0
- node_ui/node_modules/lodash/fp/after.js +5 -0
- node_ui/node_modules/lodash/fp/all.js +1 -0
- node_ui/node_modules/lodash/fp/allPass.js +1 -0
- node_ui/node_modules/lodash/fp/always.js +1 -0
- node_ui/node_modules/lodash/fp/any.js +1 -0
- node_ui/node_modules/lodash/fp/anyPass.js +1 -0
- node_ui/node_modules/lodash/fp/apply.js +1 -0
- node_ui/node_modules/lodash/fp/array.js +2 -0
- node_ui/node_modules/lodash/fp/ary.js +5 -0
- node_ui/node_modules/lodash/fp/assign.js +5 -0
- node_ui/node_modules/lodash/fp/assignAll.js +5 -0
- node_ui/node_modules/lodash/fp/assignAllWith.js +5 -0
- node_ui/node_modules/lodash/fp/assignIn.js +5 -0
- node_ui/node_modules/lodash/fp/assignInAll.js +5 -0
- node_ui/node_modules/lodash/fp/assignInAllWith.js +5 -0
- node_ui/node_modules/lodash/fp/assignInWith.js +5 -0
- node_ui/node_modules/lodash/fp/assignWith.js +5 -0
- node_ui/node_modules/lodash/fp/assoc.js +1 -0
- node_ui/node_modules/lodash/fp/assocPath.js +1 -0
- node_ui/node_modules/lodash/fp/at.js +5 -0
- node_ui/node_modules/lodash/fp/attempt.js +5 -0
- node_ui/node_modules/lodash/fp/before.js +5 -0
- node_ui/node_modules/lodash/fp/bind.js +5 -0
- node_ui/node_modules/lodash/fp/bindAll.js +5 -0
- node_ui/node_modules/lodash/fp/bindKey.js +5 -0
- node_ui/node_modules/lodash/fp/camelCase.js +5 -0
- node_ui/node_modules/lodash/fp/capitalize.js +5 -0
- node_ui/node_modules/lodash/fp/castArray.js +5 -0
- node_ui/node_modules/lodash/fp/ceil.js +5 -0
- node_ui/node_modules/lodash/fp/chain.js +5 -0
- node_ui/node_modules/lodash/fp/chunk.js +5 -0
- node_ui/node_modules/lodash/fp/clamp.js +5 -0
- node_ui/node_modules/lodash/fp/clone.js +5 -0
- node_ui/node_modules/lodash/fp/cloneDeep.js +5 -0
- node_ui/node_modules/lodash/fp/cloneDeepWith.js +5 -0
- node_ui/node_modules/lodash/fp/cloneWith.js +5 -0
- node_ui/node_modules/lodash/fp/collection.js +2 -0
- node_ui/node_modules/lodash/fp/commit.js +5 -0
- node_ui/node_modules/lodash/fp/compact.js +5 -0
- node_ui/node_modules/lodash/fp/complement.js +1 -0
- node_ui/node_modules/lodash/fp/compose.js +1 -0
- node_ui/node_modules/lodash/fp/concat.js +5 -0
- node_ui/node_modules/lodash/fp/cond.js +5 -0
- node_ui/node_modules/lodash/fp/conforms.js +1 -0
- node_ui/node_modules/lodash/fp/conformsTo.js +5 -0
- node_ui/node_modules/lodash/fp/constant.js +5 -0
- node_ui/node_modules/lodash/fp/contains.js +1 -0
- node_ui/node_modules/lodash/fp/convert.js +18 -0
- node_ui/node_modules/lodash/fp/countBy.js +5 -0
- node_ui/node_modules/lodash/fp/create.js +5 -0
- node_ui/node_modules/lodash/fp/curry.js +5 -0
- node_ui/node_modules/lodash/fp/curryN.js +5 -0
- node_ui/node_modules/lodash/fp/curryRight.js +5 -0
- node_ui/node_modules/lodash/fp/curryRightN.js +5 -0
- node_ui/node_modules/lodash/fp/date.js +2 -0
- node_ui/node_modules/lodash/fp/debounce.js +5 -0
- node_ui/node_modules/lodash/fp/deburr.js +5 -0
- node_ui/node_modules/lodash/fp/defaultTo.js +5 -0
- node_ui/node_modules/lodash/fp/defaults.js +5 -0
- node_ui/node_modules/lodash/fp/defaultsAll.js +5 -0
- node_ui/node_modules/lodash/fp/defaultsDeep.js +5 -0
- node_ui/node_modules/lodash/fp/defaultsDeepAll.js +5 -0
- node_ui/node_modules/lodash/fp/defer.js +5 -0
- node_ui/node_modules/lodash/fp/delay.js +5 -0
- node_ui/node_modules/lodash/fp/difference.js +5 -0
- node_ui/node_modules/lodash/fp/differenceBy.js +5 -0
- node_ui/node_modules/lodash/fp/differenceWith.js +5 -0
- node_ui/node_modules/lodash/fp/dissoc.js +1 -0
- node_ui/node_modules/lodash/fp/dissocPath.js +1 -0
- node_ui/node_modules/lodash/fp/divide.js +5 -0
- node_ui/node_modules/lodash/fp/drop.js +5 -0
- node_ui/node_modules/lodash/fp/dropLast.js +1 -0
- node_ui/node_modules/lodash/fp/dropLastWhile.js +1 -0
- node_ui/node_modules/lodash/fp/dropRight.js +5 -0
- node_ui/node_modules/lodash/fp/dropRightWhile.js +5 -0
- node_ui/node_modules/lodash/fp/dropWhile.js +5 -0
- node_ui/node_modules/lodash/fp/each.js +1 -0
- node_ui/node_modules/lodash/fp/eachRight.js +1 -0
- node_ui/node_modules/lodash/fp/endsWith.js +5 -0
- node_ui/node_modules/lodash/fp/entries.js +1 -0
- node_ui/node_modules/lodash/fp/entriesIn.js +1 -0
- node_ui/node_modules/lodash/fp/eq.js +5 -0
- node_ui/node_modules/lodash/fp/equals.js +1 -0
- node_ui/node_modules/lodash/fp/escape.js +5 -0
- node_ui/node_modules/lodash/fp/escapeRegExp.js +5 -0
- node_ui/node_modules/lodash/fp/every.js +5 -0
- node_ui/node_modules/lodash/fp/extend.js +1 -0
- node_ui/node_modules/lodash/fp/extendAll.js +1 -0
- node_ui/node_modules/lodash/fp/extendAllWith.js +1 -0
- node_ui/node_modules/lodash/fp/extendWith.js +1 -0
- node_ui/node_modules/lodash/fp/fill.js +5 -0
- node_ui/node_modules/lodash/fp/filter.js +5 -0
- node_ui/node_modules/lodash/fp/find.js +5 -0
- node_ui/node_modules/lodash/fp/findFrom.js +5 -0
- node_ui/node_modules/lodash/fp/findIndex.js +5 -0
- node_ui/node_modules/lodash/fp/findIndexFrom.js +5 -0
- node_ui/node_modules/lodash/fp/findKey.js +5 -0
- node_ui/node_modules/lodash/fp/findLast.js +5 -0
- node_ui/node_modules/lodash/fp/findLastFrom.js +5 -0
- node_ui/node_modules/lodash/fp/findLastIndex.js +5 -0
- node_ui/node_modules/lodash/fp/findLastIndexFrom.js +5 -0
- node_ui/node_modules/lodash/fp/findLastKey.js +5 -0
- node_ui/node_modules/lodash/fp/first.js +1 -0
- node_ui/node_modules/lodash/fp/flatMap.js +5 -0
- node_ui/node_modules/lodash/fp/flatMapDeep.js +5 -0
- node_ui/node_modules/lodash/fp/flatMapDepth.js +5 -0
- node_ui/node_modules/lodash/fp/flatten.js +5 -0
- node_ui/node_modules/lodash/fp/flattenDeep.js +5 -0
- node_ui/node_modules/lodash/fp/flattenDepth.js +5 -0
- node_ui/node_modules/lodash/fp/flip.js +5 -0
- node_ui/node_modules/lodash/fp/floor.js +5 -0
- node_ui/node_modules/lodash/fp/flow.js +5 -0
- node_ui/node_modules/lodash/fp/flowRight.js +5 -0
- node_ui/node_modules/lodash/fp/forEach.js +5 -0
- node_ui/node_modules/lodash/fp/forEachRight.js +5 -0
- node_ui/node_modules/lodash/fp/forIn.js +5 -0
- node_ui/node_modules/lodash/fp/forInRight.js +5 -0
- node_ui/node_modules/lodash/fp/forOwn.js +5 -0
- node_ui/node_modules/lodash/fp/forOwnRight.js +5 -0
- node_ui/node_modules/lodash/fp/fromPairs.js +5 -0
- node_ui/node_modules/lodash/fp/function.js +2 -0
- node_ui/node_modules/lodash/fp/functions.js +5 -0
- node_ui/node_modules/lodash/fp/functionsIn.js +5 -0
- node_ui/node_modules/lodash/fp/get.js +5 -0
- node_ui/node_modules/lodash/fp/getOr.js +5 -0
- node_ui/node_modules/lodash/fp/groupBy.js +5 -0
- node_ui/node_modules/lodash/fp/gt.js +5 -0
- node_ui/node_modules/lodash/fp/gte.js +5 -0
- node_ui/node_modules/lodash/fp/has.js +5 -0
- node_ui/node_modules/lodash/fp/hasIn.js +5 -0
- node_ui/node_modules/lodash/fp/head.js +5 -0
- node_ui/node_modules/lodash/fp/identical.js +1 -0
- node_ui/node_modules/lodash/fp/identity.js +5 -0
- node_ui/node_modules/lodash/fp/inRange.js +5 -0
- node_ui/node_modules/lodash/fp/includes.js +5 -0
- node_ui/node_modules/lodash/fp/includesFrom.js +5 -0
- node_ui/node_modules/lodash/fp/indexBy.js +1 -0
- node_ui/node_modules/lodash/fp/indexOf.js +5 -0
- node_ui/node_modules/lodash/fp/indexOfFrom.js +5 -0
- node_ui/node_modules/lodash/fp/init.js +1 -0
- node_ui/node_modules/lodash/fp/initial.js +5 -0
- node_ui/node_modules/lodash/fp/intersection.js +5 -0
- node_ui/node_modules/lodash/fp/intersectionBy.js +5 -0
- node_ui/node_modules/lodash/fp/intersectionWith.js +5 -0
- node_ui/node_modules/lodash/fp/invert.js +5 -0
- node_ui/node_modules/lodash/fp/invertBy.js +5 -0
- node_ui/node_modules/lodash/fp/invertObj.js +1 -0
- node_ui/node_modules/lodash/fp/invoke.js +5 -0
- node_ui/node_modules/lodash/fp/invokeArgs.js +5 -0
- node_ui/node_modules/lodash/fp/invokeArgsMap.js +5 -0
- node_ui/node_modules/lodash/fp/invokeMap.js +5 -0
- node_ui/node_modules/lodash/fp/isArguments.js +5 -0
- node_ui/node_modules/lodash/fp/isArray.js +5 -0
- node_ui/node_modules/lodash/fp/isArrayBuffer.js +5 -0
- node_ui/node_modules/lodash/fp/isArrayLike.js +5 -0
- node_ui/node_modules/lodash/fp/isArrayLikeObject.js +5 -0
- node_ui/node_modules/lodash/fp/isBoolean.js +5 -0
- node_ui/node_modules/lodash/fp/isBuffer.js +5 -0
- node_ui/node_modules/lodash/fp/isDate.js +5 -0
- node_ui/node_modules/lodash/fp/isElement.js +5 -0
- node_ui/node_modules/lodash/fp/isEmpty.js +5 -0
- node_ui/node_modules/lodash/fp/isEqual.js +5 -0
- node_ui/node_modules/lodash/fp/isEqualWith.js +5 -0
- node_ui/node_modules/lodash/fp/isError.js +5 -0
- node_ui/node_modules/lodash/fp/isFinite.js +5 -0
- node_ui/node_modules/lodash/fp/isFunction.js +5 -0
- node_ui/node_modules/lodash/fp/isInteger.js +5 -0
- node_ui/node_modules/lodash/fp/isLength.js +5 -0
- node_ui/node_modules/lodash/fp/isMap.js +5 -0
- node_ui/node_modules/lodash/fp/isMatch.js +5 -0
- node_ui/node_modules/lodash/fp/isMatchWith.js +5 -0
- node_ui/node_modules/lodash/fp/isNaN.js +5 -0
- node_ui/node_modules/lodash/fp/isNative.js +5 -0
- node_ui/node_modules/lodash/fp/isNil.js +5 -0
- node_ui/node_modules/lodash/fp/isNull.js +5 -0
- node_ui/node_modules/lodash/fp/isNumber.js +5 -0
- node_ui/node_modules/lodash/fp/isObject.js +5 -0
- node_ui/node_modules/lodash/fp/isObjectLike.js +5 -0
- node_ui/node_modules/lodash/fp/isPlainObject.js +5 -0
- node_ui/node_modules/lodash/fp/isRegExp.js +5 -0
- node_ui/node_modules/lodash/fp/isSafeInteger.js +5 -0
- node_ui/node_modules/lodash/fp/isSet.js +5 -0
- node_ui/node_modules/lodash/fp/isString.js +5 -0
- node_ui/node_modules/lodash/fp/isSymbol.js +5 -0
- node_ui/node_modules/lodash/fp/isTypedArray.js +5 -0
- node_ui/node_modules/lodash/fp/isUndefined.js +5 -0
- node_ui/node_modules/lodash/fp/isWeakMap.js +5 -0
- node_ui/node_modules/lodash/fp/isWeakSet.js +5 -0
- node_ui/node_modules/lodash/fp/iteratee.js +5 -0
- node_ui/node_modules/lodash/fp/join.js +5 -0
- node_ui/node_modules/lodash/fp/juxt.js +1 -0
- node_ui/node_modules/lodash/fp/kebabCase.js +5 -0
- node_ui/node_modules/lodash/fp/keyBy.js +5 -0
- node_ui/node_modules/lodash/fp/keys.js +5 -0
- node_ui/node_modules/lodash/fp/keysIn.js +5 -0
- node_ui/node_modules/lodash/fp/lang.js +2 -0
- node_ui/node_modules/lodash/fp/last.js +5 -0
- node_ui/node_modules/lodash/fp/lastIndexOf.js +5 -0
- node_ui/node_modules/lodash/fp/lastIndexOfFrom.js +5 -0
- node_ui/node_modules/lodash/fp/lowerCase.js +5 -0
- node_ui/node_modules/lodash/fp/lowerFirst.js +5 -0
- node_ui/node_modules/lodash/fp/lt.js +5 -0
- node_ui/node_modules/lodash/fp/lte.js +5 -0
- node_ui/node_modules/lodash/fp/map.js +5 -0
- node_ui/node_modules/lodash/fp/mapKeys.js +5 -0
- node_ui/node_modules/lodash/fp/mapValues.js +5 -0
- node_ui/node_modules/lodash/fp/matches.js +1 -0
- node_ui/node_modules/lodash/fp/matchesProperty.js +5 -0
- node_ui/node_modules/lodash/fp/math.js +2 -0
- node_ui/node_modules/lodash/fp/max.js +5 -0
- node_ui/node_modules/lodash/fp/maxBy.js +5 -0
- node_ui/node_modules/lodash/fp/mean.js +5 -0
- node_ui/node_modules/lodash/fp/meanBy.js +5 -0
- node_ui/node_modules/lodash/fp/memoize.js +5 -0
- node_ui/node_modules/lodash/fp/merge.js +5 -0
- node_ui/node_modules/lodash/fp/mergeAll.js +5 -0
- node_ui/node_modules/lodash/fp/mergeAllWith.js +5 -0
- node_ui/node_modules/lodash/fp/mergeWith.js +5 -0
- node_ui/node_modules/lodash/fp/method.js +5 -0
- node_ui/node_modules/lodash/fp/methodOf.js +5 -0
- node_ui/node_modules/lodash/fp/min.js +5 -0
- node_ui/node_modules/lodash/fp/minBy.js +5 -0
- node_ui/node_modules/lodash/fp/mixin.js +5 -0
- node_ui/node_modules/lodash/fp/multiply.js +5 -0
- node_ui/node_modules/lodash/fp/nAry.js +1 -0
- node_ui/node_modules/lodash/fp/negate.js +5 -0
- node_ui/node_modules/lodash/fp/next.js +5 -0
- node_ui/node_modules/lodash/fp/noop.js +5 -0
- node_ui/node_modules/lodash/fp/now.js +5 -0
- node_ui/node_modules/lodash/fp/nth.js +5 -0
- node_ui/node_modules/lodash/fp/nthArg.js +5 -0
- node_ui/node_modules/lodash/fp/number.js +2 -0
- node_ui/node_modules/lodash/fp/object.js +2 -0
- node_ui/node_modules/lodash/fp/omit.js +5 -0
- node_ui/node_modules/lodash/fp/omitAll.js +1 -0
- node_ui/node_modules/lodash/fp/omitBy.js +5 -0
- node_ui/node_modules/lodash/fp/once.js +5 -0
- node_ui/node_modules/lodash/fp/orderBy.js +5 -0
- node_ui/node_modules/lodash/fp/over.js +5 -0
- node_ui/node_modules/lodash/fp/overArgs.js +5 -0
- node_ui/node_modules/lodash/fp/overEvery.js +5 -0
- node_ui/node_modules/lodash/fp/overSome.js +5 -0
- node_ui/node_modules/lodash/fp/pad.js +5 -0
- node_ui/node_modules/lodash/fp/padChars.js +5 -0
- node_ui/node_modules/lodash/fp/padCharsEnd.js +5 -0
- node_ui/node_modules/lodash/fp/padCharsStart.js +5 -0
- node_ui/node_modules/lodash/fp/padEnd.js +5 -0
- node_ui/node_modules/lodash/fp/padStart.js +5 -0
- node_ui/node_modules/lodash/fp/parseInt.js +5 -0
- node_ui/node_modules/lodash/fp/partial.js +5 -0
- node_ui/node_modules/lodash/fp/partialRight.js +5 -0
- node_ui/node_modules/lodash/fp/partition.js +5 -0
- node_ui/node_modules/lodash/fp/path.js +1 -0
- node_ui/node_modules/lodash/fp/pathEq.js +1 -0
- node_ui/node_modules/lodash/fp/pathOr.js +1 -0
- node_ui/node_modules/lodash/fp/paths.js +1 -0
- node_ui/node_modules/lodash/fp/pick.js +5 -0
- node_ui/node_modules/lodash/fp/pickAll.js +1 -0
- node_ui/node_modules/lodash/fp/pickBy.js +5 -0
- node_ui/node_modules/lodash/fp/pipe.js +1 -0
- node_ui/node_modules/lodash/fp/placeholder.js +6 -0
- node_ui/node_modules/lodash/fp/plant.js +5 -0
- node_ui/node_modules/lodash/fp/pluck.js +1 -0
- node_ui/node_modules/lodash/fp/prop.js +1 -0
- node_ui/node_modules/lodash/fp/propEq.js +1 -0
- node_ui/node_modules/lodash/fp/propOr.js +1 -0
- node_ui/node_modules/lodash/fp/property.js +1 -0
- node_ui/node_modules/lodash/fp/propertyOf.js +5 -0
- node_ui/node_modules/lodash/fp/props.js +1 -0
- node_ui/node_modules/lodash/fp/pull.js +5 -0
- node_ui/node_modules/lodash/fp/pullAll.js +5 -0
- node_ui/node_modules/lodash/fp/pullAllBy.js +5 -0
- node_ui/node_modules/lodash/fp/pullAllWith.js +5 -0
- node_ui/node_modules/lodash/fp/pullAt.js +5 -0
- node_ui/node_modules/lodash/fp/random.js +5 -0
- node_ui/node_modules/lodash/fp/range.js +5 -0
- node_ui/node_modules/lodash/fp/rangeRight.js +5 -0
- node_ui/node_modules/lodash/fp/rangeStep.js +5 -0
- node_ui/node_modules/lodash/fp/rangeStepRight.js +5 -0
- node_ui/node_modules/lodash/fp/rearg.js +5 -0
- node_ui/node_modules/lodash/fp/reduce.js +5 -0
- node_ui/node_modules/lodash/fp/reduceRight.js +5 -0
- node_ui/node_modules/lodash/fp/reject.js +5 -0
- node_ui/node_modules/lodash/fp/remove.js +5 -0
- node_ui/node_modules/lodash/fp/repeat.js +5 -0
- node_ui/node_modules/lodash/fp/replace.js +5 -0
- node_ui/node_modules/lodash/fp/rest.js +5 -0
- node_ui/node_modules/lodash/fp/restFrom.js +5 -0
- node_ui/node_modules/lodash/fp/result.js +5 -0
- node_ui/node_modules/lodash/fp/reverse.js +5 -0
- node_ui/node_modules/lodash/fp/round.js +5 -0
- node_ui/node_modules/lodash/fp/sample.js +5 -0
- node_ui/node_modules/lodash/fp/sampleSize.js +5 -0
- node_ui/node_modules/lodash/fp/seq.js +2 -0
- node_ui/node_modules/lodash/fp/set.js +5 -0
- node_ui/node_modules/lodash/fp/setWith.js +5 -0
- node_ui/node_modules/lodash/fp/shuffle.js +5 -0
- node_ui/node_modules/lodash/fp/size.js +5 -0
- node_ui/node_modules/lodash/fp/slice.js +5 -0
- node_ui/node_modules/lodash/fp/snakeCase.js +5 -0
- node_ui/node_modules/lodash/fp/some.js +5 -0
- node_ui/node_modules/lodash/fp/sortBy.js +5 -0
- node_ui/node_modules/lodash/fp/sortedIndex.js +5 -0
- node_ui/node_modules/lodash/fp/sortedIndexBy.js +5 -0
- node_ui/node_modules/lodash/fp/sortedIndexOf.js +5 -0
- node_ui/node_modules/lodash/fp/sortedLastIndex.js +5 -0
- node_ui/node_modules/lodash/fp/sortedLastIndexBy.js +5 -0
- node_ui/node_modules/lodash/fp/sortedLastIndexOf.js +5 -0
- node_ui/node_modules/lodash/fp/sortedUniq.js +5 -0
- node_ui/node_modules/lodash/fp/sortedUniqBy.js +5 -0
- node_ui/node_modules/lodash/fp/split.js +5 -0
- node_ui/node_modules/lodash/fp/spread.js +5 -0
- node_ui/node_modules/lodash/fp/spreadFrom.js +5 -0
- node_ui/node_modules/lodash/fp/startCase.js +5 -0
- node_ui/node_modules/lodash/fp/startsWith.js +5 -0
- node_ui/node_modules/lodash/fp/string.js +2 -0
- node_ui/node_modules/lodash/fp/stubArray.js +5 -0
- node_ui/node_modules/lodash/fp/stubFalse.js +5 -0
- node_ui/node_modules/lodash/fp/stubObject.js +5 -0
- node_ui/node_modules/lodash/fp/stubString.js +5 -0
- node_ui/node_modules/lodash/fp/stubTrue.js +5 -0
- node_ui/node_modules/lodash/fp/subtract.js +5 -0
- node_ui/node_modules/lodash/fp/sum.js +5 -0
- node_ui/node_modules/lodash/fp/sumBy.js +5 -0
- node_ui/node_modules/lodash/fp/symmetricDifference.js +1 -0
- node_ui/node_modules/lodash/fp/symmetricDifferenceBy.js +1 -0
- node_ui/node_modules/lodash/fp/symmetricDifferenceWith.js +1 -0
- node_ui/node_modules/lodash/fp/tail.js +5 -0
- node_ui/node_modules/lodash/fp/take.js +5 -0
- node_ui/node_modules/lodash/fp/takeLast.js +1 -0
- node_ui/node_modules/lodash/fp/takeLastWhile.js +1 -0
- node_ui/node_modules/lodash/fp/takeRight.js +5 -0
- node_ui/node_modules/lodash/fp/takeRightWhile.js +5 -0
- node_ui/node_modules/lodash/fp/takeWhile.js +5 -0
- node_ui/node_modules/lodash/fp/tap.js +5 -0
- node_ui/node_modules/lodash/fp/template.js +5 -0
- node_ui/node_modules/lodash/fp/templateSettings.js +5 -0
- node_ui/node_modules/lodash/fp/throttle.js +5 -0
- node_ui/node_modules/lodash/fp/thru.js +5 -0
- node_ui/node_modules/lodash/fp/times.js +5 -0
- node_ui/node_modules/lodash/fp/toArray.js +5 -0
- node_ui/node_modules/lodash/fp/toFinite.js +5 -0
- node_ui/node_modules/lodash/fp/toInteger.js +5 -0
- node_ui/node_modules/lodash/fp/toIterator.js +5 -0
- node_ui/node_modules/lodash/fp/toJSON.js +5 -0
- node_ui/node_modules/lodash/fp/toLength.js +5 -0
- node_ui/node_modules/lodash/fp/toLower.js +5 -0
- node_ui/node_modules/lodash/fp/toNumber.js +5 -0
- node_ui/node_modules/lodash/fp/toPairs.js +5 -0
- node_ui/node_modules/lodash/fp/toPairsIn.js +5 -0
- node_ui/node_modules/lodash/fp/toPath.js +5 -0
- node_ui/node_modules/lodash/fp/toPlainObject.js +5 -0
- node_ui/node_modules/lodash/fp/toSafeInteger.js +5 -0
- node_ui/node_modules/lodash/fp/toString.js +5 -0
- node_ui/node_modules/lodash/fp/toUpper.js +5 -0
- node_ui/node_modules/lodash/fp/transform.js +5 -0
- node_ui/node_modules/lodash/fp/trim.js +5 -0
- node_ui/node_modules/lodash/fp/trimChars.js +5 -0
- node_ui/node_modules/lodash/fp/trimCharsEnd.js +5 -0
- node_ui/node_modules/lodash/fp/trimCharsStart.js +5 -0
- node_ui/node_modules/lodash/fp/trimEnd.js +5 -0
- node_ui/node_modules/lodash/fp/trimStart.js +5 -0
- node_ui/node_modules/lodash/fp/truncate.js +5 -0
- node_ui/node_modules/lodash/fp/unapply.js +1 -0
- node_ui/node_modules/lodash/fp/unary.js +5 -0
- node_ui/node_modules/lodash/fp/unescape.js +5 -0
- node_ui/node_modules/lodash/fp/union.js +5 -0
- node_ui/node_modules/lodash/fp/unionBy.js +5 -0
- node_ui/node_modules/lodash/fp/unionWith.js +5 -0
- node_ui/node_modules/lodash/fp/uniq.js +5 -0
- node_ui/node_modules/lodash/fp/uniqBy.js +5 -0
- node_ui/node_modules/lodash/fp/uniqWith.js +5 -0
- node_ui/node_modules/lodash/fp/uniqueId.js +5 -0
- node_ui/node_modules/lodash/fp/unnest.js +1 -0
- node_ui/node_modules/lodash/fp/unset.js +5 -0
- node_ui/node_modules/lodash/fp/unzip.js +5 -0
- node_ui/node_modules/lodash/fp/unzipWith.js +5 -0
- node_ui/node_modules/lodash/fp/update.js +5 -0
- node_ui/node_modules/lodash/fp/updateWith.js +5 -0
- node_ui/node_modules/lodash/fp/upperCase.js +5 -0
- node_ui/node_modules/lodash/fp/upperFirst.js +5 -0
- node_ui/node_modules/lodash/fp/useWith.js +1 -0
- node_ui/node_modules/lodash/fp/util.js +2 -0
- node_ui/node_modules/lodash/fp/value.js +5 -0
- node_ui/node_modules/lodash/fp/valueOf.js +5 -0
- node_ui/node_modules/lodash/fp/values.js +5 -0
- node_ui/node_modules/lodash/fp/valuesIn.js +5 -0
- node_ui/node_modules/lodash/fp/where.js +1 -0
- node_ui/node_modules/lodash/fp/whereEq.js +1 -0
- node_ui/node_modules/lodash/fp/without.js +5 -0
- node_ui/node_modules/lodash/fp/words.js +5 -0
- node_ui/node_modules/lodash/fp/wrap.js +5 -0
- node_ui/node_modules/lodash/fp/wrapperAt.js +5 -0
- node_ui/node_modules/lodash/fp/wrapperChain.js +5 -0
- node_ui/node_modules/lodash/fp/wrapperLodash.js +5 -0
- node_ui/node_modules/lodash/fp/wrapperReverse.js +5 -0
- node_ui/node_modules/lodash/fp/wrapperValue.js +5 -0
- node_ui/node_modules/lodash/fp/xor.js +5 -0
- node_ui/node_modules/lodash/fp/xorBy.js +5 -0
- node_ui/node_modules/lodash/fp/xorWith.js +5 -0
- node_ui/node_modules/lodash/fp/zip.js +5 -0
- node_ui/node_modules/lodash/fp/zipAll.js +5 -0
- node_ui/node_modules/lodash/fp/zipObj.js +1 -0
- node_ui/node_modules/lodash/fp/zipObject.js +5 -0
- node_ui/node_modules/lodash/fp/zipObjectDeep.js +5 -0
- node_ui/node_modules/lodash/fp/zipWith.js +5 -0
- node_ui/node_modules/lodash/fp.js +2 -0
- node_ui/node_modules/lodash/fromPairs.js +28 -0
- node_ui/node_modules/lodash/function.js +25 -0
- node_ui/node_modules/lodash/functions.js +31 -0
- node_ui/node_modules/lodash/functionsIn.js +31 -0
- node_ui/node_modules/lodash/get.js +33 -0
- node_ui/node_modules/lodash/groupBy.js +41 -0
- node_ui/node_modules/lodash/gt.js +29 -0
- node_ui/node_modules/lodash/gte.js +30 -0
- node_ui/node_modules/lodash/has.js +35 -0
- node_ui/node_modules/lodash/hasIn.js +34 -0
- node_ui/node_modules/lodash/head.js +23 -0
- node_ui/node_modules/lodash/identity.js +21 -0
- node_ui/node_modules/lodash/inRange.js +55 -0
- node_ui/node_modules/lodash/includes.js +53 -0
- node_ui/node_modules/lodash/index.js +1 -0
- node_ui/node_modules/lodash/indexOf.js +42 -0
- node_ui/node_modules/lodash/initial.js +22 -0
- node_ui/node_modules/lodash/intersection.js +30 -0
- node_ui/node_modules/lodash/intersectionBy.js +45 -0
- node_ui/node_modules/lodash/intersectionWith.js +41 -0
- node_ui/node_modules/lodash/invert.js +42 -0
- node_ui/node_modules/lodash/invertBy.js +56 -0
- node_ui/node_modules/lodash/invoke.js +24 -0
- node_ui/node_modules/lodash/invokeMap.js +41 -0
- node_ui/node_modules/lodash/isArguments.js +36 -0
- node_ui/node_modules/lodash/isArray.js +26 -0
- node_ui/node_modules/lodash/isArrayBuffer.js +27 -0
- node_ui/node_modules/lodash/isArrayLike.js +33 -0
- node_ui/node_modules/lodash/isArrayLikeObject.js +33 -0
- node_ui/node_modules/lodash/isBoolean.js +29 -0
- node_ui/node_modules/lodash/isBuffer.js +38 -0
- node_ui/node_modules/lodash/isDate.js +27 -0
- node_ui/node_modules/lodash/isElement.js +25 -0
- node_ui/node_modules/lodash/isEmpty.js +77 -0
- node_ui/node_modules/lodash/isEqual.js +35 -0
- node_ui/node_modules/lodash/isEqualWith.js +41 -0
- node_ui/node_modules/lodash/isError.js +36 -0
- node_ui/node_modules/lodash/isFinite.js +36 -0
- node_ui/node_modules/lodash/isFunction.js +37 -0
- node_ui/node_modules/lodash/isInteger.js +33 -0
- node_ui/node_modules/lodash/isLength.js +35 -0
- node_ui/node_modules/lodash/isMap.js +27 -0
- node_ui/node_modules/lodash/isMatch.js +36 -0
- node_ui/node_modules/lodash/isMatchWith.js +41 -0
- node_ui/node_modules/lodash/isNaN.js +38 -0
- node_ui/node_modules/lodash/isNative.js +40 -0
- node_ui/node_modules/lodash/isNil.js +25 -0
- node_ui/node_modules/lodash/isNull.js +22 -0
- node_ui/node_modules/lodash/isNumber.js +38 -0
- node_ui/node_modules/lodash/isObject.js +31 -0
- node_ui/node_modules/lodash/isObjectLike.js +29 -0
- node_ui/node_modules/lodash/isPlainObject.js +62 -0
- node_ui/node_modules/lodash/isRegExp.js +27 -0
- node_ui/node_modules/lodash/isSafeInteger.js +37 -0
- node_ui/node_modules/lodash/isSet.js +27 -0
- node_ui/node_modules/lodash/isString.js +30 -0
- node_ui/node_modules/lodash/isSymbol.js +29 -0
- node_ui/node_modules/lodash/isTypedArray.js +27 -0
- node_ui/node_modules/lodash/isUndefined.js +22 -0
- node_ui/node_modules/lodash/isWeakMap.js +28 -0
- node_ui/node_modules/lodash/isWeakSet.js +28 -0
- node_ui/node_modules/lodash/iteratee.js +53 -0
- node_ui/node_modules/lodash/join.js +26 -0
- node_ui/node_modules/lodash/kebabCase.js +28 -0
- node_ui/node_modules/lodash/keyBy.js +36 -0
- node_ui/node_modules/lodash/keys.js +37 -0
- node_ui/node_modules/lodash/keysIn.js +32 -0
- node_ui/node_modules/lodash/lang.js +58 -0
- node_ui/node_modules/lodash/last.js +20 -0
- node_ui/node_modules/lodash/lastIndexOf.js +46 -0
- node_ui/node_modules/lodash/lodash.js +17209 -0
- node_ui/node_modules/lodash/lodash.min.js +140 -0
- node_ui/node_modules/lodash/lowerCase.js +27 -0
- node_ui/node_modules/lodash/lowerFirst.js +22 -0
- node_ui/node_modules/lodash/lt.js +29 -0
- node_ui/node_modules/lodash/lte.js +30 -0
- node_ui/node_modules/lodash/map.js +53 -0
- node_ui/node_modules/lodash/mapKeys.js +36 -0
- node_ui/node_modules/lodash/mapValues.js +43 -0
- node_ui/node_modules/lodash/matches.js +46 -0
- node_ui/node_modules/lodash/matchesProperty.js +44 -0
- node_ui/node_modules/lodash/math.js +17 -0
- node_ui/node_modules/lodash/max.js +29 -0
- node_ui/node_modules/lodash/maxBy.js +34 -0
- node_ui/node_modules/lodash/mean.js +22 -0
- node_ui/node_modules/lodash/meanBy.js +31 -0
- node_ui/node_modules/lodash/memoize.js +73 -0
- node_ui/node_modules/lodash/merge.js +39 -0
- node_ui/node_modules/lodash/mergeWith.js +39 -0
- node_ui/node_modules/lodash/method.js +34 -0
- node_ui/node_modules/lodash/methodOf.js +33 -0
- node_ui/node_modules/lodash/min.js +29 -0
- node_ui/node_modules/lodash/minBy.js +34 -0
- node_ui/node_modules/lodash/mixin.js +74 -0
- node_ui/node_modules/lodash/multiply.js +22 -0
- node_ui/node_modules/lodash/negate.js +40 -0
- node_ui/node_modules/lodash/next.js +35 -0
- node_ui/node_modules/lodash/noop.js +17 -0
- node_ui/node_modules/lodash/now.js +23 -0
- node_ui/node_modules/lodash/nth.js +29 -0
- node_ui/node_modules/lodash/nthArg.js +32 -0
- node_ui/node_modules/lodash/number.js +5 -0
- node_ui/node_modules/lodash/object.js +49 -0
- node_ui/node_modules/lodash/omit.js +57 -0
- node_ui/node_modules/lodash/omitBy.js +29 -0
- node_ui/node_modules/lodash/once.js +25 -0
- node_ui/node_modules/lodash/orderBy.js +47 -0
- node_ui/node_modules/lodash/over.js +24 -0
- node_ui/node_modules/lodash/overArgs.js +61 -0
- node_ui/node_modules/lodash/overEvery.js +34 -0
- node_ui/node_modules/lodash/overSome.js +37 -0
- node_ui/node_modules/lodash/package.json +17 -0
- node_ui/node_modules/lodash/pad.js +49 -0
- node_ui/node_modules/lodash/padEnd.js +39 -0
- node_ui/node_modules/lodash/padStart.js +39 -0
- node_ui/node_modules/lodash/parseInt.js +43 -0
- node_ui/node_modules/lodash/partial.js +50 -0
- node_ui/node_modules/lodash/partialRight.js +49 -0
- node_ui/node_modules/lodash/partition.js +43 -0
- node_ui/node_modules/lodash/pick.js +25 -0
- node_ui/node_modules/lodash/pickBy.js +37 -0
- node_ui/node_modules/lodash/plant.js +48 -0
- node_ui/node_modules/lodash/property.js +32 -0
- node_ui/node_modules/lodash/propertyOf.js +30 -0
- node_ui/node_modules/lodash/pull.js +29 -0
- node_ui/node_modules/lodash/pullAll.js +29 -0
- node_ui/node_modules/lodash/pullAllBy.js +33 -0
- node_ui/node_modules/lodash/pullAllWith.js +32 -0
- node_ui/node_modules/lodash/pullAt.js +43 -0
- node_ui/node_modules/lodash/random.js +82 -0
- node_ui/node_modules/lodash/range.js +46 -0
- node_ui/node_modules/lodash/rangeRight.js +41 -0
- node_ui/node_modules/lodash/rearg.js +33 -0
- node_ui/node_modules/lodash/reduce.js +51 -0
- node_ui/node_modules/lodash/reduceRight.js +36 -0
- node_ui/node_modules/lodash/reject.js +46 -0
- node_ui/node_modules/lodash/release.md +48 -0
- node_ui/node_modules/lodash/remove.js +53 -0
- node_ui/node_modules/lodash/repeat.js +37 -0
- node_ui/node_modules/lodash/replace.js +29 -0
- node_ui/node_modules/lodash/rest.js +40 -0
- node_ui/node_modules/lodash/result.js +56 -0
- node_ui/node_modules/lodash/reverse.js +34 -0
- node_ui/node_modules/lodash/round.js +26 -0
- node_ui/node_modules/lodash/sample.js +24 -0
- node_ui/node_modules/lodash/sampleSize.js +37 -0
- node_ui/node_modules/lodash/seq.js +16 -0
- node_ui/node_modules/lodash/set.js +35 -0
- node_ui/node_modules/lodash/setWith.js +32 -0
- node_ui/node_modules/lodash/shuffle.js +25 -0
- node_ui/node_modules/lodash/size.js +46 -0
- node_ui/node_modules/lodash/slice.js +37 -0
- node_ui/node_modules/lodash/snakeCase.js +28 -0
- node_ui/node_modules/lodash/some.js +51 -0
- node_ui/node_modules/lodash/sortBy.js +48 -0
- node_ui/node_modules/lodash/sortedIndex.js +24 -0
- node_ui/node_modules/lodash/sortedIndexBy.js +33 -0
- node_ui/node_modules/lodash/sortedIndexOf.js +31 -0
- node_ui/node_modules/lodash/sortedLastIndex.js +25 -0
- node_ui/node_modules/lodash/sortedLastIndexBy.js +33 -0
- node_ui/node_modules/lodash/sortedLastIndexOf.js +31 -0
- node_ui/node_modules/lodash/sortedUniq.js +24 -0
- node_ui/node_modules/lodash/sortedUniqBy.js +26 -0
- node_ui/node_modules/lodash/split.js +52 -0
- node_ui/node_modules/lodash/spread.js +63 -0
- node_ui/node_modules/lodash/startCase.js +29 -0
- node_ui/node_modules/lodash/startsWith.js +39 -0
- node_ui/node_modules/lodash/string.js +33 -0
- node_ui/node_modules/lodash/stubArray.js +23 -0
- node_ui/node_modules/lodash/stubFalse.js +18 -0
- node_ui/node_modules/lodash/stubObject.js +23 -0
- node_ui/node_modules/lodash/stubString.js +18 -0
- node_ui/node_modules/lodash/stubTrue.js +18 -0
- node_ui/node_modules/lodash/subtract.js +22 -0
- node_ui/node_modules/lodash/sum.js +24 -0
- node_ui/node_modules/lodash/sumBy.js +33 -0
- node_ui/node_modules/lodash/tail.js +22 -0
- node_ui/node_modules/lodash/take.js +37 -0
- node_ui/node_modules/lodash/takeRight.js +39 -0
- node_ui/node_modules/lodash/takeRightWhile.js +45 -0
- node_ui/node_modules/lodash/takeWhile.js +45 -0
- node_ui/node_modules/lodash/tap.js +29 -0
- node_ui/node_modules/lodash/template.js +272 -0
- node_ui/node_modules/lodash/templateSettings.js +67 -0
- node_ui/node_modules/lodash/throttle.js +69 -0
- node_ui/node_modules/lodash/thru.js +28 -0
- node_ui/node_modules/lodash/times.js +51 -0
- node_ui/node_modules/lodash/toArray.js +58 -0
- node_ui/node_modules/lodash/toFinite.js +42 -0
- node_ui/node_modules/lodash/toInteger.js +36 -0
- node_ui/node_modules/lodash/toIterator.js +23 -0
- node_ui/node_modules/lodash/toJSON.js +1 -0
- node_ui/node_modules/lodash/toLength.js +38 -0
- node_ui/node_modules/lodash/toLower.js +28 -0
- node_ui/node_modules/lodash/toNumber.js +64 -0
- node_ui/node_modules/lodash/toPairs.js +30 -0
- node_ui/node_modules/lodash/toPairsIn.js +30 -0
- node_ui/node_modules/lodash/toPath.js +33 -0
- node_ui/node_modules/lodash/toPlainObject.js +32 -0
- node_ui/node_modules/lodash/toSafeInteger.js +37 -0
- node_ui/node_modules/lodash/toString.js +28 -0
- node_ui/node_modules/lodash/toUpper.js +28 -0
- node_ui/node_modules/lodash/transform.js +65 -0
- node_ui/node_modules/lodash/trim.js +47 -0
- node_ui/node_modules/lodash/trimEnd.js +41 -0
- node_ui/node_modules/lodash/trimStart.js +43 -0
- node_ui/node_modules/lodash/truncate.js +111 -0
- node_ui/node_modules/lodash/unary.js +22 -0
- node_ui/node_modules/lodash/unescape.js +34 -0
- node_ui/node_modules/lodash/union.js +26 -0
- node_ui/node_modules/lodash/unionBy.js +39 -0
- node_ui/node_modules/lodash/unionWith.js +34 -0
- node_ui/node_modules/lodash/uniq.js +25 -0
- node_ui/node_modules/lodash/uniqBy.js +31 -0
- node_ui/node_modules/lodash/uniqWith.js +28 -0
- node_ui/node_modules/lodash/uniqueId.js +28 -0
- node_ui/node_modules/lodash/unset.js +34 -0
- node_ui/node_modules/lodash/unzip.js +45 -0
- node_ui/node_modules/lodash/unzipWith.js +39 -0
- node_ui/node_modules/lodash/update.js +35 -0
- node_ui/node_modules/lodash/updateWith.js +33 -0
- node_ui/node_modules/lodash/upperCase.js +27 -0
- node_ui/node_modules/lodash/upperFirst.js +22 -0
- node_ui/node_modules/lodash/util.js +34 -0
- node_ui/node_modules/lodash/value.js +1 -0
- node_ui/node_modules/lodash/valueOf.js +1 -0
- node_ui/node_modules/lodash/values.js +34 -0
- node_ui/node_modules/lodash/valuesIn.js +32 -0
- node_ui/node_modules/lodash/without.js +31 -0
- node_ui/node_modules/lodash/words.js +35 -0
- node_ui/node_modules/lodash/wrap.js +30 -0
- node_ui/node_modules/lodash/wrapperAt.js +48 -0
- node_ui/node_modules/lodash/wrapperChain.js +34 -0
- node_ui/node_modules/lodash/wrapperLodash.js +147 -0
- node_ui/node_modules/lodash/wrapperReverse.js +44 -0
- node_ui/node_modules/lodash/wrapperValue.js +21 -0
- node_ui/node_modules/lodash/xor.js +28 -0
- node_ui/node_modules/lodash/xorBy.js +39 -0
- node_ui/node_modules/lodash/xorWith.js +34 -0
- node_ui/node_modules/lodash/zip.js +22 -0
- node_ui/node_modules/lodash/zipObject.js +24 -0
- node_ui/node_modules/lodash/zipObjectDeep.js +23 -0
- node_ui/node_modules/lodash/zipWith.js +32 -0
- node_ui/node_modules/lodash.isequal/LICENSE +47 -0
- node_ui/node_modules/lodash.isequal/README.md +18 -0
- node_ui/node_modules/lodash.isequal/index.js +1848 -0
- node_ui/node_modules/lodash.isequal/package.json +16 -0
- node_ui/node_modules/loose-envify/LICENSE +21 -0
- node_ui/node_modules/loose-envify/README.md +45 -0
- node_ui/node_modules/loose-envify/cli.js +16 -0
- node_ui/node_modules/loose-envify/custom.js +4 -0
- node_ui/node_modules/loose-envify/index.js +3 -0
- node_ui/node_modules/loose-envify/loose-envify.js +36 -0
- node_ui/node_modules/loose-envify/package.json +36 -0
- node_ui/node_modules/loose-envify/replace.js +65 -0
- node_ui/node_modules/meow/build/dependencies.js +8828 -0
- node_ui/node_modules/meow/build/index.d.ts +1425 -0
- node_ui/node_modules/meow/build/index.js +95 -0
- node_ui/node_modules/meow/build/licenses.md +1620 -0
- node_ui/node_modules/meow/build/options.js +92 -0
- node_ui/node_modules/meow/build/parser.js +84 -0
- node_ui/node_modules/meow/build/utils.js +7 -0
- node_ui/node_modules/meow/build/validate.js +122 -0
- node_ui/node_modules/meow/license +9 -0
- node_ui/node_modules/meow/package.json +105 -0
- node_ui/node_modules/meow/readme.md +314 -0
- node_ui/node_modules/mimic-fn/index.d.ts +54 -0
- node_ui/node_modules/mimic-fn/index.js +13 -0
- node_ui/node_modules/mimic-fn/license +9 -0
- node_ui/node_modules/mimic-fn/package.json +42 -0
- node_ui/node_modules/mimic-fn/readme.md +69 -0
- node_ui/node_modules/onetime/index.d.ts +64 -0
- node_ui/node_modules/onetime/index.js +44 -0
- node_ui/node_modules/onetime/license +9 -0
- node_ui/node_modules/onetime/package.json +43 -0
- node_ui/node_modules/onetime/readme.md +94 -0
- node_ui/node_modules/patch-console/dist/index.d.ts +4 -0
- node_ui/node_modules/patch-console/dist/index.js +45 -0
- node_ui/node_modules/patch-console/dist/index.js.map +1 -0
- node_ui/node_modules/patch-console/license +9 -0
- node_ui/node_modules/patch-console/package.json +53 -0
- node_ui/node_modules/patch-console/readme.md +62 -0
- node_ui/node_modules/react/LICENSE +21 -0
- node_ui/node_modules/react/README.md +37 -0
- node_ui/node_modules/react/cjs/react-jsx-dev-runtime.development.js +1315 -0
- node_ui/node_modules/react/cjs/react-jsx-dev-runtime.production.min.js +10 -0
- node_ui/node_modules/react/cjs/react-jsx-dev-runtime.profiling.min.js +10 -0
- node_ui/node_modules/react/cjs/react-jsx-runtime.development.js +1333 -0
- node_ui/node_modules/react/cjs/react-jsx-runtime.production.min.js +11 -0
- node_ui/node_modules/react/cjs/react-jsx-runtime.profiling.min.js +11 -0
- node_ui/node_modules/react/cjs/react.development.js +2740 -0
- node_ui/node_modules/react/cjs/react.production.min.js +26 -0
- node_ui/node_modules/react/cjs/react.shared-subset.development.js +20 -0
- node_ui/node_modules/react/cjs/react.shared-subset.production.min.js +10 -0
- node_ui/node_modules/react/index.js +7 -0
- node_ui/node_modules/react/jsx-dev-runtime.js +7 -0
- node_ui/node_modules/react/jsx-runtime.js +7 -0
- node_ui/node_modules/react/package.json +47 -0
- node_ui/node_modules/react/react.shared-subset.js +7 -0
- node_ui/node_modules/react/umd/react.development.js +3343 -0
- node_ui/node_modules/react/umd/react.production.min.js +31 -0
- node_ui/node_modules/react/umd/react.profiling.min.js +31 -0
- node_ui/node_modules/react-devtools-core/README.md +131 -0
- node_ui/node_modules/react-devtools-core/backend.js +1 -0
- node_ui/node_modules/react-devtools-core/dist/backend.js +16888 -0
- node_ui/node_modules/react-devtools-core/dist/backend.js.map +1 -0
- node_ui/node_modules/react-devtools-core/dist/importFile.worker.worker.js +2 -0
- node_ui/node_modules/react-devtools-core/dist/importFile.worker.worker.js.map +1 -0
- node_ui/node_modules/react-devtools-core/dist/parseHookNames.chunk.js +2 -0
- node_ui/node_modules/react-devtools-core/dist/parseHookNames.chunk.js.map +1 -0
- node_ui/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js +2 -0
- node_ui/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js.map +1 -0
- node_ui/node_modules/react-devtools-core/dist/standalone.js +3 -0
- node_ui/node_modules/react-devtools-core/dist/standalone.js.LICENSE.txt +41 -0
- node_ui/node_modules/react-devtools-core/dist/standalone.js.map +1 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/LICENSE +21 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/README.md +495 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/browser.js +8 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/index.js +10 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/buffer-util.js +129 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/constants.js +10 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/event-target.js +184 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/extension.js +223 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/limiter.js +55 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/permessage-deflate.js +518 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/receiver.js +607 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/sender.js +409 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/stream.js +180 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/validation.js +104 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/websocket-server.js +449 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/lib/websocket.js +1197 -0
- node_ui/node_modules/react-devtools-core/node_modules/ws/package.json +56 -0
- node_ui/node_modules/react-devtools-core/package.json +38 -0
- node_ui/node_modules/react-devtools-core/standalone.js +1 -0
- node_ui/node_modules/react-reconciler/LICENSE +21 -0
- node_ui/node_modules/react-reconciler/README.md +337 -0
- node_ui/node_modules/react-reconciler/cjs/react-reconciler-constants.development.js +45 -0
- node_ui/node_modules/react-reconciler/cjs/react-reconciler-constants.production.min.js +10 -0
- node_ui/node_modules/react-reconciler/cjs/react-reconciler-reflection.development.js +660 -0
- node_ui/node_modules/react-reconciler/cjs/react-reconciler-reflection.production.min.js +15 -0
- node_ui/node_modules/react-reconciler/cjs/react-reconciler.development.js +21531 -0
- node_ui/node_modules/react-reconciler/cjs/react-reconciler.production.min.js +234 -0
- node_ui/node_modules/react-reconciler/cjs/react-reconciler.profiling.min.js +255 -0
- node_ui/node_modules/react-reconciler/constants.js +7 -0
- node_ui/node_modules/react-reconciler/index.js +7 -0
- node_ui/node_modules/react-reconciler/package.json +40 -0
- node_ui/node_modules/react-reconciler/reflection.js +7 -0
- node_ui/node_modules/restore-cursor/index.d.ts +11 -0
- node_ui/node_modules/restore-cursor/index.js +11 -0
- node_ui/node_modules/restore-cursor/license +9 -0
- node_ui/node_modules/restore-cursor/package.json +55 -0
- node_ui/node_modules/restore-cursor/readme.md +31 -0
- node_ui/node_modules/scheduler/LICENSE +21 -0
- node_ui/node_modules/scheduler/README.md +9 -0
- node_ui/node_modules/scheduler/cjs/scheduler-unstable_mock.development.js +700 -0
- node_ui/node_modules/scheduler/cjs/scheduler-unstable_mock.production.min.js +20 -0
- node_ui/node_modules/scheduler/cjs/scheduler-unstable_post_task.development.js +207 -0
- node_ui/node_modules/scheduler/cjs/scheduler-unstable_post_task.production.min.js +14 -0
- node_ui/node_modules/scheduler/cjs/scheduler.development.js +634 -0
- node_ui/node_modules/scheduler/cjs/scheduler.production.min.js +19 -0
- node_ui/node_modules/scheduler/index.js +7 -0
- node_ui/node_modules/scheduler/package.json +36 -0
- node_ui/node_modules/scheduler/umd/scheduler-unstable_mock.development.js +699 -0
- node_ui/node_modules/scheduler/umd/scheduler-unstable_mock.production.min.js +19 -0
- node_ui/node_modules/scheduler/umd/scheduler.development.js +152 -0
- node_ui/node_modules/scheduler/umd/scheduler.production.min.js +146 -0
- node_ui/node_modules/scheduler/umd/scheduler.profiling.min.js +146 -0
- node_ui/node_modules/scheduler/unstable_mock.js +7 -0
- node_ui/node_modules/scheduler/unstable_post_task.js +7 -0
- node_ui/node_modules/shell-quote/.eslintrc +30 -0
- node_ui/node_modules/shell-quote/.github/FUNDING.yml +12 -0
- node_ui/node_modules/shell-quote/.nycrc +14 -0
- node_ui/node_modules/shell-quote/LICENSE +24 -0
- node_ui/node_modules/shell-quote/README.md +161 -0
- node_ui/node_modules/shell-quote/index.js +4 -0
- node_ui/node_modules/shell-quote/package.json +72 -0
- node_ui/node_modules/shell-quote/parse.js +226 -0
- node_ui/node_modules/shell-quote/print.py +3 -0
- node_ui/node_modules/shell-quote/quote.js +19 -0
- node_ui/node_modules/shell-quote/security.md +11 -0
- node_ui/node_modules/shell-quote/test/comment.js +16 -0
- node_ui/node_modules/shell-quote/test/env.js +52 -0
- node_ui/node_modules/shell-quote/test/env_fn.js +21 -0
- node_ui/node_modules/shell-quote/test/op.js +102 -0
- node_ui/node_modules/shell-quote/test/parse.js +44 -0
- node_ui/node_modules/shell-quote/test/quote.js +60 -0
- node_ui/node_modules/shell-quote/test/set.js +31 -0
- node_ui/node_modules/signal-exit/LICENSE.txt +16 -0
- node_ui/node_modules/signal-exit/README.md +39 -0
- node_ui/node_modules/signal-exit/index.js +202 -0
- node_ui/node_modules/signal-exit/package.json +38 -0
- node_ui/node_modules/signal-exit/signals.js +53 -0
- node_ui/node_modules/slice-ansi/index.d.ts +19 -0
- node_ui/node_modules/slice-ansi/index.js +169 -0
- node_ui/node_modules/slice-ansi/license +10 -0
- node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/index.d.ts +17 -0
- node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/index.js +12 -0
- node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/license +9 -0
- node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/package.json +53 -0
- node_ui/node_modules/slice-ansi/node_modules/is-fullwidth-code-point/readme.md +31 -0
- node_ui/node_modules/slice-ansi/package.json +58 -0
- node_ui/node_modules/slice-ansi/readme.md +54 -0
- node_ui/node_modules/stack-utils/LICENSE.md +21 -0
- node_ui/node_modules/stack-utils/index.js +344 -0
- node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/index.d.ts +18 -0
- node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/index.js +11 -0
- node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/license +9 -0
- node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/package.json +43 -0
- node_ui/node_modules/stack-utils/node_modules/escape-string-regexp/readme.md +29 -0
- node_ui/node_modules/stack-utils/package.json +39 -0
- node_ui/node_modules/stack-utils/readme.md +143 -0
- node_ui/node_modules/string-width/index.d.ts +39 -0
- node_ui/node_modules/string-width/index.js +82 -0
- node_ui/node_modules/string-width/license +9 -0
- node_ui/node_modules/string-width/package.json +64 -0
- node_ui/node_modules/string-width/readme.md +66 -0
- node_ui/node_modules/strip-ansi/index.d.ts +15 -0
- node_ui/node_modules/strip-ansi/index.js +14 -0
- node_ui/node_modules/strip-ansi/license +9 -0
- node_ui/node_modules/strip-ansi/package.json +59 -0
- node_ui/node_modules/strip-ansi/readme.md +37 -0
- node_ui/node_modules/to-rotated/index.d.ts +18 -0
- node_ui/node_modules/to-rotated/index.js +24 -0
- node_ui/node_modules/to-rotated/license +9 -0
- node_ui/node_modules/to-rotated/package.json +46 -0
- node_ui/node_modules/to-rotated/readme.md +29 -0
- node_ui/node_modules/type-fest/index.d.ts +178 -0
- node_ui/node_modules/type-fest/license-cc0 +121 -0
- node_ui/node_modules/type-fest/license-mit +9 -0
- node_ui/node_modules/type-fest/package.json +91 -0
- node_ui/node_modules/type-fest/readme.md +1060 -0
- node_ui/node_modules/type-fest/source/all-union-fields.d.ts +88 -0
- node_ui/node_modules/type-fest/source/and.d.ts +25 -0
- node_ui/node_modules/type-fest/source/array-indices.d.ts +23 -0
- node_ui/node_modules/type-fest/source/array-slice.d.ts +109 -0
- node_ui/node_modules/type-fest/source/array-splice.d.ts +99 -0
- node_ui/node_modules/type-fest/source/array-tail.d.ts +76 -0
- node_ui/node_modules/type-fest/source/array-values.d.ts +22 -0
- node_ui/node_modules/type-fest/source/arrayable.d.ts +29 -0
- node_ui/node_modules/type-fest/source/async-return-type.d.ts +23 -0
- node_ui/node_modules/type-fest/source/asyncify.d.ts +32 -0
- node_ui/node_modules/type-fest/source/basic.d.ts +68 -0
- node_ui/node_modules/type-fest/source/camel-case.d.ts +89 -0
- node_ui/node_modules/type-fest/source/camel-cased-properties-deep.d.ts +97 -0
- node_ui/node_modules/type-fest/source/camel-cased-properties.d.ts +43 -0
- node_ui/node_modules/type-fest/source/conditional-except.d.ts +45 -0
- node_ui/node_modules/type-fest/source/conditional-keys.d.ts +47 -0
- node_ui/node_modules/type-fest/source/conditional-pick-deep.d.ts +118 -0
- node_ui/node_modules/type-fest/source/conditional-pick.d.ts +44 -0
- node_ui/node_modules/type-fest/source/conditional-simplify.d.ts +32 -0
- node_ui/node_modules/type-fest/source/delimiter-case.d.ts +78 -0
- node_ui/node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts +106 -0
- node_ui/node_modules/type-fest/source/delimiter-cased-properties.d.ts +46 -0
- node_ui/node_modules/type-fest/source/distributed-omit.d.ts +89 -0
- node_ui/node_modules/type-fest/source/distributed-pick.d.ts +85 -0
- node_ui/node_modules/type-fest/source/empty-object.d.ts +46 -0
- node_ui/node_modules/type-fest/source/enforce-optional.d.ts +47 -0
- node_ui/node_modules/type-fest/source/entries.d.ts +62 -0
- node_ui/node_modules/type-fest/source/entry.d.ts +65 -0
- node_ui/node_modules/type-fest/source/exact.d.ts +68 -0
- node_ui/node_modules/type-fest/source/except.d.ts +108 -0
- node_ui/node_modules/type-fest/source/find-global-type.d.ts +64 -0
- node_ui/node_modules/type-fest/source/fixed-length-array.d.ts +43 -0
- node_ui/node_modules/type-fest/source/get.d.ts +219 -0
- node_ui/node_modules/type-fest/source/global-this.d.ts +21 -0
- node_ui/node_modules/type-fest/source/greater-than-or-equal.d.ts +22 -0
- node_ui/node_modules/type-fest/source/greater-than.d.ts +56 -0
- node_ui/node_modules/type-fest/source/has-optional-keys.d.ts +21 -0
- node_ui/node_modules/type-fest/source/has-readonly-keys.d.ts +21 -0
- node_ui/node_modules/type-fest/source/has-required-keys.d.ts +59 -0
- node_ui/node_modules/type-fest/source/has-writable-keys.d.ts +21 -0
- node_ui/node_modules/type-fest/source/if-any.d.ts +24 -0
- node_ui/node_modules/type-fest/source/if-empty-object.d.ts +26 -0
- node_ui/node_modules/type-fest/source/if-never.d.ts +24 -0
- node_ui/node_modules/type-fest/source/if-null.d.ts +24 -0
- node_ui/node_modules/type-fest/source/if-unknown.d.ts +24 -0
- node_ui/node_modules/type-fest/source/includes.d.ts +22 -0
- node_ui/node_modules/type-fest/source/int-closed-range.d.ts +35 -0
- node_ui/node_modules/type-fest/source/int-range.d.ts +55 -0
- node_ui/node_modules/type-fest/source/internal/array.d.ts +126 -0
- node_ui/node_modules/type-fest/source/internal/characters.d.ts +67 -0
- node_ui/node_modules/type-fest/source/internal/index.d.ts +8 -0
- node_ui/node_modules/type-fest/source/internal/keys.d.ts +97 -0
- node_ui/node_modules/type-fest/source/internal/numeric.d.ts +118 -0
- node_ui/node_modules/type-fest/source/internal/object.d.ts +236 -0
- node_ui/node_modules/type-fest/source/internal/string.d.ts +210 -0
- node_ui/node_modules/type-fest/source/internal/tuple.d.ts +90 -0
- node_ui/node_modules/type-fest/source/internal/type.d.ts +139 -0
- node_ui/node_modules/type-fest/source/invariant-of.d.ts +76 -0
- node_ui/node_modules/type-fest/source/is-any.d.ts +33 -0
- node_ui/node_modules/type-fest/source/is-equal.d.ts +31 -0
- node_ui/node_modules/type-fest/source/is-float.d.ts +41 -0
- node_ui/node_modules/type-fest/source/is-integer.d.ts +58 -0
- node_ui/node_modules/type-fest/source/is-literal.d.ts +296 -0
- node_ui/node_modules/type-fest/source/is-never.d.ts +42 -0
- node_ui/node_modules/type-fest/source/is-null.d.ts +20 -0
- node_ui/node_modules/type-fest/source/is-tuple.d.ts +89 -0
- node_ui/node_modules/type-fest/source/is-unknown.d.ts +52 -0
- node_ui/node_modules/type-fest/source/iterable-element.d.ts +64 -0
- node_ui/node_modules/type-fest/source/join.d.ts +68 -0
- node_ui/node_modules/type-fest/source/jsonifiable.d.ts +37 -0
- node_ui/node_modules/type-fest/source/jsonify.d.ts +122 -0
- node_ui/node_modules/type-fest/source/kebab-case.d.ts +44 -0
- node_ui/node_modules/type-fest/source/kebab-cased-properties-deep.d.ts +63 -0
- node_ui/node_modules/type-fest/source/kebab-cased-properties.d.ts +40 -0
- node_ui/node_modules/type-fest/source/keys-of-union.d.ts +42 -0
- node_ui/node_modules/type-fest/source/last-array-element.d.ts +38 -0
- node_ui/node_modules/type-fest/source/less-than-or-equal.d.ts +22 -0
- node_ui/node_modules/type-fest/source/less-than.d.ts +26 -0
- node_ui/node_modules/type-fest/source/literal-to-primitive-deep.d.ts +36 -0
- node_ui/node_modules/type-fest/source/literal-to-primitive.d.ts +36 -0
- node_ui/node_modules/type-fest/source/literal-union.d.ts +37 -0
- node_ui/node_modules/type-fest/source/merge-deep.d.ts +486 -0
- node_ui/node_modules/type-fest/source/merge-exclusive.d.ts +41 -0
- node_ui/node_modules/type-fest/source/merge.d.ts +48 -0
- node_ui/node_modules/type-fest/source/multidimensional-array.d.ts +44 -0
- node_ui/node_modules/type-fest/source/multidimensional-readonly-array.d.ts +48 -0
- node_ui/node_modules/type-fest/source/non-empty-object.d.ts +35 -0
- node_ui/node_modules/type-fest/source/non-empty-string.d.ts +28 -0
- node_ui/node_modules/type-fest/source/non-empty-tuple.d.ts +21 -0
- node_ui/node_modules/type-fest/source/numeric.d.ts +222 -0
- node_ui/node_modules/type-fest/source/observable-like.d.ts +63 -0
- node_ui/node_modules/type-fest/source/omit-deep.d.ts +167 -0
- node_ui/node_modules/type-fest/source/omit-index-signature.d.ts +95 -0
- node_ui/node_modules/type-fest/source/opaque.d.ts +1 -0
- node_ui/node_modules/type-fest/source/optional-keys-of.d.ts +39 -0
- node_ui/node_modules/type-fest/source/or.d.ts +25 -0
- node_ui/node_modules/type-fest/source/override-properties.d.ts +36 -0
- node_ui/node_modules/type-fest/source/package-json.d.ts +676 -0
- node_ui/node_modules/type-fest/source/partial-deep.d.ts +151 -0
- node_ui/node_modules/type-fest/source/partial-on-undefined-deep.d.ts +78 -0
- node_ui/node_modules/type-fest/source/pascal-case.d.ts +42 -0
- node_ui/node_modules/type-fest/source/pascal-cased-properties-deep.d.ts +62 -0
- node_ui/node_modules/type-fest/source/pascal-cased-properties.d.ts +36 -0
- node_ui/node_modules/type-fest/source/paths.d.ts +262 -0
- node_ui/node_modules/type-fest/source/pick-deep.d.ts +149 -0
- node_ui/node_modules/type-fest/source/pick-index-signature.d.ts +50 -0
- node_ui/node_modules/type-fest/source/primitive.d.ts +13 -0
- node_ui/node_modules/type-fest/source/promisable.d.ts +25 -0
- node_ui/node_modules/type-fest/source/readonly-deep.d.ts +81 -0
- node_ui/node_modules/type-fest/source/readonly-keys-of.d.ts +30 -0
- node_ui/node_modules/type-fest/source/readonly-tuple.d.ts +41 -0
- node_ui/node_modules/type-fest/source/replace.d.ts +85 -0
- node_ui/node_modules/type-fest/source/require-all-or-none.d.ts +51 -0
- node_ui/node_modules/type-fest/source/require-at-least-one.d.ts +47 -0
- node_ui/node_modules/type-fest/source/require-exactly-one.d.ts +45 -0
- node_ui/node_modules/type-fest/source/require-one-or-none.d.ts +46 -0
- node_ui/node_modules/type-fest/source/required-deep.d.ts +78 -0
- node_ui/node_modules/type-fest/source/required-keys-of.d.ts +30 -0
- node_ui/node_modules/type-fest/source/schema.d.ts +114 -0
- node_ui/node_modules/type-fest/source/screaming-snake-case.d.ts +28 -0
- node_ui/node_modules/type-fest/source/set-field-type.d.ts +65 -0
- node_ui/node_modules/type-fest/source/set-non-nullable-deep.d.ts +83 -0
- node_ui/node_modules/type-fest/source/set-non-nullable.d.ts +39 -0
- node_ui/node_modules/type-fest/source/set-optional.d.ts +38 -0
- node_ui/node_modules/type-fest/source/set-parameter-type.d.ts +117 -0
- node_ui/node_modules/type-fest/source/set-readonly.d.ts +39 -0
- node_ui/node_modules/type-fest/source/set-required-deep.d.ts +68 -0
- node_ui/node_modules/type-fest/source/set-required.d.ts +70 -0
- node_ui/node_modules/type-fest/source/set-return-type.d.ts +29 -0
- node_ui/node_modules/type-fest/source/shared-union-fields-deep.d.ts +178 -0
- node_ui/node_modules/type-fest/source/shared-union-fields.d.ts +76 -0
- node_ui/node_modules/type-fest/source/simplify-deep.d.ts +115 -0
- node_ui/node_modules/type-fest/source/simplify.d.ts +58 -0
- node_ui/node_modules/type-fest/source/single-key-object.d.ts +29 -0
- node_ui/node_modules/type-fest/source/snake-case.d.ts +45 -0
- node_ui/node_modules/type-fest/source/snake-cased-properties-deep.d.ts +63 -0
- node_ui/node_modules/type-fest/source/snake-cased-properties.d.ts +40 -0
- node_ui/node_modules/type-fest/source/split.d.ts +88 -0
- node_ui/node_modules/type-fest/source/spread.d.ts +84 -0
- node_ui/node_modules/type-fest/source/string-key-of.d.ts +25 -0
- node_ui/node_modules/type-fest/source/string-repeat.d.ts +47 -0
- node_ui/node_modules/type-fest/source/string-slice.d.ts +37 -0
- node_ui/node_modules/type-fest/source/stringified.d.ts +23 -0
- node_ui/node_modules/type-fest/source/structured-cloneable.d.ts +92 -0
- node_ui/node_modules/type-fest/source/subtract.d.ts +83 -0
- node_ui/node_modules/type-fest/source/sum.d.ts +78 -0
- node_ui/node_modules/type-fest/source/tagged-union.d.ts +51 -0
- node_ui/node_modules/type-fest/source/tagged.d.ts +256 -0
- node_ui/node_modules/type-fest/source/trim.d.ts +27 -0
- node_ui/node_modules/type-fest/source/tsconfig-json.d.ts +1294 -0
- node_ui/node_modules/type-fest/source/tuple-to-object.d.ts +42 -0
- node_ui/node_modules/type-fest/source/tuple-to-union.d.ts +51 -0
- node_ui/node_modules/type-fest/source/typed-array.d.ts +17 -0
- node_ui/node_modules/type-fest/source/undefined-on-partial-deep.d.ts +80 -0
- node_ui/node_modules/type-fest/source/union-to-intersection.d.ts +61 -0
- node_ui/node_modules/type-fest/source/union-to-tuple.d.ts +56 -0
- node_ui/node_modules/type-fest/source/unknown-array.d.ts +25 -0
- node_ui/node_modules/type-fest/source/unknown-map.d.ts +24 -0
- node_ui/node_modules/type-fest/source/unknown-record.d.ts +31 -0
- node_ui/node_modules/type-fest/source/unknown-set.d.ts +24 -0
- node_ui/node_modules/type-fest/source/value-of.d.ts +42 -0
- node_ui/node_modules/type-fest/source/words.d.ts +118 -0
- node_ui/node_modules/type-fest/source/writable-deep.d.ts +83 -0
- node_ui/node_modules/type-fest/source/writable-keys-of.d.ts +33 -0
- node_ui/node_modules/type-fest/source/writable.d.ts +68 -0
- node_ui/node_modules/widest-line/index.d.ts +12 -0
- node_ui/node_modules/widest-line/index.js +11 -0
- node_ui/node_modules/widest-line/license +9 -0
- node_ui/node_modules/widest-line/package.json +60 -0
- node_ui/node_modules/widest-line/readme.md +26 -0
- node_ui/node_modules/wrap-ansi/index.d.ts +41 -0
- node_ui/node_modules/wrap-ansi/index.js +222 -0
- node_ui/node_modules/wrap-ansi/license +9 -0
- node_ui/node_modules/wrap-ansi/package.json +69 -0
- node_ui/node_modules/wrap-ansi/readme.md +75 -0
- node_ui/node_modules/ws/LICENSE +20 -0
- node_ui/node_modules/ws/README.md +548 -0
- node_ui/node_modules/ws/browser.js +8 -0
- node_ui/node_modules/ws/index.js +13 -0
- node_ui/node_modules/ws/lib/buffer-util.js +131 -0
- node_ui/node_modules/ws/lib/constants.js +18 -0
- node_ui/node_modules/ws/lib/event-target.js +292 -0
- node_ui/node_modules/ws/lib/extension.js +203 -0
- node_ui/node_modules/ws/lib/limiter.js +55 -0
- node_ui/node_modules/ws/lib/permessage-deflate.js +528 -0
- node_ui/node_modules/ws/lib/receiver.js +706 -0
- node_ui/node_modules/ws/lib/sender.js +602 -0
- node_ui/node_modules/ws/lib/stream.js +161 -0
- node_ui/node_modules/ws/lib/subprotocol.js +62 -0
- node_ui/node_modules/ws/lib/validation.js +152 -0
- node_ui/node_modules/ws/lib/websocket-server.js +550 -0
- node_ui/node_modules/ws/lib/websocket.js +1388 -0
- node_ui/node_modules/ws/package.json +69 -0
- node_ui/node_modules/ws/wrapper.mjs +8 -0
- node_ui/node_modules/yoga-wasm-web/LICENSE +21 -0
- node_ui/node_modules/yoga-wasm-web/README.md +70 -0
- node_ui/node_modules/yoga-wasm-web/dist/asm.d.ts +6 -0
- node_ui/node_modules/yoga-wasm-web/dist/asm.js +1 -0
- node_ui/node_modules/yoga-wasm-web/dist/auto.d.ts +7 -0
- node_ui/node_modules/yoga-wasm-web/dist/browser.js +1 -0
- node_ui/node_modules/yoga-wasm-web/dist/generated/YGEnums.d.ts +328 -0
- node_ui/node_modules/yoga-wasm-web/dist/index.d.ts +7 -0
- node_ui/node_modules/yoga-wasm-web/dist/index.js +1 -0
- node_ui/node_modules/yoga-wasm-web/dist/node.js +1 -0
- node_ui/node_modules/yoga-wasm-web/dist/wrapAsm-57389177.js +1 -0
- node_ui/node_modules/yoga-wasm-web/dist/wrapAsm-f766f97f.js +1 -0
- node_ui/node_modules/yoga-wasm-web/dist/wrapAsm.d.ts +176 -0
- node_ui/node_modules/yoga-wasm-web/dist/yoga.wasm +0 -0
- node_ui/node_modules/yoga-wasm-web/package.json +56 -0
- 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()
|