@qduc/term2 0.8.0 → 0.9.1
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.
- package/README.md +397 -0
- package/dist/agent.d.ts +1 -9
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +15 -132
- package/dist/agent.js.map +1 -1
- package/dist/agent.lite-mode.test.d.ts +2 -0
- package/dist/agent.lite-mode.test.d.ts.map +1 -0
- package/dist/agent.lite-mode.test.js +39 -0
- package/dist/agent.lite-mode.test.js.map +1 -0
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +28 -16
- package/dist/app.js.map +1 -1
- package/dist/app.large-uncached-warning.test.js +15 -0
- package/dist/app.large-uncached-warning.test.js.map +1 -1
- package/dist/commands/effort-command.d.ts +2 -2
- package/dist/commands/effort-command.d.ts.map +1 -1
- package/dist/commands/effort-command.js +3 -3
- package/dist/commands/effort-command.js.map +1 -1
- package/dist/commands/guarded-settings-command.d.ts +2 -2
- package/dist/commands/guarded-settings-command.d.ts.map +1 -1
- package/dist/commands/guarded-settings-command.js +2 -2
- package/dist/commands/guarded-settings-command.js.map +1 -1
- package/dist/commands/model-command.d.ts +2 -2
- package/dist/commands/model-command.d.ts.map +1 -1
- package/dist/commands/model-command.js +2 -2
- package/dist/commands/model-command.js.map +1 -1
- package/dist/commands/retry-command.d.ts +2 -1
- package/dist/commands/retry-command.d.ts.map +1 -1
- package/dist/commands/retry-command.js +12 -3
- package/dist/commands/retry-command.js.map +1 -1
- package/dist/commands/skills-command.d.ts +1 -1
- package/dist/commands/skills-command.d.ts.map +1 -1
- package/dist/commands/skills-command.js +1 -1
- package/dist/commands/skills-command.js.map +1 -1
- package/dist/commands/undo-command.d.ts +2 -2
- package/dist/commands/undo-command.d.ts.map +1 -1
- package/dist/commands/undo-command.js +2 -2
- package/dist/commands/undo-command.js.map +1 -1
- package/dist/components/ApprovalPrompt.test.d.ts +2 -0
- package/dist/components/ApprovalPrompt.test.d.ts.map +1 -0
- package/dist/components/ApprovalPrompt.test.js +23 -0
- package/dist/components/ApprovalPrompt.test.js.map +1 -0
- package/dist/components/Common/MenuContainer.d.ts.map +1 -1
- package/dist/components/Common/MenuContainer.js.map +1 -1
- package/dist/components/Common/MenuContainer.test.d.ts.map +1 -1
- package/dist/components/Common/MenuContainer.test.js +53 -24
- package/dist/components/Common/MenuContainer.test.js.map +1 -1
- package/dist/components/Common/ScrollableTabBar.d.ts.map +1 -1
- package/dist/components/Common/ScrollableTabBar.js.map +1 -1
- package/dist/components/Common/compute-visible-tabs.d.ts.map +1 -1
- package/dist/components/Common/compute-visible-tabs.js.map +1 -1
- package/dist/components/Common/compute-visible-tabs.test.d.ts.map +1 -1
- package/dist/components/Common/compute-visible-tabs.test.js +28 -28
- package/dist/components/Common/compute-visible-tabs.test.js.map +1 -1
- package/dist/components/Input/PopupManager.d.ts +1 -9
- package/dist/components/Input/PopupManager.d.ts.map +1 -1
- package/dist/components/Input/PopupManager.js +8 -10
- package/dist/components/Input/PopupManager.js.map +1 -1
- package/dist/components/Input/determine-active-menu.d.ts +0 -3
- package/dist/components/Input/determine-active-menu.d.ts.map +1 -1
- package/dist/components/Input/determine-active-menu.js +2 -10
- package/dist/components/Input/determine-active-menu.js.map +1 -1
- package/dist/components/Input/input-width.d.ts.map +1 -1
- package/dist/components/Input/input-width.js.map +1 -1
- package/dist/components/Input/insertions.d.ts +0 -8
- package/dist/components/Input/insertions.d.ts.map +1 -1
- package/dist/components/Input/insertions.js +0 -12
- package/dist/components/Input/insertions.js.map +1 -1
- package/dist/components/Input/popup-key-navigation.d.ts.map +1 -1
- package/dist/components/Input/popup-key-navigation.js.map +1 -1
- package/dist/components/Input/popup-key-navigation.test.d.ts.map +1 -1
- package/dist/components/Input/popup-key-navigation.test.js +21 -21
- package/dist/components/Input/popup-key-navigation.test.js.map +1 -1
- package/dist/components/Input/popup-props.d.ts +1 -3
- package/dist/components/Input/popup-props.d.ts.map +1 -1
- package/dist/components/Input/popup-props.js +1 -8
- package/dist/components/Input/popup-props.js.map +1 -1
- package/dist/components/Input/popup-props.test.d.ts.map +1 -1
- package/dist/components/Input/popup-props.test.js +3 -10
- package/dist/components/Input/popup-props.test.js.map +1 -1
- package/dist/components/Input/triggers.d.ts +0 -1
- package/dist/components/Input/triggers.d.ts.map +1 -1
- package/dist/components/Input/triggers.js +0 -1
- package/dist/components/Input/triggers.js.map +1 -1
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +41 -12
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/LiveResponse.test.d.ts +2 -0
- package/dist/components/LiveResponse.test.d.ts.map +1 -0
- package/dist/components/LiveResponse.test.js +13 -0
- package/dist/components/LiveResponse.test.js.map +1 -0
- package/dist/components/MarkdownRenderer.d.ts.map +1 -1
- package/dist/components/MarkdownRenderer.js +3 -2
- package/dist/components/MarkdownRenderer.js.map +1 -1
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts +2 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.d.ts.map +1 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.js +18 -0
- package/dist/components/ModelSelectionMenu.error-tabs.test.js.map +1 -0
- package/dist/components/TextInput.d.ts +42 -0
- package/dist/components/TextInput.d.ts.map +1 -0
- package/dist/components/TextInput.js +398 -0
- package/dist/components/TextInput.js.map +1 -0
- package/dist/components/TextInput.test.d.ts +2 -0
- package/dist/components/TextInput.test.d.ts.map +1 -0
- package/dist/components/TextInput.test.js +75 -0
- package/dist/components/TextInput.test.js.map +1 -0
- package/dist/components/__test_act.test.d.ts +2 -0
- package/dist/components/__test_act.test.d.ts.map +1 -0
- package/dist/components/__test_act.test.js +22 -0
- package/dist/components/__test_act.test.js.map +1 -0
- package/dist/components/__test_act_test.d.ts +2 -0
- package/dist/components/__test_act_test.d.ts.map +1 -0
- package/dist/components/__test_act_test.js +22 -0
- package/dist/components/__test_act_test.js.map +1 -0
- package/dist/components/act-test.test.d.ts +2 -0
- package/dist/components/act-test.test.d.ts.map +1 -0
- package/dist/components/act-test.test.js +22 -0
- package/dist/components/act-test.test.js.map +1 -0
- package/dist/components/common/MenuContainer.d.ts +19 -0
- package/dist/components/common/MenuContainer.d.ts.map +1 -0
- package/dist/components/common/MenuContainer.js +52 -0
- package/dist/components/common/MenuContainer.js.map +1 -0
- package/dist/components/common/MenuContainer.test.d.ts +2 -0
- package/dist/components/common/MenuContainer.test.d.ts.map +1 -0
- package/dist/components/common/MenuContainer.test.js +37 -0
- package/dist/components/common/MenuContainer.test.js.map +1 -0
- package/dist/components/common/ScrollableTabBar.d.ts +26 -0
- package/dist/components/common/ScrollableTabBar.d.ts.map +1 -0
- package/dist/components/common/ScrollableTabBar.js +26 -0
- package/dist/components/common/ScrollableTabBar.js.map +1 -0
- package/dist/components/common/compute-visible-tabs.d.ts +16 -0
- package/dist/components/common/compute-visible-tabs.d.ts.map +1 -0
- package/dist/components/common/compute-visible-tabs.js +53 -0
- package/dist/components/common/compute-visible-tabs.js.map +1 -0
- package/dist/components/common/compute-visible-tabs.test.d.ts +2 -0
- package/dist/components/common/compute-visible-tabs.test.d.ts.map +1 -0
- package/dist/components/common/compute-visible-tabs.test.js +97 -0
- package/dist/components/common/compute-visible-tabs.test.js.map +1 -0
- package/dist/components/input/PopupManager.d.ts +88 -0
- package/dist/components/input/PopupManager.d.ts.map +1 -0
- package/dist/components/input/PopupManager.js +21 -0
- package/dist/components/input/PopupManager.js.map +1 -0
- package/dist/components/input/determine-active-menu.d.ts +27 -0
- package/dist/components/input/determine-active-menu.d.ts.map +1 -0
- package/dist/components/input/determine-active-menu.js +81 -0
- package/dist/components/input/determine-active-menu.js.map +1 -0
- package/dist/components/input/input-width.d.ts +8 -0
- package/dist/components/input/input-width.d.ts.map +1 -0
- package/dist/components/input/input-width.js +24 -0
- package/dist/components/input/input-width.js.map +1 -0
- package/dist/components/input/insertions.d.ts +44 -0
- package/dist/components/input/insertions.d.ts.map +1 -0
- package/dist/components/input/insertions.js +67 -0
- package/dist/components/input/insertions.js.map +1 -0
- package/dist/components/input/popup-key-navigation.d.ts +18 -0
- package/dist/components/input/popup-key-navigation.d.ts.map +1 -0
- package/dist/components/input/popup-key-navigation.js +16 -0
- package/dist/components/input/popup-key-navigation.js.map +1 -0
- package/dist/components/input/popup-key-navigation.test.d.ts +2 -0
- package/dist/components/input/popup-key-navigation.test.d.ts.map +1 -0
- package/dist/components/input/popup-key-navigation.test.js +75 -0
- package/dist/components/input/popup-key-navigation.test.js.map +1 -0
- package/dist/components/input/popup-props.d.ts +24 -0
- package/dist/components/input/popup-props.d.ts.map +1 -0
- package/dist/components/input/popup-props.js +72 -0
- package/dist/components/input/popup-props.js.map +1 -0
- package/dist/components/input/popup-props.test.d.ts +2 -0
- package/dist/components/input/popup-props.test.d.ts.map +1 -0
- package/dist/components/input/popup-props.test.js +86 -0
- package/dist/components/input/popup-props.test.js.map +1 -0
- package/dist/components/input/triggers.d.ts +11 -0
- package/dist/components/input/triggers.d.ts.map +1 -0
- package/dist/components/input/triggers.js +27 -0
- package/dist/components/input/triggers.js.map +1 -0
- package/dist/components/layout/BottomArea.d.ts +2 -0
- package/dist/components/layout/BottomArea.d.ts.map +1 -1
- package/dist/components/layout/BottomArea.js +4 -2
- package/dist/components/layout/BottomArea.js.map +1 -1
- package/dist/components/layout/DiffView.d.ts.map +1 -1
- package/dist/components/layout/DiffView.js +33 -26
- package/dist/components/layout/DiffView.js.map +1 -1
- package/dist/components/layout/StatusBar.d.ts +2 -0
- package/dist/components/layout/StatusBar.d.ts.map +1 -1
- package/dist/components/layout/StatusBar.js +29 -8
- package/dist/components/layout/StatusBar.js.map +1 -1
- package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
- package/dist/components/menu/ModelSelectionMenu.js +1 -1
- package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
- package/dist/components/message/CommandMessage.d.ts +2 -1
- package/dist/components/message/CommandMessage.d.ts.map +1 -1
- package/dist/components/message/CommandMessage.js +203 -227
- package/dist/components/message/CommandMessage.js.map +1 -1
- package/dist/components/message/MessageList.d.ts +16 -0
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +45 -1
- package/dist/components/message/MessageList.js.map +1 -1
- package/dist/components/message/command-message-helpers.d.ts +1 -1
- package/dist/components/message/command-message-helpers.d.ts.map +1 -1
- package/dist/components/message/command-message-helpers.js +17 -17
- package/dist/components/message/command-message-helpers.js.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.ask-user.test.js +35 -12
- package/dist/components/prompt/ApprovalPrompt.ask-user.test.js.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
- package/dist/components/prompt/ApprovalPrompt.js +124 -14
- package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
- package/dist/context/InputContext.d.ts +4 -0
- package/dist/context/InputContext.d.ts.map +1 -1
- package/dist/context/InputContext.js +5 -1
- package/dist/context/InputContext.js.map +1 -1
- package/dist/contracts/conversation.d.ts +22 -0
- package/dist/contracts/conversation.d.ts.map +1 -1
- package/dist/contracts/conversation.js +11 -1
- package/dist/contracts/conversation.js.map +1 -1
- package/dist/debug_ask_mentor.d.ts +2 -0
- package/dist/debug_ask_mentor.d.ts.map +1 -0
- package/dist/debug_ask_mentor.js +73 -0
- package/dist/debug_ask_mentor.js.map +1 -0
- package/dist/hooks/conversation-ui-reducer.ask-user-bugfix.test.js +7 -7
- package/dist/hooks/conversation-ui-reducer.ask-user-bugfix.test.js.map +1 -1
- package/dist/hooks/use-app-commands.d.ts +3 -2
- package/dist/hooks/use-app-commands.d.ts.map +1 -1
- package/dist/hooks/use-app-commands.js +16 -8
- package/dist/hooks/use-app-commands.js.map +1 -1
- package/dist/hooks/use-conversation.d.ts +1 -0
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +92 -9
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-conversation.max-turns-undo.test.d.ts +2 -0
- package/dist/hooks/use-conversation.max-turns-undo.test.d.ts.map +1 -0
- package/dist/hooks/use-conversation.max-turns-undo.test.js +118 -0
- package/dist/hooks/use-conversation.max-turns-undo.test.js.map +1 -0
- package/dist/hooks/use-handoff-flow.d.ts +3 -2
- package/dist/hooks/use-handoff-flow.d.ts.map +1 -1
- package/dist/hooks/use-handoff-flow.js +28 -18
- package/dist/hooks/use-handoff-flow.js.map +1 -1
- package/dist/hooks/use-mode-handlers.d.ts +2 -0
- package/dist/hooks/use-mode-handlers.d.ts.map +1 -1
- package/dist/hooks/use-mode-handlers.js +2 -2
- package/dist/hooks/use-mode-handlers.js.map +1 -1
- package/dist/hooks/use-model-selection.d.ts +1 -0
- package/dist/hooks/use-model-selection.d.ts.map +1 -1
- package/dist/hooks/use-model-selection.js +19 -5
- package/dist/hooks/use-model-selection.js.map +1 -1
- package/dist/hooks/use-path-completion.d.ts.map +1 -1
- package/dist/hooks/use-path-completion.js +4 -2
- package/dist/hooks/use-path-completion.js.map +1 -1
- package/dist/hooks/use-path-completion.repro.test.d.ts +2 -0
- package/dist/hooks/use-path-completion.repro.test.d.ts.map +1 -0
- package/dist/hooks/use-path-completion.repro.test.js.map +1 -0
- package/dist/hooks/use-pending-turn-guards.d.ts +2 -2
- package/dist/hooks/use-pending-turn-guards.d.ts.map +1 -1
- package/dist/hooks/use-pending-turn-guards.js +8 -8
- package/dist/hooks/use-pending-turn-guards.js.map +1 -1
- package/dist/hooks/use-provider-selection.d.ts.map +1 -1
- package/dist/hooks/use-provider-selection.js +20 -18
- package/dist/hooks/use-provider-selection.js.map +1 -1
- package/dist/hooks/use-selection.d.ts.map +1 -1
- package/dist/hooks/use-selection.js +5 -1
- package/dist/hooks/use-selection.js.map +1 -1
- package/dist/hooks/use-setting.d.ts.map +1 -1
- package/dist/hooks/use-setting.js +3 -5
- package/dist/hooks/use-setting.js.map +1 -1
- package/dist/hooks/use-settings-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-completion.js +19 -7
- package/dist/hooks/use-settings-completion.js.map +1 -1
- package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
- package/dist/hooks/use-settings-value-completion.js +13 -2
- package/dist/hooks/use-settings-value-completion.js.map +1 -1
- package/dist/hooks/use-shell-mode.d.ts +2 -2
- package/dist/hooks/use-shell-mode.d.ts.map +1 -1
- package/dist/hooks/use-shell-mode.js +5 -3
- package/dist/hooks/use-shell-mode.js.map +1 -1
- package/dist/hooks/use-skill-selection.js +3 -3
- package/dist/hooks/use-skill-selection.js.map +1 -1
- package/dist/hooks/use-slash-commands.js +3 -3
- package/dist/hooks/use-slash-commands.js.map +1 -1
- package/dist/hooks/use-terminal-width.js +2 -2
- package/dist/hooks/use-terminal-width.js.map +1 -1
- package/dist/hooks/use-undo-selection.d.ts.map +1 -1
- package/dist/hooks/use-undo-selection.js +3 -1
- package/dist/hooks/use-undo-selection.js.map +1 -1
- package/dist/lib/agent-chat-service.js +2 -2
- package/dist/lib/agent-chat-service.js.map +1 -1
- package/dist/lib/agent-factory.test.js +21 -0
- package/dist/lib/agent-factory.test.js.map +1 -1
- package/dist/lib/agent-run-orchestrator.js +1 -1
- package/dist/lib/agent-run-orchestrator.js.map +1 -1
- package/dist/lib/editor-impl.test.js +73 -29
- package/dist/lib/editor-impl.test.js.map +1 -1
- package/dist/lib/openai-agent-client.public-methods.test.js +9 -1
- package/dist/lib/openai-agent-client.public-methods.test.js.map +1 -1
- package/dist/lib/shell.d.ts +7 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +56 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/subagent-bridge.d.ts.map +1 -1
- package/dist/lib/subagent-bridge.js +15 -3
- package/dist/lib/subagent-bridge.js.map +1 -1
- package/dist/modes/companion/command-index.d.ts +26 -0
- package/dist/modes/companion/command-index.d.ts.map +1 -0
- package/dist/modes/companion/command-index.js +50 -0
- package/dist/modes/companion/command-index.js.map +1 -0
- package/dist/modes/companion/command-index.test.d.ts +2 -0
- package/dist/modes/companion/command-index.test.d.ts.map +1 -0
- package/dist/modes/companion/command-index.test.js +86 -0
- package/dist/modes/companion/command-index.test.js.map +1 -0
- package/dist/modes/companion/companion-app.d.ts +12 -0
- package/dist/modes/companion/companion-app.d.ts.map +1 -0
- package/dist/modes/companion/companion-app.js +297 -0
- package/dist/modes/companion/companion-app.js.map +1 -0
- package/dist/modes/companion/companion-session.d.ts +63 -0
- package/dist/modes/companion/companion-session.d.ts.map +1 -0
- package/dist/modes/companion/companion-session.js +146 -0
- package/dist/modes/companion/companion-session.js.map +1 -0
- package/dist/modes/companion/companion-session.test.d.ts +2 -0
- package/dist/modes/companion/companion-session.test.d.ts.map +1 -0
- package/dist/modes/companion/companion-session.test.js +28 -0
- package/dist/modes/companion/companion-session.test.js.map +1 -0
- package/dist/modes/companion/components/status-bar.d.ts +13 -0
- package/dist/modes/companion/components/status-bar.d.ts.map +1 -0
- package/dist/modes/companion/components/status-bar.js +26 -0
- package/dist/modes/companion/components/status-bar.js.map +1 -0
- package/dist/modes/companion/context-buffer.d.ts +65 -0
- package/dist/modes/companion/context-buffer.d.ts.map +1 -0
- package/dist/modes/companion/context-buffer.js +156 -0
- package/dist/modes/companion/context-buffer.js.map +1 -0
- package/dist/modes/companion/context-buffer.test.d.ts +2 -0
- package/dist/modes/companion/context-buffer.test.d.ts.map +1 -0
- package/dist/modes/companion/context-buffer.test.js +154 -0
- package/dist/modes/companion/context-buffer.test.js.map +1 -0
- package/dist/modes/companion/event-detector.d.ts +46 -0
- package/dist/modes/companion/event-detector.d.ts.map +1 -0
- package/dist/modes/companion/event-detector.js +169 -0
- package/dist/modes/companion/event-detector.js.map +1 -0
- package/dist/modes/companion/event-detector.test.d.ts +2 -0
- package/dist/modes/companion/event-detector.test.d.ts.map +1 -0
- package/dist/modes/companion/event-detector.test.js +121 -0
- package/dist/modes/companion/event-detector.test.js.map +1 -0
- package/dist/modes/companion/index.d.ts +33 -0
- package/dist/modes/companion/index.d.ts.map +1 -0
- package/dist/modes/companion/index.js +21 -0
- package/dist/modes/companion/index.js.map +1 -0
- package/dist/modes/companion/input-key-mapper.d.ts +3 -0
- package/dist/modes/companion/input-key-mapper.d.ts.map +1 -0
- package/dist/modes/companion/input-key-mapper.js +31 -0
- package/dist/modes/companion/input-key-mapper.js.map +1 -0
- package/dist/modes/companion/input-key-mapper.test.d.ts +2 -0
- package/dist/modes/companion/input-key-mapper.test.d.ts.map +1 -0
- package/dist/modes/companion/input-key-mapper.test.js +26 -0
- package/dist/modes/companion/input-key-mapper.test.js.map +1 -0
- package/dist/modes/companion/input-parser.d.ts +53 -0
- package/dist/modes/companion/input-parser.d.ts.map +1 -0
- package/dist/modes/companion/input-parser.js +114 -0
- package/dist/modes/companion/input-parser.js.map +1 -0
- package/dist/modes/companion/input-parser.test.d.ts +2 -0
- package/dist/modes/companion/input-parser.test.d.ts.map +1 -0
- package/dist/modes/companion/input-parser.test.js +123 -0
- package/dist/modes/companion/input-parser.test.js.map +1 -0
- package/dist/modes/companion/mode-manager.d.ts +41 -0
- package/dist/modes/companion/mode-manager.d.ts.map +1 -0
- package/dist/modes/companion/mode-manager.js +56 -0
- package/dist/modes/companion/mode-manager.js.map +1 -0
- package/dist/modes/companion/mode-manager.test.d.ts +2 -0
- package/dist/modes/companion/mode-manager.test.d.ts.map +1 -0
- package/dist/modes/companion/mode-manager.test.js +65 -0
- package/dist/modes/companion/mode-manager.test.js.map +1 -0
- package/dist/modes/companion/output-classifier.d.ts +15 -0
- package/dist/modes/companion/output-classifier.d.ts.map +1 -0
- package/dist/modes/companion/output-classifier.js +77 -0
- package/dist/modes/companion/output-classifier.js.map +1 -0
- package/dist/modes/companion/output-classifier.test.d.ts +2 -0
- package/dist/modes/companion/output-classifier.test.d.ts.map +1 -0
- package/dist/modes/companion/output-classifier.test.js +133 -0
- package/dist/modes/companion/output-classifier.test.js.map +1 -0
- package/dist/modes/companion/pty-wrapper.d.ts +46 -0
- package/dist/modes/companion/pty-wrapper.d.ts.map +1 -0
- package/dist/modes/companion/pty-wrapper.js +143 -0
- package/dist/modes/companion/pty-wrapper.js.map +1 -0
- package/dist/modes/companion/safety-classifier.d.ts +31 -0
- package/dist/modes/companion/safety-classifier.d.ts.map +1 -0
- package/dist/modes/companion/safety-classifier.js +140 -0
- package/dist/modes/companion/safety-classifier.js.map +1 -0
- package/dist/modes/companion/safety-classifier.test.d.ts +2 -0
- package/dist/modes/companion/safety-classifier.test.d.ts.map +1 -0
- package/dist/modes/companion/safety-classifier.test.js +151 -0
- package/dist/modes/companion/safety-classifier.test.js.map +1 -0
- package/dist/modes/companion/summarizer.d.ts +24 -0
- package/dist/modes/companion/summarizer.d.ts.map +1 -0
- package/dist/modes/companion/summarizer.js +132 -0
- package/dist/modes/companion/summarizer.js.map +1 -0
- package/dist/modes/companion/terminal-history.d.ts +27 -0
- package/dist/modes/companion/terminal-history.d.ts.map +1 -0
- package/dist/modes/companion/terminal-history.js +142 -0
- package/dist/modes/companion/terminal-history.js.map +1 -0
- package/dist/non-interactive.d.ts.map +1 -1
- package/dist/non-interactive.js +0 -2
- package/dist/non-interactive.js.map +1 -1
- package/dist/prompts/anthropic.md +1 -0
- package/dist/prompts/codex.md +1 -0
- package/dist/prompts/gpt-5-modern.md +1 -0
- package/dist/prompts/gpt-5.5.md +1 -0
- package/dist/prompts/gpt-5.md +4 -7
- package/dist/prompts/kimi.md +3 -1
- package/dist/prompts/prompt-constructor.d.ts +1 -0
- package/dist/prompts/prompt-constructor.d.ts.map +1 -1
- package/dist/prompts/prompt-constructor.js +12 -38
- package/dist/prompts/prompt-constructor.js.map +1 -1
- package/dist/prompts/prompt-constructor.test.ts +15 -36
- package/dist/prompts/prompt-constructor.ts +19 -47
- package/dist/prompts/shell-sandbox.d.ts +2 -0
- package/dist/prompts/shell-sandbox.d.ts.map +1 -0
- package/dist/prompts/shell-sandbox.js +29 -0
- package/dist/prompts/shell-sandbox.js.map +1 -0
- package/dist/prompts/shell-sandbox.md +18 -0
- package/dist/prompts/shell-sandbox.ts +29 -0
- package/dist/prompts/simple-mentor.md +215 -0
- package/dist/prompts/subagent-delegation.js +1 -1
- package/dist/prompts/subagent-delegation.ts +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts +2 -0
- package/dist/providers/ai-sdk-openai-compatible.provider.d.ts.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.js +8 -4
- package/dist/providers/ai-sdk-openai-compatible.provider.js.map +1 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.test.js +119 -1
- package/dist/providers/ai-sdk-openai-compatible.provider.test.js.map +1 -1
- package/dist/providers/ai-sdk-openai.provider.d.ts +14 -0
- package/dist/providers/ai-sdk-openai.provider.d.ts.map +1 -0
- package/dist/providers/ai-sdk-openai.provider.js +18 -0
- package/dist/providers/ai-sdk-openai.provider.js.map +1 -0
- package/dist/providers/codex-responses-model.d.ts +1 -0
- package/dist/providers/codex-responses-model.d.ts.map +1 -1
- package/dist/providers/codex-responses-model.js +5 -4
- package/dist/providers/codex-responses-model.js.map +1 -1
- package/dist/providers/github-copilot/converters.d.ts +45 -0
- package/dist/providers/github-copilot/converters.d.ts.map +1 -0
- package/dist/providers/github-copilot/converters.js +118 -0
- package/dist/providers/github-copilot/converters.js.map +1 -0
- package/dist/providers/github-copilot/converters.test.d.ts +2 -0
- package/dist/providers/github-copilot/converters.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/converters.test.js +162 -0
- package/dist/providers/github-copilot/converters.test.js.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.d.ts +2 -0
- package/dist/providers/github-copilot/github-copilot.provider.d.ts.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.js +75 -0
- package/dist/providers/github-copilot/github-copilot.provider.js.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts +2 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.js +26 -0
- package/dist/providers/github-copilot/github-copilot.provider.test.js.map +1 -0
- package/dist/providers/github-copilot/index.d.ts +4 -0
- package/dist/providers/github-copilot/index.d.ts.map +1 -0
- package/dist/providers/github-copilot/index.js +4 -0
- package/dist/providers/github-copilot/index.js.map +1 -0
- package/dist/providers/github-copilot/model.d.ts +24 -0
- package/dist/providers/github-copilot/model.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.delta.test.d.ts +2 -0
- package/dist/providers/github-copilot/model.delta.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.delta.test.js +15 -0
- package/dist/providers/github-copilot/model.delta.test.js.map +1 -0
- package/dist/providers/github-copilot/model.js +498 -0
- package/dist/providers/github-copilot/model.js.map +1 -0
- package/dist/providers/github-copilot/model.test.d.ts +2 -0
- package/dist/providers/github-copilot/model.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/model.test.js +63 -0
- package/dist/providers/github-copilot/model.test.js.map +1 -0
- package/dist/providers/github-copilot/provider.d.ts +15 -0
- package/dist/providers/github-copilot/provider.d.ts.map +1 -0
- package/dist/providers/github-copilot/provider.js +25 -0
- package/dist/providers/github-copilot/provider.js.map +1 -0
- package/dist/providers/github-copilot/provider.test.d.ts +2 -0
- package/dist/providers/github-copilot/provider.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/provider.test.js +52 -0
- package/dist/providers/github-copilot/provider.test.js.map +1 -0
- package/dist/providers/github-copilot/utils.d.ts +20 -0
- package/dist/providers/github-copilot/utils.d.ts.map +1 -0
- package/dist/providers/github-copilot/utils.js +142 -0
- package/dist/providers/github-copilot/utils.js.map +1 -0
- package/dist/providers/github-copilot/utils.test.d.ts +2 -0
- package/dist/providers/github-copilot/utils.test.d.ts.map +1 -0
- package/dist/providers/github-copilot/utils.test.js +21 -0
- package/dist/providers/github-copilot/utils.test.js.map +1 -0
- package/dist/providers/openai-compatible/api.d.ts +17 -0
- package/dist/providers/openai-compatible/api.d.ts.map +1 -0
- package/dist/providers/openai-compatible/api.js +58 -0
- package/dist/providers/openai-compatible/api.js.map +1 -0
- package/dist/providers/openai-compatible/model.d.ts +17 -0
- package/dist/providers/openai-compatible/model.d.ts.map +1 -0
- package/dist/providers/openai-compatible/model.js +473 -0
- package/dist/providers/openai-compatible/model.js.map +1 -0
- package/dist/providers/openai-compatible/provider.d.ts +22 -0
- package/dist/providers/openai-compatible/provider.d.ts.map +1 -0
- package/dist/providers/openai-compatible/provider.js +43 -0
- package/dist/providers/openai-compatible/provider.js.map +1 -0
- package/dist/providers/openai-compatible/reasoning-content.test.d.ts +2 -0
- package/dist/providers/openai-compatible/reasoning-content.test.d.ts.map +1 -0
- package/dist/providers/openai-compatible/reasoning-content.test.js +258 -0
- package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -0
- package/dist/providers/openai-compatible/utils.d.ts +3 -0
- package/dist/providers/openai-compatible/utils.d.ts.map +1 -0
- package/dist/providers/openai-compatible/utils.js +11 -0
- package/dist/providers/openai-compatible/utils.js.map +1 -0
- package/dist/providers/openai-compatible-behavior-gate.test.js +42 -1
- package/dist/providers/openai-compatible-behavior-gate.test.js.map +1 -1
- package/dist/providers/openai-compatible-middleware.js +1 -1
- package/dist/providers/openai-compatible-middleware.js.map +1 -1
- package/dist/providers/openai-compatible.provider.js +1 -1
- package/dist/providers/openai-compatible.provider.js.map +1 -1
- package/dist/providers/openrouter/api.d.ts +39 -0
- package/dist/providers/openrouter/api.d.ts.map +1 -0
- package/dist/providers/openrouter/api.js +164 -0
- package/dist/providers/openrouter/api.js.map +1 -0
- package/dist/providers/openrouter/converters.d.ts +8 -0
- package/dist/providers/openrouter/converters.d.ts.map +1 -0
- package/dist/providers/openrouter/converters.js +391 -0
- package/dist/providers/openrouter/converters.js.map +1 -0
- package/dist/providers/openrouter/converters.test.d.ts +2 -0
- package/dist/providers/openrouter/converters.test.d.ts.map +1 -0
- package/dist/providers/openrouter/converters.test.js +179 -0
- package/dist/providers/openrouter/converters.test.js.map +1 -0
- package/dist/providers/openrouter/index.d.ts +4 -0
- package/dist/providers/openrouter/index.d.ts.map +1 -0
- package/dist/providers/openrouter/index.js +4 -0
- package/dist/providers/openrouter/index.js.map +1 -0
- package/dist/providers/openrouter/model.d.ts +14 -0
- package/dist/providers/openrouter/model.d.ts.map +1 -0
- package/dist/providers/openrouter/model.js +457 -0
- package/dist/providers/openrouter/model.js.map +1 -0
- package/dist/providers/openrouter/provider.d.ts +15 -0
- package/dist/providers/openrouter/provider.d.ts.map +1 -0
- package/dist/providers/openrouter/provider.js +21 -0
- package/dist/providers/openrouter/provider.js.map +1 -0
- package/dist/providers/openrouter/reasoning-content.test.d.ts +2 -0
- package/dist/providers/openrouter/reasoning-content.test.d.ts.map +1 -0
- package/dist/providers/openrouter/reasoning-content.test.js +122 -0
- package/dist/providers/openrouter/reasoning-content.test.js.map +1 -0
- package/dist/providers/openrouter/utils.d.ts +11 -0
- package/dist/providers/openrouter/utils.d.ts.map +1 -0
- package/dist/providers/openrouter/utils.js +29 -0
- package/dist/providers/openrouter/utils.js.map +1 -0
- package/dist/providers/openrouter.api.retry.test.d.ts +2 -0
- package/dist/providers/openrouter.api.retry.test.d.ts.map +1 -0
- package/dist/providers/openrouter.api.retry.test.js +148 -0
- package/dist/providers/openrouter.api.retry.test.js.map +1 -0
- package/dist/providers/openrouter.test.d.ts +2 -0
- package/dist/providers/openrouter.test.d.ts.map +1 -0
- package/dist/providers/openrouter.test.js +1449 -0
- package/dist/providers/openrouter.test.js.map +1 -0
- package/dist/providers/protocol-client.d.ts +17 -0
- package/dist/providers/protocol-client.d.ts.map +1 -0
- package/dist/providers/protocol-client.js +57 -0
- package/dist/providers/protocol-client.js.map +1 -0
- package/dist/providers/protocol-client.test.d.ts +2 -0
- package/dist/providers/protocol-client.test.d.ts.map +1 -0
- package/dist/providers/protocol-client.test.js +55 -0
- package/dist/providers/protocol-client.test.js.map +1 -0
- package/dist/safety-checker.js +57 -0
- package/dist/scripts/eval-auto-approval/runner.js +1 -1
- package/dist/scripts/eval-auto-approval/runner.js.map +1 -1
- package/dist/services/approval/approval-flow-coordinator.d.ts.map +1 -1
- package/dist/services/approval/approval-flow-coordinator.js +43 -3
- package/dist/services/approval/approval-flow-coordinator.js.map +1 -1
- package/dist/services/approval/shell-sandbox-approval.d.ts +2 -0
- package/dist/services/approval/shell-sandbox-approval.d.ts.map +1 -0
- package/dist/services/approval/shell-sandbox-approval.js +7 -0
- package/dist/services/approval/shell-sandbox-approval.js.map +1 -0
- package/dist/services/approval/tool-approval-batch-coordinator.d.ts.map +1 -1
- package/dist/services/approval/tool-approval-batch-coordinator.js +4 -2
- package/dist/services/approval/tool-approval-batch-coordinator.js.map +1 -1
- package/dist/services/approval-flow-coordinator.js +1 -1
- package/dist/services/approval-flow-coordinator.js.map +1 -1
- package/dist/services/approval-state.d.ts +1 -1
- package/dist/services/approval-state.d.ts.map +1 -1
- package/dist/services/check_mock.d.ts +2 -0
- package/dist/services/check_mock.d.ts.map +1 -0
- package/dist/services/check_mock.js +22 -0
- package/dist/services/check_mock.js.map +1 -0
- package/dist/services/continuation-driver.js +1 -1
- package/dist/services/continuation-driver.js.map +1 -1
- package/dist/services/conversation/conversation-adapter.d.ts +2 -1
- package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
- package/dist/services/conversation/conversation-adapter.js +4 -1
- package/dist/services/conversation/conversation-adapter.js.map +1 -1
- package/dist/services/conversation/conversation-replay.js +1 -1
- package/dist/services/conversation/conversation-replay.js.map +1 -1
- package/dist/services/conversation/conversation-result-builder.d.ts +2 -0
- package/dist/services/conversation/conversation-result-builder.d.ts.map +1 -1
- package/dist/services/conversation/conversation-result-builder.js +31 -2
- package/dist/services/conversation/conversation-result-builder.js.map +1 -1
- package/dist/services/conversation/conversation-service.d.ts +8 -0
- package/dist/services/conversation/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation/conversation-service.js +14 -0
- package/dist/services/conversation/conversation-service.js.map +1 -1
- package/dist/services/conversation/conversation-store.d.ts +13 -0
- package/dist/services/conversation/conversation-store.d.ts.map +1 -1
- package/dist/services/conversation/conversation-store.js +72 -13
- package/dist/services/conversation/conversation-store.js.map +1 -1
- package/dist/services/conversation-adapter.d.ts +3 -2
- package/dist/services/conversation-adapter.d.ts.map +1 -1
- package/dist/services/conversation-adapter.js +10 -8
- package/dist/services/conversation-adapter.js.map +1 -1
- package/dist/services/conversation-events.d.ts +1 -1
- package/dist/services/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation-log-events.d.ts +1 -1
- package/dist/services/conversation-log-events.d.ts.map +1 -1
- package/dist/services/conversation-replay.d.ts +1 -1
- package/dist/services/conversation-replay.d.ts.map +1 -1
- package/dist/services/conversation-replay.js +1 -1
- package/dist/services/conversation-replay.js.map +1 -1
- package/dist/services/conversation-result-builder.d.ts +1 -1
- package/dist/services/conversation-result-builder.d.ts.map +1 -1
- package/dist/services/conversation-result-builder.js +2 -2
- package/dist/services/conversation-result-builder.js.map +1 -1
- package/dist/services/conversation-result-builder.test.js +3 -3
- package/dist/services/conversation-result-builder.test.js.map +1 -1
- package/dist/services/conversation-service.test.js +2 -2
- package/dist/services/conversation-service.test.js.map +1 -1
- package/dist/services/conversation-session-composition.d.ts +3 -1
- package/dist/services/conversation-session-composition.d.ts.map +1 -1
- package/dist/services/conversation-session-composition.js +3 -2
- package/dist/services/conversation-session-composition.js.map +1 -1
- package/dist/services/conversation-session-factory.d.ts +3 -1
- package/dist/services/conversation-session-factory.d.ts.map +1 -1
- package/dist/services/conversation-session-factory.js +7 -1
- package/dist/services/conversation-session-factory.js.map +1 -1
- package/dist/services/conversation-session.characterization.test.js +23 -13
- package/dist/services/conversation-session.characterization.test.js.map +1 -1
- package/dist/services/conversation-store.merge-modes.removed.d.ts +2 -0
- package/dist/services/conversation-store.merge-modes.removed.d.ts.map +1 -0
- package/dist/services/conversation-store.merge-modes.removed.js +2 -0
- package/dist/services/conversation-store.merge-modes.removed.js.map +1 -0
- package/dist/services/conversation-store.merge-modes.test.d.ts.map +1 -1
- package/dist/services/conversation-store.merge-modes.test.js +1 -160
- package/dist/services/conversation-store.merge-modes.test.js.map +1 -1
- package/dist/services/conversation-turn-runner.d.ts +2 -1
- package/dist/services/conversation-turn-runner.d.ts.map +1 -1
- package/dist/services/logging/logging-service.d.ts.map +1 -1
- package/dist/services/logging/logging-service.js +4 -2
- package/dist/services/logging/logging-service.js.map +1 -1
- package/dist/services/logging-service.js +1 -1
- package/dist/services/logging-service.js.map +1 -1
- package/dist/services/model-service.d.ts +1 -1
- package/dist/services/model-service.d.ts.map +1 -1
- package/dist/services/model-service.js +7 -2
- package/dist/services/model-service.js.map +1 -1
- package/dist/services/repro-error.test.d.ts +2 -0
- package/dist/services/repro-error.test.d.ts.map +1 -0
- package/dist/services/repro-error.test.js +38 -0
- package/dist/services/repro-error.test.js.map +1 -0
- package/dist/services/rtk-service.d.ts.map +1 -1
- package/dist/services/rtk-service.js +6 -2
- package/dist/services/rtk-service.js.map +1 -1
- package/dist/services/session/continuation-driver.test.js +169 -7
- package/dist/services/session/continuation-driver.test.js.map +1 -1
- package/dist/services/session/continuation-recovery-handler.test.js +3 -4
- package/dist/services/session/continuation-recovery-handler.test.js.map +1 -1
- package/dist/services/session/conversation-session.d.ts +1 -0
- package/dist/services/session/conversation-session.d.ts.map +1 -1
- package/dist/services/session/conversation-session.js.map +1 -1
- package/dist/services/session/initial-input-preparer.d.ts +1 -0
- package/dist/services/session/initial-input-preparer.d.ts.map +1 -1
- package/dist/services/session/initial-input-preparer.js +2 -1
- package/dist/services/session/initial-input-preparer.js.map +1 -1
- package/dist/services/session/initial-turn-runner.d.ts.map +1 -1
- package/dist/services/session/initial-turn-runner.js +11 -3
- package/dist/services/session/initial-turn-runner.js.map +1 -1
- package/dist/services/session/session-adapter-bridge.d.ts +1 -11
- package/dist/services/session/session-adapter-bridge.d.ts.map +1 -1
- package/dist/services/session/session-adapter-bridge.js +1 -10
- package/dist/services/session/session-adapter-bridge.js.map +1 -1
- package/dist/services/session/session-composition.d.ts +1 -0
- package/dist/services/session/session-composition.d.ts.map +1 -1
- package/dist/services/session/session-composition.js +1 -0
- package/dist/services/session/session-composition.js.map +1 -1
- package/dist/services/session/session-factory.d.ts +46 -3
- package/dist/services/session/session-factory.d.ts.map +1 -1
- package/dist/services/session/session-factory.js +44 -3
- package/dist/services/session/session-factory.js.map +1 -1
- package/dist/services/session/session-factory.test.js +17 -18
- package/dist/services/session/session-factory.test.js.map +1 -1
- package/dist/services/session/session-input-planner.d.ts +1 -0
- package/dist/services/session/session-input-planner.d.ts.map +1 -1
- package/dist/services/session/session-input-planner.js +30 -2
- package/dist/services/session/session-input-planner.js.map +1 -1
- package/dist/services/session/session-lifecycle.d.ts +4 -0
- package/dist/services/session/session-lifecycle.d.ts.map +1 -1
- package/dist/services/session/session-lifecycle.js +10 -0
- package/dist/services/session/session-lifecycle.js.map +1 -1
- package/dist/services/session/session-manager.d.ts +14 -0
- package/dist/services/session/session-manager.d.ts.map +1 -1
- package/dist/services/session/session-manager.js +21 -0
- package/dist/services/session/session-manager.js.map +1 -1
- package/dist/services/session/session-stream-processor.d.ts.map +1 -1
- package/dist/services/session/session-stream-processor.js +13 -0
- package/dist/services/session/session-stream-processor.js.map +1 -1
- package/dist/services/session/session-tool-tracker.d.ts +14 -1
- package/dist/services/session/session-tool-tracker.d.ts.map +1 -1
- package/dist/services/session/session-tool-tracker.js +20 -5
- package/dist/services/session/session-tool-tracker.js.map +1 -1
- package/dist/services/session/test-helpers/conversation-session-fixtures.d.ts +12 -0
- package/dist/services/session/test-helpers/conversation-session-fixtures.d.ts.map +1 -0
- package/dist/services/session/test-helpers/conversation-session-fixtures.js +29 -0
- package/dist/services/session/test-helpers/conversation-session-fixtures.js.map +1 -0
- package/dist/services/session/turn-attempt-factory.d.ts +1 -0
- package/dist/services/session/turn-attempt-factory.d.ts.map +1 -1
- package/dist/services/session/turn-attempt-factory.js +1 -1
- package/dist/services/session/turn-attempt-factory.js.map +1 -1
- package/dist/services/session/turn-coordinator.d.ts +3 -0
- package/dist/services/session/turn-coordinator.d.ts.map +1 -1
- package/dist/services/session/turn-coordinator.js +6 -6
- package/dist/services/session/turn-coordinator.js.map +1 -1
- package/dist/services/session/turn-executor.d.ts.map +1 -1
- package/dist/services/session/turn-executor.js +1 -0
- package/dist/services/session/turn-executor.js.map +1 -1
- package/dist/services/session-state-facade.d.ts +2 -2
- package/dist/services/session-state-facade.d.ts.map +1 -1
- package/dist/services/session-state-facade.js.map +1 -1
- package/dist/services/settings/settings-merger.d.ts.map +1 -1
- package/dist/services/settings/settings-merger.js +7 -5
- package/dist/services/settings/settings-merger.js.map +1 -1
- package/dist/services/settings/settings-persistence.js +1 -1
- package/dist/services/settings/settings-persistence.js.map +1 -1
- package/dist/services/settings/settings-schema.d.ts +25 -0
- package/dist/services/settings/settings-schema.d.ts.map +1 -1
- package/dist/services/settings/settings-schema.js +23 -2
- package/dist/services/settings/settings-schema.js.map +1 -1
- package/dist/services/settings/settings-sources.d.ts.map +1 -1
- package/dist/services/settings/settings-sources.js +5 -0
- package/dist/services/settings/settings-sources.js.map +1 -1
- package/dist/services/shell-auto-approval-evaluator.js +1 -1
- package/dist/services/shell-auto-approval-evaluator.js.map +1 -1
- package/dist/services/skills/skills-service.d.ts.map +1 -1
- package/dist/services/skills/skills-service.js +12 -19
- package/dist/services/skills/skills-service.js.map +1 -1
- package/dist/services/skills/skills-service.test.js +19 -0
- package/dist/services/skills/skills-service.test.js.map +1 -1
- package/dist/services/subagents/reasoning-inheritance.test.d.ts +2 -0
- package/dist/services/subagents/reasoning-inheritance.test.d.ts.map +1 -0
- package/dist/services/subagents/reasoning-inheritance.test.js +73 -0
- package/dist/services/subagents/reasoning-inheritance.test.js.map +1 -0
- package/dist/services/subagents/role-loader.js +3 -3
- package/dist/services/subagents/role-loader.js.map +1 -1
- package/dist/services/subagents/subagent-manager-abort-state.test.d.ts +2 -0
- package/dist/services/subagents/subagent-manager-abort-state.test.d.ts.map +1 -0
- package/dist/services/subagents/subagent-manager-abort-state.test.js +36 -0
- package/dist/services/subagents/subagent-manager-abort-state.test.js.map +1 -0
- package/dist/services/subagents/subagent-manager-abort.test.d.ts +2 -0
- package/dist/services/subagents/subagent-manager-abort.test.d.ts.map +1 -0
- package/dist/services/subagents/subagent-manager-abort.test.js +3 -0
- package/dist/services/subagents/subagent-manager-abort.test.js.map +1 -0
- package/dist/services/subagents/test-helpers/subagent-manager-fixtures.d.ts +35 -0
- package/dist/services/subagents/test-helpers/subagent-manager-fixtures.d.ts.map +1 -0
- package/dist/services/subagents/test-helpers/subagent-manager-fixtures.js +174 -0
- package/dist/services/subagents/test-helpers/subagent-manager-fixtures.js.map +1 -0
- package/dist/services/subagents/tool-policy.d.ts.map +1 -1
- package/dist/services/subagents/tool-policy.js +22 -3
- package/dist/services/subagents/tool-policy.js.map +1 -1
- package/dist/services/tool-execution-ledger.d.ts +42 -1
- package/dist/services/tool-execution-ledger.d.ts.map +1 -1
- package/dist/services/tool-execution-ledger.js +117 -1
- package/dist/services/tool-execution-ledger.js.map +1 -1
- package/dist/services/turn-item-accumulator.d.ts +1 -1
- package/dist/services/turn-item-accumulator.d.ts.map +1 -1
- package/dist/tools/agent/activate-skill.js +1 -1
- package/dist/tools/agent/activate-skill.js.map +1 -1
- package/dist/tools/agent/ask-user.d.ts.map +1 -1
- package/dist/tools/agent/ask-user.js +4 -15
- package/dist/tools/agent/ask-user.js.map +1 -1
- package/dist/tools/agent/ask-user.test.js +50 -11
- package/dist/tools/agent/ask-user.test.js.map +1 -1
- package/dist/tools/agent/run-subagent.d.ts.map +1 -1
- package/dist/tools/agent/run-subagent.js +2 -5
- package/dist/tools/agent/run-subagent.js.map +1 -1
- package/dist/tools/bash.d.ts +10 -0
- package/dist/tools/bash.d.ts.map +1 -0
- package/dist/tools/bash.js +55 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/file/apply-patch.js +2 -2
- package/dist/tools/file/apply-patch.js.map +1 -1
- package/dist/tools/file/apply-patch.test.js +27 -0
- package/dist/tools/file/apply-patch.test.js.map +1 -1
- package/dist/tools/file/code-context.d.ts +27 -0
- package/dist/tools/file/code-context.d.ts.map +1 -0
- package/dist/tools/file/code-context.js +542 -0
- package/dist/tools/file/code-context.js.map +1 -0
- package/dist/tools/file/create-file.d.ts.map +1 -1
- package/dist/tools/file/create-file.js +2 -5
- package/dist/tools/file/create-file.js.map +1 -1
- package/dist/tools/file/create-file.test.js +24 -0
- package/dist/tools/file/create-file.test.js.map +1 -1
- package/dist/tools/file/find-files.d.ts.map +1 -1
- package/dist/tools/file/find-files.js +53 -28
- package/dist/tools/file/find-files.js.map +1 -1
- package/dist/tools/file/glob.d.ts +18 -0
- package/dist/tools/file/glob.d.ts.map +1 -0
- package/dist/tools/file/glob.js +216 -0
- package/dist/tools/file/glob.js.map +1 -0
- package/dist/tools/file/grep.d.ts +21 -0
- package/dist/tools/file/grep.d.ts.map +1 -0
- package/dist/tools/file/grep.js +221 -0
- package/dist/tools/file/grep.js.map +1 -0
- package/dist/tools/file/read-file.d.ts.map +1 -1
- package/dist/tools/file/read-file.js +24 -6
- package/dist/tools/file/read-file.js.map +1 -1
- package/dist/tools/file/search-replace.d.ts.map +1 -1
- package/dist/tools/file/search-replace.js +4 -6
- package/dist/tools/file/search-replace.js.map +1 -1
- package/dist/tools/file/search-replace.test.js +30 -0
- package/dist/tools/file/search-replace.test.js.map +1 -1
- package/dist/tools/format-helpers.js +0 -2
- package/dist/tools/format-helpers.js.map +1 -1
- package/dist/tools/language-providers.d.ts.map +1 -1
- package/dist/tools/language-providers.js +0 -379
- package/dist/tools/language-providers.js.map +1 -1
- package/dist/tools/languages/csharp.js +1 -1
- package/dist/tools/languages/csharp.js.map +1 -1
- package/dist/tools/languages/java.js +1 -1
- package/dist/tools/languages/java.js.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +2 -1
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/system/code-context.d.ts.map +1 -1
- package/dist/tools/system/code-context.js +28 -10
- package/dist/tools/system/code-context.js.map +1 -1
- package/dist/tools/system/grep.d.ts +4 -6
- package/dist/tools/system/grep.d.ts.map +1 -1
- package/dist/tools/system/grep.js +83 -50
- package/dist/tools/system/grep.js.map +1 -1
- package/dist/tools/system/shell.d.ts +10 -1
- package/dist/tools/system/shell.d.ts.map +1 -1
- package/dist/tools/system/shell.js +136 -10
- package/dist/tools/system/shell.js.map +1 -1
- package/dist/tools/types.d.ts +1 -1
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/utils.d.ts +4 -0
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +17 -5
- package/dist/tools/utils.js.map +1 -1
- package/dist/tools/web/web-fetch.js +1 -1
- package/dist/tools/web/web-fetch.js.map +1 -1
- package/dist/utils/command-safety/handlers/script-handler.d.ts +3 -0
- package/dist/utils/command-safety/handlers/script-handler.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/script-handler.js +92 -0
- package/dist/utils/command-safety/handlers/script-handler.js.map +1 -0
- package/dist/utils/command-safety/handlers/script-handler.test.d.ts +2 -0
- package/dist/utils/command-safety/handlers/script-handler.test.d.ts.map +1 -0
- package/dist/utils/command-safety/handlers/script-handler.test.js +44 -0
- package/dist/utils/command-safety/handlers/script-handler.test.js.map +1 -0
- package/dist/utils/command-safety/index.test.d.ts +2 -0
- package/dist/utils/command-safety/index.test.d.ts.map +1 -0
- package/dist/utils/command-safety/index.test.js +22 -0
- package/dist/utils/command-safety/index.test.js.map +1 -0
- package/dist/utils/command-safety.d.ts +21 -0
- package/dist/utils/command-safety.d.ts.map +1 -0
- package/dist/utils/command-safety.devnull.test.d.ts +2 -0
- package/dist/utils/command-safety.devnull.test.d.ts.map +1 -0
- package/dist/utils/command-safety.devnull.test.js +13 -0
- package/dist/utils/command-safety.devnull.test.js.map +1 -0
- package/dist/utils/command-safety.js +348 -0
- package/dist/utils/command-safety.js.map +1 -0
- package/dist/utils/conversation/conversation-event-handler.js +1 -1
- package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
- package/dist/utils/conversation/message-utils.d.ts +5 -0
- package/dist/utils/conversation/message-utils.d.ts.map +1 -1
- package/dist/utils/conversation/message-utils.js +20 -0
- package/dist/utils/conversation/message-utils.js.map +1 -1
- package/dist/utils/conversation/test-helpers/event-handler-fixtures.d.ts +31 -0
- package/dist/utils/conversation/test-helpers/event-handler-fixtures.d.ts.map +1 -0
- package/dist/utils/conversation/test-helpers/event-handler-fixtures.js +42 -0
- package/dist/utils/conversation/test-helpers/event-handler-fixtures.js.map +1 -0
- package/dist/utils/extract-command-messages.test.js +6 -6
- package/dist/utils/extract-command-messages.test.js.map +1 -1
- package/dist/utils/output/output-trim.d.ts +1 -1
- package/dist/utils/output/output-trim.js +1 -1
- package/dist/utils/project-tree.d.ts +7 -12
- package/dist/utils/project-tree.d.ts.map +1 -1
- package/dist/utils/project-tree.js +184 -83
- package/dist/utils/project-tree.js.map +1 -1
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts +2 -0
- package/dist/utils/provider-traffic-extractor.repro.test.d.ts.map +1 -0
- package/dist/utils/provider-traffic-extractor.repro.test.js.map +1 -0
- package/dist/utils/settings-command.d.ts +2 -2
- package/dist/utils/settings-command.d.ts.map +1 -1
- package/dist/utils/settings-command.js +2 -2
- package/dist/utils/settings-command.js.map +1 -1
- package/dist/utils/shell/command-safety/find-helpers.js +1 -1
- package/dist/utils/shell/command-safety/find-helpers.js.map +1 -1
- package/dist/utils/shell/command-safety/handlers/git-handler.js +1 -1
- package/dist/utils/shell/command-safety/handlers/git-handler.js.map +1 -1
- package/dist/utils/shell/execute-shell.d.ts +2 -0
- package/dist/utils/shell/execute-shell.d.ts.map +1 -1
- package/dist/utils/shell/execute-shell.js +9 -6
- package/dist/utils/shell/execute-shell.js.map +1 -1
- package/dist/utils/shell/sandbox/denied-read-detector.d.ts +39 -0
- package/dist/utils/shell/sandbox/denied-read-detector.d.ts.map +1 -0
- package/dist/utils/shell/sandbox/denied-read-detector.js +250 -0
- package/dist/utils/shell/sandbox/denied-read-detector.js.map +1 -0
- package/dist/utils/shell/sandbox/denied-read-stores.d.ts +74 -0
- package/dist/utils/shell/sandbox/denied-read-stores.d.ts.map +1 -0
- package/dist/utils/shell/sandbox/denied-read-stores.js +166 -0
- package/dist/utils/shell/sandbox/denied-read-stores.js.map +1 -0
- package/dist/utils/shell/sandbox/sandbox-env.d.ts +7 -0
- package/dist/utils/shell/sandbox/sandbox-env.d.ts.map +1 -0
- package/dist/utils/shell/sandbox/sandbox-env.js +40 -0
- package/dist/utils/shell/sandbox/sandbox-env.js.map +1 -0
- package/dist/utils/shell/sandbox/sandbox-policy.d.ts +41 -0
- package/dist/utils/shell/sandbox/sandbox-policy.d.ts.map +1 -0
- package/dist/utils/shell/sandbox/sandbox-policy.js +217 -0
- package/dist/utils/shell/sandbox/sandbox-policy.js.map +1 -0
- package/dist/utils/shell/sandbox/shell-sandbox-runner.d.ts +18 -0
- package/dist/utils/shell/sandbox/shell-sandbox-runner.d.ts.map +1 -0
- package/dist/utils/shell/sandbox/shell-sandbox-runner.js +58 -0
- package/dist/utils/shell/sandbox/shell-sandbox-runner.js.map +1 -0
- package/dist/utils/shell/shell-output.d.ts.map +1 -1
- package/dist/utils/shell/shell-output.js +8 -6
- package/dist/utils/shell/shell-output.js.map +1 -1
- package/dist/utils/shell/temp-dir.d.ts +10 -0
- package/dist/utils/shell/temp-dir.d.ts.map +1 -0
- package/dist/utils/shell/temp-dir.js +68 -0
- package/dist/utils/shell/temp-dir.js.map +1 -0
- package/dist/utils/skill-discovery-paths.d.ts +5 -0
- package/dist/utils/skill-discovery-paths.d.ts.map +1 -0
- package/dist/utils/skill-discovery-paths.js +18 -0
- package/dist/utils/skill-discovery-paths.js.map +1 -0
- package/package.json +10 -16
- package/dist/components/ModelSelectionMenu.debug.test.d.ts +0 -2
- package/dist/components/ModelSelectionMenu.debug.test.d.ts.map +0 -1
- package/dist/components/ModelSelectionMenu.debug.test.js.map +0 -1
- package/dist/hooks/conversation-ui-reducer.multi-select.test.d.ts +0 -2
- package/dist/hooks/conversation-ui-reducer.multi-select.test.d.ts.map +0 -1
- package/dist/hooks/conversation-ui-reducer.multi-select.test.js +0 -123
- package/dist/hooks/conversation-ui-reducer.multi-select.test.js.map +0 -1
- package/dist/hooks/use-conversation.ask-user-multi-select.test.d.ts +0 -2
- package/dist/hooks/use-conversation.ask-user-multi-select.test.d.ts.map +0 -1
- package/dist/hooks/use-conversation.ask-user-multi-select.test.js +0 -159
- package/dist/hooks/use-conversation.ask-user-multi-select.test.js.map +0 -1
- package/dist/inspect_zod.d.ts +0 -2
- package/dist/inspect_zod.d.ts.map +0 -1
- package/dist/inspect_zod.js +0 -16
- package/dist/inspect_zod.js.map +0 -1
- package/dist/prompts/simple_prev2.md +0 -33
- package/dist/services/conversation-result-resolver.d.ts +0 -25
- package/dist/services/conversation-result-resolver.d.ts.map +0 -1
- package/dist/services/conversation-result-resolver.js +0 -79
- package/dist/services/conversation-result-resolver.js.map +0 -1
- package/dist/services/conversation-result-resolver.test.d.ts +0 -2
- package/dist/services/conversation-result-resolver.test.d.ts.map +0 -1
- package/dist/services/conversation-result-resolver.test.js +0 -186
- package/dist/services/conversation-result-resolver.test.js.map +0 -1
- package/dist/services/session-state-controller.test.d.ts +0 -2
- package/dist/services/session-state-controller.test.d.ts.map +0 -1
- package/dist/services/session-state-controller.test.js +0 -125
- package/dist/services/session-state-controller.test.js.map +0 -1
- package/dist/services/turn-execution-orchestrator.d.ts +0 -79
- package/dist/services/turn-execution-orchestrator.d.ts.map +0 -1
- package/dist/services/turn-execution-orchestrator.js +0 -687
- package/dist/services/turn-execution-orchestrator.js.map +0 -1
- package/dist/services/turn-execution-orchestrator.test.d.ts +0 -2
- package/dist/services/turn-execution-orchestrator.test.d.ts.map +0 -1
- package/dist/services/turn-execution-orchestrator.test.js +0 -236
- package/dist/services/turn-execution-orchestrator.test.js.map +0 -1
- package/dist/utils/command-safety/_scratch-classify.test.d.ts +0 -2
- package/dist/utils/command-safety/_scratch-classify.test.d.ts.map +0 -1
- package/dist/utils/command-safety/_scratch-classify.test.js +0 -22
- package/dist/utils/command-safety/_scratch-classify.test.js.map +0 -1
- package/dist/utils/command-safety/scratch-classify.test.d.ts +0 -2
- package/dist/utils/command-safety/scratch-classify.test.d.ts.map +0 -1
- package/dist/utils/command-safety/scratch-classify.test.js +0 -22
- package/dist/utils/command-safety/scratch-classify.test.js.map +0 -1
- package/dist/utils/command-safety/scratch-tally.test.d.ts +0 -2
- package/dist/utils/command-safety/scratch-tally.test.d.ts.map +0 -1
- package/dist/utils/command-safety/scratch-tally.test.js +0 -68
- package/dist/utils/command-safety/scratch-tally.test.js.map +0 -1
- package/dist/utils/project-tree.test.d.ts +0 -2
- package/dist/utils/project-tree.test.d.ts.map +0 -1
- package/dist/utils/project-tree.test.js +0 -149
- package/dist/utils/project-tree.test.js.map +0 -1
- package/dist/utils/terminal-clear.d.ts +0 -7
- package/dist/utils/terminal-clear.d.ts.map +0 -1
- package/dist/utils/terminal-clear.js +0 -5
- package/dist/utils/terminal-clear.js.map +0 -1
- package/dist/utils/terminal-clear.test.d.ts +0 -2
- package/dist/utils/terminal-clear.test.d.ts.map +0 -1
- package/dist/utils/terminal-clear.test.js +0 -13
- package/dist/utils/terminal-clear.test.js.map +0 -1
- package/dist/utils/test-render.d.ts +0 -14
- package/dist/utils/test-render.d.ts.map +0 -1
- package/dist/utils/test-render.js +0 -44
- package/dist/utils/test-render.js.map +0 -1
- package/readme.md +0 -887
- /package/dist/components/{Input → input}/input-width.test.d.ts +0 -0
- /package/dist/components/{Input → input}/input-width.test.d.ts.map +0 -0
- /package/dist/components/{Input → input}/input-width.test.js +0 -0
- /package/dist/components/{Input → input}/input-width.test.js.map +0 -0
- /package/dist/components/{Input → input}/insertions.test.d.ts +0 -0
- /package/dist/components/{Input → input}/insertions.test.d.ts.map +0 -0
- /package/dist/components/{Input → input}/insertions.test.js +0 -0
- /package/dist/components/{Input → input}/insertions.test.js.map +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { render } from 'ink-testing-library';
|
|
4
|
+
import { TextInput } from './TextInput.js';
|
|
5
|
+
test('onCursorChange callback should not cause re-renders when callback reference changes', t => {
|
|
6
|
+
let renderCount = 0;
|
|
7
|
+
const TestWrapper = () => {
|
|
8
|
+
renderCount++;
|
|
9
|
+
// Create a new callback on each render by using inline arrow function
|
|
10
|
+
return (React.createElement(TextInput, { value: "test", onChange: () => { }, onCursorChange: () => {
|
|
11
|
+
// Callback changes on each render
|
|
12
|
+
// We're testing that this doesn't cause excessive re-renders
|
|
13
|
+
}, focus: false }));
|
|
14
|
+
};
|
|
15
|
+
const { rerender } = render(React.createElement(TestWrapper, null));
|
|
16
|
+
const initialRenderCount = renderCount;
|
|
17
|
+
// Force parent re-render with new callback
|
|
18
|
+
rerender(React.createElement(TestWrapper, null));
|
|
19
|
+
// Should only re-render once for the parent update
|
|
20
|
+
// NOT trigger additional re-renders from the onCursorChange effect
|
|
21
|
+
t.is(renderCount, initialRenderCount + 1);
|
|
22
|
+
});
|
|
23
|
+
test('cursor position updates should not trigger excessive re-renders', t => {
|
|
24
|
+
let renderCount = 0;
|
|
25
|
+
const cursorPositions = [];
|
|
26
|
+
const TestWrapper = ({ value }) => {
|
|
27
|
+
renderCount++;
|
|
28
|
+
return (React.createElement(TextInput, { value: value, onChange: () => { }, onCursorChange: offset => {
|
|
29
|
+
cursorPositions.push(offset);
|
|
30
|
+
}, focus: false }));
|
|
31
|
+
};
|
|
32
|
+
const { rerender } = render(React.createElement(TestWrapper, { value: "a" }));
|
|
33
|
+
const initialRenderCount = renderCount;
|
|
34
|
+
// Simulate fast typing (multiple value changes)
|
|
35
|
+
rerender(React.createElement(TestWrapper, { value: "ab" }));
|
|
36
|
+
rerender(React.createElement(TestWrapper, { value: "abc" }));
|
|
37
|
+
rerender(React.createElement(TestWrapper, { value: "abcd" }));
|
|
38
|
+
// Should only render once per value change (4 total: initial + 3 updates)
|
|
39
|
+
// NOT multiple renders per value change
|
|
40
|
+
t.is(renderCount, initialRenderCount + 3);
|
|
41
|
+
// Should track cursor positions
|
|
42
|
+
t.true(cursorPositions.length > 0);
|
|
43
|
+
});
|
|
44
|
+
test('value changes should update cursor offset correctly', t => {
|
|
45
|
+
let cursorOffset = 0;
|
|
46
|
+
const TestWrapper = ({ value }) => {
|
|
47
|
+
return (React.createElement(TextInput, { value: value, onChange: () => { }, onCursorChange: offset => {
|
|
48
|
+
cursorOffset = offset;
|
|
49
|
+
}, focus: false }));
|
|
50
|
+
};
|
|
51
|
+
const { rerender } = render(React.createElement(TestWrapper, { value: "" }));
|
|
52
|
+
t.is(cursorOffset, 0);
|
|
53
|
+
rerender(React.createElement(TestWrapper, { value: "hello" }));
|
|
54
|
+
// Cursor should not exceed value length
|
|
55
|
+
t.true(cursorOffset <= 5);
|
|
56
|
+
});
|
|
57
|
+
test('cursorOverride should update cursor position without excessive renders', t => {
|
|
58
|
+
let renderCount = 0;
|
|
59
|
+
let cursorOffset = 0;
|
|
60
|
+
const TestWrapper = ({ override }) => {
|
|
61
|
+
renderCount++;
|
|
62
|
+
return (React.createElement(TextInput, { value: "hello world", onChange: () => { }, onCursorChange: offset => {
|
|
63
|
+
cursorOffset = offset;
|
|
64
|
+
}, cursorOverride: override, focus: false }));
|
|
65
|
+
};
|
|
66
|
+
const { rerender } = render(React.createElement(TestWrapper, { override: undefined }));
|
|
67
|
+
const initialRenderCount = renderCount;
|
|
68
|
+
// Override to position 5
|
|
69
|
+
rerender(React.createElement(TestWrapper, { override: 5 }));
|
|
70
|
+
// Should only render once for the override
|
|
71
|
+
t.is(renderCount, initialRenderCount + 1);
|
|
72
|
+
// Cursor should be updated
|
|
73
|
+
t.true(cursorOffset >= 0 && cursorOffset <= 11);
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=TextInput.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextInput.test.js","sourceRoot":"","sources":["../../source/components/TextInput.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__test_act.test.d.ts","sourceRoot":"","sources":["../../source/components/__test_act.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// @ts-ignore
|
|
2
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
3
|
+
import test from 'ava';
|
|
4
|
+
import React, { act } from 'react';
|
|
5
|
+
import { render } from 'ink-testing-library';
|
|
6
|
+
import { Box, Text } from 'ink';
|
|
7
|
+
test('simple render no act', (t) => {
|
|
8
|
+
const { lastFrame } = render(React.createElement(Box, null,
|
|
9
|
+
React.createElement(Text, null, "Hello")));
|
|
10
|
+
t.true((lastFrame() ?? '').includes('Hello'));
|
|
11
|
+
});
|
|
12
|
+
test('simple render with act', async (t) => {
|
|
13
|
+
let lastFrame;
|
|
14
|
+
await act(async () => {
|
|
15
|
+
const result = render(React.createElement(Box, null,
|
|
16
|
+
React.createElement(Text, null, "Hello")));
|
|
17
|
+
lastFrame = result.lastFrame;
|
|
18
|
+
});
|
|
19
|
+
await act(async () => { });
|
|
20
|
+
t.true((lastFrame() ?? '').includes('Hello'));
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=__test_act.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__test_act.test.js","sourceRoot":"","sources":["../../source/components/__test_act.test.tsx"],"names":[],"mappings":"AAAA,aAAa;AACb,UAAU,CAAC,wBAAwB,GAAG,IAAI,CAAC;AAE3C,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE;IACjC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,GAAG;QAAC,oBAAC,IAAI,gBAAa,CAAM,CAAC,CAAC;IAC5D,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wBAAwB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACzC,IAAI,SAAoC,CAAC;IAEzC,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAC,GAAG;YAAC,oBAAC,IAAI,gBAAa,CAAM,CAAC,CAAC;QACrD,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;IAE1B,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__test_act_test.d.ts","sourceRoot":"","sources":["../../source/components/__test_act_test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// @ts-ignore
|
|
2
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
3
|
+
import test from 'ava';
|
|
4
|
+
import React, { act } from 'react';
|
|
5
|
+
import { render } from 'ink-testing-library';
|
|
6
|
+
import { Box, Text } from 'ink';
|
|
7
|
+
test('simple render no act', (t) => {
|
|
8
|
+
const { lastFrame } = render(React.createElement(Box, null,
|
|
9
|
+
React.createElement(Text, null, "Hello")));
|
|
10
|
+
t.true((lastFrame() ?? '').includes('Hello'));
|
|
11
|
+
});
|
|
12
|
+
test('simple render with act', async (t) => {
|
|
13
|
+
let lastFrame;
|
|
14
|
+
await act(async () => {
|
|
15
|
+
const result = render(React.createElement(Box, null,
|
|
16
|
+
React.createElement(Text, null, "Hello")));
|
|
17
|
+
lastFrame = result.lastFrame;
|
|
18
|
+
});
|
|
19
|
+
await act(async () => { });
|
|
20
|
+
t.true((lastFrame() ?? '').includes('Hello'));
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=__test_act_test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"__test_act_test.js","sourceRoot":"","sources":["../../source/components/__test_act_test.tsx"],"names":[],"mappings":"AAAA,aAAa;AACb,UAAU,CAAC,wBAAwB,GAAG,IAAI,CAAC;AAE3C,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE;IACjC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,GAAG;QAAC,oBAAC,IAAI,gBAAa,CAAM,CAAC,CAAC;IAC5D,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wBAAwB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACzC,IAAI,SAAoC,CAAC;IAEzC,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAC,GAAG;YAAC,oBAAC,IAAI,gBAAa,CAAM,CAAC,CAAC;QACrD,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;IAE1B,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"act-test.test.d.ts","sourceRoot":"","sources":["../../source/components/act-test.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// @ts-ignore
|
|
2
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
3
|
+
import test from 'ava';
|
|
4
|
+
import React, { act } from 'react';
|
|
5
|
+
import { render } from 'ink-testing-library';
|
|
6
|
+
import { Box, Text } from 'ink';
|
|
7
|
+
test('simple render no act', (t) => {
|
|
8
|
+
const { lastFrame } = render(React.createElement(Box, null,
|
|
9
|
+
React.createElement(Text, null, "Hello")));
|
|
10
|
+
t.true((lastFrame() ?? '').includes('Hello'));
|
|
11
|
+
});
|
|
12
|
+
test('simple render with act', async (t) => {
|
|
13
|
+
let lastFrame;
|
|
14
|
+
act(async () => {
|
|
15
|
+
const result = render(React.createElement(Box, null,
|
|
16
|
+
React.createElement(Text, null, "Hello")));
|
|
17
|
+
lastFrame = result.lastFrame;
|
|
18
|
+
});
|
|
19
|
+
act(async () => { });
|
|
20
|
+
t.true((lastFrame() ?? '').includes('Hello'));
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=act-test.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"act-test.test.js","sourceRoot":"","sources":["../../source/components/act-test.test.tsx"],"names":[],"mappings":"AAAA,aAAa;AACb,UAAU,CAAC,wBAAwB,GAAG,IAAI,CAAC;AAE3C,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE;IACjC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,oBAAC,GAAG;QAAC,oBAAC,IAAI,gBAAa,CAAM,CAAC,CAAC;IAC5D,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wBAAwB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACzC,IAAI,SAAoC,CAAC;IAEzC,GAAG,CAAC,KAAK,IAAI,EAAE;QACb,MAAM,MAAM,GAAG,MAAM,CAAC,oBAAC,GAAG;YAAC,oBAAC,IAAI,gBAAa,CAAM,CAAC,CAAC;QACrD,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;IAEpB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
|
+
type Props<T> = {
|
|
3
|
+
items: T[];
|
|
4
|
+
selectedIndex: number;
|
|
5
|
+
scrollOffset?: number;
|
|
6
|
+
maxHeight?: number;
|
|
7
|
+
borderColor: string;
|
|
8
|
+
loading?: boolean;
|
|
9
|
+
loadingText?: string;
|
|
10
|
+
error?: string | null;
|
|
11
|
+
fallbackText?: ReactNode;
|
|
12
|
+
footer?: ReactNode;
|
|
13
|
+
footerOutsideBorder?: boolean;
|
|
14
|
+
isInactive?: (item: T) => boolean;
|
|
15
|
+
renderItem: (item: T, index: number, isSelected: boolean, isInactive: boolean) => ReactNode;
|
|
16
|
+
};
|
|
17
|
+
export declare function MenuContainer<T>({ items, selectedIndex, scrollOffset, maxHeight, borderColor, loading, loadingText, error, fallbackText, footer, footerOutsideBorder, isInactive, renderItem, }: Props<T>): React.JSX.Element;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=MenuContainer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MenuContainer.d.ts","sourceRoot":"","sources":["../../../source/components/common/MenuContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGzC,KAAK,KAAK,CAAC,CAAC,IAAI;IACd,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IAGpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGtB,YAAY,CAAC,EAAE,SAAS,CAAC;IAGzB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;IAClC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,KAAK,SAAS,CAAC;CAC7F,CAAC;AAEF,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAC/B,KAAK,EACL,aAAa,EACb,YAAgB,EAChB,SAAc,EACd,WAAW,EACX,OAAe,EACf,WAA0B,EAC1B,KAAY,EACZ,YAAY,EACZ,MAAM,EACN,mBAA2B,EAC3B,UAAU,EACV,UAAU,GACX,EAAE,KAAK,CAAC,CAAC,CAAC,qBAqFV"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
export function MenuContainer({ items, selectedIndex, scrollOffset = 0, maxHeight = 10, borderColor, loading = false, loadingText = 'Loading...', error = null, fallbackText, footer, footerOutsideBorder = false, isInactive, renderItem, }) {
|
|
4
|
+
if (loading) {
|
|
5
|
+
return (React.createElement(Box, { borderStyle: "round", borderColor: borderColor, paddingX: 1, flexDirection: "column" },
|
|
6
|
+
React.createElement(Text, { color: borderColor }, loadingText)));
|
|
7
|
+
}
|
|
8
|
+
if (error) {
|
|
9
|
+
return (React.createElement(Box, { borderStyle: "round", borderColor: "red", paddingX: 1, flexDirection: "column" },
|
|
10
|
+
React.createElement(Text, { color: "red" }, error)));
|
|
11
|
+
}
|
|
12
|
+
if (items.length === 0) {
|
|
13
|
+
return (React.createElement(Box, { borderStyle: "round", borderColor: borderColor, paddingX: 1, flexDirection: "column" }, typeof fallbackText === 'string' ? React.createElement(Text, { color: "gray" }, fallbackText) : fallbackText));
|
|
14
|
+
}
|
|
15
|
+
const visibleItems = items.slice(scrollOffset, scrollOffset + maxHeight);
|
|
16
|
+
const hasScrollUp = scrollOffset > 0;
|
|
17
|
+
const hasScrollDown = scrollOffset + maxHeight < items.length;
|
|
18
|
+
const content = (React.createElement(Box, { borderStyle: "round", borderColor: borderColor, paddingX: 1, flexDirection: "column" },
|
|
19
|
+
hasScrollUp && React.createElement(Text, { color: "#64748b" },
|
|
20
|
+
"\u2191 ",
|
|
21
|
+
scrollOffset,
|
|
22
|
+
" more"),
|
|
23
|
+
visibleItems.map((item, visibleIndex) => {
|
|
24
|
+
const actualIndex = scrollOffset + visibleIndex;
|
|
25
|
+
const isSelected = actualIndex === selectedIndex;
|
|
26
|
+
const isItemInactive = isInactive?.(item) || item?.inactive === true;
|
|
27
|
+
const element = renderItem(item, actualIndex, isSelected, isItemInactive);
|
|
28
|
+
if (isItemInactive) {
|
|
29
|
+
if (React.isValidElement(element) && element.type === Text) {
|
|
30
|
+
return React.cloneElement(element, { color: 'gray' });
|
|
31
|
+
}
|
|
32
|
+
if (typeof element === 'string' || typeof element === 'number') {
|
|
33
|
+
return (React.createElement(Box, { key: actualIndex },
|
|
34
|
+
React.createElement(Text, { color: "gray" }, element)));
|
|
35
|
+
}
|
|
36
|
+
return element;
|
|
37
|
+
}
|
|
38
|
+
return element;
|
|
39
|
+
}),
|
|
40
|
+
hasScrollDown && React.createElement(Text, { color: "#64748b" },
|
|
41
|
+
"\u2193 ",
|
|
42
|
+
items.length - scrollOffset - maxHeight,
|
|
43
|
+
" more"),
|
|
44
|
+
!footerOutsideBorder && footer && (React.createElement(Box, { marginTop: 1, borderStyle: "single", borderTop: true, borderBottom: false, borderLeft: false, borderRight: false, borderColor: "gray" }, typeof footer === 'string' ? (React.createElement(Text, { color: "gray", dimColor: true }, footer)) : (footer)))));
|
|
45
|
+
if (footerOutsideBorder && footer) {
|
|
46
|
+
return (React.createElement(Box, { flexDirection: "column" },
|
|
47
|
+
content,
|
|
48
|
+
typeof footer === 'string' ? React.createElement(Text, { color: "#64748b" }, footer) : footer));
|
|
49
|
+
}
|
|
50
|
+
return content;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=MenuContainer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MenuContainer.js","sourceRoot":"","sources":["../../../source/components/common/MenuContainer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MenuContainer.test.d.ts","sourceRoot":"","sources":["../../../source/components/common/MenuContainer.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// @ts-ignore
|
|
2
|
+
global.IS_REACT_ACT_ENVIRONMENT = true;
|
|
3
|
+
import { it, expect } from 'vitest';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { renderInAct } from '../../test-helpers/ink-testing.js';
|
|
6
|
+
import { Box, Text } from 'ink';
|
|
7
|
+
import { MenuContainer } from './MenuContainer.js';
|
|
8
|
+
it.sequential('MenuContainer renders items', async () => {
|
|
9
|
+
const { lastFrame } = await renderInAct(React.createElement(MenuContainer, { items: ['a', 'b', 'c'], selectedIndex: 0, borderColor: "magenta", renderItem: (item) => React.createElement(Text, { key: item }, item) }));
|
|
10
|
+
const output = lastFrame();
|
|
11
|
+
expect(output).toBeTruthy();
|
|
12
|
+
expect(output.includes('a')).toBe(true);
|
|
13
|
+
expect(output.includes('b')).toBe(true);
|
|
14
|
+
expect(output.includes('c')).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it.sequential('MenuContainer passes isInactive to renderItem and identifies them correctly', async () => {
|
|
17
|
+
const items = ['a', 'b', 'c'];
|
|
18
|
+
const renderedInactiveArgs = [];
|
|
19
|
+
const { lastFrame } = await renderInAct(React.createElement(MenuContainer, { items: items, selectedIndex: 0, borderColor: "magenta", isInactive: (item) => item === 'b', renderItem: (item, _index, _isSelected, isInactive) => {
|
|
20
|
+
renderedInactiveArgs.push(isInactive);
|
|
21
|
+
return React.createElement(Text, { key: item }, item);
|
|
22
|
+
} }));
|
|
23
|
+
const output = lastFrame();
|
|
24
|
+
expect(output).toBeTruthy();
|
|
25
|
+
expect(renderedInactiveArgs).toEqual([false, true, false]);
|
|
26
|
+
});
|
|
27
|
+
it.sequential('MenuContainer handles inactive items that return Box components without crashing', async () => {
|
|
28
|
+
const items = ['a', 'b', 'c'];
|
|
29
|
+
const { lastFrame } = await renderInAct(React.createElement(MenuContainer, { items: items, selectedIndex: 0, borderColor: "magenta", isInactive: (item) => item === 'b', renderItem: (item, _index, _isSelected, isInactive) => (React.createElement(Box, { key: item },
|
|
30
|
+
React.createElement(Text, { color: isInactive ? 'gray' : 'white' }, item))) }));
|
|
31
|
+
const output = lastFrame();
|
|
32
|
+
expect(output).toBeTruthy();
|
|
33
|
+
expect(output.includes('a')).toBe(true);
|
|
34
|
+
expect(output.includes('b')).toBe(true);
|
|
35
|
+
expect(output.includes('c')).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=MenuContainer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MenuContainer.test.js","sourceRoot":"","sources":["../../../source/components/common/MenuContainer.test.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface ScrollableTabBarProps<T extends {
|
|
3
|
+
id: string;
|
|
4
|
+
}> {
|
|
5
|
+
/** Array of tab items (must have an `id` property) */
|
|
6
|
+
items: T[];
|
|
7
|
+
/** ID of the currently active tab */
|
|
8
|
+
activeItemId: string;
|
|
9
|
+
/** Function to compute the display width of each tab item */
|
|
10
|
+
getItemWidth: (item: T) => number;
|
|
11
|
+
/** Callback to render a tab; receives item and isActive boolean */
|
|
12
|
+
renderTab: (item: T, isActive: boolean) => React.ReactNode;
|
|
13
|
+
/** Optional hint text shown on the right side of the tab bar */
|
|
14
|
+
hint?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A generic scrollable tab bar component that renders visible tabs based on
|
|
18
|
+
* available terminal width, with scroll arrows and optional hint text.
|
|
19
|
+
*
|
|
20
|
+
* Uses a greedy algorithm starting from the active tab to fit as many tabs
|
|
21
|
+
* as possible within the available width.
|
|
22
|
+
*/
|
|
23
|
+
export declare function ScrollableTabBar<T extends {
|
|
24
|
+
id: string;
|
|
25
|
+
}>({ items, activeItemId, getItemWidth, renderTab, hint, }: ScrollableTabBarProps<T>): React.ReactElement;
|
|
26
|
+
//# sourceMappingURL=ScrollableTabBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollableTabBar.d.ts","sourceRoot":"","sources":["../../../source/components/common/ScrollableTabBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE;IAC7D,sDAAsD;IACtD,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;IAClC,mEAAmE;IACnE,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IAC3D,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,EACzD,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,IAAI,GACL,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,YAAY,CA4B/C"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Box, Text, useStdout } from 'ink';
|
|
3
|
+
import { computeVisibleTabs } from './compute-visible-tabs.js';
|
|
4
|
+
/**
|
|
5
|
+
* A generic scrollable tab bar component that renders visible tabs based on
|
|
6
|
+
* available terminal width, with scroll arrows and optional hint text.
|
|
7
|
+
*
|
|
8
|
+
* Uses a greedy algorithm starting from the active tab to fit as many tabs
|
|
9
|
+
* as possible within the available width.
|
|
10
|
+
*/
|
|
11
|
+
export function ScrollableTabBar({ items, activeItemId, getItemWidth, renderTab, hint, }) {
|
|
12
|
+
const { stdout } = useStdout();
|
|
13
|
+
const terminalWidth = stdout?.columns || process.stdout.columns || 80;
|
|
14
|
+
const hintLength = hint ? hint.length : 0;
|
|
15
|
+
const availableWidth = terminalWidth - hintLength - 2; // -2 for padding
|
|
16
|
+
const { visibleItems, hasLeftScroll, hasRightScroll } = computeVisibleTabs(items, activeItemId, availableWidth, getItemWidth);
|
|
17
|
+
return (React.createElement(Box, { justifyContent: "space-between" },
|
|
18
|
+
React.createElement(Box, null,
|
|
19
|
+
hasLeftScroll && React.createElement(Text, { color: "#64748b" }, "\u25C0 "),
|
|
20
|
+
visibleItems.map((item, index) => (React.createElement(Box, { key: item.id },
|
|
21
|
+
renderTab(item, item.id === activeItemId),
|
|
22
|
+
index < visibleItems.length - 1 && React.createElement(Text, { color: "#64748b" }, ' │ ')))),
|
|
23
|
+
hasRightScroll && React.createElement(Text, { color: "#64748b" }, " \u25B6")),
|
|
24
|
+
hint && React.createElement(Text, { color: "#64748b" }, hint)));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=ScrollableTabBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScrollableTabBar.js","sourceRoot":"","sources":["../../../source/components/common/ScrollableTabBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAe/D;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAA2B,EACzD,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,IAAI,GACqB;IACzB,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,aAAa,GAAI,MAAc,EAAE,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAC/E,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,cAAc,GAAG,aAAa,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,iBAAiB;IAExE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,GAAG,kBAAkB,CACxE,KAAK,EACL,YAAY,EACZ,cAAc,EACd,YAAY,CACb,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG,IAAC,cAAc,EAAC,eAAe;QACjC,oBAAC,GAAG;YACD,aAAa,IAAI,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS,cAAU;YAChD,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CACjC,oBAAC,GAAG,IAAC,GAAG,EAAE,IAAI,CAAC,EAAE;gBACd,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,KAAK,YAAY,CAAC;gBACzC,KAAK,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS,IAAE,KAAK,CAAQ,CACpE,CACP,CAAC;YACD,cAAc,IAAI,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS,cAAU,CAC9C;QACL,IAAI,IAAI,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS,IAAE,IAAI,CAAQ,CACxC,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Greedy horizontal tab expansion: starting from the active tab, expand left
|
|
3
|
+
* and right to fit as many tabs as possible within the available terminal width.
|
|
4
|
+
*
|
|
5
|
+
* Each tab occupies `getItemWidth(item)` characters for its content, plus 3
|
|
6
|
+
* characters for a separator (" │ ") between visible tabs, except edges which
|
|
7
|
+
* use 4 characters for scroll indicators ("◀ " / " ▶").
|
|
8
|
+
*/
|
|
9
|
+
export declare function computeVisibleTabs<T>(items: T[], activeItemId: string, availableWidth: number, getItemWidth: (item: T) => number): {
|
|
10
|
+
startIndex: number;
|
|
11
|
+
endIndex: number;
|
|
12
|
+
hasLeftScroll: boolean;
|
|
13
|
+
hasRightScroll: boolean;
|
|
14
|
+
visibleItems: T[];
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=compute-visible-tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-visible-tabs.d.ts","sourceRoot":"","sources":["../../../source/components/common/compute-visible-tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,KAAK,EAAE,CAAC,EAAE,EACV,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,GAChC;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,CAAC,EAAE,CAAC;CACnB,CA8CA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Greedy horizontal tab expansion: starting from the active tab, expand left
|
|
3
|
+
* and right to fit as many tabs as possible within the available terminal width.
|
|
4
|
+
*
|
|
5
|
+
* Each tab occupies `getItemWidth(item)` characters for its content, plus 3
|
|
6
|
+
* characters for a separator (" │ ") between visible tabs, except edges which
|
|
7
|
+
* use 4 characters for scroll indicators ("◀ " / " ▶").
|
|
8
|
+
*/
|
|
9
|
+
export function computeVisibleTabs(items, activeItemId, availableWidth, getItemWidth) {
|
|
10
|
+
if (items.length === 0) {
|
|
11
|
+
return { startIndex: 0, endIndex: -1, hasLeftScroll: false, hasRightScroll: false, visibleItems: [] };
|
|
12
|
+
}
|
|
13
|
+
const activeIndex = items.findIndex((item) => {
|
|
14
|
+
// Support items with an `id` property (common case) or items where the
|
|
15
|
+
// caller passes a predicate via the activeItemId comparison.
|
|
16
|
+
const candidate = item;
|
|
17
|
+
return typeof candidate.id === 'string' ? candidate.id === activeItemId : false;
|
|
18
|
+
});
|
|
19
|
+
const safeActiveIndex = activeIndex >= 0 ? activeIndex : 0;
|
|
20
|
+
let start = safeActiveIndex;
|
|
21
|
+
let end = safeActiveIndex;
|
|
22
|
+
// +4 for the possible "◀ " and " ▶" scroll indicators
|
|
23
|
+
let currentWidth = items[safeActiveIndex] ? getItemWidth(items[safeActiveIndex]) + 4 : 0;
|
|
24
|
+
while (items.length > 0) {
|
|
25
|
+
let expanded = false;
|
|
26
|
+
if (end + 1 < items.length) {
|
|
27
|
+
const rightWidth = getItemWidth(items[end + 1]) + 3; // " │ "
|
|
28
|
+
if (currentWidth + rightWidth <= availableWidth) {
|
|
29
|
+
currentWidth += rightWidth;
|
|
30
|
+
end++;
|
|
31
|
+
expanded = true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (start - 1 >= 0) {
|
|
35
|
+
const leftWidth = getItemWidth(items[start - 1]) + 3; // " │ "
|
|
36
|
+
if (currentWidth + leftWidth <= availableWidth) {
|
|
37
|
+
currentWidth += leftWidth;
|
|
38
|
+
start--;
|
|
39
|
+
expanded = true;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (!expanded)
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
startIndex: start,
|
|
47
|
+
endIndex: end,
|
|
48
|
+
hasLeftScroll: start > 0,
|
|
49
|
+
hasRightScroll: end < items.length - 1,
|
|
50
|
+
visibleItems: items.slice(start, end + 1),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=compute-visible-tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-visible-tabs.js","sourceRoot":"","sources":["../../../source/components/common/compute-visible-tabs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAU,EACV,YAAoB,EACpB,cAAsB,EACtB,YAAiC;IAQjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IACxG,CAAC;IAED,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QAC3C,uEAAuE;QACvE,6DAA6D;QAC7D,MAAM,SAAS,GAAG,IAA+B,CAAC;QAClD,OAAO,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;IAClF,CAAC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3D,IAAI,KAAK,GAAG,eAAe,CAAC;IAC5B,IAAI,GAAG,GAAG,eAAe,CAAC;IAC1B,sDAAsD;IACtD,IAAI,YAAY,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,eAAe,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1F,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ;YAC9D,IAAI,YAAY,GAAG,UAAU,IAAI,cAAc,EAAE,CAAC;gBAChD,YAAY,IAAI,UAAU,CAAC;gBAC3B,GAAG,EAAE,CAAC;gBACN,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ;YAC/D,IAAI,YAAY,GAAG,SAAS,IAAI,cAAc,EAAE,CAAC;gBAC/C,YAAY,IAAI,SAAS,CAAC;gBAC1B,KAAK,EAAE,CAAC;gBACR,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ;YAAE,MAAM;IACvB,CAAC;IAED,OAAO;QACL,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,GAAG;QACb,aAAa,EAAE,KAAK,GAAG,CAAC;QACxB,cAAc,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QACtC,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC;KAC1C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-visible-tabs.test.d.ts","sourceRoot":"","sources":["../../../source/components/common/compute-visible-tabs.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { it, expect } from 'vitest';
|
|
2
|
+
import { computeVisibleTabs } from './compute-visible-tabs.js';
|
|
3
|
+
// Helpers
|
|
4
|
+
const tab = (id, labelLen) => ({ id, width: labelLen });
|
|
5
|
+
const tabList = (specs) => specs.map(([id, w]) => tab(id, w));
|
|
6
|
+
const width = (item) => item.width;
|
|
7
|
+
it('returns empty result for empty items', () => {
|
|
8
|
+
const result = computeVisibleTabs([], 'a', 80, width);
|
|
9
|
+
expect(result.visibleItems.length).toBe(0);
|
|
10
|
+
expect(result.startIndex).toBe(0);
|
|
11
|
+
expect(result.endIndex).toBe(-1);
|
|
12
|
+
expect(result.hasLeftScroll).toBe(false);
|
|
13
|
+
expect(result.hasRightScroll).toBe(false);
|
|
14
|
+
});
|
|
15
|
+
it('shows all items when they fit', () => {
|
|
16
|
+
const items = tabList([
|
|
17
|
+
['a', 5],
|
|
18
|
+
['b', 5],
|
|
19
|
+
['c', 5],
|
|
20
|
+
]);
|
|
21
|
+
// 3 items × ~8 chars each (width + separator) ≈ 24 chars, well under 80
|
|
22
|
+
const result = computeVisibleTabs(items, 'b', 80, width);
|
|
23
|
+
expect(result.visibleItems).toEqual(items);
|
|
24
|
+
expect(result.hasLeftScroll).toBe(false);
|
|
25
|
+
expect(result.hasRightScroll).toBe(false);
|
|
26
|
+
expect(result.startIndex).toBe(0);
|
|
27
|
+
expect(result.endIndex).toBe(2);
|
|
28
|
+
});
|
|
29
|
+
it('centers on active item when not all fit', () => {
|
|
30
|
+
// 10 items × 10 width each ≈ 10+3 = 13 chars per tab after first
|
|
31
|
+
// First tab: width + 4 = 14 chars
|
|
32
|
+
// With 60 chars available, can fit roughly 4-5 items
|
|
33
|
+
const items = tabList([
|
|
34
|
+
['a', 10],
|
|
35
|
+
['b', 10],
|
|
36
|
+
['c', 10],
|
|
37
|
+
['d', 10],
|
|
38
|
+
['e', 10],
|
|
39
|
+
['f', 10],
|
|
40
|
+
['g', 10],
|
|
41
|
+
['h', 10],
|
|
42
|
+
['i', 10],
|
|
43
|
+
['j', 10],
|
|
44
|
+
]);
|
|
45
|
+
const result = computeVisibleTabs(items, 'd', 60, width);
|
|
46
|
+
// Active item 'd' (index 3) should be included
|
|
47
|
+
expect(result.visibleItems.some((item) => item.id === 'd')).toBe(true);
|
|
48
|
+
expect(result.hasLeftScroll).toBe(true);
|
|
49
|
+
expect(result.hasRightScroll).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
it('defaults to first item when activeItemId is not found', () => {
|
|
52
|
+
const items = tabList([
|
|
53
|
+
['a', 5],
|
|
54
|
+
['b', 5],
|
|
55
|
+
]);
|
|
56
|
+
const result = computeVisibleTabs(items, 'z', 80, width);
|
|
57
|
+
expect(result.startIndex).toBe(0);
|
|
58
|
+
expect(result.visibleItems[0].id).toBe('a');
|
|
59
|
+
});
|
|
60
|
+
it('sets hasLeftScroll when tabs before the visible window exist', () => {
|
|
61
|
+
const items = tabList([
|
|
62
|
+
['a', 20],
|
|
63
|
+
['b', 20],
|
|
64
|
+
['c', 20],
|
|
65
|
+
['d', 20],
|
|
66
|
+
['e', 20],
|
|
67
|
+
]);
|
|
68
|
+
// Available width 50: active item 'd' (width 20) + 4 = 24. Can maybe fit one more (20+3=23 > 50-24=26)
|
|
69
|
+
// Actually let's check: start=d(3), try right=e(4): 24+23=47<=50 → yes. Try left=c(2): 47+23=70>50 → no
|
|
70
|
+
// So visible = [d, e] with hasLeftScroll=true
|
|
71
|
+
const result = computeVisibleTabs(items, 'd', 50, width);
|
|
72
|
+
expect(result.hasLeftScroll).toBe(true);
|
|
73
|
+
expect(result.startIndex).not.toBe(0);
|
|
74
|
+
});
|
|
75
|
+
it('sets hasRightScroll when tabs after the visible window exist', () => {
|
|
76
|
+
const items = tabList([
|
|
77
|
+
['a', 20],
|
|
78
|
+
['b', 20],
|
|
79
|
+
['c', 20],
|
|
80
|
+
['d', 20],
|
|
81
|
+
['e', 20],
|
|
82
|
+
]);
|
|
83
|
+
// Available width 50: active item 'b' (width 20) + 4 = 24. Try right 'c': 24+23=47<=50 → yes. Try left 'a': 47+23=70>50 → no.
|
|
84
|
+
// Visible = [b, c], hasRightScroll = true
|
|
85
|
+
const result = computeVisibleTabs(items, 'b', 50, width);
|
|
86
|
+
expect(result.hasRightScroll).toBe(true);
|
|
87
|
+
});
|
|
88
|
+
it('does not set scroll indicators when all items are visible', () => {
|
|
89
|
+
const items = tabList([
|
|
90
|
+
['a', 5],
|
|
91
|
+
['b', 5],
|
|
92
|
+
]);
|
|
93
|
+
const result = computeVisibleTabs(items, 'a', 80, width);
|
|
94
|
+
expect(result.hasLeftScroll).toBe(false);
|
|
95
|
+
expect(result.hasRightScroll).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=compute-visible-tabs.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-visible-tabs.test.js","sourceRoot":"","sources":["../../../source/components/common/compute-visible-tabs.test.ts"],"names":[],"mappings":"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"}
|