From d02df67aed888b0dccfe9bd67312caeb2dd22ebd Mon Sep 17 00:00:00 2001
From: tim-inkeep <132074086+tim-inkeep@users.noreply.github.com>
Date: Fri, 26 Jun 2026 21:28:43 -0400
Subject: [PATCH 1/2] fix(ok): stop agents misfiring on the skill surface
(#2209)
* fix(open-knowledge): stop agents misfiring on the skill surface
Two related ways agents get derailed around OpenKnowledge skills:
1. skills MCP tool dead-ends on OK's own built-in skills. An agent told
to "load the open-knowledge skill" calls skills({name:"open-knowledge"}),
gets a bare "Skill not found." 404, and falls back to cat-ing the bundled
SKILL.md. The built-ins (open-knowledge, open-knowledge-discovery,
open-knowledge-write-skill) are runtime agent skills projected into editor
host dirs, never KB content skills, so they can never be read here. READ
now short-circuits with a teaching error: the skill is already in your
loaded skill list, do not fetch it through this tool. Generalized via
BUNDLE_SKILL_NAME so it tracks the canonical bundle list; user-authored
open-knowledge-pack-* content skills are not caught. Tool description
states the boundary up front.
2. SKILL.md escape hatch let agents conclude "MCP unavailable" from an
incomplete initial tool list. Some clients (notably Codex) defer MCP
tools behind a lazy tool_search, so mcp__open-knowledge__* is absent
until discovered. The hatch now requires running tool discovery before
inferring the server is not registered.
* fix(open-knowledge): address PR review on skill-surface fix
- Sync the AGENTS.md/CLAUDE.md escape hatch with SKILL.md: require tool
discovery before concluding the MCP is unregistered, and state that
absence from the initial tool list is not the trigger (Codex defers
tools behind tool search). Closes the divergence the SKILL.md fix opened
for agents working on the OK repo itself (CLAUDE.md symlinks AGENTS.md).
- skills.test.ts: assert against the HOCUSPOCUS_NOT_RUNNING_ERROR constant
instead of a raw string, and add name-labeled messages in the bundle-name
loop so a failure names the offending skill.
GitOrigin-RevId: a203f9ea8e591f2a85557292f99d8ab80a32142e
---
.changeset/skills-tool-builtin-skill-hint.md | 9 +
docs/scripts/generate-og-wordmark.ts | 1 +
.../app/(home)/sections/eng-specs-graphic.tsx | 1 +
.../sections/knowledge-base-graphic.tsx | 1 +
docs/src/components/copy-prompt.tsx | 3 +-
docs/src/components/ok-editor/bubble-menu.tsx | 3 +-
docs/src/components/ok-editor/drag-handle.tsx | 3 +-
.../ok-editor/preview-code-block.tsx | 1 +
docs/src/components/overview-blocks.tsx | 1 +
docs/src/components/tabs.test.ts | 1 +
docs/src/components/tabs.tsx | 1 +
docs/src/lib/deferred-share.ts | 1 +
docs/src/lib/share-splash.ts | 1 +
packages/app/playwright.a11y.config.ts | 1 +
packages/app/playwright.config.ts | 1 +
packages/app/playwright.visual.config.ts | 1 +
packages/app/src/build/app-version.ts | 3 +-
.../app/src/build/electron-mode-class.test.ts | 1 +
.../src/components/ActivityModeContent.tsx | 5 +
.../src/components/ArrayOfObjectsWidget.tsx | 1 +
.../app/src/components/AuthModal.dom.test.tsx | 1 +
packages/app/src/components/AuthModal.tsx | 10 +-
.../components/AutoSyncOnboardingDialog.tsx | 5 +-
packages/app/src/components/BetaBadge.tsx | 1 +
.../components/BottomComposer.dom.test.tsx | 3 +-
.../app/src/components/BottomComposer.tsx | 4 +-
.../ClaudeReadinessBanner.dom.test.tsx | 1 +
.../src/components/CloneDialog.dom.test.tsx | 1 +
.../ComposerContextChips.dom.test.tsx | 1 +
.../src/components/ComposerContextChips.tsx | 1 +
packages/app/src/components/ConsentDialog.tsx | 1 +
packages/app/src/components/CopyButton.tsx | 4 +-
...ojectDialog.cascade-staleness.dom.test.tsx | 1 +
.../src/components/CreateProjectDialog.tsx | 4 +-
.../components/CreateProjectMenuTrigger.tsx | 1 +
.../components/DeleteConfirmationDialog.tsx | 4 +-
.../app/src/components/DiffViewBoundary.tsx | 3 +-
.../app/src/components/DocPanel.dom.test.tsx | 1 +
.../src/components/DocumentBoundary.test.ts | 4 +-
.../app/src/components/DocumentBoundary.tsx | 1 +
.../components/DocumentErrorBoundary.test.ts | 1 +
.../src/components/EditorActivityPool.test.ts | 2 +
.../app/src/components/EditorActivityPool.tsx | 1 +
...torActivityPool.warm-skeleton.dom.test.tsx | 5 +
packages/app/src/components/EditorTabs.tsx | 7 +-
.../src/components/EmptyEditorState.test.ts | 1 +
.../app/src/components/EmptyEditorState.tsx | 3 +-
.../FileTree.showall-lazy.dom.test.tsx | 1 +
.../FileTree.showall-truncation.dom.test.tsx | 1 +
.../FileTree.superseded-refresh.dom.test.tsx | 1 +
packages/app/src/components/FileTree.tsx | 21 +-
.../app/src/components/FrontmatterRow.tsx | 1 +
...GraphPanel.external-link-open.dom.test.tsx | 1 +
packages/app/src/components/GraphPanel.tsx | 3 +-
.../InstallInClaudeDesktopDialog.tsx | 1 +
.../src/components/InteractionPropPanel.tsx | 1 +
.../app/src/components/McpConsentDialog.tsx | 1 +
.../src/components/McpConsentDialogBody.tsx | 1 +
.../src/components/MountStalledAffordance.tsx | 1 +
packages/app/src/components/NavigatorApp.tsx | 1 +
.../app/src/components/NewItemDialog.test.ts | 1 +
packages/app/src/components/ObjectWidget.tsx | 1 +
packages/app/src/components/PageHeader.tsx | 1 +
.../app/src/components/PageHeaderWidgets.tsx | 1 +
.../app/src/components/ProjectSwitcher.tsx | 1 +
.../PropertyInlineLinks.dom.test.tsx | 1 +
.../src/components/PropertyInlineLinks.tsx | 1 +
.../PropertyPanel.nested-crud.dom.test.tsx | 4 +-
.../app/src/components/PropertyPanel.test.tsx | 3 +-
packages/app/src/components/PropertyPanel.tsx | 1 +
.../src/components/PublishToGitHubDialog.tsx | 1 +
.../app/src/components/SettingsButton.tsx | 1 +
.../ShareBranchSwitchDialog.dom.test.tsx | 1 +
.../components/ShareBranchSwitchDialog.tsx | 1 +
packages/app/src/components/ShareButton.tsx | 1 +
.../app/src/components/SharingModeField.tsx | 1 +
.../src/components/SidebarSearchBar.test.ts | 1 +
.../app/src/components/SidebarSearchBar.tsx | 1 +
.../SkillEditorActions.dom.test.tsx | 1 +
.../app/src/components/SkillEditorActions.tsx | 1 +
.../components/SkillProperties.dom.test.tsx | 1 +
.../app/src/components/SyncStatusBadge.tsx | 5 +
packages/app/src/components/TemplateForm.tsx | 1 +
.../TemplateProperties.dom.test.tsx | 1 +
.../TerminalCliMissingBanner.dom.test.tsx | 1 +
.../src/components/TerminalDock.dom.test.tsx | 1 +
.../TerminalExitNotice.dom.test.tsx | 1 +
.../src/components/TerminalPanel.dom.test.tsx | 1 +
.../TerminalPanel.launch.dom.test.tsx | 1 +
packages/app/src/components/TextViewer.tsx | 1 +
packages/app/src/components/TimelinePanel.tsx | 9 +-
.../app/src/components/TrashFailureModal.tsx | 2 +
.../src/components/UpdateNotices.shared.ts | 1 +
.../app/src/components/UpdateNotices.test.ts | 9 +
.../src/components/ask-ai-composer-events.ts | 1 +
.../command-palette-flicker.test.ts | 2 +
.../components/command-palette-semantic.ts | 1 +
.../command-palette-tag-search.test.ts | 1 +
.../components/command-palette-tag-search.ts | 1 +
.../components/composer-draft-store.test.ts | 1 +
.../src/components/composer-draft-store.ts | 4 +-
.../composer-shared-draft.dom.test.tsx | 5 +-
.../app/src/components/editor-area-overlay.ts | 1 +
.../editor/SelectionAnnouncer.test.ts | 1 +
.../components/editor/SelectionAnnouncer.tsx | 1 +
.../empty-state/CopyablePromptList.tsx | 3 +-
.../CreatePromptComposer.dom.test.tsx | 1 +
.../src/components/extension-picker-utils.ts | 1 +
.../src/components/file-tree-adapter.test.ts | 1 +
.../file-tree-extension-badge.dom.test.tsx | 1 +
.../components/file-tree-extension-badge.ts | 1 +
.../app/src/components/file-tree-merge.ts | 1 +
.../src/components/file-tree-okignore.test.ts | 1 +
.../file-tree-rename-chip.dom.test.tsx | 1 +
.../src/components/file-tree-rename-chip.ts | 1 +
.../components/file-tree-rename-validation.ts | 1 +
.../app/src/components/file-tree-reveal.ts | 1 +
.../components/file-tree-trash-copy.test.ts | 1 +
.../src/components/file-tree-trash-copy.ts | 1 +
.../app/src/components/file-tree-utils.ts | 1 +
packages/app/src/components/graph-colors.ts | 1 +
.../app/src/components/graph-label-utils.ts | 1 +
.../handoff/EditWithAiPanel.dom.test.tsx | 1 +
.../handoff/EditWithAiPopover.dom.test.tsx | 1 +
.../components/handoff/EditWithAiPopover.tsx | 1 +
.../handoff/OpenInAgentContextSubmenu.tsx | 1 +
.../handoff/OpenInAgentEmptySpaceSubmenu.tsx | 1 +
.../components/handoff/OpenInAgentMenu.tsx | 1 +
.../handoff/OpenInAgentMenuItem.test.ts | 1 +
.../handoff/OpenInAgentMenuItem.tsx | 1 +
.../OpenInAgentTerminalRow.dom.test.tsx | 1 +
.../dispatch-single-entry-point.test.ts | 1 +
.../handoff/terminal-launch-events.ts | 1 +
.../handoff/useHandoffDispatch.test.ts | 1 +
.../components/handoff/useHandoffDispatch.ts | 1 +
.../handoff/useInstalledAgents.test.ts | 1 +
.../components/handoff/useInstalledAgents.ts | 1 +
.../src/components/page-header-utils.test.ts | 2 +
.../app/src/components/page-header-utils.ts | 1 +
.../app/src/components/prewarm-correlation.ts | 1 +
.../components/property-inline-link-tokens.ts | 1 +
.../components/resolve-conflict-dispatch.ts | 4 +-
.../settings/AccountSection.dom.test.tsx | 1 +
.../EmbeddingsKeySection.dom.test.tsx | 1 +
.../settings/SearchSection.dom.test.tsx | 1 +
.../settings/SettingsDialogBody.test.ts | 1 +
.../settings/SettingsDialogBodyLazy.ts | 1 +
.../settings/SettingsDialogErrorBoundary.tsx | 1 +
.../settings/SettingsDialogShell.dom.test.tsx | 1 +
.../components/settings/SharingSection.tsx | 1 +
.../settings/SkillTargetsPicker.dom.test.tsx | 1 +
.../SkillsManagerSection.dom.test.tsx | 1 +
.../settings/SkillsManagerSection.tsx | 1 +
.../components/settings/okignore-doc.test.ts | 1 +
.../src/components/settings/okignore-doc.ts | 1 +
.../components/settings/okignore-preview.ts | 1 +
.../components/settings/okignore-warnings.ts | 1 +
.../components/settings/schema-walker.test.ts | 1 +
.../src/components/settings/schema-walker.ts | 2 +
.../settings/use-config-form.test.ts | 5 +
.../components/settings/use-config-form.ts | 2 +
.../src/components/share-metadata-rows.tsx | 1 +
.../src/components/sidebar-hover-prewarm.ts | 1 +
packages/app/src/components/skill-actions.tsx | 1 +
.../src/components/template-picker-utils.ts | 1 +
.../components/terminal-session-registry.ts | 1 +
packages/app/src/components/terminal-wheel.ts | 1 +
.../src/components/text-viewer-languages.ts | 1 +
packages/app/src/components/ui/command.tsx | 1 +
packages/app/src/components/ui/form.test.ts | 1 +
.../app/src/editor/ComposerMentionInput.tsx | 1 +
packages/app/src/editor/DocumentContext.tsx | 3 +-
packages/app/src/editor/SourceEditor.tsx | 1 +
packages/app/src/editor/TiptapEditor.tsx | 4 +-
packages/app/src/editor/active-editor.ts | 1 +
.../src/editor/asset-dispatch/dispatcher.ts | 1 +
.../app/src/editor/asset-dispatch/index.ts | 1 +
.../app/src/editor/asset-dispatch/registry.ts | 1 +
.../app/src/editor/asset-dispatch/types.ts | 1 +
.../editor/binding-staleness-guard.test.ts | 9 +
.../app/src/editor/binding-staleness-guard.ts | 1 +
.../app/src/editor/block-ux/keyboard-nav.ts | 1 +
.../src/editor/branch-invalidation.test.ts | 1 +
.../app/src/editor/branch-invalidation.ts | 1 +
.../src/editor/bubble-menu/BubbleMenuBar.tsx | 3 +-
.../EditWithAiBubbleButton.dom.test.tsx | 1 +
.../bubble-menu/EditWithAiBubbleButton.tsx | 1 +
.../editor/bubble-menu/FileBubbleButtons.tsx | 1 +
.../FootnoteBubbleButton.dom.test.tsx | 1 +
.../bubble-menu/FootnoteBubbleButton.tsx | 1 +
.../bubble-menu/ImageAlignButtons.test.ts | 1 +
.../editor/bubble-menu/ImageAlignButtons.tsx | 1 +
.../app/src/editor/client-persistence.test.ts | 4 +-
packages/app/src/editor/client-persistence.ts | 4 +-
.../clipboard/clipboard-sanitize.test.ts | 2 +
.../editor/clipboard/clipboard-sanitize.ts | 3 +
.../clipboard-walker-fallback-palette.test.ts | 2 +
.../clipboard-walker-fallback-palette.ts | 1 +
.../editor/clipboard/clipboard-walker.test.ts | 5 +
.../src/editor/clipboard/clipboard-walker.ts | 4 +
.../editor/clipboard/detect-source.test.ts | 1 +
.../app/src/editor/clipboard/detect-source.ts | 1 +
.../src/editor/clipboard/handle-drop.test.ts | 1 +
.../src/editor/clipboard/handle-paste.test.ts | 1 +
.../app/src/editor/clipboard/handle-paste.ts | 1 +
packages/app/src/editor/clipboard/index.ts | 1 +
.../src/editor/clipboard/instrument.test.ts | 1 +
.../app/src/editor/clipboard/instrument.ts | 1 +
.../src/editor/clipboard/is-markdown.test.ts | 1 +
.../app/src/editor/clipboard/is-markdown.ts | 1 +
...on-portable-render-source-fallback.test.ts | 1 +
.../non-portable-render-source-fallback.ts | 1 +
.../clipboard/paste-failure-toast.test.ts | 1 +
.../editor/clipboard/paste-failure-toast.ts | 1 +
.../src/editor/clipboard/serialize.test.ts | 5 +
.../app/src/editor/clipboard/serialize.ts | 1 +
.../editor/clipboard/shift-tracker.test.ts | 1 +
.../app/src/editor/clipboard/shift-tracker.ts | 1 +
.../source-clipboard-recovery.test.ts | 1 +
.../editor/clipboard/source-clipboard.test.ts | 1 +
.../src/editor/components/Accordion.test.tsx | 1 +
.../app/src/editor/components/Accordion.tsx | 1 +
packages/app/src/editor/components/Audio.tsx | 1 +
.../src/editor/components/Callout.test.tsx | 1 +
.../app/src/editor/components/Callout.tsx | 1 +
.../CodePreviewEditModal.dom.test.tsx | 1 +
.../components/CodePreviewEditModal.tsx | 5 +-
packages/app/src/editor/components/Embed.tsx | 1 +
.../app/src/editor/components/File.test.tsx | 1 +
packages/app/src/editor/components/File.tsx | 1 +
packages/app/src/editor/components/Image.tsx | 1 +
.../app/src/editor/components/Math.test.tsx | 1 +
packages/app/src/editor/components/Math.tsx | 1 +
.../src/editor/components/Mermaid.test.tsx | 1 +
.../app/src/editor/components/Mermaid.tsx | 1 +
packages/app/src/editor/components/Mirror.tsx | 2 +
.../src/editor/components/MirrorSource.tsx | 1 +
packages/app/src/editor/components/Pdf.tsx | 7 +-
.../editor/components/PropPanel.dom.test.tsx | 1 +
.../src/editor/components/PropPanel.test.tsx | 7 +
.../app/src/editor/components/PropPanel.tsx | 7 +-
.../src/editor/components/ResizeHandles.tsx | 4 +-
.../components/SrcAutocomplete.dom.test.tsx | 1 +
.../src/editor/components/SrcAutocomplete.tsx | 1 +
.../app/src/editor/components/Tab.test.tsx | 1 +
packages/app/src/editor/components/Tab.tsx | 1 +
.../src/editor/components/Tabs.dom.test.tsx | 1 +
packages/app/src/editor/components/Tabs.tsx | 1 +
.../src/editor/components/TagDialog.test.tsx | 1 +
.../app/src/editor/components/TagDialog.tsx | 1 +
.../src/editor/components/TagView.test.tsx | 1 +
.../app/src/editor/components/TagView.tsx | 1 +
packages/app/src/editor/components/Video.tsx | 1 +
.../editor/components/jsx-host-context.tsx | 1 +
.../src/editor/components/pdf-layout.test.ts | 1 +
.../app/src/editor/components/pdf-layout.ts | 1 +
.../components/use-mirror-source.test.ts | 1 +
.../editor/components/use-mirror-source.ts | 2 +
.../composer-mention/composer-mention.ts | 2 +
.../src/editor/edit-with-ai-selection.test.ts | 1 +
.../app/src/editor/edit-with-ai-selection.ts | 1 +
packages/app/src/editor/editor-cache.test.ts | 45 ++-
packages/app/src/editor/editor-cache.ts | 14 +-
packages/app/src/editor/editor-tabs.test.ts | Bin 28451 -> 28452 bytes
.../extensions/CodeBlockView.dom.test.tsx | 1 +
.../src/editor/extensions/CodeBlockView.tsx | 7 +-
.../ImageInlineZoomView.dom.test.tsx | 6 +-
.../editor/extensions/ImageInlineZoomView.tsx | 1 +
.../extensions/InternalLinkPropPanel.tsx | 1 +
.../extensions/JsxComponentView.test.ts | 2 +
.../editor/extensions/JsxComponentView.tsx | 3 +
.../editor/extensions/LinkPropPanelCopy.tsx | 1 +
.../src/editor/extensions/MathInlineView.tsx | 1 +
.../extensions/RawMdxFallbackCMView.test.ts | 3 +
.../extensions/RawMdxFallbackCMView.tsx | 1 +
.../editor/extensions/WikiLinkPropPanel.tsx | 3 +
.../src/editor/extensions/block-mover.test.ts | 3 +
.../extensions/bridge-id-plugin.test.ts | 3 +
.../src/editor/extensions/bridge-id-plugin.ts | 1 +
.../chunk-wrapper-decoration.test.ts | 2 +
.../extensions/chunk-wrapper-decoration.ts | 1 +
.../editor/extensions/code-block-languages.ts | 1 +
.../extensions/code-block-lowlight-plugin.ts | 1 +
.../src/editor/extensions/code-block-meta.ts | 1 +
.../extensions/code-block-preview-csp.test.ts | 1 +
.../app/src/editor/extensions/code-block.ts | 2 +
.../extensions/frozen-table-headers.test.ts | 1 +
.../editor/extensions/frozen-table-headers.ts | 1 +
.../extensions/link-edit-autoopen.test.ts | 1 +
.../link-resolution-decoration.test.ts | 8 +
.../extensions/link-resolution-decoration.ts | 1 +
.../editor/extensions/link-resolution.test.ts | 1 +
.../src/editor/extensions/link-resolution.ts | 1 +
.../mark-identity-decoration.test.ts | 5 +
.../extensions/mark-identity-decoration.ts | 1 +
.../editor/extensions/mark-identity.test.ts | 6 +
.../src/editor/extensions/mark-identity.ts | 4 +
.../mark-interaction-bridge.test.tsx | 9 +-
.../extensions/mark-interaction-bridge.ts | 5 +
.../editor/extensions/nested-cm-extensions.ts | 1 +
.../extensions/raw-mdx-fallback.test.ts | 3 +
.../editor/extensions/raw-mdx-nav-event.ts | 1 +
.../extensions/selection-state-plugin.test.ts | 11 +-
.../extensions/selection-state-plugin.ts | 9 +-
.../extensions/source-dirty-observer.ts | 1 +
.../editor/extensions/tab-focus-trap.test.ts | 1 +
.../src/editor/extensions/tab-focus-trap.ts | 1 +
.../extensions/table-insert-commands.ts | 1 +
.../extensions/table-insert-controls.ts | 1 +
.../src/editor/extensions/tag-click-plugin.ts | 1 +
.../editor/extensions/tag-suggestion.test.ts | 6 +-
.../src/editor/extensions/tag-suggestion.ts | 1 +
.../extensions/wiki-link-icon.dom.test.tsx | 1 +
.../src/editor/hooks/use-block-selection.ts | 1 +
packages/app/src/editor/http-client.ts | 1 +
.../editor/image-upload/current-doc-name.ts | 1 +
.../media-drop-shape-invariant.test.ts | 1 +
.../app/src/editor/interaction-layer-host.ts | 1 +
.../app/src/editor/interaction-layer.test.ts | 12 +-
packages/app/src/editor/interaction-layer.tsx | 8 +
packages/app/src/editor/is-system-doc.ts | 1 +
packages/app/src/editor/mount-promise.test.ts | 54 ++-
packages/app/src/editor/mount-promise.ts | 15 +-
packages/app/src/editor/observer-sync.test.ts | 1 +
packages/app/src/editor/observers.test.ts | 17 +-
packages/app/src/editor/observers.ts | 9 +-
packages/app/src/editor/page-list-cache.ts | 1 +
.../editor/pattern-d-schema-identity.test.ts | 3 +
.../editor/pattern-d-walk-currency.test.ts | 3 +
.../src/editor/plugins/agent-flash-source.ts | 3 +-
.../editor/plugins/asset-context-menu.test.ts | 1 +
.../src/editor/plugins/asset-context-menu.ts | 1 +
.../app/src/editor/plugins/md-link-source.ts | 7 +-
.../editor/plugins/wiki-link-source.test.ts | 1 +
.../src/editor/plugins/wiki-link-source.ts | 9 +-
packages/app/src/editor/provider-pool.test.ts | 7 +-
packages/app/src/editor/provider-pool.ts | 12 +-
.../src/editor/registry/lucide-svg.test.ts | 1 +
.../resolve-descriptor-placeholder.test.ts | 1 +
.../app/src/editor/safe-navigation-url.ts | 1 +
packages/app/src/editor/selection-context.ts | 1 +
packages/app/src/editor/selection-stats.ts | 1 +
.../src/editor/selection/entry-label.test.ts | 1 +
.../app/src/editor/selection/entry-label.ts | 1 +
.../slash-command/auto-open-flag.test.ts | 1 +
.../slash-command/component-items.test.ts | 2 +
.../editor/slash-command/component-items.tsx | 1 +
.../slash-command/embed-starter-items.test.ts | 1 +
.../slash-command/embed-starter-items.tsx | 1 +
.../editor/source-polish/view-plugin.test.ts | 1 +
.../src/editor/source-polish/view-plugin.ts | 1 +
packages/app/src/editor/sync-promise.test.ts | 7 +-
packages/app/src/editor/sync-promise.ts | 2 +
packages/app/src/editor/tab-identity.ts | 1 +
.../table-controls/TableCellHandles.tsx | 1 +
.../tag-suggestion/TagSuggestionMenu.tsx | 1 +
.../app/src/editor/typing-burst-detector.ts | 1 +
.../app/src/editor/use-editor-mode.test.ts | 7 +
packages/app/src/editor/use-editor-mode.ts | 3 +-
.../editor/utils/animate-align-change.test.ts | 1 +
.../src/editor/utils/animate-align-change.ts | 1 +
.../app/src/editor/utils/editor-strings.ts | 1 +
.../editor/utils/filter-assets-by-accept.ts | 1 +
.../app/src/editor/utils/sanitize-url.test.ts | 3 +-
packages/app/src/editor/utils/sanitize-url.ts | 1 +
packages/app/src/editor/utils/severity.ts | 1 +
.../src/editor/utils/validate-css-length.ts | 1 +
.../editor/utils/validate-media-url.test.ts | 4 +
.../src/editor/utils/validate-media-url.ts | 1 +
.../editor/walk-currency-extension.test.ts | 6 +
.../app/src/editor/walk-currency-extension.ts | 1 +
.../src/editor/walk-currency-test-harness.ts | 1 +
packages/app/src/globals.alpha-aware.test.ts | 1 +
.../app/src/globals.image-zoom-dark.test.ts | 1 +
.../src/globals.reduced-transparency.test.ts | 1 +
packages/app/src/hooks/use-folder-config.ts | 1 +
packages/app/src/hooks/use-git-sync-status.ts | 1 +
.../hooks/use-selection-context.dom.test.tsx | 1 +
packages/app/src/lib/api-config.ts | 1 +
packages/app/src/lib/cc1.ts | 1 +
packages/app/src/lib/client-fetch.test.ts | 4 +-
.../lib/config-ignore-nested-error-events.ts | 1 +
.../config-provider.user-synced.dom.test.tsx | 1 +
.../app/src/lib/config-validation-events.ts | 1 +
packages/app/src/lib/consent-store.ts | 1 +
packages/app/src/lib/create-file-events.ts | 1 +
packages/app/src/lib/current-branch-store.ts | 3 +-
packages/app/src/lib/desktop-bridge-types.ts | 4 +-
packages/app/src/lib/doc-panel-width-store.ts | 3 +-
packages/app/src/lib/error-state.ts | 1 +
packages/app/src/lib/external-link.test.ts | 1 +
.../lib/file-menu-target-resolvers.test.ts | 1 +
.../app/src/lib/file-menu-target-resolvers.ts | 1 +
.../lib/file-tree-menu-action-events.test.ts | 1 +
.../src/lib/file-tree-menu-action-events.ts | 1 +
packages/app/src/lib/folder-config-api.ts | 1 +
packages/app/src/lib/folder-config-paths.ts | 1 +
.../lib/handoff/cowork-skill-install.test.ts | 1 +
.../src/lib/handoff/cowork-skill-install.ts | 1 +
packages/app/src/lib/handoff/dispatch.ts | 1 +
.../app/src/lib/handoff/install-detect.ts | 1 +
packages/app/src/lib/handoff/open-external.ts | 1 +
.../src/lib/handoff/skill-installer.test.ts | 1 +
.../app/src/lib/handoff/skill-installer.ts | 4 +-
packages/app/src/lib/handoff/targets.ts | 1 +
packages/app/src/lib/handoff/telemetry.ts | 1 +
.../use-claude-desktop-integration.test.ts | 2 +
.../handoff/use-claude-desktop-integration.ts | 1 +
.../lib/install-client-log-forwarder.test.ts | 1 +
.../src/lib/install-client-log-forwarder.ts | 10 +-
.../app/src/lib/install-deep-link-listener.ts | 1 +
.../app/src/lib/install-onboarding-toast.ts | 1 +
.../src/lib/install-server-drift-listener.ts | 1 +
.../app/src/lib/lazy-with-preload.test.ts | 1 +
packages/app/src/lib/lazy-with-preload.ts | 1 +
.../app/src/lib/managed-artifact-doc-name.ts | 2 +
packages/app/src/lib/mcp-consent-store.ts | 1 +
packages/app/src/lib/parse-api-error.test.ts | 1 +
packages/app/src/lib/parse-api-error.ts | 1 +
.../app/src/lib/parse-server-response.test.ts | 1 +
packages/app/src/lib/parse-server-response.ts | 1 +
.../perf/cold-mount-instrumentation.test.ts | 11 +-
.../lib/perf/cold-mount-instrumentation.ts | 7 +-
packages/app/src/lib/perf/collector.ts | 1 +
.../app/src/lib/perf/env-override.test.ts | 1 +
packages/app/src/lib/perf/env-override.ts | 1 +
.../app/src/lib/perf/get-pm-stats.test.ts | 8 +
packages/app/src/lib/perf/get-pm-stats.ts | 1 +
packages/app/src/lib/perf/hdr-histogram.ts | 1 +
packages/app/src/lib/perf/index.ts | 1 +
packages/app/src/lib/perf/mark.test.ts | 3 +-
packages/app/src/lib/perf/mark.ts | 4 +-
.../src/lib/perf/profiler-boundary.test.tsx | 1 +
.../app/src/lib/perf/profiler-boundary.tsx | 1 +
.../lib/perf/scheduler-polyfill-shim.test.ts | 1 +
.../src/lib/perf/scheduler-polyfill-shim.ts | 1 +
packages/app/src/lib/perf/types.ts | 1 +
packages/app/src/lib/perf/web-vitals.ts | 1 +
packages/app/src/lib/preferred-agent-store.ts | 1 +
packages/app/src/lib/project-paths.ts | 1 +
packages/app/src/lib/relaunch-store.test.ts | 1 +
packages/app/src/lib/relaunch-store.ts | 1 +
.../app/src/lib/server-info-refresh.test.ts | 1 +
packages/app/src/lib/server-info-refresh.ts | 4 +-
packages/app/src/lib/server-instance-store.ts | 1 +
.../app/src/lib/share/branch-switch-flow.ts | 1 +
.../src/lib/share/clipboard-adapter.test.ts | 1 +
.../app/src/lib/share/clipboard-adapter.ts | 1 +
.../src/lib/share/clone-controller.test.ts | 2 +
.../app/src/lib/share/clone-controller.ts | 1 +
packages/app/src/lib/share/consent-flow.ts | 1 +
.../app/src/lib/share/publish-wizard.test.ts | 2 +
packages/app/src/lib/share/publish-wizard.ts | 4 +
packages/app/src/lib/share/receive-flow.ts | 1 +
packages/app/src/lib/share/receive-store.ts | 1 +
.../src/lib/share/run-share-action.test.ts | 1 +
packages/app/src/lib/show-all-stream.ts | 1 +
packages/app/src/lib/sidebar-pin-store.ts | 3 +-
.../app/src/lib/single-file-initial-doc.ts | 1 +
packages/app/src/lib/skills-api.ts | 1 +
packages/app/src/lib/terminal-height-store.ts | 3 +-
.../transports/auth-query-transport.test.ts | 1 +
.../lib/transports/auth-query-transport.ts | 7 +-
.../app/src/lib/transports/auth-transport.ts | 4 +-
.../transports/buffered-async-stream.test.ts | 3 +-
.../lib/transports/buffered-async-stream.ts | 1 +
.../lib/transports/clone-transport.test.ts | 1 +
.../app/src/lib/transports/clone-transport.ts | 4 +-
.../transports/embeddings-key-transport.ts | 4 +-
.../app/src/lib/unified-agent-store.test.ts | 1 +
packages/app/src/lib/unified-agent-store.ts | 1 +
.../app/src/lib/update-notices-store.test.ts | 1 +
packages/app/src/lib/update-notices-store.ts | 1 +
.../app/src/lib/use-activity-panel.test.ts | 1 +
packages/app/src/lib/use-activity-panel.ts | 4 +
packages/app/src/lib/use-frontmatter-field.ts | 1 +
.../app/src/lib/use-settings-route.test.ts | 1 +
packages/app/src/lib/use-settings-route.ts | 1 +
packages/app/src/lib/workspace-paths.ts | 1 +
.../PresenceBar-avatar-click.test.tsx | 1 +
packages/app/src/presence/PresenceBar.test.ts | 1 +
packages/app/src/presence/identity.ts | 1 +
packages/app/src/presence/use-presence.ts | 1 +
packages/app/src/server/agent-sim.ts | 9 +-
packages/app/src/server/api-config-handler.ts | 1 +
packages/app/src/server/hocuspocus-plugin.ts | 12 +-
packages/app/src/telemetry-impl.ts | 3 +-
.../app/tests/a11y/component-blocks.e2e.ts | 8 +
.../conversion/conversion-fidelity.test.ts | 8 +
.../_fixtures/init-load-byte-stable-corpus.ts | 1 +
.../init-load-byte-stable-snapshot.ts | 1 +
.../integration/advisory-warnings.test.ts | 1 +
.../app/tests/integration/agent-undo.test.ts | 1 +
.../api-error-envelope/agent-activity.test.ts | 1 +
.../agent-burst-diff.test.ts | 1 +
.../api-error-envelope/agent-patch.test.ts | 1 +
.../api-error-envelope/agent-undo.test.ts | 1 +
.../api-error-envelope/agent-write-md.test.ts | 1 +
.../api-error-envelope/agent-write.test.ts | 1 +
.../auth-query-transport-signout.test.ts | 1 +
.../backlink-counts.test.ts | 1 +
.../api-error-envelope/backlinks.test.ts | 1 +
.../api-error-envelope/create-folder.test.ts | 1 +
.../api-error-envelope/create-page.test.ts | 1 +
.../api-error-envelope/dead-links.test.ts | 1 +
.../api-error-envelope/delete-path.test.ts | 1 +
.../api-error-envelope/document-list.test.ts | 1 +
.../api-error-envelope/document-read.test.ts | 1 +
.../api-error-envelope/folder-config.test.ts | 1 +
.../api-error-envelope/forward-links.test.ts | 1 +
.../history-version.test.ts | 1 +
.../api-error-envelope/history.test.ts | 1 +
.../api-error-envelope/hubs.test.ts | 1 +
.../installed-agents.test.ts | 1 +
.../api-error-envelope/link-graph.test.ts | 1 +
.../local-op-auth-login.test.ts | 1 +
.../local-op-auth-repos.test.ts | 1 +
.../local-op-auth-set-identity.test.ts | 1 +
.../local-op-auth-signout.test.ts | 1 +
.../local-op-auth-status.test.ts | 1 +
.../api-error-envelope/local-op-clone.test.ts | 1 +
.../metrics-agent-presence.test.ts | 1 +
.../metrics-parse-health.test.ts | 1 +
.../metrics-reconciliation.test.ts | 1 +
.../api-error-envelope/orphans.test.ts | 1 +
.../api-error-envelope/page-headings.test.ts | 1 +
.../api-error-envelope/pages.test.ts | 1 +
.../api-error-envelope/principal.test.ts | 1 +
.../api-error-envelope/rename-path.test.ts | 1 +
.../api-error-envelope/rescue-list.test.ts | 1 +
.../api-error-envelope/rollback.test.ts | 1 +
.../api-error-envelope/save-version.test.ts | 1 +
.../api-error-envelope/search.test.ts | 1 +
.../api-error-envelope/seed-apply.test.ts | 1 +
.../api-error-envelope/seed-plan.test.ts | 1 +
.../api-error-envelope/server-info.test.ts | 1 +
.../skill-cross-scope-move-uninstall.test.ts | 1 +
.../skill-install-state.test.ts | 1 +
.../api-error-envelope/skill-install.test.ts | 1 +
.../skill-personal-scope.test.ts | 1 +
.../api-error-envelope/skill-restore.test.ts | 1 +
.../skill-scope-move.test.ts | 1 +
.../api-error-envelope/skill-targets.test.ts | 1 +
.../api-error-envelope/skill.test.ts | 1 +
.../api-error-envelope/suggest-links.test.ts | 1 +
.../sync-conflict-content.test.ts | 1 +
.../api-error-envelope/sync-conflicts.test.ts | 1 +
.../sync-resolve-conflict.test.ts | 1 +
.../api-error-envelope/sync-status.test.ts | 1 +
.../api-error-envelope/sync-trigger.test.ts | 1 +
.../api-error-envelope/tags-for-name.test.ts | 1 +
.../api-error-envelope/tags-list.test.ts | 1 +
.../api-error-envelope/template.test.ts | 1 +
.../api-error-envelope/templates-list.test.ts | 1 +
.../api-error-envelope/test-flush-git.test.ts | 1 +
.../test-rescan-backlinks.test.ts | 1 +
.../test-rescan-files.test.ts | 1 +
.../api-error-envelope/test-reset.test.ts | 1 +
.../unmatched-route.test.ts | 1 +
.../api-error-envelope/upload-asset.test.ts | 1 +
.../api-error-envelope/workspace.test.ts | 1 +
.../asset-move-rerenders-embeds.test.ts | 8 +-
...itched-with-stale-embed-resolution.test.ts | 5 +-
.../bridge-cold-load-corpus.test.ts | 4 +
.../bridge-convergence-regression.test.ts | 1 +
.../tests/integration/bridge-matrix.test.ts | 12 +
.../bridge-watchdog-multi-peer-drain.test.ts | 1 +
.../bug-a-mechanism-isolation.test.ts | 3 +
.../bug-c-real-reachability.test.ts | 3 +
...agent-undo-under-concurrent-typing.test.ts | 4 +
.../bug3-source-mode-writeback.test.ts | 1 +
.../integration/c1-concurrent-wysiwyg.test.ts | 1 +
.../integration/c10-server-restart.test.ts | 1 +
.../c12-nested-frontmatter.test.ts | 1 +
.../c13-pathb-doc-boundary.test.ts | 1 +
.../c14-indented-jsx-concurrent.test.ts | 1 +
.../c15-dual-embed-divergence.test.ts | 1 +
.../integration/c2-concurrent-source.test.ts | 1 +
.../tests/integration/c3-mixed-mode.test.ts | 1 +
.../integration/c4-agent-plus-wysiwyg.test.ts | 1 +
.../integration/c5-agent-plus-source.test.ts | 1 +
.../c6-mode-switch-mid-debounce.test.ts | 1 +
.../c7-disconnect-reconnect-burst.test.ts | 1 +
.../integration/c8-triple-concurrent.test.ts | 2 +
.../integration/c9-join-mid-debounce.test.ts | 1 +
.../tests/integration/cc1-broadcast.test.ts | 4 +-
.../integration/client-logs-endpoint.test.ts | 1 +
...lipboard-cross-app-sanitizer-proxy.test.ts | 4 +
.../clipboard-dispatcher-reorder.test.ts | 1 +
.../clipboard-walker-integration.test.ts | 1 +
...onfig-doc-server-instance-recovery.test.ts | 1 +
.../conflict-aware-write-surfaces.test.ts | 3 +-
.../conflict-resolution-delete-modify.test.ts | 13 +-
.../app/tests/integration/create-page.test.ts | 1 +
.../integration/cross-doc-stale-cache.test.ts | 1 +
.../dom-test-filename-stop-rule.test.ts | 1 +
.../tests/integration/e2e-stop-rules.test.ts | 1 +
.../empty-folder-visibility.test.ts | 3 +
.../error-envelope-coverage.test.ts | 1 +
...lscreen-overlay-safe-area-coverage.test.ts | 5 +-
.../hook-timeout-stop-rules.test.ts | 1 +
.../idle-shutdown-multi-client.test.ts | 1 +
.../ipc-exhaustiveness-coverage.test.ts | 1 +
.../integration/ipc-log-coverage.test.ts | 1 +
.../jsx-schema-narrowing-safety.test.ts | 1 +
.../integration/jsx-undo-roundtrip.test.ts | 2 +
.../keyboard-nav-catch-contract.test.ts | 1 +
.../integration/link-graph-metadata.test.ts | 1 +
.../local-op-auth-login-cancel-reopen.test.ts | 1 +
.../loopback-bind-discipline.test.ts | 1 +
.../integration/loopback-exclusivity.test.ts | 1 +
.../managed-rename-crash-recovery.test.ts | 1 +
.../map-driven-observer-a-crdt.test.ts | 1 +
.../integration/mcp-session-identity.test.ts | 1 +
.../integration/microcopy-ellipsis.test.ts | 1 +
.../mock-module-completeness.test.ts | 2 +
.../integration/multi-agent-presence.test.ts | 1 +
.../app/tests/integration/network-control.ts | 2 +
.../no-sync-set-enabled-references.test.ts | 1 +
.../no-unportaled-editor-content.test.ts | 1 +
.../integration/per-session-um-perf.test.ts | 1 +
...istence-failure-surfacing-handlers.test.ts | 1 +
.../integration/persistence-fan-out.test.ts | 1 +
.../integration/presence-multi-tab.test.ts | 4 +-
.../integration/principal-endpoint.test.ts | 1 +
.../provider-pool-buffer-replay.test.ts | 1 +
...provider-pool-multi-client-restart.test.ts | 4 +-
.../provider-pool-reconnect.test.ts | 4 +-
.../raw-mdx-fallback-multi-client.test.ts | 3 +
.../removal-phantom-resurrection.test.ts | 4 +
.../rename-write-amplification.test.ts | 1 +
.../restart-with-embed-doc.test.ts | 2 +
.../tests/integration/selection-state.test.ts | 3 +
.../server-observer-feedback-loop.test.ts | 1 +
.../tests/integration/session-cleanup.test.ts | 1 +
.../sidebar-show-all-files.test.ts | 1 +
.../integration/single-file-mode.test.ts | 1 +
.../slash-command-extension.test.ts | 1 +
.../tests/integration/symlink-alias.test.ts | 9 +
.../integration/test-harness-origins.test.ts | 4 +-
.../tests/integration/test-harness.test.ts | 1 +
.../app/tests/integration/test-harness.ts | 36 +-
.../test-script-invariants.test.ts | 1 +
.../urn-ipc-registry-coverage.test.ts | 1 +
.../integration/vite-dedupe-parity.test.ts | 1 +
.../vite-worker-cachedir-isolation.test.ts | 1 +
.../integration/workspace-endpoint.test.ts | 1 +
.../tests/integration/worktree-boot.test.ts | 1 +
...worktree-cleanup-and-stale-pointer.test.ts | 1 +
.../integration/worktree-concurrent.test.ts | 4 +-
.../tests/integration/worktree-init.test.ts | 1 +
.../integration/worktree-test-harness.ts | 1 +
.../wysiwyg-x20-cold-reopen.test.ts | 1 +
.../y-prosemirror-import-coverage.test.ts | 1 +
...y-tiptap-schema-throw-substitution.test.ts | 1 +
packages/app/tests/lingui-macro-preload.ts | 1 +
packages/app/tests/lingui-macro-shim.tsx | 3 +
.../no-raw-html-interactive-element.test.ts | 1 +
.../no-roundtrip-identity-oracle.test.ts | 1 +
.../tests/meta/hook-timeout-semantics.test.ts | 1 +
.../meta/substrate-vocabulary-drift.test.ts | 1 +
.../cache-regime-rotation/asymmetric.ts | 1 +
.../fixtures/cache-regime-rotation/broad.ts | 1 +
.../cache-regime-rotation/generator.ts | 1 +
.../fixtures/cache-regime-rotation/index.ts | 1 +
.../fixtures/cache-regime-rotation/tight.ts | 1 +
.../fixtures/cache-regime-rotation/types.ts | 1 +
.../fixtures/cache-regime-rotation/vault.ts | 1 +
.../generate-view-count-fixtures.test.ts | 1 +
.../fixtures/generate-view-count-fixtures.ts | 7 +
packages/app/tests/perf/lib/bootstrap.ts | 2 +
packages/app/tests/perf/lib/bundle-check.ts | 1 +
.../app/tests/perf/lib/cdp-tracer.test.ts | 1 +
packages/app/tests/perf/lib/cdp-tracer.ts | 8 +
.../tests/perf/lib/cell-measurement.test.ts | 6 +
.../app/tests/perf/lib/cell-measurement.ts | 7 +
.../perf/lib/correlate-longtasks.test.ts | 1 +
.../app/tests/perf/lib/correlate-longtasks.ts | 1 +
.../app/tests/perf/lib/define-sweep.test.ts | 3 +-
packages/app/tests/perf/lib/define-sweep.ts | 1 +
packages/app/tests/perf/lib/doc-markers.ts | 1 +
packages/app/tests/perf/lib/kneedle.test.ts | 1 +
packages/app/tests/perf/lib/kneedle.ts | 2 +
.../tests/perf/lib/longtask-observer.test.ts | 1 +
.../app/tests/perf/lib/longtask-observer.ts | 4 +-
.../app/tests/perf/lib/macos-pressure.test.ts | 1 +
packages/app/tests/perf/lib/macos-pressure.ts | 1 +
.../perf/lib/node-peer-simulator.test.ts | 1 +
.../app/tests/perf/lib/node-peer-simulator.ts | 7 +-
.../app/tests/perf/lib/perf-compare.test.ts | 1 +
packages/app/tests/perf/lib/scenario.ts | 3 +
.../app/tests/perf/lib/sweep-runner.test.ts | 1 +
packages/app/tests/perf/lib/sweep-runner.ts | 5 +
packages/app/tests/perf/lib/tempo-client.ts | 5 +
.../tests/perf/lib/with-checkpoint.test.ts | 3 +-
.../app/tests/perf/lib/with-checkpoint.ts | 2 +
.../perf/probes/tiptap-destroy-leak.test.ts | 1 +
.../tests/perf/probes/tiptap-destroy-leak.ts | 11 +-
packages/app/tests/perf/profile.test.ts | 1 +
packages/app/tests/perf/profile.ts | 9 +-
.../perf/scenarios/activity-mount-sweep.ts | 3 +-
.../tests/perf/scenarios/cold-load-big-doc.ts | 1 +
.../tests/perf/scenarios/cold-pool-warm.ts | 1 +
.../scenarios/g4-profile-decomposition.ts | 4 +-
.../perf/scenarios/m2-cache-hit-reparent.ts | 1 +
.../perf/scenarios/m3-defer-mount-sweep.ts | 1 +
.../tests/perf/scenarios/memory-per-editor.ts | 4 +-
.../app/tests/perf/scenarios/mode-toggle.ts | 1 +
.../tests/perf/scenarios/outline-polling.ts | 1 +
.../scenarios/server-bridge-spans-canary.ts | 1 +
.../sweep-cache-regime.smoke.test.ts | 4 +
.../perf/scenarios/sweep-cache-regime.ts | 5 +
...nvention-cap-graduation-real-cycle.test.ts | 1 +
...ep-convention-cap-graduation.smoke.test.ts | 13 +
.../sweep-convention-cap-graduation.ts | 21 +-
.../scenarios/sweep-pool-warm-back-canary.ts | 1 +
.../perf/scenarios/warm-switch-cached.ts | 1 +
.../app/tests/perf/scenarios/warm-switch.ts | 1 +
.../app/tests/stress/_helpers/clipboard.ts | 1 +
.../tests/stress/_helpers/content-reset.ts | 1 +
.../app/tests/stress/_helpers/editor-state.ts | 1 +
.../tests/stress/_helpers/error-filters.ts | 1 +
.../app/tests/stress/_helpers/fixtures.ts | 1 +
.../stress/_helpers/global-warm-cache.ts | 1 +
packages/app/tests/stress/_helpers/graph.ts | 1 +
packages/app/tests/stress/_helpers/index.ts | 1 +
.../app/tests/stress/_helpers/provider.ts | 1 +
.../tests/stress/_helpers/server-process.ts | 10 +-
packages/app/tests/stress/_helpers/sidebar.ts | 1 +
.../app/tests/stress/_helpers/slash-menu.ts | 1 +
.../tests/stress/_helpers/upload-fixtures.ts | 1 +
.../tests/stress/agent-activity-panel.e2e.ts | 1 +
.../tests/stress/asset-click-dispatch.e2e.ts | 2 +
.../tests/stress/asset-embed-advanced.e2e.ts | 1 +
.../stress/asset-embed-real-fidelity.e2e.ts | 1 +
packages/app/tests/stress/asset-embed.e2e.ts | 1 +
.../stress/bridge-convergence.fuzz.test.ts | 22 +-
.../stress/chip-popover-positioning.e2e.ts | 3 +
...pboard-relative-url-source-fallback.e2e.ts | 1 +
.../stress/cm6-list-hanging-indent.e2e.ts | 1 +
.../stress/command-palette-flicker.e2e.ts | 1 +
.../stress/command-palette-semantic.e2e.ts | 1 +
.../stress/component-blocks.perf.test.ts | 4 +
packages/app/tests/stress/crdt-stress.e2e.ts | 1 +
.../stress/docs-open-scroll-restore.e2e.ts | 1 +
packages/app/tests/stress/docs-open.e2e.ts | 5 +
.../stress/drop-pipeline-auto-open.e2e.ts | 3 +
packages/app/tests/stress/edit-with-ai.e2e.ts | 1 +
.../stress/editor-area-viewport-resize.e2e.ts | 1 +
.../editor-mode-flip-cross-doc-bleed.e2e.ts | 1 +
.../stress/editor-mode-persistence.e2e.ts | 7 +-
...le-tree-decoration-chip-strip-repro.e2e.ts | 1 +
packages/app/tests/stress/find-replace.e2e.ts | 1 +
.../tests/stress/fixtures/handoff-mocks.ts | 13 +-
.../fr-7a-disconnect-source-mode.e2e.ts | 1 +
.../app/tests/stress/frontmatter-edit.e2e.ts | 1 +
.../tests/stress/frozen-table-headers.e2e.ts | 1 +
.../tests/stress/grip-click-nodeselect.e2e.ts | 4 +
packages/app/tests/stress/handoff.e2e.ts | 1 +
.../tests/stress/jsx-backspace-delete.e2e.ts | 8 +
.../tests/stress/jsx-halo-semantics.e2e.ts | 8 +
.../tests/stress/jsx-image-body-click.e2e.ts | 1 +
.../stress/jsx-prop-panel-placeholder.e2e.ts | 4 +
.../stress/jsx-range-encompass-halo.e2e.ts | 4 +
.../tests/stress/jsx-wildcard-convert.e2e.ts | 2 +
packages/app/tests/stress/list-keymap.e2e.ts | 1 +
.../app/tests/stress/mid-type-recovery.e2e.ts | 1 +
.../tests/stress/multi-agent-presence.e2e.ts | 2 +
.../stress/new-file-cross-doc-bleed.e2e.ts | 1 +
.../stress/ng7-rapid-nav-coherence.e2e.ts | 29 +-
.../stress/observer-a-multi-client.e2e.ts | 1 +
.../app/tests/stress/okignore-settings.e2e.ts | 14 +-
.../oracle-e-expectations.test-helper.ts | 1 +
.../tests/stress/outline-navigation.e2e.ts | 1 +
.../stress/outline-toolbar-occlusion.e2e.ts | 1 +
.../app/tests/stress/paste-fidelity.e2e.ts | 18 +
packages/app/tests/stress/prop-upload.e2e.ts | 5 +
.../tests/stress/qa-sidebar-responsive.e2e.ts | 4 +-
.../raw-mdx-fallback-onblur-upgrade.e2e.ts | 3 +
.../stress/rename-content-preservation.e2e.ts | 1 +
.../tests/stress/rename-noext-probe.e2e.ts | 1 +
.../tests/stress/selection-indicator.e2e.ts | 28 ++
.../server-authoritative-stress.test.ts | 6 +
.../app/tests/stress/showall-lazy-tree.e2e.ts | 1 +
.../tests/stress/sidebar-search-pill.e2e.ts | 1 +
.../stress/slash-command-auto-open.e2e.ts | 3 +
.../app/tests/stress/slash-command.e2e.ts | 8 +
.../tests/stress/source-find-scroll.e2e.ts | 1 +
.../app/tests/stress/source-polish.e2e.ts | 9 +
packages/app/tests/stress/stress-api.ts | 5 +
packages/app/tests/stress/synthetic.ts | 1 +
.../tests/stress/tabs-component-strip.e2e.ts | 1 +
.../stress/timeline-diff-sidepane.e2e.ts | 2 +
.../app/tests/stress/ux-interactions.e2e.ts | 3 +
.../tests/stress/yjs-no-dual-import.e2e.ts | 1 +
.../app/tests/visual/component-parity.e2e.ts | 8 +
packages/app/vite.react-babel.ts | 1 +
packages/cli/src/auth/embeddings-key-store.ts | 1 +
packages/cli/src/auth/gh-detect.ts | 3 +-
packages/cli/src/auth/resolve-auth.test.ts | 5 +
packages/cli/src/auth/token-store.test.ts | 7 +
packages/cli/src/auth/token-store.ts | 16 +-
packages/cli/src/cli.ts | 1 +
.../src/commands/auth/git-credential.test.ts | 4 +
packages/cli/src/commands/auth/login.ts | 3 +-
.../cli/src/commands/bug-report-redact.ts | 1 +
packages/cli/src/commands/clean.ts | 1 +
packages/cli/src/commands/clone.ts | 4 +
packages/cli/src/commands/config.test.ts | 4 +-
packages/cli/src/commands/config.ts | 1 +
packages/cli/src/commands/cowork.test.ts | 1 +
packages/cli/src/commands/cowork.ts | 1 +
packages/cli/src/commands/desktop-dispatch.ts | 1 +
.../cli/src/commands/diagnose-bundle.test.ts | 8 +
.../diagnose-health-checks/bun.test.ts | 1 +
.../commands/diagnose-health-checks/bun.ts | 1 +
.../config-yaml.test.ts | 1 +
.../diagnose-health-checks/config-yaml.ts | 1 +
.../content-dir.test.ts | 1 +
.../diagnose-health-checks/content-dir.ts | 1 +
.../diagnose-health-checks/git.test.ts | 1 +
.../commands/diagnose-health-checks/git.ts | 1 +
.../commands/diagnose-health-checks/index.ts | 1 +
.../macos-codesig.test.ts | 1 +
.../diagnose-health-checks/macos-codesig.ts | 1 +
.../commands/diagnose-health-checks/names.ts | 1 +
.../diagnose-health-checks/runner.test.ts | 5 +-
.../commands/diagnose-health-checks/runner.ts | 4 +-
.../server-lock.test.ts | 1 +
.../diagnose-health-checks/server-lock.ts | 1 +
.../shadow-health.test.ts | 1 +
.../diagnose-health-checks/shadow-health.ts | 7 +-
.../shadow-repo.test.ts | 1 +
.../diagnose-health-checks/shadow-repo.ts | 1 +
.../commands/diagnose-health-checks/types.ts | 1 +
.../cli/src/commands/diagnose-health.test.ts | 5 +-
packages/cli/src/commands/diagnose-health.ts | 1 +
packages/cli/src/commands/diagnose.test.ts | 4 +
packages/cli/src/commands/diagnose.ts | 16 +-
.../commands/editor-targets-lockstep.test.ts | 1 +
packages/cli/src/commands/embeddings/index.ts | 1 +
packages/cli/src/commands/init.test.ts | 16 +
packages/cli/src/commands/init.ts | 16 +-
packages/cli/src/commands/lock-state.ts | 1 +
.../src/commands/mcp-chain-validation.test.ts | 3 +
.../cli/src/commands/mcp-migrate-event.ts | 1 +
packages/cli/src/commands/mcp.ts | 1 +
packages/cli/src/commands/ps.test.ts | 12 +
packages/cli/src/commands/ps.ts | 7 +
.../cli/src/commands/repair-skills.test.ts | 6 +-
packages/cli/src/commands/repair-skills.ts | 1 +
packages/cli/src/commands/seed.ts | 1 +
packages/cli/src/commands/self-spawn.ts | 1 +
packages/cli/src/commands/share/index.ts | 1 +
.../cli/src/commands/share/name-check.test.ts | 1 +
packages/cli/src/commands/share/name-check.ts | 1 +
.../cli/src/commands/share/owners.test.ts | 1 +
packages/cli/src/commands/share/owners.ts | 1 +
.../cli/src/commands/share/publish.test.ts | 5 +
packages/cli/src/commands/share/publish.ts | 10 +-
packages/cli/src/commands/sharing/index.ts | 1 +
packages/cli/src/commands/sharing/share.ts | 1 +
.../cli/src/commands/sharing/sharing.test.ts | 1 +
packages/cli/src/commands/sharing/status.ts | 1 +
packages/cli/src/commands/sharing/unshare.ts | 1 +
.../cli/src/commands/single-file-dispatch.ts | 1 +
packages/cli/src/commands/single-file-open.ts | 7 +-
packages/cli/src/commands/skills.ts | 1 +
packages/cli/src/commands/start.test.ts | 14 +-
packages/cli/src/commands/start.ts | 6 +-
packages/cli/src/commands/status.ts | 1 +
packages/cli/src/commands/stop.test.ts | 1 +
packages/cli/src/commands/stop.ts | 1 +
packages/cli/src/commands/sync.test.ts | 1 +
packages/cli/src/commands/ui-proxy.ts | 27 +-
packages/cli/src/commands/ui.test.ts | 1 +
packages/cli/src/commands/ui.ts | 15 +-
packages/cli/src/config/loader.test.ts | 5 +
packages/cli/src/config/paths.ts | 1 +
packages/cli/src/config/schema.test.ts | 2 +
packages/cli/src/config/schema.ts | 1 +
.../cli/src/diagnose/bundle-redact.test.ts | 4 +
packages/cli/src/diagnose/bundle-redact.ts | 1 +
packages/cli/src/diagnose/bundle.test.ts | 10 +
packages/cli/src/diagnose/bundle.ts | 12 +
packages/cli/src/diagnose/path-parity.test.ts | 1 +
packages/cli/src/github/folder-validator.ts | 1 +
packages/cli/src/github/visibility.ts | 1 +
packages/cli/src/index.ts | 1 +
.../project-integration-writers.test.ts | 3 +
.../project-integration-writers.ts | 3 +
.../src/integrations/resolve-project-root.ts | 1 +
.../write-project-ai-integrations.test.ts | 1 +
.../write-project-ai-integrations.ts | 1 +
.../src/integrations/write-project-skill.ts | 2 +
.../cli/src/loopback-bind-discipline.test.ts | 1 +
packages/cli/src/mcp/bundle-identity.test.ts | 2 +
packages/cli/src/mcp/bundle-identity.ts | 1 +
packages/cli/src/mcp/host-liveness.ts | 1 +
.../src/mcp/keepalive-orphan-reaping.test.ts | 7 +-
packages/cli/src/mcp/lifecycle-logging.ts | 4 +-
packages/cli/src/mcp/server.ts | 4 +-
packages/cli/src/mcp/shim.test.ts | 3 +
packages/cli/src/mcp/shim.ts | 3 +-
packages/cli/src/sharing/git-exclude.ts | 8 +-
.../cli/src/tsdown-bundle-coverage.test.ts | 1 +
packages/cli/src/utils/frontmatter.ts | 4 +-
packages/cli/src/utils/process-scan.ts | 1 +
packages/cli/tests/e2e/cli-linux-e2e.ts | 1 +
.../_helpers/config-race-worker.ts | 1 +
.../tests/integration/_helpers/lock-worker.ts | 6 +-
.../detached-spawn-lifetime.test.ts | 3 +-
.../integration/mcp-host-config-race.test.ts | 4 +-
.../integration/multi-project-locks.test.ts | 10 +-
packages/core/scripts/dump-schema.ts | 1 +
.../core/src/bridge/bind-frontmatter-doc.ts | 1 +
packages/core/src/bridge/bridge-invariant.ts | 1 +
.../core/src/bridge/doc-boundary-space.ts | 1 +
packages/core/src/bridge/merge-three-way.ts | 1 +
packages/core/src/bridge/normalize.ts | 1 +
packages/core/src/burst-grouping.ts | 1 +
packages/core/src/config/bind-config-doc.ts | 1 +
packages/core/src/config/bind-okignore-doc.ts | 1 +
.../core/src/config/inspect-config-paths.ts | 1 +
.../core/src/config/merge-layered.test.ts | 1 +
packages/core/src/config/merge-layered.ts | 1 +
.../core/src/config/read-config-safely.ts | 1 +
packages/core/src/config/schema-leaf.test.ts | 2 +
packages/core/src/config/schema-leaf.ts | 1 +
packages/core/src/config/source-locator.ts | 1 +
.../core/src/config/validate-patch-scopes.ts | 1 +
.../core/src/config/write-config-patch.ts | 1 +
packages/core/src/config/yaml-patch.ts | 1 +
packages/core/src/constants/code-languages.ts | 1 +
packages/core/src/constants/lifecycle.ts | 1 +
.../constants/preview-embed-starters.test.ts | 1 +
.../src/constants/preview-embed-starters.ts | 1 +
.../src/constants/preview-theme-tokens.ts | 1 +
packages/core/src/constants/upload.test.ts | 1 +
packages/core/src/constants/upload.ts | 1 +
.../src/extensions/blockquote-fidelity.ts | 1 +
.../src/extensions/code-block-fidelity.ts | 1 +
.../core/src/extensions/code-mark-fidelity.ts | 1 +
packages/core/src/extensions/comment-block.ts | 1 +
packages/core/src/extensions/comment-mark.ts | 1 +
.../src/extensions/emphasis-fidelity.test.ts | 1 +
.../core/src/extensions/emphasis-fidelity.ts | 1 +
packages/core/src/extensions/escape-mark.ts | 1 +
.../src/extensions/footnote-definition.ts | 1 +
.../core/src/extensions/footnote-reference.ts | 1 +
packages/core/src/extensions/frontmatter.ts | 1 +
.../src/extensions/hard-break-fidelity.ts | 1 +
.../core/src/extensions/heading-fidelity.ts | 1 +
.../src/extensions/html-block-fidelity.ts | 1 +
.../extensions/image-reference-fidelity.ts | 1 +
.../core/src/extensions/image-src-fidelity.ts | 1 +
.../core/src/extensions/link-fidelity.test.ts | 1 +
packages/core/src/extensions/link-fidelity.ts | 1 +
.../src/extensions/link-ref-def-fidelity.ts | 1 +
packages/core/src/extensions/list.test.ts | 1 +
packages/core/src/extensions/list.ts | 4 +
.../extensions/source-literal-mark.test.ts | 1 +
.../src/extensions/source-literal-mark.ts | 1 +
.../core/src/extensions/strike-fidelity.ts | 1 +
.../core/src/extensions/table-fidelity.ts | 1 +
packages/core/src/extensions/tag.ts | 1 +
.../thematic-break-fidelity.test.ts | 1 +
.../src/extensions/thematic-break-fidelity.ts | 1 +
packages/core/src/frontmatter/tags.ts | 1 +
packages/core/src/git/worktree-list-parser.ts | 1 +
packages/core/src/handoff/index.ts | 1 +
.../core/src/handoff/prompt-composer.test.ts | 8 +
packages/core/src/handoff/prompt-composer.ts | 1 +
packages/core/src/handoff/terminal-launch.ts | 1 +
packages/core/src/handoff/types.ts | 1 +
.../core/src/handoff/urn-ipc-registry.test.ts | 1 +
packages/core/src/handoff/urn-ipc-registry.ts | 1 +
packages/core/src/index.ts | 343 +++++++++---------
packages/core/src/installed-skills/schema.ts | 1 +
packages/core/src/keepalive/keepalive.test.ts | 2 +
packages/core/src/keepalive/keepalive.ts | 7 +-
packages/core/src/logging/renderer-log.ts | 1 +
.../core/src/markdown/callout-transformer.ts | 1 +
.../core/src/markdown/comment-promoter.ts | 1 +
.../src/markdown/dedent-block-jsx-close.ts | 1 +
.../markdown/details-accordion-promoter.ts | 1 +
packages/core/src/markdown/fence-regions.ts | 1 +
packages/core/src/markdown/fixtures/index.ts | 6 +
.../src/markdown/fixtures/perf/generate.ts | 5 +
.../src/markdown/guard-flanking-matrix.ts | 1 +
.../core/src/markdown/handler-shadow-audit.ts | 1 +
.../core/src/markdown/highlight-promoter.ts | 1 +
packages/core/src/markdown/html-to-mdast.ts | 4 +-
packages/core/src/markdown/image-promoter.ts | 1 +
packages/core/src/markdown/index.ts | 9 +
packages/core/src/markdown/math-promoter.ts | 1 +
.../src/markdown/mdast-to-hast-handlers.ts | 1 +
packages/core/src/markdown/mdast-to-html.ts | 1 +
packages/core/src/markdown/merged-walker.ts | 1 +
.../core/src/markdown/mermaid-promoter.ts | 1 +
.../core/src/markdown/parse-with-fallback.ts | 5 +
.../core/src/markdown/parser-drop-closure.ts | 1 +
packages/core/src/markdown/pipeline.ts | 1 +
.../core/src/markdown/position-aware-join.ts | 1 +
packages/core/src/markdown/position-slice.ts | 4 +-
.../rehype-plugins/skip-notion-whitespace.ts | 1 +
.../rehype-plugins/strip-cocoa-meta.ts | 1 +
.../rehype-plugins/strip-gdocs-wrapper.ts | 1 +
.../rehype-plugins/strip-github-hovercard.ts | 1 +
.../rehype-plugins/strip-gmail-classes.ts | 1 +
.../rehype-plugins/strip-gsheets-wrapper.ts | 1 +
.../rehype-plugins/strip-mso-styles.ts | 1 +
.../rehype-plugins/strip-slack-classes.ts | 1 +
.../rehype-plugins/strip-vscode-spans.ts | 1 +
.../core/src/markdown/resolve-image-url.ts | 1 +
packages/core/src/markdown/safe-url.ts | 1 +
.../core/src/markdown/serialize-helpers.ts | 1 +
.../markdown/single-dollar-math-promoter.ts | 1 +
.../core/src/markdown/to-markdown-handlers.ts | 1 +
.../core/src/markdown/unknown-mdast-guard.ts | 1 +
.../core/src/markdown/whitespace-char-ref.ts | 1 +
.../core/src/markdown/wiki-link-micromark.ts | 3 +
packages/core/src/metrics/parse-health.ts | 1 +
packages/core/src/registry/built-ins.ts | 8 +
.../src/registry/canonical-compat.test.ts | 2 +
packages/core/src/registry/index.ts | 1 +
packages/core/src/registry/projection.test.ts | 1 +
packages/core/src/registry/projection.ts | 1 +
packages/core/src/registry/types.ts | 4 +
.../src/registry/wiki-embed-compat.test.ts | 3 +
packages/core/src/schema-invariant.test.ts | 4 +
packages/core/src/schemas/api.type-tests.ts | 6 +
.../core/src/schemas/api/_envelope.test.ts | 2 +
packages/core/src/schemas/api/_envelope.ts | 3 +
packages/core/src/schemas/api/_shared.ts | 1 +
.../core/src/schemas/api/agent-write.test.ts | 1 +
packages/core/src/schemas/api/agent-write.ts | 1 +
packages/core/src/schemas/api/client-logs.ts | 1 +
.../src/schemas/api/document-read.test.ts | 1 +
.../core/src/schemas/api/document-read.ts | 1 +
packages/core/src/schemas/api/embed-detect.ts | 1 +
packages/core/src/schemas/api/history.ts | 1 +
packages/core/src/schemas/api/index.ts | 1 +
.../src/schemas/api/links-orphans.test.ts | 1 +
.../core/src/schemas/api/links-orphans.ts | 1 +
.../core/src/schemas/api/local-op.test.ts | 1 +
packages/core/src/schemas/api/local-op.ts | 1 +
packages/core/src/schemas/api/metrics.test.ts | 1 +
packages/core/src/schemas/api/metrics.ts | 1 +
packages/core/src/schemas/api/pages.test.ts | 1 +
packages/core/src/schemas/api/pages.ts | 1 +
packages/core/src/schemas/api/share.ts | 6 +
packages/core/src/schemas/api/sync-seed.ts | 1 +
.../core/src/schemas/api/tags-search.test.ts | 1 +
packages/core/src/schemas/api/tags-search.ts | 3 +
packages/core/src/schemas/cc1.ts | 1 +
.../workspace-search.tier-ranking.test.ts | 1 +
packages/core/src/server.ts | 1 +
packages/core/src/shadow-repo-layout.test.ts | 13 +-
packages/core/src/shadow-repo-layout.ts | 7 +-
.../core/src/sharing/candidate-selection.ts | 1 +
packages/core/src/sharing/receive-flow.ts | 1 +
packages/core/src/sharing/share-url.ts | 1 +
packages/core/src/skill-state/schema.ts | 1 +
.../editor-single-source.test.ts | 1 +
packages/core/src/skill-targets/schema.ts | 1 +
packages/core/src/util/atomic-yaml-write.ts | 19 +-
packages/core/src/util/file-lock.ts | 22 +-
.../core/src/utils/chunked-insert.test.ts | 1 +
packages/core/src/utils/chunked-insert.ts | 1 +
packages/core/src/utils/embed-url-rewrite.ts | 1 +
packages/core/src/utils/file-size.test.ts | 1 +
packages/core/src/utils/identity.test.ts | 1 +
packages/core/src/utils/identity.ts | 7 +-
packages/core/src/utils/loom-embed.ts | 1 +
packages/core/src/utils/path-resolve.ts | 1 +
packages/core/src/utils/pdf-anchor.ts | 1 +
packages/core/src/utils/tag-rollup.ts | 1 +
packages/core/src/utils/vimeo-embed.ts | 1 +
packages/core/src/utils/youtube-embed.test.ts | 4 +
packages/core/src/utils/youtube-embed.ts | 1 +
packages/core/src/y-prosemirror-patch.test.ts | 7 +-
.../core/tests/contract/render-html.test.ts | 1 +
.../tests/health/parse-health-gate.test.ts | 1 +
.../core/tests/health/parse-health-gate.ts | 11 +-
.../core/tests/perf/markdown-bench.test.ts | 7 +
.../core/tests/perf/regression-gate.test.ts | 2 +
packages/core/tests/perf/regression-gate.ts | 6 +
.../core/tests/perf/run-regression-gate.ts | 1 +
packages/desktop/electron.vite.config.ts | 1 +
packages/desktop/playwright.config.ts | 1 +
packages/desktop/scripts/afterPack.mjs | 1 +
packages/desktop/scripts/afterSign.mjs | 1 +
.../desktop/scripts/ensure-node-pty-exec.mjs | 1 +
packages/desktop/scripts/launch-instances.mjs | 3 +-
.../desktop/src/main/append-okignore.test.ts | 3 +-
packages/desktop/src/main/asset-allowlist.ts | 1 +
packages/desktop/src/main/asset-menu.ts | 1 +
packages/desktop/src/main/asset-safety-net.ts | 1 +
packages/desktop/src/main/auto-updater.ts | 9 +
packages/desktop/src/main/bootstrap.ts | 1 +
.../desktop/src/main/branch-info-proxy.ts | 1 +
.../src/main/bundle-replace-detector.ts | 1 +
packages/desktop/src/main/cascade-position.ts | 1 +
.../desktop/src/main/check-target-exists.ts | 1 +
packages/desktop/src/main/claude-readiness.ts | 1 +
packages/desktop/src/main/consent-dialog.ts | 1 +
.../src/main/create-new-project.test.ts | 4 +-
.../desktop/src/main/create-new-project.ts | 2 +
packages/desktop/src/main/debug-ipc.ts | 1 +
packages/desktop/src/main/desktop-logger.ts | 3 +-
packages/desktop/src/main/dialog-helpers.ts | 1 +
.../src/main/driver-boot-smoke.test.ts | 1 +
.../desktop/src/main/driver-boot-smoke.ts | 1 +
packages/desktop/src/main/embed-referer.ts | 1 +
.../desktop/src/main/folder-admission.test.ts | 2 +
.../main/git-preflight-handler-otel.test.ts | 1 +
.../src/main/git-preflight-handler.test.ts | 5 +-
.../desktop/src/main/git-preflight-handler.ts | 1 +
packages/desktop/src/main/git-remote.test.ts | 3 +-
packages/desktop/src/main/git-remote.ts | 1 +
packages/desktop/src/main/index.ts | 16 +-
packages/desktop/src/main/ipc-handlers.ts | 9 +-
packages/desktop/src/main/ipc-log.test.ts | 1 +
packages/desktop/src/main/ipc-log.ts | 1 +
.../desktop/src/main/ipc/install-skill.ts | 1 +
.../local-op-auth-idempotent-start.test.ts | 1 +
packages/desktop/src/main/ipc/local-op.ts | 1 +
packages/desktop/src/main/ipc/seed.ts | 1 +
packages/desktop/src/main/ipc/sharing.test.ts | 1 +
packages/desktop/src/main/ipc/sharing.ts | 1 +
packages/desktop/src/main/keepalive.ts | 1 +
.../desktop/src/main/list-git-worktrees.ts | 1 +
packages/desktop/src/main/mcp-wiring.ts | 12 +-
packages/desktop/src/main/menu.ts | 1 +
packages/desktop/src/main/navigator-window.ts | 1 +
packages/desktop/src/main/ok-init.test.ts | 1 +
packages/desktop/src/main/ok-init.ts | 1 +
.../desktop/src/main/onboarding-telemetry.ts | 1 +
packages/desktop/src/main/path-install.ts | 3 +-
.../src/main/process-safety-net.test.ts | 1 +
.../desktop/src/main/process-safety-net.ts | 1 +
.../desktop/src/main/project-mcp-reclaim.ts | 1 +
.../desktop/src/main/read-git-dir-kind.ts | 1 +
packages/desktop/src/main/read-head-branch.ts | 1 +
.../src/main/reduced-transparency-handler.ts | 1 +
.../src/main/remove-git-folder.test.ts | 4 +-
.../desktop/src/main/remove-git-folder.ts | 1 +
.../src/main/renderer-console-capture.ts | 4 +-
.../desktop/src/main/resolve-share-target.ts | 1 +
.../desktop/src/main/share-handoff.test.ts | 1 +
packages/desktop/src/main/share-handoff.ts | 2 +
packages/desktop/src/main/shell-allowlist.ts | 1 +
packages/desktop/src/main/show-gate.ts | 1 +
.../desktop/src/main/skill-reclaim.test.ts | 3 +-
packages/desktop/src/main/skill-reclaim.ts | 7 +-
.../src/main/spellcheck-context-menu.ts | 1 +
packages/desktop/src/main/spellcheck-menu.ts | 1 +
packages/desktop/src/main/state-store.ts | 4 +-
.../desktop/src/main/terminal-consent.test.ts | 1 +
packages/desktop/src/main/terminal-consent.ts | 1 +
.../desktop/src/main/terminal-lifecycle.ts | 1 +
packages/desktop/src/main/terminal-manager.ts | 1 +
.../desktop/src/main/terminal-telemetry.ts | 1 +
.../desktop/src/main/theme-applied-handler.ts | 1 +
packages/desktop/src/main/theme-handler.ts | 1 +
packages/desktop/src/main/url-scheme.test.ts | 1 +
packages/desktop/src/main/url-scheme.ts | 1 +
.../desktop/src/main/userdata-migration.ts | 1 +
.../desktop/src/main/utility-fork-env.test.ts | 1 +
packages/desktop/src/main/utility-fork-env.ts | 1 +
packages/desktop/src/main/window-manager.ts | 15 +-
.../desktop/src/main/window-min-size.test.ts | 1 +
packages/desktop/src/preload/index.ts | 1 +
.../desktop/src/shared/bridge-contract.ts | 1 +
packages/desktop/src/shared/entry-point.ts | 1 +
packages/desktop/src/shared/ipc-channels.ts | 1 +
packages/desktop/src/shared/ipc-events.ts | 1 +
packages/desktop/src/shared/ipc-handler.ts | 1 +
packages/desktop/src/shared/ipc-invoke.ts | 1 +
packages/desktop/src/shared/ipc-send.ts | 1 +
packages/desktop/src/shared/labels.ts | 1 +
packages/desktop/src/utility/keyring-smoke.ts | 4 +-
packages/desktop/src/utility/pty-host.ts | 1 +
packages/desktop/src/utility/server-entry.ts | 1 +
.../tests/integration/asset-open-ipc.test.ts | 1 +
.../tests/integration/auto-updater.test.ts | 30 ++
.../integration/detached-lifecycle.test.ts | 7 +-
.../tests/integration/dock-visibility.test.ts | 2 +
.../integration/ephemeral-lifecycle.test.ts | 4 +-
.../tests/integration/handoff-ipc.test.ts | 4 +-
.../ipc-channel-count-ratchet.test.ts | 1 +
.../tests/integration/m1-smoke.test.ts | 4 +-
.../no-loosely-typed-webcontents-ipc.test.ts | 1 +
.../no-resolved-value-theme-source.test.ts | 1 +
.../packaged-helper-runs-as-node.test.ts | 1 +
.../playwright-topass-budget.test.ts | 1 +
.../integration/smoke-mock-update.test.ts | 1 +
.../desktop/tests/main/asset-menu.test.ts | 1 +
.../tests/main/asset-open-handlers.test.ts | 1 +
.../tests/main/asset-safety-net.test.ts | 1 +
packages/desktop/tests/main/bootstrap.test.ts | 1 +
.../main/bundle-replace-detector.test.ts | 1 +
.../main/git-config-parser-parity.test.ts | 1 +
.../tests/main/install-skill-ipc.test.ts | 1 +
.../desktop/tests/main/ipc-handlers.test.ts | 1 +
packages/desktop/tests/main/menu.test.ts | 3 +
.../tests/main/navigator-window.test.ts | 1 +
packages/desktop/tests/main/show-gate.test.ts | 1 +
.../main/spellcheck-context-menu.test.ts | 1 +
.../tests/main/spellcheck-menu.test.ts | 1 +
.../tests/main/terminal-consent.test.ts | 1 +
.../tests/main/terminal-lifecycle.test.ts | 4 +-
.../tests/main/terminal-manager.test.ts | 1 +
.../tests/main/theme-applied-handler.test.ts | 1 +
.../desktop/tests/main/theme-handler.test.ts | 1 +
.../tests/main/update-state-handlers.test.ts | 1 +
.../tests/main/url-scheme-handler.test.ts | 1 +
.../main/window-manager-ephemeral.test.ts | 1 +
.../desktop/tests/main/window-manager.test.ts | 2 +
packages/desktop/tests/preload/bridge.test.ts | 1 +
.../tests/preload/update-listeners.test.ts | 1 +
.../smoke/_helpers/electron-cleanup.test.ts | 3 +-
.../tests/smoke/_helpers/electron-cleanup.ts | 4 +-
.../tests/smoke/_helpers/electron-stderr.ts | 1 +
.../_helpers/no-unbounded-app-close.test.ts | 1 +
.../smoke/_helpers/parse-timeouts.test.ts | 4 +-
.../tests/smoke/_helpers/parse-timeouts.ts | 1 +
.../tests/smoke/_helpers/smoke-test.ts | 4 +-
.../tests/smoke/_helpers/stale-build-guard.ts | 1 +
.../tests/smoke/_nav-empty-840x600.e2e.ts | 4 +-
.../tests/smoke/_nav-size-screenshots.e2e.ts | 4 +-
.../smoke/agent-patch-divergence-probe.e2e.ts | 3 +
.../desktop/tests/smoke/calibration.test.ts | 1 +
.../desktop/tests/smoke/consent-dialog.e2e.ts | 4 +-
.../tests/smoke/create-new-project.e2e.ts | 4 +-
packages/desktop/tests/smoke/deep-link.e2e.ts | 4 +-
.../desktop/tests/smoke/external-link.e2e.ts | 1 +
.../desktop/tests/smoke/mcp-wiring.e2e.ts | 13 +-
.../smoke/navigator-close-on-open.e2e.ts | 1 +
.../tests/smoke/qa-create-new-extended.e2e.ts | 4 +-
.../smoke/rename-divergence-probe.e2e.ts | 4 +-
.../smoke/share-receive-multi-worktree.e2e.ts | 2 +
.../sidebar-create-rename-editable.e2e.ts | 1 +
.../smoke/sidebar-pill-lockstep-fade.e2e.ts | 1 +
.../desktop/tests/smoke/terminal-dock.e2e.ts | 4 +-
.../desktop/tests/smoke/theme-sync.e2e.ts | 1 +
.../tests/smoke/window-min-size.e2e.ts | 1 +
.../unit/auto-updater-apply-channel.test.ts | 1 +
.../tests/unit/bridge-contract-types.test.ts | 1 +
.../electron-builder-cli-native-deps.test.ts | 1 +
.../unit/electron-builder-cli-pkgjson.test.ts | 1 +
.../electron-builder-node-pty-deps.test.ts | 1 +
...ectron-builder-parcel-watcher-deps.test.ts | 7 +-
.../unit/electron-cleanup-bounded.test.ts | 1 +
.../tests/unit/ensure-node-pty-exec.test.ts | 1 +
.../unit/entitlements-helper-split.test.ts | 1 +
.../unit/helper-bundle-info-plist.test.ts | 1 +
.../unit/helper-bundle-name-agreement.test.ts | 1 +
.../desktop/tests/unit/ok-wrapper.test.ts | 1 +
...ke-test-fixture-attach-conditional.test.ts | 1 +
.../unit/state-store-channel-fields.test.ts | 1 +
.../tests/unit/state-store-m3-fields.test.ts | 1 +
.../tests/utility/pty-flood.harness.ts | 17 +-
.../desktop/tests/utility/pty-flood.test.ts | 1 +
.../tests/utility/pty-host-real-io.test.ts | 1 +
.../tests/utility/pty-host-reap.test.ts | 4 +-
.../tests/utility/pty-host.real-io-harness.ts | 1 +
.../tests/utility/pty-host.reap-harness.ts | 4 +-
.../desktop/tests/utility/pty-host.test.ts | 1 +
.../tests/utility/server-entry.test.ts | 2 +
.../server/assets/skills/project/SKILL.md | 4 +-
.../scripts/build-skill-bundles.test.ts | 3 +-
packages/server/src/activity-log.ts | 1 +
packages/server/src/agent-activity.test.ts | 4 +
packages/server/src/agent-activity.ts | 4 +
packages/server/src/agent-presence.test.ts | 1 +
packages/server/src/agent-sessions.ts | 1 +
...ent-write-replace-crdt-convergence.test.ts | 1 +
packages/server/src/agent-write-summary.ts | 1 +
.../server/src/api-agent-frontmatter.test.ts | 1 +
packages/server/src/api-create-page.test.ts | 7 +-
.../src/api-document-list-ready-gate.test.ts | 1 +
packages/server/src/api-extension.ts | 71 +++-
.../src/api-rename-rollback-summary.test.ts | 2 +
.../src/api-search-semantic-factory.test.ts | 1 +
.../server/src/api-search-semantic.test.ts | 1 +
packages/server/src/api-search.test.ts | 2 +
.../server/src/apply-managed-rename.test.ts | 1 +
...asset-serve-middleware.integration.test.ts | 1 +
.../server/src/asset-serve-middleware.test.ts | 1 +
packages/server/src/asset-serve-middleware.ts | 1 +
packages/server/src/asset-walk.ts | 1 +
packages/server/src/backlink-index.test.ts | 5 +
packages/server/src/bash/index.ts | 1 +
packages/server/src/bash/mtime-scan.ts | 3 +-
packages/server/src/bash/parse-command.ts | 1 +
.../server/src/boot-conflict-restore.test.ts | 4 +-
.../src/boot-walk-responsiveness.test.ts | 1 +
packages/server/src/boot.test.ts | 3 +
packages/server/src/boot.ts | 9 +-
.../server/src/bridge-no-wallclock.test.ts | 1 +
packages/server/src/bridge-quiescence.test.ts | 1 +
packages/server/src/bridge-quiescence.ts | 1 +
packages/server/src/bridge-watchdog.test.ts | 8 +
packages/server/src/bridge-watchdog.ts | 4 +
packages/server/src/build-skill-zip.test.ts | 1 +
packages/server/src/build-skill-zip.ts | 2 +
.../server/src/collab-message-limit.test.ts | 3 +-
.../server/src/config-file-watcher.test.ts | 9 +-
packages/server/src/config-file-watcher.ts | 4 +-
.../server/src/config-persistence.test.ts | 7 +-
packages/server/src/config-persistence.ts | 4 +-
packages/server/src/config-telemetry.test.ts | 3 +-
packages/server/src/config/paths.ts | 1 +
packages/server/src/config/schema.test.ts | 2 +
packages/server/src/config/schema.ts | 1 +
packages/server/src/conflict-errors.test.ts | 1 +
packages/server/src/conflict-errors.ts | 1 +
.../server/src/conflict-lifecycle-seed.ts | 1 +
packages/server/src/conflict-storage.test.ts | 4 +
packages/server/src/conflict-storage.ts | 5 +
packages/server/src/content-filter.test.ts | 1 +
packages/server/src/content-filter.ts | 5 +-
packages/server/src/content/enrichment.ts | 3 +-
.../src/content/folder-frontmatter-write.ts | 4 +-
.../server/src/content/frontmatter-merge.ts | 1 +
.../server/src/content/nested-folder-rules.ts | 1 +
packages/server/src/content/skills-write.ts | 18 +-
packages/server/src/content/substitution.ts | 1 +
.../server/src/content/templates-resolver.ts | 1 +
.../server/src/content/templates-write.ts | 10 +-
packages/server/src/contributor-tracker.ts | 1 +
packages/server/src/doc-extensions.ts | 1 +
packages/server/src/doc-lineage-guard.test.ts | 1 +
packages/server/src/doc-lineage-guard.ts | 1 +
packages/server/src/document-list.test.ts | 2 +
packages/server/src/embed-probe.test.ts | 10 +-
packages/server/src/embed-probe.ts | 3 +
packages/server/src/embeddings/chunking.ts | 1 +
.../server/src/embeddings/concept-embedder.ts | 1 +
packages/server/src/embeddings/embedder.ts | 1 +
.../eval/semantic-eval.smoke.test.ts | 1 +
.../src/embeddings/eval/semantic-eval.ts | 1 +
packages/server/src/embeddings/index.ts | 1 +
.../server/src/embeddings/secrets-store.ts | 4 +-
.../server/src/embeddings/semantic-config.ts | 1 +
.../src/embeddings/semantic-search-service.ts | 1 +
.../server/src/embeddings/vector-cache.ts | 1 +
packages/server/src/error-classification.ts | 9 +
packages/server/src/external-change.ts | 1 +
packages/server/src/file-logger.test.ts | 4 +-
packages/server/src/file-logger.ts | 3 +-
packages/server/src/file-watcher.test.ts | 5 +
packages/server/src/file-watcher.ts | 12 +
.../server/src/frontmatter-malformed-error.ts | 1 +
packages/server/src/fs-traced.ts | 3 +
packages/server/src/fs/find-git-root.ts | 1 +
packages/server/src/fs/find-project-root.ts | 1 +
packages/server/src/gh-token-source.ts | 1 +
packages/server/src/git-branch-info.ts | 1 +
packages/server/src/git-checkout.ts | 1 +
packages/server/src/git-dirty.ts | 1 +
packages/server/src/git-handle.ts | 3 +
packages/server/src/git-identity.test.ts | 3 +
packages/server/src/git-identity.ts | 5 +
.../server/src/git-identity.worktree.test.ts | 3 +
packages/server/src/git-mutex.ts | 1 +
.../server/src/git-preflight-boot.test.ts | 9 +-
.../server/src/git-preflight-spawn.test.ts | 1 +
.../src/git-preflight-telemetry.test.ts | 1 +
.../server/src/git-preflight-telemetry.ts | 1 +
packages/server/src/git-preflight.test.ts | 12 +
packages/server/src/git-preflight.ts | 9 +
.../server/src/github-permissions.test.ts | 5 +
packages/server/src/github-permissions.ts | 2 +
packages/server/src/handoff-api.test.ts | 1 +
packages/server/src/handoff-api.ts | 4 +-
.../server/src/handoff-dispatch-api.test.ts | 1 +
packages/server/src/handoff-dispatch-api.ts | 1 +
packages/server/src/head-watcher.ts | 9 +-
.../server/src/http/error-response.test.ts | 1 +
packages/server/src/http/error-response.ts | 1 +
.../src/http/request-validation.test.ts | 4 +-
.../server/src/http/request-validation.ts | 1 +
.../server/src/http/success-response.test.ts | 1 +
packages/server/src/http/success-response.ts | 1 +
packages/server/src/hub-candidates.ts | 1 +
packages/server/src/idle-shutdown.test.ts | 2 +
packages/server/src/idle-shutdown.ts | 1 +
packages/server/src/init-project.ts | 1 +
.../server/src/installed-skills-marker.ts | 1 +
.../src/keepalive-presence-bootstrap.test.ts | 3 +-
.../src/keepalive-presence-cleanup.test.ts | 3 +-
packages/server/src/local-op-security.test.ts | 10 +
packages/server/src/local-op-security.ts | 5 +
packages/server/src/local-ops/auth-flow.ts | 1 +
packages/server/src/local-ops/auth-query.ts | 1 +
.../local-ops/clone-error-classify.test.ts | 1 +
.../src/local-ops/clone-error-classify.ts | 1 +
.../server/src/local-ops/clone-flow.test.ts | 1 +
packages/server/src/local-ops/clone-flow.ts | 1 +
packages/server/src/local-ops/subprocess.ts | 4 +-
packages/server/src/local-ops/types.ts | 1 +
packages/server/src/local-sink-resolver.ts | 1 +
packages/server/src/logger.ts | 2 +
.../src/loopback-bind-discipline.test.ts | 1 +
.../server/src/loopback-rig-test-helpers.ts | 1 +
.../src/managed-artifact-persistence.ts | 1 +
.../server/src/managed-artifact-watcher.ts | 1 +
.../server/src/managed-rename-rewrite.test.ts | 1 +
packages/server/src/mcp-http.test.ts | 7 +-
packages/server/src/mcp-mount.ts | 4 +-
packages/server/src/mcp/agent-identity.ts | 1 +
packages/server/src/mcp/logger.ts | 3 +
.../src/mcp/tools/advisory-warnings.test.ts | 1 +
packages/server/src/mcp/tools/config.ts | 1 +
.../server/src/mcp/tools/consolidate-body.ts | 1 +
.../server/src/mcp/tools/discover-body.ts | 1 +
packages/server/src/mcp/tools/edit.ts | 5 +
packages/server/src/mcp/tools/exec.test.ts | 1 +
.../src/mcp/tools/get-preview-url.test.ts | 1 +
.../server/src/mcp/tools/get-preview-url.ts | 4 +-
packages/server/src/mcp/tools/index.ts | 1 +
packages/server/src/mcp/tools/ingest-body.ts | 1 +
packages/server/src/mcp/tools/links.ts | 1 +
.../tools/output-schema-strictness.test.ts | 5 +-
packages/server/src/mcp/tools/palette.test.ts | 1 +
packages/server/src/mcp/tools/palette.ts | 1 +
.../src/mcp/tools/preview-url-test-helpers.ts | 1 +
.../server/src/mcp/tools/research-body.ts | 1 +
.../server/src/mcp/tools/resolve-conflict.ts | 1 +
packages/server/src/mcp/tools/search.test.ts | 1 +
packages/server/src/mcp/tools/search.ts | 1 +
packages/server/src/mcp/tools/shared.test.ts | 5 +
packages/server/src/mcp/tools/shared.ts | 4 +
.../server/src/mcp/tools/skill-target.test.ts | 1 +
packages/server/src/mcp/tools/skill-target.ts | 2 +
packages/server/src/mcp/tools/skills.test.ts | 38 +-
packages/server/src/mcp/tools/skills.ts | 17 +
packages/server/src/mcp/tools/verb-schemas.ts | 3 +
packages/server/src/mcp/tools/wiki-body.ts | 1 +
packages/server/src/mcp/tools/write.ts | 4 +
packages/server/src/mermaid-validator.test.ts | 1 +
packages/server/src/mermaid-validator.ts | 1 +
.../src/mermaid-version-alignment.test.ts | 1 +
packages/server/src/metrics.ts | 1 +
.../server/src/missing-ok-config-error.ts | 1 +
packages/server/src/package-exports.test.ts | 1 +
.../src/paired-write-enforcement.test.ts | 3 +
.../server/src/paired-write-origin.test.ts | 5 +-
packages/server/src/pane-target.ts | 4 +-
...path-conditional-map-driven-origin.test.ts | 1 +
packages/server/src/path-utils.test.ts | 1 +
packages/server/src/perf-measurement.test.ts | 1 +
packages/server/src/perf-measurement.ts | 1 +
.../src/persistence-deferred-store.test.ts | 6 +-
.../server/src/persistence-fan-out.test.ts | 2 +
.../src/persistence-phantom-doc-guard.test.ts | 1 +
.../src/persistence-ytext-truth.test.ts | 5 +
packages/server/src/persistence.test.ts | 3 +
packages/server/src/persistence.ts | 14 +-
packages/server/src/process-lock.ts | 10 +-
packages/server/src/recently-removed-docs.ts | 1 +
packages/server/src/reconciliation.test.ts | 4 +
packages/server/src/reconciliation.ts | 7 +
.../server/src/removal-redirect-guard.test.ts | 13 +-
packages/server/src/removal-redirect-guard.ts | 1 +
packages/server/src/rename-log.test.ts | 1 +
packages/server/src/rename-log.ts | 17 +-
.../server/src/resolve-package-version.ts | 3 +-
.../src/rig-loopback-exclusivity.test.ts | 1 +
packages/server/src/save-version.test.ts | 6 +-
packages/server/src/seed/index.ts | 1 +
.../server/src/seed/install-pack-skill.ts | 4 +-
.../server/src/seed/okf-conformance.test.ts | 1 +
packages/server/src/seed/path-safety.ts | 1 +
packages/server/src/seed/rationale.ts | 1 +
.../src/seed/seed-frontmatter-guard.test.ts | 1 +
packages/server/src/seed/starter.ts | 11 +
packages/server/src/seed/types.ts | 1 +
.../server/src/serialize-doc-ytext.test.ts | 2 +
packages/server/src/server-factory.test.ts | 8 +
packages/server/src/server-factory.ts | 20 +-
packages/server/src/server-lock.ts | 1 +
...erver-observers-divergent-fallback.test.ts | 5 +
packages/server/src/server-observers.test.ts | 8 +
packages/server/src/server-observers.ts | 5 +
packages/server/src/shadow-branch-gc.ts | 4 +-
packages/server/src/shadow-lock.ts | 4 +-
packages/server/src/shadow-repo.test.ts | 3 +
packages/server/src/shadow-repo.ts | 56 ++-
packages/server/src/share/construct-url.ts | 1 +
packages/server/src/share/git-context.ts | 1 +
.../src/share/publish.integration.test.ts | 4 +
packages/server/src/share/publish.test.ts | 1 +
packages/server/src/share/publish.ts | 11 +-
packages/server/src/showall-stream.test.ts | 2 +
packages/server/src/single-file-open.ts | 1 +
packages/server/src/skill-bundles.ts | 1 +
.../server/src/skill-install-events.test.ts | 1 +
packages/server/src/skill-install-events.ts | 1 +
packages/server/src/skill-install.test.ts | 5 +-
packages/server/src/skill-install.ts | 13 +-
packages/server/src/skill-management.ts | 1 +
packages/server/src/skill-projection.ts | 1 +
packages/server/src/skill-reconcile.ts | 4 +-
packages/server/src/skill-reproject.ts | 1 +
packages/server/src/skill-restore.ts | 1 +
packages/server/src/skill-state.test.ts | 1 +
packages/server/src/skill-state.ts | 1 +
packages/server/src/skill-targets-store.ts | 1 +
packages/server/src/spawn-cursor-api.test.ts | 1 +
packages/server/src/spawn-cursor-api.ts | 1 +
packages/server/src/spawn-detached.test.ts | 1 +
packages/server/src/spawn-detached.ts | 4 +-
packages/server/src/sync-engine.test.ts | 23 +-
packages/server/src/sync-engine.ts | 37 +-
packages/server/src/sync-timing.test.ts | 1 +
packages/server/src/sync-timing.ts | 1 +
packages/server/src/tag-index.ts | 1 +
packages/server/src/telemetry-file-sink.ts | 14 +-
packages/server/src/telemetry.test.ts | 1 +
packages/server/src/timeline-query.ts | 22 +-
.../src/tolerance-telemetry-writer.test.ts | 3 +-
.../server/src/tsdown-bundle-coverage.test.ts | 1 +
packages/server/src/ui-lock.ts | 1 +
packages/server/src/upload-errors.test.ts | 3 +
packages/server/src/upload-errors.ts | 1 +
packages/server/src/upload-streaming.test.ts | 1 +
packages/server/src/upload-streaming.ts | 9 +-
packages/server/src/version-constants.ts | 3 +-
1532 files changed, 3756 insertions(+), 634 deletions(-)
create mode 100644 .changeset/skills-tool-builtin-skill-hint.md
diff --git a/.changeset/skills-tool-builtin-skill-hint.md b/.changeset/skills-tool-builtin-skill-hint.md
new file mode 100644
index 00000000..f59aa6cf
--- /dev/null
+++ b/.changeset/skills-tool-builtin-skill-hint.md
@@ -0,0 +1,9 @@
+---
+"@inkeep/open-knowledge": patch
+---
+
+Stop two ways agents get derailed around the skill surface.
+
+- The `skills` MCP tool now short-circuits OpenKnowledge's own built-in skills instead of 404-ing. An agent told to "load the open-knowledge skill" would call `skills({ name: "open-knowledge" })`, hit a bare `Skill not found.`, and fall back to cat-ing the bundled SKILL.md. The built-ins (`open-knowledge`, `open-knowledge-discovery`, `open-knowledge-write-skill`) are runtime agent skills projected into editor host dirs, never KB content skills, so a READ aimed at one now returns a teaching error explaining it is already in the agent's loaded skill list and is not fetched through this tool. User-authored `open-knowledge-pack-*` skills are unaffected, and the tool description states the boundary up front.
+
+- The project SKILL.md escape hatch now tells agents that their initial tool list is not exhaustive: some clients (notably Codex) defer MCP tools behind a lazy `tool_search` step, so `mcp__open-knowledge__*` is absent until discovered. Absence from the visible list means "not discovered yet," not "not registered" — agents must run tool discovery before invoking the native-tools escape hatch.
diff --git a/docs/scripts/generate-og-wordmark.ts b/docs/scripts/generate-og-wordmark.ts
index 2acc8793..a28d174c 100644
--- a/docs/scripts/generate-og-wordmark.ts
+++ b/docs/scripts/generate-og-wordmark.ts
@@ -1,6 +1,7 @@
import { readFileSync, writeFileSync } from 'node:fs';
import path from 'node:path';
+
const root = path.resolve(import.meta.dirname, '..');
const svg = readFileSync(path.join(root, 'public', 'ok-wordmark.svg'));
const dataUrl = `data:image/svg+xml;base64,${svg.toString('base64')}`;
diff --git a/docs/src/app/(home)/sections/eng-specs-graphic.tsx b/docs/src/app/(home)/sections/eng-specs-graphic.tsx
index b208fee1..c62ffde1 100644
--- a/docs/src/app/(home)/sections/eng-specs-graphic.tsx
+++ b/docs/src/app/(home)/sections/eng-specs-graphic.tsx
@@ -1,5 +1,6 @@
import { Code, Sparkles } from 'lucide-react';
+
const RINGS = [56, 82, 108] as const;
const RING_CENTER = { x: 80, y: 45 };
diff --git a/docs/src/app/(home)/sections/knowledge-base-graphic.tsx b/docs/src/app/(home)/sections/knowledge-base-graphic.tsx
index 112feb5b..1482256c 100644
--- a/docs/src/app/(home)/sections/knowledge-base-graphic.tsx
+++ b/docs/src/app/(home)/sections/knowledge-base-graphic.tsx
@@ -1,6 +1,7 @@
import { Sparkles } from 'lucide-react';
import type { CSSProperties } from 'react';
+
const RINGS = [56, 82, 108] as const;
const RING_CENTER = { x: 80, y: 45 };
diff --git a/docs/src/components/copy-prompt.tsx b/docs/src/components/copy-prompt.tsx
index 6a74157b..28ca3b40 100644
--- a/docs/src/components/copy-prompt.tsx
+++ b/docs/src/components/copy-prompt.tsx
@@ -26,7 +26,8 @@ export function CopyPrompt({ children }: CopyPromptProps) {
await navigator.clipboard.writeText(text);
setCopied(true);
window.setTimeout(() => setCopied(false), 2000);
- } catch {}
+ } catch {
+ }
};
return (
diff --git a/docs/src/components/ok-editor/bubble-menu.tsx b/docs/src/components/ok-editor/bubble-menu.tsx
index 2913be65..145b7cbe 100644
--- a/docs/src/components/ok-editor/bubble-menu.tsx
+++ b/docs/src/components/ok-editor/bubble-menu.tsx
@@ -113,7 +113,8 @@ export function OkBubbleMenu({ editor }: { editor: Editor }) {
popup.style.left = `${x}px`;
popup.style.top = `${y}px`;
})
- .catch(() => {});
+ .catch(() => {
+ });
});
};
diff --git a/docs/src/components/ok-editor/drag-handle.tsx b/docs/src/components/ok-editor/drag-handle.tsx
index dd451784..da2e313d 100644
--- a/docs/src/components/ok-editor/drag-handle.tsx
+++ b/docs/src/components/ok-editor/drag-handle.tsx
@@ -68,7 +68,8 @@ export const BlockDragHandle = Extension.create({
if (curPos < 0) return;
try {
editor.chain().focus().setNodeSelection(curPos).run();
- } catch {}
+ } catch {
+ }
});
return [
diff --git a/docs/src/components/ok-editor/preview-code-block.tsx b/docs/src/components/ok-editor/preview-code-block.tsx
index 0c114fd9..2684ed1f 100644
--- a/docs/src/components/ok-editor/preview-code-block.tsx
+++ b/docs/src/components/ok-editor/preview-code-block.tsx
@@ -9,6 +9,7 @@ import {
} from '@tiptap/react';
import { Trash2 } from 'lucide-react';
+
const THEME_VARS = PREVIEW_THEME_TOKENS.map((t) => `${t.name}:${t.light}`).join(';');
const CHART_PALETTE = [
diff --git a/docs/src/components/overview-blocks.tsx b/docs/src/components/overview-blocks.tsx
index b8d540de..3e8d0cbf 100644
--- a/docs/src/components/overview-blocks.tsx
+++ b/docs/src/components/overview-blocks.tsx
@@ -1,6 +1,7 @@
import { ArrowRight, Bot, Database, type LucideIcon, NotebookPen } from 'lucide-react';
import type { ReactNode } from 'react';
+
interface Layer {
k: string;
Icon: LucideIcon;
diff --git a/docs/src/components/tabs.test.ts b/docs/src/components/tabs.test.ts
index 60f3e2a7..df62a0f0 100644
--- a/docs/src/components/tabs.test.ts
+++ b/docs/src/components/tabs.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { composeTabId, slugifyTabId } from './tabs.tsx';
diff --git a/docs/src/components/tabs.tsx b/docs/src/components/tabs.tsx
index b58677dc..03179edf 100644
--- a/docs/src/components/tabs.tsx
+++ b/docs/src/components/tabs.tsx
@@ -1,5 +1,6 @@
'use client';
+
import {
Tab as FumadocsTab,
Tabs as FumadocsTabs,
diff --git a/docs/src/lib/deferred-share.ts b/docs/src/lib/deferred-share.ts
index 298df0ad..bdba626a 100644
--- a/docs/src/lib/deferred-share.ts
+++ b/docs/src/lib/deferred-share.ts
@@ -1,3 +1,4 @@
+
export const PENDING_SHARE_COOKIE = 'ok_pending_share';
export const PENDING_SHARE_MAX_AGE_SECONDS = 7 * 24 * 60 * 60;
diff --git a/docs/src/lib/share-splash.ts b/docs/src/lib/share-splash.ts
index 47ac185c..3b94241a 100644
--- a/docs/src/lib/share-splash.ts
+++ b/docs/src/lib/share-splash.ts
@@ -1,3 +1,4 @@
+
import { SITE_NAME } from './site';
const SHARE_URL_VERSION_V1 = 0x01;
diff --git a/packages/app/playwright.a11y.config.ts b/packages/app/playwright.a11y.config.ts
index b7a2a09b..b9061eca 100644
--- a/packages/app/playwright.a11y.config.ts
+++ b/packages/app/playwright.a11y.config.ts
@@ -1,5 +1,6 @@
import { defineConfig } from '@playwright/test';
+
const isCI = !!process.env.CI;
export default defineConfig({
diff --git a/packages/app/playwright.config.ts b/packages/app/playwright.config.ts
index f6c9ec05..910a7870 100644
--- a/packages/app/playwright.config.ts
+++ b/packages/app/playwright.config.ts
@@ -1,5 +1,6 @@
import { defineConfig } from '@playwright/test';
+
const isCI = !!process.env.CI;
export default defineConfig({
diff --git a/packages/app/playwright.visual.config.ts b/packages/app/playwright.visual.config.ts
index e9f60626..c522418a 100644
--- a/packages/app/playwright.visual.config.ts
+++ b/packages/app/playwright.visual.config.ts
@@ -1,5 +1,6 @@
import { defineConfig } from '@playwright/test';
+
const isCI = !!process.env.CI;
export default defineConfig({
diff --git a/packages/app/src/build/app-version.ts b/packages/app/src/build/app-version.ts
index 8de3d072..9c69e05d 100644
--- a/packages/app/src/build/app-version.ts
+++ b/packages/app/src/build/app-version.ts
@@ -12,7 +12,8 @@ export function resolveAppVersion(): string {
if (typeof pkg.version === 'string' && pkg.version.length > 0) {
return pkg.version;
}
- } catch {}
+ } catch {
+ }
return '0.0.0-unknown';
}
diff --git a/packages/app/src/build/electron-mode-class.test.ts b/packages/app/src/build/electron-mode-class.test.ts
index d3e9a169..c13d9303 100644
--- a/packages/app/src/build/electron-mode-class.test.ts
+++ b/packages/app/src/build/electron-mode-class.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { readFileSync } from 'node:fs';
import { join } from 'node:path';
diff --git a/packages/app/src/components/ActivityModeContent.tsx b/packages/app/src/components/ActivityModeContent.tsx
index 44e04f34..7f8d8801 100644
--- a/packages/app/src/components/ActivityModeContent.tsx
+++ b/packages/app/src/components/ActivityModeContent.tsx
@@ -12,6 +12,7 @@ import { AgentIcon } from './icons/AgentIcon';
import { Button } from './ui/button';
import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';
+
async function postAgentUndo(body: {
connectionId: string;
docName: string;
@@ -31,6 +32,7 @@ async function postAgentUndo(body: {
}
}
+
function hashFromDocName(docName: string): string {
return `#/${docName
.split('/')
@@ -43,6 +45,7 @@ function navigateToDoc(docName: string): void {
window.location.hash = hashFromDocName(docName);
}
+
function LoadingState(): React.JSX.Element {
return (
['data'];
status: ReturnType
['status'];
@@ -304,6 +308,7 @@ function ActivityModeBody({
);
}
+
export function ActivityModeContent({
showBackButton = true,
}: {
diff --git a/packages/app/src/components/ArrayOfObjectsWidget.tsx b/packages/app/src/components/ArrayOfObjectsWidget.tsx
index dc373f2f..1c9159bc 100644
--- a/packages/app/src/components/ArrayOfObjectsWidget.tsx
+++ b/packages/app/src/components/ArrayOfObjectsWidget.tsx
@@ -1,3 +1,4 @@
+
import {
closestCenter,
DndContext,
diff --git a/packages/app/src/components/AuthModal.dom.test.tsx b/packages/app/src/components/AuthModal.dom.test.tsx
index bfa5538b..ad9b4a9e 100644
--- a/packages/app/src/components/AuthModal.dom.test.tsx
+++ b/packages/app/src/components/AuthModal.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, jest, test } from 'bun:test';
import { act, cleanup, render, screen } from '@testing-library/react';
import type { OkLocalOpAuthEvent, OkLocalOpAuthStatusResponse } from '@/lib/desktop-bridge-types';
diff --git a/packages/app/src/components/AuthModal.tsx b/packages/app/src/components/AuthModal.tsx
index 67ddcf0f..1b87a0f9 100644
--- a/packages/app/src/components/AuthModal.tsx
+++ b/packages/app/src/components/AuthModal.tsx
@@ -19,10 +19,12 @@ import {
} from './ui/dialog';
import { Input } from './ui/input';
+
async function copyToClipboard(text: string): Promise {
try {
await navigator.clipboard.writeText(text);
- } catch {}
+ } catch {
+ }
}
interface AuthSuccessResult {
@@ -42,6 +44,7 @@ interface AuthModalProps {
queryTransport?: AuthQueryTransport;
}
+
interface DeviceFlowPanelProps {
onSuccess: (result: AuthSuccessResult) => void;
transport: AuthTransport;
@@ -202,6 +205,7 @@ function DeviceFlowPanel({ onSuccess, transport }: DeviceFlowPanelProps) {
);
}
+
interface IdentityBodyProps {
login: string;
name: string;
@@ -237,6 +241,7 @@ function IdentityBody({ login, name, onNameChange, email, onEmailChange }: Ident
);
}
+
type AuthStep = 'checking' | 'auth' | 'identity' | 'done';
const IDENTITY_PROBE_TIMEOUT_MS = 10_000;
@@ -323,7 +328,8 @@ export function AuthModal({
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name, email }),
- }).catch(() => {});
+ }).catch(() => {
+ });
const result = { ...(authResult ?? { login: '' }), name, email };
setStep('done');
diff --git a/packages/app/src/components/AutoSyncOnboardingDialog.tsx b/packages/app/src/components/AutoSyncOnboardingDialog.tsx
index 80215913..fcce67ea 100644
--- a/packages/app/src/components/AutoSyncOnboardingDialog.tsx
+++ b/packages/app/src/components/AutoSyncOnboardingDialog.tsx
@@ -42,7 +42,10 @@ export function AutoSyncOnboardingDialog({ open, onResolved }: AutoSyncOnboardin
}
return (
- {}}>
+ {}}
+ >
diff --git a/packages/app/src/components/BetaBadge.tsx b/packages/app/src/components/BetaBadge.tsx
index 9c227d08..3dd7f5b6 100644
--- a/packages/app/src/components/BetaBadge.tsx
+++ b/packages/app/src/components/BetaBadge.tsx
@@ -1,3 +1,4 @@
+
import { Trans, useLingui } from '@lingui/react/macro';
import { useUpdateChannel } from '@/hooks/use-update-channel';
import { Badge } from './ui/badge';
diff --git a/packages/app/src/components/BottomComposer.dom.test.tsx b/packages/app/src/components/BottomComposer.dom.test.tsx
index f57c2b35..b7829577 100644
--- a/packages/app/src/components/BottomComposer.dom.test.tsx
+++ b/packages/app/src/components/BottomComposer.dom.test.tsx
@@ -265,7 +265,8 @@ beforeEach(() => {
toastErrors.length = 0;
try {
window.localStorage.clear();
- } catch {}
+ } catch {
+ }
});
afterEach(() => {
diff --git a/packages/app/src/components/BottomComposer.tsx b/packages/app/src/components/BottomComposer.tsx
index 02b20be0..0f7d794d 100644
--- a/packages/app/src/components/BottomComposer.tsx
+++ b/packages/app/src/components/BottomComposer.tsx
@@ -1,3 +1,4 @@
+
import {
type TargetData,
TERMINAL_CLI_IDS,
@@ -185,7 +186,8 @@ export function BottomComposer({
if (overlap <= 0) return;
const scroller = view.dom.closest('.editor-doc-scroll');
if (scroller instanceof HTMLElement) scroller.scrollTop += overlap;
- } catch {}
+ } catch {
+ }
});
};
const card = cardRef.current;
diff --git a/packages/app/src/components/ClaudeReadinessBanner.dom.test.tsx b/packages/app/src/components/ClaudeReadinessBanner.dom.test.tsx
index daa5874b..2bff838d 100644
--- a/packages/app/src/components/ClaudeReadinessBanner.dom.test.tsx
+++ b/packages/app/src/components/ClaudeReadinessBanner.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
import type { ClaudeReadiness, OkDesktopBridge } from '@/lib/desktop-bridge-types';
diff --git a/packages/app/src/components/CloneDialog.dom.test.tsx b/packages/app/src/components/CloneDialog.dom.test.tsx
index ed5bcb30..fe93c4b0 100644
--- a/packages/app/src/components/CloneDialog.dom.test.tsx
+++ b/packages/app/src/components/CloneDialog.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, test } from 'bun:test';
import { cleanup, render, screen } from '@testing-library/react';
import { getLastKnownSignedIn, setLastKnownSignedIn } from '@/lib/auth-state-cache';
diff --git a/packages/app/src/components/ComposerContextChips.dom.test.tsx b/packages/app/src/components/ComposerContextChips.dom.test.tsx
index 77d6f350..7b3f25bb 100644
--- a/packages/app/src/components/ComposerContextChips.dom.test.tsx
+++ b/packages/app/src/components/ComposerContextChips.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, mock, test } from 'bun:test';
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
import type { ReactNode } from 'react';
diff --git a/packages/app/src/components/ComposerContextChips.tsx b/packages/app/src/components/ComposerContextChips.tsx
index 3b102c9c..28098339 100644
--- a/packages/app/src/components/ComposerContextChips.tsx
+++ b/packages/app/src/components/ComposerContextChips.tsx
@@ -1,3 +1,4 @@
+
import { useLingui } from '@lingui/react/macro';
import { X } from 'lucide-react';
import type { ReactNode } from 'react';
diff --git a/packages/app/src/components/ConsentDialog.tsx b/packages/app/src/components/ConsentDialog.tsx
index 204a576c..037a8205 100644
--- a/packages/app/src/components/ConsentDialog.tsx
+++ b/packages/app/src/components/ConsentDialog.tsx
@@ -1,3 +1,4 @@
+
import { lazy, Suspense, useSyncExternalStore } from 'react';
import { consentStore } from '@/lib/consent-store';
diff --git a/packages/app/src/components/CopyButton.tsx b/packages/app/src/components/CopyButton.tsx
index 50a7763c..8e9beb5d 100644
--- a/packages/app/src/components/CopyButton.tsx
+++ b/packages/app/src/components/CopyButton.tsx
@@ -1,3 +1,4 @@
+
import { useLingui } from '@lingui/react/macro';
import { Check, Copy } from 'lucide-react';
import { useEffect, useState } from 'react';
@@ -39,7 +40,8 @@ export function CopyButton({
.then(() => clipboardWrite(copyContent))
.then(
() => setCopyTick((n) => n + 1),
- () => {},
+ () => {
+ },
);
};
diff --git a/packages/app/src/components/CreateProjectDialog.cascade-staleness.dom.test.tsx b/packages/app/src/components/CreateProjectDialog.cascade-staleness.dom.test.tsx
index 877e33f1..d58e51f3 100644
--- a/packages/app/src/components/CreateProjectDialog.cascade-staleness.dom.test.tsx
+++ b/packages/app/src/components/CreateProjectDialog.cascade-staleness.dom.test.tsx
@@ -511,6 +511,7 @@ describe('CreateProjectDialog cascade staleness (Tier-3 mount)', () => {
});
test('PRD-6649: 5 s polling skips probeNonce bump while a probe is in-flight (race-prevention gate)', async () => {
+
const stub = makeStubBridge(FIRST_GIT_RESULT, PARENT);
const setIntervalSpy = spyOn(globalThis, 'setInterval');
diff --git a/packages/app/src/components/CreateProjectDialog.tsx b/packages/app/src/components/CreateProjectDialog.tsx
index 9b56c160..bb46412a 100644
--- a/packages/app/src/components/CreateProjectDialog.tsx
+++ b/packages/app/src/components/CreateProjectDialog.tsx
@@ -1,3 +1,4 @@
+
import {
ALL_EDITOR_IDS,
CREATE_NEW_PROJECT_FAILURE_REASONS,
@@ -308,7 +309,8 @@ export function CreateProjectDialog({ open, onOpenChange, bridge }: CreateProjec
if (banner === null) return;
if (firedBanners.current.has(banner)) return;
firedBanners.current.add(banner);
- bridge.project.recordCreateNewBannerShown(banner).catch(() => {});
+ bridge.project.recordCreateNewBannerShown(banner).catch(() => {
+ });
}, [open, cascade, bridge]);
const rawName = name;
diff --git a/packages/app/src/components/CreateProjectMenuTrigger.tsx b/packages/app/src/components/CreateProjectMenuTrigger.tsx
index a4eb9e25..eb105d7f 100644
--- a/packages/app/src/components/CreateProjectMenuTrigger.tsx
+++ b/packages/app/src/components/CreateProjectMenuTrigger.tsx
@@ -1,3 +1,4 @@
+
import { useEffect, useState } from 'react';
import { CreateProjectDialog } from '@/components/CreateProjectDialog';
import type { OkDesktopBridge } from '@/lib/desktop-bridge-types';
diff --git a/packages/app/src/components/DeleteConfirmationDialog.tsx b/packages/app/src/components/DeleteConfirmationDialog.tsx
index 0230fda1..75730d65 100644
--- a/packages/app/src/components/DeleteConfirmationDialog.tsx
+++ b/packages/app/src/components/DeleteConfirmationDialog.tsx
@@ -43,7 +43,9 @@ export function DeleteConfirmationDialog({
{customTitle ?? t`Delete ${itemName}`}
-
+
{customDescription ??
t`Are you sure you want to delete ${itemName}? This action cannot be undone.`}
diff --git a/packages/app/src/components/DiffViewBoundary.tsx b/packages/app/src/components/DiffViewBoundary.tsx
index 5a95e4ca..f1329e9a 100644
--- a/packages/app/src/components/DiffViewBoundary.tsx
+++ b/packages/app/src/components/DiffViewBoundary.tsx
@@ -38,7 +38,8 @@ async function fetchConflictSides(file: string): Promise {
const payload = (await res.json()) as { detail?: unknown; title?: unknown };
if (typeof payload.detail === 'string') detail = payload.detail;
else if (typeof payload.title === 'string') detail = payload.title;
- } catch {}
+ } catch {
+ }
console.warn(
JSON.stringify({
event: 'conflict-content-fetch-failed',
diff --git a/packages/app/src/components/DocPanel.dom.test.tsx b/packages/app/src/components/DocPanel.dom.test.tsx
index b2567fd2..48b8323d 100644
--- a/packages/app/src/components/DocPanel.dom.test.tsx
+++ b/packages/app/src/components/DocPanel.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, mock, test } from 'bun:test';
import { cleanup, render, screen } from '@testing-library/react';
import type { ReactNode } from 'react';
diff --git a/packages/app/src/components/DocumentBoundary.test.ts b/packages/app/src/components/DocumentBoundary.test.ts
index 776e5aa0..35f25d18 100644
--- a/packages/app/src/components/DocumentBoundary.test.ts
+++ b/packages/app/src/components/DocumentBoundary.test.ts
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, test } from 'bun:test';
import { HocuspocusProvider } from '@hocuspocus/provider';
import { __resetSyncPromiseCache, syncPromise } from '@/editor/sync-promise';
@@ -25,7 +26,8 @@ afterEach(() => {
for (const p of providers) {
try {
p.destroy();
- } catch {}
+ } catch {
+ }
}
providers = [];
});
diff --git a/packages/app/src/components/DocumentBoundary.tsx b/packages/app/src/components/DocumentBoundary.tsx
index cfdb81f0..eaea173e 100644
--- a/packages/app/src/components/DocumentBoundary.tsx
+++ b/packages/app/src/components/DocumentBoundary.tsx
@@ -1,3 +1,4 @@
+
import type { HocuspocusProvider } from '@hocuspocus/provider';
import { type ReactNode, use } from 'react';
import { syncPromise } from '@/editor/sync-promise';
diff --git a/packages/app/src/components/DocumentErrorBoundary.test.ts b/packages/app/src/components/DocumentErrorBoundary.test.ts
index 0374eeb9..227ebb82 100644
--- a/packages/app/src/components/DocumentErrorBoundary.test.ts
+++ b/packages/app/src/components/DocumentErrorBoundary.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { MountAbortError } from '@/editor/mount-promise';
import {
diff --git a/packages/app/src/components/EditorActivityPool.test.ts b/packages/app/src/components/EditorActivityPool.test.ts
index be046da8..d110f573 100644
--- a/packages/app/src/components/EditorActivityPool.test.ts
+++ b/packages/app/src/components/EditorActivityPool.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { SYSTEM_DOC_NAME } from '@inkeep/open-knowledge-core';
import {
@@ -367,6 +368,7 @@ describe('computeEditorMountGate — invariant: at least one editor rendered', (
});
});
+
describe('shouldEmitFirstToggle — first-toggle mark gate', () => {
test('large doc, both editors rendering, not yet emitted → emit', () => {
expect(
diff --git a/packages/app/src/components/EditorActivityPool.tsx b/packages/app/src/components/EditorActivityPool.tsx
index d13639d3..d303ddf2 100644
--- a/packages/app/src/components/EditorActivityPool.tsx
+++ b/packages/app/src/components/EditorActivityPool.tsx
@@ -563,6 +563,7 @@ function ActivityEntry({
const [warmSnapshot] = useState(() => peekRenameSnapshot(entry.docName));
const warmHtml = warmSnapshot?.html ?? null;
+
const [hasEmittedFirstToggle, setHasEmittedFirstToggle] = useState(false);
useEffect(() => {
if (
diff --git a/packages/app/src/components/EditorActivityPool.warm-skeleton.dom.test.tsx b/packages/app/src/components/EditorActivityPool.warm-skeleton.dom.test.tsx
index c7d8b88e..6f591d21 100644
--- a/packages/app/src/components/EditorActivityPool.warm-skeleton.dom.test.tsx
+++ b/packages/app/src/components/EditorActivityPool.warm-skeleton.dom.test.tsx
@@ -12,6 +12,7 @@ import {
} from '@/editor/editor-cache';
import { expectVisualClassTokens } from '@/test-utils/visual-contract';
+
function WarmContentFallbackReplica({ html }: { html: string }) {
return (
@@ -24,6 +25,7 @@ function WarmContentFallbackReplica({ html }: { html: string }) {
);
}
+
function WarmFallbackHost({ docName }: { docName: string }) {
const [warmSnapshot] = useState(() => peekRenameSnapshot(docName));
const warmHtml = warmSnapshot?.html ?? null;
@@ -47,6 +49,7 @@ function WarmFallbackHost({ docName }: { docName: string }) {
const baseSnap = (html: string): RenameSnapshot => ({ html, scrollTop: 0, selection: null });
+
describe('WarmContentFallback DOM geometry', () => {
let consoleErrorSpy: ReturnType
;
let consoleWarnSpy: ReturnType;
@@ -161,6 +164,7 @@ describe('rename-snapshot store → warm-fallback selection contract', () => {
});
});
+
describe('warm-fallback scroll restoration', () => {
let scrollContainer: HTMLDivElement;
let consoleErrorSpy: ReturnType;
@@ -217,6 +221,7 @@ describe('warm-fallback scroll restoration', () => {
});
});
+
describe('captureRenameSnapshots — scrollTop capture (DOM)', () => {
let scrollContainer: HTMLDivElement;
let consoleErrorSpy: ReturnType;
diff --git a/packages/app/src/components/EditorTabs.tsx b/packages/app/src/components/EditorTabs.tsx
index 2b0c2188..341a55c1 100644
--- a/packages/app/src/components/EditorTabs.tsx
+++ b/packages/app/src/components/EditorTabs.tsx
@@ -592,7 +592,12 @@ export function EditorTabs() {
)}
onWheel={scrollTabListOnWheel}
>
-
+
{});
+ .catch(() => {
+ });
}
const messageReady = documentCount !== null;
diff --git a/packages/app/src/components/FileTree.showall-lazy.dom.test.tsx b/packages/app/src/components/FileTree.showall-lazy.dom.test.tsx
index dc55c3a9..3d31def2 100644
--- a/packages/app/src/components/FileTree.showall-lazy.dom.test.tsx
+++ b/packages/app/src/components/FileTree.showall-lazy.dom.test.tsx
@@ -64,6 +64,7 @@ function makeFetchMock() {
});
}
+
class StubItem {
expanded = false;
selected = false;
diff --git a/packages/app/src/components/FileTree.showall-truncation.dom.test.tsx b/packages/app/src/components/FileTree.showall-truncation.dom.test.tsx
index fb028482..5247e5e5 100644
--- a/packages/app/src/components/FileTree.showall-truncation.dom.test.tsx
+++ b/packages/app/src/components/FileTree.showall-truncation.dom.test.tsx
@@ -47,6 +47,7 @@ function makeFetchMock() {
});
}
+
class StubItem {
expanded = false;
selected = false;
diff --git a/packages/app/src/components/FileTree.superseded-refresh.dom.test.tsx b/packages/app/src/components/FileTree.superseded-refresh.dom.test.tsx
index c8437e84..7bd4b06d 100644
--- a/packages/app/src/components/FileTree.superseded-refresh.dom.test.tsx
+++ b/packages/app/src/components/FileTree.superseded-refresh.dom.test.tsx
@@ -68,6 +68,7 @@ function makeFetchMock() {
});
}
+
class StubItem {
expanded = false;
selected = false;
diff --git a/packages/app/src/components/FileTree.tsx b/packages/app/src/components/FileTree.tsx
index 8c5f46ee..c4abae0d 100644
--- a/packages/app/src/components/FileTree.tsx
+++ b/packages/app/src/components/FileTree.tsx
@@ -234,7 +234,8 @@ function focusEditorAfterRename(docName: string): void {
if (!editor || editor.isDestroyed) return;
try {
editor.commands.focus();
- } catch {}
+ } catch {
+ }
});
}
@@ -292,14 +293,16 @@ const MARKDOWN_FILE_ICON_SYMBOL = `][];
function iconNodeToSvg(iconNode: IconNode): string {
- return iconNode
- .map(([tag, { key: _, ...attrs }]) => {
- const attrString = Object.entries(attrs)
- .map(([k, v]) => `${k}="${v}"`)
- .join(' ');
- return `<${tag} ${attrString} />`;
- })
- .join('');
+ return (
+ iconNode
+ .map(([tag, { key: _, ...attrs }]) => {
+ const attrString = Object.entries(attrs)
+ .map(([k, v]) => `${k}="${v}"`)
+ .join(' ');
+ return `<${tag} ${attrString} />`;
+ })
+ .join('')
+ );
}
function createLucideSpriteSymbol(id: string, iconNode: IconNode): string {
diff --git a/packages/app/src/components/FrontmatterRow.tsx b/packages/app/src/components/FrontmatterRow.tsx
index ce503522..6c3e19e5 100644
--- a/packages/app/src/components/FrontmatterRow.tsx
+++ b/packages/app/src/components/FrontmatterRow.tsx
@@ -1,3 +1,4 @@
+
import { useSortable } from '@dnd-kit/sortable';
import { CSS } from '@dnd-kit/utilities';
import {
diff --git a/packages/app/src/components/GraphPanel.external-link-open.dom.test.tsx b/packages/app/src/components/GraphPanel.external-link-open.dom.test.tsx
index a49494af..07f1d30b 100644
--- a/packages/app/src/components/GraphPanel.external-link-open.dom.test.tsx
+++ b/packages/app/src/components/GraphPanel.external-link-open.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import { act, cleanup, render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
diff --git a/packages/app/src/components/GraphPanel.tsx b/packages/app/src/components/GraphPanel.tsx
index 30f4caa2..68e73fa2 100644
--- a/packages/app/src/components/GraphPanel.tsx
+++ b/packages/app/src/components/GraphPanel.tsx
@@ -67,7 +67,8 @@ function saveBoolPref(key: string, value: boolean): void {
} else {
window.localStorage.removeItem(key);
}
- } catch {}
+ } catch {
+ }
}
type FullscreenGraphMode = 'explore' | 'orphans' | 'hubs';
diff --git a/packages/app/src/components/InstallInClaudeDesktopDialog.tsx b/packages/app/src/components/InstallInClaudeDesktopDialog.tsx
index d649a360..16604938 100644
--- a/packages/app/src/components/InstallInClaudeDesktopDialog.tsx
+++ b/packages/app/src/components/InstallInClaudeDesktopDialog.tsx
@@ -15,6 +15,7 @@ import {
import { dispatchExternalLinkClick } from '@/lib/external-link';
import { cn } from '@/lib/utils';
+
const INSTALL_COMMAND = 'npx @inkeep/open-knowledge cowork';
const DOCS_URL = 'https://openknowledge.ai/docs/integrations/claude-code';
diff --git a/packages/app/src/components/InteractionPropPanel.tsx b/packages/app/src/components/InteractionPropPanel.tsx
index d880eaa6..f891dbe2 100644
--- a/packages/app/src/components/InteractionPropPanel.tsx
+++ b/packages/app/src/components/InteractionPropPanel.tsx
@@ -1,3 +1,4 @@
+
import { autoUpdate, type VirtualElement } from '@floating-ui/dom';
import { type FC, type ReactNode, useLayoutEffect, useRef } from 'react';
import { cn } from '@/lib/utils';
diff --git a/packages/app/src/components/McpConsentDialog.tsx b/packages/app/src/components/McpConsentDialog.tsx
index b0d74a6c..19b0f796 100644
--- a/packages/app/src/components/McpConsentDialog.tsx
+++ b/packages/app/src/components/McpConsentDialog.tsx
@@ -1,3 +1,4 @@
+
import { lazy, Suspense, useSyncExternalStore } from 'react';
import { mcpConsentStore } from '@/lib/mcp-consent-store';
diff --git a/packages/app/src/components/McpConsentDialogBody.tsx b/packages/app/src/components/McpConsentDialogBody.tsx
index 78115f78..e3d12df1 100644
--- a/packages/app/src/components/McpConsentDialogBody.tsx
+++ b/packages/app/src/components/McpConsentDialogBody.tsx
@@ -1,3 +1,4 @@
+
import { Trans, useLingui } from '@lingui/react/macro';
import { useId, useState } from 'react';
import { toast as sonnerToast } from 'sonner';
diff --git a/packages/app/src/components/MountStalledAffordance.tsx b/packages/app/src/components/MountStalledAffordance.tsx
index dbfc38e3..65a1aa09 100644
--- a/packages/app/src/components/MountStalledAffordance.tsx
+++ b/packages/app/src/components/MountStalledAffordance.tsx
@@ -1,3 +1,4 @@
+
import { Trans } from '@lingui/react/macro';
import { type ReactElement, useEffect, useState } from 'react';
import { Button } from '@/components/ui/button';
diff --git a/packages/app/src/components/NavigatorApp.tsx b/packages/app/src/components/NavigatorApp.tsx
index d1625713..b48ea224 100644
--- a/packages/app/src/components/NavigatorApp.tsx
+++ b/packages/app/src/components/NavigatorApp.tsx
@@ -1,3 +1,4 @@
+
import { Trans, useLingui } from '@lingui/react/macro';
import { FolderOpenIcon, GitBranch, Loader2Icon, PlusIcon, XIcon } from 'lucide-react';
import { useTheme } from 'next-themes';
diff --git a/packages/app/src/components/NewItemDialog.test.ts b/packages/app/src/components/NewItemDialog.test.ts
index 5103ffe7..a152013f 100644
--- a/packages/app/src/components/NewItemDialog.test.ts
+++ b/packages/app/src/components/NewItemDialog.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import {
diff --git a/packages/app/src/components/ObjectWidget.tsx b/packages/app/src/components/ObjectWidget.tsx
index ba91de5a..16c83a6d 100644
--- a/packages/app/src/components/ObjectWidget.tsx
+++ b/packages/app/src/components/ObjectWidget.tsx
@@ -1,3 +1,4 @@
+
import {
closestCenter,
DndContext,
diff --git a/packages/app/src/components/PageHeader.tsx b/packages/app/src/components/PageHeader.tsx
index 14f2cb52..53d8f90a 100644
--- a/packages/app/src/components/PageHeader.tsx
+++ b/packages/app/src/components/PageHeader.tsx
@@ -1,3 +1,4 @@
+
import type { HocuspocusProvider } from '@hocuspocus/provider';
import {
bindFrontmatterDoc,
diff --git a/packages/app/src/components/PageHeaderWidgets.tsx b/packages/app/src/components/PageHeaderWidgets.tsx
index 7465b003..869d6217 100644
--- a/packages/app/src/components/PageHeaderWidgets.tsx
+++ b/packages/app/src/components/PageHeaderWidgets.tsx
@@ -1,3 +1,4 @@
+
// biome-ignore-all lint/plugin/no-raw-html-interactive-element: matches the existing PropertyWidgets.tsx posture — raw `` is the typed-input affordance shared across every frontmatter widget; migrating to shadcn `` is the file-wide pre-rule backlog described in PropertyWidgets.tsx's top-of-file ignore comment.
import { ALLOWED_IMAGE_MIME_TYPES } from '@inkeep/open-knowledge-core';
diff --git a/packages/app/src/components/ProjectSwitcher.tsx b/packages/app/src/components/ProjectSwitcher.tsx
index dd8f492e..43ad1a8a 100644
--- a/packages/app/src/components/ProjectSwitcher.tsx
+++ b/packages/app/src/components/ProjectSwitcher.tsx
@@ -1,3 +1,4 @@
+
import { Trans, useLingui } from '@lingui/react/macro';
import { ChevronsUpDown, FolderOpen, GitBranch, LayoutGrid, Plus, Search } from 'lucide-react';
import { useEffect, useRef, useState } from 'react';
diff --git a/packages/app/src/components/PropertyInlineLinks.dom.test.tsx b/packages/app/src/components/PropertyInlineLinks.dom.test.tsx
index 6a4b28de..77959eac 100644
--- a/packages/app/src/components/PropertyInlineLinks.dom.test.tsx
+++ b/packages/app/src/components/PropertyInlineLinks.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, test } from 'bun:test';
import { cleanup, render, screen } from '@testing-library/react';
import { PropertyInlineLinks } from './PropertyInlineLinks';
diff --git a/packages/app/src/components/PropertyInlineLinks.tsx b/packages/app/src/components/PropertyInlineLinks.tsx
index 0e9411c9..8762d849 100644
--- a/packages/app/src/components/PropertyInlineLinks.tsx
+++ b/packages/app/src/components/PropertyInlineLinks.tsx
@@ -1,3 +1,4 @@
+
import type { ReactNode } from 'react';
import { dispatchExternalLinkClick } from '@/lib/external-link';
import { cn } from '@/lib/utils';
diff --git a/packages/app/src/components/PropertyPanel.nested-crud.dom.test.tsx b/packages/app/src/components/PropertyPanel.nested-crud.dom.test.tsx
index 7e289356..2686cd74 100644
--- a/packages/app/src/components/PropertyPanel.nested-crud.dom.test.tsx
+++ b/packages/app/src/components/PropertyPanel.nested-crud.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, test } from 'bun:test';
import { HocuspocusProvider } from '@hocuspocus/provider';
import { readFmMap } from '@inkeep/open-knowledge-core';
@@ -44,7 +45,8 @@ afterEach(() => {
for (const p of providers.splice(0)) {
try {
p.destroy();
- } catch {}
+ } catch {
+ }
}
});
diff --git a/packages/app/src/components/PropertyPanel.test.tsx b/packages/app/src/components/PropertyPanel.test.tsx
index 7f3a5b43..a98012a6 100644
--- a/packages/app/src/components/PropertyPanel.test.tsx
+++ b/packages/app/src/components/PropertyPanel.test.tsx
@@ -28,7 +28,8 @@ afterEach(() => {
for (const p of providers.splice(0)) {
try {
p.destroy();
- } catch {}
+ } catch {
+ }
}
});
diff --git a/packages/app/src/components/PropertyPanel.tsx b/packages/app/src/components/PropertyPanel.tsx
index 7ea9f989..0c7a06c0 100644
--- a/packages/app/src/components/PropertyPanel.tsx
+++ b/packages/app/src/components/PropertyPanel.tsx
@@ -92,6 +92,7 @@ export function PropertyPanel({ provider, reservedKeys }: PropertyPanelProps) {
const panelRef = useRef(null);
usePublishFrontmatterSelection(panelRef, docName);
+
function commitPatch(patch: FrontmatterPatch): PatchResult {
if (!binding) {
return { ok: false, error: t`Connecting` };
diff --git a/packages/app/src/components/PublishToGitHubDialog.tsx b/packages/app/src/components/PublishToGitHubDialog.tsx
index 6f71620c..1f2a1161 100644
--- a/packages/app/src/components/PublishToGitHubDialog.tsx
+++ b/packages/app/src/components/PublishToGitHubDialog.tsx
@@ -1,3 +1,4 @@
+
import type { SharePublishOwner } from '@inkeep/open-knowledge-core';
import { Trans, useLingui } from '@lingui/react/macro';
import { CheckCircle2, Copy, ExternalLink, Loader2, XCircle } from 'lucide-react';
diff --git a/packages/app/src/components/SettingsButton.tsx b/packages/app/src/components/SettingsButton.tsx
index 080da4f4..f4b8510b 100644
--- a/packages/app/src/components/SettingsButton.tsx
+++ b/packages/app/src/components/SettingsButton.tsx
@@ -1,3 +1,4 @@
+
import { Trans } from '@lingui/react/macro';
import { Settings } from 'lucide-react';
import { type FC, useEffect, useRef } from 'react';
diff --git a/packages/app/src/components/ShareBranchSwitchDialog.dom.test.tsx b/packages/app/src/components/ShareBranchSwitchDialog.dom.test.tsx
index a43bb630..96528d40 100644
--- a/packages/app/src/components/ShareBranchSwitchDialog.dom.test.tsx
+++ b/packages/app/src/components/ShareBranchSwitchDialog.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import type { BranchInfoResponse, CheckoutResponse } from '@inkeep/open-knowledge-core';
import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
diff --git a/packages/app/src/components/ShareBranchSwitchDialog.tsx b/packages/app/src/components/ShareBranchSwitchDialog.tsx
index 019dc878..59ce9a98 100644
--- a/packages/app/src/components/ShareBranchSwitchDialog.tsx
+++ b/packages/app/src/components/ShareBranchSwitchDialog.tsx
@@ -1,3 +1,4 @@
+
import { Trans, useLingui } from '@lingui/react/macro';
import { GitBranch, Loader2, MapPin } from 'lucide-react';
import { useEffect, useRef, useState, useSyncExternalStore } from 'react';
diff --git a/packages/app/src/components/ShareButton.tsx b/packages/app/src/components/ShareButton.tsx
index 2ae80d77..9ded04d1 100644
--- a/packages/app/src/components/ShareButton.tsx
+++ b/packages/app/src/components/ShareButton.tsx
@@ -1,3 +1,4 @@
+
import { Trans, useLingui } from '@lingui/react/macro';
import { CircleHelp, Share2 } from 'lucide-react';
import { useEffect, useRef, useState } from 'react';
diff --git a/packages/app/src/components/SharingModeField.tsx b/packages/app/src/components/SharingModeField.tsx
index e2fd74bb..4dcc8552 100644
--- a/packages/app/src/components/SharingModeField.tsx
+++ b/packages/app/src/components/SharingModeField.tsx
@@ -1,3 +1,4 @@
+
import { Trans } from '@lingui/react/macro';
import { ConfigSharingInfoTooltip } from '@/components/ConfigSharingInfoTooltip';
import { Label } from '@/components/ui/label';
diff --git a/packages/app/src/components/SidebarSearchBar.test.ts b/packages/app/src/components/SidebarSearchBar.test.ts
index ad528df5..6ecbbe93 100644
--- a/packages/app/src/components/SidebarSearchBar.test.ts
+++ b/packages/app/src/components/SidebarSearchBar.test.ts
@@ -15,6 +15,7 @@ describe('SidebarSearchBar module', () => {
});
describe('onPillRenderError — Pattern C runtime observability emission', () => {
+
let warnSpy: ReturnType;
beforeEach(() => {
diff --git a/packages/app/src/components/SidebarSearchBar.tsx b/packages/app/src/components/SidebarSearchBar.tsx
index 6091170b..ce2584d5 100644
--- a/packages/app/src/components/SidebarSearchBar.tsx
+++ b/packages/app/src/components/SidebarSearchBar.tsx
@@ -1,3 +1,4 @@
+
import { incrementJsxRenderFailure } from '@inkeep/open-knowledge-core';
import { Trans } from '@lingui/react/macro';
import { Search } from 'lucide-react';
diff --git a/packages/app/src/components/SkillEditorActions.dom.test.tsx b/packages/app/src/components/SkillEditorActions.dom.test.tsx
index ef712b1a..6496b0e0 100644
--- a/packages/app/src/components/SkillEditorActions.dom.test.tsx
+++ b/packages/app/src/components/SkillEditorActions.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { describe, expect, mock, test } from 'bun:test';
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
diff --git a/packages/app/src/components/SkillEditorActions.tsx b/packages/app/src/components/SkillEditorActions.tsx
index 484e1cf3..91ad2f8b 100644
--- a/packages/app/src/components/SkillEditorActions.tsx
+++ b/packages/app/src/components/SkillEditorActions.tsx
@@ -17,6 +17,7 @@ import {
import { useSkills } from '@/hooks/use-skills';
import { cn } from '@/lib/utils';
+
const INSTALL_EDITORS: readonly SkillTargetEditor[] = SkillTargetEditorSchema.options;
export function SkillEditorActions({ scope, name }: { scope: SkillScope; name: string }) {
diff --git a/packages/app/src/components/SkillProperties.dom.test.tsx b/packages/app/src/components/SkillProperties.dom.test.tsx
index 7197e62d..bbf8b873 100644
--- a/packages/app/src/components/SkillProperties.dom.test.tsx
+++ b/packages/app/src/components/SkillProperties.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { describe, expect, mock, test } from 'bun:test';
import type { HocuspocusProvider } from '@hocuspocus/provider';
import { fireEvent, render, screen } from '@testing-library/react';
diff --git a/packages/app/src/components/SyncStatusBadge.tsx b/packages/app/src/components/SyncStatusBadge.tsx
index 879d101f..230e2ac2 100644
--- a/packages/app/src/components/SyncStatusBadge.tsx
+++ b/packages/app/src/components/SyncStatusBadge.tsx
@@ -1,3 +1,4 @@
+
import type { PushPermissionWire, SyncErrorCode } from '@inkeep/open-knowledge-core';
import { plural, t } from '@lingui/core/macro';
import { Plural, Trans, useLingui } from '@lingui/react/macro';
@@ -25,6 +26,7 @@ import { Popover, PopoverContent, PopoverTrigger } from './ui/popover';
import { Switch } from './ui/switch';
import { Tooltip, TooltipContent, TooltipTrigger } from './ui/tooltip';
+
function formatRelative(iso: string | null): string {
if (!iso) return t`never`;
const diff = Date.now() - new Date(iso).getTime();
@@ -48,6 +50,7 @@ async function triggerSync(op: 'sync' | 'push' | 'pull'): Promise {
});
}
+
interface BadgeIconProps {
status: GitSyncStatus;
}
@@ -100,6 +103,7 @@ function badgeLabel(status: GitSyncStatus): string {
}
}
+
function stateLabel(state: GitSyncStatus['state']): string {
switch (state) {
case 'dormant':
@@ -494,6 +498,7 @@ function PopoverBody({ status, onSignIn, onSetIdentity }: PopoverBodyProps) {
);
}
+
interface SyncStatusBadgeProps {
onSignIn?: () => void;
onSetIdentity?: () => void;
diff --git a/packages/app/src/components/TemplateForm.tsx b/packages/app/src/components/TemplateForm.tsx
index e4d7fa2d..e98de184 100644
--- a/packages/app/src/components/TemplateForm.tsx
+++ b/packages/app/src/components/TemplateForm.tsx
@@ -38,6 +38,7 @@ export interface PropRow {
value: string;
}
+
let propRowSeq = 0;
function nextRowId(): string {
propRowSeq += 1;
diff --git a/packages/app/src/components/TemplateProperties.dom.test.tsx b/packages/app/src/components/TemplateProperties.dom.test.tsx
index 963369e1..eb31f034 100644
--- a/packages/app/src/components/TemplateProperties.dom.test.tsx
+++ b/packages/app/src/components/TemplateProperties.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { describe, expect, mock, test } from 'bun:test';
import type { HocuspocusProvider } from '@hocuspocus/provider';
import { fireEvent, render, screen } from '@testing-library/react';
diff --git a/packages/app/src/components/TerminalCliMissingBanner.dom.test.tsx b/packages/app/src/components/TerminalCliMissingBanner.dom.test.tsx
index 1417b840..87b07cbd 100644
--- a/packages/app/src/components/TerminalCliMissingBanner.dom.test.tsx
+++ b/packages/app/src/components/TerminalCliMissingBanner.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, mock, test } from 'bun:test';
import { TERMINAL_CLIS } from '@inkeep/open-knowledge-core';
import { cleanup, render, screen } from '@testing-library/react';
diff --git a/packages/app/src/components/TerminalDock.dom.test.tsx b/packages/app/src/components/TerminalDock.dom.test.tsx
index 9d26e050..e32fcd8b 100644
--- a/packages/app/src/components/TerminalDock.dom.test.tsx
+++ b/packages/app/src/components/TerminalDock.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import { act, cleanup, render, screen, waitFor, within } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
diff --git a/packages/app/src/components/TerminalExitNotice.dom.test.tsx b/packages/app/src/components/TerminalExitNotice.dom.test.tsx
index 011f6034..c734f3cc 100644
--- a/packages/app/src/components/TerminalExitNotice.dom.test.tsx
+++ b/packages/app/src/components/TerminalExitNotice.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, mock, test } from 'bun:test';
import { cleanup, fireEvent, render, screen } from '@testing-library/react';
import { TerminalExitNotice } from './TerminalExitNotice';
diff --git a/packages/app/src/components/TerminalPanel.dom.test.tsx b/packages/app/src/components/TerminalPanel.dom.test.tsx
index 39d81c63..971eeee6 100644
--- a/packages/app/src/components/TerminalPanel.dom.test.tsx
+++ b/packages/app/src/components/TerminalPanel.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import { act, cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
import type {
diff --git a/packages/app/src/components/TerminalPanel.launch.dom.test.tsx b/packages/app/src/components/TerminalPanel.launch.dom.test.tsx
index 33209ced..7e0d5b02 100644
--- a/packages/app/src/components/TerminalPanel.launch.dom.test.tsx
+++ b/packages/app/src/components/TerminalPanel.launch.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import type { TerminalCli } from '@inkeep/open-knowledge-core';
import { act, cleanup, render, screen, waitFor } from '@testing-library/react';
diff --git a/packages/app/src/components/TextViewer.tsx b/packages/app/src/components/TextViewer.tsx
index c01d0d29..e7dd438a 100644
--- a/packages/app/src/components/TextViewer.tsx
+++ b/packages/app/src/components/TextViewer.tsx
@@ -1,3 +1,4 @@
+
import { EditorState } from '@codemirror/state';
import { EditorView } from '@codemirror/view';
import { codeLanguageForExtension } from '@inkeep/open-knowledge-core';
diff --git a/packages/app/src/components/TimelinePanel.tsx b/packages/app/src/components/TimelinePanel.tsx
index 4d71e137..5ff01f6b 100644
--- a/packages/app/src/components/TimelinePanel.tsx
+++ b/packages/app/src/components/TimelinePanel.tsx
@@ -93,12 +93,14 @@ async function pollHistoryOnce(
}
}
+
interface TimelineContentProps {
docName: string;
diffLayout: DiffLayout;
onDiffLayoutChange: (layout: DiffLayout) => void;
}
+
function formatRelativeTime(isoString: string): string {
const date = new Date(isoString);
const now = new Date();
@@ -194,6 +196,7 @@ function ContributorIcon({ entry, isDark }: { entry: TimelineEntry; isDark: bool
return ;
}
+
export function allSummariesFor(entry: TimelineEntry): string[] {
const out: string[] = [];
for (const c of entry.contributors) {
@@ -248,6 +251,7 @@ function SummaryBullets({ summaries }: SummaryBulletsProps) {
);
}
+
interface EntryDiffPanelProps {
sha: string;
docName: string;
@@ -288,6 +292,7 @@ function EntryDiffPanel({ sha, docName, cache, diffLayout, panelId }: EntryDiffP
);
}
+
interface EntryRowProps {
entry: TimelineEntry;
isDark: boolean;
@@ -376,7 +381,8 @@ function EntryRow({
try {
const problem = ProblemDetailsSchema.safeParse(await res.json());
if (problem.success) detail = problem.data.title;
- } catch {}
+ } catch {
+ }
console.error('[timeline] rollback failed', {
docName,
sha: entry.sha,
@@ -524,6 +530,7 @@ function EntryRow({
);
}
+
export function TimelineContent({ docName, diffLayout, onDiffLayoutChange }: TimelineContentProps) {
const { t } = useLingui();
const { resolvedTheme } = useTheme();
diff --git a/packages/app/src/components/TrashFailureModal.tsx b/packages/app/src/components/TrashFailureModal.tsx
index 291eb085..8218ea7b 100644
--- a/packages/app/src/components/TrashFailureModal.tsx
+++ b/packages/app/src/components/TrashFailureModal.tsx
@@ -11,6 +11,7 @@ import {
DialogTitle,
} from '@/components/ui/dialog';
+
type TrashFailureReason = 'not-found' | 'permission-denied' | 'system-error' | 'path-escape';
const TRASH_FAILURE_REASONS: ReadonlyArray = [
@@ -43,6 +44,7 @@ interface TrashFailureModalProps {
onCancel: () => void;
}
+
function trashReasonLabel(reason: TrashFailureReason): string {
switch (reason) {
case 'not-found':
diff --git a/packages/app/src/components/UpdateNotices.shared.ts b/packages/app/src/components/UpdateNotices.shared.ts
index ae0a4767..b9ccbe0d 100644
--- a/packages/app/src/components/UpdateNotices.shared.ts
+++ b/packages/app/src/components/UpdateNotices.shared.ts
@@ -1,3 +1,4 @@
+
import type { OkDesktopBridge } from '@/lib/desktop-bridge-types';
export const TOAST_A_ACTION = 'Relaunch';
diff --git a/packages/app/src/components/UpdateNotices.test.ts b/packages/app/src/components/UpdateNotices.test.ts
index c2308372..c514246b 100644
--- a/packages/app/src/components/UpdateNotices.test.ts
+++ b/packages/app/src/components/UpdateNotices.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, mock, test } from 'bun:test';
import type { OkDesktopBridge } from '@/lib/desktop-bridge-types';
import {
@@ -115,6 +116,7 @@ function castBridge(fake: FakeBridge): OkDesktopBridge {
return fake as unknown as OkDesktopBridge;
}
+
describe('copy helpers (minimal-wording revision)', () => {
test('toastABody formats the version-specific pending-install string', () => {
expect(toastABody('0.1.1')).toBe('Version 0.1.1 ready to install');
@@ -177,6 +179,7 @@ describe('appendErrorDetail', () => {
});
});
+
describe('attachUpdateSubscribers — registration', () => {
test('subscribes to all six update channels on the bridge', () => {
const bridge = makeFakeBridge();
@@ -204,6 +207,7 @@ describe('attachUpdateSubscribers — registration', () => {
});
});
+
describe('Notice A cross-window relaunch — ok:update:relaunching', () => {
test('swaps the update-downloaded card to the button-less in-progress card', () => {
const bridge = makeFakeBridge();
@@ -304,6 +308,7 @@ describe('Notice A cross-window relaunch — ok:update:relaunching', () => {
});
});
+
describe('Notice A — ok:update:downloaded', () => {
test('emits notice with canonical copy + relaunch action on dispatch', () => {
const bridge = makeFakeBridge();
@@ -464,6 +469,7 @@ describe('Notice A — ok:update:downloaded', () => {
});
});
+
describe('Notice B — ok:update:whats-new', () => {
test('emits notice with version-specific copy + release URL action', () => {
const bridge = makeFakeBridge();
@@ -552,6 +558,7 @@ describe('Notice B — ok:update:whats-new', () => {
});
});
+
describe('Notice C — ok:update:stuck-hint', () => {
test('emits notice with D12 copy + download URL action', () => {
const bridge = makeFakeBridge();
@@ -580,6 +587,7 @@ describe('Notice C — ok:update:stuck-hint', () => {
});
});
+
describe('Notice E — schema-incompatibility refuse-downgrade', () => {
const diagnostic = {
currentBuild: '0.3.0',
@@ -664,6 +672,7 @@ describe('Notice E — schema-incompatibility refuse-downgrade', () => {
});
});
+
describe('pickActiveNotice', () => {
const a: UpdateNotice = { id: 'a', body: 'A', priority: 2 };
const b: UpdateNotice = { id: 'b', body: 'B', priority: 3 };
diff --git a/packages/app/src/components/ask-ai-composer-events.ts b/packages/app/src/components/ask-ai-composer-events.ts
index 48538d30..8f34d352 100644
--- a/packages/app/src/components/ask-ai-composer-events.ts
+++ b/packages/app/src/components/ask-ai-composer-events.ts
@@ -1,3 +1,4 @@
+
const OPEN_ASK_AI_COMPOSER_EVENT = 'open-knowledge:open-ask-ai-composer';
export function emitOpenAskAiComposer(
diff --git a/packages/app/src/components/command-palette-flicker.test.ts b/packages/app/src/components/command-palette-flicker.test.ts
index 34951fee..8227ed18 100644
--- a/packages/app/src/components/command-palette-flicker.test.ts
+++ b/packages/app/src/components/command-palette-flicker.test.ts
@@ -1,6 +1,8 @@
+
import { describe, expect, test } from 'bun:test';
import type { WorkspaceEntry, WorkspaceSearchEntry } from './command-palette-search';
+
interface VisibleSearchResultsHelperArgs {
searchResults: readonly WorkspaceSearchEntry[];
fallbackSearchResults: readonly WorkspaceEntry[];
diff --git a/packages/app/src/components/command-palette-semantic.ts b/packages/app/src/components/command-palette-semantic.ts
index 0f36bef2..6d98adc3 100644
--- a/packages/app/src/components/command-palette-semantic.ts
+++ b/packages/app/src/components/command-palette-semantic.ts
@@ -1,3 +1,4 @@
+
export interface SemanticModeState {
query: string;
firedQuery: string | null;
diff --git a/packages/app/src/components/command-palette-tag-search.test.ts b/packages/app/src/components/command-palette-tag-search.test.ts
index ff3d98cb..c7622e6f 100644
--- a/packages/app/src/components/command-palette-tag-search.test.ts
+++ b/packages/app/src/components/command-palette-tag-search.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import type { TagSummaryEntry } from '../editor/extensions/tag-suggestion.ts';
import { filterTagList, parseTagPaletteQuery } from './command-palette-tag-search.ts';
diff --git a/packages/app/src/components/command-palette-tag-search.ts b/packages/app/src/components/command-palette-tag-search.ts
index 3478d495..4fcc0b4a 100644
--- a/packages/app/src/components/command-palette-tag-search.ts
+++ b/packages/app/src/components/command-palette-tag-search.ts
@@ -1,3 +1,4 @@
+
import {
fetchTags,
rankTagsByQuery,
diff --git a/packages/app/src/components/composer-draft-store.test.ts b/packages/app/src/components/composer-draft-store.test.ts
index 57943d1c..8e886f35 100644
--- a/packages/app/src/components/composer-draft-store.test.ts
+++ b/packages/app/src/components/composer-draft-store.test.ts
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, test } from 'bun:test';
import type { JSONContent } from '@tiptap/core';
import {
diff --git a/packages/app/src/components/composer-draft-store.ts b/packages/app/src/components/composer-draft-store.ts
index fa43e9ee..030e4218 100644
--- a/packages/app/src/components/composer-draft-store.ts
+++ b/packages/app/src/components/composer-draft-store.ts
@@ -1,3 +1,4 @@
+
import type { JSONContent } from '@tiptap/core';
const DRAFT_STORAGE_KEY = 'ok-ask-ai-draft-v2';
@@ -66,7 +67,8 @@ function persistDoc(doc: JSONContent | null): void {
try {
if (doc && !docIsEmpty(doc)) storage.setItem(DRAFT_STORAGE_KEY, JSON.stringify(doc));
else storage.removeItem(DRAFT_STORAGE_KEY);
- } catch {}
+ } catch {
+ }
}
function notify(): void {
diff --git a/packages/app/src/components/composer-shared-draft.dom.test.tsx b/packages/app/src/components/composer-shared-draft.dom.test.tsx
index 0f816026..144a392e 100644
--- a/packages/app/src/components/composer-shared-draft.dom.test.tsx
+++ b/packages/app/src/components/composer-shared-draft.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import type { CreateScenario, InstallState } from '@inkeep/open-knowledge-core';
import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
@@ -77,6 +78,7 @@ mock.module('@/components/handoff/useHandoffDispatch', () => ({
mock.module('sonner', () => ({ toast: { error: () => {}, success: () => {} } }));
+
type Handle = {
focus: () => void;
blur: () => void;
@@ -214,7 +216,8 @@ const { CreatePromptComposer } = await import('./empty-state/CreatePromptCompose
beforeEach(() => {
try {
window.localStorage.clear();
- } catch {}
+ } catch {
+ }
__resetComposerDraftForTests();
});
diff --git a/packages/app/src/components/editor-area-overlay.ts b/packages/app/src/components/editor-area-overlay.ts
index 52519792..08147d7c 100644
--- a/packages/app/src/components/editor-area-overlay.ts
+++ b/packages/app/src/components/editor-area-overlay.ts
@@ -1,3 +1,4 @@
+
interface OverlayDecisionInput {
activeDocName: string | null;
deferredActiveDocName: string | null;
diff --git a/packages/app/src/components/editor/SelectionAnnouncer.test.ts b/packages/app/src/components/editor/SelectionAnnouncer.test.ts
index 69b2ff68..ffc14a61 100644
--- a/packages/app/src/components/editor/SelectionAnnouncer.test.ts
+++ b/packages/app/src/components/editor/SelectionAnnouncer.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { Schema } from '@tiptap/pm/model';
import { EditorState, NodeSelection } from '@tiptap/pm/state';
diff --git a/packages/app/src/components/editor/SelectionAnnouncer.tsx b/packages/app/src/components/editor/SelectionAnnouncer.tsx
index bdfdcf08..f8b2723c 100644
--- a/packages/app/src/components/editor/SelectionAnnouncer.tsx
+++ b/packages/app/src/components/editor/SelectionAnnouncer.tsx
@@ -1,3 +1,4 @@
+
import type { Editor } from '@tiptap/core';
import { useEffect, useRef } from 'react';
import { useBlockSelection } from '../../editor/hooks/use-block-selection.ts';
diff --git a/packages/app/src/components/empty-state/CopyablePromptList.tsx b/packages/app/src/components/empty-state/CopyablePromptList.tsx
index 49ec9d01..c3ef689f 100644
--- a/packages/app/src/components/empty-state/CopyablePromptList.tsx
+++ b/packages/app/src/components/empty-state/CopyablePromptList.tsx
@@ -29,7 +29,8 @@ export function CopyablePromptList({ scenario, className }: CopyablePromptListPr
clearTimeout(resetTimerRef.current);
resetTimerRef.current = setTimeout(() => setCopiedId(null), 1600);
})
- .catch(() => {});
+ .catch(() => {
+ });
}
return (
diff --git a/packages/app/src/components/empty-state/CreatePromptComposer.dom.test.tsx b/packages/app/src/components/empty-state/CreatePromptComposer.dom.test.tsx
index 57e40b0a..88341308 100644
--- a/packages/app/src/components/empty-state/CreatePromptComposer.dom.test.tsx
+++ b/packages/app/src/components/empty-state/CreatePromptComposer.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, mock, test } from 'bun:test';
import type { CreateScenario, InstallState } from '@inkeep/open-knowledge-core';
import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
diff --git a/packages/app/src/components/extension-picker-utils.ts b/packages/app/src/components/extension-picker-utils.ts
index 6dcef95c..145221ef 100644
--- a/packages/app/src/components/extension-picker-utils.ts
+++ b/packages/app/src/components/extension-picker-utils.ts
@@ -1,3 +1,4 @@
+
export const SUPPORTED_EXTENSIONS = ['.md', '.mdx'] as const;
export type DocExtension = (typeof SUPPORTED_EXTENSIONS)[number];
diff --git a/packages/app/src/components/file-tree-adapter.test.ts b/packages/app/src/components/file-tree-adapter.test.ts
index 1423dac6..97ea222f 100644
--- a/packages/app/src/components/file-tree-adapter.test.ts
+++ b/packages/app/src/components/file-tree-adapter.test.ts
@@ -273,6 +273,7 @@ describe('file-tree-adapter', () => {
).toBe('docs/photo.png');
});
+
test('treeItemToTarget(item, documents) returns the entry-authoritative docExt for an extensionless .md tree path', () => {
const item: ContextMenuItem = {
kind: 'file',
diff --git a/packages/app/src/components/file-tree-extension-badge.dom.test.tsx b/packages/app/src/components/file-tree-extension-badge.dom.test.tsx
index dacb7be5..2c38b451 100644
--- a/packages/app/src/components/file-tree-extension-badge.dom.test.tsx
+++ b/packages/app/src/components/file-tree-extension-badge.dom.test.tsx
@@ -7,6 +7,7 @@ import {
OK_FULLNAME_ROW_ATTR,
} from './file-tree-extension-badge';
+
interface PierreRowInit {
path: string;
filename: string;
diff --git a/packages/app/src/components/file-tree-extension-badge.ts b/packages/app/src/components/file-tree-extension-badge.ts
index bdf5e3af..b32c67f9 100644
--- a/packages/app/src/components/file-tree-extension-badge.ts
+++ b/packages/app/src/components/file-tree-extension-badge.ts
@@ -1,3 +1,4 @@
+
import { getFileExtension } from '@/components/file-tree-rename-validation';
export const OK_EXT_BADGE_ATTR = 'data-ok-ext-badge';
diff --git a/packages/app/src/components/file-tree-merge.ts b/packages/app/src/components/file-tree-merge.ts
index 1af5dce3..935f9793 100644
--- a/packages/app/src/components/file-tree-merge.ts
+++ b/packages/app/src/components/file-tree-merge.ts
@@ -1,3 +1,4 @@
+
import { fileEntryToTreePath } from './file-tree-adapter';
import type { FileEntry } from './file-tree-utils';
diff --git a/packages/app/src/components/file-tree-okignore.test.ts b/packages/app/src/components/file-tree-okignore.test.ts
index 89a5f543..b1d70778 100644
--- a/packages/app/src/components/file-tree-okignore.test.ts
+++ b/packages/app/src/components/file-tree-okignore.test.ts
@@ -101,6 +101,7 @@ describe('buildOkignorePatternFromTarget — invariants', () => {
});
describe('buildOkignorePatternFromTarget — glob-metacharacter escaping', () => {
+
test('filename with [bracket] segment is escaped so the literal file matches', () => {
const pattern = buildOkignorePatternFromTarget({
kind: 'file',
diff --git a/packages/app/src/components/file-tree-rename-chip.dom.test.tsx b/packages/app/src/components/file-tree-rename-chip.dom.test.tsx
index 3dbb04ed..24165d98 100644
--- a/packages/app/src/components/file-tree-rename-chip.dom.test.tsx
+++ b/packages/app/src/components/file-tree-rename-chip.dom.test.tsx
@@ -318,6 +318,7 @@ describe('applyRenameInputAffordance — overlay marker for symptom 2 (icon-flas
});
test('post-settle: module-level activeRenameExt is cleared (Makefile selected later gets no marker)', () => {
+
const { row, input } = buildPierreRenameRow({
path: 'AGENTS.md',
initialValue: 'AGENTS.md',
diff --git a/packages/app/src/components/file-tree-rename-chip.ts b/packages/app/src/components/file-tree-rename-chip.ts
index 80acf6ec..4bf062a5 100644
--- a/packages/app/src/components/file-tree-rename-chip.ts
+++ b/packages/app/src/components/file-tree-rename-chip.ts
@@ -1,3 +1,4 @@
+
import {
getFileExtension,
hasSupportedDocumentExtension,
diff --git a/packages/app/src/components/file-tree-rename-validation.ts b/packages/app/src/components/file-tree-rename-validation.ts
index c6be16e4..938fe04c 100644
--- a/packages/app/src/components/file-tree-rename-validation.ts
+++ b/packages/app/src/components/file-tree-rename-validation.ts
@@ -1,3 +1,4 @@
+
type RenameDestinationValidation = { kind: 'allow'; destinationPath: string };
const SUPPORTED_DOCUMENT_EXTENSIONS = new Set(['.md', '.mdx']);
diff --git a/packages/app/src/components/file-tree-reveal.ts b/packages/app/src/components/file-tree-reveal.ts
index 58e6e784..73bb16f7 100644
--- a/packages/app/src/components/file-tree-reveal.ts
+++ b/packages/app/src/components/file-tree-reveal.ts
@@ -1,3 +1,4 @@
+
import type { FileTree as PierreFileTreeModel } from '@pierre/trees';
type RevealModel = Pick;
diff --git a/packages/app/src/components/file-tree-trash-copy.test.ts b/packages/app/src/components/file-tree-trash-copy.test.ts
index 68fd6213..4cea53fa 100644
--- a/packages/app/src/components/file-tree-trash-copy.test.ts
+++ b/packages/app/src/components/file-tree-trash-copy.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import type { FileTreeTarget } from '@/components/file-tree-operations';
import {
diff --git a/packages/app/src/components/file-tree-trash-copy.ts b/packages/app/src/components/file-tree-trash-copy.ts
index 2494992a..1e994233 100644
--- a/packages/app/src/components/file-tree-trash-copy.ts
+++ b/packages/app/src/components/file-tree-trash-copy.ts
@@ -1,3 +1,4 @@
+
import type { FileTreeTarget } from '@/components/file-tree-operations';
interface TrashConfirmCopy {
diff --git a/packages/app/src/components/file-tree-utils.ts b/packages/app/src/components/file-tree-utils.ts
index 06057726..62788eed 100644
--- a/packages/app/src/components/file-tree-utils.ts
+++ b/packages/app/src/components/file-tree-utils.ts
@@ -1,3 +1,4 @@
+
import {
type DocumentListEntry,
type InlineAssetMediaKind,
diff --git a/packages/app/src/components/graph-colors.ts b/packages/app/src/components/graph-colors.ts
index 1ebb06bd..c04bf057 100644
--- a/packages/app/src/components/graph-colors.ts
+++ b/packages/app/src/components/graph-colors.ts
@@ -1,3 +1,4 @@
+
const DARK_PALETTE = [
'#60a5fa', // Blue - Knowledge, concepts, structure
'#a78bfa', // Violet - Research, analysis, methodology
diff --git a/packages/app/src/components/graph-label-utils.ts b/packages/app/src/components/graph-label-utils.ts
index 07ef25c9..37fd78f1 100644
--- a/packages/app/src/components/graph-label-utils.ts
+++ b/packages/app/src/components/graph-label-utils.ts
@@ -110,6 +110,7 @@ function clampMiddleByCharacters(
return '';
}
+
const maxKeep = Math.max(1, Math.floor((text.length - ellipsis.length) / 2));
for (let keep = maxKeep; keep >= 1; keep--) {
if (text[keep] !== ' ' || text[text.length - keep - 1] !== ' ') continue;
diff --git a/packages/app/src/components/handoff/EditWithAiPanel.dom.test.tsx b/packages/app/src/components/handoff/EditWithAiPanel.dom.test.tsx
index 85d142fd..96cbcca3 100644
--- a/packages/app/src/components/handoff/EditWithAiPanel.dom.test.tsx
+++ b/packages/app/src/components/handoff/EditWithAiPanel.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, test } from 'bun:test';
import type { HandoffTarget, InstallState } from '@inkeep/open-knowledge-core';
import { cleanup, render, screen } from '@testing-library/react';
diff --git a/packages/app/src/components/handoff/EditWithAiPopover.dom.test.tsx b/packages/app/src/components/handoff/EditWithAiPopover.dom.test.tsx
index a1c6a130..751dc30f 100644
--- a/packages/app/src/components/handoff/EditWithAiPopover.dom.test.tsx
+++ b/packages/app/src/components/handoff/EditWithAiPopover.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, mock, test } from 'bun:test';
import { cleanup, render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
diff --git a/packages/app/src/components/handoff/EditWithAiPopover.tsx b/packages/app/src/components/handoff/EditWithAiPopover.tsx
index c309cf49..24993ed2 100644
--- a/packages/app/src/components/handoff/EditWithAiPopover.tsx
+++ b/packages/app/src/components/handoff/EditWithAiPopover.tsx
@@ -1,3 +1,4 @@
+
import type { HandoffTarget, InstallState, TargetData } from '@inkeep/open-knowledge-core';
import { Trans, useLingui } from '@lingui/react/macro';
import { type ReactNode, useEffect, useEffectEvent, useState } from 'react';
diff --git a/packages/app/src/components/handoff/OpenInAgentContextSubmenu.tsx b/packages/app/src/components/handoff/OpenInAgentContextSubmenu.tsx
index a1edc720..27e4d330 100644
--- a/packages/app/src/components/handoff/OpenInAgentContextSubmenu.tsx
+++ b/packages/app/src/components/handoff/OpenInAgentContextSubmenu.tsx
@@ -1,3 +1,4 @@
+
import {
type HandoffOutcome,
type HandoffTarget,
diff --git a/packages/app/src/components/handoff/OpenInAgentEmptySpaceSubmenu.tsx b/packages/app/src/components/handoff/OpenInAgentEmptySpaceSubmenu.tsx
index 2fbb5c7b..b7f02983 100644
--- a/packages/app/src/components/handoff/OpenInAgentEmptySpaceSubmenu.tsx
+++ b/packages/app/src/components/handoff/OpenInAgentEmptySpaceSubmenu.tsx
@@ -1,3 +1,4 @@
+
import {
type HandoffOutcome,
type HandoffTarget,
diff --git a/packages/app/src/components/handoff/OpenInAgentMenu.tsx b/packages/app/src/components/handoff/OpenInAgentMenu.tsx
index ab8c34e8..16e0519c 100644
--- a/packages/app/src/components/handoff/OpenInAgentMenu.tsx
+++ b/packages/app/src/components/handoff/OpenInAgentMenu.tsx
@@ -1,3 +1,4 @@
+
import {
type HandoffTarget,
type InstallState,
diff --git a/packages/app/src/components/handoff/OpenInAgentMenuItem.test.ts b/packages/app/src/components/handoff/OpenInAgentMenuItem.test.ts
index bb3c21c8..6c471602 100644
--- a/packages/app/src/components/handoff/OpenInAgentMenuItem.test.ts
+++ b/packages/app/src/components/handoff/OpenInAgentMenuItem.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import type { InstallState, TargetData } from '@inkeep/open-knowledge-core';
import { KNOWN_TARGETS } from '@/lib/handoff/targets';
diff --git a/packages/app/src/components/handoff/OpenInAgentMenuItem.tsx b/packages/app/src/components/handoff/OpenInAgentMenuItem.tsx
index e22105cb..aeb87aba 100644
--- a/packages/app/src/components/handoff/OpenInAgentMenuItem.tsx
+++ b/packages/app/src/components/handoff/OpenInAgentMenuItem.tsx
@@ -1,3 +1,4 @@
+
import {
AGENT_ICON_COLORS,
AGENT_ICON_COLORS_DARK,
diff --git a/packages/app/src/components/handoff/OpenInAgentTerminalRow.dom.test.tsx b/packages/app/src/components/handoff/OpenInAgentTerminalRow.dom.test.tsx
index e3b0a72d..ff35b07c 100644
--- a/packages/app/src/components/handoff/OpenInAgentTerminalRow.dom.test.tsx
+++ b/packages/app/src/components/handoff/OpenInAgentTerminalRow.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, mock, test } from 'bun:test';
import type { TerminalCli } from '@inkeep/open-knowledge-core';
import { cleanup, render, screen, waitFor } from '@testing-library/react';
diff --git a/packages/app/src/components/handoff/dispatch-single-entry-point.test.ts b/packages/app/src/components/handoff/dispatch-single-entry-point.test.ts
index e0238f0e..7e7a07f9 100644
--- a/packages/app/src/components/handoff/dispatch-single-entry-point.test.ts
+++ b/packages/app/src/components/handoff/dispatch-single-entry-point.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { readdirSync, readFileSync, statSync } from 'node:fs';
import { join, relative } from 'node:path';
diff --git a/packages/app/src/components/handoff/terminal-launch-events.ts b/packages/app/src/components/handoff/terminal-launch-events.ts
index 48f1cdf1..8d55aa11 100644
--- a/packages/app/src/components/handoff/terminal-launch-events.ts
+++ b/packages/app/src/components/handoff/terminal-launch-events.ts
@@ -1,3 +1,4 @@
+
import type { TerminalCli } from '@inkeep/open-knowledge-core';
const TERMINAL_LAUNCH_EVENT = 'open-knowledge:terminal-launch';
diff --git a/packages/app/src/components/handoff/useHandoffDispatch.test.ts b/packages/app/src/components/handoff/useHandoffDispatch.test.ts
index b17dbf07..40c9bf9c 100644
--- a/packages/app/src/components/handoff/useHandoffDispatch.test.ts
+++ b/packages/app/src/components/handoff/useHandoffDispatch.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, mock, test } from 'bun:test';
import { setTimeout as wait } from 'node:timers/promises';
import type { HandoffOutcome, HandoffPayload, HandoffTarget } from '@inkeep/open-knowledge-core';
diff --git a/packages/app/src/components/handoff/useHandoffDispatch.ts b/packages/app/src/components/handoff/useHandoffDispatch.ts
index 3c723e3d..4c5cfc4e 100644
--- a/packages/app/src/components/handoff/useHandoffDispatch.ts
+++ b/packages/app/src/components/handoff/useHandoffDispatch.ts
@@ -1,3 +1,4 @@
+
import {
type AssembleHandoffPromptInput,
assembleHandoffPrompt,
diff --git a/packages/app/src/components/handoff/useInstalledAgents.test.ts b/packages/app/src/components/handoff/useInstalledAgents.test.ts
index 1f69926e..e89b8159 100644
--- a/packages/app/src/components/handoff/useInstalledAgents.test.ts
+++ b/packages/app/src/components/handoff/useInstalledAgents.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
describe('useInstalledAgents module surface', () => {
diff --git a/packages/app/src/components/handoff/useInstalledAgents.ts b/packages/app/src/components/handoff/useInstalledAgents.ts
index 2c757b7a..b421127c 100644
--- a/packages/app/src/components/handoff/useInstalledAgents.ts
+++ b/packages/app/src/components/handoff/useInstalledAgents.ts
@@ -1,3 +1,4 @@
+
import type { HandoffTarget, InstallState } from '@inkeep/open-knowledge-core';
import { useEffect, useRef, useState } from 'react';
import {
diff --git a/packages/app/src/components/page-header-utils.test.ts b/packages/app/src/components/page-header-utils.test.ts
index 005d8a8c..306ba225 100644
--- a/packages/app/src/components/page-header-utils.test.ts
+++ b/packages/app/src/components/page-header-utils.test.ts
@@ -1,6 +1,7 @@
import { describe, expect, test } from 'bun:test';
import { resolvePageCover, resolvePageIcon } from './page-header-utils';
+
describe('resolvePageIcon', () => {
test('classifies a single emoji as emoji', () => {
expect(resolvePageIcon('📝')).toEqual({ kind: 'emoji', value: '📝' });
@@ -112,6 +113,7 @@ describe('resolvePageIcon', () => {
});
});
+
describe('resolvePageCover', () => {
test('rejects emoji (covers require an image)', () => {
expect(resolvePageCover('🏔️').kind).toBe('unsupported');
diff --git a/packages/app/src/components/page-header-utils.ts b/packages/app/src/components/page-header-utils.ts
index b71171a5..dfd03228 100644
--- a/packages/app/src/components/page-header-utils.ts
+++ b/packages/app/src/components/page-header-utils.ts
@@ -1,3 +1,4 @@
+
import { IMAGE_EXTENSIONS, isSafeUrl, toDesktopAssetHref } from '@inkeep/open-knowledge-core';
/** Hard cap on raw frontmatter value length we'll classify — anything
diff --git a/packages/app/src/components/prewarm-correlation.ts b/packages/app/src/components/prewarm-correlation.ts
index d3d479e2..ce3aa55f 100644
--- a/packages/app/src/components/prewarm-correlation.ts
+++ b/packages/app/src/components/prewarm-correlation.ts
@@ -1,3 +1,4 @@
+
import { mark } from '@/lib/perf';
import { readNumericOverride } from '@/lib/perf/env-override';
diff --git a/packages/app/src/components/property-inline-link-tokens.ts b/packages/app/src/components/property-inline-link-tokens.ts
index c1d506a3..e626a4a6 100644
--- a/packages/app/src/components/property-inline-link-tokens.ts
+++ b/packages/app/src/components/property-inline-link-tokens.ts
@@ -1,3 +1,4 @@
+
import { parseWikiLink } from '@inkeep/open-knowledge-core';
export type PropertyInlineSegment =
diff --git a/packages/app/src/components/resolve-conflict-dispatch.ts b/packages/app/src/components/resolve-conflict-dispatch.ts
index f1acd20f..f321f456 100644
--- a/packages/app/src/components/resolve-conflict-dispatch.ts
+++ b/packages/app/src/components/resolve-conflict-dispatch.ts
@@ -1,3 +1,4 @@
+
type ResolveStrategy = 'mine' | 'theirs' | 'content' | 'delete';
interface DispatchResult {
@@ -27,7 +28,8 @@ async function dispatchResolve(
const payload = (await res.json()) as { detail?: unknown; title?: unknown };
if (typeof payload.detail === 'string') detail = payload.detail;
else if (typeof payload.title === 'string') detail = payload.title;
- } catch {}
+ } catch {
+ }
return { ok: false, detail };
} catch (err) {
const detail = err instanceof Error ? err.message : String(err);
diff --git a/packages/app/src/components/settings/AccountSection.dom.test.tsx b/packages/app/src/components/settings/AccountSection.dom.test.tsx
index 8b56eaeb..ccb4e557 100644
--- a/packages/app/src/components/settings/AccountSection.dom.test.tsx
+++ b/packages/app/src/components/settings/AccountSection.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, test } from 'bun:test';
import { act, cleanup, render, screen, within } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
diff --git a/packages/app/src/components/settings/EmbeddingsKeySection.dom.test.tsx b/packages/app/src/components/settings/EmbeddingsKeySection.dom.test.tsx
index 1f0bd7cd..9a90523c 100644
--- a/packages/app/src/components/settings/EmbeddingsKeySection.dom.test.tsx
+++ b/packages/app/src/components/settings/EmbeddingsKeySection.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, test } from 'bun:test';
import type { SemanticIndexStatus } from '@inkeep/open-knowledge-core';
import { cleanup, render, screen, waitFor } from '@testing-library/react';
diff --git a/packages/app/src/components/settings/SearchSection.dom.test.tsx b/packages/app/src/components/settings/SearchSection.dom.test.tsx
index 29c7385c..a5703eaf 100644
--- a/packages/app/src/components/settings/SearchSection.dom.test.tsx
+++ b/packages/app/src/components/settings/SearchSection.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import type { Config, ConfigBinding, SemanticIndexStatus } from '@inkeep/open-knowledge-core';
import { cleanup, render, screen, waitFor } from '@testing-library/react';
diff --git a/packages/app/src/components/settings/SettingsDialogBody.test.ts b/packages/app/src/components/settings/SettingsDialogBody.test.ts
index 9bf4936f..8ad4ddf3 100644
--- a/packages/app/src/components/settings/SettingsDialogBody.test.ts
+++ b/packages/app/src/components/settings/SettingsDialogBody.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
describe('SettingsDialogBody module', () => {
diff --git a/packages/app/src/components/settings/SettingsDialogBodyLazy.ts b/packages/app/src/components/settings/SettingsDialogBodyLazy.ts
index d5c84ffa..b49bdceb 100644
--- a/packages/app/src/components/settings/SettingsDialogBodyLazy.ts
+++ b/packages/app/src/components/settings/SettingsDialogBodyLazy.ts
@@ -1,3 +1,4 @@
+
import { lazyWithPreload } from '@/lib/lazy-with-preload';
export const SettingsDialogBodyLazy = lazyWithPreload(() =>
diff --git a/packages/app/src/components/settings/SettingsDialogErrorBoundary.tsx b/packages/app/src/components/settings/SettingsDialogErrorBoundary.tsx
index d73ac10e..6e085970 100644
--- a/packages/app/src/components/settings/SettingsDialogErrorBoundary.tsx
+++ b/packages/app/src/components/settings/SettingsDialogErrorBoundary.tsx
@@ -1,3 +1,4 @@
+
import { Trans, useLingui } from '@lingui/react/macro';
import { ErrorBoundary, type FallbackProps } from 'react-error-boundary';
import { Button } from '@/components/ui/button';
diff --git a/packages/app/src/components/settings/SettingsDialogShell.dom.test.tsx b/packages/app/src/components/settings/SettingsDialogShell.dom.test.tsx
index b4d100d4..9d73cc12 100644
--- a/packages/app/src/components/settings/SettingsDialogShell.dom.test.tsx
+++ b/packages/app/src/components/settings/SettingsDialogShell.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from 'bun:test';
import type { ConfigBinding, OkignoreBinding } from '@inkeep/open-knowledge-core';
import { cleanup, render, screen } from '@testing-library/react';
diff --git a/packages/app/src/components/settings/SharingSection.tsx b/packages/app/src/components/settings/SharingSection.tsx
index 9130d48f..22efb7c6 100644
--- a/packages/app/src/components/settings/SharingSection.tsx
+++ b/packages/app/src/components/settings/SharingSection.tsx
@@ -1,3 +1,4 @@
+
import { Trans, useLingui } from '@lingui/react/macro';
import { useEffect, useState } from 'react';
import { toast } from 'sonner';
diff --git a/packages/app/src/components/settings/SkillTargetsPicker.dom.test.tsx b/packages/app/src/components/settings/SkillTargetsPicker.dom.test.tsx
index d516d1ad..4437ce42 100644
--- a/packages/app/src/components/settings/SkillTargetsPicker.dom.test.tsx
+++ b/packages/app/src/components/settings/SkillTargetsPicker.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, mock, test } from 'bun:test';
import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
import type { ReactNode } from 'react';
diff --git a/packages/app/src/components/settings/SkillsManagerSection.dom.test.tsx b/packages/app/src/components/settings/SkillsManagerSection.dom.test.tsx
index 69ab3a97..6d33ac7f 100644
--- a/packages/app/src/components/settings/SkillsManagerSection.dom.test.tsx
+++ b/packages/app/src/components/settings/SkillsManagerSection.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, mock, test } from 'bun:test';
import type { SkillsListSuccess } from '@inkeep/open-knowledge-core';
import { cleanup, render, screen, waitFor } from '@testing-library/react';
diff --git a/packages/app/src/components/settings/SkillsManagerSection.tsx b/packages/app/src/components/settings/SkillsManagerSection.tsx
index 864458ae..3f0d6c38 100644
--- a/packages/app/src/components/settings/SkillsManagerSection.tsx
+++ b/packages/app/src/components/settings/SkillsManagerSection.tsx
@@ -14,6 +14,7 @@ import { openManagedArtifactTab } from '@/lib/open-managed-artifact-tab';
import { SKILL_SCOPE_ORDER, useSkillScopeLabels } from '@/lib/skill-scope';
import { useSettingsRoute } from '@/lib/use-settings-route';
+
interface ScopeGroupChrome {
title: ReactNode;
blurb: ReactNode;
diff --git a/packages/app/src/components/settings/okignore-doc.test.ts b/packages/app/src/components/settings/okignore-doc.test.ts
index 56df1beb..8d86ec97 100644
--- a/packages/app/src/components/settings/okignore-doc.test.ts
+++ b/packages/app/src/components/settings/okignore-doc.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import {
appendPattern,
diff --git a/packages/app/src/components/settings/okignore-doc.ts b/packages/app/src/components/settings/okignore-doc.ts
index 60cbc48b..2b4685c0 100644
--- a/packages/app/src/components/settings/okignore-doc.ts
+++ b/packages/app/src/components/settings/okignore-doc.ts
@@ -1,3 +1,4 @@
+
export interface PatternLine {
kind: 'pattern';
raw: string;
diff --git a/packages/app/src/components/settings/okignore-preview.ts b/packages/app/src/components/settings/okignore-preview.ts
index bf1cddc0..ccca2b56 100644
--- a/packages/app/src/components/settings/okignore-preview.ts
+++ b/packages/app/src/components/settings/okignore-preview.ts
@@ -1,3 +1,4 @@
+
import ignore, { type Ignore } from 'ignore';
export const PREVIEW_CACHE_LIMIT = 256;
diff --git a/packages/app/src/components/settings/okignore-warnings.ts b/packages/app/src/components/settings/okignore-warnings.ts
index a922a0d7..e6a34740 100644
--- a/packages/app/src/components/settings/okignore-warnings.ts
+++ b/packages/app/src/components/settings/okignore-warnings.ts
@@ -1,3 +1,4 @@
+
type OkignoreWarningCode =
| 'trailing-backslash'
| 'unmatched-bracket'
diff --git a/packages/app/src/components/settings/schema-walker.test.ts b/packages/app/src/components/settings/schema-walker.test.ts
index bb91e15b..4fa4c541 100644
--- a/packages/app/src/components/settings/schema-walker.test.ts
+++ b/packages/app/src/components/settings/schema-walker.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { ConfigSchema } from '@inkeep/open-knowledge-core';
import {
diff --git a/packages/app/src/components/settings/schema-walker.ts b/packages/app/src/components/settings/schema-walker.ts
index b724bf72..fac70c57 100644
--- a/packages/app/src/components/settings/schema-walker.ts
+++ b/packages/app/src/components/settings/schema-walker.ts
@@ -1,3 +1,4 @@
+
import { resolveLeafSchema } from '@inkeep/open-knowledge-core';
import type { z } from 'zod';
@@ -19,6 +20,7 @@ export function buildPatch(
return { [String(head)]: buildPatch(rest, value) };
}
+
export function getFieldDefault(schema: AnyZ): unknown {
let cur: unknown = schema;
for (let depth = 0; depth < 16; depth++) {
diff --git a/packages/app/src/components/settings/use-config-form.test.ts b/packages/app/src/components/settings/use-config-form.test.ts
index 28ce6da5..6252ed8b 100644
--- a/packages/app/src/components/settings/use-config-form.test.ts
+++ b/packages/app/src/components/settings/use-config-form.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, mock, test } from 'bun:test';
import type {
Config,
@@ -14,6 +15,7 @@ import {
runCommit,
} from './use-config-form';
+
describe('applyExternalUpdate', () => {
test('calls form.reset with keepDirtyValues + keepDirty + keepTouched', () => {
const reset = mock();
@@ -35,6 +37,7 @@ describe('applyExternalUpdate', () => {
});
});
+
interface MockedRunCommitForm extends RunCommitForm {
reset?: never;
}
@@ -309,6 +312,7 @@ describe('runCommit — failure path', () => {
});
});
+
describe('pickFirstIssueForPath', () => {
test('returns the issue.message when an issue path matches the field name', () => {
const error: ConfigValidationError = {
@@ -365,6 +369,7 @@ describe('pickFirstIssueForPath', () => {
});
});
+
describe('useConfigForm module shape', () => {
test('exports useConfigForm as a function', async () => {
const mod = await import('./use-config-form');
diff --git a/packages/app/src/components/settings/use-config-form.ts b/packages/app/src/components/settings/use-config-form.ts
index d2079c13..afdd214b 100644
--- a/packages/app/src/components/settings/use-config-form.ts
+++ b/packages/app/src/components/settings/use-config-form.ts
@@ -1,3 +1,4 @@
+
import {
type Config,
type ConfigBinding,
@@ -34,6 +35,7 @@ export function useConfigForm(binding: ConfigBinding): UseConfigFormResult {
return { form, commitField };
}
+
export type ApplyExternalUpdateForm = Pick, 'reset'>;
export function applyExternalUpdate(
diff --git a/packages/app/src/components/share-metadata-rows.tsx b/packages/app/src/components/share-metadata-rows.tsx
index c136f81e..607ed1cf 100644
--- a/packages/app/src/components/share-metadata-rows.tsx
+++ b/packages/app/src/components/share-metadata-rows.tsx
@@ -1,3 +1,4 @@
+
import { Trans } from '@lingui/react/macro';
import type { ReactNode } from 'react';
diff --git a/packages/app/src/components/sidebar-hover-prewarm.ts b/packages/app/src/components/sidebar-hover-prewarm.ts
index 44dcf30b..cc313084 100644
--- a/packages/app/src/components/sidebar-hover-prewarm.ts
+++ b/packages/app/src/components/sidebar-hover-prewarm.ts
@@ -1,3 +1,4 @@
+
import { isSystemDoc } from '@/editor/is-system-doc';
import { mark } from '@/lib/perf';
import { readNumericOverride } from '@/lib/perf/env-override';
diff --git a/packages/app/src/components/skill-actions.tsx b/packages/app/src/components/skill-actions.tsx
index 38acd716..902ae204 100644
--- a/packages/app/src/components/skill-actions.tsx
+++ b/packages/app/src/components/skill-actions.tsx
@@ -37,6 +37,7 @@ import { scheduleClipboardWrite } from '@/lib/share/clipboard-adapter';
import { duplicateSkill, installSkill, uninstallSkill } from '@/lib/skills-api';
import { useWorkspace } from '@/lib/use-workspace';
+
export interface SkillActions {
installingName: string | null;
install: (
diff --git a/packages/app/src/components/template-picker-utils.ts b/packages/app/src/components/template-picker-utils.ts
index d6c0931d..49b10547 100644
--- a/packages/app/src/components/template-picker-utils.ts
+++ b/packages/app/src/components/template-picker-utils.ts
@@ -1,5 +1,6 @@
import type { TemplateMenuEntry } from '@/hooks/use-folder-config';
+
const SCOPE_ORDER: Record = {
local: 0,
inherited: 1,
diff --git a/packages/app/src/components/terminal-session-registry.ts b/packages/app/src/components/terminal-session-registry.ts
index 11993717..2361587f 100644
--- a/packages/app/src/components/terminal-session-registry.ts
+++ b/packages/app/src/components/terminal-session-registry.ts
@@ -1,3 +1,4 @@
+
import type { TerminalCli } from '@inkeep/open-knowledge-core';
export const IDLE_QUIET_MS = 1200;
diff --git a/packages/app/src/components/terminal-wheel.ts b/packages/app/src/components/terminal-wheel.ts
index 5b0e2e13..8e917d0d 100644
--- a/packages/app/src/components/terminal-wheel.ts
+++ b/packages/app/src/components/terminal-wheel.ts
@@ -1,3 +1,4 @@
+
export type WheelButton = 64 | 65;
export interface WheelReportOptions {
diff --git a/packages/app/src/components/text-viewer-languages.ts b/packages/app/src/components/text-viewer-languages.ts
index da5e3ea1..d0cf7b78 100644
--- a/packages/app/src/components/text-viewer-languages.ts
+++ b/packages/app/src/components/text-viewer-languages.ts
@@ -1,3 +1,4 @@
+
import type { Language } from '@codemirror/language';
const cache = new Map>();
diff --git a/packages/app/src/components/ui/command.tsx b/packages/app/src/components/ui/command.tsx
index 824632e1..6fbf16ac 100644
--- a/packages/app/src/components/ui/command.tsx
+++ b/packages/app/src/components/ui/command.tsx
@@ -1,3 +1,4 @@
+
import { Command as CommandPrimitive } from 'cmdk';
import { SearchIcon } from 'lucide-react';
import type { ComponentProps } from 'react';
diff --git a/packages/app/src/components/ui/form.test.ts b/packages/app/src/components/ui/form.test.ts
index 7fb8f673..e89e3f6a 100644
--- a/packages/app/src/components/ui/form.test.ts
+++ b/packages/app/src/components/ui/form.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
describe('ui/form module', () => {
diff --git a/packages/app/src/editor/ComposerMentionInput.tsx b/packages/app/src/editor/ComposerMentionInput.tsx
index fa4daaaa..953b0c7c 100644
--- a/packages/app/src/editor/ComposerMentionInput.tsx
+++ b/packages/app/src/editor/ComposerMentionInput.tsx
@@ -1,3 +1,4 @@
+
import type { JSONContent } from '@tiptap/core';
import { EditorContent, useEditor } from '@tiptap/react';
import { type Ref, useEffect, useImperativeHandle, useRef } from 'react';
diff --git a/packages/app/src/editor/DocumentContext.tsx b/packages/app/src/editor/DocumentContext.tsx
index ee1c0226..344ce065 100644
--- a/packages/app/src/editor/DocumentContext.tsx
+++ b/packages/app/src/editor/DocumentContext.tsx
@@ -1447,7 +1447,8 @@ if (import.meta.hot) {
delete (window as { __test_rejectSyncPromise?: unknown }).__test_rejectSyncPromise;
delete (window as { __test_armPendingRejection?: unknown }).__test_armPendingRejection;
delete (window as { __test_closeActiveWebSocket?: unknown }).__test_closeActiveWebSocket;
- } catch {}
+ } catch {
+ }
}
});
}
diff --git a/packages/app/src/editor/SourceEditor.tsx b/packages/app/src/editor/SourceEditor.tsx
index e732ff1f..ca717175 100644
--- a/packages/app/src/editor/SourceEditor.tsx
+++ b/packages/app/src/editor/SourceEditor.tsx
@@ -111,6 +111,7 @@ export function SourceEditor({
sourceModeActiveRef.current = isSourceModeActive;
}, [isSourceModeActive]);
+
const cmEntryRef = useRef(null);
// biome-ignore lint/correctness/useExhaustiveDependencies: see comment above
useEffect(() => {
diff --git a/packages/app/src/editor/TiptapEditor.tsx b/packages/app/src/editor/TiptapEditor.tsx
index 8f12ad0d..cd164c1f 100644
--- a/packages/app/src/editor/TiptapEditor.tsx
+++ b/packages/app/src/editor/TiptapEditor.tsx
@@ -129,7 +129,8 @@ function repairDetachedEditorContent(editor: Editor, portalTarget: HTMLElement):
try {
view.setProps({ nodeViews: {} });
- } catch {}
+ } catch {
+ }
editorWithContent.contentComponent = null;
editorWithContent.isEditorContentInitialized = false;
return true;
@@ -570,6 +571,7 @@ const TiptapEditorChrome: FC = ({
};
}, [editor, docName]);
+
useEffect(() => {
const activityMap = provider.document.getMap('agent-flash');
let lastSeenTimestamp = Date.now();
diff --git a/packages/app/src/editor/active-editor.ts b/packages/app/src/editor/active-editor.ts
index b49b53f3..1b126644 100644
--- a/packages/app/src/editor/active-editor.ts
+++ b/packages/app/src/editor/active-editor.ts
@@ -1,3 +1,4 @@
+
import type { Editor } from '@tiptap/core';
const editors = new Map();
diff --git a/packages/app/src/editor/asset-dispatch/dispatcher.ts b/packages/app/src/editor/asset-dispatch/dispatcher.ts
index 3d4036a8..b1391085 100644
--- a/packages/app/src/editor/asset-dispatch/dispatcher.ts
+++ b/packages/app/src/editor/asset-dispatch/dispatcher.ts
@@ -1,3 +1,4 @@
+
import { type AssetViewerRegistry, assetViewerRegistry } from './registry.ts';
import type { AssetClickContext } from './types.ts';
diff --git a/packages/app/src/editor/asset-dispatch/index.ts b/packages/app/src/editor/asset-dispatch/index.ts
index 297810a2..f9121bc8 100644
--- a/packages/app/src/editor/asset-dispatch/index.ts
+++ b/packages/app/src/editor/asset-dispatch/index.ts
@@ -1 +1,2 @@
+
export { dispatchAssetClick } from './dispatcher.ts';
diff --git a/packages/app/src/editor/asset-dispatch/registry.ts b/packages/app/src/editor/asset-dispatch/registry.ts
index af561a58..f5a5e973 100644
--- a/packages/app/src/editor/asset-dispatch/registry.ts
+++ b/packages/app/src/editor/asset-dispatch/registry.ts
@@ -1,3 +1,4 @@
+
import type { AssetViewer, AssetViewerLookupResult } from './types.ts';
export class AssetViewerRegistry {
diff --git a/packages/app/src/editor/asset-dispatch/types.ts b/packages/app/src/editor/asset-dispatch/types.ts
index 8d6adfcf..4085a600 100644
--- a/packages/app/src/editor/asset-dispatch/types.ts
+++ b/packages/app/src/editor/asset-dispatch/types.ts
@@ -1,3 +1,4 @@
+
export interface AssetClickContext {
readonly url: string;
readonly projectRelPath: string;
diff --git a/packages/app/src/editor/binding-staleness-guard.test.ts b/packages/app/src/editor/binding-staleness-guard.test.ts
index f09cdf13..1ec36384 100644
--- a/packages/app/src/editor/binding-staleness-guard.test.ts
+++ b/packages/app/src/editor/binding-staleness-guard.test.ts
@@ -1,3 +1,4 @@
+
import { afterAll, afterEach, beforeAll, describe, expect, test } from 'bun:test';
import { randomUUID } from 'node:crypto';
import { getSchema } from '@tiptap/core';
@@ -14,6 +15,7 @@ import {
} from './binding-staleness-guard';
import { sharedExtensions } from './extensions/shared';
+
function installDomGlobals(): () => void {
const dom = new JSDOM('', {
url: 'http://localhost:5173',
@@ -72,6 +74,7 @@ afterAll(() => {
restoreDomGlobals = null;
});
+
const schema = getSchema(sharedExtensions);
/** Stands in for a provider applying a remote peer's update (origin is the
@@ -245,6 +248,7 @@ function createHarness(options: HarnessOptions = {}): GuardHarness {
return harness;
}
+
describe('pure helpers', () => {
test('isDiverged is true exactly when external is ahead of applied', () => {
expect(isDiverged(0, 0)).toBe(false);
@@ -275,6 +279,7 @@ describe('pure helpers', () => {
});
});
+
describe('counter semantics', () => {
test('a wedged external burst is reported once, deferred, with the full backlog', async () => {
const harness = createHarness();
@@ -325,6 +330,7 @@ describe('counter semantics', () => {
});
});
+
describe('publication gate', () => {
test('while diverged, every transaction without y-sync meta is blocked — including selection-only', async () => {
const harness = createHarness({ seedText: 'long enough to move a cursor' });
@@ -377,6 +383,7 @@ describe('publication gate', () => {
});
});
+
describe('wedge trigger', () => {
test('fires once per divergence episode across repeated wedged bumps; the gate keeps blocking', async () => {
const harness = createHarness();
@@ -450,6 +457,7 @@ describe('wedge trigger', () => {
});
});
+
describe('binding write-back seam', () => {
/** What the vendored ySyncPlugin's pluginView `update` callback does
* unconditionally on every view-state update (y-tiptap.cjs view section):
@@ -534,6 +542,7 @@ describe('binding write-back seam', () => {
});
});
+
describe('no false positives on healthy bindings', () => {
for (const order of ['registered-before-guard', 'registered-after-guard'] as const) {
test(`rapid external stream interleaved with local typing stays open (binding ${order})`, async () => {
diff --git a/packages/app/src/editor/binding-staleness-guard.ts b/packages/app/src/editor/binding-staleness-guard.ts
index 758caca8..e467cfc7 100644
--- a/packages/app/src/editor/binding-staleness-guard.ts
+++ b/packages/app/src/editor/binding-staleness-guard.ts
@@ -5,6 +5,7 @@ import { ySyncPluginKey } from '@tiptap/y-tiptap';
import type * as Y from 'yjs';
import { mark } from '../lib/perf/mark';
+
export interface WedgeDetail {
externalSeq: number;
appliedSeq: number;
diff --git a/packages/app/src/editor/block-ux/keyboard-nav.ts b/packages/app/src/editor/block-ux/keyboard-nav.ts
index 7e97adc6..a6a7d98f 100644
--- a/packages/app/src/editor/block-ux/keyboard-nav.ts
+++ b/packages/app/src/editor/block-ux/keyboard-nav.ts
@@ -1,3 +1,4 @@
+
import { incrementJsxArrowNodeSelectFailed } from '@inkeep/open-knowledge-core';
import type { Editor } from '@tiptap/core';
import { Extension } from '@tiptap/core';
diff --git a/packages/app/src/editor/branch-invalidation.test.ts b/packages/app/src/editor/branch-invalidation.test.ts
index 9709fc5e..a18f68a7 100644
--- a/packages/app/src/editor/branch-invalidation.test.ts
+++ b/packages/app/src/editor/branch-invalidation.test.ts
@@ -118,6 +118,7 @@ describe('handleBranchSwitched', () => {
expect(clear2).toHaveBeenCalledTimes(1);
});
+
test('swallows clearData failures and still recycles', async () => {
pool = new ProviderPool(3, DUMMY_WS);
pool.setExpectedServerInstanceId(TEST_SERVER_INSTANCE_ID);
diff --git a/packages/app/src/editor/branch-invalidation.ts b/packages/app/src/editor/branch-invalidation.ts
index 480223e5..f392cde1 100644
--- a/packages/app/src/editor/branch-invalidation.ts
+++ b/packages/app/src/editor/branch-invalidation.ts
@@ -1,3 +1,4 @@
+
import { z } from 'zod';
import type { ProviderPool } from './provider-pool';
diff --git a/packages/app/src/editor/bubble-menu/BubbleMenuBar.tsx b/packages/app/src/editor/bubble-menu/BubbleMenuBar.tsx
index c5a9d333..27be06b6 100644
--- a/packages/app/src/editor/bubble-menu/BubbleMenuBar.tsx
+++ b/packages/app/src/editor/bubble-menu/BubbleMenuBar.tsx
@@ -75,7 +75,8 @@ export function BubbleMenuBar({
popup.style.top = `${y}px`;
}
})
- .catch(() => {});
+ .catch(() => {
+ });
});
};
diff --git a/packages/app/src/editor/bubble-menu/EditWithAiBubbleButton.dom.test.tsx b/packages/app/src/editor/bubble-menu/EditWithAiBubbleButton.dom.test.tsx
index 907e5850..5ecaf1d1 100644
--- a/packages/app/src/editor/bubble-menu/EditWithAiBubbleButton.dom.test.tsx
+++ b/packages/app/src/editor/bubble-menu/EditWithAiBubbleButton.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import { act, cleanup, render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
diff --git a/packages/app/src/editor/bubble-menu/EditWithAiBubbleButton.tsx b/packages/app/src/editor/bubble-menu/EditWithAiBubbleButton.tsx
index 842427e0..6f71b7a4 100644
--- a/packages/app/src/editor/bubble-menu/EditWithAiBubbleButton.tsx
+++ b/packages/app/src/editor/bubble-menu/EditWithAiBubbleButton.tsx
@@ -1,3 +1,4 @@
+
import { Trans } from '@lingui/react/macro';
import { isMacOS } from '@tiptap/core';
import type { Editor } from '@tiptap/react';
diff --git a/packages/app/src/editor/bubble-menu/FileBubbleButtons.tsx b/packages/app/src/editor/bubble-menu/FileBubbleButtons.tsx
index c3d5611c..80bd5c49 100644
--- a/packages/app/src/editor/bubble-menu/FileBubbleButtons.tsx
+++ b/packages/app/src/editor/bubble-menu/FileBubbleButtons.tsx
@@ -1,3 +1,4 @@
+
import { Trans, useLingui } from '@lingui/react/macro';
import type { Editor } from '@tiptap/react';
import { useEditorState } from '@tiptap/react';
diff --git a/packages/app/src/editor/bubble-menu/FootnoteBubbleButton.dom.test.tsx b/packages/app/src/editor/bubble-menu/FootnoteBubbleButton.dom.test.tsx
index 300f419d..90f356e4 100644
--- a/packages/app/src/editor/bubble-menu/FootnoteBubbleButton.dom.test.tsx
+++ b/packages/app/src/editor/bubble-menu/FootnoteBubbleButton.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { cleanup, render } from '@testing-library/react';
import type { Editor } from '@tiptap/react';
diff --git a/packages/app/src/editor/bubble-menu/FootnoteBubbleButton.tsx b/packages/app/src/editor/bubble-menu/FootnoteBubbleButton.tsx
index 7b350047..dee88be2 100644
--- a/packages/app/src/editor/bubble-menu/FootnoteBubbleButton.tsx
+++ b/packages/app/src/editor/bubble-menu/FootnoteBubbleButton.tsx
@@ -1,3 +1,4 @@
+
import {
collectFootnoteIdentifiers,
findFootnoteDefinitionInsertPos,
diff --git a/packages/app/src/editor/bubble-menu/ImageAlignButtons.test.ts b/packages/app/src/editor/bubble-menu/ImageAlignButtons.test.ts
index 8679f7bc..028be7c9 100644
--- a/packages/app/src/editor/bubble-menu/ImageAlignButtons.test.ts
+++ b/packages/app/src/editor/bubble-menu/ImageAlignButtons.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import type { Editor } from '@tiptap/react';
import { isImageNodeSelected } from './ImageAlignButtons';
diff --git a/packages/app/src/editor/bubble-menu/ImageAlignButtons.tsx b/packages/app/src/editor/bubble-menu/ImageAlignButtons.tsx
index a21e80ff..8f0d7472 100644
--- a/packages/app/src/editor/bubble-menu/ImageAlignButtons.tsx
+++ b/packages/app/src/editor/bubble-menu/ImageAlignButtons.tsx
@@ -1,3 +1,4 @@
+
import { NodeSelection } from '@tiptap/pm/state';
import type { Editor } from '@tiptap/react';
import { useEditorState } from '@tiptap/react';
diff --git a/packages/app/src/editor/client-persistence.test.ts b/packages/app/src/editor/client-persistence.test.ts
index d92c4da0..75de15d7 100644
--- a/packages/app/src/editor/client-persistence.test.ts
+++ b/packages/app/src/editor/client-persistence.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, spyOn, test } from 'bun:test';
import { randomUUID } from 'node:crypto';
import * as Y from 'yjs';
@@ -287,7 +288,8 @@ describe('createClientPersistence', () => {
warnSpy.mockRestore();
try {
blocker.close();
- } catch {}
+ } catch {
+ }
docA.destroy();
}
});
diff --git a/packages/app/src/editor/client-persistence.ts b/packages/app/src/editor/client-persistence.ts
index 90b3e786..58d1c7b4 100644
--- a/packages/app/src/editor/client-persistence.ts
+++ b/packages/app/src/editor/client-persistence.ts
@@ -1,3 +1,4 @@
+
import { LINEAGE_EPOCH_KEY } from '@inkeep/open-knowledge-core';
import { IndexeddbPersistence } from 'y-indexeddb';
import * as Y from 'yjs';
@@ -108,7 +109,8 @@ class ClientPersistenceImpl implements ClientPersistenceProvider {
reject(err instanceof Error ? err : new Error(String(err)));
try {
tx.abort();
- } catch {}
+ } catch {
+ }
}
};
tx.oncomplete = () => resolve();
diff --git a/packages/app/src/editor/clipboard/clipboard-sanitize.test.ts b/packages/app/src/editor/clipboard/clipboard-sanitize.test.ts
index fff801fe..83bc7d48 100644
--- a/packages/app/src/editor/clipboard/clipboard-sanitize.test.ts
+++ b/packages/app/src/editor/clipboard/clipboard-sanitize.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import {
classifyUrlPortability,
@@ -407,6 +408,7 @@ describe('OPT_OUT_ATTR — descriptor opt-out marker', () => {
});
describe('classifyUrlPortability — single-pass classification with reason bucket', () => {
+
describe('portable inputs (reason absent)', () => {
test('fragment-only refs return { portable: true }', () => {
expect(classifyUrlPortability('#section')).toEqual({ portable: true });
diff --git a/packages/app/src/editor/clipboard/clipboard-sanitize.ts b/packages/app/src/editor/clipboard/clipboard-sanitize.ts
index 60314421..56e37965 100644
--- a/packages/app/src/editor/clipboard/clipboard-sanitize.ts
+++ b/packages/app/src/editor/clipboard/clipboard-sanitize.ts
@@ -1,3 +1,4 @@
+
import { isRelativeUrl, SAFE_URL_SCHEME_RE } from '@inkeep/open-knowledge-core';
import * as ipaddr from 'ipaddr.js';
@@ -77,6 +78,7 @@ export function sanitizeStyleAttrValue(value: string): string {
return value;
}
+
function parseColorBody(body: string): [number, number, number, number | null] | null {
const slashIdx = body.indexOf('/');
const main = (slashIdx === -1 ? body : body.slice(0, slashIdx)).trim();
@@ -181,6 +183,7 @@ export function convertCssColors(value: string): string {
});
}
+
const PORTABLE_NAVIGATION_SCHEMES: ReadonlySet = new Set([
'mailto',
'tel',
diff --git a/packages/app/src/editor/clipboard/clipboard-walker-fallback-palette.test.ts b/packages/app/src/editor/clipboard/clipboard-walker-fallback-palette.test.ts
index fc6e336a..d5614357 100644
--- a/packages/app/src/editor/clipboard/clipboard-walker-fallback-palette.test.ts
+++ b/packages/app/src/editor/clipboard/clipboard-walker-fallback-palette.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { classifyUrlPortability } from './clipboard-sanitize.ts';
import {
@@ -66,6 +67,7 @@ describe('toneForType — type-to-tone lookup with prototype-pollution guard', (
});
});
+
describe('paletteUrlReason — portability decision', () => {
test('returns null for fragment-only refs', () => {
expect(paletteUrlReason('#section')).toBeNull();
diff --git a/packages/app/src/editor/clipboard/clipboard-walker-fallback-palette.ts b/packages/app/src/editor/clipboard/clipboard-walker-fallback-palette.ts
index 38d2985f..273ab249 100644
--- a/packages/app/src/editor/clipboard/clipboard-walker-fallback-palette.ts
+++ b/packages/app/src/editor/clipboard/clipboard-walker-fallback-palette.ts
@@ -1,3 +1,4 @@
+
import type { Node as PmNode } from '@tiptap/pm/model';
import {
classifyUrlPortability,
diff --git a/packages/app/src/editor/clipboard/clipboard-walker.test.ts b/packages/app/src/editor/clipboard/clipboard-walker.test.ts
index 5a690c98..2634efe8 100644
--- a/packages/app/src/editor/clipboard/clipboard-walker.test.ts
+++ b/packages/app/src/editor/clipboard/clipboard-walker.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { Schema } from '@tiptap/pm/model';
import {
@@ -182,6 +183,7 @@ describe('buildInlineStyleFrom — modern CSS color downgrade', () => {
});
describe('selectionPartiallyCoversTopLevelNode — selection-bound containment guard', () => {
+
const schema = new Schema({
nodes: {
doc: { content: 'block+' },
@@ -297,6 +299,7 @@ describe('glyphForLucide — pure lookup for cross-app icon substitution', () =>
});
});
+
function fakeElementWithClosest(closestResults: Record): Element {
return {
closest: (selector: string) => closestResults[selector] ?? null,
@@ -316,6 +319,7 @@ describe('chooseEmissionClass — paragraph-content-model rule', () => {
});
});
+
interface FakeNode {
tagName: string;
attrs: Record;
@@ -498,6 +502,7 @@ describe('applyWikiLinkTransform — wiki-link rewrite', () => {
});
});
+
interface PostPassFakeElement {
tagName: string;
attrs: Record;
diff --git a/packages/app/src/editor/clipboard/clipboard-walker.ts b/packages/app/src/editor/clipboard/clipboard-walker.ts
index b17d8d0f..a7e25661 100644
--- a/packages/app/src/editor/clipboard/clipboard-walker.ts
+++ b/packages/app/src/editor/clipboard/clipboard-walker.ts
@@ -1,3 +1,4 @@
+
import { normalizeNullableString, wikiLinkHref } from '@inkeep/open-knowledge-core';
import type { Node as PmNode, Slice } from '@tiptap/pm/model';
import type { EditorView } from '@tiptap/pm/view';
@@ -82,6 +83,7 @@ export const ATTR_BLOCKLIST: ReadonlySet = new Set([
'data-pm-slice',
]);
+
export interface ComputedStyleLike {
getPropertyValue(prop: string): string;
}
@@ -339,6 +341,7 @@ function walkPair(live: Element, clone: Element, env: WalkerEnv): void {
}
}
+
export function applyWikiLinkTransform(root: Element): void {
const spans = root.querySelectorAll('span[data-wiki-link]');
for (const span of Array.from(spans)) {
@@ -358,6 +361,7 @@ export function applyWikiLinkTransform(root: Element): void {
}
}
+
type WalkerUrlLeafTag = Exclude;
const URL_LEAF_TAGS: ReadonlySet = new Set([
diff --git a/packages/app/src/editor/clipboard/detect-source.test.ts b/packages/app/src/editor/clipboard/detect-source.test.ts
index 623ff5f8..a6ede7c1 100644
--- a/packages/app/src/editor/clipboard/detect-source.test.ts
+++ b/packages/app/src/editor/clipboard/detect-source.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { detectSource } from './detect-source.ts';
diff --git a/packages/app/src/editor/clipboard/detect-source.ts b/packages/app/src/editor/clipboard/detect-source.ts
index 7a072ba6..e0c29223 100644
--- a/packages/app/src/editor/clipboard/detect-source.ts
+++ b/packages/app/src/editor/clipboard/detect-source.ts
@@ -1,3 +1,4 @@
+
export type ClipboardSource =
| 'vscode'
| 'gfm'
diff --git a/packages/app/src/editor/clipboard/handle-drop.test.ts b/packages/app/src/editor/clipboard/handle-drop.test.ts
index 4496bb64..60df0439 100644
--- a/packages/app/src/editor/clipboard/handle-drop.test.ts
+++ b/packages/app/src/editor/clipboard/handle-drop.test.ts
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import * as actualCore from '@inkeep/open-knowledge-core';
import * as actualSonner from 'sonner';
diff --git a/packages/app/src/editor/clipboard/handle-paste.test.ts b/packages/app/src/editor/clipboard/handle-paste.test.ts
index 18ddde78..739e43fb 100644
--- a/packages/app/src/editor/clipboard/handle-paste.test.ts
+++ b/packages/app/src/editor/clipboard/handle-paste.test.ts
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import * as actualCore from '@inkeep/open-knowledge-core';
import * as actualSonner from 'sonner';
diff --git a/packages/app/src/editor/clipboard/handle-paste.ts b/packages/app/src/editor/clipboard/handle-paste.ts
index d1f84eba..763dc5a1 100644
--- a/packages/app/src/editor/clipboard/handle-paste.ts
+++ b/packages/app/src/editor/clipboard/handle-paste.ts
@@ -1,3 +1,4 @@
+
import type { MarkdownManager } from '@inkeep/open-knowledge-core';
import { htmlToMdast, mdastToMarkdown } from '@inkeep/open-knowledge-core';
import type { JSONContent } from '@tiptap/core';
diff --git a/packages/app/src/editor/clipboard/index.ts b/packages/app/src/editor/clipboard/index.ts
index 37a12d90..0bafa091 100644
--- a/packages/app/src/editor/clipboard/index.ts
+++ b/packages/app/src/editor/clipboard/index.ts
@@ -1,3 +1,4 @@
+
export { OPT_OUT_ATTR } from './clipboard-sanitize.ts';
export { createHandleDrop, createHandlePaste } from './handle-paste.ts';
export {
diff --git a/packages/app/src/editor/clipboard/instrument.test.ts b/packages/app/src/editor/clipboard/instrument.test.ts
index 335da32a..7447ed06 100644
--- a/packages/app/src/editor/clipboard/instrument.test.ts
+++ b/packages/app/src/editor/clipboard/instrument.test.ts
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, test } from 'bun:test';
import { ChunkedInsertError, HtmlPayloadTooLargeError } from '@inkeep/open-knowledge-core';
diff --git a/packages/app/src/editor/clipboard/instrument.ts b/packages/app/src/editor/clipboard/instrument.ts
index c7effa5b..ad7c1cee 100644
--- a/packages/app/src/editor/clipboard/instrument.ts
+++ b/packages/app/src/editor/clipboard/instrument.ts
@@ -2,6 +2,7 @@ import { ChunkedInsertError, HtmlPayloadTooLargeError } from '@inkeep/open-knowl
import type { UrlPortabilityReason } from './clipboard-sanitize.ts';
import type { ClipboardSource } from './detect-source.ts';
+
type ClipboardEventName =
| 'clipboard-slow-op'
| 'clipboard-source-detected'
diff --git a/packages/app/src/editor/clipboard/is-markdown.test.ts b/packages/app/src/editor/clipboard/is-markdown.test.ts
index e2e7ca23..239b2af2 100644
--- a/packages/app/src/editor/clipboard/is-markdown.test.ts
+++ b/packages/app/src/editor/clipboard/is-markdown.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { isMarkdown } from './is-markdown.ts';
diff --git a/packages/app/src/editor/clipboard/is-markdown.ts b/packages/app/src/editor/clipboard/is-markdown.ts
index ae00bfba..333a5b33 100644
--- a/packages/app/src/editor/clipboard/is-markdown.ts
+++ b/packages/app/src/editor/clipboard/is-markdown.ts
@@ -1,3 +1,4 @@
+
const FENCE_RE = /^```/m;
const HEADING_RE = /^#{1,6} /m;
const BULLET_RE = /^[-*+] /m;
diff --git a/packages/app/src/editor/clipboard/non-portable-render-source-fallback.test.ts b/packages/app/src/editor/clipboard/non-portable-render-source-fallback.test.ts
index ac29245b..22f37da4 100644
--- a/packages/app/src/editor/clipboard/non-portable-render-source-fallback.test.ts
+++ b/packages/app/src/editor/clipboard/non-portable-render-source-fallback.test.ts
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import type { Node as PmNode } from '@tiptap/pm/model';
import { sourceFallbackFormFor } from './non-portable-render-source-fallback.ts';
diff --git a/packages/app/src/editor/clipboard/non-portable-render-source-fallback.ts b/packages/app/src/editor/clipboard/non-portable-render-source-fallback.ts
index 62651c26..2b946739 100644
--- a/packages/app/src/editor/clipboard/non-portable-render-source-fallback.ts
+++ b/packages/app/src/editor/clipboard/non-portable-render-source-fallback.ts
@@ -1,3 +1,4 @@
+
import type { Node as PmNode } from '@tiptap/pm/model';
type SourceFallbackForm = { source: string };
diff --git a/packages/app/src/editor/clipboard/paste-failure-toast.test.ts b/packages/app/src/editor/clipboard/paste-failure-toast.test.ts
index 6a2e7f12..83eb2671 100644
--- a/packages/app/src/editor/clipboard/paste-failure-toast.test.ts
+++ b/packages/app/src/editor/clipboard/paste-failure-toast.test.ts
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import * as actualSonner from 'sonner';
diff --git a/packages/app/src/editor/clipboard/paste-failure-toast.ts b/packages/app/src/editor/clipboard/paste-failure-toast.ts
index 28da4659..6b9a64ca 100644
--- a/packages/app/src/editor/clipboard/paste-failure-toast.ts
+++ b/packages/app/src/editor/clipboard/paste-failure-toast.ts
@@ -1,3 +1,4 @@
+
import { toast } from 'sonner';
const THROTTLE_MS = 3000;
diff --git a/packages/app/src/editor/clipboard/serialize.test.ts b/packages/app/src/editor/clipboard/serialize.test.ts
index af9a03f2..9afe862c 100644
--- a/packages/app/src/editor/clipboard/serialize.test.ts
+++ b/packages/app/src/editor/clipboard/serialize.test.ts
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import type { JSONContent } from '@tiptap/core';
import type { Fragment } from '@tiptap/pm/model';
@@ -86,6 +87,7 @@ describe('createClipboardTextSerializer', () => {
});
describe('createClipboardHtmlSerializer — walker→markdown tier dispatch', () => {
+
function emptyFragment(): Fragment {
return { firstChild: null } as unknown as Fragment;
}
@@ -180,6 +182,7 @@ describe('createClipboardHtmlSerializer — walker→markdown tier dispatch', ()
});
describe('createClipboardHtmlSerializer — walker env wires markdown reconstruction', () => {
+
let warnCalls: string[];
let innerOrigWarn: typeof console.warn;
beforeEach(() => {
@@ -261,6 +264,7 @@ function wrapDescriptor(el: FakeDescriptorElement): Element {
}
describe('findDescriptorRoot — outermost-wrapper selection', () => {
+
test('(a) bare element with only ProseMirror parent → returns null', () => {
const proseMirror = makeDescriptorEl({ classes: ['ProseMirror'] });
const img = makeDescriptorEl();
@@ -337,6 +341,7 @@ describe('findDescriptorRoot — outermost-wrapper selection', () => {
});
describe('sliceToDocJson — inline-first wrapping branch', () => {
+
const inlineImageSchema = new Schema({
nodes: {
doc: { content: 'block+' },
diff --git a/packages/app/src/editor/clipboard/serialize.ts b/packages/app/src/editor/clipboard/serialize.ts
index 0793f6b8..4ab180aa 100644
--- a/packages/app/src/editor/clipboard/serialize.ts
+++ b/packages/app/src/editor/clipboard/serialize.ts
@@ -1,3 +1,4 @@
+
import type { MarkdownManager } from '@inkeep/open-knowledge-core';
import { markdownToHtml } from '@inkeep/open-knowledge-core';
import type { JSONContent } from '@tiptap/core';
diff --git a/packages/app/src/editor/clipboard/shift-tracker.test.ts b/packages/app/src/editor/clipboard/shift-tracker.test.ts
index 78be5917..bc7f11a2 100644
--- a/packages/app/src/editor/clipboard/shift-tracker.test.ts
+++ b/packages/app/src/editor/clipboard/shift-tracker.test.ts
@@ -1,3 +1,4 @@
+
import { afterAll, beforeAll, beforeEach, describe, expect, test } from 'bun:test';
interface Listener {
diff --git a/packages/app/src/editor/clipboard/shift-tracker.ts b/packages/app/src/editor/clipboard/shift-tracker.ts
index e214f82e..ee57f6e9 100644
--- a/packages/app/src/editor/clipboard/shift-tracker.ts
+++ b/packages/app/src/editor/clipboard/shift-tracker.ts
@@ -1,3 +1,4 @@
+
let shiftHeldLatch = false;
let listenersAttached = false;
diff --git a/packages/app/src/editor/clipboard/source-clipboard-recovery.test.ts b/packages/app/src/editor/clipboard/source-clipboard-recovery.test.ts
index 0a5e3069..fcc21ab6 100644
--- a/packages/app/src/editor/clipboard/source-clipboard-recovery.test.ts
+++ b/packages/app/src/editor/clipboard/source-clipboard-recovery.test.ts
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test';
import { ChunkedInsertError } from '@inkeep/open-knowledge-core';
import * as actualSonner from 'sonner';
diff --git a/packages/app/src/editor/clipboard/source-clipboard.test.ts b/packages/app/src/editor/clipboard/source-clipboard.test.ts
index e9044ed2..935100d3 100644
--- a/packages/app/src/editor/clipboard/source-clipboard.test.ts
+++ b/packages/app/src/editor/clipboard/source-clipboard.test.ts
@@ -1,3 +1,4 @@
+
import { afterEach, beforeEach, describe, expect, test } from 'bun:test';
import { buildSourceModeHtml, handleCopyOrCut, handlePaste } from './source-clipboard.ts';
diff --git a/packages/app/src/editor/components/Accordion.test.tsx b/packages/app/src/editor/components/Accordion.test.tsx
index 7fa349a9..fe7bfe1b 100644
--- a/packages/app/src/editor/components/Accordion.test.tsx
+++ b/packages/app/src/editor/components/Accordion.test.tsx
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { renderToString } from 'react-dom/server';
import { Accordion } from './Accordion.tsx';
diff --git a/packages/app/src/editor/components/Accordion.tsx b/packages/app/src/editor/components/Accordion.tsx
index 95efdff1..4fb9b666 100644
--- a/packages/app/src/editor/components/Accordion.tsx
+++ b/packages/app/src/editor/components/Accordion.tsx
@@ -1,3 +1,4 @@
+
import { ChevronRight } from 'lucide-react';
import { resolveLucideIcon } from './lucide-icon-allowlist.ts';
diff --git a/packages/app/src/editor/components/Audio.tsx b/packages/app/src/editor/components/Audio.tsx
index 9d5a734d..1a32406d 100644
--- a/packages/app/src/editor/components/Audio.tsx
+++ b/packages/app/src/editor/components/Audio.tsx
@@ -1,3 +1,4 @@
+
import { toDesktopAssetHref } from '@inkeep/open-knowledge-core';
interface AudioProps {
diff --git a/packages/app/src/editor/components/Callout.test.tsx b/packages/app/src/editor/components/Callout.test.tsx
index 7eebbb70..d3639d5a 100644
--- a/packages/app/src/editor/components/Callout.test.tsx
+++ b/packages/app/src/editor/components/Callout.test.tsx
@@ -1,3 +1,4 @@
+
import { describe, expect, test } from 'bun:test';
import { renderToString } from 'react-dom/server';
import { Callout } from './Callout.tsx';
diff --git a/packages/app/src/editor/components/Callout.tsx b/packages/app/src/editor/components/Callout.tsx
index 41c44e3c..32178a1d 100644
--- a/packages/app/src/editor/components/Callout.tsx
+++ b/packages/app/src/editor/components/Callout.tsx
@@ -1,3 +1,4 @@
+
import { Trans } from '@lingui/react/macro';
import {
AlertOctagon,
diff --git a/packages/app/src/editor/components/CodePreviewEditModal.dom.test.tsx b/packages/app/src/editor/components/CodePreviewEditModal.dom.test.tsx
index f4c22065..55657156 100644
--- a/packages/app/src/editor/components/CodePreviewEditModal.dom.test.tsx
+++ b/packages/app/src/editor/components/CodePreviewEditModal.dom.test.tsx
@@ -1,3 +1,4 @@
+
import { afterEach, describe, expect, test } from 'bun:test';
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
import { useState } from 'react';
diff --git a/packages/app/src/editor/components/CodePreviewEditModal.tsx b/packages/app/src/editor/components/CodePreviewEditModal.tsx
index 5c1b8388..82c32493 100644
--- a/packages/app/src/editor/components/CodePreviewEditModal.tsx
+++ b/packages/app/src/editor/components/CodePreviewEditModal.tsx
@@ -1,3 +1,4 @@
+
import { defaultKeymap, history, historyKeymap, indentWithTab } from '@codemirror/commands';
import { css } from '@codemirror/lang-css';
import { html } from '@codemirror/lang-html';
@@ -182,7 +183,9 @@ export function CodePreviewEditModal({
return (