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,1741 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
find-claude-session: Search Claude Code session files by keywords
|
|
4
|
+
|
|
5
|
+
Usage:
|
|
6
|
+
find-claude-session "keyword1,keyword2,keyword3..." [-g/--global]
|
|
7
|
+
|
|
8
|
+
This tool searches for Claude Code session JSONL files that contain ALL specified keywords,
|
|
9
|
+
and returns matching session IDs in reverse chronological order.
|
|
10
|
+
|
|
11
|
+
With -g/--global flag, searches across all Claude projects, not just the current one.
|
|
12
|
+
|
|
13
|
+
For the directory change to persist, use the shell function:
|
|
14
|
+
fcs() { eval $(find-claude-session --shell "$@"); }
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
import json
|
|
19
|
+
import os
|
|
20
|
+
import re
|
|
21
|
+
import shlex
|
|
22
|
+
import sys
|
|
23
|
+
import time
|
|
24
|
+
import termios
|
|
25
|
+
import tty
|
|
26
|
+
from datetime import datetime
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import List, Set, Tuple, Optional
|
|
29
|
+
|
|
30
|
+
from claude_code_tools.session_menu import (
|
|
31
|
+
show_action_menu as menu_show_action_menu,
|
|
32
|
+
show_resume_submenu as menu_show_resume_submenu,
|
|
33
|
+
prompt_suppress_options as menu_prompt_suppress_options,
|
|
34
|
+
)
|
|
35
|
+
from claude_code_tools.node_menu_ui import run_node_menu_ui, run_find_options_ui
|
|
36
|
+
from claude_code_tools.trim_session import (
|
|
37
|
+
trim_and_create_session,
|
|
38
|
+
is_trimmed_session,
|
|
39
|
+
get_session_derivation_type,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def get_session_start_timestamp(jsonl_file: Path) -> Optional[float]:
|
|
44
|
+
"""Extract session start timestamp from first entry with timestamp field.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
jsonl_file: Path to Claude session JSONL file
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
Unix timestamp as float, or None if not found
|
|
51
|
+
"""
|
|
52
|
+
try:
|
|
53
|
+
with open(jsonl_file, "r", encoding="utf-8") as f:
|
|
54
|
+
for i, line in enumerate(f):
|
|
55
|
+
if i >= 10: # Only check first 10 lines
|
|
56
|
+
break
|
|
57
|
+
line = line.strip()
|
|
58
|
+
if not line:
|
|
59
|
+
continue
|
|
60
|
+
try:
|
|
61
|
+
data = json.loads(line)
|
|
62
|
+
if data.get("timestamp"):
|
|
63
|
+
ts = data["timestamp"]
|
|
64
|
+
# Parse ISO format (e.g., "2025-10-22T16:05:28.707Z")
|
|
65
|
+
if ts.endswith("Z"):
|
|
66
|
+
ts = ts[:-1] + "+00:00"
|
|
67
|
+
return datetime.fromisoformat(ts).timestamp()
|
|
68
|
+
except (json.JSONDecodeError, ValueError, TypeError):
|
|
69
|
+
continue
|
|
70
|
+
except (OSError, IOError):
|
|
71
|
+
pass
|
|
72
|
+
return None
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _read_key() -> str:
|
|
76
|
+
"""Read a single keypress (Enter/Esc)."""
|
|
77
|
+
fd = sys.stdin.fileno()
|
|
78
|
+
old = termios.tcgetattr(fd)
|
|
79
|
+
try:
|
|
80
|
+
tty.setcbreak(fd)
|
|
81
|
+
ch = sys.stdin.read(1)
|
|
82
|
+
finally:
|
|
83
|
+
termios.tcsetattr(fd, termios.TCSADRAIN, old)
|
|
84
|
+
return ch
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def prompt_post_action() -> str:
|
|
88
|
+
"""After non-launch actions: Enter exits, Esc returns to menu."""
|
|
89
|
+
print("\n[Action complete] Press Enter to exit, or Esc to return to menu", file=sys.stderr)
|
|
90
|
+
ch = _read_key()
|
|
91
|
+
if ch == "\x1b":
|
|
92
|
+
return "back"
|
|
93
|
+
return "exit"
|
|
94
|
+
|
|
95
|
+
# Try to import TUI - it's optional
|
|
96
|
+
try:
|
|
97
|
+
from claude_code_tools.session_tui import run_session_tui
|
|
98
|
+
TUI_AVAILABLE = True
|
|
99
|
+
except ImportError:
|
|
100
|
+
TUI_AVAILABLE = False
|
|
101
|
+
from claude_code_tools.smart_trim_core import identify_trimmable_lines_cli
|
|
102
|
+
from claude_code_tools.smart_trim import trim_lines
|
|
103
|
+
from claude_code_tools.session_utils import (
|
|
104
|
+
get_claude_home,
|
|
105
|
+
encode_claude_project_path,
|
|
106
|
+
is_valid_session,
|
|
107
|
+
is_malformed_session,
|
|
108
|
+
extract_cwd_from_session,
|
|
109
|
+
format_session_id_display,
|
|
110
|
+
filter_sessions_by_time,
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
try:
|
|
114
|
+
from rich.console import Console
|
|
115
|
+
from rich.table import Table
|
|
116
|
+
from rich.prompt import Prompt, Confirm
|
|
117
|
+
from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
118
|
+
from rich import box
|
|
119
|
+
RICH_AVAILABLE = True
|
|
120
|
+
except ImportError:
|
|
121
|
+
RICH_AVAILABLE = False
|
|
122
|
+
|
|
123
|
+
console = Console() if RICH_AVAILABLE else None
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def get_claude_project_dir(claude_home: Optional[str] = None) -> Path:
|
|
127
|
+
"""Convert current working directory to Claude project directory path."""
|
|
128
|
+
cwd = os.getcwd()
|
|
129
|
+
|
|
130
|
+
# Use provided claude_home, CLAUDE_CONFIG_DIR env var, or default to ~/.claude
|
|
131
|
+
base_dir = get_claude_home(claude_home)
|
|
132
|
+
|
|
133
|
+
# Encode path to match Claude's directory naming convention
|
|
134
|
+
project_path = encode_claude_project_path(cwd)
|
|
135
|
+
claude_dir = base_dir / "projects" / project_path
|
|
136
|
+
return claude_dir
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def get_all_claude_projects(claude_home: Optional[str] = None) -> List[Tuple[Path, str]]:
|
|
140
|
+
"""Get all Claude project directories with their original paths."""
|
|
141
|
+
# Use provided claude_home, CLAUDE_CONFIG_DIR env var, or default to ~/.claude
|
|
142
|
+
base_dir = get_claude_home(claude_home)
|
|
143
|
+
|
|
144
|
+
projects_dir = base_dir / "projects"
|
|
145
|
+
|
|
146
|
+
if not projects_dir.exists():
|
|
147
|
+
return []
|
|
148
|
+
|
|
149
|
+
projects = []
|
|
150
|
+
for project_dir in projects_dir.iterdir():
|
|
151
|
+
if project_dir.is_dir():
|
|
152
|
+
# Convert back from Claude's naming to original path
|
|
153
|
+
# Claude's pattern: -Users-username-path-to-project
|
|
154
|
+
# where only path separators (/) are replaced with -
|
|
155
|
+
dir_name = project_dir.name
|
|
156
|
+
|
|
157
|
+
# Split by - but need to be smart about it
|
|
158
|
+
# Pattern is like: -Users-pchalasani-Git-project-name
|
|
159
|
+
# We need to identify which hyphens are path separators vs part of names
|
|
160
|
+
|
|
161
|
+
# Most reliable approach: use known path patterns
|
|
162
|
+
if dir_name.startswith("-Users-"):
|
|
163
|
+
# macOS path
|
|
164
|
+
parts = dir_name[1:].split("-")
|
|
165
|
+
# Reconstruct, assuming first few parts are the path
|
|
166
|
+
# Pattern: Users/username/...
|
|
167
|
+
if len(parts) >= 2:
|
|
168
|
+
# Try to reconstruct the path
|
|
169
|
+
# We know it starts with /Users/username
|
|
170
|
+
original_path = "/" + parts[0] + "/" + parts[1]
|
|
171
|
+
|
|
172
|
+
# For the rest, we need to be careful
|
|
173
|
+
# Common patterns: /Users/username/Git/project-name
|
|
174
|
+
remaining = "-".join(parts[2:])
|
|
175
|
+
|
|
176
|
+
# Check for common directories
|
|
177
|
+
if remaining.startswith("Git-"):
|
|
178
|
+
original_path += "/Git/" + remaining[4:]
|
|
179
|
+
elif remaining:
|
|
180
|
+
# Just append the rest as is
|
|
181
|
+
original_path += "/" + remaining
|
|
182
|
+
else:
|
|
183
|
+
original_path = "/" + dir_name[1:].replace("-", "/")
|
|
184
|
+
elif dir_name.startswith("-home-"):
|
|
185
|
+
# Linux path
|
|
186
|
+
original_path = "/" + dir_name[1:].replace("-", "/")
|
|
187
|
+
else:
|
|
188
|
+
# Unknown pattern, best guess
|
|
189
|
+
original_path = "/" + dir_name.replace("-", "/")
|
|
190
|
+
|
|
191
|
+
projects.append((project_dir, original_path))
|
|
192
|
+
|
|
193
|
+
return projects
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def extract_project_name(original_path: str) -> str:
|
|
197
|
+
"""Extract a readable project name from the original path."""
|
|
198
|
+
# Get the last component of the path as the project name
|
|
199
|
+
parts = original_path.rstrip("/").split("/")
|
|
200
|
+
return parts[-1] if parts else "unknown"
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
"""
|
|
204
|
+
Check if all keywords are present in the JSONL file, count lines, and extract git branch.
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
filepath: Path to the JSONL file
|
|
208
|
+
keywords: List of keywords to search for (case-insensitive). Empty list matches all files.
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
Tuple of (matches: bool, line_count: int, git_branch: Optional[str])
|
|
212
|
+
- matches: True if ALL keywords are found in the file (or True if no keywords)
|
|
213
|
+
- line_count: Total number of lines in the file
|
|
214
|
+
- git_branch: Git branch name from the first message that has it, or None
|
|
215
|
+
"""
|
|
216
|
+
# If no keywords, match all files
|
|
217
|
+
if not keywords:
|
|
218
|
+
msg_count = 0
|
|
219
|
+
git_branch = None
|
|
220
|
+
try:
|
|
221
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
222
|
+
for line in f:
|
|
223
|
+
try:
|
|
224
|
+
data = json.loads(line.strip())
|
|
225
|
+
# Only count user/assistant messages
|
|
226
|
+
if data.get('type') in ('user', 'assistant'):
|
|
227
|
+
msg_count += 1
|
|
228
|
+
# Extract git branch from JSON if not already found
|
|
229
|
+
if git_branch is None:
|
|
230
|
+
if 'gitBranch' in data and data['gitBranch']:
|
|
231
|
+
git_branch = data['gitBranch']
|
|
232
|
+
except (json.JSONDecodeError, KeyError):
|
|
233
|
+
pass
|
|
234
|
+
except Exception:
|
|
235
|
+
return False, 0, None
|
|
236
|
+
return True, msg_count, git_branch
|
|
237
|
+
|
|
238
|
+
# Convert keywords to lowercase for case-insensitive search
|
|
239
|
+
keywords_lower = [k.lower() for k in keywords]
|
|
240
|
+
found_keywords = set()
|
|
241
|
+
msg_count = 0
|
|
242
|
+
git_branch = None
|
|
243
|
+
|
|
244
|
+
try:
|
|
245
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
246
|
+
for line in f:
|
|
247
|
+
line_lower = line.lower()
|
|
248
|
+
|
|
249
|
+
try:
|
|
250
|
+
data = json.loads(line.strip())
|
|
251
|
+
# Only count user/assistant messages
|
|
252
|
+
if data.get('type') in ('user', 'assistant'):
|
|
253
|
+
msg_count += 1
|
|
254
|
+
# Extract git branch from JSON if not already found
|
|
255
|
+
if git_branch is None:
|
|
256
|
+
if 'gitBranch' in data and data['gitBranch']:
|
|
257
|
+
git_branch = data['gitBranch']
|
|
258
|
+
except (json.JSONDecodeError, KeyError):
|
|
259
|
+
pass
|
|
260
|
+
|
|
261
|
+
# Check which keywords are in this line (search all lines)
|
|
262
|
+
for keyword in keywords_lower:
|
|
263
|
+
if keyword in line_lower:
|
|
264
|
+
found_keywords.add(keyword)
|
|
265
|
+
except Exception:
|
|
266
|
+
# Skip files that can't be read
|
|
267
|
+
return False, 0, None
|
|
268
|
+
|
|
269
|
+
matches = len(found_keywords) == len(keywords_lower)
|
|
270
|
+
return matches, msg_count, git_branch
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def is_system_message(text: str) -> bool:
|
|
274
|
+
"""Check if text is system-generated (XML tags, env context, etc)"""
|
|
275
|
+
if not text or len(text.strip()) < 5:
|
|
276
|
+
return True
|
|
277
|
+
text = text.strip()
|
|
278
|
+
# Check for XML-like tags (user_instructions, environment_context, etc)
|
|
279
|
+
if text.startswith("<") and ">" in text[:100]:
|
|
280
|
+
return True
|
|
281
|
+
return False
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
def is_sidechain_session(filepath: Path) -> bool:
|
|
285
|
+
"""
|
|
286
|
+
Check if a session file is a sidechain (sub-agent) session.
|
|
287
|
+
|
|
288
|
+
Sidechain sessions are created when launching sub-agents via the Task tool
|
|
289
|
+
and cannot be resumed directly.
|
|
290
|
+
|
|
291
|
+
Args:
|
|
292
|
+
filepath: Path to session JSONL file.
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
True if session is a sidechain, False otherwise.
|
|
296
|
+
"""
|
|
297
|
+
if not filepath.exists():
|
|
298
|
+
return False
|
|
299
|
+
|
|
300
|
+
try:
|
|
301
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
302
|
+
# Check first few lines for isSidechain field
|
|
303
|
+
for i, line in enumerate(f):
|
|
304
|
+
if i >= 10: # Only check first 10 lines
|
|
305
|
+
break
|
|
306
|
+
try:
|
|
307
|
+
data = json.loads(line.strip())
|
|
308
|
+
if "isSidechain" in data:
|
|
309
|
+
return data["isSidechain"] is True
|
|
310
|
+
except (json.JSONDecodeError, KeyError):
|
|
311
|
+
continue
|
|
312
|
+
except (OSError, IOError):
|
|
313
|
+
pass
|
|
314
|
+
|
|
315
|
+
return False
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def search_keywords_in_file(filepath: Path, keywords: List[str]) -> tuple[bool, int, Optional[str]]:
|
|
319
|
+
"""
|
|
320
|
+
Check if all keywords are present in the JSONL file, count lines, and extract git branch.
|
|
321
|
+
|
|
322
|
+
Args:
|
|
323
|
+
filepath: Path to the JSONL file
|
|
324
|
+
keywords: List of keywords to search for (case-insensitive). Empty list matches all files.
|
|
325
|
+
|
|
326
|
+
Returns:
|
|
327
|
+
Tuple of (matches: bool, line_count: int, git_branch: Optional[str])
|
|
328
|
+
- matches: True if ALL keywords are found in the file (or True if no keywords)
|
|
329
|
+
- line_count: Total number of lines in the file
|
|
330
|
+
- git_branch: Git branch name from the first message that has it, or None
|
|
331
|
+
"""
|
|
332
|
+
# If no keywords, match all files
|
|
333
|
+
if not keywords:
|
|
334
|
+
msg_count = 0
|
|
335
|
+
git_branch = None
|
|
336
|
+
try:
|
|
337
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
338
|
+
for line in f:
|
|
339
|
+
try:
|
|
340
|
+
data = json.loads(line.strip())
|
|
341
|
+
# Only count user/assistant messages
|
|
342
|
+
if data.get('type') in ('user', 'assistant'):
|
|
343
|
+
msg_count += 1
|
|
344
|
+
# Extract git branch from JSON if not already found
|
|
345
|
+
if git_branch is None:
|
|
346
|
+
if 'gitBranch' in data and data['gitBranch']:
|
|
347
|
+
git_branch = data['gitBranch']
|
|
348
|
+
except (json.JSONDecodeError, KeyError):
|
|
349
|
+
pass
|
|
350
|
+
except Exception:
|
|
351
|
+
return False, 0, None
|
|
352
|
+
return True, msg_count, git_branch
|
|
353
|
+
|
|
354
|
+
# Convert keywords to lowercase for case-insensitive search
|
|
355
|
+
keywords_lower = [k.lower() for k in keywords]
|
|
356
|
+
found_keywords = set()
|
|
357
|
+
msg_count = 0
|
|
358
|
+
git_branch = None
|
|
359
|
+
|
|
360
|
+
try:
|
|
361
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
362
|
+
for line in f:
|
|
363
|
+
line_lower = line.lower()
|
|
364
|
+
|
|
365
|
+
try:
|
|
366
|
+
data = json.loads(line.strip())
|
|
367
|
+
# Only count user/assistant messages
|
|
368
|
+
if data.get('type') in ('user', 'assistant'):
|
|
369
|
+
msg_count += 1
|
|
370
|
+
# Extract git branch from JSON if not already found
|
|
371
|
+
if git_branch is None:
|
|
372
|
+
if 'gitBranch' in data and data['gitBranch']:
|
|
373
|
+
git_branch = data['gitBranch']
|
|
374
|
+
except (json.JSONDecodeError, KeyError):
|
|
375
|
+
pass
|
|
376
|
+
|
|
377
|
+
# Check which keywords are in this line (search all lines)
|
|
378
|
+
for keyword in keywords_lower:
|
|
379
|
+
if keyword in line_lower:
|
|
380
|
+
found_keywords.add(keyword)
|
|
381
|
+
except Exception:
|
|
382
|
+
# Skip files that can't be read
|
|
383
|
+
return False, 0, None
|
|
384
|
+
|
|
385
|
+
matches = len(found_keywords) == len(keywords_lower)
|
|
386
|
+
return matches, msg_count, git_branch
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
def get_session_preview(filepath: Path) -> str:
|
|
390
|
+
"""Get a preview of the session from the LAST message of any type."""
|
|
391
|
+
last_message = None # Tuple of (type_prefix, content)
|
|
392
|
+
|
|
393
|
+
try:
|
|
394
|
+
with open(filepath, 'r', encoding='utf-8') as f:
|
|
395
|
+
for line in f:
|
|
396
|
+
try:
|
|
397
|
+
data = json.loads(line.strip())
|
|
398
|
+
msg_type = data.get('type')
|
|
399
|
+
# Accept user or assistant messages
|
|
400
|
+
if msg_type in ('user', 'assistant'):
|
|
401
|
+
message = data.get('message', {})
|
|
402
|
+
content = message.get('content', '')
|
|
403
|
+
text = None
|
|
404
|
+
|
|
405
|
+
if isinstance(content, str):
|
|
406
|
+
text = content.strip()
|
|
407
|
+
elif isinstance(content, list):
|
|
408
|
+
# Handle structured content
|
|
409
|
+
for item in content:
|
|
410
|
+
if isinstance(item, dict) and item.get('type') == 'text':
|
|
411
|
+
text = item.get('text', '').strip()
|
|
412
|
+
break
|
|
413
|
+
|
|
414
|
+
# Filter out system messages and keep updating to get LAST
|
|
415
|
+
if text and not is_system_message(text):
|
|
416
|
+
cleaned = text.replace('\n', ' ')[:400]
|
|
417
|
+
type_prefix = f"[{msg_type}]"
|
|
418
|
+
# Prefer substantial messages (>20 chars)
|
|
419
|
+
if len(cleaned) > 20:
|
|
420
|
+
last_message = (type_prefix, cleaned)
|
|
421
|
+
elif last_message is None:
|
|
422
|
+
last_message = (type_prefix, cleaned)
|
|
423
|
+
|
|
424
|
+
except (json.JSONDecodeError, KeyError):
|
|
425
|
+
continue
|
|
426
|
+
except Exception:
|
|
427
|
+
pass
|
|
428
|
+
|
|
429
|
+
if last_message:
|
|
430
|
+
return f"{last_message[0]} {last_message[1]}"
|
|
431
|
+
return "No preview available"
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
def find_sessions(
|
|
435
|
+
keywords: List[str],
|
|
436
|
+
global_search: bool = False,
|
|
437
|
+
claude_home: Optional[str] = None,
|
|
438
|
+
original_only: bool = False,
|
|
439
|
+
no_sub: bool = False,
|
|
440
|
+
no_trim: bool = False,
|
|
441
|
+
no_cont: bool = False,
|
|
442
|
+
) -> List[Tuple[str, float, float, int, str, str, str, Optional[str], bool]]:
|
|
443
|
+
"""
|
|
444
|
+
Find all Claude Code sessions containing the specified keywords.
|
|
445
|
+
|
|
446
|
+
Args:
|
|
447
|
+
keywords: List of keywords to search for
|
|
448
|
+
global_search: If True, search all projects; if False, search current project only
|
|
449
|
+
claude_home: Optional custom Claude home directory (defaults to ~/.claude)
|
|
450
|
+
original_only: If True, show only original sessions (excludes trimmed, rollover, and sub-agent sessions)
|
|
451
|
+
no_sub: If True, exclude sub-agent sessions
|
|
452
|
+
no_trim: If True, exclude trimmed sessions
|
|
453
|
+
no_cont: If True, exclude rollover sessions (internally "continued")
|
|
454
|
+
|
|
455
|
+
Returns:
|
|
456
|
+
List of tuples (session_id, modification_time, creation_time, line_count, project_name, preview, project_path, git_branch, is_trimmed) sorted by modification time
|
|
457
|
+
"""
|
|
458
|
+
matching_sessions = []
|
|
459
|
+
|
|
460
|
+
if global_search:
|
|
461
|
+
# Search all projects
|
|
462
|
+
projects = get_all_claude_projects(claude_home)
|
|
463
|
+
|
|
464
|
+
if RICH_AVAILABLE and console:
|
|
465
|
+
with Progress(
|
|
466
|
+
SpinnerColumn(),
|
|
467
|
+
TextColumn("[progress.description]{task.description}"),
|
|
468
|
+
console=console,
|
|
469
|
+
transient=True
|
|
470
|
+
) as progress:
|
|
471
|
+
task = progress.add_task(f"Searching {len(projects)} projects...", total=len(projects))
|
|
472
|
+
|
|
473
|
+
for project_dir, original_path in projects:
|
|
474
|
+
project_name = extract_project_name(original_path)
|
|
475
|
+
progress.update(task, description=f"Searching {project_name}...")
|
|
476
|
+
|
|
477
|
+
# Search all JSONL files in this project directory
|
|
478
|
+
for jsonl_file in project_dir.glob("*.jsonl"):
|
|
479
|
+
matches, line_count, git_branch = search_keywords_in_file(jsonl_file, keywords)
|
|
480
|
+
if matches:
|
|
481
|
+
# Skip malformed sessions (missing metadata, cannot resume)
|
|
482
|
+
if is_malformed_session(jsonl_file):
|
|
483
|
+
continue
|
|
484
|
+
|
|
485
|
+
# Check if session is trimmed/continued
|
|
486
|
+
is_trimmed = is_trimmed_session(jsonl_file)
|
|
487
|
+
derivation_type = get_session_derivation_type(jsonl_file) if is_trimmed else None
|
|
488
|
+
|
|
489
|
+
# Check if session is sidechain (sub-agent)
|
|
490
|
+
is_sidechain = is_sidechain_session(jsonl_file)
|
|
491
|
+
|
|
492
|
+
# Apply filters (original_only overrides individual filters)
|
|
493
|
+
if original_only:
|
|
494
|
+
# Original only: exclude trimmed, continued, and sub-agents
|
|
495
|
+
if is_trimmed or is_sidechain:
|
|
496
|
+
continue
|
|
497
|
+
else:
|
|
498
|
+
# Individual filters
|
|
499
|
+
if no_sub and is_sidechain:
|
|
500
|
+
continue
|
|
501
|
+
if no_trim and derivation_type == "trimmed":
|
|
502
|
+
continue
|
|
503
|
+
if no_cont and derivation_type == "continued":
|
|
504
|
+
continue
|
|
505
|
+
|
|
506
|
+
session_id = jsonl_file.stem
|
|
507
|
+
stat = jsonl_file.stat()
|
|
508
|
+
mod_time = stat.st_mtime
|
|
509
|
+
# Get session start timestamp from JSON metadata, fall back to file stats
|
|
510
|
+
create_time = get_session_start_timestamp(jsonl_file)
|
|
511
|
+
if create_time is None:
|
|
512
|
+
create_time = getattr(stat, 'st_birthtime', stat.st_ctime)
|
|
513
|
+
preview = get_session_preview(jsonl_file)
|
|
514
|
+
# Extract actual cwd from session file - MUST NOT use reconstructed path as fallback
|
|
515
|
+
actual_cwd = extract_cwd_from_session(jsonl_file)
|
|
516
|
+
if not actual_cwd:
|
|
517
|
+
# Skip sessions without cwd metadata (shouldn't happen for valid Claude sessions)
|
|
518
|
+
continue
|
|
519
|
+
matching_sessions.append((session_id, mod_time, create_time, line_count, project_name, preview, actual_cwd, git_branch, derivation_type, is_sidechain))
|
|
520
|
+
|
|
521
|
+
progress.advance(task)
|
|
522
|
+
else:
|
|
523
|
+
# Fallback without rich
|
|
524
|
+
for project_dir, original_path in projects:
|
|
525
|
+
project_name = extract_project_name(original_path)
|
|
526
|
+
|
|
527
|
+
for jsonl_file in project_dir.glob("*.jsonl"):
|
|
528
|
+
matches, line_count, git_branch = search_keywords_in_file(jsonl_file, keywords)
|
|
529
|
+
if matches:
|
|
530
|
+
# Skip malformed sessions (missing metadata, cannot resume)
|
|
531
|
+
if is_malformed_session(jsonl_file):
|
|
532
|
+
continue
|
|
533
|
+
|
|
534
|
+
# Check if session is trimmed/continued
|
|
535
|
+
is_trimmed = is_trimmed_session(jsonl_file)
|
|
536
|
+
derivation_type = get_session_derivation_type(jsonl_file) if is_trimmed else None
|
|
537
|
+
|
|
538
|
+
# Check if session is sidechain (sub-agent)
|
|
539
|
+
is_sidechain = is_sidechain_session(jsonl_file)
|
|
540
|
+
|
|
541
|
+
# Apply filters (original_only overrides individual filters)
|
|
542
|
+
if original_only:
|
|
543
|
+
# Original only: exclude trimmed, continued, and sub-agents
|
|
544
|
+
if is_trimmed or is_sidechain:
|
|
545
|
+
continue
|
|
546
|
+
else:
|
|
547
|
+
# Individual filters
|
|
548
|
+
if no_sub and is_sidechain:
|
|
549
|
+
continue
|
|
550
|
+
if no_trim and derivation_type == "trimmed":
|
|
551
|
+
continue
|
|
552
|
+
if no_cont and derivation_type == "continued":
|
|
553
|
+
continue
|
|
554
|
+
|
|
555
|
+
session_id = jsonl_file.stem
|
|
556
|
+
stat = jsonl_file.stat()
|
|
557
|
+
mod_time = stat.st_mtime
|
|
558
|
+
# Get session start timestamp from JSON metadata, fall back to file stats
|
|
559
|
+
create_time = get_session_start_timestamp(jsonl_file)
|
|
560
|
+
if create_time is None:
|
|
561
|
+
create_time = getattr(stat, 'st_birthtime', stat.st_ctime)
|
|
562
|
+
preview = get_session_preview(jsonl_file)
|
|
563
|
+
# Extract actual cwd from session file - MUST NOT use reconstructed path as fallback
|
|
564
|
+
actual_cwd = extract_cwd_from_session(jsonl_file)
|
|
565
|
+
if not actual_cwd:
|
|
566
|
+
# Skip sessions without cwd metadata (shouldn't happen for valid Claude sessions)
|
|
567
|
+
continue
|
|
568
|
+
matching_sessions.append((session_id, mod_time, create_time, line_count, project_name, preview, actual_cwd, git_branch, derivation_type, is_sidechain))
|
|
569
|
+
else:
|
|
570
|
+
# Search current project only
|
|
571
|
+
claude_dir = get_claude_project_dir(claude_home)
|
|
572
|
+
|
|
573
|
+
if not claude_dir.exists():
|
|
574
|
+
return []
|
|
575
|
+
|
|
576
|
+
project_name = extract_project_name(os.getcwd())
|
|
577
|
+
|
|
578
|
+
# Search all JSONL files in the directory
|
|
579
|
+
for jsonl_file in claude_dir.glob("*.jsonl"):
|
|
580
|
+
matches, line_count, git_branch = search_keywords_in_file(jsonl_file, keywords)
|
|
581
|
+
if matches:
|
|
582
|
+
# Skip malformed sessions (missing metadata, cannot resume)
|
|
583
|
+
if is_malformed_session(jsonl_file):
|
|
584
|
+
continue
|
|
585
|
+
|
|
586
|
+
# Check if session is trimmed/continued
|
|
587
|
+
is_trimmed = is_trimmed_session(jsonl_file)
|
|
588
|
+
derivation_type = get_session_derivation_type(jsonl_file) if is_trimmed else None
|
|
589
|
+
|
|
590
|
+
# Check if session is sidechain (sub-agent)
|
|
591
|
+
is_sidechain = is_sidechain_session(jsonl_file)
|
|
592
|
+
|
|
593
|
+
# Apply filters (original_only overrides individual filters)
|
|
594
|
+
if original_only:
|
|
595
|
+
# Original only: exclude trimmed, continued, and sub-agents
|
|
596
|
+
if is_trimmed or is_sidechain:
|
|
597
|
+
continue
|
|
598
|
+
else:
|
|
599
|
+
# Individual filters
|
|
600
|
+
if no_sub and is_sidechain:
|
|
601
|
+
continue
|
|
602
|
+
if no_trim and derivation_type == "trimmed":
|
|
603
|
+
continue
|
|
604
|
+
if no_cont and derivation_type == "continued":
|
|
605
|
+
continue
|
|
606
|
+
|
|
607
|
+
session_id = jsonl_file.stem
|
|
608
|
+
stat = jsonl_file.stat()
|
|
609
|
+
mod_time = stat.st_mtime
|
|
610
|
+
# Get session start timestamp from JSON metadata, fall back to file stats
|
|
611
|
+
create_time = get_session_start_timestamp(jsonl_file)
|
|
612
|
+
if create_time is None:
|
|
613
|
+
create_time = getattr(stat, 'st_birthtime', stat.st_ctime)
|
|
614
|
+
preview = get_session_preview(jsonl_file)
|
|
615
|
+
# Extract actual cwd from session file for consistency
|
|
616
|
+
actual_cwd = extract_cwd_from_session(jsonl_file) or os.getcwd()
|
|
617
|
+
matching_sessions.append((session_id, mod_time, create_time, line_count, project_name, preview, actual_cwd, git_branch, derivation_type, is_sidechain))
|
|
618
|
+
|
|
619
|
+
# Sort by modification time (newest first)
|
|
620
|
+
matching_sessions.sort(key=lambda x: x[1], reverse=True)
|
|
621
|
+
|
|
622
|
+
return matching_sessions
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
def display_interactive_ui(sessions: List[Tuple[str, float, float, int, str, str, str, Optional[str], bool]], keywords: List[str], stderr_mode: bool = False, num_matches: int = 10) -> Optional[Tuple[str, str]]:
|
|
626
|
+
"""Display interactive UI for session selection."""
|
|
627
|
+
if not RICH_AVAILABLE:
|
|
628
|
+
return None
|
|
629
|
+
|
|
630
|
+
# Use stderr console if in stderr mode
|
|
631
|
+
ui_console = Console(file=sys.stderr) if stderr_mode else console
|
|
632
|
+
if not ui_console:
|
|
633
|
+
return None
|
|
634
|
+
|
|
635
|
+
# Limit to specified number of sessions
|
|
636
|
+
display_sessions = sessions[:num_matches]
|
|
637
|
+
|
|
638
|
+
if not display_sessions:
|
|
639
|
+
ui_console.print("[red]No sessions found[/red]")
|
|
640
|
+
return None
|
|
641
|
+
|
|
642
|
+
# Create table
|
|
643
|
+
title = f"Sessions matching: {', '.join(keywords)}" if keywords else "All sessions"
|
|
644
|
+
table = Table(
|
|
645
|
+
title=title,
|
|
646
|
+
box=box.ROUNDED,
|
|
647
|
+
show_header=True,
|
|
648
|
+
header_style="bold cyan"
|
|
649
|
+
)
|
|
650
|
+
|
|
651
|
+
table.add_column("#", style="bold yellow", width=3)
|
|
652
|
+
table.add_column("Session ID", style="dim")
|
|
653
|
+
table.add_column("Project", style="green")
|
|
654
|
+
table.add_column("Branch", style="magenta")
|
|
655
|
+
table.add_column("Date-Range", style="blue")
|
|
656
|
+
table.add_column("Lines", style="cyan", justify="right")
|
|
657
|
+
table.add_column("Last User Message", style="white", max_width=60, overflow="fold")
|
|
658
|
+
|
|
659
|
+
for idx, (session_id, mod_time, create_time, line_count, project_name, preview, _, git_branch, derivation_type, is_sidechain) in enumerate(display_sessions, 1):
|
|
660
|
+
# Format: "10/04 - 10/09 13:45"
|
|
661
|
+
create_date = datetime.fromtimestamp(create_time).strftime('%m/%d')
|
|
662
|
+
mod_date = datetime.fromtimestamp(mod_time).strftime('%m/%d %H:%M')
|
|
663
|
+
date_display = f"{create_date} - {mod_date}"
|
|
664
|
+
branch_display = git_branch if git_branch else "N/A"
|
|
665
|
+
|
|
666
|
+
# Format session ID with annotations using centralized helper
|
|
667
|
+
session_id_display = format_session_id_display(
|
|
668
|
+
session_id,
|
|
669
|
+
is_trimmed=(derivation_type == "trimmed"),
|
|
670
|
+
is_continued=(derivation_type == "continued"),
|
|
671
|
+
is_sidechain=is_sidechain,
|
|
672
|
+
truncate_length=8,
|
|
673
|
+
)
|
|
674
|
+
|
|
675
|
+
table.add_row(
|
|
676
|
+
str(idx),
|
|
677
|
+
session_id_display,
|
|
678
|
+
project_name,
|
|
679
|
+
branch_display,
|
|
680
|
+
date_display,
|
|
681
|
+
str(line_count),
|
|
682
|
+
preview
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
ui_console.print(table)
|
|
686
|
+
|
|
687
|
+
# Show footnotes if any sessions are trimmed, continued, or sidechain
|
|
688
|
+
has_trimmed = any(s[8] == "trimmed" for s in display_sessions) # derivation_type is index 8
|
|
689
|
+
has_continued = any(s[8] == "continued" for s in display_sessions)
|
|
690
|
+
has_sidechain = any(s[9] for s in display_sessions) # is_sidechain is index 9
|
|
691
|
+
if has_trimmed or has_continued or has_sidechain:
|
|
692
|
+
footnotes = []
|
|
693
|
+
if has_trimmed:
|
|
694
|
+
footnotes.append("(t) = Trimmed session")
|
|
695
|
+
if has_continued:
|
|
696
|
+
footnotes.append("(c) = Continued session")
|
|
697
|
+
if has_sidechain:
|
|
698
|
+
footnotes.append("(sub) = Sub-agent session (not directly resumable)")
|
|
699
|
+
ui_console.print("[dim]" + " | ".join(footnotes) + "[/dim]")
|
|
700
|
+
|
|
701
|
+
# Auto-select if only one result
|
|
702
|
+
if len(display_sessions) == 1:
|
|
703
|
+
ui_console.print(f"\n[yellow]Auto-selecting only match: {display_sessions[0][0][:16]}...[/yellow]")
|
|
704
|
+
return display_sessions[0]
|
|
705
|
+
|
|
706
|
+
ui_console.print("\n[bold]Select a session:[/bold]")
|
|
707
|
+
ui_console.print(f" • Enter number (1-{len(display_sessions)}) to select")
|
|
708
|
+
ui_console.print(" • Press Enter to cancel\n")
|
|
709
|
+
|
|
710
|
+
while True:
|
|
711
|
+
try:
|
|
712
|
+
# In stderr mode, we need to ensure nothing goes to stdout
|
|
713
|
+
if stderr_mode:
|
|
714
|
+
# Temporarily redirect stdout to devnull
|
|
715
|
+
old_stdout = sys.stdout
|
|
716
|
+
sys.stdout = open(os.devnull, 'w')
|
|
717
|
+
|
|
718
|
+
choice = Prompt.ask(
|
|
719
|
+
"Your choice",
|
|
720
|
+
default="",
|
|
721
|
+
show_default=False,
|
|
722
|
+
console=ui_console
|
|
723
|
+
)
|
|
724
|
+
|
|
725
|
+
# Handle empty input - cancel
|
|
726
|
+
if not choice or not choice.strip():
|
|
727
|
+
# Restore stdout first
|
|
728
|
+
if stderr_mode:
|
|
729
|
+
sys.stdout.close()
|
|
730
|
+
sys.stdout = old_stdout
|
|
731
|
+
ui_console.print("[yellow]Cancelled[/yellow]")
|
|
732
|
+
return None
|
|
733
|
+
|
|
734
|
+
# Restore stdout
|
|
735
|
+
if stderr_mode:
|
|
736
|
+
sys.stdout.close()
|
|
737
|
+
sys.stdout = old_stdout
|
|
738
|
+
|
|
739
|
+
idx = int(choice) - 1
|
|
740
|
+
if 0 <= idx < len(display_sessions):
|
|
741
|
+
session_info = display_sessions[idx]
|
|
742
|
+
return session_info # Return full session tuple
|
|
743
|
+
else:
|
|
744
|
+
ui_console.print("[red]Invalid choice. Please try again.[/red]")
|
|
745
|
+
|
|
746
|
+
except KeyboardInterrupt:
|
|
747
|
+
# Restore stdout if needed
|
|
748
|
+
if stderr_mode and sys.stdout != old_stdout:
|
|
749
|
+
sys.stdout.close()
|
|
750
|
+
sys.stdout = old_stdout
|
|
751
|
+
ui_console.print("\n[yellow]Cancelled[/yellow]")
|
|
752
|
+
return None
|
|
753
|
+
except EOFError:
|
|
754
|
+
# Restore stdout if needed
|
|
755
|
+
if stderr_mode and sys.stdout != old_stdout:
|
|
756
|
+
sys.stdout.close()
|
|
757
|
+
sys.stdout = old_stdout
|
|
758
|
+
ui_console.print("\n[yellow]Cancelled (EOF)[/yellow]")
|
|
759
|
+
return None
|
|
760
|
+
except ValueError:
|
|
761
|
+
ui_console.print("[red]Invalid choice. Please try again.[/red]")
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
def show_resume_submenu() -> Optional[str]:
|
|
765
|
+
"""Show resume options submenu."""
|
|
766
|
+
return menu_show_resume_submenu(stderr_mode=False)
|
|
767
|
+
|
|
768
|
+
|
|
769
|
+
def prompt_suppress_options() -> Optional[Tuple[Optional[str], int, Optional[int]]]:
|
|
770
|
+
"""
|
|
771
|
+
Prompt user for suppress-tool-results options.
|
|
772
|
+
|
|
773
|
+
Returns:
|
|
774
|
+
Tuple of (tools, threshold, trim_assistant_messages) or None if cancelled
|
|
775
|
+
"""
|
|
776
|
+
return menu_prompt_suppress_options(stderr_mode=False)
|
|
777
|
+
|
|
778
|
+
|
|
779
|
+
def extract_first_user_message_claude(session_file: Path) -> str:
|
|
780
|
+
"""Extract first user message from Claude session file."""
|
|
781
|
+
with open(session_file, "r") as f:
|
|
782
|
+
for line in f:
|
|
783
|
+
try:
|
|
784
|
+
data = json.loads(line)
|
|
785
|
+
except json.JSONDecodeError:
|
|
786
|
+
continue
|
|
787
|
+
|
|
788
|
+
if data.get("type") == "user":
|
|
789
|
+
content = data.get("message", {}).get("content")
|
|
790
|
+
if isinstance(content, str):
|
|
791
|
+
return content
|
|
792
|
+
elif isinstance(content, list):
|
|
793
|
+
for item in content:
|
|
794
|
+
if isinstance(item, dict) and item.get("type") == "text":
|
|
795
|
+
return item.get("text", "")
|
|
796
|
+
|
|
797
|
+
return "Suppressed session"
|
|
798
|
+
|
|
799
|
+
|
|
800
|
+
def handle_suppress_resume_claude(
|
|
801
|
+
session_id: str,
|
|
802
|
+
project_path: str,
|
|
803
|
+
tools: Optional[str],
|
|
804
|
+
threshold: int,
|
|
805
|
+
trim_assistant_messages: Optional[int] = None,
|
|
806
|
+
claude_home: Optional[str] = None,
|
|
807
|
+
) -> str | None:
|
|
808
|
+
"""
|
|
809
|
+
Suppress tool results and resume Claude Code session.
|
|
810
|
+
|
|
811
|
+
Returns:
|
|
812
|
+
'back' if user wants to go back to menu, None otherwise.
|
|
813
|
+
"""
|
|
814
|
+
session_file = Path(get_session_file_path(session_id, project_path, claude_home))
|
|
815
|
+
|
|
816
|
+
print(f"\n🔧 Trimming session...")
|
|
817
|
+
|
|
818
|
+
# Parse tools into set if provided
|
|
819
|
+
target_tools = None
|
|
820
|
+
if tools:
|
|
821
|
+
target_tools = {tool.strip().lower() for tool in tools.split(",")}
|
|
822
|
+
|
|
823
|
+
try:
|
|
824
|
+
# Use helper function to trim and create new session
|
|
825
|
+
result = trim_and_create_session(
|
|
826
|
+
"claude",
|
|
827
|
+
session_file,
|
|
828
|
+
target_tools,
|
|
829
|
+
threshold,
|
|
830
|
+
trim_assistant_messages=trim_assistant_messages
|
|
831
|
+
)
|
|
832
|
+
except Exception as e:
|
|
833
|
+
print(f"❌ Error trimming session: {e}")
|
|
834
|
+
return None
|
|
835
|
+
|
|
836
|
+
# Check if nothing to trim (savings below threshold)
|
|
837
|
+
from claude_code_tools.node_menu_ui import run_trim_confirm_ui
|
|
838
|
+
if result.get("nothing_to_trim"):
|
|
839
|
+
print(f" Savings too small ({result['tokens_saved']} tokens)")
|
|
840
|
+
action = run_trim_confirm_ui(
|
|
841
|
+
nothing_to_trim=True,
|
|
842
|
+
original_session_id=session_id,
|
|
843
|
+
)
|
|
844
|
+
if action == 'resume':
|
|
845
|
+
resume_session(session_id, project_path, claude_home=claude_home)
|
|
846
|
+
return None
|
|
847
|
+
return 'back'
|
|
848
|
+
|
|
849
|
+
new_session_id = result["session_id"]
|
|
850
|
+
new_session_file = Path(result["output_file"])
|
|
851
|
+
|
|
852
|
+
# Calculate total lines trimmed for confirmation UI
|
|
853
|
+
total_trimmed = result['num_tools_trimmed'] + result['num_assistant_trimmed']
|
|
854
|
+
|
|
855
|
+
# Show confirmation UI
|
|
856
|
+
action = run_trim_confirm_ui(
|
|
857
|
+
new_session_id=new_session_id,
|
|
858
|
+
lines_trimmed=total_trimmed,
|
|
859
|
+
tokens_saved=result['tokens_saved'],
|
|
860
|
+
output_file=str(new_session_file),
|
|
861
|
+
)
|
|
862
|
+
|
|
863
|
+
if action == 'resume':
|
|
864
|
+
# Resume the new session
|
|
865
|
+
resume_session(new_session_id, project_path, claude_home=claude_home)
|
|
866
|
+
return None
|
|
867
|
+
elif action == 'delete':
|
|
868
|
+
# Delete the new session file and go back to menu
|
|
869
|
+
new_session_file.unlink(missing_ok=True)
|
|
870
|
+
print(f"\n🗑️ Deleted session file: {new_session_file.name}")
|
|
871
|
+
return 'back'
|
|
872
|
+
else:
|
|
873
|
+
# Cancel (escape) - keep file, go back to menu
|
|
874
|
+
print(f"\n📁 Session file kept: {new_session_file}")
|
|
875
|
+
print(f" Session ID: {new_session_id}")
|
|
876
|
+
return 'back'
|
|
877
|
+
|
|
878
|
+
|
|
879
|
+
def handle_smart_trim_resume_claude(
|
|
880
|
+
session_id: str,
|
|
881
|
+
project_path: str,
|
|
882
|
+
claude_home: Optional[str] = None,
|
|
883
|
+
custom_instructions: Optional[str] = None,
|
|
884
|
+
) -> str | None:
|
|
885
|
+
"""
|
|
886
|
+
Smart trim session using parallel agents and resume Claude Code session.
|
|
887
|
+
|
|
888
|
+
Args:
|
|
889
|
+
session_id: Session ID to trim
|
|
890
|
+
project_path: Project path
|
|
891
|
+
claude_home: Optional custom Claude home directory
|
|
892
|
+
custom_instructions: Optional custom instructions for the trim agents
|
|
893
|
+
|
|
894
|
+
Returns:
|
|
895
|
+
'back' if user wants to go back to menu, None otherwise.
|
|
896
|
+
"""
|
|
897
|
+
import uuid
|
|
898
|
+
|
|
899
|
+
session_file = Path(get_session_file_path(session_id, project_path, claude_home))
|
|
900
|
+
|
|
901
|
+
print(f"\n🤖 Smart trimming session using Claude CLI...")
|
|
902
|
+
if custom_instructions:
|
|
903
|
+
print(f" Instructions: {custom_instructions[:60]}...")
|
|
904
|
+
print(f" This may take a minute as Claude analyzes the session...")
|
|
905
|
+
|
|
906
|
+
try:
|
|
907
|
+
# Identify trimmable lines using CLI with parallel sub-agents
|
|
908
|
+
trimmable = identify_trimmable_lines_cli(
|
|
909
|
+
session_file,
|
|
910
|
+
exclude_types=[],
|
|
911
|
+
preserve_recent=10,
|
|
912
|
+
custom_instructions=custom_instructions,
|
|
913
|
+
)
|
|
914
|
+
|
|
915
|
+
if not trimmable:
|
|
916
|
+
# Show confirmation for "nothing to trim" case
|
|
917
|
+
from claude_code_tools.node_menu_ui import run_trim_confirm_ui
|
|
918
|
+
action = run_trim_confirm_ui(
|
|
919
|
+
nothing_to_trim=True,
|
|
920
|
+
original_session_id=session_id,
|
|
921
|
+
)
|
|
922
|
+
|
|
923
|
+
if action == 'resume':
|
|
924
|
+
resume_session(session_id, project_path, claude_home=claude_home)
|
|
925
|
+
return None
|
|
926
|
+
# 'back' or 'cancel' - return signal to go back to menu
|
|
927
|
+
return 'back'
|
|
928
|
+
|
|
929
|
+
print(f" Found {len(trimmable)} lines to trim")
|
|
930
|
+
|
|
931
|
+
# Extract line indices and descriptions from verbose tuples
|
|
932
|
+
# trimmable is list of (line_idx, rationale, description) tuples
|
|
933
|
+
line_indices = [item[0] for item in trimmable]
|
|
934
|
+
descriptions = {
|
|
935
|
+
item[0]: item[2] for item in trimmable if len(item) > 2 and item[2]
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
# Generate new session ID
|
|
939
|
+
new_session_id = str(uuid.uuid4())
|
|
940
|
+
|
|
941
|
+
# Create output path
|
|
942
|
+
output_file = session_file.parent / f"{new_session_id}.jsonl"
|
|
943
|
+
|
|
944
|
+
# Perform trimming
|
|
945
|
+
stats = trim_lines(
|
|
946
|
+
session_file, line_indices, output_file, descriptions=descriptions
|
|
947
|
+
)
|
|
948
|
+
|
|
949
|
+
# Check if savings are worth it (minimum 300 tokens)
|
|
950
|
+
MIN_TOKEN_SAVINGS = 300
|
|
951
|
+
if stats['tokens_saved'] < MIN_TOKEN_SAVINGS:
|
|
952
|
+
# Not worth trimming - delete output and show nothing to trim
|
|
953
|
+
output_file.unlink(missing_ok=True)
|
|
954
|
+
print(f" Savings too small ({stats['tokens_saved']} tokens < {MIN_TOKEN_SAVINGS})")
|
|
955
|
+
print(f" (Diagnostic file: .claude/trim-result-{session_id}.jsonl)")
|
|
956
|
+
from claude_code_tools.node_menu_ui import run_trim_confirm_ui
|
|
957
|
+
action = run_trim_confirm_ui(
|
|
958
|
+
nothing_to_trim=True,
|
|
959
|
+
original_session_id=session_id,
|
|
960
|
+
)
|
|
961
|
+
if action == 'resume':
|
|
962
|
+
resume_session(session_id, project_path, claude_home=claude_home)
|
|
963
|
+
return None
|
|
964
|
+
return 'back'
|
|
965
|
+
|
|
966
|
+
# Show confirmation UI
|
|
967
|
+
from claude_code_tools.node_menu_ui import run_trim_confirm_ui
|
|
968
|
+
action = run_trim_confirm_ui(
|
|
969
|
+
new_session_id=new_session_id,
|
|
970
|
+
lines_trimmed=stats['num_lines_trimmed'],
|
|
971
|
+
tokens_saved=stats['tokens_saved'],
|
|
972
|
+
output_file=str(output_file),
|
|
973
|
+
)
|
|
974
|
+
|
|
975
|
+
if action == 'resume':
|
|
976
|
+
# Resume the new session
|
|
977
|
+
resume_session(new_session_id, project_path, claude_home=claude_home)
|
|
978
|
+
return None
|
|
979
|
+
elif action == 'delete':
|
|
980
|
+
# Delete the new session file and go back to menu
|
|
981
|
+
output_file.unlink(missing_ok=True)
|
|
982
|
+
print(f"\n🗑️ Deleted session file: {output_file.name}")
|
|
983
|
+
return 'back'
|
|
984
|
+
else:
|
|
985
|
+
# Cancel (escape) - keep file, go back to menu
|
|
986
|
+
print(f"\n📁 Session file kept: {output_file}")
|
|
987
|
+
print(f" Session ID: {new_session_id}")
|
|
988
|
+
return 'back'
|
|
989
|
+
|
|
990
|
+
except Exception as e:
|
|
991
|
+
print(f"❌ Error during smart trim: {e}")
|
|
992
|
+
import traceback
|
|
993
|
+
traceback.print_exc()
|
|
994
|
+
return None
|
|
995
|
+
|
|
996
|
+
|
|
997
|
+
def show_action_menu(session_info: Tuple[str, float, float, int, str, str, str, Optional[str]]) -> Optional[str]:
|
|
998
|
+
"""
|
|
999
|
+
Show action menu for selected session.
|
|
1000
|
+
|
|
1001
|
+
Returns: action choice ('resume', 'path', 'copy') or None if cancelled
|
|
1002
|
+
"""
|
|
1003
|
+
session_id, _, _, _, project_name, _, project_path, git_branch, _, is_sidechain = session_info
|
|
1004
|
+
|
|
1005
|
+
return menu_show_action_menu(
|
|
1006
|
+
session_id=session_id,
|
|
1007
|
+
agent="claude",
|
|
1008
|
+
project_name=project_name,
|
|
1009
|
+
git_branch=git_branch,
|
|
1010
|
+
is_sidechain=is_sidechain,
|
|
1011
|
+
stderr_mode=False,
|
|
1012
|
+
)
|
|
1013
|
+
|
|
1014
|
+
|
|
1015
|
+
def get_session_file_path(
|
|
1016
|
+
session_id: str, project_path: str, claude_home: Optional[str] = None
|
|
1017
|
+
) -> str:
|
|
1018
|
+
"""Get the full file path for a session.
|
|
1019
|
+
|
|
1020
|
+
Supports both full and partial session IDs. If an exact match isn't found,
|
|
1021
|
+
searches for sessions containing the given ID string.
|
|
1022
|
+
|
|
1023
|
+
Args:
|
|
1024
|
+
session_id: Full or partial session UUID
|
|
1025
|
+
project_path: Project working directory path
|
|
1026
|
+
claude_home: Optional custom Claude home directory
|
|
1027
|
+
|
|
1028
|
+
Returns:
|
|
1029
|
+
Full path to the session file
|
|
1030
|
+
|
|
1031
|
+
Raises:
|
|
1032
|
+
FileNotFoundError: If session cannot be found
|
|
1033
|
+
ValueError: If partial ID matches multiple sessions
|
|
1034
|
+
"""
|
|
1035
|
+
base_dir = get_claude_home(claude_home)
|
|
1036
|
+
encoded_path = encode_claude_project_path(project_path)
|
|
1037
|
+
claude_project_dir = base_dir / "projects" / encoded_path
|
|
1038
|
+
|
|
1039
|
+
# Try exact match first (fast path)
|
|
1040
|
+
exact_path = claude_project_dir / f"{session_id}.jsonl"
|
|
1041
|
+
if exact_path.exists():
|
|
1042
|
+
return str(exact_path)
|
|
1043
|
+
|
|
1044
|
+
# If project directory doesn't exist, return constructed path
|
|
1045
|
+
# (maintains backward compatibility - caller can handle non-existent path)
|
|
1046
|
+
if not claude_project_dir.exists():
|
|
1047
|
+
return str(exact_path)
|
|
1048
|
+
|
|
1049
|
+
# Search for partial matches in the project directory
|
|
1050
|
+
matches = []
|
|
1051
|
+
for jsonl_file in claude_project_dir.glob("*.jsonl"):
|
|
1052
|
+
if session_id in jsonl_file.stem:
|
|
1053
|
+
matches.append(jsonl_file)
|
|
1054
|
+
|
|
1055
|
+
if len(matches) == 0:
|
|
1056
|
+
# No partial matches found, return constructed path
|
|
1057
|
+
return str(exact_path)
|
|
1058
|
+
elif len(matches) == 1:
|
|
1059
|
+
return str(matches[0])
|
|
1060
|
+
else:
|
|
1061
|
+
match_list = "\n ".join(str(m.name) for m in matches)
|
|
1062
|
+
raise ValueError(
|
|
1063
|
+
f"Multiple sessions match '{session_id}':\n {match_list}\n"
|
|
1064
|
+
f"Please use a more specific session ID."
|
|
1065
|
+
)
|
|
1066
|
+
|
|
1067
|
+
|
|
1068
|
+
def handle_export_session(session_file_path: str, dest_override: str | None = None, silent: bool = False) -> None:
|
|
1069
|
+
"""Export session to text file."""
|
|
1070
|
+
from claude_code_tools.export_claude_session import export_session_to_markdown as do_export
|
|
1071
|
+
from datetime import datetime
|
|
1072
|
+
|
|
1073
|
+
try:
|
|
1074
|
+
# Generate default export path using session's project directory
|
|
1075
|
+
session_file = Path(session_file_path)
|
|
1076
|
+
session_id = session_file.stem
|
|
1077
|
+
today = datetime.now().strftime("%Y%m%d")
|
|
1078
|
+
|
|
1079
|
+
# Infer project directory from session metadata
|
|
1080
|
+
project_dir = extract_cwd_from_session(session_file)
|
|
1081
|
+
if project_dir:
|
|
1082
|
+
output_dir = Path(project_dir) / "exported-sessions"
|
|
1083
|
+
else:
|
|
1084
|
+
output_dir = Path.cwd() / "exported-sessions"
|
|
1085
|
+
|
|
1086
|
+
default_path = output_dir / f"{today}-claude-session-{session_id}.txt"
|
|
1087
|
+
|
|
1088
|
+
if dest_override is None:
|
|
1089
|
+
print(f"\nDefault export path: {default_path}")
|
|
1090
|
+
dest = input("Path (or Enter for default): ").strip()
|
|
1091
|
+
if not dest:
|
|
1092
|
+
dest_path = default_path
|
|
1093
|
+
else:
|
|
1094
|
+
dest_path = Path(dest).expanduser()
|
|
1095
|
+
|
|
1096
|
+
# Force .txt extension
|
|
1097
|
+
if dest_path.suffix != ".txt":
|
|
1098
|
+
dest_path = dest_path.with_suffix(".txt")
|
|
1099
|
+
else:
|
|
1100
|
+
dest_path = Path(dest_override).expanduser()
|
|
1101
|
+
if dest_path.suffix != ".txt":
|
|
1102
|
+
dest_path = dest_path.with_suffix(".txt")
|
|
1103
|
+
|
|
1104
|
+
# Create parent directory if needed
|
|
1105
|
+
dest_path.parent.mkdir(parents=True, exist_ok=True)
|
|
1106
|
+
|
|
1107
|
+
# Export to text file
|
|
1108
|
+
print(f"\n📄 Exporting session...")
|
|
1109
|
+
with open(dest_path, 'w') as f:
|
|
1110
|
+
stats = do_export(Path(session_file_path), f, verbose=False)
|
|
1111
|
+
|
|
1112
|
+
if not silent:
|
|
1113
|
+
print(f"✅ Export complete!")
|
|
1114
|
+
print(f" User messages: {stats['user_messages']}")
|
|
1115
|
+
print(f" Assistant messages: {stats['assistant_messages']}")
|
|
1116
|
+
print(f" Tool calls: {stats['tool_calls']}")
|
|
1117
|
+
print(f" Tool results: {stats['tool_results']}")
|
|
1118
|
+
print(f" Skipped items: {stats['skipped']}")
|
|
1119
|
+
print(f"\n📄 Exported to: {dest_path}")
|
|
1120
|
+
|
|
1121
|
+
except Exception as e:
|
|
1122
|
+
print(f"\nError exporting session: {e}")
|
|
1123
|
+
|
|
1124
|
+
|
|
1125
|
+
def copy_session_file(session_file_path: str, dest_override: str | None = None, silent: bool = False) -> None:
|
|
1126
|
+
"""Copy session file to user-specified file or directory."""
|
|
1127
|
+
try:
|
|
1128
|
+
if dest_override is None:
|
|
1129
|
+
dest = input("\nEnter destination file or directory path: ").strip()
|
|
1130
|
+
if not dest:
|
|
1131
|
+
print("Cancelled.")
|
|
1132
|
+
return
|
|
1133
|
+
else:
|
|
1134
|
+
dest = dest_override
|
|
1135
|
+
|
|
1136
|
+
dest_path = Path(dest).expanduser()
|
|
1137
|
+
source = Path(session_file_path)
|
|
1138
|
+
|
|
1139
|
+
# Determine if destination is a directory or file
|
|
1140
|
+
if dest_path.exists():
|
|
1141
|
+
if dest_path.is_dir():
|
|
1142
|
+
# Copy into directory with original filename
|
|
1143
|
+
dest_file = dest_path / source.name
|
|
1144
|
+
else:
|
|
1145
|
+
# Copy to specified file
|
|
1146
|
+
dest_file = dest_path
|
|
1147
|
+
else:
|
|
1148
|
+
# Destination doesn't exist - check if it looks like a directory
|
|
1149
|
+
if dest.endswith('/') or dest.endswith(os.sep):
|
|
1150
|
+
# Treat as directory - create it
|
|
1151
|
+
create = input(f"Directory {dest_path} does not exist. Create it? [y/N]: ").strip().lower()
|
|
1152
|
+
if create in ('y', 'yes'):
|
|
1153
|
+
dest_path.mkdir(parents=True, exist_ok=True)
|
|
1154
|
+
dest_file = dest_path / source.name
|
|
1155
|
+
else:
|
|
1156
|
+
print("Cancelled.")
|
|
1157
|
+
return
|
|
1158
|
+
else:
|
|
1159
|
+
# Treat as file - create parent directory if needed
|
|
1160
|
+
parent = dest_path.parent
|
|
1161
|
+
if not parent.exists():
|
|
1162
|
+
create = input(f"Parent directory {parent} does not exist. Create it? [y/N]: ").strip().lower()
|
|
1163
|
+
if create in ('y', 'yes'):
|
|
1164
|
+
parent.mkdir(parents=True, exist_ok=True)
|
|
1165
|
+
else:
|
|
1166
|
+
print("Cancelled.")
|
|
1167
|
+
return
|
|
1168
|
+
dest_file = dest_path
|
|
1169
|
+
|
|
1170
|
+
import shutil
|
|
1171
|
+
shutil.copy2(source, dest_file)
|
|
1172
|
+
if not silent:
|
|
1173
|
+
print(f"\nCopied to: {dest_file}")
|
|
1174
|
+
|
|
1175
|
+
except KeyboardInterrupt:
|
|
1176
|
+
print("\nCancelled.")
|
|
1177
|
+
except Exception as e:
|
|
1178
|
+
print(f"\nError copying file: {e}")
|
|
1179
|
+
|
|
1180
|
+
|
|
1181
|
+
def clone_session(session_id: str, project_path: str, shell_mode: bool = False, claude_home: Optional[str] = None):
|
|
1182
|
+
"""Clone a Claude session to a new file with new UUID and resume it."""
|
|
1183
|
+
import shutil
|
|
1184
|
+
import uuid
|
|
1185
|
+
|
|
1186
|
+
# Get the original session file path
|
|
1187
|
+
source_path = Path(get_session_file_path(session_id, project_path, claude_home))
|
|
1188
|
+
|
|
1189
|
+
if not source_path.exists():
|
|
1190
|
+
print(f"\nError: Session file not found: {source_path}")
|
|
1191
|
+
return
|
|
1192
|
+
|
|
1193
|
+
# Generate new UUID for cloned session
|
|
1194
|
+
new_session_id = str(uuid.uuid4())
|
|
1195
|
+
|
|
1196
|
+
# Create destination path with new UUID in same directory
|
|
1197
|
+
dest_path = source_path.parent / f"{new_session_id}.jsonl"
|
|
1198
|
+
|
|
1199
|
+
try:
|
|
1200
|
+
# Copy the file
|
|
1201
|
+
shutil.copy2(source_path, dest_path)
|
|
1202
|
+
|
|
1203
|
+
# Update sessionId in all lines to match the new filename UUID
|
|
1204
|
+
from claude_code_tools.trim_session import update_session_id_in_file
|
|
1205
|
+
update_session_id_in_file(dest_path, new_session_id, agent="claude")
|
|
1206
|
+
|
|
1207
|
+
if not shell_mode:
|
|
1208
|
+
print(f"\nCloned session:")
|
|
1209
|
+
print(f" Original: {session_id}")
|
|
1210
|
+
print(f" New: {new_session_id}")
|
|
1211
|
+
print(f"\nResuming cloned session...")
|
|
1212
|
+
|
|
1213
|
+
# Resume the new cloned session
|
|
1214
|
+
resume_session(new_session_id, project_path, shell_mode=shell_mode, claude_home=claude_home)
|
|
1215
|
+
|
|
1216
|
+
except Exception as e:
|
|
1217
|
+
print(f"\nError cloning session: {e}")
|
|
1218
|
+
return
|
|
1219
|
+
|
|
1220
|
+
|
|
1221
|
+
def resume_session(session_id: str, project_path: str, shell_mode: bool = False, claude_home: Optional[str] = None):
|
|
1222
|
+
"""Resume a Claude session using claude -r command."""
|
|
1223
|
+
current_dir = os.getcwd()
|
|
1224
|
+
|
|
1225
|
+
# In shell mode, output commands for the shell to evaluate
|
|
1226
|
+
if shell_mode:
|
|
1227
|
+
if project_path != current_dir:
|
|
1228
|
+
print(f'cd {shlex.quote(project_path)}')
|
|
1229
|
+
# Set CLAUDE_CONFIG_DIR environment variable if custom path specified
|
|
1230
|
+
# (either via CLI arg or already set via env var)
|
|
1231
|
+
if claude_home or os.environ.get('CLAUDE_CONFIG_DIR'):
|
|
1232
|
+
expanded_home = str(get_claude_home(claude_home).absolute())
|
|
1233
|
+
print(f'CLAUDE_CONFIG_DIR={shlex.quote(expanded_home)} claude -r {shlex.quote(session_id)}')
|
|
1234
|
+
else:
|
|
1235
|
+
print(f'claude -r {shlex.quote(session_id)}')
|
|
1236
|
+
return
|
|
1237
|
+
|
|
1238
|
+
# Check if we need to change directory
|
|
1239
|
+
change_dir = False
|
|
1240
|
+
if project_path != current_dir:
|
|
1241
|
+
if RICH_AVAILABLE and console:
|
|
1242
|
+
console.print(f"\n[yellow]This session is from a different project:[/yellow]")
|
|
1243
|
+
console.print(f" Current directory: {current_dir}")
|
|
1244
|
+
console.print(f" Session directory: {project_path}")
|
|
1245
|
+
|
|
1246
|
+
if Confirm.ask("\nChange to the session's directory?", default=True):
|
|
1247
|
+
change_dir = True
|
|
1248
|
+
else:
|
|
1249
|
+
console.print("[yellow]Staying in current directory. Session resume may fail.[/yellow]")
|
|
1250
|
+
else:
|
|
1251
|
+
print(f"\nThis session is from a different project:")
|
|
1252
|
+
print(f" Current directory: {current_dir}")
|
|
1253
|
+
print(f" Session directory: {project_path}")
|
|
1254
|
+
|
|
1255
|
+
response = input("\nChange to the session's directory? [Y/n]: ").strip().lower()
|
|
1256
|
+
if response != 'n':
|
|
1257
|
+
change_dir = True
|
|
1258
|
+
else:
|
|
1259
|
+
print("Staying in current directory. Session resume may fail.")
|
|
1260
|
+
|
|
1261
|
+
if RICH_AVAILABLE and console:
|
|
1262
|
+
console.print(f"\n[green]Resuming session:[/green] {session_id}")
|
|
1263
|
+
if change_dir:
|
|
1264
|
+
console.print("\n[yellow]Note:[/yellow] To persist directory changes, use this shell function:")
|
|
1265
|
+
console.print("[dim]fcs() { eval $(find-claude-session --shell \"$@\"); }[/dim]")
|
|
1266
|
+
console.print("Then use [bold]fcs[/bold] instead of [bold]find-claude-session[/bold]\n")
|
|
1267
|
+
else:
|
|
1268
|
+
print(f"\nResuming session: {session_id}")
|
|
1269
|
+
if change_dir:
|
|
1270
|
+
print("\nNote: To persist directory changes, use this shell function:")
|
|
1271
|
+
print("fcs() { eval $(find-claude-session --shell \"$@\"); }")
|
|
1272
|
+
print("Then use 'fcs' instead of 'find-claude-session'\n")
|
|
1273
|
+
|
|
1274
|
+
try:
|
|
1275
|
+
# Change directory if needed (won't persist after exit)
|
|
1276
|
+
if change_dir and project_path != current_dir:
|
|
1277
|
+
os.chdir(project_path)
|
|
1278
|
+
|
|
1279
|
+
# Set CLAUDE_CONFIG_DIR environment variable if custom path specified
|
|
1280
|
+
# (either via CLI arg or already set via env var)
|
|
1281
|
+
if claude_home or os.environ.get('CLAUDE_CONFIG_DIR'):
|
|
1282
|
+
# Get the resolved home directory (respects precedence)
|
|
1283
|
+
expanded_home = str(get_claude_home(claude_home).absolute())
|
|
1284
|
+
os.environ['CLAUDE_CONFIG_DIR'] = expanded_home
|
|
1285
|
+
|
|
1286
|
+
# Execute claude
|
|
1287
|
+
os.execvp("claude", ["claude", "-r", session_id])
|
|
1288
|
+
|
|
1289
|
+
except FileNotFoundError:
|
|
1290
|
+
if RICH_AVAILABLE and console:
|
|
1291
|
+
console.print("[red]Error:[/red] 'claude' command not found. Make sure Claude CLI is installed.")
|
|
1292
|
+
else:
|
|
1293
|
+
print("Error: 'claude' command not found. Make sure Claude CLI is installed.", file=sys.stderr)
|
|
1294
|
+
sys.exit(1)
|
|
1295
|
+
except Exception as e:
|
|
1296
|
+
if RICH_AVAILABLE and console:
|
|
1297
|
+
console.print(f"[red]Error:[/red] {e}")
|
|
1298
|
+
else:
|
|
1299
|
+
print(f"Error: {e}", file=sys.stderr)
|
|
1300
|
+
sys.exit(1)
|
|
1301
|
+
|
|
1302
|
+
|
|
1303
|
+
def create_action_handler(claude_home: Optional[str] = None, nonlaunch_flag: Optional[dict] = None):
|
|
1304
|
+
"""
|
|
1305
|
+
Create an action handler function for TUI/UI integration.
|
|
1306
|
+
|
|
1307
|
+
Args:
|
|
1308
|
+
claude_home: Optional Claude home directory
|
|
1309
|
+
|
|
1310
|
+
Returns:
|
|
1311
|
+
Function that handles session actions
|
|
1312
|
+
"""
|
|
1313
|
+
def handle_session_action(
|
|
1314
|
+
session: Tuple, action: str, kwargs: Optional[dict] = None
|
|
1315
|
+
) -> None:
|
|
1316
|
+
"""Handle actions for a selected session."""
|
|
1317
|
+
kwargs = kwargs or {}
|
|
1318
|
+
|
|
1319
|
+
if isinstance(session, dict):
|
|
1320
|
+
session_id = session.get("session_id")
|
|
1321
|
+
project_path = session.get("cwd")
|
|
1322
|
+
else:
|
|
1323
|
+
session_id = session[0]
|
|
1324
|
+
project_path = session[6]
|
|
1325
|
+
|
|
1326
|
+
if action == "resume":
|
|
1327
|
+
resume_session(session_id, project_path, shell_mode=False, claude_home=claude_home)
|
|
1328
|
+
elif action == "suppress_resume":
|
|
1329
|
+
tools = kwargs.get("tools")
|
|
1330
|
+
threshold = kwargs.get("threshold")
|
|
1331
|
+
trim_assistant = kwargs.get("trim_assistant")
|
|
1332
|
+
if tools is None and threshold is None and trim_assistant is None:
|
|
1333
|
+
options = prompt_suppress_options()
|
|
1334
|
+
if not options:
|
|
1335
|
+
return
|
|
1336
|
+
tools, threshold, trim_assistant = options
|
|
1337
|
+
handle_suppress_resume_claude(
|
|
1338
|
+
session_id, project_path, tools, threshold or 500, trim_assistant, claude_home
|
|
1339
|
+
)
|
|
1340
|
+
elif action == "smart_trim_resume":
|
|
1341
|
+
handle_smart_trim_resume_claude(session_id, project_path, claude_home)
|
|
1342
|
+
elif action == "path":
|
|
1343
|
+
# handled in Node UI via RPC
|
|
1344
|
+
if nonlaunch_flag is not None:
|
|
1345
|
+
nonlaunch_flag["done"] = True
|
|
1346
|
+
nonlaunch_flag["session_id"] = session_id
|
|
1347
|
+
elif action == "copy":
|
|
1348
|
+
if nonlaunch_flag is not None:
|
|
1349
|
+
nonlaunch_flag["done"] = True
|
|
1350
|
+
nonlaunch_flag["session_id"] = session_id
|
|
1351
|
+
elif action == "clone":
|
|
1352
|
+
clone_session(session_id, project_path, shell_mode=False, claude_home=claude_home)
|
|
1353
|
+
elif action == "export":
|
|
1354
|
+
session_file_path = get_session_file_path(session_id, project_path, claude_home)
|
|
1355
|
+
handle_export_session(session_file_path)
|
|
1356
|
+
if nonlaunch_flag is not None:
|
|
1357
|
+
nonlaunch_flag["done"] = True
|
|
1358
|
+
nonlaunch_flag["session_id"] = session_id
|
|
1359
|
+
elif action == "continue":
|
|
1360
|
+
from claude_code_tools.session_utils import continue_with_options
|
|
1361
|
+
session_file_path = get_session_file_path(session_id, project_path, claude_home)
|
|
1362
|
+
continue_with_options(
|
|
1363
|
+
session_file_path,
|
|
1364
|
+
"claude",
|
|
1365
|
+
claude_home=claude_home,
|
|
1366
|
+
codex_home=None
|
|
1367
|
+
)
|
|
1368
|
+
|
|
1369
|
+
return handle_session_action
|
|
1370
|
+
|
|
1371
|
+
|
|
1372
|
+
def main():
|
|
1373
|
+
parser = argparse.ArgumentParser(
|
|
1374
|
+
description="Search Claude Code session files by keywords",
|
|
1375
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
1376
|
+
epilog="""
|
|
1377
|
+
Examples:
|
|
1378
|
+
find-claude-session "langroid"
|
|
1379
|
+
find-claude-session "langroid,MCP"
|
|
1380
|
+
find-claude-session "error,TypeError,function" --global
|
|
1381
|
+
find-claude-session "bug fix" -g
|
|
1382
|
+
|
|
1383
|
+
To persist directory changes when resuming sessions:
|
|
1384
|
+
Add this to your shell config (.bashrc/.zshrc):
|
|
1385
|
+
fcs() { eval $(find-claude-session --shell "$@"); }
|
|
1386
|
+
|
|
1387
|
+
Then use: fcs "keyword" -g
|
|
1388
|
+
"""
|
|
1389
|
+
)
|
|
1390
|
+
parser.add_argument(
|
|
1391
|
+
"keywords",
|
|
1392
|
+
nargs='?',
|
|
1393
|
+
default="",
|
|
1394
|
+
help="Comma-separated keywords to search for (case-insensitive). If omitted, shows all sessions."
|
|
1395
|
+
)
|
|
1396
|
+
parser.add_argument(
|
|
1397
|
+
"-g", "--global",
|
|
1398
|
+
action="store_true",
|
|
1399
|
+
help="Search across all Claude projects, not just the current one"
|
|
1400
|
+
)
|
|
1401
|
+
parser.add_argument(
|
|
1402
|
+
"-n", "--num-matches",
|
|
1403
|
+
type=int,
|
|
1404
|
+
default=10,
|
|
1405
|
+
help="Number of matching sessions to display (default: 10)"
|
|
1406
|
+
)
|
|
1407
|
+
parser.add_argument(
|
|
1408
|
+
"--shell",
|
|
1409
|
+
action="store_true",
|
|
1410
|
+
help="Output shell commands for evaluation (for use with shell function)"
|
|
1411
|
+
)
|
|
1412
|
+
parser.add_argument(
|
|
1413
|
+
"--claude-home",
|
|
1414
|
+
type=str,
|
|
1415
|
+
help="Path to Claude home directory (default: ~/.claude)"
|
|
1416
|
+
)
|
|
1417
|
+
parser.add_argument(
|
|
1418
|
+
"--original",
|
|
1419
|
+
action="store_true",
|
|
1420
|
+
help="Show only original sessions (excludes trimmed, continued, and sub-agent sessions)"
|
|
1421
|
+
)
|
|
1422
|
+
parser.add_argument(
|
|
1423
|
+
"--no-sub",
|
|
1424
|
+
action="store_true",
|
|
1425
|
+
help="Exclude sub-agent sessions from results"
|
|
1426
|
+
)
|
|
1427
|
+
parser.add_argument(
|
|
1428
|
+
"--no-trim",
|
|
1429
|
+
action="store_true",
|
|
1430
|
+
help="Exclude trimmed sessions from results"
|
|
1431
|
+
)
|
|
1432
|
+
parser.add_argument(
|
|
1433
|
+
"--no-roll",
|
|
1434
|
+
dest="no_cont", # Keep internal name for compatibility
|
|
1435
|
+
action="store_true",
|
|
1436
|
+
help="Exclude rollover sessions from results"
|
|
1437
|
+
)
|
|
1438
|
+
parser.add_argument(
|
|
1439
|
+
"--simple-ui",
|
|
1440
|
+
dest="simple_ui",
|
|
1441
|
+
action="store_true",
|
|
1442
|
+
help="Use simple Rich table UI instead of Node interactive UI"
|
|
1443
|
+
)
|
|
1444
|
+
parser.add_argument(
|
|
1445
|
+
"--min-lines",
|
|
1446
|
+
type=int,
|
|
1447
|
+
default=0,
|
|
1448
|
+
help="Only show sessions with at least this many lines (default: 0 = no minimum)"
|
|
1449
|
+
)
|
|
1450
|
+
parser.add_argument(
|
|
1451
|
+
"--before",
|
|
1452
|
+
type=str,
|
|
1453
|
+
help="Only show sessions modified before this time (inclusive). "
|
|
1454
|
+
"Formats: YYYYMMDD, YYYY-MM-DD, MM/DD/YY, with optional T or space + HH:MM:SS",
|
|
1455
|
+
)
|
|
1456
|
+
parser.add_argument(
|
|
1457
|
+
"--after",
|
|
1458
|
+
type=str,
|
|
1459
|
+
help="Only show sessions modified after this time (inclusive). "
|
|
1460
|
+
"Formats: YYYYMMDD, YYYY-MM-DD, MM/DD/YY, with optional T or space + HH:MM:SS",
|
|
1461
|
+
)
|
|
1462
|
+
parser.add_argument(
|
|
1463
|
+
"--no-ui",
|
|
1464
|
+
action="store_true",
|
|
1465
|
+
help="Skip interactive options menu and run search directly with CLI args",
|
|
1466
|
+
)
|
|
1467
|
+
|
|
1468
|
+
args = parser.parse_args()
|
|
1469
|
+
|
|
1470
|
+
# Show interactive options UI unless --no-ui or --simple-ui
|
|
1471
|
+
if not args.no_ui and not args.simple_ui:
|
|
1472
|
+
initial_options = {
|
|
1473
|
+
"keywords": args.keywords or "",
|
|
1474
|
+
"global": getattr(args, 'global', False),
|
|
1475
|
+
"num_matches": args.num_matches,
|
|
1476
|
+
"original": args.original,
|
|
1477
|
+
"no_sub": args.no_sub,
|
|
1478
|
+
"no_trim": args.no_trim,
|
|
1479
|
+
"no_cont": args.no_cont,
|
|
1480
|
+
"min_lines": args.min_lines or "",
|
|
1481
|
+
"before": args.before or "",
|
|
1482
|
+
"after": args.after or "",
|
|
1483
|
+
}
|
|
1484
|
+
opts = run_find_options_ui(initial_options, variant="find-claude")
|
|
1485
|
+
if opts is None:
|
|
1486
|
+
sys.exit(0)
|
|
1487
|
+
# Update args with user's selections
|
|
1488
|
+
args.keywords = opts.get("keywords") or ""
|
|
1489
|
+
setattr(args, 'global', opts.get("global", False))
|
|
1490
|
+
args.num_matches = opts.get("num_matches", 10)
|
|
1491
|
+
args.original = opts.get("original", False)
|
|
1492
|
+
args.no_sub = opts.get("no_sub", False)
|
|
1493
|
+
args.no_trim = opts.get("no_trim", False)
|
|
1494
|
+
args.no_cont = opts.get("no_cont", False)
|
|
1495
|
+
args.min_lines = opts.get("min_lines") or 0
|
|
1496
|
+
args.before = opts.get("before")
|
|
1497
|
+
args.after = opts.get("after")
|
|
1498
|
+
|
|
1499
|
+
# Build and display equivalent CLI command
|
|
1500
|
+
cmd_parts = ["aichat find-claude"]
|
|
1501
|
+
if args.keywords:
|
|
1502
|
+
cmd_parts.append(f'"{args.keywords}"')
|
|
1503
|
+
if getattr(args, 'global'):
|
|
1504
|
+
cmd_parts.append("-g")
|
|
1505
|
+
if args.num_matches != 10:
|
|
1506
|
+
cmd_parts.append(f"-n {args.num_matches}")
|
|
1507
|
+
if args.original:
|
|
1508
|
+
cmd_parts.append("--original")
|
|
1509
|
+
if args.no_sub:
|
|
1510
|
+
cmd_parts.append("--no-sub")
|
|
1511
|
+
if args.no_trim:
|
|
1512
|
+
cmd_parts.append("--no-trim")
|
|
1513
|
+
if args.no_cont:
|
|
1514
|
+
cmd_parts.append("--no-roll")
|
|
1515
|
+
if args.min_lines:
|
|
1516
|
+
cmd_parts.append(f"--min-lines {args.min_lines}")
|
|
1517
|
+
if args.before:
|
|
1518
|
+
cmd_parts.append(f"--before {args.before}")
|
|
1519
|
+
if args.after:
|
|
1520
|
+
cmd_parts.append(f"--after {args.after}")
|
|
1521
|
+
cmd_parts.append("--no-ui")
|
|
1522
|
+
print(f"\n→ {' '.join(cmd_parts)}\n", file=sys.stderr)
|
|
1523
|
+
|
|
1524
|
+
# Parse keywords
|
|
1525
|
+
keywords = [k.strip() for k in args.keywords.split(",") if k.strip()] if args.keywords else []
|
|
1526
|
+
|
|
1527
|
+
# Display informational message about what session types are being shown
|
|
1528
|
+
if args.original:
|
|
1529
|
+
print("Showing: Original sessions only (excluding trimmed, rollover, and sub-agent sessions)", file=sys.stderr)
|
|
1530
|
+
else:
|
|
1531
|
+
# Build list of included/excluded types
|
|
1532
|
+
excluded_types = []
|
|
1533
|
+
if args.no_sub:
|
|
1534
|
+
excluded_types.append("sub-agent")
|
|
1535
|
+
if args.no_trim:
|
|
1536
|
+
excluded_types.append("trimmed")
|
|
1537
|
+
if args.no_cont:
|
|
1538
|
+
excluded_types.append("rollover")
|
|
1539
|
+
|
|
1540
|
+
if excluded_types:
|
|
1541
|
+
excluded_str = ", ".join(excluded_types)
|
|
1542
|
+
print(f"Showing: All sessions except {excluded_str}", file=sys.stderr)
|
|
1543
|
+
else:
|
|
1544
|
+
print("Showing: All session types (original, trimmed, rollover, and sub-agent)", file=sys.stderr)
|
|
1545
|
+
print("Tip: Use --no-sub, --no-trim, or --no-roll to exclude specific types", file=sys.stderr)
|
|
1546
|
+
print(file=sys.stderr) # Blank line for readability
|
|
1547
|
+
|
|
1548
|
+
# Check if searching current project only
|
|
1549
|
+
if not getattr(args, 'global'):
|
|
1550
|
+
claude_dir = get_claude_project_dir(args.claude_home)
|
|
1551
|
+
|
|
1552
|
+
if not claude_dir.exists():
|
|
1553
|
+
print(f"No Claude project directory found for: {os.getcwd()}", file=sys.stderr)
|
|
1554
|
+
print(f"Expected directory: {claude_dir}", file=sys.stderr)
|
|
1555
|
+
sys.exit(1)
|
|
1556
|
+
|
|
1557
|
+
# Find matching sessions
|
|
1558
|
+
matching_sessions = find_sessions(
|
|
1559
|
+
keywords,
|
|
1560
|
+
global_search=getattr(args, 'global'),
|
|
1561
|
+
claude_home=args.claude_home,
|
|
1562
|
+
original_only=args.original,
|
|
1563
|
+
no_sub=args.no_sub,
|
|
1564
|
+
no_trim=args.no_trim,
|
|
1565
|
+
no_cont=args.no_cont,
|
|
1566
|
+
)
|
|
1567
|
+
|
|
1568
|
+
# Filter by minimum lines if specified (line_count is at index 3 in tuple)
|
|
1569
|
+
if args.min_lines > 0:
|
|
1570
|
+
matching_sessions = [s for s in matching_sessions if s[3] >= args.min_lines]
|
|
1571
|
+
|
|
1572
|
+
# Filter by time bounds if specified (mod_time is at index 1 in tuple)
|
|
1573
|
+
if args.before or args.after:
|
|
1574
|
+
matching_sessions = filter_sessions_by_time(
|
|
1575
|
+
matching_sessions, before=args.before, after=args.after, time_index=1
|
|
1576
|
+
)
|
|
1577
|
+
|
|
1578
|
+
if not matching_sessions:
|
|
1579
|
+
scope = "all projects" if getattr(args, 'global') else "current project"
|
|
1580
|
+
keyword_msg = f" containing all keywords: {', '.join(keywords)}" if keywords else ""
|
|
1581
|
+
if RICH_AVAILABLE and console and not args.shell:
|
|
1582
|
+
console.print(f"[yellow]No sessions found{keyword_msg} in {scope}[/yellow]")
|
|
1583
|
+
else:
|
|
1584
|
+
print(f"No sessions found{keyword_msg} in {scope}", file=sys.stderr)
|
|
1585
|
+
sys.exit(0)
|
|
1586
|
+
|
|
1587
|
+
# ============================================================
|
|
1588
|
+
# Default: Node UI (rich interactive interface)
|
|
1589
|
+
# --simple-ui: Falls back to Rich table UI
|
|
1590
|
+
# ============================================================
|
|
1591
|
+
nonlaunch_flag = {"done": False}
|
|
1592
|
+
action_handler = create_action_handler(args.claude_home, nonlaunch_flag=nonlaunch_flag)
|
|
1593
|
+
rpc_path = str(Path(__file__).parent / "action_rpc.py")
|
|
1594
|
+
|
|
1595
|
+
if not args.simple_ui:
|
|
1596
|
+
limited = [
|
|
1597
|
+
{
|
|
1598
|
+
"agent": "claude",
|
|
1599
|
+
"agent_display": "Claude",
|
|
1600
|
+
"session_id": s[0],
|
|
1601
|
+
"mod_time": s[1],
|
|
1602
|
+
"create_time": s[2],
|
|
1603
|
+
"lines": s[3],
|
|
1604
|
+
"project": s[4],
|
|
1605
|
+
"preview": s[5],
|
|
1606
|
+
"cwd": s[6],
|
|
1607
|
+
"branch": s[7] if len(s) > 7 else "",
|
|
1608
|
+
"file_path": get_session_file_path(s[0], s[6], args.claude_home),
|
|
1609
|
+
"claude_home": args.claude_home,
|
|
1610
|
+
"is_trimmed": s[8] if len(s) > 8 else False,
|
|
1611
|
+
"derivation_type": None,
|
|
1612
|
+
"is_sidechain": s[9] if len(s) > 9 else False,
|
|
1613
|
+
}
|
|
1614
|
+
for s in matching_sessions[: args.num_matches]
|
|
1615
|
+
]
|
|
1616
|
+
|
|
1617
|
+
focus_id = None
|
|
1618
|
+
start_action = False
|
|
1619
|
+
while True:
|
|
1620
|
+
nonlaunch_flag["done"] = False
|
|
1621
|
+
run_node_menu_ui(
|
|
1622
|
+
limited,
|
|
1623
|
+
keywords,
|
|
1624
|
+
action_handler,
|
|
1625
|
+
stderr_mode=args.shell,
|
|
1626
|
+
focus_session_id=focus_id,
|
|
1627
|
+
start_action=start_action,
|
|
1628
|
+
rpc_path=rpc_path,
|
|
1629
|
+
)
|
|
1630
|
+
if nonlaunch_flag["done"]:
|
|
1631
|
+
choice = prompt_post_action()
|
|
1632
|
+
if choice == "back":
|
|
1633
|
+
focus_id = nonlaunch_flag.get("session_id")
|
|
1634
|
+
start_action = True
|
|
1635
|
+
continue
|
|
1636
|
+
break
|
|
1637
|
+
elif RICH_AVAILABLE and console:
|
|
1638
|
+
# Use Rich-based interactive UI
|
|
1639
|
+
selected_session = display_interactive_ui(matching_sessions, keywords, stderr_mode=args.shell, num_matches=args.num_matches)
|
|
1640
|
+
if selected_session:
|
|
1641
|
+
# Show action menu
|
|
1642
|
+
action = show_action_menu(selected_session)
|
|
1643
|
+
if not action:
|
|
1644
|
+
return
|
|
1645
|
+
|
|
1646
|
+
session_id = selected_session[0]
|
|
1647
|
+
project_path = selected_session[6] # Updated index after adding creation_time
|
|
1648
|
+
|
|
1649
|
+
# Perform selected action
|
|
1650
|
+
if action == "resume":
|
|
1651
|
+
resume_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
|
|
1652
|
+
elif action == "suppress_resume":
|
|
1653
|
+
# Prompt for suppress options
|
|
1654
|
+
options = prompt_suppress_options()
|
|
1655
|
+
if options:
|
|
1656
|
+
tools, threshold, trim_assistant = options
|
|
1657
|
+
handle_suppress_resume_claude(
|
|
1658
|
+
session_id, project_path, tools, threshold, trim_assistant, args.claude_home
|
|
1659
|
+
)
|
|
1660
|
+
elif action == "smart_trim_resume":
|
|
1661
|
+
# Smart trim using parallel agents
|
|
1662
|
+
handle_smart_trim_resume_claude(
|
|
1663
|
+
session_id, project_path, args.claude_home
|
|
1664
|
+
)
|
|
1665
|
+
elif action == "path":
|
|
1666
|
+
session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
|
|
1667
|
+
print(f"\nSession file path:")
|
|
1668
|
+
print(session_file_path)
|
|
1669
|
+
elif action == "copy":
|
|
1670
|
+
session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
|
|
1671
|
+
copy_session_file(session_file_path)
|
|
1672
|
+
elif action == "clone":
|
|
1673
|
+
clone_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
|
|
1674
|
+
elif action == "export":
|
|
1675
|
+
session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
|
|
1676
|
+
handle_export_session(session_file_path)
|
|
1677
|
+
elif action == "continue":
|
|
1678
|
+
# Continue with context in fresh session
|
|
1679
|
+
from claude_code_tools.session_utils import continue_with_options
|
|
1680
|
+
session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
|
|
1681
|
+
continue_with_options(
|
|
1682
|
+
session_file_path,
|
|
1683
|
+
"claude",
|
|
1684
|
+
claude_home=args.claude_home,
|
|
1685
|
+
codex_home=None
|
|
1686
|
+
)
|
|
1687
|
+
else:
|
|
1688
|
+
# Fallback: print session IDs as before
|
|
1689
|
+
if not args.shell:
|
|
1690
|
+
print("\nMatching sessions:")
|
|
1691
|
+
for idx, (session_id, mod_time, create_time, line_count, project_name, preview, project_path, git_branch) in enumerate(matching_sessions[:args.num_matches], 1):
|
|
1692
|
+
create_date = datetime.fromtimestamp(create_time).strftime('%m/%d')
|
|
1693
|
+
mod_date = datetime.fromtimestamp(mod_time).strftime('%m/%d %H:%M')
|
|
1694
|
+
date_display = f"{create_date} - {mod_date}"
|
|
1695
|
+
branch_display = git_branch if git_branch else "N/A"
|
|
1696
|
+
if getattr(args, 'global'):
|
|
1697
|
+
print(f"{idx}. {session_id} | {project_name} | {branch_display} | {date_display} | {line_count} lines", file=sys.stderr if args.shell else sys.stdout)
|
|
1698
|
+
else:
|
|
1699
|
+
print(f"{idx}. {session_id} | {branch_display} | {date_display} | {line_count} lines", file=sys.stderr if args.shell else sys.stdout)
|
|
1700
|
+
|
|
1701
|
+
if len(matching_sessions) > args.num_matches:
|
|
1702
|
+
print(f"\n... and {len(matching_sessions) - args.num_matches} more sessions", file=sys.stderr if args.shell else sys.stdout)
|
|
1703
|
+
|
|
1704
|
+
# Simple selection without rich
|
|
1705
|
+
if len(matching_sessions) == 1:
|
|
1706
|
+
if not args.shell:
|
|
1707
|
+
print("\nOnly one match found. Resuming automatically...")
|
|
1708
|
+
session_id, _, _, _, _, _, project_path, _, _, _ = matching_sessions[0]
|
|
1709
|
+
resume_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
|
|
1710
|
+
else:
|
|
1711
|
+
try:
|
|
1712
|
+
if args.shell:
|
|
1713
|
+
# In shell mode, read from stdin but prompt to stderr
|
|
1714
|
+
sys.stderr.write("\nEnter number to resume session (or Ctrl+C to cancel): ")
|
|
1715
|
+
sys.stderr.flush()
|
|
1716
|
+
choice = sys.stdin.readline().strip()
|
|
1717
|
+
else:
|
|
1718
|
+
choice = input("\nEnter number to resume session (or Ctrl+C to cancel): ")
|
|
1719
|
+
|
|
1720
|
+
# Handle empty input or EOF
|
|
1721
|
+
if not choice:
|
|
1722
|
+
print("Cancelled (EOF)", file=sys.stderr)
|
|
1723
|
+
sys.exit(0)
|
|
1724
|
+
|
|
1725
|
+
idx = int(choice) - 1
|
|
1726
|
+
if 0 <= idx < min(args.num_matches, len(matching_sessions)):
|
|
1727
|
+
session_id, _, _, _, _, _, project_path, _, _, _ = matching_sessions[idx]
|
|
1728
|
+
resume_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
|
|
1729
|
+
else:
|
|
1730
|
+
print("Invalid choice", file=sys.stderr)
|
|
1731
|
+
sys.exit(1)
|
|
1732
|
+
except (KeyboardInterrupt, EOFError):
|
|
1733
|
+
print("\nCancelled", file=sys.stderr)
|
|
1734
|
+
sys.exit(0)
|
|
1735
|
+
except ValueError:
|
|
1736
|
+
print("Invalid input", file=sys.stderr)
|
|
1737
|
+
sys.exit(1)
|
|
1738
|
+
|
|
1739
|
+
|
|
1740
|
+
if __name__ == "__main__":
|
|
1741
|
+
main()
|