claude-code-tools 0.2.0__py3-none-any.whl → 1.0.6__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.
- claude_code_tools/__init__.py +1 -1
- claude_code_tools/action_rpc.py +401 -0
- claude_code_tools/aichat.py +1718 -0
- claude_code_tools/claude_continue.py +295 -0
- claude_code_tools/codex_continue.py +261 -0
- claude_code_tools/config.py +93 -0
- claude_code_tools/delete_session.py +194 -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 +1256 -118
- claude_code_tools/find_codex_session.py +928 -76
- claude_code_tools/find_original_session.py +134 -0
- claude_code_tools/find_session.py +1074 -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 +414 -0
- claude_code_tools/smart_trim_core.py +614 -0
- claude_code_tools/tmux_cli_controller.py +20 -11
- claude_code_tools/trim_session.py +791 -0
- claude_code_tools/trim_session_claude.py +319 -0
- claude_code_tools/trim_session_codex.py +344 -0
- claude_code_tools-1.0.6.dist-info/METADATA +685 -0
- claude_code_tools-1.0.6.dist-info/RECORD +1807 -0
- {claude_code_tools-0.2.0.dist-info → claude_code_tools-1.0.6.dist-info}/WHEEL +1 -1
- {claude_code_tools-0.2.0.dist-info → claude_code_tools-1.0.6.dist-info}/entry_points.txt +1 -2
- docs/lmsh.md +27 -5
- 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
- claude_code_tools/codex_bridge_mcp.py +0 -333
- claude_code_tools-0.2.0.dist-info/METADATA +0 -495
- claude_code_tools-0.2.0.dist-info/RECORD +0 -22
- {claude_code_tools-0.2.0.dist-info → claude_code_tools-1.0.6.dist-info}/licenses/LICENSE +0 -0
|
@@ -19,12 +19,97 @@ import json
|
|
|
19
19
|
import os
|
|
20
20
|
import re
|
|
21
21
|
import shlex
|
|
22
|
-
import subprocess
|
|
23
22
|
import sys
|
|
23
|
+
import time
|
|
24
|
+
import termios
|
|
25
|
+
import tty
|
|
24
26
|
from datetime import datetime
|
|
25
27
|
from pathlib import Path
|
|
26
28
|
from typing import List, Set, Tuple, Optional
|
|
27
29
|
|
|
30
|
+
from claude_code_tools.session_menu import (
|
|
31
|
+
show_action_menu as menu_show_action_menu,
|
|
32
|
+
show_resume_submenu as menu_show_resume_submenu,
|
|
33
|
+
prompt_suppress_options as menu_prompt_suppress_options,
|
|
34
|
+
)
|
|
35
|
+
from claude_code_tools.node_menu_ui import run_node_menu_ui, run_find_options_ui
|
|
36
|
+
from claude_code_tools.trim_session import (
|
|
37
|
+
trim_and_create_session,
|
|
38
|
+
is_trimmed_session,
|
|
39
|
+
get_session_derivation_type,
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def get_session_start_timestamp(jsonl_file: Path) -> Optional[float]:
|
|
44
|
+
"""Extract session start timestamp from first entry with timestamp field.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
jsonl_file: Path to Claude session JSONL file
|
|
48
|
+
|
|
49
|
+
Returns:
|
|
50
|
+
Unix timestamp as float, or None if not found
|
|
51
|
+
"""
|
|
52
|
+
try:
|
|
53
|
+
with open(jsonl_file, "r", encoding="utf-8") as f:
|
|
54
|
+
for i, line in enumerate(f):
|
|
55
|
+
if i >= 10: # Only check first 10 lines
|
|
56
|
+
break
|
|
57
|
+
line = line.strip()
|
|
58
|
+
if not line:
|
|
59
|
+
continue
|
|
60
|
+
try:
|
|
61
|
+
data = json.loads(line)
|
|
62
|
+
if data.get("timestamp"):
|
|
63
|
+
ts = data["timestamp"]
|
|
64
|
+
# Parse ISO format (e.g., "2025-10-22T16:05:28.707Z")
|
|
65
|
+
if ts.endswith("Z"):
|
|
66
|
+
ts = ts[:-1] + "+00:00"
|
|
67
|
+
return datetime.fromisoformat(ts).timestamp()
|
|
68
|
+
except (json.JSONDecodeError, ValueError, TypeError):
|
|
69
|
+
continue
|
|
70
|
+
except (OSError, IOError):
|
|
71
|
+
pass
|
|
72
|
+
return None
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _read_key() -> str:
|
|
76
|
+
"""Read a single keypress (Enter/Esc)."""
|
|
77
|
+
fd = sys.stdin.fileno()
|
|
78
|
+
old = termios.tcgetattr(fd)
|
|
79
|
+
try:
|
|
80
|
+
tty.setcbreak(fd)
|
|
81
|
+
ch = sys.stdin.read(1)
|
|
82
|
+
finally:
|
|
83
|
+
termios.tcsetattr(fd, termios.TCSADRAIN, old)
|
|
84
|
+
return ch
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def prompt_post_action() -> str:
|
|
88
|
+
"""After non-launch actions: Enter exits, Esc returns to menu."""
|
|
89
|
+
print("\n[Action complete] Press Enter to exit, or Esc to return to menu", file=sys.stderr)
|
|
90
|
+
ch = _read_key()
|
|
91
|
+
if ch == "\x1b":
|
|
92
|
+
return "back"
|
|
93
|
+
return "exit"
|
|
94
|
+
|
|
95
|
+
# 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
|
+
|
|
28
113
|
try:
|
|
29
114
|
from rich.console import Console
|
|
30
115
|
from rich.table import Table
|
|
@@ -41,27 +126,21 @@ console = Console() if RICH_AVAILABLE else None
|
|
|
41
126
|
def get_claude_project_dir(claude_home: Optional[str] = None) -> Path:
|
|
42
127
|
"""Convert current working directory to Claude project directory path."""
|
|
43
128
|
cwd = os.getcwd()
|
|
44
|
-
|
|
45
|
-
# Use provided claude_home or default to ~/.claude
|
|
46
|
-
if claude_home:
|
|
47
|
-
base_dir = Path(claude_home).expanduser()
|
|
48
|
-
else:
|
|
49
|
-
base_dir = Path.home() / ".claude"
|
|
50
129
|
|
|
51
|
-
#
|
|
52
|
-
|
|
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)
|
|
53
135
|
claude_dir = base_dir / "projects" / project_path
|
|
54
136
|
return claude_dir
|
|
55
137
|
|
|
56
138
|
|
|
57
139
|
def get_all_claude_projects(claude_home: Optional[str] = None) -> List[Tuple[Path, str]]:
|
|
58
140
|
"""Get all Claude project directories with their original paths."""
|
|
59
|
-
# Use provided claude_home or default to ~/.claude
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
else:
|
|
63
|
-
base_dir = Path.home() / ".claude"
|
|
64
|
-
|
|
141
|
+
# Use provided claude_home, CLAUDE_CONFIG_DIR env var, or default to ~/.claude
|
|
142
|
+
base_dir = get_claude_home(claude_home)
|
|
143
|
+
|
|
65
144
|
projects_dir = base_dir / "projects"
|
|
66
145
|
|
|
67
146
|
if not projects_dir.exists():
|
|
@@ -121,51 +200,74 @@ def extract_project_name(original_path: str) -> str:
|
|
|
121
200
|
return parts[-1] if parts else "unknown"
|
|
122
201
|
|
|
123
202
|
|
|
124
|
-
def search_keywords_in_file(filepath: Path, keywords: List[str]) -> tuple[bool, int, Optional[str]]:
|
|
125
203
|
"""
|
|
126
204
|
Check if all keywords are present in the JSONL file, count lines, and extract git branch.
|
|
127
|
-
|
|
205
|
+
|
|
128
206
|
Args:
|
|
129
207
|
filepath: Path to the JSONL file
|
|
130
|
-
keywords: List of keywords to search for (case-insensitive)
|
|
131
|
-
|
|
208
|
+
keywords: List of keywords to search for (case-insensitive). Empty list matches all files.
|
|
209
|
+
|
|
132
210
|
Returns:
|
|
133
211
|
Tuple of (matches: bool, line_count: int, git_branch: Optional[str])
|
|
134
|
-
- matches: True if ALL keywords are found in the file
|
|
212
|
+
- matches: True if ALL keywords are found in the file (or True if no keywords)
|
|
135
213
|
- line_count: Total number of lines in the file
|
|
136
214
|
- git_branch: Git branch name from the first message that has it, or None
|
|
137
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
|
+
|
|
138
238
|
# Convert keywords to lowercase for case-insensitive search
|
|
139
239
|
keywords_lower = [k.lower() for k in keywords]
|
|
140
240
|
found_keywords = set()
|
|
141
|
-
|
|
241
|
+
msg_count = 0
|
|
142
242
|
git_branch = None
|
|
143
|
-
|
|
243
|
+
|
|
144
244
|
try:
|
|
145
245
|
with open(filepath, 'r', encoding='utf-8') as f:
|
|
146
246
|
for line in f:
|
|
147
|
-
line_count += 1
|
|
148
247
|
line_lower = line.lower()
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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:
|
|
154
256
|
if 'gitBranch' in data and data['gitBranch']:
|
|
155
257
|
git_branch = data['gitBranch']
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
# Check which keywords are in this line
|
|
258
|
+
except (json.JSONDecodeError, KeyError):
|
|
259
|
+
pass
|
|
260
|
+
|
|
261
|
+
# Check which keywords are in this line (search all lines)
|
|
160
262
|
for keyword in keywords_lower:
|
|
161
263
|
if keyword in line_lower:
|
|
162
264
|
found_keywords.add(keyword)
|
|
163
265
|
except Exception:
|
|
164
266
|
# Skip files that can't be read
|
|
165
267
|
return False, 0, None
|
|
166
|
-
|
|
268
|
+
|
|
167
269
|
matches = len(found_keywords) == len(keywords_lower)
|
|
168
|
-
return matches,
|
|
270
|
+
return matches, msg_count, git_branch
|
|
169
271
|
|
|
170
272
|
|
|
171
273
|
def is_system_message(text: str) -> bool:
|
|
@@ -179,17 +281,123 @@ def is_system_message(text: str) -> bool:
|
|
|
179
281
|
return False
|
|
180
282
|
|
|
181
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
|
+
|
|
182
389
|
def get_session_preview(filepath: Path) -> str:
|
|
183
|
-
"""Get a preview of the session from the LAST
|
|
184
|
-
|
|
390
|
+
"""Get a preview of the session from the LAST message of any type."""
|
|
391
|
+
last_message = None # Tuple of (type_prefix, content)
|
|
185
392
|
|
|
186
393
|
try:
|
|
187
394
|
with open(filepath, 'r', encoding='utf-8') as f:
|
|
188
395
|
for line in f:
|
|
189
396
|
try:
|
|
190
397
|
data = json.loads(line.strip())
|
|
191
|
-
|
|
192
|
-
|
|
398
|
+
msg_type = data.get('type')
|
|
399
|
+
# Accept user or assistant messages
|
|
400
|
+
if msg_type in ('user', 'assistant'):
|
|
193
401
|
message = data.get('message', {})
|
|
194
402
|
content = message.get('content', '')
|
|
195
403
|
text = None
|
|
@@ -203,34 +411,49 @@ def get_session_preview(filepath: Path) -> str:
|
|
|
203
411
|
text = item.get('text', '').strip()
|
|
204
412
|
break
|
|
205
413
|
|
|
206
|
-
# Filter out system messages and keep updating to get LAST
|
|
414
|
+
# Filter out system messages and keep updating to get LAST
|
|
207
415
|
if text and not is_system_message(text):
|
|
208
416
|
cleaned = text.replace('\n', ' ')[:400]
|
|
417
|
+
type_prefix = f"[{msg_type}]"
|
|
209
418
|
# Prefer substantial messages (>20 chars)
|
|
210
419
|
if len(cleaned) > 20:
|
|
211
|
-
|
|
212
|
-
elif
|
|
213
|
-
|
|
420
|
+
last_message = (type_prefix, cleaned)
|
|
421
|
+
elif last_message is None:
|
|
422
|
+
last_message = (type_prefix, cleaned)
|
|
214
423
|
|
|
215
424
|
except (json.JSONDecodeError, KeyError):
|
|
216
425
|
continue
|
|
217
426
|
except Exception:
|
|
218
427
|
pass
|
|
219
428
|
|
|
220
|
-
|
|
429
|
+
if last_message:
|
|
430
|
+
return f"{last_message[0]} {last_message[1]}"
|
|
431
|
+
return "No preview available"
|
|
221
432
|
|
|
222
433
|
|
|
223
|
-
def find_sessions(
|
|
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]]:
|
|
224
443
|
"""
|
|
225
444
|
Find all Claude Code sessions containing the specified keywords.
|
|
226
|
-
|
|
445
|
+
|
|
227
446
|
Args:
|
|
228
447
|
keywords: List of keywords to search for
|
|
229
448
|
global_search: If True, search all projects; if False, search current project only
|
|
230
449
|
claude_home: Optional custom Claude home directory (defaults to ~/.claude)
|
|
231
|
-
|
|
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
|
+
|
|
232
455
|
Returns:
|
|
233
|
-
List of tuples (session_id, modification_time, line_count, project_name, preview, project_path, git_branch) sorted by modification time
|
|
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
|
|
234
457
|
"""
|
|
235
458
|
matching_sessions = []
|
|
236
459
|
|
|
@@ -255,24 +478,94 @@ def find_sessions(keywords: List[str], global_search: bool = False, claude_home:
|
|
|
255
478
|
for jsonl_file in project_dir.glob("*.jsonl"):
|
|
256
479
|
matches, line_count, git_branch = search_keywords_in_file(jsonl_file, keywords)
|
|
257
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
|
+
|
|
258
506
|
session_id = jsonl_file.stem
|
|
259
|
-
|
|
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)
|
|
260
513
|
preview = get_session_preview(jsonl_file)
|
|
261
|
-
|
|
262
|
-
|
|
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
|
+
|
|
263
521
|
progress.advance(task)
|
|
264
522
|
else:
|
|
265
523
|
# Fallback without rich
|
|
266
524
|
for project_dir, original_path in projects:
|
|
267
525
|
project_name = extract_project_name(original_path)
|
|
268
|
-
|
|
526
|
+
|
|
269
527
|
for jsonl_file in project_dir.glob("*.jsonl"):
|
|
270
528
|
matches, line_count, git_branch = search_keywords_in_file(jsonl_file, keywords)
|
|
271
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
|
+
|
|
272
555
|
session_id = jsonl_file.stem
|
|
273
|
-
|
|
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)
|
|
274
562
|
preview = get_session_preview(jsonl_file)
|
|
275
|
-
|
|
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))
|
|
276
569
|
else:
|
|
277
570
|
# Search current project only
|
|
278
571
|
claude_dir = get_claude_project_dir(claude_home)
|
|
@@ -286,10 +579,42 @@ def find_sessions(keywords: List[str], global_search: bool = False, claude_home:
|
|
|
286
579
|
for jsonl_file in claude_dir.glob("*.jsonl"):
|
|
287
580
|
matches, line_count, git_branch = search_keywords_in_file(jsonl_file, keywords)
|
|
288
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
|
+
|
|
289
607
|
session_id = jsonl_file.stem
|
|
290
|
-
|
|
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)
|
|
291
614
|
preview = get_session_preview(jsonl_file)
|
|
292
|
-
|
|
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))
|
|
293
618
|
|
|
294
619
|
# Sort by modification time (newest first)
|
|
295
620
|
matching_sessions.sort(key=lambda x: x[1], reverse=True)
|
|
@@ -297,26 +622,27 @@ def find_sessions(keywords: List[str], global_search: bool = False, claude_home:
|
|
|
297
622
|
return matching_sessions
|
|
298
623
|
|
|
299
624
|
|
|
300
|
-
def display_interactive_ui(sessions: List[Tuple[str, float, int, str, str, str, Optional[str]]], keywords: List[str], stderr_mode: bool = False, num_matches: int = 10) -> Optional[Tuple[str, str]]:
|
|
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]]:
|
|
301
626
|
"""Display interactive UI for session selection."""
|
|
302
627
|
if not RICH_AVAILABLE:
|
|
303
628
|
return None
|
|
304
|
-
|
|
629
|
+
|
|
305
630
|
# Use stderr console if in stderr mode
|
|
306
631
|
ui_console = Console(file=sys.stderr) if stderr_mode else console
|
|
307
632
|
if not ui_console:
|
|
308
633
|
return None
|
|
309
|
-
|
|
634
|
+
|
|
310
635
|
# Limit to specified number of sessions
|
|
311
636
|
display_sessions = sessions[:num_matches]
|
|
312
|
-
|
|
637
|
+
|
|
313
638
|
if not display_sessions:
|
|
314
639
|
ui_console.print("[red]No sessions found[/red]")
|
|
315
640
|
return None
|
|
316
|
-
|
|
641
|
+
|
|
317
642
|
# Create table
|
|
643
|
+
title = f"Sessions matching: {', '.join(keywords)}" if keywords else "All sessions"
|
|
318
644
|
table = Table(
|
|
319
|
-
title=
|
|
645
|
+
title=title,
|
|
320
646
|
box=box.ROUNDED,
|
|
321
647
|
show_header=True,
|
|
322
648
|
header_style="bold cyan"
|
|
@@ -326,28 +652,61 @@ def display_interactive_ui(sessions: List[Tuple[str, float, int, str, str, str,
|
|
|
326
652
|
table.add_column("Session ID", style="dim")
|
|
327
653
|
table.add_column("Project", style="green")
|
|
328
654
|
table.add_column("Branch", style="magenta")
|
|
329
|
-
table.add_column("Date", style="blue")
|
|
655
|
+
table.add_column("Date-Range", style="blue")
|
|
330
656
|
table.add_column("Lines", style="cyan", justify="right")
|
|
331
|
-
table.add_column("
|
|
657
|
+
table.add_column("Last User Message", style="white", max_width=60, overflow="fold")
|
|
332
658
|
|
|
333
|
-
for idx, (session_id, mod_time, line_count, project_name, preview, _, git_branch) in enumerate(display_sessions, 1):
|
|
334
|
-
|
|
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}"
|
|
335
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
|
+
|
|
336
675
|
table.add_row(
|
|
337
676
|
str(idx),
|
|
338
|
-
|
|
677
|
+
session_id_display,
|
|
339
678
|
project_name,
|
|
340
679
|
branch_display,
|
|
341
|
-
|
|
680
|
+
date_display,
|
|
342
681
|
str(line_count),
|
|
343
682
|
preview
|
|
344
683
|
)
|
|
345
684
|
|
|
346
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
|
+
|
|
347
706
|
ui_console.print("\n[bold]Select a session:[/bold]")
|
|
348
707
|
ui_console.print(f" • Enter number (1-{len(display_sessions)}) to select")
|
|
349
|
-
ui_console.print(" • Press
|
|
350
|
-
|
|
708
|
+
ui_console.print(" • Press Enter to cancel\n")
|
|
709
|
+
|
|
351
710
|
while True:
|
|
352
711
|
try:
|
|
353
712
|
# In stderr mode, we need to ensure nothing goes to stdout
|
|
@@ -355,48 +714,513 @@ def display_interactive_ui(sessions: List[Tuple[str, float, int, str, str, str,
|
|
|
355
714
|
# Temporarily redirect stdout to devnull
|
|
356
715
|
old_stdout = sys.stdout
|
|
357
716
|
sys.stdout = open(os.devnull, 'w')
|
|
358
|
-
|
|
717
|
+
|
|
359
718
|
choice = Prompt.ask(
|
|
360
719
|
"Your choice",
|
|
361
|
-
|
|
362
|
-
|
|
720
|
+
default="",
|
|
721
|
+
show_default=False,
|
|
363
722
|
console=ui_console
|
|
364
723
|
)
|
|
365
|
-
|
|
366
|
-
# Handle empty input
|
|
724
|
+
|
|
725
|
+
# Handle empty input - cancel
|
|
367
726
|
if not choice or not choice.strip():
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
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
|
+
|
|
371
734
|
# Restore stdout
|
|
372
735
|
if stderr_mode:
|
|
373
736
|
sys.stdout.close()
|
|
374
737
|
sys.stdout = old_stdout
|
|
375
|
-
|
|
738
|
+
|
|
376
739
|
idx = int(choice) - 1
|
|
377
740
|
if 0 <= idx < len(display_sessions):
|
|
378
741
|
session_info = display_sessions[idx]
|
|
379
|
-
return
|
|
380
|
-
|
|
742
|
+
return session_info # Return full session tuple
|
|
743
|
+
else:
|
|
744
|
+
ui_console.print("[red]Invalid choice. Please try again.[/red]")
|
|
745
|
+
|
|
381
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
|
|
382
751
|
ui_console.print("\n[yellow]Cancelled[/yellow]")
|
|
383
752
|
return None
|
|
384
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
|
|
385
758
|
ui_console.print("\n[yellow]Cancelled (EOF)[/yellow]")
|
|
386
759
|
return None
|
|
387
760
|
except ValueError:
|
|
388
761
|
ui_console.print("[red]Invalid choice. Please try again.[/red]")
|
|
389
762
|
|
|
390
763
|
|
|
391
|
-
def
|
|
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
|
+
new_session_id = result["session_id"]
|
|
837
|
+
new_session_file = Path(result["output_file"])
|
|
838
|
+
|
|
839
|
+
# Calculate total lines trimmed for confirmation UI
|
|
840
|
+
total_trimmed = result['num_tools_trimmed'] + result['num_assistant_trimmed']
|
|
841
|
+
|
|
842
|
+
# Show confirmation UI
|
|
843
|
+
from claude_code_tools.node_menu_ui import run_trim_confirm_ui
|
|
844
|
+
action = run_trim_confirm_ui(
|
|
845
|
+
new_session_id=new_session_id,
|
|
846
|
+
lines_trimmed=total_trimmed,
|
|
847
|
+
tokens_saved=result['tokens_saved'],
|
|
848
|
+
output_file=str(new_session_file),
|
|
849
|
+
)
|
|
850
|
+
|
|
851
|
+
if action == 'resume':
|
|
852
|
+
# Resume the new session
|
|
853
|
+
resume_session(new_session_id, project_path, claude_home=claude_home)
|
|
854
|
+
return None
|
|
855
|
+
elif action == 'delete':
|
|
856
|
+
# Delete the new session file and go back to menu
|
|
857
|
+
new_session_file.unlink(missing_ok=True)
|
|
858
|
+
print(f"\n🗑️ Deleted session file: {new_session_file.name}")
|
|
859
|
+
return 'back'
|
|
860
|
+
else:
|
|
861
|
+
# Cancel (escape) - keep file, go back to menu
|
|
862
|
+
print(f"\n📁 Session file kept: {new_session_file}")
|
|
863
|
+
print(f" Session ID: {new_session_id}")
|
|
864
|
+
return 'back'
|
|
865
|
+
|
|
866
|
+
|
|
867
|
+
def handle_smart_trim_resume_claude(
|
|
868
|
+
session_id: str,
|
|
869
|
+
project_path: str,
|
|
870
|
+
claude_home: Optional[str] = None,
|
|
871
|
+
custom_instructions: Optional[str] = None,
|
|
872
|
+
) -> str | None:
|
|
873
|
+
"""
|
|
874
|
+
Smart trim session using parallel agents and resume Claude Code session.
|
|
875
|
+
|
|
876
|
+
Args:
|
|
877
|
+
session_id: Session ID to trim
|
|
878
|
+
project_path: Project path
|
|
879
|
+
claude_home: Optional custom Claude home directory
|
|
880
|
+
custom_instructions: Optional custom instructions for the trim agents
|
|
881
|
+
|
|
882
|
+
Returns:
|
|
883
|
+
'back' if user wants to go back to menu, None otherwise.
|
|
884
|
+
"""
|
|
885
|
+
import uuid
|
|
886
|
+
|
|
887
|
+
session_file = Path(get_session_file_path(session_id, project_path, claude_home))
|
|
888
|
+
|
|
889
|
+
print(f"\n🤖 Smart trimming session using Claude CLI...")
|
|
890
|
+
if custom_instructions:
|
|
891
|
+
print(f" Instructions: {custom_instructions[:60]}...")
|
|
892
|
+
print(f" This may take a minute as Claude analyzes the session...")
|
|
893
|
+
|
|
894
|
+
try:
|
|
895
|
+
# Identify trimmable lines using CLI with parallel sub-agents
|
|
896
|
+
trimmable = identify_trimmable_lines_cli(
|
|
897
|
+
session_file,
|
|
898
|
+
exclude_types=[],
|
|
899
|
+
preserve_recent=10,
|
|
900
|
+
custom_instructions=custom_instructions,
|
|
901
|
+
)
|
|
902
|
+
|
|
903
|
+
if not trimmable:
|
|
904
|
+
# Show confirmation for "nothing to trim" case
|
|
905
|
+
from claude_code_tools.node_menu_ui import run_trim_confirm_ui
|
|
906
|
+
action = run_trim_confirm_ui(
|
|
907
|
+
nothing_to_trim=True,
|
|
908
|
+
original_session_id=session_id,
|
|
909
|
+
)
|
|
910
|
+
|
|
911
|
+
if action == 'resume':
|
|
912
|
+
resume_session(session_id, project_path, claude_home=claude_home)
|
|
913
|
+
return None
|
|
914
|
+
# 'back' or 'cancel' - return signal to go back to menu
|
|
915
|
+
return 'back'
|
|
916
|
+
|
|
917
|
+
print(f" Found {len(trimmable)} lines to trim")
|
|
918
|
+
|
|
919
|
+
# Extract line indices and descriptions from verbose tuples
|
|
920
|
+
# trimmable is list of (line_idx, rationale, description) tuples
|
|
921
|
+
line_indices = [item[0] for item in trimmable]
|
|
922
|
+
descriptions = {
|
|
923
|
+
item[0]: item[2] for item in trimmable if len(item) > 2 and item[2]
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
# Generate new session ID
|
|
927
|
+
new_session_id = str(uuid.uuid4())
|
|
928
|
+
|
|
929
|
+
# Create output path
|
|
930
|
+
output_file = session_file.parent / f"{new_session_id}.jsonl"
|
|
931
|
+
|
|
932
|
+
# Perform trimming
|
|
933
|
+
stats = trim_lines(
|
|
934
|
+
session_file, line_indices, output_file, descriptions=descriptions
|
|
935
|
+
)
|
|
936
|
+
|
|
937
|
+
# Check if savings are worth it (minimum 300 tokens)
|
|
938
|
+
MIN_TOKEN_SAVINGS = 300
|
|
939
|
+
if stats['tokens_saved'] < MIN_TOKEN_SAVINGS:
|
|
940
|
+
# Not worth trimming - delete output and show nothing to trim
|
|
941
|
+
output_file.unlink(missing_ok=True)
|
|
942
|
+
print(f" Savings too small ({stats['tokens_saved']} tokens < {MIN_TOKEN_SAVINGS})")
|
|
943
|
+
print(f" (Diagnostic file: .claude/trim-result-{session_id}.jsonl)")
|
|
944
|
+
from claude_code_tools.node_menu_ui import run_trim_confirm_ui
|
|
945
|
+
action = run_trim_confirm_ui(
|
|
946
|
+
nothing_to_trim=True,
|
|
947
|
+
original_session_id=session_id,
|
|
948
|
+
)
|
|
949
|
+
if action == 'resume':
|
|
950
|
+
resume_session(session_id, project_path, claude_home=claude_home)
|
|
951
|
+
return None
|
|
952
|
+
return 'back'
|
|
953
|
+
|
|
954
|
+
# Show confirmation UI
|
|
955
|
+
from claude_code_tools.node_menu_ui import run_trim_confirm_ui
|
|
956
|
+
action = run_trim_confirm_ui(
|
|
957
|
+
new_session_id=new_session_id,
|
|
958
|
+
lines_trimmed=stats['num_lines_trimmed'],
|
|
959
|
+
tokens_saved=stats['tokens_saved'],
|
|
960
|
+
output_file=str(output_file),
|
|
961
|
+
)
|
|
962
|
+
|
|
963
|
+
if action == 'resume':
|
|
964
|
+
# Resume the new session
|
|
965
|
+
resume_session(new_session_id, project_path, claude_home=claude_home)
|
|
966
|
+
return None
|
|
967
|
+
elif action == 'delete':
|
|
968
|
+
# Delete the new session file and go back to menu
|
|
969
|
+
output_file.unlink(missing_ok=True)
|
|
970
|
+
print(f"\n🗑️ Deleted session file: {output_file.name}")
|
|
971
|
+
return 'back'
|
|
972
|
+
else:
|
|
973
|
+
# Cancel (escape) - keep file, go back to menu
|
|
974
|
+
print(f"\n📁 Session file kept: {output_file}")
|
|
975
|
+
print(f" Session ID: {new_session_id}")
|
|
976
|
+
return 'back'
|
|
977
|
+
|
|
978
|
+
except Exception as e:
|
|
979
|
+
print(f"❌ Error during smart trim: {e}")
|
|
980
|
+
import traceback
|
|
981
|
+
traceback.print_exc()
|
|
982
|
+
return None
|
|
983
|
+
|
|
984
|
+
|
|
985
|
+
def show_action_menu(session_info: Tuple[str, float, float, int, str, str, str, Optional[str]]) -> Optional[str]:
|
|
986
|
+
"""
|
|
987
|
+
Show action menu for selected session.
|
|
988
|
+
|
|
989
|
+
Returns: action choice ('resume', 'path', 'copy') or None if cancelled
|
|
990
|
+
"""
|
|
991
|
+
session_id, _, _, _, project_name, _, project_path, git_branch, _, is_sidechain = session_info
|
|
992
|
+
|
|
993
|
+
return menu_show_action_menu(
|
|
994
|
+
session_id=session_id,
|
|
995
|
+
agent="claude",
|
|
996
|
+
project_name=project_name,
|
|
997
|
+
git_branch=git_branch,
|
|
998
|
+
is_sidechain=is_sidechain,
|
|
999
|
+
stderr_mode=False,
|
|
1000
|
+
)
|
|
1001
|
+
|
|
1002
|
+
|
|
1003
|
+
def get_session_file_path(
|
|
1004
|
+
session_id: str, project_path: str, claude_home: Optional[str] = None
|
|
1005
|
+
) -> str:
|
|
1006
|
+
"""Get the full file path for a session.
|
|
1007
|
+
|
|
1008
|
+
Supports both full and partial session IDs. If an exact match isn't found,
|
|
1009
|
+
searches for sessions containing the given ID string.
|
|
1010
|
+
|
|
1011
|
+
Args:
|
|
1012
|
+
session_id: Full or partial session UUID
|
|
1013
|
+
project_path: Project working directory path
|
|
1014
|
+
claude_home: Optional custom Claude home directory
|
|
1015
|
+
|
|
1016
|
+
Returns:
|
|
1017
|
+
Full path to the session file
|
|
1018
|
+
|
|
1019
|
+
Raises:
|
|
1020
|
+
FileNotFoundError: If session cannot be found
|
|
1021
|
+
ValueError: If partial ID matches multiple sessions
|
|
1022
|
+
"""
|
|
1023
|
+
base_dir = get_claude_home(claude_home)
|
|
1024
|
+
encoded_path = encode_claude_project_path(project_path)
|
|
1025
|
+
claude_project_dir = base_dir / "projects" / encoded_path
|
|
1026
|
+
|
|
1027
|
+
# Try exact match first (fast path)
|
|
1028
|
+
exact_path = claude_project_dir / f"{session_id}.jsonl"
|
|
1029
|
+
if exact_path.exists():
|
|
1030
|
+
return str(exact_path)
|
|
1031
|
+
|
|
1032
|
+
# If project directory doesn't exist, return constructed path
|
|
1033
|
+
# (maintains backward compatibility - caller can handle non-existent path)
|
|
1034
|
+
if not claude_project_dir.exists():
|
|
1035
|
+
return str(exact_path)
|
|
1036
|
+
|
|
1037
|
+
# Search for partial matches in the project directory
|
|
1038
|
+
matches = []
|
|
1039
|
+
for jsonl_file in claude_project_dir.glob("*.jsonl"):
|
|
1040
|
+
if session_id in jsonl_file.stem:
|
|
1041
|
+
matches.append(jsonl_file)
|
|
1042
|
+
|
|
1043
|
+
if len(matches) == 0:
|
|
1044
|
+
# No partial matches found, return constructed path
|
|
1045
|
+
return str(exact_path)
|
|
1046
|
+
elif len(matches) == 1:
|
|
1047
|
+
return str(matches[0])
|
|
1048
|
+
else:
|
|
1049
|
+
match_list = "\n ".join(str(m.name) for m in matches)
|
|
1050
|
+
raise ValueError(
|
|
1051
|
+
f"Multiple sessions match '{session_id}':\n {match_list}\n"
|
|
1052
|
+
f"Please use a more specific session ID."
|
|
1053
|
+
)
|
|
1054
|
+
|
|
1055
|
+
|
|
1056
|
+
def handle_export_session(session_file_path: str, dest_override: str | None = None, silent: bool = False) -> None:
|
|
1057
|
+
"""Export session to text file."""
|
|
1058
|
+
from claude_code_tools.export_claude_session import export_session_to_markdown as do_export
|
|
1059
|
+
from datetime import datetime
|
|
1060
|
+
|
|
1061
|
+
try:
|
|
1062
|
+
# Generate default export path using session's project directory
|
|
1063
|
+
session_file = Path(session_file_path)
|
|
1064
|
+
session_id = session_file.stem
|
|
1065
|
+
today = datetime.now().strftime("%Y%m%d")
|
|
1066
|
+
|
|
1067
|
+
# Infer project directory from session metadata
|
|
1068
|
+
project_dir = extract_cwd_from_session(session_file)
|
|
1069
|
+
if project_dir:
|
|
1070
|
+
output_dir = Path(project_dir) / "exported-sessions"
|
|
1071
|
+
else:
|
|
1072
|
+
output_dir = Path.cwd() / "exported-sessions"
|
|
1073
|
+
|
|
1074
|
+
default_path = output_dir / f"{today}-claude-session-{session_id}.txt"
|
|
1075
|
+
|
|
1076
|
+
if dest_override is None:
|
|
1077
|
+
print(f"\nDefault export path: {default_path}")
|
|
1078
|
+
dest = input("Path (or Enter for default): ").strip()
|
|
1079
|
+
if not dest:
|
|
1080
|
+
dest_path = default_path
|
|
1081
|
+
else:
|
|
1082
|
+
dest_path = Path(dest).expanduser()
|
|
1083
|
+
|
|
1084
|
+
# Force .txt extension
|
|
1085
|
+
if dest_path.suffix != ".txt":
|
|
1086
|
+
dest_path = dest_path.with_suffix(".txt")
|
|
1087
|
+
else:
|
|
1088
|
+
dest_path = Path(dest_override).expanduser()
|
|
1089
|
+
if dest_path.suffix != ".txt":
|
|
1090
|
+
dest_path = dest_path.with_suffix(".txt")
|
|
1091
|
+
|
|
1092
|
+
# Create parent directory if needed
|
|
1093
|
+
dest_path.parent.mkdir(parents=True, exist_ok=True)
|
|
1094
|
+
|
|
1095
|
+
# Export to text file
|
|
1096
|
+
print(f"\n📄 Exporting session...")
|
|
1097
|
+
with open(dest_path, 'w') as f:
|
|
1098
|
+
stats = do_export(Path(session_file_path), f, verbose=False)
|
|
1099
|
+
|
|
1100
|
+
if not silent:
|
|
1101
|
+
print(f"✅ Export complete!")
|
|
1102
|
+
print(f" User messages: {stats['user_messages']}")
|
|
1103
|
+
print(f" Assistant messages: {stats['assistant_messages']}")
|
|
1104
|
+
print(f" Tool calls: {stats['tool_calls']}")
|
|
1105
|
+
print(f" Tool results: {stats['tool_results']}")
|
|
1106
|
+
print(f" Skipped items: {stats['skipped']}")
|
|
1107
|
+
print(f"\n📄 Exported to: {dest_path}")
|
|
1108
|
+
|
|
1109
|
+
except Exception as e:
|
|
1110
|
+
print(f"\nError exporting session: {e}")
|
|
1111
|
+
|
|
1112
|
+
|
|
1113
|
+
def copy_session_file(session_file_path: str, dest_override: str | None = None, silent: bool = False) -> None:
|
|
1114
|
+
"""Copy session file to user-specified file or directory."""
|
|
1115
|
+
try:
|
|
1116
|
+
if dest_override is None:
|
|
1117
|
+
dest = input("\nEnter destination file or directory path: ").strip()
|
|
1118
|
+
if not dest:
|
|
1119
|
+
print("Cancelled.")
|
|
1120
|
+
return
|
|
1121
|
+
else:
|
|
1122
|
+
dest = dest_override
|
|
1123
|
+
|
|
1124
|
+
dest_path = Path(dest).expanduser()
|
|
1125
|
+
source = Path(session_file_path)
|
|
1126
|
+
|
|
1127
|
+
# Determine if destination is a directory or file
|
|
1128
|
+
if dest_path.exists():
|
|
1129
|
+
if dest_path.is_dir():
|
|
1130
|
+
# Copy into directory with original filename
|
|
1131
|
+
dest_file = dest_path / source.name
|
|
1132
|
+
else:
|
|
1133
|
+
# Copy to specified file
|
|
1134
|
+
dest_file = dest_path
|
|
1135
|
+
else:
|
|
1136
|
+
# Destination doesn't exist - check if it looks like a directory
|
|
1137
|
+
if dest.endswith('/') or dest.endswith(os.sep):
|
|
1138
|
+
# Treat as directory - create it
|
|
1139
|
+
create = input(f"Directory {dest_path} does not exist. Create it? [y/N]: ").strip().lower()
|
|
1140
|
+
if create in ('y', 'yes'):
|
|
1141
|
+
dest_path.mkdir(parents=True, exist_ok=True)
|
|
1142
|
+
dest_file = dest_path / source.name
|
|
1143
|
+
else:
|
|
1144
|
+
print("Cancelled.")
|
|
1145
|
+
return
|
|
1146
|
+
else:
|
|
1147
|
+
# Treat as file - create parent directory if needed
|
|
1148
|
+
parent = dest_path.parent
|
|
1149
|
+
if not parent.exists():
|
|
1150
|
+
create = input(f"Parent directory {parent} does not exist. Create it? [y/N]: ").strip().lower()
|
|
1151
|
+
if create in ('y', 'yes'):
|
|
1152
|
+
parent.mkdir(parents=True, exist_ok=True)
|
|
1153
|
+
else:
|
|
1154
|
+
print("Cancelled.")
|
|
1155
|
+
return
|
|
1156
|
+
dest_file = dest_path
|
|
1157
|
+
|
|
1158
|
+
import shutil
|
|
1159
|
+
shutil.copy2(source, dest_file)
|
|
1160
|
+
if not silent:
|
|
1161
|
+
print(f"\nCopied to: {dest_file}")
|
|
1162
|
+
|
|
1163
|
+
except KeyboardInterrupt:
|
|
1164
|
+
print("\nCancelled.")
|
|
1165
|
+
except Exception as e:
|
|
1166
|
+
print(f"\nError copying file: {e}")
|
|
1167
|
+
|
|
1168
|
+
|
|
1169
|
+
def clone_session(session_id: str, project_path: str, shell_mode: bool = False, claude_home: Optional[str] = None):
|
|
1170
|
+
"""Clone a Claude session to a new file with new UUID and resume it."""
|
|
1171
|
+
import shutil
|
|
1172
|
+
import uuid
|
|
1173
|
+
|
|
1174
|
+
# Get the original session file path
|
|
1175
|
+
source_path = Path(get_session_file_path(session_id, project_path, claude_home))
|
|
1176
|
+
|
|
1177
|
+
if not source_path.exists():
|
|
1178
|
+
print(f"\nError: Session file not found: {source_path}")
|
|
1179
|
+
return
|
|
1180
|
+
|
|
1181
|
+
# Generate new UUID for cloned session
|
|
1182
|
+
new_session_id = str(uuid.uuid4())
|
|
1183
|
+
|
|
1184
|
+
# Create destination path with new UUID in same directory
|
|
1185
|
+
dest_path = source_path.parent / f"{new_session_id}.jsonl"
|
|
1186
|
+
|
|
1187
|
+
try:
|
|
1188
|
+
# Copy the file
|
|
1189
|
+
shutil.copy2(source_path, dest_path)
|
|
1190
|
+
|
|
1191
|
+
# Update sessionId in all lines to match the new filename UUID
|
|
1192
|
+
from claude_code_tools.trim_session import update_session_id_in_file
|
|
1193
|
+
update_session_id_in_file(dest_path, new_session_id, agent="claude")
|
|
1194
|
+
|
|
1195
|
+
if not shell_mode:
|
|
1196
|
+
print(f"\nCloned session:")
|
|
1197
|
+
print(f" Original: {session_id}")
|
|
1198
|
+
print(f" New: {new_session_id}")
|
|
1199
|
+
print(f"\nResuming cloned session...")
|
|
1200
|
+
|
|
1201
|
+
# Resume the new cloned session
|
|
1202
|
+
resume_session(new_session_id, project_path, shell_mode=shell_mode, claude_home=claude_home)
|
|
1203
|
+
|
|
1204
|
+
except Exception as e:
|
|
1205
|
+
print(f"\nError cloning session: {e}")
|
|
1206
|
+
return
|
|
1207
|
+
|
|
1208
|
+
|
|
1209
|
+
def resume_session(session_id: str, project_path: str, shell_mode: bool = False, claude_home: Optional[str] = None):
|
|
392
1210
|
"""Resume a Claude session using claude -r command."""
|
|
393
1211
|
current_dir = os.getcwd()
|
|
394
|
-
|
|
1212
|
+
|
|
395
1213
|
# In shell mode, output commands for the shell to evaluate
|
|
396
1214
|
if shell_mode:
|
|
397
1215
|
if project_path != current_dir:
|
|
398
1216
|
print(f'cd {shlex.quote(project_path)}')
|
|
399
|
-
|
|
1217
|
+
# Set CLAUDE_CONFIG_DIR environment variable if custom path specified
|
|
1218
|
+
# (either via CLI arg or already set via env var)
|
|
1219
|
+
if claude_home or os.environ.get('CLAUDE_CONFIG_DIR'):
|
|
1220
|
+
expanded_home = str(get_claude_home(claude_home).absolute())
|
|
1221
|
+
print(f'CLAUDE_CONFIG_DIR={shlex.quote(expanded_home)} claude -r {shlex.quote(session_id)}')
|
|
1222
|
+
else:
|
|
1223
|
+
print(f'claude -r {shlex.quote(session_id)}')
|
|
400
1224
|
return
|
|
401
1225
|
|
|
402
1226
|
# Check if we need to change directory
|
|
@@ -439,7 +1263,14 @@ def resume_session(session_id: str, project_path: str, shell_mode: bool = False)
|
|
|
439
1263
|
# Change directory if needed (won't persist after exit)
|
|
440
1264
|
if change_dir and project_path != current_dir:
|
|
441
1265
|
os.chdir(project_path)
|
|
442
|
-
|
|
1266
|
+
|
|
1267
|
+
# Set CLAUDE_CONFIG_DIR environment variable if custom path specified
|
|
1268
|
+
# (either via CLI arg or already set via env var)
|
|
1269
|
+
if claude_home or os.environ.get('CLAUDE_CONFIG_DIR'):
|
|
1270
|
+
# Get the resolved home directory (respects precedence)
|
|
1271
|
+
expanded_home = str(get_claude_home(claude_home).absolute())
|
|
1272
|
+
os.environ['CLAUDE_CONFIG_DIR'] = expanded_home
|
|
1273
|
+
|
|
443
1274
|
# Execute claude
|
|
444
1275
|
os.execvp("claude", ["claude", "-r", session_id])
|
|
445
1276
|
|
|
@@ -457,6 +1288,75 @@ def resume_session(session_id: str, project_path: str, shell_mode: bool = False)
|
|
|
457
1288
|
sys.exit(1)
|
|
458
1289
|
|
|
459
1290
|
|
|
1291
|
+
def create_action_handler(claude_home: Optional[str] = None, nonlaunch_flag: Optional[dict] = None):
|
|
1292
|
+
"""
|
|
1293
|
+
Create an action handler function for TUI/UI integration.
|
|
1294
|
+
|
|
1295
|
+
Args:
|
|
1296
|
+
claude_home: Optional Claude home directory
|
|
1297
|
+
|
|
1298
|
+
Returns:
|
|
1299
|
+
Function that handles session actions
|
|
1300
|
+
"""
|
|
1301
|
+
def handle_session_action(
|
|
1302
|
+
session: Tuple, action: str, kwargs: Optional[dict] = None
|
|
1303
|
+
) -> None:
|
|
1304
|
+
"""Handle actions for a selected session."""
|
|
1305
|
+
kwargs = kwargs or {}
|
|
1306
|
+
|
|
1307
|
+
if isinstance(session, dict):
|
|
1308
|
+
session_id = session.get("session_id")
|
|
1309
|
+
project_path = session.get("cwd")
|
|
1310
|
+
else:
|
|
1311
|
+
session_id = session[0]
|
|
1312
|
+
project_path = session[6]
|
|
1313
|
+
|
|
1314
|
+
if action == "resume":
|
|
1315
|
+
resume_session(session_id, project_path, shell_mode=False, claude_home=claude_home)
|
|
1316
|
+
elif action == "suppress_resume":
|
|
1317
|
+
tools = kwargs.get("tools")
|
|
1318
|
+
threshold = kwargs.get("threshold")
|
|
1319
|
+
trim_assistant = kwargs.get("trim_assistant")
|
|
1320
|
+
if tools is None and threshold is None and trim_assistant is None:
|
|
1321
|
+
options = prompt_suppress_options()
|
|
1322
|
+
if not options:
|
|
1323
|
+
return
|
|
1324
|
+
tools, threshold, trim_assistant = options
|
|
1325
|
+
handle_suppress_resume_claude(
|
|
1326
|
+
session_id, project_path, tools, threshold or 500, trim_assistant, claude_home
|
|
1327
|
+
)
|
|
1328
|
+
elif action == "smart_trim_resume":
|
|
1329
|
+
handle_smart_trim_resume_claude(session_id, project_path, claude_home)
|
|
1330
|
+
elif action == "path":
|
|
1331
|
+
# handled in Node UI via RPC
|
|
1332
|
+
if nonlaunch_flag is not None:
|
|
1333
|
+
nonlaunch_flag["done"] = True
|
|
1334
|
+
nonlaunch_flag["session_id"] = session_id
|
|
1335
|
+
elif action == "copy":
|
|
1336
|
+
if nonlaunch_flag is not None:
|
|
1337
|
+
nonlaunch_flag["done"] = True
|
|
1338
|
+
nonlaunch_flag["session_id"] = session_id
|
|
1339
|
+
elif action == "clone":
|
|
1340
|
+
clone_session(session_id, project_path, shell_mode=False, claude_home=claude_home)
|
|
1341
|
+
elif action == "export":
|
|
1342
|
+
session_file_path = get_session_file_path(session_id, project_path, claude_home)
|
|
1343
|
+
handle_export_session(session_file_path)
|
|
1344
|
+
if nonlaunch_flag is not None:
|
|
1345
|
+
nonlaunch_flag["done"] = True
|
|
1346
|
+
nonlaunch_flag["session_id"] = session_id
|
|
1347
|
+
elif action == "continue":
|
|
1348
|
+
from claude_code_tools.session_utils import continue_with_options
|
|
1349
|
+
session_file_path = get_session_file_path(session_id, project_path, claude_home)
|
|
1350
|
+
continue_with_options(
|
|
1351
|
+
session_file_path,
|
|
1352
|
+
"claude",
|
|
1353
|
+
claude_home=claude_home,
|
|
1354
|
+
codex_home=None
|
|
1355
|
+
)
|
|
1356
|
+
|
|
1357
|
+
return handle_session_action
|
|
1358
|
+
|
|
1359
|
+
|
|
460
1360
|
def main():
|
|
461
1361
|
parser = argparse.ArgumentParser(
|
|
462
1362
|
description="Search Claude Code session files by keywords",
|
|
@@ -477,7 +1377,9 @@ To persist directory changes when resuming sessions:
|
|
|
477
1377
|
)
|
|
478
1378
|
parser.add_argument(
|
|
479
1379
|
"keywords",
|
|
480
|
-
|
|
1380
|
+
nargs='?',
|
|
1381
|
+
default="",
|
|
1382
|
+
help="Comma-separated keywords to search for (case-insensitive). If omitted, shows all sessions."
|
|
481
1383
|
)
|
|
482
1384
|
parser.add_argument(
|
|
483
1385
|
"-g", "--global",
|
|
@@ -500,63 +1402,299 @@ To persist directory changes when resuming sessions:
|
|
|
500
1402
|
type=str,
|
|
501
1403
|
help="Path to Claude home directory (default: ~/.claude)"
|
|
502
1404
|
)
|
|
503
|
-
|
|
1405
|
+
parser.add_argument(
|
|
1406
|
+
"--original",
|
|
1407
|
+
action="store_true",
|
|
1408
|
+
help="Show only original sessions (excludes trimmed, continued, and sub-agent sessions)"
|
|
1409
|
+
)
|
|
1410
|
+
parser.add_argument(
|
|
1411
|
+
"--no-sub",
|
|
1412
|
+
action="store_true",
|
|
1413
|
+
help="Exclude sub-agent sessions from results"
|
|
1414
|
+
)
|
|
1415
|
+
parser.add_argument(
|
|
1416
|
+
"--no-trim",
|
|
1417
|
+
action="store_true",
|
|
1418
|
+
help="Exclude trimmed sessions from results"
|
|
1419
|
+
)
|
|
1420
|
+
parser.add_argument(
|
|
1421
|
+
"--no-roll",
|
|
1422
|
+
dest="no_cont", # Keep internal name for compatibility
|
|
1423
|
+
action="store_true",
|
|
1424
|
+
help="Exclude rollover sessions from results"
|
|
1425
|
+
)
|
|
1426
|
+
parser.add_argument(
|
|
1427
|
+
"--simple-ui",
|
|
1428
|
+
dest="simple_ui",
|
|
1429
|
+
action="store_true",
|
|
1430
|
+
help="Use simple Rich table UI instead of Node interactive UI"
|
|
1431
|
+
)
|
|
1432
|
+
parser.add_argument(
|
|
1433
|
+
"--min-lines",
|
|
1434
|
+
type=int,
|
|
1435
|
+
default=0,
|
|
1436
|
+
help="Only show sessions with at least this many lines (default: 0 = no minimum)"
|
|
1437
|
+
)
|
|
1438
|
+
parser.add_argument(
|
|
1439
|
+
"--before",
|
|
1440
|
+
type=str,
|
|
1441
|
+
help="Only show sessions modified before this time (inclusive). "
|
|
1442
|
+
"Formats: YYYYMMDD, YYYY-MM-DD, MM/DD/YY, with optional T or space + HH:MM:SS",
|
|
1443
|
+
)
|
|
1444
|
+
parser.add_argument(
|
|
1445
|
+
"--after",
|
|
1446
|
+
type=str,
|
|
1447
|
+
help="Only show sessions modified after this time (inclusive). "
|
|
1448
|
+
"Formats: YYYYMMDD, YYYY-MM-DD, MM/DD/YY, with optional T or space + HH:MM:SS",
|
|
1449
|
+
)
|
|
1450
|
+
parser.add_argument(
|
|
1451
|
+
"--no-ui",
|
|
1452
|
+
action="store_true",
|
|
1453
|
+
help="Skip interactive options menu and run search directly with CLI args",
|
|
1454
|
+
)
|
|
1455
|
+
|
|
504
1456
|
args = parser.parse_args()
|
|
505
|
-
|
|
1457
|
+
|
|
1458
|
+
# Show interactive options UI unless --no-ui or --simple-ui
|
|
1459
|
+
if not args.no_ui and not args.simple_ui:
|
|
1460
|
+
initial_options = {
|
|
1461
|
+
"keywords": args.keywords or "",
|
|
1462
|
+
"global": getattr(args, 'global', False),
|
|
1463
|
+
"num_matches": args.num_matches,
|
|
1464
|
+
"original": args.original,
|
|
1465
|
+
"no_sub": args.no_sub,
|
|
1466
|
+
"no_trim": args.no_trim,
|
|
1467
|
+
"no_cont": args.no_cont,
|
|
1468
|
+
"min_lines": args.min_lines or "",
|
|
1469
|
+
"before": args.before or "",
|
|
1470
|
+
"after": args.after or "",
|
|
1471
|
+
}
|
|
1472
|
+
opts = run_find_options_ui(initial_options, variant="find-claude")
|
|
1473
|
+
if opts is None:
|
|
1474
|
+
sys.exit(0)
|
|
1475
|
+
# Update args with user's selections
|
|
1476
|
+
args.keywords = opts.get("keywords") or ""
|
|
1477
|
+
setattr(args, 'global', opts.get("global", False))
|
|
1478
|
+
args.num_matches = opts.get("num_matches", 10)
|
|
1479
|
+
args.original = opts.get("original", False)
|
|
1480
|
+
args.no_sub = opts.get("no_sub", False)
|
|
1481
|
+
args.no_trim = opts.get("no_trim", False)
|
|
1482
|
+
args.no_cont = opts.get("no_cont", False)
|
|
1483
|
+
args.min_lines = opts.get("min_lines") or 0
|
|
1484
|
+
args.before = opts.get("before")
|
|
1485
|
+
args.after = opts.get("after")
|
|
1486
|
+
|
|
1487
|
+
# Build and display equivalent CLI command
|
|
1488
|
+
cmd_parts = ["aichat find-claude"]
|
|
1489
|
+
if args.keywords:
|
|
1490
|
+
cmd_parts.append(f'"{args.keywords}"')
|
|
1491
|
+
if getattr(args, 'global'):
|
|
1492
|
+
cmd_parts.append("-g")
|
|
1493
|
+
if args.num_matches != 10:
|
|
1494
|
+
cmd_parts.append(f"-n {args.num_matches}")
|
|
1495
|
+
if args.original:
|
|
1496
|
+
cmd_parts.append("--original")
|
|
1497
|
+
if args.no_sub:
|
|
1498
|
+
cmd_parts.append("--no-sub")
|
|
1499
|
+
if args.no_trim:
|
|
1500
|
+
cmd_parts.append("--no-trim")
|
|
1501
|
+
if args.no_cont:
|
|
1502
|
+
cmd_parts.append("--no-roll")
|
|
1503
|
+
if args.min_lines:
|
|
1504
|
+
cmd_parts.append(f"--min-lines {args.min_lines}")
|
|
1505
|
+
if args.before:
|
|
1506
|
+
cmd_parts.append(f"--before {args.before}")
|
|
1507
|
+
if args.after:
|
|
1508
|
+
cmd_parts.append(f"--after {args.after}")
|
|
1509
|
+
cmd_parts.append("--no-ui")
|
|
1510
|
+
print(f"\n→ {' '.join(cmd_parts)}\n", file=sys.stderr)
|
|
1511
|
+
|
|
506
1512
|
# Parse keywords
|
|
507
|
-
keywords = [k.strip() for k in args.keywords.split(",") if k.strip()]
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
sys.
|
|
512
|
-
|
|
1513
|
+
keywords = [k.strip() for k in args.keywords.split(",") if k.strip()] if args.keywords else []
|
|
1514
|
+
|
|
1515
|
+
# Display informational message about what session types are being shown
|
|
1516
|
+
if args.original:
|
|
1517
|
+
print("Showing: Original sessions only (excluding trimmed, rollover, and sub-agent sessions)", file=sys.stderr)
|
|
1518
|
+
else:
|
|
1519
|
+
# Build list of included/excluded types
|
|
1520
|
+
excluded_types = []
|
|
1521
|
+
if args.no_sub:
|
|
1522
|
+
excluded_types.append("sub-agent")
|
|
1523
|
+
if args.no_trim:
|
|
1524
|
+
excluded_types.append("trimmed")
|
|
1525
|
+
if args.no_cont:
|
|
1526
|
+
excluded_types.append("rollover")
|
|
1527
|
+
|
|
1528
|
+
if excluded_types:
|
|
1529
|
+
excluded_str = ", ".join(excluded_types)
|
|
1530
|
+
print(f"Showing: All sessions except {excluded_str}", file=sys.stderr)
|
|
1531
|
+
else:
|
|
1532
|
+
print("Showing: All session types (original, trimmed, rollover, and sub-agent)", file=sys.stderr)
|
|
1533
|
+
print("Tip: Use --no-sub, --no-trim, or --no-roll to exclude specific types", file=sys.stderr)
|
|
1534
|
+
print(file=sys.stderr) # Blank line for readability
|
|
1535
|
+
|
|
513
1536
|
# Check if searching current project only
|
|
514
1537
|
if not getattr(args, 'global'):
|
|
515
1538
|
claude_dir = get_claude_project_dir(args.claude_home)
|
|
516
|
-
|
|
1539
|
+
|
|
517
1540
|
if not claude_dir.exists():
|
|
518
1541
|
print(f"No Claude project directory found for: {os.getcwd()}", file=sys.stderr)
|
|
519
1542
|
print(f"Expected directory: {claude_dir}", file=sys.stderr)
|
|
520
1543
|
sys.exit(1)
|
|
521
|
-
|
|
1544
|
+
|
|
522
1545
|
# Find matching sessions
|
|
523
|
-
matching_sessions = find_sessions(
|
|
524
|
-
|
|
1546
|
+
matching_sessions = find_sessions(
|
|
1547
|
+
keywords,
|
|
1548
|
+
global_search=getattr(args, 'global'),
|
|
1549
|
+
claude_home=args.claude_home,
|
|
1550
|
+
original_only=args.original,
|
|
1551
|
+
no_sub=args.no_sub,
|
|
1552
|
+
no_trim=args.no_trim,
|
|
1553
|
+
no_cont=args.no_cont,
|
|
1554
|
+
)
|
|
1555
|
+
|
|
1556
|
+
# Filter by minimum lines if specified (line_count is at index 3 in tuple)
|
|
1557
|
+
if args.min_lines > 0:
|
|
1558
|
+
matching_sessions = [s for s in matching_sessions if s[3] >= args.min_lines]
|
|
1559
|
+
|
|
1560
|
+
# Filter by time bounds if specified (mod_time is at index 1 in tuple)
|
|
1561
|
+
if args.before or args.after:
|
|
1562
|
+
matching_sessions = filter_sessions_by_time(
|
|
1563
|
+
matching_sessions, before=args.before, after=args.after, time_index=1
|
|
1564
|
+
)
|
|
1565
|
+
|
|
525
1566
|
if not matching_sessions:
|
|
526
1567
|
scope = "all projects" if getattr(args, 'global') else "current project"
|
|
1568
|
+
keyword_msg = f" containing all keywords: {', '.join(keywords)}" if keywords else ""
|
|
527
1569
|
if RICH_AVAILABLE and console and not args.shell:
|
|
528
|
-
console.print(f"[yellow]No sessions found
|
|
1570
|
+
console.print(f"[yellow]No sessions found{keyword_msg} in {scope}[/yellow]")
|
|
529
1571
|
else:
|
|
530
|
-
print(f"No sessions found
|
|
1572
|
+
print(f"No sessions found{keyword_msg} in {scope}", file=sys.stderr)
|
|
531
1573
|
sys.exit(0)
|
|
532
1574
|
|
|
533
|
-
#
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
1575
|
+
# ============================================================
|
|
1576
|
+
# Default: Node UI (rich interactive interface)
|
|
1577
|
+
# --simple-ui: Falls back to Rich table UI
|
|
1578
|
+
# ============================================================
|
|
1579
|
+
nonlaunch_flag = {"done": False}
|
|
1580
|
+
action_handler = create_action_handler(args.claude_home, nonlaunch_flag=nonlaunch_flag)
|
|
1581
|
+
rpc_path = str(Path(__file__).parent / "action_rpc.py")
|
|
1582
|
+
|
|
1583
|
+
if not args.simple_ui:
|
|
1584
|
+
limited = [
|
|
1585
|
+
{
|
|
1586
|
+
"agent": "claude",
|
|
1587
|
+
"agent_display": "Claude",
|
|
1588
|
+
"session_id": s[0],
|
|
1589
|
+
"mod_time": s[1],
|
|
1590
|
+
"create_time": s[2],
|
|
1591
|
+
"lines": s[3],
|
|
1592
|
+
"project": s[4],
|
|
1593
|
+
"preview": s[5],
|
|
1594
|
+
"cwd": s[6],
|
|
1595
|
+
"branch": s[7] if len(s) > 7 else "",
|
|
1596
|
+
"file_path": get_session_file_path(s[0], s[6], args.claude_home),
|
|
1597
|
+
"claude_home": args.claude_home,
|
|
1598
|
+
"is_trimmed": s[8] if len(s) > 8 else False,
|
|
1599
|
+
"derivation_type": None,
|
|
1600
|
+
"is_sidechain": s[9] if len(s) > 9 else False,
|
|
1601
|
+
}
|
|
1602
|
+
for s in matching_sessions[: args.num_matches]
|
|
1603
|
+
]
|
|
1604
|
+
|
|
1605
|
+
focus_id = None
|
|
1606
|
+
start_action = False
|
|
1607
|
+
while True:
|
|
1608
|
+
nonlaunch_flag["done"] = False
|
|
1609
|
+
run_node_menu_ui(
|
|
1610
|
+
limited,
|
|
1611
|
+
keywords,
|
|
1612
|
+
action_handler,
|
|
1613
|
+
stderr_mode=args.shell,
|
|
1614
|
+
focus_session_id=focus_id,
|
|
1615
|
+
start_action=start_action,
|
|
1616
|
+
rpc_path=rpc_path,
|
|
1617
|
+
)
|
|
1618
|
+
if nonlaunch_flag["done"]:
|
|
1619
|
+
choice = prompt_post_action()
|
|
1620
|
+
if choice == "back":
|
|
1621
|
+
focus_id = nonlaunch_flag.get("session_id")
|
|
1622
|
+
start_action = True
|
|
1623
|
+
continue
|
|
1624
|
+
break
|
|
1625
|
+
elif RICH_AVAILABLE and console:
|
|
1626
|
+
# Use Rich-based interactive UI
|
|
1627
|
+
selected_session = display_interactive_ui(matching_sessions, keywords, stderr_mode=args.shell, num_matches=args.num_matches)
|
|
1628
|
+
if selected_session:
|
|
1629
|
+
# Show action menu
|
|
1630
|
+
action = show_action_menu(selected_session)
|
|
1631
|
+
if not action:
|
|
1632
|
+
return
|
|
1633
|
+
|
|
1634
|
+
session_id = selected_session[0]
|
|
1635
|
+
project_path = selected_session[6] # Updated index after adding creation_time
|
|
1636
|
+
|
|
1637
|
+
# Perform selected action
|
|
1638
|
+
if action == "resume":
|
|
1639
|
+
resume_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
|
|
1640
|
+
elif action == "suppress_resume":
|
|
1641
|
+
# Prompt for suppress options
|
|
1642
|
+
options = prompt_suppress_options()
|
|
1643
|
+
if options:
|
|
1644
|
+
tools, threshold, trim_assistant = options
|
|
1645
|
+
handle_suppress_resume_claude(
|
|
1646
|
+
session_id, project_path, tools, threshold, trim_assistant, args.claude_home
|
|
1647
|
+
)
|
|
1648
|
+
elif action == "smart_trim_resume":
|
|
1649
|
+
# Smart trim using parallel agents
|
|
1650
|
+
handle_smart_trim_resume_claude(
|
|
1651
|
+
session_id, project_path, args.claude_home
|
|
1652
|
+
)
|
|
1653
|
+
elif action == "path":
|
|
1654
|
+
session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
|
|
1655
|
+
print(f"\nSession file path:")
|
|
1656
|
+
print(session_file_path)
|
|
1657
|
+
elif action == "copy":
|
|
1658
|
+
session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
|
|
1659
|
+
copy_session_file(session_file_path)
|
|
1660
|
+
elif action == "clone":
|
|
1661
|
+
clone_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
|
|
1662
|
+
elif action == "export":
|
|
1663
|
+
session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
|
|
1664
|
+
handle_export_session(session_file_path)
|
|
1665
|
+
elif action == "continue":
|
|
1666
|
+
# Continue with context in fresh session
|
|
1667
|
+
from claude_code_tools.session_utils import continue_with_options
|
|
1668
|
+
session_file_path = get_session_file_path(session_id, project_path, args.claude_home)
|
|
1669
|
+
continue_with_options(
|
|
1670
|
+
session_file_path,
|
|
1671
|
+
"claude",
|
|
1672
|
+
claude_home=args.claude_home,
|
|
1673
|
+
codex_home=None
|
|
1674
|
+
)
|
|
539
1675
|
else:
|
|
540
1676
|
# Fallback: print session IDs as before
|
|
541
1677
|
if not args.shell:
|
|
542
1678
|
print("\nMatching sessions:")
|
|
543
|
-
for idx, (session_id, mod_time, line_count, project_name, preview, project_path, git_branch) in enumerate(matching_sessions[:args.num_matches], 1):
|
|
544
|
-
|
|
1679
|
+
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):
|
|
1680
|
+
create_date = datetime.fromtimestamp(create_time).strftime('%m/%d')
|
|
1681
|
+
mod_date = datetime.fromtimestamp(mod_time).strftime('%m/%d %H:%M')
|
|
1682
|
+
date_display = f"{create_date} - {mod_date}"
|
|
545
1683
|
branch_display = git_branch if git_branch else "N/A"
|
|
546
1684
|
if getattr(args, 'global'):
|
|
547
|
-
print(f"{idx}. {session_id} | {project_name} | {branch_display} | {
|
|
1685
|
+
print(f"{idx}. {session_id} | {project_name} | {branch_display} | {date_display} | {line_count} lines", file=sys.stderr if args.shell else sys.stdout)
|
|
548
1686
|
else:
|
|
549
|
-
print(f"{idx}. {session_id} | {branch_display} | {
|
|
550
|
-
|
|
1687
|
+
print(f"{idx}. {session_id} | {branch_display} | {date_display} | {line_count} lines", file=sys.stderr if args.shell else sys.stdout)
|
|
1688
|
+
|
|
551
1689
|
if len(matching_sessions) > args.num_matches:
|
|
552
1690
|
print(f"\n... and {len(matching_sessions) - args.num_matches} more sessions", file=sys.stderr if args.shell else sys.stdout)
|
|
553
|
-
|
|
1691
|
+
|
|
554
1692
|
# Simple selection without rich
|
|
555
1693
|
if len(matching_sessions) == 1:
|
|
556
1694
|
if not args.shell:
|
|
557
1695
|
print("\nOnly one match found. Resuming automatically...")
|
|
558
|
-
session_id, _, _, _, _, project_path, _ = matching_sessions[0]
|
|
559
|
-
resume_session(session_id, project_path, shell_mode=args.shell)
|
|
1696
|
+
session_id, _, _, _, _, _, project_path, _, _, _ = matching_sessions[0]
|
|
1697
|
+
resume_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
|
|
560
1698
|
else:
|
|
561
1699
|
try:
|
|
562
1700
|
if args.shell:
|
|
@@ -566,16 +1704,16 @@ To persist directory changes when resuming sessions:
|
|
|
566
1704
|
choice = sys.stdin.readline().strip()
|
|
567
1705
|
else:
|
|
568
1706
|
choice = input("\nEnter number to resume session (or Ctrl+C to cancel): ")
|
|
569
|
-
|
|
1707
|
+
|
|
570
1708
|
# Handle empty input or EOF
|
|
571
1709
|
if not choice:
|
|
572
1710
|
print("Cancelled (EOF)", file=sys.stderr)
|
|
573
1711
|
sys.exit(0)
|
|
574
|
-
|
|
1712
|
+
|
|
575
1713
|
idx = int(choice) - 1
|
|
576
1714
|
if 0 <= idx < min(args.num_matches, len(matching_sessions)):
|
|
577
|
-
session_id, _, _, _, _, project_path, _ = matching_sessions[idx]
|
|
578
|
-
resume_session(session_id, project_path, shell_mode=args.shell)
|
|
1715
|
+
session_id, _, _, _, _, _, project_path, _, _, _ = matching_sessions[idx]
|
|
1716
|
+
resume_session(session_id, project_path, shell_mode=args.shell, claude_home=args.claude_home)
|
|
579
1717
|
else:
|
|
580
1718
|
print("Invalid choice", file=sys.stderr)
|
|
581
1719
|
sys.exit(1)
|
|
@@ -588,4 +1726,4 @@ To persist directory changes when resuming sessions:
|
|
|
588
1726
|
|
|
589
1727
|
|
|
590
1728
|
if __name__ == "__main__":
|
|
591
|
-
main()
|
|
1729
|
+
main()
|