@kabmo-labs/kabmo 0.0.0-stage → 0.1.0
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 +506 -2
- package/bunfig.toml +11 -0
- package/dist/client/index.html +85 -0
- package/dist/client/index.js +1644 -0
- package/dist/client/static/apple-touch-icon-bbhgf3mq.png +0 -0
- package/dist/client/static/icon-192x192-kz5bvz85.png +0 -0
- package/dist/client/static/icon-8h6v1jcy.svg +12 -0
- package/dist/client/static/js/index-enkbbffs.js +5233 -0
- package/dist/client/static/js/index-yn17t04b.css +1 -0
- package/dist/client/static/manifest-42r8wcmg.webmanifest +91 -0
- package/extensions/kabmo-modes/commands.test.ts +209 -0
- package/extensions/kabmo-modes/commands.ts +247 -0
- package/extensions/kabmo-modes/goal.test.ts +239 -0
- package/extensions/kabmo-modes/goal.ts +335 -0
- package/extensions/kabmo-modes/index.ts +272 -0
- package/extensions/kabmo-modes/omp-modules.d.ts +27 -0
- package/extensions/kabmo-modes/parked.test.ts +112 -0
- package/extensions/kabmo-modes/parked.ts +161 -0
- package/extensions/kabmo-modes/plan.test.ts +283 -0
- package/extensions/kabmo-modes/plan.ts +292 -0
- package/extensions/kabmo-modes/prompts.test.ts +70 -0
- package/extensions/kabmo-modes/prompts.ts +167 -0
- package/extensions/kabmo-modes/protocol.test.ts +57 -0
- package/extensions/kabmo-modes/protocol.ts +97 -0
- package/extensions/kabmo-modes/registration.test.ts +26 -0
- package/extensions/kabmo-modes/session.ts +199 -0
- package/index.html +85 -0
- package/marketplace/marketplace.json +25 -0
- package/marketplace/plugins/command-runner/README.md +223 -0
- package/marketplace/plugins/command-runner/icon.svg +18 -0
- package/marketplace/plugins/command-runner/package.json +41 -0
- package/marketplace/plugins/command-runner/src/app.tsx +281 -0
- package/marketplace/plugins/command-runner/src/panel/Custom.test.tsx +324 -0
- package/marketplace/plugins/command-runner/src/panel/CustomForm.tsx +236 -0
- package/marketplace/plugins/command-runner/src/panel/Glyph.tsx +60 -0
- package/marketplace/plugins/command-runner/src/panel/Groups.test.tsx +316 -0
- package/marketplace/plugins/command-runner/src/panel/Groups.tsx +311 -0
- package/marketplace/plugins/command-runner/src/panel/Header.tsx +76 -0
- package/marketplace/plugins/command-runner/src/panel/Output.tsx +109 -0
- package/marketplace/plugins/command-runner/src/panel/Row.test.tsx +278 -0
- package/marketplace/plugins/command-runner/src/panel/Row.tsx +265 -0
- package/marketplace/plugins/command-runner/src/panel/format.ts +29 -0
- package/marketplace/plugins/command-runner/src/panel/index.tsx +165 -0
- package/marketplace/plugins/command-runner/src/panel/use-custom-dialog.ts +147 -0
- package/marketplace/plugins/command-runner/src/protocol.ts +242 -0
- package/marketplace/plugins/command-runner/src/server/custom.test.ts +223 -0
- package/marketplace/plugins/command-runner/src/server/custom.ts +260 -0
- package/marketplace/plugins/command-runner/src/server/detectors/detectors.test.ts +267 -0
- package/marketplace/plugins/command-runner/src/server/detectors/js.ts +38 -0
- package/marketplace/plugins/command-runner/src/server/detectors/jsonc.ts +78 -0
- package/marketplace/plugins/command-runner/src/server/detectors/make.ts +82 -0
- package/marketplace/plugins/command-runner/src/server/detectors/native.ts +153 -0
- package/marketplace/plugins/command-runner/src/server/detectors/python.ts +124 -0
- package/marketplace/plugins/command-runner/src/server/detectors/table.ts +62 -0
- package/marketplace/plugins/command-runner/src/server/detectors/types.ts +147 -0
- package/marketplace/plugins/command-runner/src/server/discovery.test.ts +344 -0
- package/marketplace/plugins/command-runner/src/server/kill.ts +23 -0
- package/marketplace/plugins/command-runner/src/server/package-manager.ts +80 -0
- package/marketplace/plugins/command-runner/src/server/resolve.test.ts +215 -0
- package/marketplace/plugins/command-runner/src/server/resolve.ts +165 -0
- package/marketplace/plugins/command-runner/src/server/ring.ts +74 -0
- package/marketplace/plugins/command-runner/src/server/run-store.ts +226 -0
- package/marketplace/plugins/command-runner/src/server/run-types.ts +57 -0
- package/marketplace/plugins/command-runner/src/server/runner.test.ts +335 -0
- package/marketplace/plugins/command-runner/src/server/runner.ts +179 -0
- package/marketplace/plugins/command-runner/src/server/scan.ts +300 -0
- package/marketplace/plugins/command-runner/src/server/sweeps.test.ts +137 -0
- package/marketplace/plugins/command-runner/src/server.ts +325 -0
- package/marketplace/plugins/command-runner/src/watch.test.ts +235 -0
- package/marketplace/plugins/command-runner/src/watch.ts +97 -0
- package/marketplace/plugins/command-runner/tsconfig.json +16 -0
- package/marketplace/plugins/session-info/README.md +23 -0
- package/marketplace/plugins/session-info/icon.svg +14 -0
- package/marketplace/plugins/session-info/package.json +41 -0
- package/marketplace/plugins/session-info/src/app.test.tsx +172 -0
- package/marketplace/plugins/session-info/src/app.tsx +174 -0
- package/marketplace/plugins/session-info/src/server.ts +118 -0
- package/marketplace/plugins/session-info/src/styles.css +48 -0
- package/marketplace/plugins/session-info/tsconfig.json +22 -0
- package/marketplace/plugins/stats/README.md +99 -0
- package/marketplace/plugins/stats/icon.svg +16 -0
- package/marketplace/plugins/stats/package.json +46 -0
- package/marketplace/plugins/stats/src/ProcessTable.tsx +237 -0
- package/marketplace/plugins/stats/src/RefreshButton.tsx +56 -0
- package/marketplace/plugins/stats/src/Sparkline.tsx +80 -0
- package/marketplace/plugins/stats/src/TotalsBar.test.tsx +139 -0
- package/marketplace/plugins/stats/src/TotalsBar.tsx +96 -0
- package/marketplace/plugins/stats/src/app.test.tsx +228 -0
- package/marketplace/plugins/stats/src/app.tsx +183 -0
- package/marketplace/plugins/stats/src/daemons.ts +157 -0
- package/marketplace/plugins/stats/src/format.test.ts +125 -0
- package/marketplace/plugins/stats/src/format.ts +53 -0
- package/marketplace/plugins/stats/src/groups.test.ts +153 -0
- package/marketplace/plugins/stats/src/groups.ts +204 -0
- package/marketplace/plugins/stats/src/labels.test.ts +188 -0
- package/marketplace/plugins/stats/src/labels.ts +219 -0
- package/marketplace/plugins/stats/src/proc/darwin.ts +268 -0
- package/marketplace/plugins/stats/src/proc/identity.ts +179 -0
- package/marketplace/plugins/stats/src/proc/index.ts +45 -0
- package/marketplace/plugins/stats/src/proc/linux.ts +186 -0
- package/marketplace/plugins/stats/src/proc/ps.ts +121 -0
- package/marketplace/plugins/stats/src/proc/types.ts +78 -0
- package/marketplace/plugins/stats/src/sampler.test.ts +200 -0
- package/marketplace/plugins/stats/src/sampler.ts +281 -0
- package/marketplace/plugins/stats/src/server.ts +252 -0
- package/marketplace/plugins/stats/src/sessions.test.ts +112 -0
- package/marketplace/plugins/stats/src/sessions.ts +189 -0
- package/marketplace/plugins/stats/src/snapshot.ts +121 -0
- package/marketplace/plugins/stats/tsconfig.json +16 -0
- package/package.json +104 -4
- package/public/apple-touch-icon.png +0 -0
- package/public/icon-192x192.png +0 -0
- package/public/icon-512x512.png +0 -0
- package/public/icon-maskable-512x512.png +0 -0
- package/public/icon.svg +12 -0
- package/public/kabmo-wordmark.svg +31 -0
- package/public/manifest.webmanifest +91 -0
- package/public/sw.js +76 -0
- package/src/cli/kabmo.js +5 -0
- package/src/cli/lib/args.js +283 -0
- package/src/cli/lib/args.test.js +76 -0
- package/src/cli/lib/build.js +52 -0
- package/src/cli/lib/commands/logs.js +150 -0
- package/src/cli/lib/commands/plugin.js +285 -0
- package/src/cli/lib/commands/plugin.test.js +125 -0
- package/src/cli/lib/commands/restart.js +94 -0
- package/src/cli/lib/commands/serve.js +278 -0
- package/src/cli/lib/commands/serve.test.js +58 -0
- package/src/cli/lib/commands/status.js +130 -0
- package/src/cli/lib/commands/stop.js +95 -0
- package/src/cli/lib/commands/update.js +147 -0
- package/src/cli/lib/commands/update.test.js +36 -0
- package/src/cli/lib/output.js +143 -0
- package/src/cli/lib/path-utils.js +99 -0
- package/src/cli/lib/path-utils.test.js +184 -0
- package/src/cli/lib/paths.js +40 -0
- package/src/cli/lib/process-lifecycle.js +148 -0
- package/src/cli/lib/process-lifecycle.test.js +156 -0
- package/src/cli/lib/restart-scope.js +93 -0
- package/src/cli/lib/restart-scope.test.js +119 -0
- package/src/cli/lib/runtime.js +279 -0
- package/src/cli/lib/serve-mode.js +20 -0
- package/src/cli/lib/serve-mode.test.js +29 -0
- package/src/cli/lib/stop-instance.js +120 -0
- package/src/cli/lib/stop-instance.test.js +206 -0
- package/src/cli/lib/stop-scope.js +23 -0
- package/src/cli/lib/stop-scope.test.js +41 -0
- package/src/cli/lib/ui-password.js +190 -0
- package/src/cli/main.js +81 -0
- package/src/client/App.tsx +140 -0
- package/src/client/bootstrap.d.ts +33 -0
- package/src/client/components/auth/login-screen/index.test.tsx +93 -0
- package/src/client/components/auth/login-screen/index.tsx +154 -0
- package/src/client/components/auth/login-screen/password-toggle.test.tsx +121 -0
- package/src/client/components/common/ComposerPicker.tsx +141 -0
- package/src/client/components/common/ComposerTextarea.tsx +178 -0
- package/src/client/components/common/CopyButton.tsx +97 -0
- package/src/client/components/common/FolderPicker.tsx +254 -0
- package/src/client/components/common/MarkdownRenderer.tsx +299 -0
- package/src/client/components/common/Modal.tsx +93 -0
- package/src/client/components/common/PWAInstallButton.tsx +113 -0
- package/src/client/components/common/ReloadPageButton.test.tsx +78 -0
- package/src/client/components/common/ReloadPageButton.tsx +30 -0
- package/src/client/components/common/SignOutButton.test.tsx +141 -0
- package/src/client/components/common/SignOutButton.tsx +94 -0
- package/src/client/components/common/StatCard.tsx +52 -0
- package/src/client/components/common/StreamStatusDot.tsx +27 -0
- package/src/client/components/common/SubagentStatusIcon.tsx +27 -0
- package/src/client/components/common/Toast.tsx +79 -0
- package/src/client/components/common/ToastStack.tsx +18 -0
- package/src/client/components/common/UpdateLog.tsx +55 -0
- package/src/client/components/common/ViewportSelector.tsx +206 -0
- package/src/client/components/common/batch-selection/BatchActionBar.test.ts +132 -0
- package/src/client/components/common/batch-selection/BatchActionBar.tsx +118 -0
- package/src/client/components/common/batch-selection/BatchDeleteModal.tsx +177 -0
- package/src/client/components/common/batch-selection/SelectionCheckbox.tsx +58 -0
- package/src/client/components/common/batch-selection/folder-state.test.ts +130 -0
- package/src/client/components/common/batch-selection/folder-state.ts +101 -0
- package/src/client/components/common/batch-selection/types.ts +42 -0
- package/src/client/components/common/brand-wordmark/Mark.tsx +62 -0
- package/src/client/components/common/brand-wordmark/index.test.tsx +115 -0
- package/src/client/components/common/brand-wordmark/index.tsx +57 -0
- package/src/client/components/common/brand-wordmark/wordmark-svg.test.ts +88 -0
- package/src/client/components/common/code-editor/handler.test.ts +274 -0
- package/src/client/components/common/code-editor/handler.ts +175 -0
- package/src/client/components/common/code-editor/index.tsx +314 -0
- package/src/client/components/common/code-surface/index.tsx +348 -0
- package/src/client/components/common/code-surface/measure.ts +148 -0
- package/src/client/components/common/context-usage-button/Ring.tsx +73 -0
- package/src/client/components/common/context-usage-button/index.test.tsx +197 -0
- package/src/client/components/common/context-usage-button/index.tsx +159 -0
- package/src/client/components/common/diagram-viewer/index.tsx +258 -0
- package/src/client/components/common/diagram-viewer/read-block.ts +53 -0
- package/src/client/components/common/file-icon/brand-paths.ts +62 -0
- package/src/client/components/common/file-icon/index.tsx +166 -0
- package/src/client/components/common/header-controls/index.test.tsx +240 -0
- package/src/client/components/common/header-controls/index.tsx +118 -0
- package/src/client/components/common/header-panel-buttons/index.tsx +176 -0
- package/src/client/components/common/image-viewer/index.tsx +224 -0
- package/src/client/components/common/outline-kind-icon/index.tsx +86 -0
- package/src/client/components/common/provider-icon/glyphs.test.ts +94 -0
- package/src/client/components/common/provider-icon/glyphs.ts +118 -0
- package/src/client/components/common/provider-icon/index.plugin.test.ts +133 -0
- package/src/client/components/common/provider-icon/index.test.ts +107 -0
- package/src/client/components/common/provider-icon/index.tsx +104 -0
- package/src/client/components/common/provider-icon/resolve.test.ts +112 -0
- package/src/client/components/common/provider-icon/resolve.ts +94 -0
- package/src/client/components/common/session-actions-menu/index.tsx +220 -0
- package/src/client/components/common/session-delete-modal/index.tsx +128 -0
- package/src/client/components/common/session-state-provider/index.test.ts +142 -0
- package/src/client/components/common/session-state-provider/index.tsx +60 -0
- package/src/client/components/common/sort-menu/index.tsx +63 -0
- package/src/client/components/common/sort-menu/options.ts +24 -0
- package/src/client/components/common/subagent-list/index.tsx +165 -0
- package/src/client/components/common/todo-row/index.test.ts +91 -0
- package/src/client/components/common/todo-row/index.tsx +92 -0
- package/src/client/components/common/viewport.ts +23 -0
- package/src/client/components/common/workspace-options-menu/index.tsx +113 -0
- package/src/client/components/layout/PanelVisibilityMenu.tsx +114 -0
- package/src/client/components/layout/RightActivityBar.test.ts +272 -0
- package/src/client/components/layout/RightActivityBar.tsx +220 -0
- package/src/client/components/layout/desktop-layout/ResizeHandle.tsx +10 -0
- package/src/client/components/layout/desktop-layout/TopNavbar.tsx +167 -0
- package/src/client/components/layout/desktop-layout/WorkspacePanels.tsx +326 -0
- package/src/client/components/layout/desktop-layout/index.tsx +307 -0
- package/src/client/components/layout/desktop-layout/resizer/index.tsx +312 -0
- package/src/client/components/layout/desktop-layout/resizer/panel.test.ts +145 -0
- package/src/client/components/layout/desktop-layout/resizer/separator-drag.ts +140 -0
- package/src/client/components/layout/desktop-layout/resizer/utils.test.ts +33 -0
- package/src/client/components/layout/desktop-layout/resizer/utils.ts +34 -0
- package/src/client/components/layout/session-sidebar/CategoryHeader.tsx +169 -0
- package/src/client/components/layout/session-sidebar/CategoryItem.tsx +297 -0
- package/src/client/components/layout/session-sidebar/Footer.tsx +54 -0
- package/src/client/components/layout/session-sidebar/Header.test.ts +88 -0
- package/src/client/components/layout/session-sidebar/Header.tsx +57 -0
- package/src/client/components/layout/session-sidebar/Modals.tsx +15 -0
- package/src/client/components/layout/session-sidebar/OverflowMenu.test.ts +115 -0
- package/src/client/components/layout/session-sidebar/OverflowMenu.tsx +117 -0
- package/src/client/components/layout/session-sidebar/SessionItem.batch.test.ts +162 -0
- package/src/client/components/layout/session-sidebar/SessionItem.test.ts +106 -0
- package/src/client/components/layout/session-sidebar/SessionItem.tsx +242 -0
- package/src/client/components/layout/session-sidebar/SessionList.tsx +60 -0
- package/src/client/components/layout/session-sidebar/Skeleton.tsx +36 -0
- package/src/client/components/layout/session-sidebar/Toolbar.test.ts +134 -0
- package/src/client/components/layout/session-sidebar/Toolbar.tsx +300 -0
- package/src/client/components/layout/session-sidebar/about-modal/SocialLinks.tsx +59 -0
- package/src/client/components/layout/session-sidebar/about-modal/UpdateSection.tsx +179 -0
- package/src/client/components/layout/session-sidebar/about-modal/index.tsx +83 -0
- package/src/client/components/layout/session-sidebar/index.tsx +283 -0
- package/src/client/components/layout/session-sidebar/new-workspace-modal/CloneField.tsx +83 -0
- package/src/client/components/layout/session-sidebar/new-workspace-modal/DirectoryList.tsx +150 -0
- package/src/client/components/layout/session-sidebar/new-workspace-modal/LocationBar.tsx +101 -0
- package/src/client/components/layout/session-sidebar/new-workspace-modal/index.tsx +304 -0
- package/src/client/components/layout/session-sidebar/new-workspace-modal/use-browse.ts +81 -0
- package/src/client/components/layout/session-sidebar/scheduler-modal/TaskForm.tsx +216 -0
- package/src/client/components/layout/session-sidebar/scheduler-modal/TaskList.tsx +217 -0
- package/src/client/components/layout/session-sidebar/scheduler-modal/folders.ts +52 -0
- package/src/client/components/layout/session-sidebar/scheduler-modal/index.tsx +211 -0
- package/src/client/components/layout/update-popup/Actions.tsx +114 -0
- package/src/client/components/layout/update-popup/ReleaseNotes.tsx +77 -0
- package/src/client/components/layout/update-popup/index.tsx +131 -0
- package/src/client/components/mobile/LayoutWrapper.tsx +269 -0
- package/src/client/components/mobile/MainView.tsx +68 -0
- package/src/client/components/mobile/RightSidebar.tsx +154 -0
- package/src/client/components/mobile/SessionSidebar.tsx +301 -0
- package/src/client/components/mobile/mobile-main-view/Header.tsx +211 -0
- package/src/client/components/mobile/mobile-right-sidebar/FullDiff.tsx +84 -0
- package/src/client/components/mobile/mobile-right-sidebar/FullEditor.tsx +317 -0
- package/src/client/components/mobile/mobile-right-sidebar/Header.tsx +156 -0
- package/src/client/components/mobile/mobile-right-sidebar/OutlineButton.tsx +100 -0
- package/src/client/components/mobile/mobile-right-sidebar/StatusBar.tsx +90 -0
- package/src/client/components/mobile/mobile-session-sidebar/Footer.tsx +69 -0
- package/src/client/components/mobile/mobile-session-sidebar/Header.tsx +34 -0
- package/src/client/components/mobile/mobile-session-sidebar/Item.tsx +334 -0
- package/src/client/components/mobile/mobile-session-sidebar/List.tsx +63 -0
- package/src/client/components/mobile/mobile-session-sidebar/SessionRow.test.ts +122 -0
- package/src/client/components/mobile/mobile-session-sidebar/SessionRow.tsx +202 -0
- package/src/client/components/mobile/mobile-session-sidebar/Skeleton.tsx +36 -0
- package/src/client/components/mobile/mobile-session-sidebar/Toolbar.test.ts +135 -0
- package/src/client/components/mobile/mobile-session-sidebar/Toolbar.tsx +248 -0
- package/src/client/components/mobile/open-file-payload.test.ts +71 -0
- package/src/client/components/mobile/open-file-payload.ts +60 -0
- package/src/client/components/settings/LazyModal.tsx +46 -0
- package/src/client/components/settings/LoadingState.tsx +22 -0
- package/src/client/components/settings/Modal.tsx +342 -0
- package/src/client/components/settings/ProjectSelectorDropdown.tsx +148 -0
- package/src/client/components/settings/SettingsSidebarList.tsx +126 -0
- package/src/client/components/settings/Sidebar.test.tsx +118 -0
- package/src/client/components/settings/Sidebar.tsx +172 -0
- package/src/client/components/settings/categories/AgentSettings.tsx +101 -0
- package/src/client/components/settings/categories/AppearanceSettings.tsx +30 -0
- package/src/client/components/settings/categories/BehaviorSettings.tsx +73 -0
- package/src/client/components/settings/categories/ChatSettings.tsx +30 -0
- package/src/client/components/settings/categories/CommandSettings.tsx +136 -0
- package/src/client/components/settings/categories/McpSettings.tsx +159 -0
- package/src/client/components/settings/categories/NotificationSettings.tsx +97 -0
- package/src/client/components/settings/categories/OmpSettings.tsx +321 -0
- package/src/client/components/settings/categories/OtherSettings.tsx +16 -0
- package/src/client/components/settings/categories/PanelPluginSettings.tsx +25 -0
- package/src/client/components/settings/categories/PluginSettings.tsx +162 -0
- package/src/client/components/settings/categories/ProjectSettings.tsx +195 -0
- package/src/client/components/settings/categories/ProviderSettings.tsx +225 -0
- package/src/client/components/settings/categories/SkillCatalogSettings.tsx +289 -0
- package/src/client/components/settings/categories/SkillSettings.tsx +130 -0
- package/src/client/components/settings/categories/TokenUsageSettings.tsx +264 -0
- package/src/client/components/settings/categories/UsageSettings.tsx +109 -0
- package/src/client/components/settings/categories/agent-settings/DetailPane.tsx +333 -0
- package/src/client/components/settings/categories/agent-settings/SidebarList.tsx +42 -0
- package/src/client/components/settings/categories/appearance-settings/EditorFontSection.tsx +78 -0
- package/src/client/components/settings/categories/appearance-settings/ThemeCard.tsx +61 -0
- package/src/client/components/settings/categories/appearance-settings/ThemeGrid.tsx +80 -0
- package/src/client/components/settings/categories/behavior-settings/Editor.tsx +244 -0
- package/src/client/components/settings/categories/chat-settings/FollowUpSection.tsx +120 -0
- package/src/client/components/settings/categories/chat-settings/GoalSection.tsx +195 -0
- package/src/client/components/settings/categories/chat-settings/KeybindingsSection.tsx +107 -0
- package/src/client/components/settings/categories/chat-settings/TitleSection.tsx +99 -0
- package/src/client/components/settings/categories/command-settings/DetailPane.tsx +298 -0
- package/src/client/components/settings/categories/command-settings/SidebarList.tsx +44 -0
- package/src/client/components/settings/categories/mcp-settings/ConnectionTest.tsx +89 -0
- package/src/client/components/settings/categories/mcp-settings/DetailPane.tsx +311 -0
- package/src/client/components/settings/categories/mcp-settings/ImportModal.tsx +161 -0
- package/src/client/components/settings/categories/mcp-settings/SidebarList.tsx +120 -0
- package/src/client/components/settings/categories/omp-settings/ConfigTabs.tsx +254 -0
- package/src/client/components/settings/categories/omp-settings/ExtensionsPanel.tsx +61 -0
- package/src/client/components/settings/categories/omp-settings/RoleEditor.test.ts +94 -0
- package/src/client/components/settings/categories/omp-settings/RoleEditor.tsx +148 -0
- package/src/client/components/settings/categories/omp-settings/RowEditor.tsx +337 -0
- package/src/client/components/settings/categories/panel-plugins/AvailableList.tsx +108 -0
- package/src/client/components/settings/categories/panel-plugins/BuiltinList.tsx +95 -0
- package/src/client/components/settings/categories/panel-plugins/GitFreshness.test.tsx +232 -0
- package/src/client/components/settings/categories/panel-plugins/GitFreshness.tsx +81 -0
- package/src/client/components/settings/categories/panel-plugins/InstallForm.tsx +136 -0
- package/src/client/components/settings/categories/panel-plugins/InstalledList.tsx +221 -0
- package/src/client/components/settings/categories/panel-plugins/PluginMark.test.ts +142 -0
- package/src/client/components/settings/categories/panel-plugins/PluginMark.tsx +114 -0
- package/src/client/components/settings/categories/panel-plugins/ReadmeModal.tsx +87 -0
- package/src/client/components/settings/categories/panel-plugins/Section.tsx +184 -0
- package/src/client/components/settings/categories/panel-plugins/SyncBlockedNotice.tsx +82 -0
- package/src/client/components/settings/categories/panel-plugins/Toolbar.tsx +85 -0
- package/src/client/components/settings/categories/plugin-settings/DetailPane.tsx +285 -0
- package/src/client/components/settings/categories/plugin-settings/MarketplacePane.tsx +303 -0
- package/src/client/components/settings/categories/plugin-settings/SettingsSection.tsx +209 -0
- package/src/client/components/settings/categories/plugin-settings/SidebarList.tsx +250 -0
- package/src/client/components/settings/categories/plugin-settings/selection.ts +19 -0
- package/src/client/components/settings/categories/project-settings/AccentPalette.tsx +76 -0
- package/src/client/components/settings/categories/project-settings/DetailsForm.tsx +71 -0
- package/src/client/components/settings/categories/project-settings/DetailsHeader.tsx +38 -0
- package/src/client/components/settings/categories/project-settings/IconGrid.tsx +152 -0
- package/src/client/components/settings/categories/project-settings/ModelDropdown.tsx +95 -0
- package/src/client/components/settings/categories/project-settings/NameInput.tsx +26 -0
- package/src/client/components/settings/categories/project-settings/SidebarList.tsx +100 -0
- package/src/client/components/settings/categories/provider-settings/AddModelModal.tsx +322 -0
- package/src/client/components/settings/categories/provider-settings/AddProviderModal.tsx +334 -0
- package/src/client/components/settings/categories/provider-settings/AuthSection.tsx +195 -0
- package/src/client/components/settings/categories/provider-settings/DeleteProviderModal.tsx +133 -0
- package/src/client/components/settings/categories/provider-settings/DialectFields.tsx +136 -0
- package/src/client/components/settings/categories/provider-settings/EffortLadder.tsx +89 -0
- package/src/client/components/settings/categories/provider-settings/Header.tsx +22 -0
- package/src/client/components/settings/categories/provider-settings/LoginModal.tsx +224 -0
- package/src/client/components/settings/categories/provider-settings/LogoutProviderModal.tsx +184 -0
- package/src/client/components/settings/categories/provider-settings/ModelCapabilitiesModal.tsx +114 -0
- package/src/client/components/settings/categories/provider-settings/ModelConfigModal.tsx +155 -0
- package/src/client/components/settings/categories/provider-settings/ModelsList.tsx +221 -0
- package/src/client/components/settings/categories/provider-settings/PresetPicker.tsx +82 -0
- package/src/client/components/settings/categories/provider-settings/PriceFields.tsx +107 -0
- package/src/client/components/settings/categories/provider-settings/ReconnectModal.tsx +184 -0
- package/src/client/components/settings/categories/provider-settings/SidebarList.plugin.test.ts +93 -0
- package/src/client/components/settings/categories/provider-settings/SidebarList.tsx +133 -0
- package/src/client/components/settings/categories/skill-catalog/AddSourceModal.tsx +133 -0
- package/src/client/components/settings/categories/skill-settings/DetailPane.tsx +309 -0
- package/src/client/components/settings/categories/skill-settings/SidebarList.tsx +170 -0
- package/src/client/components/settings/categories/token-usage-settings/Breakdown.tsx +127 -0
- package/src/client/components/settings/categories/token-usage-settings/Chart.tsx +74 -0
- package/src/client/components/settings/categories/token-usage-settings/MetricsGrid.tsx +44 -0
- package/src/client/components/settings/categories/usage-settings/DeepSeekCard.tsx +66 -0
- package/src/client/components/settings/categories/usage-settings/KenariCard.tsx +68 -0
- package/src/client/components/settings/categories/usage-settings/LimitsSection.tsx +115 -0
- package/src/client/components/settings/categories/usage-settings/ProviderCard.tsx +45 -0
- package/src/client/components/settings/categories/usage-settings/ProviderDetail.tsx +46 -0
- package/src/client/components/settings/categories/usage-settings/QuotaSection.tsx +93 -0
- package/src/client/components/settings/categories/usage-settings/SavedResetsSection.tsx +158 -0
- package/src/client/components/settings/categories/usage-settings/SidebarList.tsx +89 -0
- package/src/client/components/settings/categories/usage-settings/UsageTable.tsx +66 -0
- package/src/client/components/settings/categories/usage-settings/format.ts +99 -0
- package/src/client/components/settings/categories/usage-settings/providers.ts +69 -0
- package/src/client/components/settings/categories/usage-settings/usage-and-picker.test.ts +330 -0
- package/src/client/components/settings/master-detail/index.tsx +68 -0
- package/src/client/components/workspace/browser-panel/ActivityToasts.tsx +46 -0
- package/src/client/components/workspace/browser-panel/AddressBar.tsx +75 -0
- package/src/client/components/workspace/browser-panel/Screencast.tsx +108 -0
- package/src/client/components/workspace/browser-panel/index.tsx +69 -0
- package/src/client/components/workspace/browser-toolbar/ZoomControls.tsx +48 -0
- package/src/client/components/workspace/browser-toolbar/index.tsx +150 -0
- package/src/client/components/workspace/btw-panel/AskCard.tsx +165 -0
- package/src/client/components/workspace/btw-panel/Messages.tsx +154 -0
- package/src/client/components/workspace/btw-panel/TopicMenu.tsx +106 -0
- package/src/client/components/workspace/btw-panel/index.tsx +163 -0
- package/src/client/components/workspace/chat-timeline/AiMessageFooter.plugin.test.ts +105 -0
- package/src/client/components/workspace/chat-timeline/AiMessageFooter.tsx +277 -0
- package/src/client/components/workspace/chat-timeline/AttachmentChips.tsx +119 -0
- package/src/client/components/workspace/chat-timeline/ChatOverlays.tsx +108 -0
- package/src/client/components/workspace/chat-timeline/ComposerDock.tsx +167 -0
- package/src/client/components/workspace/chat-timeline/EmptyWorkspacePrompt.tsx +261 -0
- package/src/client/components/workspace/chat-timeline/GeneratingIndicator.test.ts +156 -0
- package/src/client/components/workspace/chat-timeline/GeneratingIndicator.tsx +156 -0
- package/src/client/components/workspace/chat-timeline/GoalNotice.tsx +63 -0
- package/src/client/components/workspace/chat-timeline/MessageItem.tsx +289 -0
- package/src/client/components/workspace/chat-timeline/MessageList.test.ts +76 -0
- package/src/client/components/workspace/chat-timeline/MessageList.tsx +117 -0
- package/src/client/components/workspace/chat-timeline/MinimapShortcuts.test.ts +119 -0
- package/src/client/components/workspace/chat-timeline/MinimapShortcuts.tsx +96 -0
- package/src/client/components/workspace/chat-timeline/MobileTurnJump.tsx +104 -0
- package/src/client/components/workspace/chat-timeline/NewChatModal.tsx +124 -0
- package/src/client/components/workspace/chat-timeline/PluginMessageActions.test.ts +102 -0
- package/src/client/components/workspace/chat-timeline/PluginMessageActions.tsx +51 -0
- package/src/client/components/workspace/chat-timeline/QueueList.test.ts +82 -0
- package/src/client/components/workspace/chat-timeline/QueueList.tsx +86 -0
- package/src/client/components/workspace/chat-timeline/RunFooter.tsx +82 -0
- package/src/client/components/workspace/chat-timeline/SessionSkeleton.tsx +89 -0
- package/src/client/components/workspace/chat-timeline/SubagentControls.tsx +93 -0
- package/src/client/components/workspace/chat-timeline/SubagentView.tsx +181 -0
- package/src/client/components/workspace/chat-timeline/SystemNotice.test.ts +175 -0
- package/src/client/components/workspace/chat-timeline/SystemNotice.tsx +296 -0
- package/src/client/components/workspace/chat-timeline/TaskResultContent.tsx +176 -0
- package/src/client/components/workspace/chat-timeline/ThinkingSection.tsx +130 -0
- package/src/client/components/workspace/chat-timeline/TimelineBody.tsx +135 -0
- package/src/client/components/workspace/chat-timeline/ToolCallCard.plugin.test.ts +111 -0
- package/src/client/components/workspace/chat-timeline/ToolCallCard.tsx +194 -0
- package/src/client/components/workspace/chat-timeline/ToolCallingSection.test.ts +161 -0
- package/src/client/components/workspace/chat-timeline/ToolCallingSection.tsx +101 -0
- package/src/client/components/workspace/chat-timeline/UndoConfirmModal.tsx +90 -0
- package/src/client/components/workspace/chat-timeline/chat-input/AccessDropdown.tsx +53 -0
- package/src/client/components/workspace/chat-timeline/chat-input/AttachmentToolbar.tsx +121 -0
- package/src/client/components/workspace/chat-timeline/chat-input/DropOverlay.tsx +17 -0
- package/src/client/components/workspace/chat-timeline/chat-input/GoalBanner.test.ts +180 -0
- package/src/client/components/workspace/chat-timeline/chat-input/GoalBanner.tsx +236 -0
- package/src/client/components/workspace/chat-timeline/chat-input/GoalModal.tsx +320 -0
- package/src/client/components/workspace/chat-timeline/chat-input/GoalSurfaces.tsx +67 -0
- package/src/client/components/workspace/chat-timeline/chat-input/ModeToggles.test.ts +99 -0
- package/src/client/components/workspace/chat-timeline/chat-input/ModeToggles.tsx +102 -0
- package/src/client/components/workspace/chat-timeline/chat-input/PluginComposerSlots.test.ts +110 -0
- package/src/client/components/workspace/chat-timeline/chat-input/PluginComposerSlots.tsx +61 -0
- package/src/client/components/workspace/chat-timeline/chat-input/ThinkingLevelDropdown.tsx +49 -0
- package/src/client/components/workspace/chat-timeline/chat-input/Toolbar.test.ts +155 -0
- package/src/client/components/workspace/chat-timeline/chat-input/Toolbar.tsx +216 -0
- package/src/client/components/workspace/chat-timeline/chat-input/VoiceNotice.tsx +39 -0
- package/src/client/components/workspace/chat-timeline/chat-input/access-levels.ts +14 -0
- package/src/client/components/workspace/chat-timeline/chat-input/expansion.test.ts +86 -0
- package/src/client/components/workspace/chat-timeline/chat-input/expansion.ts +143 -0
- package/src/client/components/workspace/chat-timeline/chat-input/index.tsx +283 -0
- package/src/client/components/workspace/chat-timeline/chat-input/modes-props.ts +49 -0
- package/src/client/components/workspace/chat-timeline/chat-input/props.ts +100 -0
- package/src/client/components/workspace/chat-timeline/chat-input/selection.ts +57 -0
- package/src/client/components/workspace/chat-timeline/index.tsx +335 -0
- package/src/client/components/workspace/chat-timeline/plan-review/index.tsx +159 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-panel/FrameControl.tsx +151 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-panel/GroupedAsk.tsx +232 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-panel/OptionRow.tsx +85 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-panel/PluginPendingInteractions.test.ts +288 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-panel/PluginPendingInteractions.tsx +186 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-panel/QuestionBlock.tsx +162 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-panel/QuestionCard.tsx +100 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-panel/drafts.ts +113 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-panel/index.test.ts +139 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/ask-panel/index.tsx +193 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/extension-dialog/Footer.tsx +97 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/extension-dialog/Header.tsx +52 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/extension-dialog/Lazy.tsx +24 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/extension-dialog/SelectBody.tsx +110 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/extension-dialog/index.tsx +338 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/hashline-patch/index.tsx +93 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/index.tsx +172 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/AstEdit.tsx +203 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Bash.tsx +279 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Checkpoint.tsx +49 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/ContextNotes.tsx +66 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Debug.tsx +91 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Edit.test.ts +177 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Edit.tsx +286 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Eval.tsx +184 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Github.tsx +91 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Goal.tsx +254 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/GoalRecord.tsx +122 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Lsp.tsx +276 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/ManageSkill.tsx +93 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Mcp.tsx +143 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Memory.tsx +93 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Proc.test.ts +241 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Proc.tsx +309 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Read.test.ts +229 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Read.tsx +342 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Resolve.tsx +96 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/SearchFs.tsx +132 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/SearchTool.tsx +318 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/SecurityScan.tsx +102 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/TaskResult.tsx +240 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Think.tsx +52 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Todo.test.ts +119 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Todo.tsx +110 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Wait.test.ts +276 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/Wait.tsx +328 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/panels/WebSearch.tsx +118 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/plugin-renderers.test.ts +73 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/plugin-renderers.ts +40 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/registry.test.ts +215 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/registry.ts +167 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/ArtifactBody.test.ts +103 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/ArtifactBody.tsx +132 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/ArtifactChip.tsx +174 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/DiffView.test.ts +99 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/DiffView.tsx +162 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/EnvelopeHeader.tsx +59 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/ExcerptCode.tsx +107 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/FallbackOutput.tsx +57 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/JsonCodeBlock.tsx +79 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/OutputWindow.tsx +62 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/ToolCardShell.test.ts +148 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/ToolCardShell.tsx +210 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/ToolFactChips.tsx +117 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/ToolPanelHeader.tsx +63 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/card-header.test.ts +190 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/card-header.ts +160 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/card-helpers.tsx +175 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/read-line-meta.test.ts +102 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/read-line-meta.ts +95 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/tool-input.test.ts +55 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/tool-input.ts +18 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/truncate.test.ts +53 -0
- package/src/client/components/workspace/chat-timeline/tool-renderers/shared/truncate.ts +18 -0
- package/src/client/components/workspace/context-panel/CostBreakdownPopover.tsx +74 -0
- package/src/client/components/workspace/context-panel/LastMessageCard.tsx +34 -0
- package/src/client/components/workspace/context-panel/RawJsonViewer.tsx +94 -0
- package/src/client/components/workspace/context-panel/RawMessagesList.tsx +288 -0
- package/src/client/components/workspace/context-panel/StatsGrid.tsx +64 -0
- package/src/client/components/workspace/context-panel/TokenDistributionBar.tsx +62 -0
- package/src/client/components/workspace/context-panel/WindowCard.tsx +35 -0
- package/src/client/components/workspace/context-panel/index.tsx +170 -0
- package/src/client/components/workspace/context-panel/pure-helpers.test.ts +264 -0
- package/src/client/components/workspace/context-panel/raw-messages.ts +54 -0
- package/src/client/components/workspace/diff-panel/ConflictBanner.tsx +85 -0
- package/src/client/components/workspace/diff-panel/SplitView.tsx +209 -0
- package/src/client/components/workspace/diff-panel/Toolbar.tsx +281 -0
- package/src/client/components/workspace/diff-panel/UnifiedView.tsx +150 -0
- package/src/client/components/workspace/diff-panel/index.tsx +341 -0
- package/src/client/components/workspace/editor/Body.tsx +127 -0
- package/src/client/components/workspace/editor/CommandPalette.test.ts +242 -0
- package/src/client/components/workspace/editor/CommandPalette.tsx +138 -0
- package/src/client/components/workspace/editor/EditorDropOverlay.tsx +24 -0
- package/src/client/components/workspace/editor/FileDocument.tsx +150 -0
- package/src/client/components/workspace/editor/FilePane.tsx +228 -0
- package/src/client/components/workspace/editor/FindWidget.test.ts +262 -0
- package/src/client/components/workspace/editor/FindWidget.tsx +219 -0
- package/src/client/components/workspace/editor/SaveDeletedFileModal.tsx +80 -0
- package/src/client/components/workspace/editor/Tabs.test.ts +128 -0
- package/src/client/components/workspace/editor/Tabs.tsx +159 -0
- package/src/client/components/workspace/editor/Toolbar.tsx +239 -0
- package/src/client/components/workspace/editor/index.tsx +339 -0
- package/src/client/components/workspace/editor/plugin-file-view.test.ts +183 -0
- package/src/client/components/workspace/editor/plugin-file-view.tsx +159 -0
- package/src/client/components/workspace/editor/viewers/CsvGrid.tsx +33 -0
- package/src/client/components/workspace/editor/viewers/DataGrid.tsx +102 -0
- package/src/client/components/workspace/editor/viewers/DocxView.tsx +72 -0
- package/src/client/components/workspace/editor/viewers/ImageView.tsx +43 -0
- package/src/client/components/workspace/editor/viewers/PdfView.tsx +56 -0
- package/src/client/components/workspace/editor/viewers/SheetView.tsx +115 -0
- package/src/client/components/workspace/editor/viewers/SvgPreview.tsx +50 -0
- package/src/client/components/workspace/editor/viewers/ViewerError.tsx +32 -0
- package/src/client/components/workspace/editor/viewers/bytes.test.ts +239 -0
- package/src/client/components/workspace/editor/viewers/bytes.ts +114 -0
- package/src/client/components/workspace/editor/viewers/dispatch.tsx +130 -0
- package/src/client/components/workspace/editor/viewers/mammoth-browser.d.ts +36 -0
- package/src/client/components/workspace/editor/viewers/use-byte-document.test.ts +170 -0
- package/src/client/components/workspace/editor/viewers/use-byte-document.ts +73 -0
- package/src/client/components/workspace/editor/viewers/use-byte-url.test.ts +259 -0
- package/src/client/components/workspace/editor/viewers/use-byte-url.ts +118 -0
- package/src/client/components/workspace/editor/viewers/viewers.test.ts +233 -0
- package/src/client/components/workspace/file-explorer/ContextMenu.tsx +142 -0
- package/src/client/components/workspace/file-explorer/Modals.tsx +229 -0
- package/src/client/components/workspace/file-explorer/OutlineSection.test.tsx +218 -0
- package/src/client/components/workspace/file-explorer/OutlineSection.tsx +135 -0
- package/src/client/components/workspace/file-explorer/RootMenu.tsx +81 -0
- package/src/client/components/workspace/file-explorer/TreeItem.tsx +310 -0
- package/src/client/components/workspace/file-explorer/clipboard.test.ts +171 -0
- package/src/client/components/workspace/file-explorer/drag.test.ts +148 -0
- package/src/client/components/workspace/file-explorer/index.test.ts +130 -0
- package/src/client/components/workspace/file-explorer/index.tsx +336 -0
- package/src/client/components/workspace/file-explorer/root-menu.test.ts +79 -0
- package/src/client/components/workspace/git-panel/BranchToolbar.tsx +252 -0
- package/src/client/components/workspace/git-panel/ChangesList.tsx +217 -0
- package/src/client/components/workspace/git-panel/CommitBox.tsx +108 -0
- package/src/client/components/workspace/git-panel/ConflictItem.tsx +128 -0
- package/src/client/components/workspace/git-panel/FileItem.tsx +99 -0
- package/src/client/components/workspace/git-panel/Modals.tsx +97 -0
- package/src/client/components/workspace/git-panel/OperationBar.tsx +95 -0
- package/src/client/components/workspace/git-panel/PanelModals.tsx +110 -0
- package/src/client/components/workspace/git-panel/RepoHeader.tsx +68 -0
- package/src/client/components/workspace/git-panel/StashSection.test.tsx +243 -0
- package/src/client/components/workspace/git-panel/StashSection.tsx +246 -0
- package/src/client/components/workspace/git-panel/TreeItem.tsx +192 -0
- package/src/client/components/workspace/git-panel/TreeView.tsx +36 -0
- package/src/client/components/workspace/git-panel/branch-modal/BranchRow.tsx +164 -0
- package/src/client/components/workspace/git-panel/branch-modal/DeleteDialog.tsx +109 -0
- package/src/client/components/workspace/git-panel/branch-modal/RenameDialog.tsx +154 -0
- package/src/client/components/workspace/git-panel/branch-modal/index.tsx +229 -0
- package/src/client/components/workspace/git-panel/commit-modal/CommitActions.tsx +89 -0
- package/src/client/components/workspace/git-panel/commit-modal/CommitDiffViewer.tsx +285 -0
- package/src/client/components/workspace/git-panel/commit-modal/CommitRow.test.ts +128 -0
- package/src/client/components/workspace/git-panel/commit-modal/CommitRow.tsx +231 -0
- package/src/client/components/workspace/git-panel/commit-modal/GraphCanvas.tsx +167 -0
- package/src/client/components/workspace/git-panel/commit-modal/Header.tsx +144 -0
- package/src/client/components/workspace/git-panel/commit-modal/index.tsx +330 -0
- package/src/client/components/workspace/git-panel/confirm-request.test.ts +72 -0
- package/src/client/components/workspace/git-panel/confirm-request.ts +92 -0
- package/src/client/components/workspace/git-panel/index.test.ts +332 -0
- package/src/client/components/workspace/git-panel/index.tsx +342 -0
- package/src/client/components/workspace/model-dropdown/Footer.tsx +21 -0
- package/src/client/components/workspace/model-dropdown/Header.tsx +50 -0
- package/src/client/components/workspace/model-dropdown/Item.plugin.test.ts +90 -0
- package/src/client/components/workspace/model-dropdown/Item.tsx +127 -0
- package/src/client/components/workspace/model-dropdown/Panel.tsx +146 -0
- package/src/client/components/workspace/model-dropdown/Section.tsx +96 -0
- package/src/client/components/workspace/model-dropdown/Skeleton.tsx +39 -0
- package/src/client/components/workspace/model-dropdown/SpecsTooltip.tsx +91 -0
- package/src/client/components/workspace/model-dropdown/groups.ts +95 -0
- package/src/client/components/workspace/model-dropdown/index.tsx +290 -0
- package/src/client/components/workspace/model-dropdown/use-catalog.ts +135 -0
- package/src/client/components/workspace/panels/builtin.test.ts +79 -0
- package/src/client/components/workspace/panels/builtin.tsx +193 -0
- package/src/client/components/workspace/plan-panel/Nav.tsx +93 -0
- package/src/client/components/workspace/plan-panel/PageView.tsx +91 -0
- package/src/client/components/workspace/plan-panel/index.tsx +188 -0
- package/src/client/components/workspace/plugin-panel/Error.tsx +37 -0
- package/src/client/components/workspace/plugin-panel/RowScope.test.tsx +197 -0
- package/src/client/components/workspace/plugin-panel/resolve.tsx +263 -0
- package/src/client/components/workspace/repo-picker/Modal.test.tsx +260 -0
- package/src/client/components/workspace/repo-picker/Modal.tsx +238 -0
- package/src/client/components/workspace/repo-picker/Row.tsx +223 -0
- package/src/client/components/workspace/repo-picker/index.test.tsx +137 -0
- package/src/client/components/workspace/repo-picker/index.tsx +92 -0
- package/src/client/components/workspace/search-panel/Body.tsx +274 -0
- package/src/client/components/workspace/search-panel/Results.tsx +188 -0
- package/src/client/components/workspace/search-panel/Row.tsx +86 -0
- package/src/client/components/workspace/search-panel/index.tsx +132 -0
- package/src/client/components/workspace/terminal-panel/Header.test.ts +99 -0
- package/src/client/components/workspace/terminal-panel/Header.tsx +90 -0
- package/src/client/components/workspace/terminal-panel/KeyBar.tsx +194 -0
- package/src/client/components/workspace/terminal-panel/QuickActions.tsx +39 -0
- package/src/client/components/workspace/terminal-panel/RealtimeXtermView.tsx +168 -0
- package/src/client/components/workspace/terminal-panel/index.tsx +231 -0
- package/src/client/components/workspace/terminal-panel/mount.ts +322 -0
- package/src/client/components/workspace/todo-panel/PhaseGroup.tsx +76 -0
- package/src/client/components/workspace/todo-panel/index.tsx +169 -0
- package/src/client/components/workspace/usage-panel/ProviderSelect.tsx +213 -0
- package/src/client/components/workspace/usage-panel/index.tsx +124 -0
- package/src/client/components/workspace/usage-panel/report.test.ts +61 -0
- package/src/client/components/workspace/usage-panel/report.ts +36 -0
- package/src/client/components/workspace/user-browser-panel/AddressBar.tsx +134 -0
- package/src/client/components/workspace/user-browser-panel/Frame.tsx +72 -0
- package/src/client/components/workspace/user-browser-panel/index.tsx +87 -0
- package/src/client/components/workspace/wiki-panel/Nav.tsx +140 -0
- package/src/client/components/workspace/wiki-panel/PageView.tsx +126 -0
- package/src/client/components/workspace/wiki-panel/index.tsx +245 -0
- package/src/client/data/agent-data/builtin.ts +31 -0
- package/src/client/data/agent-data/index.ts +10 -0
- package/src/client/data/agent-data/orchestrator.ts +113 -0
- package/src/client/data/agent-data/specialist.ts +245 -0
- package/src/client/data/context-data/index.test.ts +120 -0
- package/src/client/data/context-data/index.ts +312 -0
- package/src/client/data/context-data/presets.ts +128 -0
- package/src/client/data/mock/chat.ts +236 -0
- package/src/client/data/mock/git-commits.ts +309 -0
- package/src/client/data/mock/subagents.ts +212 -0
- package/src/client/data/mock/token-usage.ts +129 -0
- package/src/client/data/models/catalog.ts +301 -0
- package/src/client/data/samples/dialogue-session.ts +285 -0
- package/src/client/data/samples/sample-subagents/scout-raw.ts +341 -0
- package/src/client/data/samples/sample-subagents/sleeper-raw.ts +294 -0
- package/src/client/data/samples/sample-tools/built-in-part1.ts +303 -0
- package/src/client/data/samples/sample-tools/built-in-part2.ts +200 -0
- package/src/client/data/samples/sample-tools/other.ts +162 -0
- package/src/client/data/samples/subagent-session.ts +99 -0
- package/src/client/data/samples/tools-session.ts +85 -0
- package/src/client/data/samples/virtual-devices-internal-url.ts +141 -0
- package/src/client/data/samples/virtual-devices-session.ts +336 -0
- package/src/client/data/settings/behavior.ts +12 -0
- package/src/client/data/settings/command.ts +148 -0
- package/src/client/data/settings/mcp.ts +28 -0
- package/src/client/data/settings/omp-schema.json +8380 -0
- package/src/client/data/settings/plugin.ts +127 -0
- package/src/client/data/settings/project.ts +58 -0
- package/src/client/data/settings/provider.ts +317 -0
- package/src/client/data/settings/skill.ts +340 -0
- package/src/client/data/theme/terminal.ts +163 -0
- package/src/client/hooks/browser/use-screencast.ts +178 -0
- package/src/client/hooks/browser/use-user-browser.ts +105 -0
- package/src/client/hooks/chat/btw/index.ts +238 -0
- package/src/client/hooks/chat/btw/intercept.test.ts +99 -0
- package/src/client/hooks/chat/btw/intercept.ts +46 -0
- package/src/client/hooks/chat/btw/mode.ts +209 -0
- package/src/client/hooks/chat/composer/attachments.test.ts +211 -0
- package/src/client/hooks/chat/composer/attachments.ts +198 -0
- package/src/client/hooks/chat/composer/auto-grow.test.ts +142 -0
- package/src/client/hooks/chat/composer/auto-grow.ts +51 -0
- package/src/client/hooks/chat/composer/browser-context.ts +40 -0
- package/src/client/hooks/chat/composer/drop-entries.test.ts +234 -0
- package/src/client/hooks/chat/composer/drop-entries.ts +204 -0
- package/src/client/hooks/chat/composer/drop-payload.test.ts +97 -0
- package/src/client/hooks/chat/composer/drop-payload.ts +130 -0
- package/src/client/hooks/chat/composer/drop-references.ts +106 -0
- package/src/client/hooks/chat/composer/file-drop.test.ts +194 -0
- package/src/client/hooks/chat/composer/file-drop.ts +226 -0
- package/src/client/hooks/chat/composer/file-reads.test.ts +211 -0
- package/src/client/hooks/chat/composer/file-reads.ts +238 -0
- package/src/client/hooks/chat/composer/index.ts +213 -0
- package/src/client/hooks/chat/composer/items.test.ts +327 -0
- package/src/client/hooks/chat/composer/items.ts +100 -0
- package/src/client/hooks/chat/composer/model-selection.ts +197 -0
- package/src/client/hooks/chat/composer/pipeline.test.ts +260 -0
- package/src/client/hooks/chat/composer/pipeline.ts +183 -0
- package/src/client/hooks/chat/composer/publish-state.ts +80 -0
- package/src/client/hooks/chat/composer/speech-to-text.ts +214 -0
- package/src/client/hooks/chat/composer/use-draft.ts +33 -0
- package/src/client/hooks/chat/composer/voice-input.ts +71 -0
- package/src/client/hooks/chat/context/telemetry.ts +66 -0
- package/src/client/hooks/chat/omp/index-probe.test.ts +164 -0
- package/src/client/hooks/chat/omp/index.ts +276 -0
- package/src/client/hooks/chat/omp/owner-redirect.test.ts +74 -0
- package/src/client/hooks/chat/omp/owner-redirect.ts +44 -0
- package/src/client/hooks/chat/omp/pending-rows.ts +103 -0
- package/src/client/hooks/chat/omp/pending-sessions.test.ts +314 -0
- package/src/client/hooks/chat/omp/pending-sessions.ts +296 -0
- package/src/client/hooks/chat/omp/prompt-send.test.ts +280 -0
- package/src/client/hooks/chat/omp/prompt-send.ts +187 -0
- package/src/client/hooks/chat/omp/run-switch.test.ts +69 -0
- package/src/client/hooks/chat/omp/run-switch.ts +52 -0
- package/src/client/hooks/chat/omp/session-list.test.ts +283 -0
- package/src/client/hooks/chat/omp/session-list.tsx +289 -0
- package/src/client/hooks/chat/omp/session-sidebar-controller.test.ts +234 -0
- package/src/client/hooks/chat/omp/session-sidebar-controller.ts +285 -0
- package/src/client/hooks/chat/omp/session-statuses.test.ts +277 -0
- package/src/client/hooks/chat/omp/session-statuses.ts +129 -0
- package/src/client/hooks/chat/omp/sidebar-overlay.ts +73 -0
- package/src/client/hooks/chat/omp/status.ts +12 -0
- package/src/client/hooks/chat/omp/stream-rpc.test.ts +188 -0
- package/src/client/hooks/chat/omp/stream.test.ts +223 -0
- package/src/client/hooks/chat/omp/stream.ts +149 -0
- package/src/client/hooks/chat/stream.ts +228 -0
- package/src/client/hooks/chat/subagent/index.ts +309 -0
- package/src/client/hooks/chat/timeline/access-mode.ts +41 -0
- package/src/client/hooks/chat/timeline/actions.test.ts +310 -0
- package/src/client/hooks/chat/timeline/actions.ts +335 -0
- package/src/client/hooks/chat/timeline/ask-frames-grouped.test.ts +76 -0
- package/src/client/hooks/chat/timeline/ask-frames.test.ts +151 -0
- package/src/client/hooks/chat/timeline/ask-frames.ts +172 -0
- package/src/client/hooks/chat/timeline/auto-scroll.ts +67 -0
- package/src/client/hooks/chat/timeline/composer-local-actions.test.ts +349 -0
- package/src/client/hooks/chat/timeline/composer-modes.ts +32 -0
- package/src/client/hooks/chat/timeline/deferred-model.test.ts +224 -0
- package/src/client/hooks/chat/timeline/deferred-model.ts +92 -0
- package/src/client/hooks/chat/timeline/extension-dialog.ts +59 -0
- package/src/client/hooks/chat/timeline/generating.test.ts +103 -0
- package/src/client/hooks/chat/timeline/generating.ts +106 -0
- package/src/client/hooks/chat/timeline/goal-command.ts +76 -0
- package/src/client/hooks/chat/timeline/index.ts +349 -0
- package/src/client/hooks/chat/timeline/mode-marker-spellings.test.ts +57 -0
- package/src/client/hooks/chat/timeline/mode-markers.ts +103 -0
- package/src/client/hooks/chat/timeline/modes.test.ts +311 -0
- package/src/client/hooks/chat/timeline/modes.ts +326 -0
- package/src/client/hooks/chat/timeline/new-chat.test.ts +196 -0
- package/src/client/hooks/chat/timeline/new-chat.ts +80 -0
- package/src/client/hooks/chat/timeline/plan-review.test.ts +47 -0
- package/src/client/hooks/chat/timeline/plan-review.ts +148 -0
- package/src/client/hooks/chat/timeline/plugin-commands.test.ts +116 -0
- package/src/client/hooks/chat/timeline/plugin-commands.ts +76 -0
- package/src/client/hooks/chat/timeline/prompt-text.test.ts +123 -0
- package/src/client/hooks/chat/timeline/prompt-text.ts +40 -0
- package/src/client/hooks/chat/timeline/queue-actions.ts +96 -0
- package/src/client/hooks/chat/timeline/queue-rewind.test.ts +271 -0
- package/src/client/hooks/chat/timeline/queue.ts +235 -0
- package/src/client/hooks/chat/timeline/rail-jump.test.ts +204 -0
- package/src/client/hooks/chat/timeline/rail-jump.ts +86 -0
- package/src/client/hooks/chat/timeline/rewind-actions.test.ts +233 -0
- package/src/client/hooks/chat/timeline/rewind-actions.ts +172 -0
- package/src/client/hooks/chat/timeline/rewind.ts +62 -0
- package/src/client/hooks/chat/timeline/scope.ts +55 -0
- package/src/client/hooks/chat/timeline/scroll.test.ts +320 -0
- package/src/client/hooks/chat/timeline/scroll.ts +226 -0
- package/src/client/hooks/chat/timeline/send-execute.test.ts +333 -0
- package/src/client/hooks/chat/timeline/send-helpers.ts +109 -0
- package/src/client/hooks/chat/timeline/send-steer.test.ts +231 -0
- package/src/client/hooks/chat/timeline/send.test.ts +231 -0
- package/src/client/hooks/chat/timeline/send.ts +310 -0
- package/src/client/hooks/chat/timeline/session-load.test.ts +323 -0
- package/src/client/hooks/chat/timeline/session-load.ts +317 -0
- package/src/client/hooks/chat/timeline/session-pagination.test.ts +167 -0
- package/src/client/hooks/chat/timeline/session-pagination.ts +317 -0
- package/src/client/hooks/chat/timeline/session-scope.test.ts +248 -0
- package/src/client/hooks/chat/timeline/session-title.ts +36 -0
- package/src/client/hooks/chat/timeline/subagent-view.ts +92 -0
- package/src/client/hooks/chat/timeline/timeline-mode-state.test.ts +306 -0
- package/src/client/hooks/chat/timeline/timeline-rail.test.ts +259 -0
- package/src/client/hooks/chat/timeline/tool-open.test.ts +141 -0
- package/src/client/hooks/chat/timeline/tool-open.ts +87 -0
- package/src/client/hooks/chat/timeline/tui-only-guard.ts +58 -0
- package/src/client/hooks/chat/timeline/undo-confirmation.ts +45 -0
- package/src/client/hooks/chat/timeline/user-turns.ts +182 -0
- package/src/client/hooks/editor/file-actions.ts +49 -0
- package/src/client/hooks/editor/find-harness.test-util.ts +170 -0
- package/src/client/hooks/editor/find-state.ts +68 -0
- package/src/client/hooks/editor/font.test.ts +344 -0
- package/src/client/hooks/editor/font.ts +53 -0
- package/src/client/hooks/editor/resolve-viewer.test.ts +142 -0
- package/src/client/hooks/editor/resolve-viewer.ts +80 -0
- package/src/client/hooks/editor/save-file.ts +88 -0
- package/src/client/hooks/editor/scroll-container.test.ts +102 -0
- package/src/client/hooks/editor/scroll-container.ts +26 -0
- package/src/client/hooks/editor/use-code-window.ts +100 -0
- package/src/client/hooks/editor/use-editor-document.ts +81 -0
- package/src/client/hooks/editor/use-editor-drop.test.ts +245 -0
- package/src/client/hooks/editor/use-editor-drop.ts +275 -0
- package/src/client/hooks/editor/use-editor-find-write.test.ts +170 -0
- package/src/client/hooks/editor/use-editor-find.test.ts +158 -0
- package/src/client/hooks/editor/use-editor-find.ts +307 -0
- package/src/client/hooks/editor/use-editor-history.test.ts +216 -0
- package/src/client/hooks/editor/use-editor-history.ts +134 -0
- package/src/client/hooks/editor/use-editor-outline-bridge.ts +73 -0
- package/src/client/hooks/editor/use-file-editor-writes.test.ts +118 -0
- package/src/client/hooks/editor/use-file-editor.test.ts +169 -0
- package/src/client/hooks/editor/use-file-editor.ts +331 -0
- package/src/client/hooks/editor/use-file-read.ts +197 -0
- package/src/client/hooks/editor/use-file-transfer.ts +113 -0
- package/src/client/hooks/editor/use-file-writes.ts +228 -0
- package/src/client/hooks/editor/use-line-jump.test.ts +204 -0
- package/src/client/hooks/editor/use-line-jump.ts +112 -0
- package/src/client/hooks/editor/use-line-reveal.ts +71 -0
- package/src/client/hooks/editor/use-occurrences.test.ts +236 -0
- package/src/client/hooks/editor/use-occurrences.ts +98 -0
- package/src/client/hooks/editor/use-outline-view.ts +47 -0
- package/src/client/hooks/editor/use-scroll-restore.test.ts +238 -0
- package/src/client/hooks/editor/use-scroll-restore.ts +209 -0
- package/src/client/hooks/editor/use-search-reveal.ts +74 -0
- package/src/client/hooks/models/use-model-names.ts +17 -0
- package/src/client/hooks/models/use-models-catalog.ts +45 -0
- package/src/client/hooks/models/use-provider-names.ts +18 -0
- package/src/client/hooks/settings/crud-list.test.ts +272 -0
- package/src/client/hooks/settings/crud-list.ts +187 -0
- package/src/client/hooks/settings/instruction-file.ts +91 -0
- package/src/client/hooks/settings/master-detail.ts +33 -0
- package/src/client/hooks/settings/plugins.ts +121 -0
- package/src/client/hooks/settings/providers/actions.ts +341 -0
- package/src/client/hooks/settings/providers/api.ts +69 -0
- package/src/client/hooks/settings/providers/index.ts +154 -0
- package/src/client/hooks/settings/providers/logout.ts +85 -0
- package/src/client/hooks/settings/providers/messages.ts +112 -0
- package/src/client/hooks/settings/reload-engine.ts +74 -0
- package/src/client/hooks/settings/restart-kabmo.test.ts +187 -0
- package/src/client/hooks/settings/restart-kabmo.ts +115 -0
- package/src/client/hooks/settings/settings-siblings.test.ts +168 -0
- package/src/client/hooks/settings/skill-catalog.ts +37 -0
- package/src/client/hooks/settings/use-kabmo-setting.ts +15 -0
- package/src/client/hooks/settings/useUsageReport.ts +45 -0
- package/src/client/hooks/settings/useUsageResets.ts +64 -0
- package/src/client/hooks/settings/workspace-roots.ts +99 -0
- package/src/client/hooks/ui/auth.test.ts +99 -0
- package/src/client/hooks/ui/auth.ts +274 -0
- package/src/client/hooks/ui/clipboard.ts +50 -0
- package/src/client/hooks/ui/copy-flag.ts +27 -0
- package/src/client/hooks/ui/inline-rename.ts +99 -0
- package/src/client/hooks/ui/input-required-alert.ts +43 -0
- package/src/client/hooks/ui/keyboard-inset.test.ts +46 -0
- package/src/client/hooks/ui/keyboard-inset.ts +120 -0
- package/src/client/hooks/ui/notification-sound.ts +173 -0
- package/src/client/hooks/ui/on-click-outside.ts +22 -0
- package/src/client/hooks/ui/open-file.ts +57 -0
- package/src/client/hooks/ui/output-reveal.ts +30 -0
- package/src/client/hooks/ui/realtime.test.ts +84 -0
- package/src/client/hooks/ui/realtime.ts +128 -0
- package/src/client/hooks/ui/show-more.ts +35 -0
- package/src/client/hooks/ui/syntax-ready.ts +30 -0
- package/src/client/hooks/ui/text-overflow.test.ts +152 -0
- package/src/client/hooks/ui/text-overflow.ts +78 -0
- package/src/client/hooks/ui/theme.ts +121 -0
- package/src/client/hooks/ui/toasts.ts +22 -0
- package/src/client/hooks/ui/touch-device.ts +46 -0
- package/src/client/hooks/ui/ui-alert.test.ts +235 -0
- package/src/client/hooks/ui/ui-environment.test.ts +172 -0
- package/src/client/hooks/ui/ui-feedback.test.ts +303 -0
- package/src/client/hooks/ui/ui-inline-rename.test.ts +305 -0
- package/src/client/hooks/ui/ui-listeners.test.ts +331 -0
- package/src/client/hooks/ui/ui-sounds.test.ts +254 -0
- package/src/client/hooks/ui/ui-syntax-ready.test.ts +73 -0
- package/src/client/hooks/ui/updates/changelog.ts +57 -0
- package/src/client/hooks/ui/updates/index.test.ts +218 -0
- package/src/client/hooks/ui/updates/index.ts +254 -0
- package/src/client/hooks/ui/updates/restart.test.ts +129 -0
- package/src/client/hooks/ui/updates/restart.ts +150 -0
- package/src/client/hooks/ui/window-chrome.ts +63 -0
- package/src/client/hooks/ui/window-event.ts +55 -0
- package/src/client/hooks/workspace/available-width.ts +33 -0
- package/src/client/hooks/workspace/batch-delete-run.ts +95 -0
- package/src/client/hooks/workspace/batch-delete.ts +63 -0
- package/src/client/hooks/workspace/batch-selection.ts +98 -0
- package/src/client/hooks/workspace/commit-box.test.ts +203 -0
- package/src/client/hooks/workspace/commit-box.ts +129 -0
- package/src/client/hooks/workspace/commit-interactions.ts +153 -0
- package/src/client/hooks/workspace/commit-layer.test.ts +348 -0
- package/src/client/hooks/workspace/commit-pagination.ts +101 -0
- package/src/client/hooks/workspace/diff-file.ts +128 -0
- package/src/client/hooks/workspace/directives.ts +55 -0
- package/src/client/hooks/workspace/expanded-sessions.ts +62 -0
- package/src/client/hooks/workspace/file-clipboard.test.ts +247 -0
- package/src/client/hooks/workspace/file-clipboard.ts +192 -0
- package/src/client/hooks/workspace/file-create.ts +111 -0
- package/src/client/hooks/workspace/file-listing.ts +242 -0
- package/src/client/hooks/workspace/file-row-drag.ts +98 -0
- package/src/client/hooks/workspace/file-tabs.ts +233 -0
- package/src/client/hooks/workspace/file-tree-actions-clipboard.test.ts +106 -0
- package/src/client/hooks/workspace/file-tree-actions.test.ts +181 -0
- package/src/client/hooks/workspace/file-tree-actions.ts +246 -0
- package/src/client/hooks/workspace/git-actions.ts +56 -0
- package/src/client/hooks/workspace/git-panel-data.ts +162 -0
- package/src/client/hooks/workspace/git-status.test.ts +150 -0
- package/src/client/hooks/workspace/git-status.ts +48 -0
- package/src/client/hooks/workspace/git-tree.test.ts +73 -0
- package/src/client/hooks/workspace/git-tree.ts +146 -0
- package/src/client/hooks/workspace/list-slots.test.ts +86 -0
- package/src/client/hooks/workspace/list-slots.ts +59 -0
- package/src/client/hooks/workspace/missing-files.test.ts +179 -0
- package/src/client/hooks/workspace/missing-files.ts +132 -0
- package/src/client/hooks/workspace/new-workspace.ts +51 -0
- package/src/client/hooks/workspace/panel-order.ts +87 -0
- package/src/client/hooks/workspace/panel-registry.ts +329 -0
- package/src/client/hooks/workspace/panel-reorder.ts +119 -0
- package/src/client/hooks/workspace/panel-widths.test.ts +261 -0
- package/src/client/hooks/workspace/panel-widths.ts +51 -0
- package/src/client/hooks/workspace/renaming-sessions.ts +61 -0
- package/src/client/hooks/workspace/repo-details.ts +128 -0
- package/src/client/hooks/workspace/repo-scope/index.test.ts +213 -0
- package/src/client/hooks/workspace/repo-scope/index.ts +181 -0
- package/src/client/hooks/workspace/repo-scope/store.test.ts +158 -0
- package/src/client/hooks/workspace/repo-scope/store.ts +164 -0
- package/src/client/hooks/workspace/scheduled-tasks.ts +159 -0
- package/src/client/hooks/workspace/search-stream.test.ts +149 -0
- package/src/client/hooks/workspace/search-stream.ts +133 -0
- package/src/client/hooks/workspace/session-actions.test.ts +170 -0
- package/src/client/hooks/workspace/session-actions.ts +99 -0
- package/src/client/hooks/workspace/session-delete.ts +93 -0
- package/src/client/hooks/workspace/session-state/context.ts +15 -0
- package/src/client/hooks/workspace/session-state/index.ts +83 -0
- package/src/client/hooks/workspace/sidebar-width.ts +43 -0
- package/src/client/hooks/workspace/terminal/index.ts +186 -0
- package/src/client/hooks/workspace/terminal/socket.ts +227 -0
- package/src/client/hooks/workspace/wiki.ts +195 -0
- package/src/client/hooks/workspace/workspace-folder-actions.ts +125 -0
- package/src/client/lib/editor-document.ts +106 -0
- package/src/client/lib/launch/file-handlers.test.ts +255 -0
- package/src/client/lib/launch/file-handlers.ts +203 -0
- package/src/client/lib/launch/types.ts +67 -0
- package/src/client/lib/line-reveal.ts +61 -0
- package/src/client/lib/outline-stores.test.ts +94 -0
- package/src/client/lib/plugins/bootstrap.test.ts +258 -0
- package/src/client/lib/plugins/bootstrap.tsx +158 -0
- package/src/client/lib/plugins/composer-bridge.ts +107 -0
- package/src/client/lib/plugins/content-scripts-root.test.ts +158 -0
- package/src/client/lib/plugins/content-scripts.test.ts +331 -0
- package/src/client/lib/plugins/content-scripts.ts +252 -0
- package/src/client/lib/plugins/context.ts +68 -0
- package/src/client/lib/plugins/directives.test.tsx +239 -0
- package/src/client/lib/plugins/directives.tsx +139 -0
- package/src/client/lib/plugins/kit.test.ts +103 -0
- package/src/client/lib/plugins/kit.ts +160 -0
- package/src/client/lib/plugins/list-slots.test.ts +148 -0
- package/src/client/lib/plugins/list-slots.ts +166 -0
- package/src/client/lib/plugins/loader.ts +66 -0
- package/src/client/lib/plugins/repo-scope-service.test.ts +90 -0
- package/src/client/lib/plugins/repo-scope-service.ts +148 -0
- package/src/client/lib/plugins/runtime.ts +64 -0
- package/src/client/lib/plugins/sidebar-bridge.test.ts +200 -0
- package/src/client/lib/plugins/sidebar-bridge.ts +215 -0
- package/src/client/lib/plugins/slots.test.ts +177 -0
- package/src/client/lib/plugins/slots.ts +230 -0
- package/src/client/lib/plugins/stylesheets.test.ts +157 -0
- package/src/client/lib/plugins/stylesheets.ts +89 -0
- package/src/client/lib/plugins/topic.ts +55 -0
- package/src/client/lib/router/fetcher.ts +100 -0
- package/src/client/lib/router/search-params.ts +86 -0
- package/src/client/lib/scrollbar-activity.test.ts +165 -0
- package/src/client/lib/scrollbar-activity.ts +112 -0
- package/src/client/lib/search-reveal.ts +61 -0
- package/src/client/lib/signals.ts +72 -0
- package/src/client/lib/ui/with-chord.ts +21 -0
- package/src/client/main.tsx +78 -0
- package/src/client/stubs/elkjs.ts +42 -0
- package/src/client/tailwind.css +584 -0
- package/src/server/db.server.test.ts +153 -0
- package/src/server/db.server.ts +144 -0
- package/src/server/index.ts +329 -0
- package/src/server/lib/assets/conditional.server.test.ts +74 -0
- package/src/server/lib/assets/conditional.server.ts +54 -0
- package/src/server/lib/assets/dev-assets.server.test.ts +44 -0
- package/src/server/lib/assets/dev-assets.server.ts +128 -0
- package/src/server/lib/assets/font-css.server.test.ts +87 -0
- package/src/server/lib/assets/font-css.server.ts +113 -0
- package/src/server/lib/assets/font-faces.ts +69 -0
- package/src/server/lib/assets/fonts.server.ts +77 -0
- package/src/server/lib/auth/client-address.ts +55 -0
- package/src/server/lib/auth/config.ts +133 -0
- package/src/server/lib/auth/env-password.test.ts +112 -0
- package/src/server/lib/auth/env-password.ts +79 -0
- package/src/server/lib/auth/guard.test.ts +305 -0
- package/src/server/lib/auth/guard.ts +285 -0
- package/src/server/lib/auth/handover-guard.test.ts +100 -0
- package/src/server/lib/auth/rate-limit.test.ts +135 -0
- package/src/server/lib/auth/rate-limit.ts +143 -0
- package/src/server/lib/auth/token.test.ts +236 -0
- package/src/server/lib/auth/token.ts +220 -0
- package/src/server/lib/browser/runtime.test.ts +110 -0
- package/src/server/lib/browser/runtime.ts +160 -0
- package/src/server/lib/btw/child.server.test.ts +68 -0
- package/src/server/lib/btw/child.server.ts +42 -0
- package/src/server/lib/btw/frames.test.ts +59 -0
- package/src/server/lib/btw/frames.ts +50 -0
- package/src/server/lib/btw/lifecycle.server.test.ts +139 -0
- package/src/server/lib/btw/lifecycle.server.ts +264 -0
- package/src/server/lib/btw/prompt.ts +32 -0
- package/src/server/lib/btw/purge.server.ts +56 -0
- package/src/server/lib/btw/registry.server.test.ts +213 -0
- package/src/server/lib/btw/registry.server.ts +142 -0
- package/src/server/lib/btw/reply.ts +54 -0
- package/src/server/lib/btw/runtime.server.test.ts +128 -0
- package/src/server/lib/btw/runtime.server.ts +308 -0
- package/src/server/lib/btw/schema.server.test.ts +84 -0
- package/src/server/lib/btw/schema.server.ts +79 -0
- package/src/server/lib/btw/service.server.test.ts +199 -0
- package/src/server/lib/btw/service.server.ts +241 -0
- package/src/server/lib/btw/session-copy.server.ts +213 -0
- package/src/server/lib/btw/session-copy.test.ts +166 -0
- package/src/server/lib/btw/store.server.test.ts +301 -0
- package/src/server/lib/btw/store.server.ts +280 -0
- package/src/server/lib/bundler/build-errors.server.ts +141 -0
- package/src/server/lib/bundler/build-errors.test.ts +103 -0
- package/src/server/lib/bundler/css.test.ts +237 -0
- package/src/server/lib/bundler/css.ts +82 -0
- package/src/server/lib/bundler/dependencies.test.ts +149 -0
- package/src/server/lib/bundler/nested-at-rules.test.ts +100 -0
- package/src/server/lib/bundler/nested-at-rules.ts +146 -0
- package/src/server/lib/bundler/tsconfig-paths.test.ts +124 -0
- package/src/server/lib/chat/session-store.server.ts +61 -0
- package/src/server/lib/db/client.ts +76 -0
- package/src/server/lib/db/compact-chat-overlay.test.ts +128 -0
- package/src/server/lib/db/compact-chat-overlay.ts +90 -0
- package/src/server/lib/db/schema.test.ts +219 -0
- package/src/server/lib/db/schema.ts +122 -0
- package/src/server/lib/db/seed-terminal.test.ts +227 -0
- package/src/server/lib/db/seed.test.ts +226 -0
- package/src/server/lib/db/seed.ts +160 -0
- package/src/server/lib/db/settings-store.test.ts +65 -0
- package/src/server/lib/db/settings-store.ts +173 -0
- package/src/server/lib/db/workspace-sync.test.ts +274 -0
- package/src/server/lib/db/workspace-sync.ts +144 -0
- package/src/server/lib/dictation/language.server.test.ts +134 -0
- package/src/server/lib/dictation/language.server.ts +82 -0
- package/src/server/lib/dictation/omp-stt-worker.ts +243 -0
- package/src/server/lib/fs/atomic-write.ts +65 -0
- package/src/server/lib/fs/child-env.test.ts +66 -0
- package/src/server/lib/fs/child-env.ts +50 -0
- package/src/server/lib/fs/config-lock.ts +74 -0
- package/src/server/lib/fs/fs-path.test.ts +293 -0
- package/src/server/lib/fs/fs-write-git.test.ts +332 -0
- package/src/server/lib/fs/git-actions-branch.ts +148 -0
- package/src/server/lib/fs/git-actions-history.ts +74 -0
- package/src/server/lib/fs/git-actions-shared.ts +86 -0
- package/src/server/lib/fs/git-actions-worktree.ts +187 -0
- package/src/server/lib/fs/git-actions.ts +39 -0
- package/src/server/lib/fs/git-branch.ts +226 -0
- package/src/server/lib/fs/git-diff.test.ts +304 -0
- package/src/server/lib/fs/git-diff.ts +162 -0
- package/src/server/lib/fs/git-ignore.ts +105 -0
- package/src/server/lib/fs/git-index-lock.test.ts +232 -0
- package/src/server/lib/fs/git-log-parse.test.ts +155 -0
- package/src/server/lib/fs/git-log.test.ts +337 -0
- package/src/server/lib/fs/git-log.ts +335 -0
- package/src/server/lib/fs/git-merge-conflict.test.ts +123 -0
- package/src/server/lib/fs/git-merge.ts +210 -0
- package/src/server/lib/fs/git-porcelain-v2.ts +140 -0
- package/src/server/lib/fs/git-publish.test.ts +147 -0
- package/src/server/lib/fs/git-publish.ts +73 -0
- package/src/server/lib/fs/git-repo-details.test.ts +227 -0
- package/src/server/lib/fs/git-repo-details.ts +163 -0
- package/src/server/lib/fs/git-repos.test.ts +101 -0
- package/src/server/lib/fs/git-repos.ts +117 -0
- package/src/server/lib/fs/git-revert.ts +93 -0
- package/src/server/lib/fs/git-run.ts +219 -0
- package/src/server/lib/fs/git-stash.ts +159 -0
- package/src/server/lib/fs/git-state-verbs.test.ts +117 -0
- package/src/server/lib/fs/git-state.test.ts +171 -0
- package/src/server/lib/fs/git-state.ts +178 -0
- package/src/server/lib/fs/git-status-read.test.ts +141 -0
- package/src/server/lib/fs/git-status-read.ts +174 -0
- package/src/server/lib/fs/git-sync.test.ts +200 -0
- package/src/server/lib/fs/git-sync.ts +216 -0
- package/src/server/lib/fs/listing.ts +64 -0
- package/src/server/lib/fs/package-root.test.ts +99 -0
- package/src/server/lib/fs/package-root.ts +87 -0
- package/src/server/lib/fs/path-segment.test.ts +101 -0
- package/src/server/lib/fs/path-segment.ts +45 -0
- package/src/server/lib/fs/repo-scope.ts +14 -0
- package/src/server/lib/fs/reveal.ts +101 -0
- package/src/server/lib/fs/ripgrep.test.ts +208 -0
- package/src/server/lib/fs/ripgrep.ts +139 -0
- package/src/server/lib/fs/root.ts +156 -0
- package/src/server/lib/fs/shell.ts +131 -0
- package/src/server/lib/fs/transfer.test.ts +183 -0
- package/src/server/lib/fs/transfer.ts +143 -0
- package/src/server/lib/http/same-origin.ts +26 -0
- package/src/server/lib/lifecycle/argv-flags.ts +47 -0
- package/src/server/lib/lifecycle/bun.ts +20 -0
- package/src/server/lib/lifecycle/fd-pressure.test.ts +110 -0
- package/src/server/lib/lifecycle/fd-pressure.ts +240 -0
- package/src/server/lib/lifecycle/flock.test.ts +166 -0
- package/src/server/lib/lifecycle/flock.ts +199 -0
- package/src/server/lib/lifecycle/identity.test.ts +23 -0
- package/src/server/lib/lifecycle/identity.ts +86 -0
- package/src/server/lib/lifecycle/instance.test.ts +306 -0
- package/src/server/lib/lifecycle/instance.ts +131 -0
- package/src/server/lib/lifecycle/kill-tree.test.ts +196 -0
- package/src/server/lib/lifecycle/kill-tree.ts +114 -0
- package/src/server/lib/lifecycle/launch-mode.test.ts +51 -0
- package/src/server/lib/lifecycle/launch-mode.ts +66 -0
- package/src/server/lib/lifecycle/listener.ts +58 -0
- package/src/server/lib/lifecycle/occupant.ts +101 -0
- package/src/server/lib/lifecycle/paths.test.ts +97 -0
- package/src/server/lib/lifecycle/paths.ts +112 -0
- package/src/server/lib/lifecycle/port-guard.test.ts +288 -0
- package/src/server/lib/lifecycle/port-guard.ts +185 -0
- package/src/server/lib/lifecycle/probe.test.ts +279 -0
- package/src/server/lib/lifecycle/probe.ts +215 -0
- package/src/server/lib/lifecycle/proc/darwin.ts +305 -0
- package/src/server/lib/lifecycle/proc/index.ts +38 -0
- package/src/server/lib/lifecycle/proc/linux.ts +110 -0
- package/src/server/lib/lifecycle/proc/proc.test.ts +164 -0
- package/src/server/lib/lifecycle/proc/ps.ts +99 -0
- package/src/server/lib/lifecycle/proc/types.ts +58 -0
- package/src/server/lib/lifecycle/proc/win32.ts +64 -0
- package/src/server/lib/lifecycle/restart.test.ts +331 -0
- package/src/server/lib/lifecycle/restart.ts +228 -0
- package/src/server/lib/lifecycle/shell-route.ts +17 -0
- package/src/server/lib/lifecycle/tls.test.ts +98 -0
- package/src/server/lib/lifecycle/tls.ts +165 -0
- package/src/server/lib/models/detected-registry.server.ts +41 -0
- package/src/server/lib/models/preferences.server.ts +110 -0
- package/src/server/lib/models/provider-items.server.ts +96 -0
- package/src/server/lib/models/provider-listing.server.test.ts +283 -0
- package/src/server/lib/models/provider-listing.server.ts +279 -0
- package/src/server/lib/models/provider-registry.server.test.ts +173 -0
- package/src/server/lib/models/provider-registry.server.ts +257 -0
- package/src/server/lib/models/registry.server.test.ts +263 -0
- package/src/server/lib/models/registry.server.ts +206 -0
- package/src/server/lib/models/selected-context-limit.server.test.ts +162 -0
- package/src/server/lib/models/selected-context-limit.server.ts +52 -0
- package/src/server/lib/observer-ws.ts +150 -0
- package/src/server/lib/omp/config/agents.ts +162 -0
- package/src/server/lib/omp/config/behavior.ts +113 -0
- package/src/server/lib/omp/config/commands.test.ts +167 -0
- package/src/server/lib/omp/config/commands.ts +185 -0
- package/src/server/lib/omp/config/config-cli.test.ts +153 -0
- package/src/server/lib/omp/config/config-cli.ts +154 -0
- package/src/server/lib/omp/config/definitions.test.ts +349 -0
- package/src/server/lib/omp/config/disabled-providers.ts +117 -0
- package/src/server/lib/omp/config/discovery-roots.test.ts +119 -0
- package/src/server/lib/omp/config/discovery-roots.ts +194 -0
- package/src/server/lib/omp/config/document.test.ts +349 -0
- package/src/server/lib/omp/config/document.ts +128 -0
- package/src/server/lib/omp/config/extensions.ts +91 -0
- package/src/server/lib/omp/config/instructions.ts +81 -0
- package/src/server/lib/omp/config/mcp-and-cli.test.ts +318 -0
- package/src/server/lib/omp/config/mcp-test.ts +346 -0
- package/src/server/lib/omp/config/mcp.ts +205 -0
- package/src/server/lib/omp/config/model-overrides.ts +123 -0
- package/src/server/lib/omp/config/models-config.ts +103 -0
- package/src/server/lib/omp/config/models-validation.test.ts +137 -0
- package/src/server/lib/omp/config/models-validation.ts +268 -0
- package/src/server/lib/omp/config/omp-config-files.test.ts +300 -0
- package/src/server/lib/omp/config/path-scoped.ts +74 -0
- package/src/server/lib/omp/config/plugin-actions.ts +87 -0
- package/src/server/lib/omp/config/plugin-cli.ts +69 -0
- package/src/server/lib/omp/config/plugin-registry.test.ts +286 -0
- package/src/server/lib/omp/config/plugin-registry.ts +250 -0
- package/src/server/lib/omp/config/plugins.test.ts +289 -0
- package/src/server/lib/omp/config/plugins.ts +249 -0
- package/src/server/lib/omp/config/provider-seeds.test.ts +167 -0
- package/src/server/lib/omp/config/provider-seeds.ts +220 -0
- package/src/server/lib/omp/config/providers-write.test.ts +340 -0
- package/src/server/lib/omp/config/providers.ts +343 -0
- package/src/server/lib/omp/config/roles.ts +38 -0
- package/src/server/lib/omp/config/roots-watch.server.test.ts +214 -0
- package/src/server/lib/omp/config/roots-watch.server.ts +334 -0
- package/src/server/lib/omp/config/scope.test.ts +53 -0
- package/src/server/lib/omp/config/scope.ts +65 -0
- package/src/server/lib/omp/config/skills-catalog.ts +127 -0
- package/src/server/lib/omp/config/skills.test.ts +108 -0
- package/src/server/lib/omp/config/skills.ts +333 -0
- package/src/server/lib/omp/config/yaml.ts +48 -0
- package/src/server/lib/omp/core/auth-credentials.ts +132 -0
- package/src/server/lib/omp/core/cli.ts +70 -0
- package/src/server/lib/omp/core/host-resolution.test.ts +348 -0
- package/src/server/lib/omp/core/paths.test.ts +229 -0
- package/src/server/lib/omp/core/paths.ts +214 -0
- package/src/server/lib/omp/core/registry.test.ts +234 -0
- package/src/server/lib/omp/core/registry.ts +140 -0
- package/src/server/lib/omp/core/startup.ts +64 -0
- package/src/server/lib/omp/core/worktree.ts +107 -0
- package/src/server/lib/omp/extensions/locator.test.ts +67 -0
- package/src/server/lib/omp/extensions/locator.ts +98 -0
- package/src/server/lib/omp/mode/command-type.test.ts +41 -0
- package/src/server/lib/omp/mode/live-selection.test.ts +133 -0
- package/src/server/lib/omp/mode/live-selection.ts +90 -0
- package/src/server/lib/omp/mode/request.test.ts +73 -0
- package/src/server/lib/omp/mode/request.ts +94 -0
- package/src/server/lib/omp/rpc/agent-start-watchdog.ts +88 -0
- package/src/server/lib/omp/rpc/child-config.ts +48 -0
- package/src/server/lib/omp/rpc/constants.test.ts +229 -0
- package/src/server/lib/omp/rpc/constants.ts +299 -0
- package/src/server/lib/omp/rpc/destroy-stream-row.test.ts +110 -0
- package/src/server/lib/omp/rpc/errors.ts +42 -0
- package/src/server/lib/omp/rpc/event-fanout.ts +43 -0
- package/src/server/lib/omp/rpc/forked-resume.test.ts +119 -0
- package/src/server/lib/omp/rpc/frame-fold.test.ts +300 -0
- package/src/server/lib/omp/rpc/frame-fold.ts +321 -0
- package/src/server/lib/omp/rpc/idle-reaper.ts +59 -0
- package/src/server/lib/omp/rpc/lifecycle.test.ts +293 -0
- package/src/server/lib/omp/rpc/lines.ts +48 -0
- package/src/server/lib/omp/rpc/manager.ts +345 -0
- package/src/server/lib/omp/rpc/mode-mirror.test.ts +156 -0
- package/src/server/lib/omp/rpc/mode-mirror.ts +109 -0
- package/src/server/lib/omp/rpc/peer-proxy.server.test.ts +107 -0
- package/src/server/lib/omp/rpc/peer-proxy.server.ts +150 -0
- package/src/server/lib/omp/rpc/pending-ui-dialogs.ts +59 -0
- package/src/server/lib/omp/rpc/process-helpers.ts +70 -0
- package/src/server/lib/omp/rpc/process.ts +328 -0
- package/src/server/lib/omp/rpc/reload-plugins.ts +43 -0
- package/src/server/lib/omp/rpc/rpc-primitives.test.ts +339 -0
- package/src/server/lib/omp/rpc/rpc-timers.test.ts +302 -0
- package/src/server/lib/omp/rpc/run-model.ts +59 -0
- package/src/server/lib/omp/rpc/run-settle.server.ts +296 -0
- package/src/server/lib/omp/rpc/run-settle.test.ts +288 -0
- package/src/server/lib/omp/rpc/session-command-guards.ts +125 -0
- package/src/server/lib/omp/rpc/session-commands-dialog.test.ts +139 -0
- package/src/server/lib/omp/rpc/session-commands-harness.ts +86 -0
- package/src/server/lib/omp/rpc/session-commands.test.ts +293 -0
- package/src/server/lib/omp/rpc/session-commands.ts +293 -0
- package/src/server/lib/omp/rpc/session-registration.ts +58 -0
- package/src/server/lib/omp/rpc/session-registry.test.ts +234 -0
- package/src/server/lib/omp/rpc/session-registry.ts +349 -0
- package/src/server/lib/omp/rpc/spawn-provenance.ts +82 -0
- package/src/server/lib/omp/rpc/stream-reader.test.ts +124 -0
- package/src/server/lib/omp/rpc/subagent-liveness.test.ts +62 -0
- package/src/server/lib/omp/rpc/subagent-liveness.ts +101 -0
- package/src/server/lib/omp/rpc/terminal-settle.ts +97 -0
- package/src/server/lib/omp/rpc/utility.test.ts +261 -0
- package/src/server/lib/omp/rpc/utility.ts +300 -0
- package/src/server/lib/omp/rpc/web-state.ts +88 -0
- package/src/server/lib/omp/session/artifacts.server.test.ts +117 -0
- package/src/server/lib/omp/session/artifacts.server.ts +106 -0
- package/src/server/lib/omp/session/auto-title.server.test.ts +270 -0
- package/src/server/lib/omp/session/auto-title.server.ts +250 -0
- package/src/server/lib/omp/session/blobs.server.test.ts +129 -0
- package/src/server/lib/omp/session/blobs.server.ts +108 -0
- package/src/server/lib/omp/session/data-mock.ts +88 -0
- package/src/server/lib/omp/session/delete-flow.server.ts +101 -0
- package/src/server/lib/omp/session/delete.server.ts +139 -0
- package/src/server/lib/omp/session/file-scan.ts +180 -0
- package/src/server/lib/omp/session/files.test.ts +147 -0
- package/src/server/lib/omp/session/files.ts +298 -0
- package/src/server/lib/omp/session/goal-auditor.server.ts +187 -0
- package/src/server/lib/omp/session/goal-auditor.test.ts +76 -0
- package/src/server/lib/omp/session/goal-driver.server.ts +230 -0
- package/src/server/lib/omp/session/goal-driver.test.ts +220 -0
- package/src/server/lib/omp/session/goal-settings.server.ts +48 -0
- package/src/server/lib/omp/session/goal-settings.test.ts +45 -0
- package/src/server/lib/omp/session/lease-flock.server.ts +117 -0
- package/src/server/lib/omp/session/lease-holder.server.ts +156 -0
- package/src/server/lib/omp/session/local-runs.server.ts +38 -0
- package/src/server/lib/omp/session/locator.ts +70 -0
- package/src/server/lib/omp/session/merge-stored-anchor.test.ts +85 -0
- package/src/server/lib/omp/session/merge-stored-notices.test.ts +81 -0
- package/src/server/lib/omp/session/merge-stored-overlay-rows.test.ts +106 -0
- package/src/server/lib/omp/session/merge-stored.test.ts +118 -0
- package/src/server/lib/omp/session/merge-stored.ts +307 -0
- package/src/server/lib/omp/session/messages.test.ts +182 -0
- package/src/server/lib/omp/session/messages.ts +288 -0
- package/src/server/lib/omp/session/modes.test.ts +146 -0
- package/src/server/lib/omp/session/modes.ts +164 -0
- package/src/server/lib/omp/session/ownership.server.test.ts +271 -0
- package/src/server/lib/omp/session/ownership.server.ts +156 -0
- package/src/server/lib/omp/session/plan-mode-env.test.ts +65 -0
- package/src/server/lib/omp/session/plans.test.ts +64 -0
- package/src/server/lib/omp/session/plans.ts +192 -0
- package/src/server/lib/omp/session/reader.ts +162 -0
- package/src/server/lib/omp/session/reload.server.test.ts +111 -0
- package/src/server/lib/omp/session/reload.server.ts +114 -0
- package/src/server/lib/omp/session/rename-with-ai.server.test.ts +137 -0
- package/src/server/lib/omp/session/rename-with-ai.server.ts +197 -0
- package/src/server/lib/omp/session/rewind-file.test.ts +212 -0
- package/src/server/lib/omp/session/rewind-file.ts +248 -0
- package/src/server/lib/omp/session/scan.ts +119 -0
- package/src/server/lib/omp/session/session-discovery.test.ts +248 -0
- package/src/server/lib/omp/session/session-reads.test.ts +297 -0
- package/src/server/lib/omp/session/sessions-watch.server.ts +115 -0
- package/src/server/lib/omp/session/sidebar-data.server.ts +270 -0
- package/src/server/lib/omp/session/standby.server.test.ts +109 -0
- package/src/server/lib/omp/session/standby.server.ts +122 -0
- package/src/server/lib/omp/session/subagent-presence.ts +108 -0
- package/src/server/lib/omp/session/telemetry/compute.ts +206 -0
- package/src/server/lib/omp/session/telemetry/format.ts +110 -0
- package/src/server/lib/omp/session/telemetry/index.ts +4 -0
- package/src/server/lib/omp/session/telemetry/scan.ts +103 -0
- package/src/server/lib/omp/session/telemetry-raw.ts +112 -0
- package/src/server/lib/omp/session/telemetry.test.ts +154 -0
- package/src/server/lib/omp/session/title-model-overlay.server.test.ts +152 -0
- package/src/server/lib/omp/session/title-model-overlay.server.ts +161 -0
- package/src/server/lib/omp/session/title-slot.ts +203 -0
- package/src/server/lib/omp/session/todos.ts +100 -0
- package/src/server/lib/omp/session/usage/aggregate-shaping.test.ts +149 -0
- package/src/server/lib/omp/session/usage/aggregate.test.ts +243 -0
- package/src/server/lib/omp/session/usage/aggregate.ts +330 -0
- package/src/server/lib/omp/session/usage/shaping.ts +130 -0
- package/src/server/lib/omp/subagent/history/fold.ts +196 -0
- package/src/server/lib/omp/subagent/history/index.ts +110 -0
- package/src/server/lib/omp/subagent/history/paths.ts +29 -0
- package/src/server/lib/omp/subagent/history/transcript.test.ts +87 -0
- package/src/server/lib/omp/subagent/history/transcript.ts +122 -0
- package/src/server/lib/panels/assets.server.ts +70 -0
- package/src/server/lib/panels/auto-update.server.test.ts +138 -0
- package/src/server/lib/panels/auto-update.server.ts +148 -0
- package/src/server/lib/panels/baseline.server.test.ts +104 -0
- package/src/server/lib/panels/baseline.server.ts +122 -0
- package/src/server/lib/panels/build-targets.server.ts +107 -0
- package/src/server/lib/panels/build.server.test.ts +289 -0
- package/src/server/lib/panels/build.server.ts +297 -0
- package/src/server/lib/panels/bundled-catalog.server.ts +54 -0
- package/src/server/lib/panels/catalog.server.test.ts +149 -0
- package/src/server/lib/panels/catalog.server.ts +142 -0
- package/src/server/lib/panels/compat.server.test.ts +122 -0
- package/src/server/lib/panels/compat.server.ts +79 -0
- package/src/server/lib/panels/files.server.test.ts +133 -0
- package/src/server/lib/panels/files.server.ts +112 -0
- package/src/server/lib/panels/git-clone.server.ts +140 -0
- package/src/server/lib/panels/git-status.server.ts +46 -0
- package/src/server/lib/panels/git-update.server.test.ts +218 -0
- package/src/server/lib/panels/git-update.server.ts +187 -0
- package/src/server/lib/panels/install.server.test.ts +284 -0
- package/src/server/lib/panels/install.server.ts +240 -0
- package/src/server/lib/panels/link.server.ts +106 -0
- package/src/server/lib/panels/local-edits.server.test.ts +127 -0
- package/src/server/lib/panels/local-edits.server.ts +126 -0
- package/src/server/lib/panels/manifest.test.ts +199 -0
- package/src/server/lib/panels/manifest.ts +248 -0
- package/src/server/lib/panels/registry-bundled.server.test.ts +99 -0
- package/src/server/lib/panels/registry.server.test.ts +315 -0
- package/src/server/lib/panels/registry.server.ts +331 -0
- package/src/server/lib/panels/remove.server.test.ts +112 -0
- package/src/server/lib/panels/seed.server.ts +71 -0
- package/src/server/lib/panels/shim.test.ts +160 -0
- package/src/server/lib/panels/shim.ts +139 -0
- package/src/server/lib/panels/state.server.test.ts +131 -0
- package/src/server/lib/panels/state.server.ts +172 -0
- package/src/server/lib/panels/sync.server.test.ts +308 -0
- package/src/server/lib/panels/sync.server.ts +212 -0
- package/src/server/lib/plugins/background.server.ts +99 -0
- package/src/server/lib/plugins/background.test.ts +89 -0
- package/src/server/lib/plugins/build-server.test.ts +85 -0
- package/src/server/lib/plugins/e2e.test.ts +134 -0
- package/src/server/lib/plugins/events.server.ts +88 -0
- package/src/server/lib/plugins/http.server.ts +112 -0
- package/src/server/lib/plugins/loader.server.ts +306 -0
- package/src/server/lib/plugins/log.server.ts +40 -0
- package/src/server/lib/plugins/platform.test.ts +293 -0
- package/src/server/lib/plugins/realtime.server.ts +66 -0
- package/src/server/lib/plugins/rpc.server.ts +180 -0
- package/src/server/lib/plugins/schema.server.ts +75 -0
- package/src/server/lib/plugins/settings.server.ts +172 -0
- package/src/server/lib/plugins/shutdown.test.ts +105 -0
- package/src/server/lib/plugins/storage.server.ts +118 -0
- package/src/server/lib/queue/delivery-dispatch.server.test.ts +180 -0
- package/src/server/lib/queue/delivery-harness.ts +115 -0
- package/src/server/lib/queue/delivery.server.test.ts +206 -0
- package/src/server/lib/queue/delivery.server.ts +258 -0
- package/src/server/lib/queue/schema-migration.server.ts +50 -0
- package/src/server/lib/queue/store.server.test.ts +272 -0
- package/src/server/lib/queue/store.server.ts +219 -0
- package/src/server/lib/realtime/hub.server.test.ts +285 -0
- package/src/server/lib/realtime/hub.server.ts +318 -0
- package/src/server/lib/realtime/hub.types.ts +122 -0
- package/src/server/lib/realtime/signals.server.ts +101 -0
- package/src/server/lib/realtime/topics/btw.server.ts +25 -0
- package/src/server/lib/realtime/topics/catalog.server.ts +126 -0
- package/src/server/lib/realtime/topics/global.server.test.ts +50 -0
- package/src/server/lib/realtime/topics/global.server.ts +52 -0
- package/src/server/lib/realtime/topics/peer-relay.server.test.ts +246 -0
- package/src/server/lib/realtime/topics/peer-relay.server.ts +84 -0
- package/src/server/lib/realtime/topics/plugin.server.ts +30 -0
- package/src/server/lib/realtime/topics/session-data.server.ts +98 -0
- package/src/server/lib/realtime/topics/session.server.ts +123 -0
- package/src/server/lib/realtime/topics/workspace.server.ts +106 -0
- package/src/server/lib/realtime/topics.server.test.ts +255 -0
- package/src/server/lib/realtime/topics.server.ts +261 -0
- package/src/server/lib/remix-compat.ts +29 -0
- package/src/server/lib/route-adapter.test.ts +322 -0
- package/src/server/lib/route-adapter.ts +144 -0
- package/src/server/lib/schedule/rows.server.ts +111 -0
- package/src/server/lib/schedule/runtime.server.test.ts +191 -0
- package/src/server/lib/schedule/runtime.server.ts +252 -0
- package/src/server/lib/schedule/schema.server.ts +60 -0
- package/src/server/lib/schedule/store.server.test.ts +231 -0
- package/src/server/lib/schedule/store.server.ts +254 -0
- package/src/server/lib/sse.ts +248 -0
- package/src/server/lib/terminal/foreground.test.ts +163 -0
- package/src/server/lib/terminal/foreground.ts +122 -0
- package/src/server/lib/terminal/history.test.ts +118 -0
- package/src/server/lib/terminal/history.ts +206 -0
- package/src/server/lib/terminal/liveness.server.ts +99 -0
- package/src/server/lib/terminal/runtime.server.ts +294 -0
- package/src/server/lib/terminal/session.server.ts +256 -0
- package/src/server/lib/terminal/shell.test.ts +129 -0
- package/src/server/lib/terminal/shell.ts +146 -0
- package/src/server/lib/terminal/spawn.test.ts +50 -0
- package/src/server/lib/terminal/spawn.ts +51 -0
- package/src/server/lib/terminal/store-liveness.test.ts +324 -0
- package/src/server/lib/terminal/store.ts +72 -0
- package/src/server/lib/tray/autostart.ts +238 -0
- package/src/server/lib/tray/config.ts +141 -0
- package/src/server/lib/tray/credential.test.ts +74 -0
- package/src/server/lib/tray/credential.ts +81 -0
- package/src/server/lib/tray/entry.ts +89 -0
- package/src/server/lib/tray/host/darwin.js +180 -0
- package/src/server/lib/tray/host/linux.js +187 -0
- package/src/server/lib/tray/host/win32.ps1 +109 -0
- package/src/server/lib/tray/hosts.ts +115 -0
- package/src/server/lib/tray/runtime.server.ts +132 -0
- package/src/server/lib/tray/tray.test.ts +225 -0
- package/src/server/lib/updates/apply.ts +93 -0
- package/src/server/lib/updates/changelog-file.ts +122 -0
- package/src/server/lib/updates/changelog.test.ts +213 -0
- package/src/server/lib/updates/changelog.ts +163 -0
- package/src/server/lib/updates/check.ts +71 -0
- package/src/server/lib/updates/install-method.ts +86 -0
- package/src/server/lib/updates/install-steps.ts +81 -0
- package/src/server/lib/updates/install.test.ts +135 -0
- package/src/server/lib/updates/install.ts +302 -0
- package/src/server/lib/updates/installed-cli.test.ts +222 -0
- package/src/server/lib/updates/installed-cli.ts +139 -0
- package/src/server/lib/updates/npm.test.ts +137 -0
- package/src/server/lib/updates/npm.ts +113 -0
- package/src/server/lib/updates/omp.test.ts +116 -0
- package/src/server/lib/updates/omp.ts +139 -0
- package/src/server/lib/updates/release-url.ts +25 -0
- package/src/server/lib/updates/single-flight.test.ts +61 -0
- package/src/server/lib/updates/single-flight.ts +68 -0
- package/src/server/lib/usage/deepseek.ts +58 -0
- package/src/server/lib/usage/kenari-accounts.test.ts +162 -0
- package/src/server/lib/usage/kenari.test.ts +258 -0
- package/src/server/lib/usage/kenari.ts +255 -0
- package/src/server/lib/usage/omp-usage.server.test.ts +126 -0
- package/src/server/lib/usage/omp-usage.server.ts +203 -0
- package/src/server/lib/usage/provider-key.test.ts +325 -0
- package/src/server/lib/usage/provider-key.ts +194 -0
- package/src/server/lib/usage/providers.server.test.ts +47 -0
- package/src/server/lib/usage/providers.server.ts +214 -0
- package/src/server/lib/usage/report.server.ts +156 -0
- package/src/server/lib/usage/reset.server.test.ts +175 -0
- package/src/server/lib/usage/reset.server.ts +206 -0
- package/src/server/lib/usage/vendor-balance.server.test.ts +104 -0
- package/src/server/lib/usage/vendor-balance.server.ts +284 -0
- package/src/server/lib/wiki/git.test.ts +240 -0
- package/src/server/lib/wiki/git.ts +79 -0
- package/src/server/lib/wiki/mirror-reads.test.ts +78 -0
- package/src/server/lib/wiki/mirror.server.ts +251 -0
- package/src/server/lib/wiki/payload.server.ts +141 -0
- package/src/server/lib/wiki/provider.server.ts +84 -0
- package/src/server/lib/wiki/remote.test.ts +84 -0
- package/src/server/lib/wiki/remote.ts +104 -0
- package/src/server/lib/workspace/register-folder.server.ts +78 -0
- package/src/server/mock.server.ts +27 -0
- package/src/server/plugins/compress.ts +79 -0
- package/src/server/plugins/shell.server.test.ts +98 -0
- package/src/server/plugins/shell.server.ts +168 -0
- package/src/server/plugins/ssr.ts +199 -0
- package/src/server/plugins/static.test.ts +60 -0
- package/src/server/plugins/static.ts +164 -0
- package/src/server/routes/agent/command.test.ts +87 -0
- package/src/server/routes/agent/command.ts +247 -0
- package/src/server/routes/agent/index.ts +10 -0
- package/src/server/routes/agent/new.ts +114 -0
- package/src/server/routes/agent/prewarm.ts +27 -0
- package/src/server/routes/auth/index.ts +14 -0
- package/src/server/routes/auth/login.ts +94 -0
- package/src/server/routes/auth/logout.ts +36 -0
- package/src/server/routes/auth/password.ts +102 -0
- package/src/server/routes/auth/revoke.test.ts +115 -0
- package/src/server/routes/auth/revoke.ts +73 -0
- package/src/server/routes/auth/routes.test.ts +322 -0
- package/src/server/routes/auth/state.ts +34 -0
- package/src/server/routes/browser/index.ts +6 -0
- package/src/server/routes/browser/stream.test.ts +107 -0
- package/src/server/routes/browser/stream.ts +217 -0
- package/src/server/routes/btw/index.ts +6 -0
- package/src/server/routes/btw/topics.ts +117 -0
- package/src/server/routes/chamber/index.ts +15 -0
- package/src/server/routes/chat/index.ts +14 -0
- package/src/server/routes/chat/rewind.ts +116 -0
- package/src/server/routes/chat/root.ts +78 -0
- package/src/server/routes/chat/session.ts +235 -0
- package/src/server/routes/chat/stream.test.ts +102 -0
- package/src/server/routes/chat/stream.ts +111 -0
- package/src/server/routes/chat/turns.ts +87 -0
- package/src/server/routes/console/index.ts +18 -0
- package/src/server/routes/console/restart.test.ts +98 -0
- package/src/server/routes/console/restart.ts +44 -0
- package/src/server/routes/dictation/ws.ts +116 -0
- package/src/server/routes/files/index.ts +10 -0
- package/src/server/routes/files/root.ts +29 -0
- package/src/server/routes/files/toggle.ts +20 -0
- package/src/server/routes/folders/batch-delete.ts +68 -0
- package/src/server/routes/folders/clone.test.ts +167 -0
- package/src/server/routes/folders/clone.ts +132 -0
- package/src/server/routes/folders/create.ts +84 -0
- package/src/server/routes/folders/folder.ts +124 -0
- package/src/server/routes/folders/index.ts +26 -0
- package/src/server/routes/folders/mkdir.ts +97 -0
- package/src/server/routes/folders/routes.test.ts +185 -0
- package/src/server/routes/fs/action-create.test.ts +90 -0
- package/src/server/routes/fs/action-transfer.test.ts +159 -0
- package/src/server/routes/fs/action.test.ts +64 -0
- package/src/server/routes/fs/action.ts +175 -0
- package/src/server/routes/fs/exists.test.ts +76 -0
- package/src/server/routes/fs/exists.ts +53 -0
- package/src/server/routes/fs/git-action.test.ts +334 -0
- package/src/server/routes/fs/git-branch.test.ts +287 -0
- package/src/server/routes/fs/git-loader.test.ts +105 -0
- package/src/server/routes/fs/git-merge.test.ts +325 -0
- package/src/server/routes/fs/git-repo-details.test.ts +152 -0
- package/src/server/routes/fs/git-stash.test.ts +202 -0
- package/src/server/routes/fs/git.ts +188 -0
- package/src/server/routes/fs/index.ts +26 -0
- package/src/server/routes/fs/raw.test.ts +124 -0
- package/src/server/routes/fs/raw.ts +115 -0
- package/src/server/routes/fs/read.test.ts +146 -0
- package/src/server/routes/fs/read.ts +324 -0
- package/src/server/routes/fs/replace.ts +69 -0
- package/src/server/routes/fs/scope.test.ts +171 -0
- package/src/server/routes/fs/scope.ts +106 -0
- package/src/server/routes/fs/search.test.ts +210 -0
- package/src/server/routes/fs/search.ts +205 -0
- package/src/server/routes/fs/validate.ts +62 -0
- package/src/server/routes/health/index.ts +6 -0
- package/src/server/routes/health/probe.ts +59 -0
- package/src/server/routes/index.ts +60 -0
- package/src/server/routes/models/index.ts +8 -0
- package/src/server/routes/models/roles.ts +31 -0
- package/src/server/routes/models/root.ts +205 -0
- package/src/server/routes/omp/artifact.ts +42 -0
- package/src/server/routes/omp/blob.ts +54 -0
- package/src/server/routes/omp/extensions.ts +34 -0
- package/src/server/routes/omp/index.ts +27 -0
- package/src/server/routes/omp/login.ts +112 -0
- package/src/server/routes/omp/reload-engine.ts +39 -0
- package/src/server/routes/omp/routes.test.ts +133 -0
- package/src/server/routes/omp/state.ts +22 -0
- package/src/server/routes/panels/bindings.ts +23 -0
- package/src/server/routes/panels/build.ts +72 -0
- package/src/server/routes/panels/bundle.ts +71 -0
- package/src/server/routes/panels/css.test.ts +141 -0
- package/src/server/routes/panels/css.ts +89 -0
- package/src/server/routes/panels/icon.ts +64 -0
- package/src/server/routes/panels/install.ts +240 -0
- package/src/server/routes/panels/panel-routes.test-util.ts +126 -0
- package/src/server/routes/panels/readme.ts +69 -0
- package/src/server/routes/panels/registry.ts +27 -0
- package/src/server/routes/panels/routes.test.ts +290 -0
- package/src/server/routes/panels/server-half.test.ts +95 -0
- package/src/server/routes/plugins/bindings.ts +16 -0
- package/src/server/routes/plugins/http.ts +56 -0
- package/src/server/routes/plugins/routes.test.ts +254 -0
- package/src/server/routes/plugins/rpc.ts +65 -0
- package/src/server/routes/plugins/state.ts +36 -0
- package/src/server/routes/realtime/ws.ts +114 -0
- package/src/server/routes/schedule/bindings.ts +8 -0
- package/src/server/routes/schedule/body.ts +110 -0
- package/src/server/routes/schedule/index.ts +155 -0
- package/src/server/routes/schedule/runs.ts +23 -0
- package/src/server/routes/sessions/batch-delete.test.ts +139 -0
- package/src/server/routes/sessions/batch-delete.ts +60 -0
- package/src/server/routes/sessions/delete.test.ts +84 -0
- package/src/server/routes/sessions/delete.ts +45 -0
- package/src/server/routes/sessions/folder.ts +16 -0
- package/src/server/routes/sessions/index.ts +52 -0
- package/src/server/routes/sessions/list.ts +23 -0
- package/src/server/routes/sessions/queue.ts +134 -0
- package/src/server/routes/sessions/routes-queue.test.ts +237 -0
- package/src/server/routes/sessions/routes-read.test.ts +165 -0
- package/src/server/routes/sessions/routes.test.ts +316 -0
- package/src/server/routes/sessions/session.ts +291 -0
- package/src/server/routes/sessions/subagent-control.ts +75 -0
- package/src/server/routes/sessions/subagents.ts +82 -0
- package/src/server/routes/settings/agents.ts +128 -0
- package/src/server/routes/settings/behavior.ts +125 -0
- package/src/server/routes/settings/commands.ts +217 -0
- package/src/server/routes/settings/index.ts +39 -0
- package/src/server/routes/settings/mcp-test.ts +71 -0
- package/src/server/routes/settings/mcp.ts +261 -0
- package/src/server/routes/settings/model-override.ts +69 -0
- package/src/server/routes/settings/omp-config.ts +50 -0
- package/src/server/routes/settings/plugins.ts +218 -0
- package/src/server/routes/settings/projects.ts +89 -0
- package/src/server/routes/settings/provider-logout.test.ts +38 -0
- package/src/server/routes/settings/provider-logout.ts +104 -0
- package/src/server/routes/settings/provider-model.ts +107 -0
- package/src/server/routes/settings/provider-models.ts +190 -0
- package/src/server/routes/settings/providers.ts +182 -0
- package/src/server/routes/settings/root.ts +45 -0
- package/src/server/routes/settings/settings-config-routes.test.ts +271 -0
- package/src/server/routes/settings/settings-store-routes.test.ts +334 -0
- package/src/server/routes/settings/skills.ts +227 -0
- package/src/server/routes/settings/usage-reset.ts +60 -0
- package/src/server/routes/settings/usage.ts +36 -0
- package/src/server/routes/telemetry/context.ts +59 -0
- package/src/server/routes/telemetry/index.ts +10 -0
- package/src/server/routes/telemetry/raw-messages.ts +80 -0
- package/src/server/routes/telemetry/tokens.ts +166 -0
- package/src/server/routes/terminal/index.ts +6 -0
- package/src/server/routes/terminal/sessions.ts +24 -0
- package/src/server/routes/terminal/ws.ts +155 -0
- package/src/server/routes/updates/apply.ts +140 -0
- package/src/server/routes/updates/changelog.ts +32 -0
- package/src/server/routes/updates/check.ts +27 -0
- package/src/server/routes/updates/index.ts +10 -0
- package/src/server/routes/updates/routes.test.ts +269 -0
- package/src/server/routes/well-known/devtools.ts +9 -0
- package/src/server/routes/well-known/index.ts +6 -0
- package/src/server/routes/wiki/asset.ts +69 -0
- package/src/server/routes/wiki/index.ts +15 -0
- package/src/server/routes/wiki/page.ts +88 -0
- package/src/server/routes/wiki/repo.ts +30 -0
- package/src/shared/lib/auth/handover.test.ts +153 -0
- package/src/shared/lib/auth/handover.ts +102 -0
- package/src/shared/lib/auth/password.ts +72 -0
- package/src/shared/lib/browser/activity.ts +115 -0
- package/src/shared/lib/browser/browser-cdp.test.ts +350 -0
- package/src/shared/lib/browser/browser-helpers.test.ts +218 -0
- package/src/shared/lib/browser/browser-viewer.test.ts +312 -0
- package/src/shared/lib/browser/browser-watcher.test.ts +202 -0
- package/src/shared/lib/browser/cdp.ts +201 -0
- package/src/shared/lib/browser/connection.ts +81 -0
- package/src/shared/lib/browser/observer.ts +129 -0
- package/src/shared/lib/browser/page-context.ts +20 -0
- package/src/shared/lib/browser/targets.test.ts +45 -0
- package/src/shared/lib/browser/targets.ts +74 -0
- package/src/shared/lib/browser/url.ts +21 -0
- package/src/shared/lib/browser/util.ts +20 -0
- package/src/shared/lib/browser/viewer.ts +303 -0
- package/src/shared/lib/browser/watcher.ts +75 -0
- package/src/shared/lib/chat/ask-questions.test.ts +169 -0
- package/src/shared/lib/chat/ask-questions.ts +284 -0
- package/src/shared/lib/chat/attachments.test.ts +240 -0
- package/src/shared/lib/chat/attachments.ts +299 -0
- package/src/shared/lib/chat/btw/client.ts +83 -0
- package/src/shared/lib/chat/capitalize.ts +9 -0
- package/src/shared/lib/chat/chat-display.test.ts +284 -0
- package/src/shared/lib/chat/composer/client.test.ts +48 -0
- package/src/shared/lib/chat/composer/client.ts +233 -0
- package/src/shared/lib/chat/composer/commands.test.ts +307 -0
- package/src/shared/lib/chat/composer/commands.ts +290 -0
- package/src/shared/lib/chat/composer/composer.test.ts +195 -0
- package/src/shared/lib/chat/composer/draft.ts +39 -0
- package/src/shared/lib/chat/composer/filter.test.ts +178 -0
- package/src/shared/lib/chat/composer/filter.ts +76 -0
- package/src/shared/lib/chat/composer/keybindings.test.ts +74 -0
- package/src/shared/lib/chat/composer/keybindings.ts +55 -0
- package/src/shared/lib/chat/composer/owned-commands.test.ts +53 -0
- package/src/shared/lib/chat/composer/scope.test.ts +93 -0
- package/src/shared/lib/chat/composer/translate.test.ts +199 -0
- package/src/shared/lib/chat/composer/translate.ts +149 -0
- package/src/shared/lib/chat/composer/trigger.test.ts +276 -0
- package/src/shared/lib/chat/composer/trigger.ts +207 -0
- package/src/shared/lib/chat/composer/tui-only.test.ts +104 -0
- package/src/shared/lib/chat/composer/tui-only.ts +144 -0
- package/src/shared/lib/chat/context/usage.test.ts +73 -0
- package/src/shared/lib/chat/context/usage.ts +77 -0
- package/src/shared/lib/chat/detect-format.ts +38 -0
- package/src/shared/lib/chat/duration.ts +82 -0
- package/src/shared/lib/chat/excerpt.ts +115 -0
- package/src/shared/lib/chat/new-chat-seed.test.ts +51 -0
- package/src/shared/lib/chat/new-chat-seed.ts +36 -0
- package/src/shared/lib/chat/notice-row.test.ts +116 -0
- package/src/shared/lib/chat/notice-row.ts +79 -0
- package/src/shared/lib/chat/notice-text.ts +35 -0
- package/src/shared/lib/chat/omp/abort.ts +41 -0
- package/src/shared/lib/chat/omp/agent-events.test.ts +307 -0
- package/src/shared/lib/chat/omp/agent-events.ts +302 -0
- package/src/shared/lib/chat/omp/available-commands-cache.test.ts +67 -0
- package/src/shared/lib/chat/omp/command-output-ansi.test.ts +84 -0
- package/src/shared/lib/chat/omp/fold-deps.ts +70 -0
- package/src/shared/lib/chat/omp/fold.test.ts +245 -0
- package/src/shared/lib/chat/omp/mode-marker.test.ts +116 -0
- package/src/shared/lib/chat/omp/status.ts +42 -0
- package/src/shared/lib/chat/omp/subagent-frames.ts +51 -0
- package/src/shared/lib/chat/omp/terminal-messages.ts +47 -0
- package/src/shared/lib/chat/omp/tool-details.test.ts +134 -0
- package/src/shared/lib/chat/omp/tool-frames.test.ts +140 -0
- package/src/shared/lib/chat/omp/tool-frames.ts +107 -0
- package/src/shared/lib/chat/omp/tool-results.ts +180 -0
- package/src/shared/lib/chat/omp/transport-frames.test.ts +70 -0
- package/src/shared/lib/chat/omp/transport-frames.ts +95 -0
- package/src/shared/lib/chat/read-sse.ts +99 -0
- package/src/shared/lib/chat/stream-service.ts +197 -0
- package/src/shared/lib/chat/task-result-parser.ts +166 -0
- package/src/shared/lib/chat/text-file.ts +148 -0
- package/src/shared/lib/chat/timeline/command-output.ts +78 -0
- package/src/shared/lib/chat/timeline/omp-callbacks.test.ts +314 -0
- package/src/shared/lib/chat/timeline/omp-callbacks.ts +314 -0
- package/src/shared/lib/chat/timeline/provider-retry.test.ts +120 -0
- package/src/shared/lib/chat/timeline/provider-retry.ts +103 -0
- package/src/shared/lib/chat/timeline/run-footer.test.ts +158 -0
- package/src/shared/lib/chat/timeline/run-footer.ts +146 -0
- package/src/shared/lib/chat/timeline/run-signals.test.ts +87 -0
- package/src/shared/lib/chat/timeline/run-signals.ts +73 -0
- package/src/shared/lib/chat/timeline/steer-report.ts +35 -0
- package/src/shared/lib/chat/timeline/stream-callbacks.ts +202 -0
- package/src/shared/lib/chat/timeline/stream-coalescer.ts +66 -0
- package/src/shared/lib/chat/timeline/stream-raf.test.ts +104 -0
- package/src/shared/lib/chat/timeline/stream-raf.ts +59 -0
- package/src/shared/lib/chat/timeline/stream.test.ts +282 -0
- package/src/shared/lib/chat/timeline/tool-phrases.test.ts +185 -0
- package/src/shared/lib/chat/timeline/tool-phrases.ts +235 -0
- package/src/shared/lib/chat/timeline/tool-verbs.test.ts +229 -0
- package/src/shared/lib/chat/timeline/tool-verbs.ts +180 -0
- package/src/shared/lib/chat/timeline/turns.ts +37 -0
- package/src/shared/lib/chat/title-case.ts +293 -0
- package/src/shared/lib/chat/todo/nested-phase.ts +64 -0
- package/src/shared/lib/chat/todo/parser.test.ts +165 -0
- package/src/shared/lib/chat/todo/parser.ts +262 -0
- package/src/shared/lib/chat/todo/progress.test.ts +265 -0
- package/src/shared/lib/chat/todo/progress.ts +97 -0
- package/src/shared/lib/chat/todo/snapshot.test.ts +156 -0
- package/src/shared/lib/chat/todo/snapshot.ts +215 -0
- package/src/shared/lib/chat/tool/artifact-view.test.ts +66 -0
- package/src/shared/lib/chat/tool/artifact-view.ts +80 -0
- package/src/shared/lib/chat/tool/artifact.test.ts +74 -0
- package/src/shared/lib/chat/tool/artifact.ts +66 -0
- package/src/shared/lib/chat/tool/labels.ts +55 -0
- package/src/shared/lib/chat/tool/output-window.test.ts +69 -0
- package/src/shared/lib/chat/tool/output-window.ts +73 -0
- package/src/shared/lib/chat/tool/proc-facts.ts +93 -0
- package/src/shared/lib/chat/tool/summary-proc.test.ts +118 -0
- package/src/shared/lib/chat/tool/summary-wait.test.ts +92 -0
- package/src/shared/lib/chat/tool/summary.test.ts +329 -0
- package/src/shared/lib/chat/tool/summary.ts +349 -0
- package/src/shared/lib/chat/tool/wait-facts.ts +50 -0
- package/src/shared/lib/chat/tool-output.test.ts +206 -0
- package/src/shared/lib/chat/tool-output.ts +68 -0
- package/src/shared/lib/chat/tool-status.ts +20 -0
- package/src/shared/lib/chat/xml-envelope.test.ts +208 -0
- package/src/shared/lib/chat/xml-envelope.ts +151 -0
- package/src/shared/lib/chat/xml-tag.test.ts +257 -0
- package/src/shared/lib/chat/xml-tag.ts +221 -0
- package/src/shared/lib/code/ansi.ts +24 -0
- package/src/shared/lib/code/editor/commands.test.ts +155 -0
- package/src/shared/lib/code/editor/commands.ts +260 -0
- package/src/shared/lib/code/editor/edits.test.ts +100 -0
- package/src/shared/lib/code/editor/edits.ts +122 -0
- package/src/shared/lib/code/editor/find-status.test.ts +50 -0
- package/src/shared/lib/code/editor/find-status.ts +36 -0
- package/src/shared/lib/code/editor/find.test.ts +203 -0
- package/src/shared/lib/code/editor/find.ts +236 -0
- package/src/shared/lib/code/editor/history.test.ts +118 -0
- package/src/shared/lib/code/editor/history.ts +101 -0
- package/src/shared/lib/code/editor/keymap.test.ts +109 -0
- package/src/shared/lib/code/editor/keymap.ts +151 -0
- package/src/shared/lib/code/editor/layers.test.ts +77 -0
- package/src/shared/lib/code/editor/layers.ts +67 -0
- package/src/shared/lib/code/editor/line-edits.test.ts +131 -0
- package/src/shared/lib/code/editor/line-edits.ts +159 -0
- package/src/shared/lib/code/editor/lines.test.ts +81 -0
- package/src/shared/lib/code/editor/lines.ts +83 -0
- package/src/shared/lib/code/editor/marks.test.ts +86 -0
- package/src/shared/lib/code/editor/marks.ts +106 -0
- package/src/shared/lib/code/editor/occurrences.test.ts +117 -0
- package/src/shared/lib/code/editor/occurrences.ts +111 -0
- package/src/shared/lib/code/editor/palette.test.ts +91 -0
- package/src/shared/lib/code/editor/palette.ts +92 -0
- package/src/shared/lib/code/editor/reset-css.test.ts +35 -0
- package/src/shared/lib/code/editor/reset-css.ts +32 -0
- package/src/shared/lib/code/editor/text-commands.test.ts +178 -0
- package/src/shared/lib/code/editor/text-commands.ts +154 -0
- package/src/shared/lib/code/editor/typography.test.ts +93 -0
- package/src/shared/lib/code/editor/typography.ts +86 -0
- package/src/shared/lib/code/format.ts +17 -0
- package/src/shared/lib/code/highlight-cache.test.ts +121 -0
- package/src/shared/lib/code/highlight-cache.ts +99 -0
- package/src/shared/lib/code/highlighter-lazy.ts +106 -0
- package/src/shared/lib/code/highlighter.ts +132 -0
- package/src/shared/lib/code/language.ts +165 -0
- package/src/shared/lib/code/lazy-window.test.ts +161 -0
- package/src/shared/lib/code/lazy-window.ts +156 -0
- package/src/shared/lib/code/line-endings.test.ts +38 -0
- package/src/shared/lib/code/line-endings.ts +56 -0
- package/src/shared/lib/code/outline/document.ts +56 -0
- package/src/shared/lib/code/outline/extract.test.ts +246 -0
- package/src/shared/lib/code/outline/extract.ts +57 -0
- package/src/shared/lib/code/outline/languages.test.ts +246 -0
- package/src/shared/lib/code/outline/languages.ts +266 -0
- package/src/shared/lib/code/outline/rules.ts +285 -0
- package/src/shared/lib/code/outline/scan.ts +184 -0
- package/src/shared/lib/code/outline/spec.ts +24 -0
- package/src/shared/lib/code/outline/types.ts +87 -0
- package/src/shared/lib/code/outline/walk.ts +231 -0
- package/src/shared/lib/code/parser.ts +237 -0
- package/src/shared/lib/code/shiki-langs.ts +93 -0
- package/src/shared/lib/code/shiki-themes.ts +18 -0
- package/src/shared/lib/code/syntax-highlight.test.ts +340 -0
- package/src/shared/lib/code/syntax-highlight.ts +207 -0
- package/src/shared/lib/code/windowed-highlight.ts +114 -0
- package/src/shared/lib/db/transaction.server.ts +20 -0
- package/src/shared/lib/dictation/audio.ts +75 -0
- package/src/shared/lib/dictation/models.test.ts +95 -0
- package/src/shared/lib/dictation/models.ts +139 -0
- package/src/shared/lib/dictation/protocol.ts +110 -0
- package/src/shared/lib/fonts/NOTICE.md +44 -0
- package/src/shared/lib/fonts/nerd-symbols.css +55 -0
- package/src/shared/lib/fonts/nerd-symbols.test.ts +176 -0
- package/src/shared/lib/fonts/symbols-nerd-font-mono.woff2 +0 -0
- package/src/shared/lib/format/number.test.ts +127 -0
- package/src/shared/lib/format/number.ts +69 -0
- package/src/shared/lib/format/time.test.ts +113 -0
- package/src/shared/lib/format/time.ts +58 -0
- package/src/shared/lib/fs/browse.ts +45 -0
- package/src/shared/lib/fs/clipboard.test.ts +182 -0
- package/src/shared/lib/fs/clipboard.ts +182 -0
- package/src/shared/lib/fs/commit-count.test.ts +50 -0
- package/src/shared/lib/fs/commit-count.ts +34 -0
- package/src/shared/lib/fs/commit-page.ts +10 -0
- package/src/shared/lib/fs/commit-row.ts +65 -0
- package/src/shared/lib/fs/csv.ts +159 -0
- package/src/shared/lib/fs/diff-parser.test.ts +116 -0
- package/src/shared/lib/fs/diff-parser.ts +213 -0
- package/src/shared/lib/fs/document-kind.test.ts +189 -0
- package/src/shared/lib/fs/document-kind.ts +136 -0
- package/src/shared/lib/fs/excerpt-diff.test.ts +130 -0
- package/src/shared/lib/fs/excerpt-diff.ts +127 -0
- package/src/shared/lib/fs/file-kind-classify.test.ts +143 -0
- package/src/shared/lib/fs/file-kind.test.ts +256 -0
- package/src/shared/lib/fs/file-kind.ts +283 -0
- package/src/shared/lib/fs/file-tree.ts +31 -0
- package/src/shared/lib/fs/fs-helpers.test.ts +318 -0
- package/src/shared/lib/fs/git-graph.test.ts +211 -0
- package/src/shared/lib/fs/git-graph.ts +184 -0
- package/src/shared/lib/fs/git-status.test.ts +245 -0
- package/src/shared/lib/fs/git-status.ts +196 -0
- package/src/shared/lib/fs/git-unmerged.test.ts +123 -0
- package/src/shared/lib/fs/git-unmerged.ts +100 -0
- package/src/shared/lib/fs/paths.test.ts +90 -0
- package/src/shared/lib/fs/paths.ts +109 -0
- package/src/shared/lib/fs/repo-groups.ts +85 -0
- package/src/shared/lib/fs/repo-label.test.ts +118 -0
- package/src/shared/lib/fs/repo-label.ts +55 -0
- package/src/shared/lib/fs/search-list.test.ts +139 -0
- package/src/shared/lib/fs/search-list.ts +187 -0
- package/src/shared/lib/fs/search-row.test.ts +66 -0
- package/src/shared/lib/fs/search-row.ts +55 -0
- package/src/shared/lib/git/url.test.ts +69 -0
- package/src/shared/lib/git/url.ts +76 -0
- package/src/shared/lib/markdown/autolink.test.ts +32 -0
- package/src/shared/lib/markdown/autolink.ts +50 -0
- package/src/shared/lib/markdown/directives.ts +96 -0
- package/src/shared/lib/markdown/document-urls.test.ts +68 -0
- package/src/shared/lib/markdown/document-urls.ts +118 -0
- package/src/shared/lib/markdown/fira-code-fonts.css +51 -0
- package/src/shared/lib/markdown/katex-fonts.css +20 -0
- package/src/shared/lib/markdown/katex.ts +111 -0
- package/src/shared/lib/markdown/marked.ts +336 -0
- package/src/shared/lib/markdown/math.test.ts +178 -0
- package/src/shared/lib/markdown/mermaid.ts +169 -0
- package/src/shared/lib/markdown/sanitize.ts +191 -0
- package/src/shared/lib/markdown/table.test.ts +136 -0
- package/src/shared/lib/models/catalog.ts +255 -0
- package/src/shared/lib/models/client.ts +62 -0
- package/src/shared/lib/models/identity.ts +21 -0
- package/src/shared/lib/models/models-shared.test.ts +338 -0
- package/src/shared/lib/models/preferences.test.ts +131 -0
- package/src/shared/lib/models/preferences.ts +88 -0
- package/src/shared/lib/models/provider/cleanup.ts +20 -0
- package/src/shared/lib/models/provider/connection.ts +78 -0
- package/src/shared/lib/models/provider/dialect.test.ts +258 -0
- package/src/shared/lib/models/provider/dialect.ts +208 -0
- package/src/shared/lib/models/provider/glyph.test.ts +116 -0
- package/src/shared/lib/models/provider/glyph.ts +213 -0
- package/src/shared/lib/models/provider/label.ts +40 -0
- package/src/shared/lib/models/provider/models.test.ts +306 -0
- package/src/shared/lib/models/provider/models.ts +227 -0
- package/src/shared/lib/models/provider/presets.test.ts +198 -0
- package/src/shared/lib/models/provider/presets.ts +83 -0
- package/src/shared/lib/models/provider/provider-ui.test.ts +316 -0
- package/src/shared/lib/models/remote-list.ts +125 -0
- package/src/shared/lib/models/server-cache.ts +37 -0
- package/src/shared/lib/models/thinking-levels.test.ts +102 -0
- package/src/shared/lib/models/thinking-levels.ts +68 -0
- package/src/shared/lib/omp/config/access-mode.server.ts +27 -0
- package/src/shared/lib/omp/config/access-mode.ts +31 -0
- package/src/shared/lib/omp/config/schema-extras.ts +252 -0
- package/src/shared/lib/omp/config/schema-types.ts +49 -0
- package/src/shared/lib/omp/config/schema.test.ts +214 -0
- package/src/shared/lib/omp/config/schema.ts +81 -0
- package/src/shared/lib/omp/dialog-methods.ts +57 -0
- package/src/shared/lib/omp/mode/budget.ts +21 -0
- package/src/shared/lib/omp/mode/client-signal.ts +35 -0
- package/src/shared/lib/omp/mode/constants.ts +91 -0
- package/src/shared/lib/omp/mode/format.ts +36 -0
- package/src/shared/lib/omp/mode/markers.test.ts +111 -0
- package/src/shared/lib/omp/mode/markers.ts +105 -0
- package/src/shared/lib/omp/mode/notice.test.ts +107 -0
- package/src/shared/lib/omp/mode/notice.ts +135 -0
- package/src/shared/lib/omp/mode/status.ts +39 -0
- package/src/shared/lib/omp/mode/tables.test.ts +217 -0
- package/src/shared/lib/omp/mode/types.ts +190 -0
- package/src/shared/lib/omp/rpc/frame.test.ts +241 -0
- package/src/shared/lib/omp/rpc/frame.ts +151 -0
- package/src/shared/lib/omp/session/default-title.test.ts +79 -0
- package/src/shared/lib/omp/session/default-title.ts +83 -0
- package/src/shared/lib/omp/session/hashline-patch.test.ts +89 -0
- package/src/shared/lib/omp/session/hashline-patch.ts +134 -0
- package/src/shared/lib/omp/session/inlined-attachments.test.ts +82 -0
- package/src/shared/lib/omp/session/jsonl.test.ts +178 -0
- package/src/shared/lib/omp/session/jsonl.ts +182 -0
- package/src/shared/lib/omp/session/mapper.test.ts +299 -0
- package/src/shared/lib/omp/session/mapper.ts +175 -0
- package/src/shared/lib/omp/session/messages-map.test.ts +340 -0
- package/src/shared/lib/omp/session/messages-map.ts +259 -0
- package/src/shared/lib/omp/session/messages-parse.ts +73 -0
- package/src/shared/lib/omp/session/narration.test.ts +113 -0
- package/src/shared/lib/omp/session/operator-title.test.ts +99 -0
- package/src/shared/lib/omp/session/operator-title.ts +136 -0
- package/src/shared/lib/omp/session/parse-message-blocks-attachments.test.ts +156 -0
- package/src/shared/lib/omp/session/parse-message-blocks-toolcall.test.ts +106 -0
- package/src/shared/lib/omp/session/parse-message-blocks.test.ts +322 -0
- package/src/shared/lib/omp/session/parse-message-blocks.ts +328 -0
- package/src/shared/lib/omp/session/prewarm-misc.test.ts +326 -0
- package/src/shared/lib/omp/session/prewarm.ts +41 -0
- package/src/shared/lib/omp/session/proc.test.ts +256 -0
- package/src/shared/lib/omp/session/proc.ts +322 -0
- package/src/shared/lib/omp/session/schema-migrations.ts +35 -0
- package/src/shared/lib/omp/session/sidebar.test.ts +180 -0
- package/src/shared/lib/omp/session/sidebar.ts +77 -0
- package/src/shared/lib/omp/session/skill-bubble.test.ts +94 -0
- package/src/shared/lib/omp/session/stream-heal.server.test.ts +123 -0
- package/src/shared/lib/omp/session/stream-heal.server.ts +175 -0
- package/src/shared/lib/omp/session/stream-state.server.test.ts +106 -0
- package/src/shared/lib/omp/session/stream-state.server.ts +199 -0
- package/src/shared/lib/omp/session/telemetry-blocks.ts +60 -0
- package/src/shared/lib/omp/session/timestamps.ts +20 -0
- package/src/shared/lib/omp/session/tool-duration.test.ts +61 -0
- package/src/shared/lib/omp/session/tool-images.test.ts +95 -0
- package/src/shared/lib/omp/session/tool-images.ts +98 -0
- package/src/shared/lib/omp/session/turn-error.ts +40 -0
- package/src/shared/lib/omp/session/wait.test.ts +167 -0
- package/src/shared/lib/omp/session/wait.ts +267 -0
- package/src/shared/lib/omp/subagent/control.ts +46 -0
- package/src/shared/lib/omp/subagent/history/client.ts +76 -0
- package/src/shared/lib/omp/subagent/history/settlement.test.ts +344 -0
- package/src/shared/lib/omp/subagent/history/settlement.ts +113 -0
- package/src/shared/lib/omp/subagent/history/status.ts +40 -0
- package/src/shared/lib/omp/subagent/label.test.ts +94 -0
- package/src/shared/lib/omp/subagent/label.ts +84 -0
- package/src/shared/lib/omp/subagent/parse.test.ts +88 -0
- package/src/shared/lib/omp/subagent/parse.ts +301 -0
- package/src/shared/lib/omp/subagent/result-details.ts +53 -0
- package/src/shared/lib/omp/subagent/transcript-client.test.ts +100 -0
- package/src/shared/lib/omp/subagent/transcript-client.ts +194 -0
- package/src/shared/lib/panels/capabilities.test.ts +78 -0
- package/src/shared/lib/panels/capabilities.ts +40 -0
- package/src/shared/lib/panels/css-scope.test.ts +98 -0
- package/src/shared/lib/panels/css-scope.ts +171 -0
- package/src/shared/lib/panels/resolve-asset.test.ts +74 -0
- package/src/shared/lib/panels/resolve-asset.ts +45 -0
- package/src/shared/lib/plugins/protocol.ts +70 -0
- package/src/shared/lib/realtime/client.ts +328 -0
- package/src/shared/lib/realtime/connection.test.ts +301 -0
- package/src/shared/lib/realtime/connection.ts +314 -0
- package/src/shared/lib/realtime/protocol.ts +297 -0
- package/src/shared/lib/realtime/state.ts +174 -0
- package/src/shared/lib/schedule/parse.test.ts +187 -0
- package/src/shared/lib/schedule/parse.ts +303 -0
- package/src/shared/lib/settings/client.test.ts +72 -0
- package/src/shared/lib/settings/client.ts +129 -0
- package/src/shared/lib/settings/diff.test.ts +31 -0
- package/src/shared/lib/settings/diff.ts +37 -0
- package/src/shared/lib/settings/keys.ts +51 -0
- package/src/shared/lib/theme/catalog.test.ts +168 -0
- package/src/shared/lib/theme/catalog.ts +98 -0
- package/src/shared/lib/theme/chrome.test.ts +53 -0
- package/src/shared/lib/theme/chrome.ts +41 -0
- package/src/shared/lib/theme/color.test.ts +102 -0
- package/src/shared/lib/theme/color.ts +88 -0
- package/src/shared/lib/theme/css.ts +70 -0
- package/src/shared/lib/theme/palettes/dark.ts +313 -0
- package/src/shared/lib/theme/palettes/kabmo.ts +61 -0
- package/src/shared/lib/theme/palettes/light.ts +313 -0
- package/src/shared/lib/theme/theme.test.ts +199 -0
- package/src/shared/lib/ui/key-binding.test.ts +134 -0
- package/src/shared/lib/ui/key-binding.ts +143 -0
- package/src/shared/lib/updates/popup-state.test.ts +98 -0
- package/src/shared/lib/updates/popup-state.ts +67 -0
- package/src/shared/lib/updates/popup.test.ts +30 -0
- package/src/shared/lib/updates/progress.test.ts +54 -0
- package/src/shared/lib/updates/progress.ts +50 -0
- package/src/shared/lib/updates/semver.test.ts +147 -0
- package/src/shared/lib/updates/semver.ts +109 -0
- package/src/shared/lib/util/guards.test.ts +48 -0
- package/src/shared/lib/util/guards.ts +14 -0
- package/src/shared/lib/util/platform.test.ts +87 -0
- package/src/shared/lib/util/platform.ts +30 -0
- package/src/shared/lib/wiki/document-urls.test.ts +85 -0
- package/src/shared/lib/wiki/document-urls.ts +109 -0
- package/src/shared/lib/wiki/pages.test.ts +265 -0
- package/src/shared/lib/wiki/pages.ts +242 -0
- package/src/shared/lib/wiki/sidebar.test.ts +265 -0
- package/src/shared/lib/wiki/sidebar.ts +170 -0
- package/src/shared/lib/workspace/active-project.ts +42 -0
- package/src/shared/lib/workspace/batch-select.test.ts +92 -0
- package/src/shared/lib/workspace/batch-select.ts +86 -0
- package/src/shared/lib/workspace/file-tab-id.ts +29 -0
- package/src/shared/lib/workspace/keymap.test.ts +82 -0
- package/src/shared/lib/workspace/keymap.ts +30 -0
- package/src/shared/lib/workspace/panel-ids.test.ts +66 -0
- package/src/shared/lib/workspace/panel-ids.ts +59 -0
- package/src/shared/lib/workspace/panel-order.test.ts +133 -0
- package/src/shared/lib/workspace/panel-order.ts +127 -0
- package/src/shared/lib/workspace/panel-widths.test.ts +276 -0
- package/src/shared/lib/workspace/panel-widths.ts +329 -0
- package/src/shared/lib/workspace/project-icon.ts +29 -0
- package/src/shared/lib/workspace/project-settings-migration.ts +62 -0
- package/src/shared/lib/workspace/project-settings.test.ts +350 -0
- package/src/shared/lib/workspace/project-settings.ts +139 -0
- package/src/shared/lib/workspace/refresh-cadence.test.ts +117 -0
- package/src/shared/lib/workspace/refresh-cadence.ts +58 -0
- package/src/shared/lib/workspace/relative-time.ts +25 -0
- package/src/shared/lib/workspace/right-panels.ts +110 -0
- package/src/shared/lib/workspace/schema-migrations.ts +19 -0
- package/src/shared/lib/workspace/scroll-positions.test.ts +82 -0
- package/src/shared/lib/workspace/scroll-positions.ts +101 -0
- package/src/shared/lib/workspace/session-state/listeners.ts +70 -0
- package/src/shared/lib/workspace/session-state/store.test.ts +328 -0
- package/src/shared/lib/workspace/session-state/store.ts +330 -0
- package/src/shared/lib/workspace/session-visibility.test.ts +117 -0
- package/src/shared/lib/workspace/session-visibility.ts +76 -0
- package/src/shared/lib/workspace/sidebar-expanded.ts +23 -0
- package/src/shared/lib/workspace/sidebar-sort.test.ts +210 -0
- package/src/shared/lib/workspace/sidebar-sort.ts +140 -0
- package/src/shared/lib/workspace/sidebar-toolbar.test.ts +77 -0
- package/src/shared/lib/workspace/sidebar-toolbar.ts +106 -0
- package/src/shared/lib/workspace/sidebar-width.test.ts +111 -0
- package/src/shared/lib/workspace/sidebar-width.ts +106 -0
- package/src/shared/lib/workspace/terminal/keys.test.ts +189 -0
- package/src/shared/lib/workspace/terminal/keys.ts +225 -0
- package/src/shared/lib/workspace/terminal/protocol.test.ts +242 -0
- package/src/shared/lib/workspace/terminal/protocol.ts +222 -0
- package/src/shared/lib/workspace/workspace-modules.test.ts +300 -0
- package/src/shared/types/browser.ts +58 -0
- package/src/shared/types/btw.ts +123 -0
- package/src/shared/types/chat.ts +330 -0
- package/src/shared/types/context.ts +87 -0
- package/src/shared/types/fs.ts +77 -0
- package/src/shared/types/git.ts +169 -0
- package/src/shared/types/index.ts +31 -0
- package/src/shared/types/models.ts +101 -0
- package/src/shared/types/omp/agent.ts +223 -0
- package/src/shared/types/omp/instructions.ts +38 -0
- package/src/shared/types/omp/session.ts +156 -0
- package/src/shared/types/omp/subagent.ts +186 -0
- package/src/shared/types/panels.ts +334 -0
- package/src/shared/types/plan.ts +42 -0
- package/src/shared/types/realtime.ts +34 -0
- package/src/shared/types/schedule.ts +67 -0
- package/src/shared/types/settings/agent.ts +16 -0
- package/src/shared/types/settings/command.ts +38 -0
- package/src/shared/types/settings/mcp.ts +22 -0
- package/src/shared/types/settings/plugin.ts +107 -0
- package/src/shared/types/settings/project.ts +18 -0
- package/src/shared/types/settings/provider.ts +135 -0
- package/src/shared/types/settings/skill.ts +48 -0
- package/src/shared/types/settings/state.ts +81 -0
- package/src/shared/types/settings/usage.ts +237 -0
- package/src/shared/types/terminal.ts +12 -0
- package/src/shared/types/theme.ts +48 -0
- package/src/shared/types/todo.ts +108 -0
- package/src/shared/types/tokenUsage.ts +44 -0
- package/src/shared/types/updates.ts +99 -0
- package/src/shared/types/wiki.ts +132 -0
- package/src/shared/types/workspace.ts +69 -0
- package/src/test-support/executable-stub.ts +107 -0
- package/src/test-support/fake-git.ts +121 -0
- package/src/test-support/fake-omp-fork.ts +146 -0
- package/src/test-support/file-actions.test-util.ts +206 -0
- package/src/test-support/file-clipboard.test-util.ts +52 -0
- package/src/test-support/file-editor.test-util.ts +182 -0
- package/src/test-support/file-explorer.test-util.ts +317 -0
- package/src/test-support/isolated-db.ts +51 -0
- package/src/test-support/peer-harness.ts +205 -0
- package/src/test-support/platform.test.ts +48 -0
- package/src/test-support/platform.ts +51 -0
- package/src/test-support/pristine-globals.ts +124 -0
- package/src/test-support/realtime-server.ts +154 -0
- package/src/test-support/remove-dir.ts +78 -0
- package/tsconfig.json +67 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* OS file drag-and-drop for the chat composer.
|
|
8
|
+
*
|
|
9
|
+
* Three browser rules shape this module:
|
|
10
|
+
*
|
|
11
|
+
* 1. A `drop` is only delivered when the preceding `dragover` was cancelled, so
|
|
12
|
+
* the handlers belong on the whole composer card — a drop aimed at the
|
|
13
|
+
* textarea bubbles up to it, and cancelling there also suppresses the
|
|
14
|
+
* browser's own "insert the dropped file's path as text" default.
|
|
15
|
+
* 2. A dropped DIRECTORY is not a readable File: `dataTransfer.files` carries a
|
|
16
|
+
* size-0 stub for it. Only `DataTransferItem.webkitGetAsEntry()` reveals it
|
|
17
|
+
* as a directory, so those are walked recursively and attached file by file.
|
|
18
|
+
* 3. A file dropped anywhere the app does not cancel lands in the tab as
|
|
19
|
+
* `file://` navigation, which throws Kabmo away. The guard below is
|
|
20
|
+
* window-wide for exactly that reason; it only ever cancels file drags, so
|
|
21
|
+
* text and URL drops keep their native behaviour.
|
|
22
|
+
*
|
|
23
|
+
* What counts as a file drag is decided in `drop-payload.ts`, because hosts
|
|
24
|
+
* disagree: a download dragged out of a web page offers no File at all, only a
|
|
25
|
+
* URL, and those references are handed back to the caller to resolve.
|
|
26
|
+
*
|
|
27
|
+
* The drag data store is cleared the moment the drop handler returns, so every
|
|
28
|
+
* store-bound read (`getAsFile`, `webkitGetAsEntry`, `getData`) happens
|
|
29
|
+
* synchronously; the entries and Files they return stay valid while the walk
|
|
30
|
+
* awaits.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import { useCallback, useEffect, useRef, useState } from 'preact/hooks';
|
|
34
|
+
import type { TargetedDragEvent } from 'preact';
|
|
35
|
+
import { collectDroppedFileUris, hasDraggedFiles } from '@/client/hooks/chat/composer/drop-payload';
|
|
36
|
+
import { primeFileReads, primedPrefix } from '@/client/hooks/chat/composer/file-reads';
|
|
37
|
+
import type { PrimedReads } from '@/client/hooks/chat/composer/file-reads';
|
|
38
|
+
import {
|
|
39
|
+
expandDroppedFiles,
|
|
40
|
+
readDroppedEntries,
|
|
41
|
+
MAX_DROP_DEPTH,
|
|
42
|
+
MAX_DROPPED_FILES,
|
|
43
|
+
} from '@/client/hooks/chat/composer/drop-entries';
|
|
44
|
+
import type { DroppedEntries } from '@/client/hooks/chat/composer/drop-entries';
|
|
45
|
+
|
|
46
|
+
/** Reason shown when a drop yielded more than the composer can take. */
|
|
47
|
+
export const DROP_LIMIT_NOTICE =
|
|
48
|
+
`Some files were skipped — a drop is limited to ${MAX_DROPPED_FILES} files and ${MAX_DROP_DEPTH} folder levels deep.`;
|
|
49
|
+
|
|
50
|
+
export interface UseFileDropOptions {
|
|
51
|
+
/**
|
|
52
|
+
* Called once per drop with every file it resolved to (directories expanded),
|
|
53
|
+
* plus any file REFERENCES the host offered instead of bytes (a download
|
|
54
|
+
* dragged out of a web page) for the caller to resolve server-side.
|
|
55
|
+
*/
|
|
56
|
+
onFiles: (files: File[], incomplete: boolean, references: string[], primed: PrimedReads) => void;
|
|
57
|
+
/** While true a drop is cancelled but not attached — the composer is closed. */
|
|
58
|
+
disabled?: boolean;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Drag handlers to spread onto the drop target. */
|
|
62
|
+
export interface FileDropProps {
|
|
63
|
+
onDragEnter: (e: TargetedDragEvent<HTMLElement>) => void;
|
|
64
|
+
onDragOver: (e: TargetedDragEvent<HTMLElement>) => void;
|
|
65
|
+
onDragLeave: (e: TargetedDragEvent<HTMLElement>) => void;
|
|
66
|
+
onDrop: (e: TargetedDragEvent<HTMLElement>) => void;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface UseFileDropResult {
|
|
70
|
+
/** True while a file drag hovers the bound element (drives the overlay). */
|
|
71
|
+
isDragging: boolean;
|
|
72
|
+
dropProps: FileDropProps;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function useFileDrop({ onFiles, disabled = false }: UseFileDropOptions): UseFileDropResult {
|
|
76
|
+
const [isDragging, setIsDragging] = useState(false);
|
|
77
|
+
// dragenter/dragleave fire for every nested child the pointer crosses, so a
|
|
78
|
+
// boolean flag drops to false the instant the cursor moves from the card onto
|
|
79
|
+
// the textarea. Counting them keeps the overlay steady.
|
|
80
|
+
const depthRef = useRef(0);
|
|
81
|
+
// Latest callback and flag behind refs, so the handlers stay referentially
|
|
82
|
+
// stable and the window guard sees the current `disabled`.
|
|
83
|
+
const onFilesRef = useRef(onFiles);
|
|
84
|
+
onFilesRef.current = onFiles;
|
|
85
|
+
const disabledRef = useRef(disabled);
|
|
86
|
+
disabledRef.current = disabled;
|
|
87
|
+
|
|
88
|
+
const reset = useCallback(() => {
|
|
89
|
+
depthRef.current = 0;
|
|
90
|
+
setIsDragging(false);
|
|
91
|
+
}, []);
|
|
92
|
+
|
|
93
|
+
// A drag can end without reaching this element again — released over the
|
|
94
|
+
// page, cancelled with Escape, or its source node unmounted mid-drag. The
|
|
95
|
+
// composer's own handlers have already run by the time these fire, so this
|
|
96
|
+
// only clears state the drop handler did not.
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
window.addEventListener('dragend', reset);
|
|
99
|
+
window.addEventListener('drop', reset);
|
|
100
|
+
return () => {
|
|
101
|
+
window.removeEventListener('dragend', reset);
|
|
102
|
+
window.removeEventListener('drop', reset);
|
|
103
|
+
};
|
|
104
|
+
}, [reset]);
|
|
105
|
+
|
|
106
|
+
// Files dropped anywhere else would navigate the tab to `file://` and discard
|
|
107
|
+
// Kabmo, so the default is cancelled app-wide. This runs after the
|
|
108
|
+
// composer's own drop handler (the event bubbles up to window), by which point
|
|
109
|
+
// that handler has already read the data store it needed.
|
|
110
|
+
useEffect(() => {
|
|
111
|
+
const guard = (e: DragEvent) => {
|
|
112
|
+
if (hasDraggedFiles(e.dataTransfer)) e.preventDefault();
|
|
113
|
+
};
|
|
114
|
+
window.addEventListener('dragover', guard);
|
|
115
|
+
window.addEventListener('drop', guard);
|
|
116
|
+
return () => {
|
|
117
|
+
window.removeEventListener('dragover', guard);
|
|
118
|
+
window.removeEventListener('drop', guard);
|
|
119
|
+
};
|
|
120
|
+
}, []);
|
|
121
|
+
|
|
122
|
+
const onDragEnter = useCallback((e: TargetedDragEvent<HTMLElement>) => {
|
|
123
|
+
if (!hasDraggedFiles(e.dataTransfer)) return;
|
|
124
|
+
e.preventDefault();
|
|
125
|
+
if (disabledRef.current) return;
|
|
126
|
+
depthRef.current += 1;
|
|
127
|
+
setIsDragging(true);
|
|
128
|
+
}, []);
|
|
129
|
+
|
|
130
|
+
const onDragOver = useCallback((e: TargetedDragEvent<HTMLElement>) => {
|
|
131
|
+
if (!hasDraggedFiles(e.dataTransfer)) return;
|
|
132
|
+
// Required: without it the browser refuses the drop and navigates to the
|
|
133
|
+
// file instead of handing it to the app.
|
|
134
|
+
e.preventDefault();
|
|
135
|
+
if (!e.dataTransfer) return;
|
|
136
|
+
// `none` is the only cursor that tells the truth about a closed composer.
|
|
137
|
+
e.dataTransfer.dropEffect = disabledRef.current ? 'none' : 'copy';
|
|
138
|
+
}, []);
|
|
139
|
+
|
|
140
|
+
// Not gated on the payload: `dataTransfer.types` can already be empty on
|
|
141
|
+
// dragleave. The counter is the gate — a text drag never raised it.
|
|
142
|
+
const onDragLeave = useCallback(() => {
|
|
143
|
+
if (depthRef.current === 0) return;
|
|
144
|
+
depthRef.current -= 1;
|
|
145
|
+
if (depthRef.current === 0) setIsDragging(false);
|
|
146
|
+
}, []);
|
|
147
|
+
|
|
148
|
+
const onDrop = useCallback((e: TargetedDragEvent<HTMLElement>) => {
|
|
149
|
+
const dt = e.dataTransfer;
|
|
150
|
+
// Read the payload in ONE pass before anything else touches it:
|
|
151
|
+
// `getAsFile()` and `webkitGetAsEntry()` are not pure accessors on a
|
|
152
|
+
// file-manager drag, and each call can consume state the other needs.
|
|
153
|
+
const entries: DroppedEntries = dt ? readDroppedEntries(dt) : { files: [], directories: [], fallbacks: new Map() };
|
|
154
|
+
const references = dt ? collectDroppedFileUris(dt) : [];
|
|
155
|
+
|
|
156
|
+
if (!dt || !hasDraggedFiles(dt)) return;
|
|
157
|
+
e.preventDefault();
|
|
158
|
+
reset();
|
|
159
|
+
if (disabledRef.current) return;
|
|
160
|
+
|
|
161
|
+
// START THE READS NOW, in the drop handler's own tick. A dropped File's
|
|
162
|
+
// read permission is released when this handler returns, and a read started
|
|
163
|
+
// afterwards fails permanently — the chip rendered with the right name and
|
|
164
|
+
// size while its contents never arrived, on every retry. `FileReader` takes
|
|
165
|
+
// the permission at call time, so starting here is what makes the bytes
|
|
166
|
+
// reachable; the pipeline only awaits these later.
|
|
167
|
+
const primed = primeFileReads(entries.files, entries.fallbacks);
|
|
168
|
+
|
|
169
|
+
if (entries.files.length === 0 && entries.directories.length === 0) {
|
|
170
|
+
// No File at all: the host named the file without handing it over, and the
|
|
171
|
+
// reference resolver is the only route left to its contents.
|
|
172
|
+
if (references.length > 0) onFilesRef.current([], false, references, primed);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
void expandDroppedFiles(entries).then(async ({ files: resolved, incomplete }) => {
|
|
177
|
+
const carries = resolved.length > 0 ? await carriesBytes(resolved, primed) : false;
|
|
178
|
+
// A File that carries bytes is attached directly. Deciding from metadata
|
|
179
|
+
// instead — "size 0 and no type, so it must be a path stub" — misread a
|
|
180
|
+
// real file whose size the browser had not filled in, and sent it to the
|
|
181
|
+
// reference resolver, which only reads inside the allow-list. The file
|
|
182
|
+
// was then refused with no way for the user to tell why. Bytes settle it.
|
|
183
|
+
if (resolved.length > 0 && carries) {
|
|
184
|
+
onFilesRef.current(resolved, incomplete, [], primed);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (references.length > 0) {
|
|
188
|
+
onFilesRef.current([], incomplete, references, primed);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
// Files that declare no bytes are attached as-is; the attachment hook
|
|
192
|
+
// reports the ones that never produced content.
|
|
193
|
+
if (resolved.length > 0) onFilesRef.current(resolved, incomplete, [], primed);
|
|
194
|
+
});
|
|
195
|
+
}, [reset]);
|
|
196
|
+
|
|
197
|
+
return { isDragging, dropProps: { onDragEnter, onDragOver, onDragLeave, onDrop } };
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Whether any dropped file actually holds bytes.
|
|
202
|
+
*
|
|
203
|
+
* A promised file (another app's drag) reports `size: 0` until its contents
|
|
204
|
+
* land, so the check reads rather than trusting the declared size. One readable
|
|
205
|
+
* file is enough: the batch is attached as a unit, and a member that stays
|
|
206
|
+
* empty is reported by the attachment hook rather than by re-routing the whole
|
|
207
|
+
* drop.
|
|
208
|
+
*/
|
|
209
|
+
export async function carriesBytes(files: File[], primed?: PrimedReads): Promise<boolean> {
|
|
210
|
+
const sample = files.slice(0, 4);
|
|
211
|
+
const results = await Promise.all(sample.map(async (file) => {
|
|
212
|
+
if (file.size > 0) return true;
|
|
213
|
+
// A stub declaring no size is settled by its bytes — read from the primed
|
|
214
|
+
// prefix where the drop provided one, because a `slice()` started after the
|
|
215
|
+
// drop window closes is not authorized to read a dropped file at all.
|
|
216
|
+
const bytes = await primedPrefix(file, primed);
|
|
217
|
+
if (bytes !== undefined) return bytes.byteLength > 0;
|
|
218
|
+
try {
|
|
219
|
+
const raw = await file.slice(0, 1).arrayBuffer();
|
|
220
|
+
return raw.byteLength > 0;
|
|
221
|
+
} catch {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
}));
|
|
225
|
+
return results.some(Boolean);
|
|
226
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The priming contract, which is a TIMING contract.
|
|
8
|
+
*
|
|
9
|
+
* A dropped `File` may only be read from a read begun while the drop handler is
|
|
10
|
+
* still running; a read started afterwards fails with `NotReadableError` and
|
|
11
|
+
* keeps failing. These tests pin the two halves of that: `primeFileReads`
|
|
12
|
+
* issues its read synchronously, and the read pipeline consumes the primed
|
|
13
|
+
* result instead of starting a second, unauthorized one.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { afterEach, describe, expect, test } from 'bun:test';
|
|
17
|
+
import { primeFileReads, readFileTextWithRetry } from '@/client/hooks/chat/composer/file-reads';
|
|
18
|
+
|
|
19
|
+
/** A `FileReader` that answers from a lookup, counting the reads it was asked for. */
|
|
20
|
+
function installFakeReader(
|
|
21
|
+
contents: Map<string, string>,
|
|
22
|
+
options: { failDataUrl?: boolean; unreadable?: Set<File> } = {},
|
|
23
|
+
) {
|
|
24
|
+
const calls: string[] = [];
|
|
25
|
+
/** A file the browser refuses to read, whatever its metadata says. */
|
|
26
|
+
const dead = (file: File) => options.unreadable?.has(file) ?? false;
|
|
27
|
+
class FakeReader {
|
|
28
|
+
result: string | ArrayBuffer | null = null;
|
|
29
|
+
error: { name: string; message: string } | null = null;
|
|
30
|
+
onload: (() => void) | null = null;
|
|
31
|
+
onerror: (() => void) | null = null;
|
|
32
|
+
onabort: (() => void) | null = null;
|
|
33
|
+
|
|
34
|
+
readAsArrayBuffer() {
|
|
35
|
+
calls.push('arrayBuffer');
|
|
36
|
+
queueMicrotask(() => {
|
|
37
|
+
if (options.failDataUrl) {
|
|
38
|
+
this.error = { name: 'NotReadableError', message: 'unreadable' };
|
|
39
|
+
this.onerror?.();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.result = new Uint8Array([1, 2, 3]).buffer;
|
|
43
|
+
this.onload?.();
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
readAsDataURL(file: File) {
|
|
48
|
+
calls.push(`dataURL:${file.name}`);
|
|
49
|
+
const body = dead(file) ? undefined : contents.get(file.name);
|
|
50
|
+
queueMicrotask(() => {
|
|
51
|
+
if (options.failDataUrl || body === undefined) {
|
|
52
|
+
this.error = {
|
|
53
|
+
name: 'NotReadableError',
|
|
54
|
+
message: 'permission problems that have occurred after a reference to a file was acquired',
|
|
55
|
+
};
|
|
56
|
+
this.onerror?.();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// `data:<mime>;base64,<payload>` — the real reader's shape.
|
|
60
|
+
const base64 = btoa(String.fromCharCode(...new TextEncoder().encode(body)));
|
|
61
|
+
this.result = `data:text/plain;base64,${base64}`;
|
|
62
|
+
this.onload?.();
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
readAsText(file: File) {
|
|
67
|
+
calls.push(`text:${file.name}`);
|
|
68
|
+
const body = dead(file) ? undefined : contents.get(file.name);
|
|
69
|
+
queueMicrotask(() => {
|
|
70
|
+
if (body === undefined) {
|
|
71
|
+
this.error = { name: 'NotReadableError', message: 'unreadable' };
|
|
72
|
+
this.onerror?.();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.result = body;
|
|
76
|
+
this.onload?.();
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
(globalThis as unknown as { FileReader: unknown }).FileReader = FakeReader;
|
|
81
|
+
return calls;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const originalFileReader = (globalThis as unknown as { FileReader: unknown }).FileReader;
|
|
85
|
+
|
|
86
|
+
afterEach(() => {
|
|
87
|
+
(globalThis as unknown as { FileReader: unknown }).FileReader = originalFileReader;
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
describe('primeFileReads', () => {
|
|
91
|
+
test('starts the read synchronously, in the caller\'s own tick', () => {
|
|
92
|
+
const calls = installFakeReader(new Map([['a.md', 'body']]));
|
|
93
|
+
const file = new File(['body'], 'a.md', { type: 'text/markdown' });
|
|
94
|
+
|
|
95
|
+
primeFileReads([file]);
|
|
96
|
+
|
|
97
|
+
// The point of the module: the calls are already made when this returns. A
|
|
98
|
+
// read deferred to a microtask would be outside the drop handler's tick and
|
|
99
|
+
// therefore unauthorized.
|
|
100
|
+
expect(calls.filter((c) => c.startsWith('dataURL:'))).toEqual(['dataURL:a.md']);
|
|
101
|
+
expect(calls.filter((c) => c === 'arrayBuffer').length).toBe(1);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('reads each file once however many batches carry it', () => {
|
|
105
|
+
const calls = installFakeReader(new Map([['a.md', 'body']]));
|
|
106
|
+
const file = new File(['body'], 'a.md', { type: 'text/markdown' });
|
|
107
|
+
|
|
108
|
+
primeFileReads([file, file]);
|
|
109
|
+
|
|
110
|
+
expect(calls.filter((c) => c.startsWith('dataURL:'))).toEqual(['dataURL:a.md']);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('stays inside the attach cap, so an oversized drop is not read whole', () => {
|
|
114
|
+
const calls = installFakeReader(new Map());
|
|
115
|
+
const files = Array.from({ length: 80 }, (_, i) => new File(['x'], `f${i}.txt`));
|
|
116
|
+
|
|
117
|
+
primeFileReads(files);
|
|
118
|
+
|
|
119
|
+
expect(calls.filter((c) => c.startsWith('dataURL:')).length).toBeLessThanOrEqual(50);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe('a drop that exposes one file as two objects', () => {
|
|
124
|
+
// A drop can hand over the same file twice — once in `files`, once in the item
|
|
125
|
+
// list — and only one of the two objects actually reads. Which one is not
|
|
126
|
+
// knowable up front: the same drop read fine in a browser tab and failed in an
|
|
127
|
+
// installed app window, with the unreadable object still reporting the right
|
|
128
|
+
// name and size. So the read path tries the counterpart instead of trusting
|
|
129
|
+
// the choice.
|
|
130
|
+
test('falls back to the counterpart object when the primary will not read', async () => {
|
|
131
|
+
const primary = new File(['x'.repeat(40)], 'notes.md', { type: 'text/markdown' });
|
|
132
|
+
const counterpart = new File(['rescued body'], 'notes.md', { type: 'text/markdown' });
|
|
133
|
+
// The primary refuses to read while declaring bytes; the counterpart reads.
|
|
134
|
+
const calls = installFakeReader(
|
|
135
|
+
new Map([['notes.md', 'rescued body']]),
|
|
136
|
+
{ unreadable: new Set([primary]) },
|
|
137
|
+
);
|
|
138
|
+
const primed = primeFileReads([primary], new Map([[primary, counterpart]]));
|
|
139
|
+
|
|
140
|
+
const content = await readFileTextWithRetry(primary, primed);
|
|
141
|
+
|
|
142
|
+
expect(content).toBe('rescued body');
|
|
143
|
+
expect(calls.filter((c) => c.startsWith('dataURL:')).length).toBe(2);
|
|
144
|
+
|
|
145
|
+
// Not vacuous: with no counterpart primed the same file stays unreadable,
|
|
146
|
+
// which is exactly the failure this pairing exists to prevent.
|
|
147
|
+
const alone = primeFileReads([primary]);
|
|
148
|
+
expect(await readFileTextWithRetry(primary, alone)).toBeNull();
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('the counterpart is primed in the same tick, not read on demand', () => {
|
|
152
|
+
const primary = new File(['x'], 'a.md', { type: 'text/markdown' });
|
|
153
|
+
const counterpart = new File(['y'], 'a.md', { type: 'text/markdown' });
|
|
154
|
+
const calls = installFakeReader(new Map());
|
|
155
|
+
|
|
156
|
+
primeFileReads([primary], new Map([[primary, counterpart]]));
|
|
157
|
+
|
|
158
|
+
// Both reads must already be in flight when the call returns: one started
|
|
159
|
+
// later would be outside the drop's permission window.
|
|
160
|
+
expect(calls.filter((c) => c.startsWith('dataURL:')).length).toBe(2);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe('readFileTextWithRetry with a primed read', () => {
|
|
165
|
+
test('returns the primed body without starting another read', async () => {
|
|
166
|
+
const calls = installFakeReader(new Map([['a.md', 'primed body']]));
|
|
167
|
+
const file = new File(['primed body'], 'a.md', { type: 'text/markdown' });
|
|
168
|
+
const primed = primeFileReads([file]);
|
|
169
|
+
|
|
170
|
+
const content = await readFileTextWithRetry(file, primed);
|
|
171
|
+
|
|
172
|
+
expect(content).toBe('primed body');
|
|
173
|
+
// Exactly one read: a second would be the unauthorized one, and its failure
|
|
174
|
+
// would be indistinguishable from an unreadable file.
|
|
175
|
+
expect(calls.filter((c) => c.startsWith('dataURL:'))).toEqual(['dataURL:a.md']);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
test('falls back to its own reads when the file was never primed', async () => {
|
|
179
|
+
const calls = installFakeReader(new Map([['b.md', 'late body']]));
|
|
180
|
+
const file = new File(['late body'], 'b.md', { type: 'text/markdown' });
|
|
181
|
+
|
|
182
|
+
const content = await readFileTextWithRetry(file);
|
|
183
|
+
|
|
184
|
+
expect(content).toBe('late body');
|
|
185
|
+
expect(calls.length).toBeGreaterThan(0);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
test('retries a primed read that came back empty, for a promised file', async () => {
|
|
189
|
+
// The primed read lands before the bytes do; the retry loop is what covers
|
|
190
|
+
// that, so it must not be short-circuited by the primed attempt.
|
|
191
|
+
const calls = installFakeReader(new Map());
|
|
192
|
+
const file = new File(['x'.repeat(100)], 'promised.md', { type: 'text/markdown' });
|
|
193
|
+
const primed = primeFileReads([file]);
|
|
194
|
+
|
|
195
|
+
const content = await readFileTextWithRetry(file, primed);
|
|
196
|
+
|
|
197
|
+
// Null, not '': the file DECLARES bytes, so an empty body is a failure the
|
|
198
|
+
// caller reports rather than a genuinely empty file it accepts.
|
|
199
|
+
expect(content).toBeNull();
|
|
200
|
+
expect(calls.filter((c) => c === 'text:promised.md').length).toBeGreaterThan(1);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
test('accepts an empty body for a file that declares no bytes', async () => {
|
|
204
|
+
// A genuinely empty file is empty forever; retrying it cannot change that,
|
|
205
|
+
// so it settles as empty rather than as a failure.
|
|
206
|
+
installFakeReader(new Map());
|
|
207
|
+
const file = new File([], 'empty.md', { type: 'text/markdown' });
|
|
208
|
+
|
|
209
|
+
expect(await readFileTextWithRetry(file, primeFileReads([file]))).toBe('');
|
|
210
|
+
});
|
|
211
|
+
});
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Reading a dropped `File`'s bytes — and the one browser rule that makes the
|
|
8
|
+
* TIMING of that read part of the contract.
|
|
9
|
+
*
|
|
10
|
+
* A file that arrives through a drop is not an ordinary `Blob`. The browser
|
|
11
|
+
* holds a permission reference to the real file, and that reference is released
|
|
12
|
+
* when the `drop` event's handler returns. A read started after that point
|
|
13
|
+
* fails with `NotReadableError: ... permission problems that have occurred
|
|
14
|
+
* after a reference to a file was acquired`, and it fails PERMANENTLY — every
|
|
15
|
+
* retry after it fails the same way, because the reference is gone rather than
|
|
16
|
+
* busy. This is why a dropped file showed a chip with a correct name and size
|
|
17
|
+
* while its contents never arrived, and why three retries did not help.
|
|
18
|
+
*
|
|
19
|
+
* `FileReader.readAs*` checks the permission when it is CALLED, not when it
|
|
20
|
+
* completes. So the read must be STARTED synchronously inside the drop handler;
|
|
21
|
+
* awaiting its result later is fine. `primeFileReads` is that start, and every
|
|
22
|
+
* later consumer takes the already-running read rather than beginning its own.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
/** How many times a read that came back empty is retried before giving up. */
|
|
27
|
+
export const READ_ATTEMPTS = 3;
|
|
28
|
+
|
|
29
|
+
/** Base delay between read attempts; a promised file needs a beat to land. */
|
|
30
|
+
export const READ_RETRY_MS = 60;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* How many files a single drop primes up front. Matches `MAX_DROPPED_FILES`:
|
|
34
|
+
* priming beyond what can be attached would hold bytes the budget will reject.
|
|
35
|
+
*/
|
|
36
|
+
const MAX_PRIMED_FILES = 50;
|
|
37
|
+
|
|
38
|
+
export function delay(ms: number): Promise<void> {
|
|
39
|
+
const { promise, resolve } = Promise.withResolvers<void>();
|
|
40
|
+
setTimeout(resolve, ms);
|
|
41
|
+
return promise;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Start a data-URL read and return the still-running promise.
|
|
46
|
+
*
|
|
47
|
+
* MUST be called synchronously from the drop handler — see the module note. The
|
|
48
|
+
* result is the whole `data:<mime>;base64,<payload>` string, because the two
|
|
49
|
+
* consumers want different halves of it: an image takes the payload, a text file
|
|
50
|
+
* decodes it back to text.
|
|
51
|
+
*/
|
|
52
|
+
function startDataUrlRead(file: File): Promise<string | null> {
|
|
53
|
+
const { promise, resolve } = Promise.withResolvers<string | null>();
|
|
54
|
+
const reader = new FileReader();
|
|
55
|
+
reader.onload = () => resolve(typeof reader.result === 'string' ? reader.result : null);
|
|
56
|
+
reader.onerror = () => {
|
|
57
|
+
resolve(null);
|
|
58
|
+
};
|
|
59
|
+
reader.onabort = () => resolve(null);
|
|
60
|
+
reader.readAsDataURL(file);
|
|
61
|
+
return promise;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* A read already in flight, started while the drop's permission was live.
|
|
66
|
+
*
|
|
67
|
+
* `dataUrl` and `prefix` are the PRIMARY file's reads. `spare` holds the reads
|
|
68
|
+
* of the same drop's other `File` object, tried when the primary yields nothing:
|
|
69
|
+
* a drop can expose one file twice and only one of the two objects reads, with
|
|
70
|
+
* neither the metadata nor the context saying which. See `drop-entries.ts`.
|
|
71
|
+
*/
|
|
72
|
+
export interface PrimedRead {
|
|
73
|
+
/** The whole file as a data URL — the authorized read of a dropped file. */
|
|
74
|
+
dataUrl: Promise<string | null>;
|
|
75
|
+
/**
|
|
76
|
+
* The leading bytes, for the text sniff and the empty-stub check.
|
|
77
|
+
*
|
|
78
|
+
* Those two ask a `File` for bytes through `slice().arrayBuffer()`, which is
|
|
79
|
+
* subject to the same permission as `FileReader` — so they have to be served
|
|
80
|
+
* from a read started in the drop's tick as well, not started on demand.
|
|
81
|
+
*/
|
|
82
|
+
prefix: Promise<Uint8Array | null>;
|
|
83
|
+
/** The counterpart object's reads, when the payload exposed the file twice. */
|
|
84
|
+
spare?: PrimedRead;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type PrimedReads = Map<File, PrimedRead>;
|
|
88
|
+
|
|
89
|
+
/** Bytes sampled to decide whether an unclassified file is text. */
|
|
90
|
+
const PREFIX_BYTES = 4096;
|
|
91
|
+
|
|
92
|
+
function startPrefixRead(file: File): Promise<Uint8Array | null> {
|
|
93
|
+
const { promise, resolve } = Promise.withResolvers<Uint8Array | null>();
|
|
94
|
+
const reader = new FileReader();
|
|
95
|
+
reader.onload = () => resolve(reader.result instanceof ArrayBuffer ? new Uint8Array(reader.result) : null);
|
|
96
|
+
reader.onerror = () => resolve(null);
|
|
97
|
+
reader.onabort = () => resolve(null);
|
|
98
|
+
reader.readAsArrayBuffer(file.slice(0, PREFIX_BYTES));
|
|
99
|
+
return promise;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Begin reading every file NOW, in the drop handler's own tick.
|
|
104
|
+
*
|
|
105
|
+
* Returns a lookup the later async pipeline consults instead of reading the
|
|
106
|
+
* `File` itself. Files that were not primed (a directory walk discovers its
|
|
107
|
+
* children after the tick) simply have no entry and fall back to a fresh read.
|
|
108
|
+
*/
|
|
109
|
+
export function primeFileReads(files: readonly File[], fallbacks?: Map<File, File>): PrimedReads {
|
|
110
|
+
const primed: PrimedReads = new Map();
|
|
111
|
+
// Bounded by the same cap the attach path applies: a read is buffered as a
|
|
112
|
+
// data URL, so priming a thousand-file drop would hold every byte twice
|
|
113
|
+
// before the budget had a chance to reject any of them.
|
|
114
|
+
for (const file of files.slice(0, MAX_PRIMED_FILES)) {
|
|
115
|
+
if (primed.has(file)) continue;
|
|
116
|
+
const counterpart = fallbacks?.get(file);
|
|
117
|
+
primed.set(file, {
|
|
118
|
+
dataUrl: startDataUrlRead(file),
|
|
119
|
+
prefix: startPrefixRead(file),
|
|
120
|
+
// Primed in the same tick for the same reason: a fallback whose own read
|
|
121
|
+
// starts after the drop window closes is not authorized either.
|
|
122
|
+
...(counterpart
|
|
123
|
+
? { spare: { dataUrl: startDataUrlRead(counterpart), prefix: startPrefixRead(counterpart) } }
|
|
124
|
+
: {}),
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return primed;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* The primed leading bytes, or `undefined` when the file was never primed.
|
|
132
|
+
*
|
|
133
|
+
* An empty array means the read was attempted and yielded nothing — which is
|
|
134
|
+
* also what a genuine empty file gives, and what the sniff should see.
|
|
135
|
+
*/
|
|
136
|
+
export async function primedPrefix(file: File, primed?: PrimedReads): Promise<Uint8Array | undefined> {
|
|
137
|
+
const started = primed?.get(file);
|
|
138
|
+
if (!started) return undefined;
|
|
139
|
+
const bytes = await started.prefix;
|
|
140
|
+
if (bytes && bytes.byteLength > 0) return bytes;
|
|
141
|
+
if (started.spare) {
|
|
142
|
+
const spare = await started.spare.prefix;
|
|
143
|
+
if (spare && spare.byteLength > 0) return spare;
|
|
144
|
+
}
|
|
145
|
+
return bytes ?? new Uint8Array(0);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** The base64 payload of a data URL, or null when there is none. */
|
|
149
|
+
export function base64Of(dataUrl: string | null): string | null {
|
|
150
|
+
if (dataUrl === null) return null;
|
|
151
|
+
const comma = dataUrl.indexOf(',');
|
|
152
|
+
return comma === -1 ? null : dataUrl.slice(comma + 1);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Decode a data URL's payload back to text, or null when it cannot be decoded.
|
|
157
|
+
*
|
|
158
|
+
* Null covers both "no payload" and "payload is not text": a dropped binary
|
|
159
|
+
* arrives through the same data-URL read, and its bytes are not a UTF-8 string.
|
|
160
|
+
*/
|
|
161
|
+
export function textOf(dataUrl: string | null): string | null {
|
|
162
|
+
const base64 = base64Of(dataUrl);
|
|
163
|
+
if (base64 === null) return null;
|
|
164
|
+
try {
|
|
165
|
+
const binary = atob(base64);
|
|
166
|
+
const bytes = new Uint8Array(binary.length);
|
|
167
|
+
for (let i = 0; i < binary.length; i += 1) bytes[i] = binary.charCodeAt(i);
|
|
168
|
+
return new TextDecoder('utf-8').decode(bytes);
|
|
169
|
+
} catch {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Read a File as base64, or null when the read fails. */
|
|
175
|
+
export async function readAsDataUrl(file: File, primed?: PrimedReads): Promise<string | null> {
|
|
176
|
+
const started = primed?.get(file);
|
|
177
|
+
if (started) {
|
|
178
|
+
const payload = base64Of(await started.dataUrl);
|
|
179
|
+
if (payload !== null) return payload;
|
|
180
|
+
// The primary object did not read; the drop's other object for the same file
|
|
181
|
+
// may. One of the two is unreadable in a given context and it is not the one
|
|
182
|
+
// the metadata suggests.
|
|
183
|
+
if (started.spare) return base64Of(await started.spare.dataUrl);
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
return base64Of(await startDataUrlRead(file));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Read a File as text through `readAsText`, or null when the read fails. */
|
|
190
|
+
function readAsTextDirect(file: File): Promise<string | null> {
|
|
191
|
+
const { promise, resolve } = Promise.withResolvers<string | null>();
|
|
192
|
+
const reader = new FileReader();
|
|
193
|
+
reader.onload = () => resolve(typeof reader.result === 'string' ? reader.result : null);
|
|
194
|
+
reader.onerror = () => {
|
|
195
|
+
resolve(null);
|
|
196
|
+
};
|
|
197
|
+
reader.onabort = () => resolve(null);
|
|
198
|
+
reader.readAsText(file);
|
|
199
|
+
return promise;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Read a File's text, preferring a read that was already started.
|
|
204
|
+
*
|
|
205
|
+
* The primed read is the one that matters: it is the only one the browser is
|
|
206
|
+
* guaranteed to authorize for a dropped file (see the module note), so it is
|
|
207
|
+
* consulted first and a non-empty body from it ends the call. The loop behind it
|
|
208
|
+
* exists for a PROMISED file — another app's drag, whose bytes land a moment
|
|
209
|
+
* after the entry exists — and for a file that was never primed at all.
|
|
210
|
+
*
|
|
211
|
+
* Returns null when no attempt produced a body for a file that declares bytes.
|
|
212
|
+
*/
|
|
213
|
+
export async function readFileTextWithRetry(file: File, primed?: PrimedReads): Promise<string | null> {
|
|
214
|
+
const started = primed?.get(file);
|
|
215
|
+
if (started) {
|
|
216
|
+
const content = textOf(await started.dataUrl);
|
|
217
|
+
if (content !== null && content.length > 0) return content;
|
|
218
|
+
if (started.spare) {
|
|
219
|
+
const spare = textOf(await started.spare.dataUrl);
|
|
220
|
+
if (spare !== null && spare.length > 0) return spare;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
let last: string | null = null;
|
|
225
|
+
for (let attempt = 0; attempt < READ_ATTEMPTS; attempt += 1) {
|
|
226
|
+
last = await readAsTextDirect(file);
|
|
227
|
+
if (last === null || last.length === 0) {
|
|
228
|
+
const viaDataUrl = textOf(await startDataUrlRead(file));
|
|
229
|
+
if (viaDataUrl !== null && viaDataUrl.length > 0) return viaDataUrl;
|
|
230
|
+
}
|
|
231
|
+
if (last !== null && last.length > 0) return last;
|
|
232
|
+
// An empty body is the real answer once the file has had a beat to
|
|
233
|
+
// materialize AND declares no bytes of its own.
|
|
234
|
+
if (file.size === 0 && attempt > 0) return last ?? '';
|
|
235
|
+
await delay(READ_RETRY_MS);
|
|
236
|
+
}
|
|
237
|
+
return last;
|
|
238
|
+
}
|