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