diff --git a/docs/interactive-capabilities/README.md b/docs/interactive-capabilities/README.md index 836ac8687c..5bcfc9a2f7 100644 --- a/docs/interactive-capabilities/README.md +++ b/docs/interactive-capabilities/README.md @@ -16,7 +16,6 @@ BitFun Playbook currently contains **22 features**, **16 settings pages**, and * - 生成的产品控制目录:`src/crates/contracts/product-domains/src/generated/product-control-catalog.json` - 生成的交互项逐项审计:`docs/interactive-capabilities/technical/product-control-open-audit.json` - 生成的底层审计表:`docs/interactive-capabilities/technical/tauri-command-map.json` -- 生成的可见交互审计表:`docs/interactive-capabilities/technical/ui-interaction-inventory.json` - Human-authored explanations, keywords, and evidence overlay: `src/shared/interactive-capabilities/catalog.json` - Compiled business Query/Command, schema, risk, and handler owners: `src/crates/contracts/product-domains/src/product_control_owner_registry.rs` @@ -26,10 +25,11 @@ BitFun Playbook currently contains **22 features**, **16 settings pages**, and * - Generated frontend catalog: `src/web-ui/src/app/global-search/generated/interactive-capabilities.json` - Generated runtime catalog: `src/crates/contracts/product-domains/src/generated/product-control-catalog.json` - Generated per-item interaction audit: `docs/interactive-capabilities/technical/product-control-open-audit.json` +- Generated low-level audit map: `docs/interactive-capabilities/technical/tauri-command-map.json` -说明书、网站、搜索和 Agent 只看“功能 + 设置 + 子能力”。每项子能力都必须引用已注册 Tauri Command 或可解析的源码标记;这些证据不会进入公开目录。当前 **653** 个 Tauri 命令,以及 **366** 个产品交互源码文件中的 **4395** 个交互候选,只用于实现覆盖审计。 +说明书、网站、搜索和 Agent 只看“功能 + 设置 + 子能力”。每项子能力都必须引用已注册 Tauri Command 或可解析的源码标记;这些证据不会进入公开目录。当前 **653** 个 Tauri 命令只用于实现覆盖审计。产品 UI 交互源码会在生成和检查时扫描并校验,但不会保存成随普通 UI 改动频繁变化的版本化快照。 -Docs, website, search, and agents see only features, settings, and documented sub-capabilities. Every sub-capability must reference a registered Tauri command or a resolvable source marker; evidence is stripped from public projections. The **653** Tauri commands and **4395** interaction candidates across **366** product UI source files remain implementation-audit evidence only. +Docs, website, search, and agents see only features, settings, and documented sub-capabilities. Every sub-capability must reference a registered Tauri command or a resolvable source marker; evidence is stripped from public projections. The **653** Tauri commands remain implementation-audit evidence only. Product UI interaction sources are scanned and validated during generation and checks, but are not stored as a versioned snapshot that churns with ordinary UI changes. ## 控制边界 / Control boundary @@ -51,7 +51,7 @@ Docs, website, search, and agents see only features, settings, and documented su - 每项子能力必须声明控制类型;所有 operation/option 必须被说明书条目引用,静态值必须符合 schema,任何未绑定 Provider 都会在 Rust 契约测试中失败。 - 每个共享配置 option 必须从默认配置可读、绑定到类型化 GlobalConfig,并能通过真实 ConfigService 写入后回读;Desktop 原生 Provider 也必须逐项绑定,新增但漏接的 handler 会阻断 CI。 - Operation 可声明结构化参数,但必须拒绝未知字段;无参数的 UI 动作若误声明参数,生成会失败。 -- Tauri 命令、设置页、场景、产品动作和交互源码按结构闭包校验;新增事实如果没有业务绑定、说明证据或明确的内部分类会直接失败。 +- Tauri 命令、设置页、场景和产品动作按结构闭包校验;新增事实如果没有业务绑定、说明证据或明确的内部分类会直接失败。UI 交互源码清单在内存中审计,不作为需提交的生成产物。 - 所有投影共享同一个 graph hash;生成文件有差异就失败,不存在可通过抬高计数或更新摘要绕过的基线。 - Every settings page, product action, and scene registration must map to one semantic entry. @@ -60,5 +60,5 @@ Docs, website, search, and agents see only features, settings, and documented su - Every item must declare its control class. Every operation/option must be referenced by a manual item, static values must satisfy their schema, and Rust contract tests reject provider bindings without an implementation. - Every shared config option must be readable from defaults, bind to typed GlobalConfig, and round-trip through the real ConfigService. Desktop native providers are exhaustively bound as well, so a new but unwired handler fails CI. - Operations may declare structured arguments but must reject unknown fields. Argument declarations on parameterless UI actions fail generation. -- Tauri commands, settings pages, scenes, product actions, and interaction sources are checked as structural closure; a new fact without an owner binding, documentation evidence, or explicit internal classification fails. +- Tauri commands, settings pages, scenes, and product actions are checked as structural closure; a new fact without an owner binding, documentation evidence, or explicit internal classification fails. The UI interaction-source inventory is audited in memory instead of becoming a committed generated artifact. - Every projection carries the same graph hash. Generated drift fails directly, with no editable count or digest baseline that can be raised to bypass review. diff --git a/docs/interactive-capabilities/technical/ui-interaction-inventory.json b/docs/interactive-capabilities/technical/ui-interaction-inventory.json deleted file mode 100644 index b6c60988fd..0000000000 --- a/docs/interactive-capabilities/technical/ui-interaction-inventory.json +++ /dev/null @@ -1,1843 +0,0 @@ -{ - "schemaVersion": 1, - "generatedFrom": "src/shared/interactive-capabilities/catalog.json", - "catalogDigest": "b915ffcb329182de3e033d8e48186a1dbd5c683d975484567d9dfe9b9c595c13", - "roots": [ - "src/web-ui/src" - ], - "digest": "97d7b40c2075a564ba77eedb7393f3d8b2663d77f20b0a2719d3ff9eb11310b9", - "fileCount": 366, - "interactionCount": 4395, - "files": [ - { - "sourceFile": "src/web-ui/src/app/components/AboutDialog/AboutDialog.tsx", - "interactionCount": 10, - "digest": "79f520b3799e9b13132c6ca6fcdc7112608c6f370d4c5095c4051ad69aa829ad" - }, - { - "sourceFile": "src/web-ui/src/app/components/AgentCompanionDesktopPet/AgentCompanionDesktopPet.tsx", - "interactionCount": 23, - "digest": "4502d9c0a6f4d40061bc2f15143517a90ae4e6b43d4754d4892ec63847a1b22b" - }, - { - "sourceFile": "src/web-ui/src/app/components/AppErrorBoundary.tsx", - "interactionCount": 2, - "digest": "d29cc161d2106930512948e912acbc0ea825864e11c215f0a829641c77e6d4ae" - }, - { - "sourceFile": "src/web-ui/src/app/components/MCPInteractionDialog/MCPInteractionDialog.tsx", - "interactionCount": 6, - "digest": "09b446f41af395a3da8a6ff4113c546a79f4ddc6868bbb333d590f717f40e1f9" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavBar/NavBar.tsx", - "interactionCount": 15, - "digest": "c2cd6077dc9e25278baaca5e4441c0b374afe0b3342f4f3d76f1991b46e9c8f8" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/MainNav.tsx", - "interactionCount": 48, - "digest": "d2ff4fb20c6a66fe9ccd3846e68fd5ecf813a958b1bc5b189f0446945b65261f" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/components/AssistantSessionCreateMenu.tsx", - "interactionCount": 10, - "digest": "eff139fd7506b1efbc14cdefedf30a73cfdd47f5bb7952d5a9e29ec507042e9f" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/components/BranchQuickSwitch.tsx", - "interactionCount": 4, - "digest": "16c548a61bb3b12c0ae8831a1fc5bac11d0f127aab474f7a012103bbd611fe58" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/components/DeviceStatusControl.tsx", - "interactionCount": 9, - "digest": "b3bc4418f66400c97fa611e08c4e175e9a525b9c1518483cffd22bf344e33966" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/components/GithubStarButton.tsx", - "interactionCount": 3, - "digest": "6bb72922c080b1a032599c08bf37caebdc6c8efc85685db2abc7c9bbd434d1a4" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/components/MiniAppEntry.tsx", - "interactionCount": 6, - "digest": "7f5a6d4e705e3b6b38e1604626e7fb436714f8c819f06e152715e47fb43ec3b0" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/components/NavItem.tsx", - "interactionCount": 9, - "digest": "4aca0cceb147da5fc85b4218e6b89bf0731d06004195791d014b21c50de9b7c9" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/components/PersistentFooterActions.tsx", - "interactionCount": 20, - "digest": "bed067a15547d0fe95e2e5d97d40fd439a10044856ca3e228c2d2d2503eecec3" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/components/SectionHeader.tsx", - "interactionCount": 4, - "digest": "ba92bc3bb063b448e8b2185ef0025ee88d8f569a0673c4251fb416268c954002" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/components/WorkspaceSessionFilterMenu.tsx", - "interactionCount": 22, - "digest": "850490a752c37a17f4ccffb303ead3dba4768180fcb56b0787131ffa0aaf0742" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/components/WorkspaceSessionGroupingToggle.tsx", - "interactionCount": 3, - "digest": "b4e85e98e6afdeca2b29e47b894c18994e147e56ee1249a94c46130db7adb7cc" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/sections/sessions/SessionsSection.tsx", - "interactionCount": 49, - "digest": "517f2224745c6300f11b6bf78a5e1b43080df6d839113e5d305d673e359b67fc" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/sections/workspaces/WorkspaceItem.tsx", - "interactionCount": 97, - "digest": "e4543876666b7171e9da5021e158ea1ba388661a51439af4c6189459f17026d5" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/sections/workspaces/WorkspaceListSection.tsx", - "interactionCount": 2, - "digest": "45d5bea921a5990680ae65972a158fc59630638ddba100a05613b9e2b0f0603a" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/sections/workspaces/WorkspaceProjectPermissionsDialog.tsx", - "interactionCount": 26, - "digest": "4a6ba3b6d65073256a14458bcbc433e27a913f69655cd55e0e5222674a105a6c" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/sections/workspaces/WorkspaceRelatedPathsDialog.tsx", - "interactionCount": 20, - "digest": "36b8676b324d3823aba40c97f9c306fe959cb02aa702ae92a2d736bd12adba62" - }, - { - "sourceFile": "src/web-ui/src/app/components/NavPanel/sections/workspaces/WorkspaceSessionBatchModal.tsx", - "interactionCount": 15, - "digest": "e8b76d7f948dc7a4bc85aa458c0c3b568d1cd98366ee7537d6606c8a7fe91b7c" - }, - { - "sourceFile": "src/web-ui/src/app/components/NewProjectDialog/NewProjectDialog.tsx", - "interactionCount": 12, - "digest": "6323300ed80ab7423e4e17ad7810305dbd6fe0a2d1a4c40e3a7ac55fa3342081" - }, - { - "sourceFile": "src/web-ui/src/app/components/RemoteConnectDialog/AccountPanel.tsx", - "interactionCount": 28, - "digest": "a656559f1bf2833d78eb55d85918ed9d641334618e90835b61a5336bac643910" - }, - { - "sourceFile": "src/web-ui/src/app/components/RemoteConnectDialog/RemoteConnectDialog.tsx", - "interactionCount": 46, - "digest": "8747879670a8d485fd4b31c5772348e4523516fe59d24c40759f9b1de341f6c9" - }, - { - "sourceFile": "src/web-ui/src/app/components/RemoteConnectDialog/RemoteConnectDisclaimer.tsx", - "interactionCount": 4, - "digest": "49a8b038995a97dfe3848068c08d21461004433ba30ef047242c3dc82f9091c6" - }, - { - "sourceFile": "src/web-ui/src/app/components/SceneBar/SceneBar.tsx", - "interactionCount": 10, - "digest": "64e1538aaa632aab087d1409b62b5c946a99dd107ee9031c610db65e2aceadd6" - }, - { - "sourceFile": "src/web-ui/src/app/components/SceneBar/useSceneTabNavigation.ts", - "interactionCount": 1, - "digest": "493da28b1558566c11075d3148cbf0b9f75c2103c7c45d6b65846593246ea7f5" - }, - { - "sourceFile": "src/web-ui/src/app/components/SceneTopBar/SceneChrome.tsx", - "interactionCount": 5, - "digest": "a62f29ca25ddbcefe04fad595f846b481c7a6c6ffebbb813277699fc4d459d67" - }, - { - "sourceFile": "src/web-ui/src/app/components/SceneTopBar/SceneTopBar.tsx", - "interactionCount": 2, - "digest": "ed7201691ffc51cf9c13baa941212e60befd549c24c00a8baebe1697b1839e3e" - }, - { - "sourceFile": "src/web-ui/src/app/components/TitleBar/NotificationButton.tsx", - "interactionCount": 7, - "digest": "800bf7039a8ac6f3bd2570109e2562db41066e9494b0b5bacb834a0c2cef01e2" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/BranchSelectModal.tsx", - "interactionCount": 15, - "digest": "aa52b015092112afe46d0f23cc1f49990cc4ec102665fbe52008a332f79f7081" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/DiffFullscreenViewer.tsx", - "interactionCount": 7, - "digest": "5b1f3b8b7470c9f05a169b530fa4cdb1f504f35711b7451076e5fc8ff4b09d2f" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/FilesPanel.tsx", - "interactionCount": 25, - "digest": "6193af60b85d57266411dc694b6250a446789632901d1109c3c9fc73793638b5" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/TerminalEditModal.tsx", - "interactionCount": 11, - "digest": "222f0396cb5eda15ebbce3c745c150a46b506ef43d290a573c046e69b16be4e7" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/base/FlexiblePanel.tsx", - "interactionCount": 6, - "digest": "c31a0f742347cce42224fb5b532130213d0fb1279f238a49af2536c3ff6d8d1e" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/anchor-zone/AnchorZone.tsx", - "interactionCount": 7, - "digest": "93508e96928a9993e3c5a01ee1f91d0ef43fe209eb407ac690228951da34b6b2" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/editor-area/DropZone.tsx", - "interactionCount": 1, - "digest": "ceaa1bd839d7bd2dab929b0572b789fb4cf2f71bcc0dbd8e0356ffb89f557fb1" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/editor-area/EditorArea.tsx", - "interactionCount": 2, - "digest": "1d0b3d2c64be24fce4f8d564e64289eb77e41de272f449ec7765fc50de94b729" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/editor-area/EditorGroup.tsx", - "interactionCount": 3, - "digest": "bde48fc8a6f4408467e3c7a42871b14329e6c6664448200c3e627eb837653cf0" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/editor-area/SplitHandle.tsx", - "interactionCount": 2, - "digest": "49dc52031c0544284b6859aae310872aa3e6f20f280201cf128f94fbb45742f2" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/empty-state/EmptyState.tsx", - "interactionCount": 2, - "digest": "800c24c7082600bd8240deb5c3579a8211d051f2cdc5c1e731e16a80c80384ff" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/mission-control/MissionControl.tsx", - "interactionCount": 10, - "digest": "9197043860221bf8de75a22abd5df6045940a01571f59972867770b2d11023d7" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/mission-control/SearchFilter.tsx", - "interactionCount": 1, - "digest": "f8ed27d6c0c020bcd8194b28b88a293a205ed9b4cbabd66c8f2fe99d93c0bac4" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/mission-control/ThumbnailCard.tsx", - "interactionCount": 7, - "digest": "075cd17c7cbd174c6c7a6f1d84bc1861640f787f02e4ba3d6d276973603c8aa4" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/quick-look/QuickLook.tsx", - "interactionCount": 5, - "digest": "8ffa60464c82c5c3b1a9d9778db233b4abbc99a2a6f3cd1d34e2f1bba1cc13c3" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/tab-bar/Tab.tsx", - "interactionCount": 6, - "digest": "80f6ac0064563fd5ca1446b0ae521d3f6755598e6c9c23d2469fb4b15faae08b" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/tab-bar/TabBar.tsx", - "interactionCount": 7, - "digest": "f507af744f2f75354f70256cf38e5a5562d6657d1cbe39f16674f13116cfd269" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/content-canvas/tab-bar/TabOverflowMenu.tsx", - "interactionCount": 6, - "digest": "9084a8cfcfa844aa242bfa389071a5791ee21343bf88ef0b64bc7b0440f7b84f" - }, - { - "sourceFile": "src/web-ui/src/app/components/panels/review-platform/ReviewPlatformPanel.tsx", - "interactionCount": 76, - "digest": "ec8d877683ae423f5db3b0349a8c6bea124f913903c4053067146f1162a99ec0" - }, - { - "sourceFile": "src/web-ui/src/app/components/scheduled-jobs/DateTimePickerPopover.tsx", - "interactionCount": 11, - "digest": "3424d411dc67c9d05dcaacd0e8eb70ebeb245f1bb6164747b239f83ddfc713d0" - }, - { - "sourceFile": "src/web-ui/src/app/components/scheduled-jobs/LocalizedDateTimeField.tsx", - "interactionCount": 8, - "digest": "55bcf41107c36e62643ffb43d3c2b915f485ecbd93fb571fae8b1153fe59b9db" - }, - { - "sourceFile": "src/web-ui/src/app/components/scheduled-jobs/ScheduledJobsView.tsx", - "interactionCount": 39, - "digest": "53a3456b5e5fb254fc033f3f95660b295d948962ffe4e8422f2ec872fafd40e1" - }, - { - "sourceFile": "src/web-ui/src/app/global-search/GlobalSearchRoot.tsx", - "interactionCount": 26, - "digest": "5e99cbff91db02f087edc00d046284f538bec8af3ad1d02c9581f00d2de12b80" - }, - { - "sourceFile": "src/web-ui/src/app/global-search/interactiveCapabilityCatalog.ts", - "interactionCount": 3, - "digest": "3a8b0dfbb1b185dd9df915f397163d735e58df0256c637f9c703c50be4edb085" - }, - { - "sourceFile": "src/web-ui/src/app/global-search/productActionActivator.ts", - "interactionCount": 1, - "digest": "b6f62675f12f9b898ddd44dccff53023def7821ba563d7b16e003366603984f1" - }, - { - "sourceFile": "src/web-ui/src/app/global-search/providers/actionSearchProvider.ts", - "interactionCount": 1, - "digest": "5c8a37b7985292a7aced10564a39859683d1c4375c587a256dbd615f79e74b77" - }, - { - "sourceFile": "src/web-ui/src/app/global-search/types.ts", - "interactionCount": 1, - "digest": "99d1095c99b7c119d7e2d5a7a28bb05fb24d98e77cc7c926d975a70c1c64b413" - }, - { - "sourceFile": "src/web-ui/src/app/hooks/useGallerySceneAutoRefresh.ts", - "interactionCount": 1, - "digest": "712656790d2bbcedceb16494b1ccc2d5fde039451c150e5166fdfe772f03413a" - }, - { - "sourceFile": "src/web-ui/src/app/layout/FloatingMiniChat.tsx", - "interactionCount": 6, - "digest": "5059c1180efc08d341b6daaff0843abbcfaeaad07f98b8659de3ffc1567ade4e" - }, - { - "sourceFile": "src/web-ui/src/app/layout/MiniAppBubbleWelcome.tsx", - "interactionCount": 3, - "digest": "a853cbbc90fea7b9b977c8ddf250f0d924583d65af10c68e9189636f27ad532c" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/SceneViewport.tsx", - "interactionCount": 3, - "digest": "ddf8a26b0485f28f1675e445e54e3a4bd946a1fcd9a1f1622ac0d6a23d119770" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/agents/AgentsScene.tsx", - "interactionCount": 36, - "digest": "2079ebbc8433d4c3244d7fe38e571ac5593d465c0f6f0b87380ad5f780a29589" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/agents/components/AgentCard.tsx", - "interactionCount": 3, - "digest": "719cd7ddc210207bdecc923095729e452f783cd337136bd1f19de0cff766a361" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/agents/components/CoreAgentCard.tsx", - "interactionCount": 3, - "digest": "719cd7ddc210207bdecc923095729e452f783cd337136bd1f19de0cff766a361" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/agents/components/CreateAgentPage.tsx", - "interactionCount": 41, - "digest": "32229544a9e399fceb0ee99f9a206dfccc4eb149154dc459882f035f799ebe7c" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/agents/components/SkillGroupPicker.tsx", - "interactionCount": 29, - "digest": "19c35bba0efcaaf275eec23c861c48cb1bb0906d0e311dfe1faa1dfb1d79f5bb" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/agents/components/ToolGroupPicker.tsx", - "interactionCount": 29, - "digest": "5d65f4a54c68e3c84c09bab5e899b897658d9da9297a339daff82164b50c3b24" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/browser/BrowserPanel.tsx", - "interactionCount": 17, - "digest": "438445a73e738ad7ede86dc54427b0c65581287ebed56e5e95465a7d60166a8c" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/browser/BrowserScene.tsx", - "interactionCount": 12, - "digest": "b26b5a550dcf630b2b424ab6076dd667a240ad4d07387be4ea860a9dd49157b3" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/ecosystem-compatibility/EcosystemCompatibilityScene.tsx", - "interactionCount": 27, - "digest": "3d6026e026246723e23ebfdfaf5296d07b07f979f43bd4dcbcf612adfc6de2ad" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/file-viewer/FileViewerNav.tsx", - "interactionCount": 8, - "digest": "d964511fea7dc39a6b6541c39ffdf805ff974464290eab084624eca078ca7b19" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/git/GitNav.tsx", - "interactionCount": 5, - "digest": "d05d081666dcd40e6555b661da66198bf6f633a78b83133167a367e3da86319b" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/git/GitScene.tsx", - "interactionCount": 6, - "digest": "1fdc2936fa3c85f1e3f0a82c729bc150ecb1d8aa23d029569f9aff7bdae27a39" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/git/views/BranchesView.tsx", - "interactionCount": 19, - "digest": "32edf62991a83eefda6892aa85cfbe6f8718c6e58d830cccc66939bb16533c57" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/git/views/WorkingCopyView.tsx", - "interactionCount": 36, - "digest": "f4c7702241c517b8a0aea470e0e3052774b24fc57001bcfad605800fa0746fee" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/miniapps/MiniAppGalleryScene.tsx", - "interactionCount": 2, - "digest": "581e87fefd80f06c835a2d939a980b9379a563434c07ced3ca43e1bcc3ac90af" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/miniapps/MiniAppScene.tsx", - "interactionCount": 5, - "digest": "37be68d62cbca73b88205b412edffdf3ce677791ce07938ca8759a3a7017544b" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/miniapps/components/MiniAppCard.tsx", - "interactionCount": 10, - "digest": "0f823bf1dc1ea58b8a23ed2d191c69803fab55b93db7d3ef5a0fa0a7c34a55f9" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/miniapps/components/MiniAppDetailModal.tsx", - "interactionCount": 6, - "digest": "d05c249013a70050a77a89986a5f7286ac56b7635ab7f2d23607b765271d9273" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/miniapps/customization/MiniAppCustomizeEntry.tsx", - "interactionCount": 2, - "digest": "fd6ddfc32f6dcace1a847606a2f8901367e0a02ae42b1e834e98582d61774dcc" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/miniapps/customization/MiniAppCustomizePanel.tsx", - "interactionCount": 17, - "digest": "786e87aa14be39785b525f9f09daaec1b9668eb22287ea9be4200ce9fa04dfcb" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/miniapps/customization/MiniAppPermissionDiffDialog.tsx", - "interactionCount": 2, - "digest": "cacc0bdabe3d309ab061d0167afbede33c79965d72621f277b62f125b9c4e4e2" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/miniapps/miniAppActivity.ts", - "interactionCount": 2, - "digest": "e0bb67f750366f712621113e5620313556ee64d827e77de3b4e9d59bb17a3eca" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/miniapps/views/MiniAppGalleryView.tsx", - "interactionCount": 16, - "digest": "efcfbd180088f3dbf8d16878bafa313ce204b971564867cec76fc419505c6c37" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/miniapps/views/MiniAppMarketView.tsx", - "interactionCount": 22, - "digest": "77750b38e98968bff245b4dc085be6266a1888be513c639610dfb7e036b67c23" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/miniapps/views/MiniAppSubmissionsView.tsx", - "interactionCount": 41, - "digest": "d95ba806a11794c84775ff914e5674d30ec3afd0db886603425edaaf8d9506f9" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/my-agent/InsightsScene.tsx", - "interactionCount": 20, - "digest": "ad7e4de0b06cae0bb1bd436700344b912b1d95ce94d6ea8e897ba97187a14f66" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/nav-registry.ts", - "interactionCount": 2, - "digest": "7dcb6ce4e62577083e6a9abe45b23839fb8d82c1148466c72d48129b53060672" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/pages/PagesScene.tsx", - "interactionCount": 34, - "digest": "62889b3579c6039093aa7d1fc7e9c3acf913db00e8aac2fb6597836e97741bf6" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/profile/views/AssistantAvatarPicker.tsx", - "interactionCount": 16, - "digest": "d06077a41aec2eb7ee782a191fe5e2f879091c23f09737dfb06707c0b8b9ddf6" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/profile/views/AssistantCard.tsx", - "interactionCount": 11, - "digest": "00555f8e82be88ba92b2afde21b02f6bd729934c500400ac8d0c52a01be5d5c4" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/profile/views/AssistantConfigPage.tsx", - "interactionCount": 41, - "digest": "25d1b92e9fd280eb09a4e5ea65c425f1f9e23fa7de0446cad5174ba8c8ce87fb" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/profile/views/AssistantDefaultsPage.tsx", - "interactionCount": 41, - "digest": "a493d6668cd3184410f0dac98a846d438e8421267f2e96f8b343ec7389f90962" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/profile/views/AssistantQuickInput.tsx", - "interactionCount": 6, - "digest": "5e8f1b2e43224dfda11f01874fae6fde28c2c43f03498b42a854416f2aa2c7e5" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/profile/views/NurseryGallery.tsx", - "interactionCount": 10, - "digest": "a5b19980672c5dc0561d8f3ce3ac046ae2d539cdfdaeb7f83a82f46d3dc9dada" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/profile/views/PersonaRadar.tsx", - "interactionCount": 3, - "digest": "e81bb5c0479a90450e41dd3325b97ac293be653ca9b8e58699b28f65dfd61441" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/session/SessionScene.tsx", - "interactionCount": 2, - "digest": "acfb49d3d22bf5690accee5fa1bb0b1d9d7b5798bf6575354e79f832dd14463c" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/settings/SettingsNav.tsx", - "interactionCount": 10, - "digest": "cdb14a2e4c64e66daa0077086f5a9af1a65e804c37ad9f622c58204ee71abfcd" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/settings/components/ArchivedSessionsConfig.tsx", - "interactionCount": 12, - "digest": "ba6285a47f548ec202c6424163f8a4690fa18f1ddab9708609c8ecefb02c0dcd" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/settings/components/KeyboardShortcutsTab.tsx", - "interactionCount": 23, - "digest": "1be232ca02b417e007e83b1a1193ed209ed4391164cf94632cfe00b09bb91195" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/settings/settingsRegistry.ts", - "interactionCount": 17, - "digest": "3bd894e5312019468f8a94e489334cbb1d60784d2a90f7d31632a6a648b20be0" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/shell/ShellNav.tsx", - "interactionCount": 14, - "digest": "feda8254c4e00152c105f9ec34f7336c9657bc3894068cb88a9409883f0c49cc" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/shell/components/ShellNavEntryItem.tsx", - "interactionCount": 7, - "digest": "ba38ae79f585609b3f2b91147a9f2fad5747899dbbf6f350eb9e485b38eca181" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/shell/components/ShellNavWorkspaceSwitcher.tsx", - "interactionCount": 6, - "digest": "98fe03224eb823b520c453bb5d2105529d4c441fe7364a7a4874d330c4d5af54" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/skills/SkillsScene.tsx", - "interactionCount": 58, - "digest": "8985540d8cb1b6275ca639bd11f5654a34332a862801039df52df7c451e3cc0a" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/skills/components/SkillCard.tsx", - "interactionCount": 8, - "digest": "2ba5365bad213027bd4704c5dc213cb9722e5892e6dee69800a83cd270ba5bdf" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/skills/components/SkillsSuiteView.tsx", - "interactionCount": 18, - "digest": "d69d28326e5e34f736d0b5d77259e6a7a3f5b6fe289fad90222c315ca2625e1d" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/todos/TodosScene.tsx", - "interactionCount": 12, - "digest": "471bf0d6ce8569f4b1de9cf8e9809b1bef0fecfbfc2e05ee11aba12a1b353b7e" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/todos/components/TodoCalendar.tsx", - "interactionCount": 3, - "digest": "6937633b8dd02dd9065a58f05e7bd2b4f2f59554db7ec1c5d74881890364b0fe" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/todos/components/TodoEditor.tsx", - "interactionCount": 30, - "digest": "98507ad206a4e67bb973c3e2f2bc832349691c5c8d309892b315a6369f408fc9" - }, - { - "sourceFile": "src/web-ui/src/app/scenes/todos/components/TodoItemRow.tsx", - "interactionCount": 11, - "digest": "f8edb85ff21e005753441a11b1b24932eccd4523ddf3b9cb488c7dd37a4ed94d" - }, - { - "sourceFile": "src/web-ui/src/app/stores/sceneStore.ts", - "interactionCount": 3, - "digest": "58298bea669690eb5524f43038cacc0c08ae621bcf9fb97df8392539f2f4d530" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/Alert/Alert.tsx", - "interactionCount": 2, - "digest": "800c24c7082600bd8240deb5c3579a8211d051f2cdc5c1e731e16a80c80384ff" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/Checkbox/Checkbox.tsx", - "interactionCount": 2, - "digest": "dcce382aa2d381ebe9b6e66f08d1282649b8e023bc93f32e541513c650ae4adb" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/CodeEditor/CodeEditor.tsx", - "interactionCount": 2, - "digest": "0819b25af57a97c0ca230c96e29e4e974f7a0d99a15c58b8c1317484bcaa23fb" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/ConfigPage/ConfigPageRefreshButton.tsx", - "interactionCount": 2, - "digest": "6799cf30edc8746a5a315525533e14b3c72ffda5c476987659d5c38f7050973e" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/ConfirmDialog/ConfirmDialog.tsx", - "interactionCount": 6, - "digest": "69b63bb8c7b2d92db44843e1aadf1c2ff1f2f128d0eecf78f31bf10928feca38" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/FilterPill/FilterPill.tsx", - "interactionCount": 3, - "digest": "2ee8b0c8a4304a06842c8bfb846c977a9faedf49f2bd4f13df92b6a59b4811ee" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/FlowChatCards/BaseToolCard/BaseToolCard.tsx", - "interactionCount": 6, - "digest": "4e19d771055dc905b5319a1d8700a2da45c73fe0b271527260c7a4cd12a0d474" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/FlowChatCards/SearchCard/SearchCard.tsx", - "interactionCount": 2, - "digest": "a1cf84b1285db4c6c65d2bdc8a3d065e12b78bddc9d32e1ad595248a6a9d6862" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/FlowChatCards/SnapshotCard/SnapshotCard.tsx", - "interactionCount": 17, - "digest": "e5d703f3ef2ee247bca94c34b042f9452078fa6414ecd3270fb861f1a7d3fbe4" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/FlowChatCards/TaskCard/TaskCard.tsx", - "interactionCount": 2, - "digest": "a1cf84b1285db4c6c65d2bdc8a3d065e12b78bddc9d32e1ad595248a6a9d6862" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/FlowChatCards/WebSearchCard/WebSearchCard.tsx", - "interactionCount": 3, - "digest": "f74c002789c2c805fdacbdc2b81a6cf51678e8da0dd7ea1244f8ab391d68d25c" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/IconButton/IconButton.tsx", - "interactionCount": 1, - "digest": "596a703135d03aefdc877c8db21f35e8f46d043d078e73e45df3e65b7bffd8f0" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/Input/Input.tsx", - "interactionCount": 2, - "digest": "2e5b03618ea9b9e61264f32fd6d1d3359714c63d687aa900467275d0ad9b5dd9" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/InputDialog/InputDialog.tsx", - "interactionCount": 7, - "digest": "bb81143bae203a2bd6d517c9ecacf1a8ed631ba2a1a71ac80d4c18c19da0d183" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/Markdown/Markdown.tsx", - "interactionCount": 15, - "digest": "d3d81ec92c282151b74e21b5e206496c84646666285d4f4c80ba522c2104decc" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/Markdown/MermaidBlock.tsx", - "interactionCount": 6, - "digest": "ea060e14ea967a8f3d7614d37a30e40745f47f2def1318e842dd858ae653e0be" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/NumberInput/NumberInput.tsx", - "interactionCount": 16, - "digest": "ecf0961cd95d9b89f6764fb44bd1e40b4742b71183ae6454fd4baf7f30b2b623" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/PopupCloseButton/PopupCloseButton.tsx", - "interactionCount": 2, - "digest": "721537e698f0017dd22367f7fc6b4fb3e3e2584e373105f854d31d3c5b103fa4" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/Search/Search.tsx", - "interactionCount": 10, - "digest": "74546f8760083a67b57e03a86c8e4e39f24ac4677d387bb376831ed5cdfb2c72" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/Select/Select.tsx", - "interactionCount": 19, - "digest": "59929103e1e8ee3f9db42c06250e695d37e1ea29d2e86b0532bf41aa1e6878f7" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/Tabs/Tabs.tsx", - "interactionCount": 8, - "digest": "1c200ebcd62529c34392698c288320de0a8efda8e91ef90759c9f9e821d0d66d" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/Tag/Tag.tsx", - "interactionCount": 3, - "digest": "24eb873ecd3ee7efa78c3ea38dd8620ce794fc478705ae294c0a87e9bba3b717" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/Textarea/Textarea.tsx", - "interactionCount": 3, - "digest": "2616e59f775203d7f1c7ee62d150ab122b1e4c413d6880539fad8eb228d4c4b6" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/WindowControls/WindowControls.tsx", - "interactionCount": 9, - "digest": "42cc6e8308233191f2be58b9830d6c798a6f43bc6d58ff72b58d52e389703fb6" - }, - { - "sourceFile": "src/web-ui/src/component-library/components/registry.tsx", - "interactionCount": 66, - "digest": "82f8a85b6e40ee054b07d430f158d3f1ded1b770d07f188ce5e9caa1931c4ff5" - }, - { - "sourceFile": "src/web-ui/src/component-library/preview/MarkdownPreview.tsx", - "interactionCount": 16, - "digest": "779e26b3f1785f51933fd7def6b300df8e0e4c42e33cf2e9be5096560f9cb213" - }, - { - "sourceFile": "src/web-ui/src/component-library/preview/PreviewApp.tsx", - "interactionCount": 7, - "digest": "c57f4e01c7fce20b7e4315c32d8e2a8975edfdc33d8986273064c28bf82b86c3" - }, - { - "sourceFile": "src/web-ui/src/component-library/preview/layouts/ColumnLayout.tsx", - "interactionCount": 2, - "digest": "11443e85c1eec613496667ab8370ddd507852ccedfa1cc7c180f12d89afd06a5" - }, - { - "sourceFile": "src/web-ui/src/component-library/preview/layouts/FullPageLayout.tsx", - "interactionCount": 2, - "digest": "62f592fdbe80e9e753762e8b300f0d640d85c11ab7e44667e4e92ecd83061531" - }, - { - "sourceFile": "src/web-ui/src/component-library/preview/layouts/LargeCardLayout.tsx", - "interactionCount": 2, - "digest": "b331468136e2a16473642002a365e790452eafb167373979e5498c01df70054e" - }, - { - "sourceFile": "src/web-ui/src/features/dispatch/DispatchInstallDialog.tsx", - "interactionCount": 17, - "digest": "328bd653959a664b2d1b0276c354cc504d1f77c5c17e0c0667b9ad6b0932b1ce" - }, - { - "sourceFile": "src/web-ui/src/features/dispatch/DispatchJobObserver.ts", - "interactionCount": 2, - "digest": "90d3ae5aaeb99bd543e07983e7d5d357f58ccae8a88ae275e5bd0fcdfeae78f3" - }, - { - "sourceFile": "src/web-ui/src/features/dispatch/DispatchResultDialog.tsx", - "interactionCount": 3, - "digest": "33896289e2c661eeed96859ed858c6326eec7b51de4a0fe4dfbce44d48519d89" - }, - { - "sourceFile": "src/web-ui/src/features/dispatch/DispatchTargetPicker.tsx", - "interactionCount": 24, - "digest": "cd452d25efced5cff703b2796e7a2df566e5391582422cabd6653777b1d3b440" - }, - { - "sourceFile": "src/web-ui/src/features/market-account/MarketAccountControls.tsx", - "interactionCount": 12, - "digest": "da75ee5291309c838f18920b28937b0bd8dcb6a031132180ca1b7eb20fe4546e" - }, - { - "sourceFile": "src/web-ui/src/features/relay-deploy/RelayDeployWizard.tsx", - "interactionCount": 62, - "digest": "cea148085f784d1519f56ee79baad908dc0a24d67450c3d5461da9c974384709" - }, - { - "sourceFile": "src/web-ui/src/features/ssh-remote/ConfirmDialog.tsx", - "interactionCount": 3, - "digest": "eaaf7860c6f9795696011e8c44cded9c7ac5abfb69f7fc320c5dca8ca5689e64" - }, - { - "sourceFile": "src/web-ui/src/features/ssh-remote/PortForwardDialog.tsx", - "interactionCount": 28, - "digest": "7bec680f2f5cf637517d807a00fa950daca33ccf3c535213eb6fb200879275c0" - }, - { - "sourceFile": "src/web-ui/src/features/ssh-remote/RemoteFileBrowser.tsx", - "interactionCount": 43, - "digest": "b002ce773766f680a68b532d91710a4a1361241d03f13085bc86be3a6caa3da7" - }, - { - "sourceFile": "src/web-ui/src/features/ssh-remote/SSHAuthPromptDialog.tsx", - "interactionCount": 26, - "digest": "517f36003eb59f313d7bb2ec26b955d6286b2fbc44a89f2decebfc3ad2a99402" - }, - { - "sourceFile": "src/web-ui/src/features/ssh-remote/SSHConnectionDialog.tsx", - "interactionCount": 88, - "digest": "16a5c9205b2799ec0dd229cd48d2955c3d946b4626bfb6c27607983c655e5c79" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/AcpModeSelector.tsx", - "interactionCount": 8, - "digest": "4fb25e7b3a84e494b0508cbefd3014aeac3d165e061d13548543094720a00563" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/ChatInput.tsx", - "interactionCount": 63, - "digest": "8899ee85648843c3003c6e56129a5e74e7a2f3c1b375396d2c4d2bc308abcee1" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/ChatInputApprovalBand.tsx", - "interactionCount": 16, - "digest": "46e07a82ebde8defdf8b13582a633b868cdd13d27de3198c2ed95836576714a0" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/ChatInputWorkspaceStrip.tsx", - "interactionCount": 37, - "digest": "143f49a23623cfc9203a0aa86ef3a002f8df05f45dbe7081b5d56ab7642f6c50" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/CodePreview.tsx", - "interactionCount": 1, - "digest": "3f30a635ba469e752dab3152c95dbd9672021a6fa0fb631e8b186880d8360d4c" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/CopyOutputButton.tsx", - "interactionCount": 6, - "digest": "66ad766d2cd08e0cb2e8fcfa29d22d475ca246124550c42f4480865796b46c2d" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/CopyableTextPreview.tsx", - "interactionCount": 2, - "digest": "3365bf0837a71832cdb189d033e1db265b4c1c1b7df44dbd92f70219863e63de" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/CoworkExampleCards.tsx", - "interactionCount": 9, - "digest": "0b33e2f6bfab61f0b1535b7bef152beae635202c6716d799d4a6183c02edee2a" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/CurrentSessionTitle.tsx", - "interactionCount": 2, - "digest": "7be80ca3d88067fd7b14b160f723a79c15020d48a347d4193b1aa84d6d561322" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/DeepReviewConsentDialog.tsx", - "interactionCount": 5, - "digest": "42b9845b7b6713f08eaaef0eee7f17734cd099fc4ed16e6729b4c35c021606d7" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/FileMentionPicker.tsx", - "interactionCount": 3, - "digest": "a9678c221f5f91f150d7f32b28234ce3a4828b340b799b9506429893af649c54" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/FlowToolCardErrorBoundary.tsx", - "interactionCount": 3, - "digest": "fd6f96f2bc837d307a58a5f8ee10caf041bcbd0326603d0038c7ccd01a59d569" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/HarnessProfileSelector.tsx", - "interactionCount": 21, - "digest": "02e327e71efacffd9bc329df134b9de2e46d601752ad09e3b28901ed7ad1e2c0" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/ImageAnalysisCard.tsx", - "interactionCount": 3, - "digest": "5345787d614eb309a5e019a789666814d6dea19e8b18a791a0325680ccf89f08" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/InlineDiffPreview.tsx", - "interactionCount": 1, - "digest": "62b4e22a320c57cafc40cd098d6acc2dbff485acafc7b44632967eaec31fa5ed" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/ModelSelector.tsx", - "interactionCount": 49, - "digest": "b1b2ef2ebd07ae3dbbe8425b42c51ac35871064675b2c00b3bb1cc3e65461b09" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/PendingQueuePanel.tsx", - "interactionCount": 17, - "digest": "1c6a9eb29ec14fd58be0a3c7c8249ea5f17ca8160ed2549ff12361e6aade61eb" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/ReasoningPresetSelector.tsx", - "interactionCount": 11, - "digest": "feb9a2225f6112a8bc853cafee27967b44384291dcf09991ef93e165bdf402e8" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/RichTextInput.tsx", - "interactionCount": 2, - "digest": "f24910b9e8354d3c394fdc5035bb66e6e64d018918b90db7efa9629785e91114" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/ScrollToBottomButton.tsx", - "interactionCount": 2, - "digest": "826f89cbe7e1b6478a33fb7134b4bf910064df64da42d3c690a0efedb509c2f4" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/ScrollToLatestBar.tsx", - "interactionCount": 4, - "digest": "63d0507b079412f4fda2f44bf23cd90e95d69476c429e00ba98a077d291f7a8b" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/ScrollToTurnHeaderButton.tsx", - "interactionCount": 2, - "digest": "b641196d646a0bd1a5f5abf77ee3d3fd5859f4b12d1a0473c5f15cec1c7c3ee0" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/TaskDetailPanel/TaskDetailPanel.tsx", - "interactionCount": 2, - "digest": "01dfa8acbf611baaeed5fce484d1569aca6f1386dde2759c92a1baa39e9e22f2" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/WelcomePanel.tsx", - "interactionCount": 18, - "digest": "7707f5defa1a80b93cff01b9fee3287c62bcfdba5c45fd5ead522f9878edfe80" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/background-command/BackgroundCommandInputDialog.tsx", - "interactionCount": 11, - "digest": "740905c53bc4f8ded4f43597129c72cc142061bf2dde0a7f2d74e18969f5bb21" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/background-command/BackgroundCommandOutputPanel.tsx", - "interactionCount": 19, - "digest": "8a026d1e6306329d098fe8b825f35583bee48dd62408d357b3e9dc83b02f8b74" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/btw/BtwSessionPanel.tsx", - "interactionCount": 10, - "digest": "779422c35fe594adc6f55b40d5439e1e63c1c39afee7f8ee459e0bb9ccbe07e7" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/ExploreGroupRenderer.tsx", - "interactionCount": 1, - "digest": "46424042c7dd88a7e38ce26a4a5bef28861de9b841553fba674ea10ee415db47" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/ExportImageButton.tsx", - "interactionCount": 5, - "digest": "5e859ef0ce860d25cf281eeee04733663932fbdee89a8ad856a5249b4fea8f62" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/FlowChatHeader.tsx", - "interactionCount": 46, - "digest": "66c15f43f218808294928f84b519406e7098a07f679af433e12f6698ff877fd6" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/FlowChatTurnRail.tsx", - "interactionCount": 4, - "digest": "5fb3b45bcac51fa05bf76334599f8a760c7d8b203c1c79e6b6ac9bc138ea945d" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/ForkSessionButton.tsx", - "interactionCount": 2, - "digest": "bb83c3a72352b6f210ab81246c79e4ea34b8584229cf148c9fea1e296269467f" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/HistorySessionPlaceholder.tsx", - "interactionCount": 2, - "digest": "538e4c41c81f02b55d19d67dead94d5a8b942902ccac27a7605ba686d29cec49" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/ModelRoundItem.tsx", - "interactionCount": 25, - "digest": "d866878512276fe5dd60e2565f1a313ad44000e4a20a287ac75b3cb31a8ada35" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/SessionFileModificationsBar.tsx", - "interactionCount": 3, - "digest": "c855039aafcb5243552367fef76f9e89210c08b88564a4a9b21a77a39a9fae42" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/SessionFilesBadge.tsx", - "interactionCount": 16, - "digest": "3aaef095190aaa169159c74205e9365b44799a9e1dee7e152c8e8b467a98b430" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/SessionTreePopover.tsx", - "interactionCount": 16, - "digest": "b8adeee39b3a2c08d6802e8757b0e9e8379c39e2bb840ba5a8937ae102bb2a58" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/TurnFailureNoticeItem.tsx", - "interactionCount": 6, - "digest": "53aaa0bd4fcaa5dfed0ad893b32446c4420738b851172aa3ca59a64609b9cb94" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/UserMessageEditComposer.tsx", - "interactionCount": 20, - "digest": "549b6219395d1db73da5d4ce36161b2c8d398627546e42c8f7087780cc118721" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/UserMessageItem.tsx", - "interactionCount": 17, - "digest": "cfc8d1aa30ab67d7a166bbad1a205792cd909e5f2cf356310ec3ce7ef8ddd483" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/modern/VirtualMessageList.tsx", - "interactionCount": 2, - "digest": "5c9b6c5f733b4228591a24937166d511089960e281ac71826daaa8fe047c12d4" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/session-menu/SessionMenu.tsx", - "interactionCount": 8, - "digest": "c1e7a5399f931af0f03c95c56bb482c37361a59f35dfb090f025ee11b625ac52" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/smart-recommendations/SmartRecommendations.tsx", - "interactionCount": 4, - "digest": "eda375550c789f1433d3c68d75c2cc73f39df50141f2a96a452c7f26b3eb6970" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/subagent/SubagentProjectionView.tsx", - "interactionCount": 3, - "digest": "4184416d1deca2e9ad24f98a6b530c9b177fd3750bcecbc2ea62f6085d45e393" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/thread-goal/ThreadGoalDialogs.tsx", - "interactionCount": 18, - "digest": "4a4db254b77c6112c02b2a621fca01c571696eda49501056d8c23b1fa2b4f3f8" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/toolbar-mode/ToolbarMode.tsx", - "interactionCount": 21, - "digest": "80e4cb2cd0d095173df1b2850cd34ddac4370fd894c4a09a9ca122eec03066f8" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/usage/SessionRuntimeStatusEntry.tsx", - "interactionCount": 3, - "digest": "f1b220a6d690806dcbf34c367ccbac59cc61b5624b861031cbd185cea84cdb91" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/usage/SessionUsagePanel.tsx", - "interactionCount": 29, - "digest": "69a6a7f0616cf4b9094664301b27234cd28600239ab7ce69c74d44158d335b34" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/usage/SessionUsageReportCard.tsx", - "interactionCount": 21, - "digest": "1a3e66a4c5ee7604f6912d67ccc6d012617ec76272897b3bc1786d95f10a0dcf" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/components/voice/ComposerVoiceInputButton.tsx", - "interactionCount": 12, - "digest": "912f007cb9fac9c349176ebb6360f18fb7e81de17340a5f300484dfc1fc7bf92" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/deep-review/action-bar/CapacityQueueNotice.tsx", - "interactionCount": 10, - "digest": "def22706a88bc8f6c14d6e694f1821e15c4bb26a23f2d44ca999d5304351929a" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/deep-review/action-bar/DecisionExecutionGate.tsx", - "interactionCount": 9, - "digest": "779e06ab0d4cc00305257163603004ac192cd95b3ef5328a2484ec9244f44cca" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/deep-review/action-bar/DeepReviewActionBar.tsx", - "interactionCount": 8, - "digest": "fe39ec4f8e9303e69c811dd71a7b6d2231dbf7b77fbe9b50bf2073599f8de30a" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/deep-review/action-bar/PartialResultsPanel.tsx", - "interactionCount": 3, - "digest": "4b107fe62097b73f0e0d027eef01130ad2dc7ce1b5ca7f9f79b44eba1ae1a102" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/deep-review/action-bar/RemediationSelectionPanel.tsx", - "interactionCount": 16, - "digest": "d84d2e44562993eb396b21ef35536050873dba59960d72097d50cb215031167f" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/deep-review/action-bar/ReviewActionControls.tsx", - "interactionCount": 24, - "digest": "310f78972e8461acc45db4af9b2e7bbda4ab100dcc2d14992970ae667ba9ac5d" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/deep-review/action-bar/ReviewActionHeader.tsx", - "interactionCount": 3, - "digest": "44984b125c1c24f3b7770077ee150633930a50e7687ba55894ad48c13313aeae" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/services/AgenticEventListener.ts", - "interactionCount": 1, - "digest": "7f8e6aeea2c70ee8c127464d6670b432cd88d2e21db9b00ac6a9ba2155a62ffe" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/services/flow-chat-manager/EventHandlerModule.ts", - "interactionCount": 2, - "digest": "5f7bc8e43b6cd842a9cac3617e2f6391d321f5540dfaf61d055de1c0d5c07a98" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/session-stream/SessionStream.ts", - "interactionCount": 3, - "digest": "7ad83a19901b2cb043e00d7d392173f231ba326a6a59db204c6631972d312ff6" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/session-stream/turnOwnership.ts", - "interactionCount": 3, - "digest": "82af9709dc32ecf55c105e748a21efdb93be6114efeb695aac6975bc0d5c0df3" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/AcpPermissionActions.tsx", - "interactionCount": 5, - "digest": "7d26363dba5c7fedae5d477fefca660b93711f1d90e385753d7863e3f56d75d4" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/AgentControlToolCard.tsx", - "interactionCount": 4, - "digest": "0bfe02356ccc8a7ebbcf4ee243859b40e7d6e9d986e405841ba87d4c61319245" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/AskUserQuestionCard.tsx", - "interactionCount": 23, - "digest": "6a66aac2f6d2f544f1ac30b49daf8eac1112c4dadf1f1110307091f6d8e51389" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/BaseToolCard.tsx", - "interactionCount": 1, - "digest": "80de0b878be5b0025e41687ad72c26cca20d2b90db996fb23b1cc9452e07b2c0" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/CanvasToolCard.tsx", - "interactionCount": 1, - "digest": "e90fc0f453b1983f6b7436caa506b4115019979c7b4dfcf5f2a89cb6532c4348" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/CodeReviewReportExportActions.tsx", - "interactionCount": 14, - "digest": "a92fe110f3e7a04f7e652f5b7d0721e6acf7e1983fc5768801158f274b0ee064" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/CodeReviewToolCard.tsx", - "interactionCount": 9, - "digest": "bdb74b0158ad1de6a0c2f79419165ab8bfacb5a060dad95118b9f91d7bbef8c8" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/CompactToolCard.tsx", - "interactionCount": 2, - "digest": "3339877a57ed4bd416aee74cf7a69e6b7248332c3539513d390274f3575aff3a" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/ComputerUseToolCard.tsx", - "interactionCount": 4, - "digest": "ca383a7b210bfb27680edb4a5eb66c2ee14ac6a8dba6176198d7d5efae00d253" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/CreatePlanDisplay.tsx", - "interactionCount": 16, - "digest": "d52084dfca5373c4e17b9a4dd5e107d43a9c5f6d9c86dd993af108f651623159" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/DefaultToolCard.tsx", - "interactionCount": 1, - "digest": "a9dfb311157a83d145d67325ca94bdeb6184cfac1f2483a357979538dd593423" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/ExecProcessToolCardView.tsx", - "interactionCount": 1, - "digest": "80de0b878be5b0025e41687ad72c26cca20d2b90db996fb23b1cc9452e07b2c0" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/FileOperationToolCard.tsx", - "interactionCount": 7, - "digest": "bf50630ac42b691eb646cfaff9732c55a063a2627955c8d25cf2c135d326f4c6" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/GenerativeWidgetToolCard.tsx", - "interactionCount": 4, - "digest": "d52f97df234cb09ef79c566d4e2bba6a6799096d575b2bf85df53ae44f9bccb0" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/GetFileDiffDisplay.tsx", - "interactionCount": 1, - "digest": "80de0b878be5b0025e41687ad72c26cca20d2b90db996fb23b1cc9452e07b2c0" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/GitToolDisplay.tsx", - "interactionCount": 1, - "digest": "80de0b878be5b0025e41687ad72c26cca20d2b90db996fb23b1cc9452e07b2c0" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/GlobSearchDisplay.tsx", - "interactionCount": 1, - "digest": "26187ac580124d6512ada8e352984e5a71fd5f0d8cd06f8e3524bcb0f6ec410b" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/GrepSearchDisplay.tsx", - "interactionCount": 1, - "digest": "26187ac580124d6512ada8e352984e5a71fd5f0d8cd06f8e3524bcb0f6ec410b" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/LSDisplay.tsx", - "interactionCount": 1, - "digest": "26187ac580124d6512ada8e352984e5a71fd5f0d8cd06f8e3524bcb0f6ec410b" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/MCPToolDisplay.tsx", - "interactionCount": 3, - "digest": "e4f2b1310972a9daa5f529012f37e282a635e7aa1f60bad94fba46a9ba13207e" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/MiniAppToolDisplay.tsx", - "interactionCount": 4, - "digest": "ac02c8d28b1aa0933bfce6a83d2c2a8c09afb639c79555232e2b3313fd6b3bc5" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/ModelThinkingDisplay.tsx", - "interactionCount": 2, - "digest": "5c6dc46d0d1933de857f3c966368b1369b21010aa7fb66d7aad5add841bcef93" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/PageDeployToolDisplay.tsx", - "interactionCount": 4, - "digest": "9ec31fed3ed8fa0c5c4e6dc7bcd919700d1418a63e96a25df58082c2b58fcf47" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/PagePublishToolDisplay.tsx", - "interactionCount": 7, - "digest": "268813adfcca088c1f99c7f5d9df3cec62dafac46b2ffceef1c8a451f607aa2d" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/ReadFileDisplay.tsx", - "interactionCount": 1, - "digest": "d1b438960d0d9809abdf035e070581273810871bc637f6f29b0020d4471a5201" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/ReviewSessionSummaryCard.tsx", - "interactionCount": 5, - "digest": "00a976cff4e9a22ddabd18ebac5cf9c0e9e0d232c214b5336bbbf42669bf0b42" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/RunCodeToolCard.tsx", - "interactionCount": 1, - "digest": "a9dfb311157a83d145d67325ca94bdeb6184cfac1f2483a357979538dd593423" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/SessionControlToolCard.tsx", - "interactionCount": 1, - "digest": "56e4d6577600cdcf762fe725cdd628ec0073e7952ae62247d547a0800c368e9c" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/SessionMessageToolCard.tsx", - "interactionCount": 1, - "digest": "56e4d6577600cdcf762fe725cdd628ec0073e7952ae62247d547a0800c368e9c" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/SnapshotFullscreenDiffViewer.tsx", - "interactionCount": 24, - "digest": "2bc087a39980bb4fe57dd688603265f62b9b2e073e0d10fa68c83c5a65959d68" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/TaskToolDisplay.tsx", - "interactionCount": 7, - "digest": "22e4abf3ce92bdf4bc06bb5c96f89667387ceb48bf2a6524019b1db5054c975e" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/TerminalToolCard.tsx", - "interactionCount": 5, - "digest": "2554256c2909aceb8a3f45dab8e245ff1d89e7c9bf8b7bbbf5de279feec2d001" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/TodoWriteDisplay.tsx", - "interactionCount": 1, - "digest": "a0373f791fe21572e6bfeb652a02dd432574ed16e350476ee23d62534a3a11a4" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/ToolCardHeaderActions.tsx", - "interactionCount": 3, - "digest": "967db492728fe80c3773e0d12c4c45282eea13edd771b1469d66f23da1b0762d" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/ToolCardIconSlot.tsx", - "interactionCount": 3, - "digest": "336e58316520dbe407edbf86a7bfe0ac6c96415c29881cedb9c5ea92c3820a1a" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/ToolTimeoutIndicator.tsx", - "interactionCount": 15, - "digest": "dda88b1c48b78668ae918141f69a3c0f774465f0cdec1fa4d0150acc4e1b8633" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/ViewImageToolCard.tsx", - "interactionCount": 4, - "digest": "e0eddeea9c114cdadbf5a72bbf990aaf6487c2e94e7c0c2f1ce6c368a12da184" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/WebFetchCard.tsx", - "interactionCount": 2, - "digest": "3ac7421cebac716f6102aaae2c5e591eebcf87c259abc598b6b78bdc43a07a14" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/tool-cards/WebSearchCard.tsx", - "interactionCount": 2, - "digest": "3e656cfb5cbfc90e5a5fc498a800e873918c8455837cc265cd8f5c349f0d78e2" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/utils/captureElementToDownloadsPng.tsx", - "interactionCount": 3, - "digest": "336e58316520dbe407edbf86a7bfe0ac6c96415c29881cedb9c5ea92c3820a1a" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/utils/chatInputMode.ts", - "interactionCount": 2, - "digest": "29ab9a456e810a6ddf439bf2cfeab366ff8cfb744a8b0031af53a14ab704a010" - }, - { - "sourceFile": "src/web-ui/src/flow_chat/utils/slashActionSelection.ts", - "interactionCount": 1, - "digest": "b5331eaa8fefaab28fc3477fc218c2e930f9e29f1cfdc1d4480d9fa303226bb7" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/api/service-api/AgentAPI.ts", - "interactionCount": 1, - "digest": "7b8411ac6473bc5bae2bfee0b113b4dc11f33c68a922b4fe080deb874aeb6ec9" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/AcpAgentsConfig.tsx", - "interactionCount": 51, - "digest": "efd496a2a4a7d260e121e9dbded9a1943e12d50077ba9dafbf93ed0651515c26" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/AppearanceMarketDialog.tsx", - "interactionCount": 24, - "digest": "6f2d04cbf1a5a569edeffd58c065d50ff8af4930590b0088c39281139edba8eb" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/AppearanceMarketWorkflows.tsx", - "interactionCount": 36, - "digest": "3d3268b8edd512fa528827502bd81371dad8d5f195e2c78b3fa087d4f2751a6e" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/AppearancePackageConfigSection.tsx", - "interactionCount": 13, - "digest": "162c15bae8074dd877f71225265ea7ab080bb0fd894621c4b37dc73398cb94b0" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/AppearanceSettingsPage.tsx", - "interactionCount": 8, - "digest": "be90167c0065e131117b518b94ea5811e98e46f2ab860794b68270ac0f62c529" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/ApplicationSettingsPages.tsx", - "interactionCount": 28, - "digest": "a8450df3e5b2e2dd8d2cd88d3bd7fc3d1c1fb3a5bc85e57c4181c8840ab8d01c" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/DefaultModelConfig.tsx", - "interactionCount": 8, - "digest": "a4bd861b41cd2d363d95544836c88e06d0df6ad79f3b0848289e69f597a59862" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/EditorConfig.tsx", - "interactionCount": 43, - "digest": "3017f3c917babdc71d6c5605fa4b0580214fc3e803e56c21053b314a59b4bb27" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/ExternalMcpOverview.tsx", - "interactionCount": 10, - "digest": "8cf54c95233ee6985929e0cfed7d898f288fea7dd3bf63de1f421ef4194b22a0" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/ExternalSourcesConfig.tsx", - "interactionCount": 97, - "digest": "03ba4aa9e8836bbe99b6beca2074929e89b724521d2995c9341479458b19d8d7" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/GlobalPermissionRulesDialog.tsx", - "interactionCount": 23, - "digest": "346a4b4bbd486716f40111c0d4297a642870011d1a8932b96296a905e610bdd6" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/HooksConfig.tsx", - "interactionCount": 21, - "digest": "a5d3d48654584f55cd6947621ff18fd2e7fb05e2cfa1b271d250fc487a453b57" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/LocalVoiceModelsConfig.tsx", - "interactionCount": 10, - "digest": "c973526c84c73d048e5759050ac5c0b0b63e9fb26f6d6909bc5d09717da52191" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/MCPResourceBrowser.tsx", - "interactionCount": 7, - "digest": "309d08c5c7fa5c7879a75817b2535ef091d4b5cd23598fc780fe0dcdd075049f" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/McpToolsConfig.tsx", - "interactionCount": 30, - "digest": "6728ba5178dff73a4720f161cdbe9c765dc1868e286bcddfc4d7b8d631bf359d" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/MemorySettingsPage.tsx", - "interactionCount": 29, - "digest": "01dab833ff1b42aa8c3139d56b80157872d465df343f9695ef289f4aaeaa50e2" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/ModelSelectionRadio.tsx", - "interactionCount": 11, - "digest": "376f4390a69eb471cdd2b6c7168e47b0b9f10f4d0059e15af1d31a1c4a2641d2" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/ModelSettingsPage.tsx", - "interactionCount": 150, - "digest": "6157193e1e92b1356d44c249bd050310726cd16ef56623c5de112630ffdd9551" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/QuickActionsConfig.tsx", - "interactionCount": 21, - "digest": "3da9520ef9b3c6f5a25b5b527bd3683a26f45a6d24682bf2bfb99951498d1aec" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/ReasoningConfigPanel.tsx", - "interactionCount": 4, - "digest": "9c9ad1a646fd18d7f488cce65dded1c340ec245a84ae46665ae73622af3440b5" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/ReasoningPresetEditor.tsx", - "interactionCount": 51, - "digest": "6e03893c800d5abd9894b88917fdbde426597065f84e7df75279a82aa6ba33ef" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/ReviewCapacitySection.tsx", - "interactionCount": 3, - "digest": "64988d1ff5df7be84e768029aa4d92e2762a43bce0e263e36f9257307e3c8dab" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/RuntimeSettingsPages.tsx", - "interactionCount": 61, - "digest": "a8fe0d61eebca6089d202105121e094cd3dcc1b686f40e12b83955e56576fa84" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/SessionTitleConfig.tsx", - "interactionCount": 4, - "digest": "e767d412d7c167e989d3f1ba13de93759ce52dd7a27767603806b6f026c724d0" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/SkillsConfig.tsx", - "interactionCount": 28, - "digest": "ba301345195596dac4cddf5147e066bcbf46f1956725b50471ca1a86c0c69307" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/ToolJsonRepairSection.tsx", - "interactionCount": 2, - "digest": "87c228bc172e9c94a8da629424861c4be4be624ed470bfc28e84d273c0f7ede0" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/UsageStatisticsConfig.tsx", - "interactionCount": 12, - "digest": "64de6d71828e1281d830869669e97b760267704bc1506d8894eb1d108702b52c" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/VoiceInputConfig.tsx", - "interactionCount": 11, - "digest": "4c3a90d20a6643614baeead2cc770b05b5a6b3d4345a74ffbfa4f66e77fc7c6e" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/VoiceInputDiagnostics.tsx", - "interactionCount": 6, - "digest": "d880418ff8493e5088f0019901b805b787d0ead8eeef9537b9cc5035136e4d88" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/WorktreeSettingsPage.tsx", - "interactionCount": 21, - "digest": "fed0041824dfb62b015ffd94003b5ee92a038ddc32ba1e3dfe8007afe7fc6086" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/common/ConfigCollectionItem.tsx", - "interactionCount": 3, - "digest": "910d0f28c50e3445c714bffa8c3d51a77410673feb4ee088acce0f3ab216dc7a" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/external-sources/ExternalAppsOverview.tsx", - "interactionCount": 7, - "digest": "8d0a6a8129a6b8bfd74db95374d62831f593a9175602acd18d0849657d5cf0ef" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/external-sources/ExternalCommandConflicts.tsx", - "interactionCount": 2, - "digest": "b57cc16f5f9834355e246c6e447e84b968a8e495ce07f229095feafb6097ef17" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/form-controls/ConfigActions.tsx", - "interactionCount": 6, - "digest": "e6091de1a092f094b0b50cd7ecbced67083be38bb2b4eff37656a1c335d9a333" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/form-controls/ConfigCheckbox.tsx", - "interactionCount": 1, - "digest": "dfbe8ba18f96bfe2f3b74d093dede0c35b41da1e58f4374b9cb74e604392d9ed" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/form-controls/ConfigForm.tsx", - "interactionCount": 1, - "digest": "a2c996449184bac4d0fa8fef84195b9429307b2b8738e8bf0f5815ff45b254c5" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/form-controls/ConfigInput.tsx", - "interactionCount": 1, - "digest": "e3b20b2c575ae8beb150b67967227c9027f71cba31d09a098a202a0860b780e3" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/form-controls/ConfigSection.tsx", - "interactionCount": 3, - "digest": "8e6b42ca7ddd7d62e7717856fbb1d2edf6a0fe283586241272ca9fbcd8e2250b" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/form-controls/ConfigSelect.tsx", - "interactionCount": 2, - "digest": "30c1652c930288599f00a923456322a17e56c8ae21510f61a81a9e94ab3d709f" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/form-controls/ConfigStatus.tsx", - "interactionCount": 3, - "digest": "3c7a969f9700863cef9ff126741f41cecf4d86a6e232b6cd07e7913d68a9b84c" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/config/components/form-controls/ConfigTextarea.tsx", - "interactionCount": 2, - "digest": "afcab9d0f51389fddd83dce562be344f06845f341e180a3b8bc356df86c0a4fa" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/font-preference/components/FontPreferencePanel.tsx", - "interactionCount": 20, - "digest": "cbdff0f36f0ebf59097ef353143a5c502e59dcf784dd9f6020295306855d03e4" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/i18n/components/LanguageSelector.tsx", - "interactionCount": 7, - "digest": "eb90e3c1b746399a5717f94640993d5f9016a523d8a329c9aefc50014529f323" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/peer-device/DeviceSurfaceSwitcher.tsx", - "interactionCount": 11, - "digest": "d186260767b94eab4bbf4bbc6dcb12e5dfc0f69606cd56c052c5638f7a80b119" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/peer-device/PeerDirectoryBrowser.tsx", - "interactionCount": 25, - "digest": "04c3e8e003f6d7e79e29613b29f45c4d722eea6e162c2c85ae1be66931f91070" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/peer-device/PeerDirectoryPickerHost.tsx", - "interactionCount": 1, - "digest": "a16ae4098ce174439657f44f94c246fd6a29da2c57f8fb09d12461375730da42" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/peer-device/runtimeSessionEventGate.ts", - "interactionCount": 1, - "digest": "1ad4712c0508ac87f02e99984ddc8edc1de21825c592c4811e4557c772bed4f3" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/providers/CoreProvider.tsx", - "interactionCount": 2, - "digest": "35dc131a9f36551ca480997171cba3644200f8a290667e1c0fa2dc6392648e65" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/update/UpdateAvailableDialog.tsx", - "interactionCount": 5, - "digest": "990801d98dcd93832296403f676c4be1ccecb85154d826a51d6bc9930ba7f17b" - }, - { - "sourceFile": "src/web-ui/src/infrastructure/update/UpdateInstallProgressModal.tsx", - "interactionCount": 2, - "digest": "1341961a5e2e44aa48012c3de7956c9785cb84295331c53b0befa51208e98a02" - }, - { - "sourceFile": "src/web-ui/src/shared/ai-errors/aiErrorActions.ts", - "interactionCount": 1, - "digest": "5d927f55b447532af8f138334a36ef4a6421ac89e843c1fd4d7ca983dabca311" - }, - { - "sourceFile": "src/web-ui/src/shared/announcement-system/components/AnnouncementToastItem.tsx", - "interactionCount": 5, - "digest": "37d4ae8ac0e14fca6317498102cce9c1dbf26c164f1af2973ec07c990432fb04" - }, - { - "sourceFile": "src/web-ui/src/shared/announcement-system/components/FeatureModal.tsx", - "interactionCount": 13, - "digest": "0bb915c50258a27b0998aa3c770fd4d678ad74afcf2a5a28411449cc9a6647eb" - }, - { - "sourceFile": "src/web-ui/src/shared/context-menu-system/components/ui/ContextMenu.tsx", - "interactionCount": 5, - "digest": "ca35c570fe3512c337cd1ba28fc1bd215c7c7fccbe4b6ca9cf85a12e013d3f0a" - }, - { - "sourceFile": "src/web-ui/src/shared/context-menu-system/core/ContextMenuRegistry.ts", - "interactionCount": 2, - "digest": "88a6d9edd325c04e184c4837c9070f678830a535819b3b43a181ce058456042f" - }, - { - "sourceFile": "src/web-ui/src/shared/context-menu-system/core/MenuBuilder.ts", - "interactionCount": 1, - "digest": "36563ca975b14d289f5ff05d5360a257aaa7f47589373f952da4aa13947a7cd2" - }, - { - "sourceFile": "src/web-ui/src/shared/context-menu-system/providers/EditorMenuProvider.ts", - "interactionCount": 3, - "digest": "92871ae42c86c5a737f97c6e645e1485324ea031d16bbe512509c778285bf1bd" - }, - { - "sourceFile": "src/web-ui/src/shared/context-menu-system/providers/FileExplorerMenuProvider.ts", - "interactionCount": 1, - "digest": "962dc043ea72e800e2ec60c347a76de82a55acfec3487d1b08152df90f207f49" - }, - { - "sourceFile": "src/web-ui/src/shared/context-menu-system/providers/FlowChatMenuProvider.ts", - "interactionCount": 1, - "digest": "962dc043ea72e800e2ec60c347a76de82a55acfec3487d1b08152df90f207f49" - }, - { - "sourceFile": "src/web-ui/src/shared/context-menu-system/providers/GlobalMenuProvider.ts", - "interactionCount": 1, - "digest": "dc017ceff0389ea583fcb8cc0f978ade68b4fb443270516f68aa3ac6f5aa8f18" - }, - { - "sourceFile": "src/web-ui/src/shared/context-menu-system/providers/SelectionMenuProvider.ts", - "interactionCount": 1, - "digest": "962dc043ea72e800e2ec60c347a76de82a55acfec3487d1b08152df90f207f49" - }, - { - "sourceFile": "src/web-ui/src/shared/context-menu-system/providers/TerminalMenuProvider.ts", - "interactionCount": 1, - "digest": "962dc043ea72e800e2ec60c347a76de82a55acfec3487d1b08152df90f207f49" - }, - { - "sourceFile": "src/web-ui/src/shared/context-menu-system/types/provider.types.ts", - "interactionCount": 2, - "digest": "ae5e5766511afcc484ffb0b9803b4ff3bfed474dda2c993088ca73f41a8d499a" - }, - { - "sourceFile": "src/web-ui/src/shared/context-menu-system/utils/menuBuilder.ts", - "interactionCount": 4, - "digest": "5cdeedf488700cb1244947f7053abd49caaae0cd2054f612a03a2d906a4a577a" - }, - { - "sourceFile": "src/web-ui/src/shared/context-system/components/ContextCard/ContextCard.tsx", - "interactionCount": 2, - "digest": "6ed1e248afe87ec694da824710c65234088cb76c66fb5a96471fb578a7a1b344" - }, - { - "sourceFile": "src/web-ui/src/shared/context-system/components/ContextList/ContextList.tsx", - "interactionCount": 4, - "digest": "a37fab682b2bd7dbbe49d5d16be955caab00b37eaf7eec95cab88802af2aa295" - }, - { - "sourceFile": "src/web-ui/src/shared/context-system/core/types/CodeSnippetContextImpl.tsx", - "interactionCount": 1, - "digest": "596a703135d03aefdc877c8db21f35e8f46d043d078e73e45df3e65b7bffd8f0" - }, - { - "sourceFile": "src/web-ui/src/shared/context-system/core/types/ImageContextImpl.tsx", - "interactionCount": 3, - "digest": "4cef10b2eefb34695fa47c5dfcc93e59e364b0d4e7ff5e9ed6c88d13d280a4c3" - }, - { - "sourceFile": "src/web-ui/src/shared/context-system/drag-drop/ContextDropZone.tsx", - "interactionCount": 1, - "digest": "fd67f9bcd3959414dc973a3f44b062e3fc342c477a7492b59c0e98ee82343cb9" - }, - { - "sourceFile": "src/web-ui/src/shared/notification-system/components/LoadingNotification.tsx", - "interactionCount": 3, - "digest": "025d17320455c89bfccff3a485c7e589622358034ab1e6a6bc3bd33dcb40ee3b" - }, - { - "sourceFile": "src/web-ui/src/shared/notification-system/components/NotificationCenter.tsx", - "interactionCount": 22, - "digest": "8429f28fe0db130eb26bfd3285d873a8185ed55e5e255636e6fc03a62b31b6d5" - }, - { - "sourceFile": "src/web-ui/src/shared/notification-system/components/NotificationItem.tsx", - "interactionCount": 4, - "digest": "618fb2af12d7e0ad0a6811d7c6d85252751cabdbeebd7e5871a9fd89cc2a1747" - }, - { - "sourceFile": "src/web-ui/src/shared/notification-system/components/ProgressNotification.tsx", - "interactionCount": 3, - "digest": "025d17320455c89bfccff3a485c7e589622358034ab1e6a6bc3bd33dcb40ee3b" - }, - { - "sourceFile": "src/web-ui/src/shared/services/ide-control/api.ts", - "interactionCount": 2, - "digest": "05ce070fd91faaec839b8195d8e73bd40fa1e915cc0add0f30d29499756296e4" - }, - { - "sourceFile": "src/web-ui/src/shared/utils/chatContext.ts", - "interactionCount": 1, - "digest": "6a00a0b4ebf9e19811a69446b8011285a1df0664e747ba6d10e66b3aed6b0048" - }, - { - "sourceFile": "src/web-ui/src/shared/utils/tabUtils.ts", - "interactionCount": 1, - "digest": "5d927f55b447532af8f138334a36ef4a6421ac89e843c1fd4d7ca983dabca311" - }, - { - "sourceFile": "src/web-ui/src/tools/bitfun-canvas/BitfunCanvasPanel.tsx", - "interactionCount": 9, - "digest": "4ec861730c1f859e3335a04ae5d88ab71a875435a53beafdf991f55cc1fbf32c" - }, - { - "sourceFile": "src/web-ui/src/tools/bitfun-canvas/runtime/sdk/controls.tsx", - "interactionCount": 6, - "digest": "2e5af0e50153df5b3f323b526171b1e60bc08be46fbc1af383005bcae32dfd90" - }, - { - "sourceFile": "src/web-ui/src/tools/bitfun-canvas/runtime/sdk/data-display.tsx", - "interactionCount": 9, - "digest": "c26a957db3e52f2463b1a8875364942dd3b0493f1000b8c8bc0a3fe8aac1a8eb" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/components/CodeEditor.tsx", - "interactionCount": 4, - "digest": "26d6853ea5ab4ab2412e0587ba415e5db51a5b8caf89319706319acdfd28a8ed" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/components/DiffEditor.tsx", - "interactionCount": 6, - "digest": "b414fc41173a9cf8821c09e4f3f4c13b6cf7075b7b20505fbd153c75cebab499" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/components/EditorBreadcrumb.tsx", - "interactionCount": 5, - "digest": "ea0c793a4c1f393a242252c2bae93cd0843988a8478580d601a1b0861ef72dd8" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/components/EditorStatusBar.tsx", - "interactionCount": 4, - "digest": "1c1fa501fec12c21def54f40ea0ac3104456122bb86ee62364634c1edfc749ad" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/components/ImageViewer.tsx", - "interactionCount": 12, - "digest": "d1015fe3aa37291756a244c64da569c56fa79a39c3225d7a30c35b60e02e2126" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/components/MarkdownEditor.tsx", - "interactionCount": 21, - "digest": "2dcd45c1d584d23b4aae5d83b36f8513812061effbeb0dae2ce776f07302a0f4" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/components/PlanViewer.tsx", - "interactionCount": 31, - "digest": "57147c5ba441e95904437a6261347313e9263ea5e46c0c39db598bc82c7c8ce6" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/components/ReadOnlyCodeBlock/ReadOnlyCodeBlock.tsx", - "interactionCount": 1, - "digest": "84ae9fbe9daed0037da02c57d0a8d182934bef56023b6d4b9ca5a5d81fde2d46" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/components/StatusBarPopovers/StatusBarPopovers.tsx", - "interactionCount": 17, - "digest": "b78a30027934ab508b3a41eefa814016aea9f2f79ea81ae4aff5b97bab45058c" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/meditor/components/EditArea.tsx", - "interactionCount": 4, - "digest": "3c7d2039e97d629678f32622c7f36bc67d004ea071a31a070200f8134e2c9e5b" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/meditor/components/InlineAiPreviewBlock.tsx", - "interactionCount": 9, - "digest": "7682578cdecd1fa125e09b6b4eb905a2dd50d3307a4610b810faa9d4ba087af3" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/meditor/components/MEditor.tsx", - "interactionCount": 11, - "digest": "e3e0792e48e2ae6464bc8b4ecdbf3a1bc82c16bb79a4722702d3e25191a85f7b" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/meditor/components/TiptapEditor.tsx", - "interactionCount": 18, - "digest": "c55d7045d943ca4e71e39a352064a63dba15d6e8c8f04a1304650163706f28e6" - }, - { - "sourceFile": "src/web-ui/src/tools/editor/services/ActiveEditTargetService.ts", - "interactionCount": 7, - "digest": "28df7133a9ff262e3fbe16c8a3603155cff295e14c9827a3f914b26bf943fdd3" - }, - { - "sourceFile": "src/web-ui/src/tools/file-system/components/FileExplorer.tsx", - "interactionCount": 9, - "digest": "364c3516ec5ee27d38bb7e90352348ba4b1a4870a9187c48f99990e34917b78a" - }, - { - "sourceFile": "src/web-ui/src/tools/file-system/components/FileSearchResults.tsx", - "interactionCount": 10, - "digest": "38d40c7962e6d77dbf8a625cb2323464eae82ab61bc087802f26fd5a3f194533" - }, - { - "sourceFile": "src/web-ui/src/tools/file-system/components/FileTree.tsx", - "interactionCount": 1, - "digest": "9242a66e148486660e68f09171641f6aafa0c5987bddb8644e5812f18ce3c2ce" - }, - { - "sourceFile": "src/web-ui/src/tools/file-system/components/FileTreeItem.tsx", - "interactionCount": 9, - "digest": "e61e8191c41535432fd27b54e7d806ab45a6e1c163ee9a564a54fd42815bd0db" - }, - { - "sourceFile": "src/web-ui/src/tools/file-system/components/FileTreeNode.tsx", - "interactionCount": 2, - "digest": "a91a917033bfff27a66b9a15f395b53a2b25e1c13aaa05d8a7e02eb9972a084c" - }, - { - "sourceFile": "src/web-ui/src/tools/file-system/components/VirtualFileTree.tsx", - "interactionCount": 2, - "digest": "46330b4db8334c2d5453337abe446e82cc507a4c1844cccd5de9867ba22c28a5" - }, - { - "sourceFile": "src/web-ui/src/tools/generative-widget/GenerativeWidgetPanel.tsx", - "interactionCount": 6, - "digest": "bd4da5299425daecff1005ce048654ddb3c97d8b4aa8b3acefdefa8dca33a529" - }, - { - "sourceFile": "src/web-ui/src/tools/git/components/CreateBranchDialog/CreateBranchDialog.tsx", - "interactionCount": 7, - "digest": "4c6c84b4f71230d14a2d986c2f90323dca9a239b2a51802300683c01e6834786" - }, - { - "sourceFile": "src/web-ui/src/tools/git/components/GitBranchHistoryView/GitBranchHistoryView.tsx", - "interactionCount": 13, - "digest": "0240f42ab1434329cf3ba7a4a532858ab78476fe3461605354b2261b7bfdce1d" - }, - { - "sourceFile": "src/web-ui/src/tools/git/components/GitDiffView/GitDiffView.tsx", - "interactionCount": 11, - "digest": "8f8bb14bcb13a6306e6d1082643ba4b453af3e8622b7ec14826ff62755296855" - }, - { - "sourceFile": "src/web-ui/src/tools/git/components/GitGraphView/GitGraphView.tsx", - "interactionCount": 9, - "digest": "9900037a1d3afd35c5e7123e3bc509f84f44287d86772042f8672080eadb3b0e" - }, - { - "sourceFile": "src/web-ui/src/tools/git/components/GitSettingsView/GitSettingsView.tsx", - "interactionCount": 23, - "digest": "4719cf27649001d6c41468166afd3ad5b0288c64f1bfe917ef980323b704ebd8" - }, - { - "sourceFile": "src/web-ui/src/tools/git/components/PushButton/PushButton.tsx", - "interactionCount": 10, - "digest": "02fdea0ed3b10efa05960da560f4d1c274aece715eff1c13f0cd046fce472a49" - }, - { - "sourceFile": "src/web-ui/src/tools/terminal/components/ConnectedTerminal.tsx", - "interactionCount": 6, - "digest": "7a755fb12480ff4a50dc4573fba17f1f9ad792539ed87e054e74f58890fd857f" - }, - { - "sourceFile": "src/web-ui/src/tools/workspace/components/WorkspaceManager.tsx", - "interactionCount": 10, - "digest": "d42c26f6c9ef0ddc82ea99e42aa4bfdbd514617048846234c9ef9f61bf1fbca8" - } - ] -} diff --git a/scripts/generate-interactive-capabilities.mjs b/scripts/generate-interactive-capabilities.mjs index 686bdc8180..44c4634dba 100644 --- a/scripts/generate-interactive-capabilities.mjs +++ b/scripts/generate-interactive-capabilities.mjs @@ -29,7 +29,6 @@ const DOCS_ROOT = path.join(REPO_ROOT, 'docs/interactive-capabilities'); const DOCS_CAPABILITIES_ROOT = path.join(DOCS_ROOT, 'capabilities'); const PUBLIC_CATALOG_PATH = path.join(DOCS_ROOT, 'capabilities.json'); const TECHNICAL_MAP_PATH = path.join(DOCS_ROOT, 'technical/tauri-command-map.json'); -const UI_INTERACTION_MAP_PATH = path.join(DOCS_ROOT, 'technical/ui-interaction-inventory.json'); const OPEN_CONTROL_AUDIT_PATH = path.join(DOCS_ROOT, 'technical/product-control-open-audit.json'); const RUNTIME_CATALOG_PATH = path.join( REPO_ROOT, @@ -1378,7 +1377,7 @@ export function buildCapabilityCatalog() { coverage: technicalCoverage.coverage, commands: technicalCommands, }, - interactionMap: { + interactionAudit: { schemaVersion: 1, generatedFrom: toPosix(path.relative(REPO_ROOT, SOURCE_PATH)), catalogDigest: digest, @@ -1529,7 +1528,7 @@ The agent first finds the relevant feature or setting, confirms the target, and `; } -function renderReadme(catalog, technicalMap, interactionMap) { +function renderReadme(catalog, technicalMap) { return `${GENERATED_MARKER} # BitFun 功能与设置目录 / BitFun Features & Settings @@ -1548,7 +1547,6 @@ BitFun Playbook currently contains **${catalog.counts.features} features**, **${ - 生成的产品控制目录:\`src/crates/contracts/product-domains/src/generated/product-control-catalog.json\` - 生成的交互项逐项审计:\`docs/interactive-capabilities/technical/product-control-open-audit.json\` - 生成的底层审计表:\`docs/interactive-capabilities/technical/tauri-command-map.json\` -- 生成的可见交互审计表:\`docs/interactive-capabilities/technical/ui-interaction-inventory.json\` - Human-authored explanations, keywords, and evidence overlay: \`${catalog.source}\` - Compiled business Query/Command, schema, risk, and handler owners: \`src/crates/contracts/product-domains/src/product_control_owner_registry.rs\` @@ -1558,10 +1556,11 @@ BitFun Playbook currently contains **${catalog.counts.features} features**, **${ - Generated frontend catalog: \`src/web-ui/src/app/global-search/generated/interactive-capabilities.json\` - Generated runtime catalog: \`src/crates/contracts/product-domains/src/generated/product-control-catalog.json\` - Generated per-item interaction audit: \`docs/interactive-capabilities/technical/product-control-open-audit.json\` +- Generated low-level audit map: \`docs/interactive-capabilities/technical/tauri-command-map.json\` -说明书、网站、搜索和 Agent 只看“功能 + 设置 + 子能力”。每项子能力都必须引用已注册 Tauri Command 或可解析的源码标记;这些证据不会进入公开目录。当前 **${technicalMap.commandCount}** 个 Tauri 命令,以及 **${interactionMap.fileCount}** 个产品交互源码文件中的 **${interactionMap.interactionCount}** 个交互候选,只用于实现覆盖审计。 +说明书、网站、搜索和 Agent 只看“功能 + 设置 + 子能力”。每项子能力都必须引用已注册 Tauri Command 或可解析的源码标记;这些证据不会进入公开目录。当前 **${technicalMap.commandCount}** 个 Tauri 命令只用于实现覆盖审计。产品 UI 交互源码会在生成和检查时扫描并校验,但不会保存成随普通 UI 改动频繁变化的版本化快照。 -Docs, website, search, and agents see only features, settings, and documented sub-capabilities. Every sub-capability must reference a registered Tauri command or a resolvable source marker; evidence is stripped from public projections. The **${technicalMap.commandCount}** Tauri commands and **${interactionMap.interactionCount}** interaction candidates across **${interactionMap.fileCount}** product UI source files remain implementation-audit evidence only. +Docs, website, search, and agents see only features, settings, and documented sub-capabilities. Every sub-capability must reference a registered Tauri command or a resolvable source marker; evidence is stripped from public projections. The **${technicalMap.commandCount}** Tauri commands remain implementation-audit evidence only. Product UI interaction sources are scanned and validated during generation and checks, but are not stored as a versioned snapshot that churns with ordinary UI changes. ## 控制边界 / Control boundary @@ -1583,7 +1582,7 @@ Docs, website, search, and agents see only features, settings, and documented su - 每项子能力必须声明控制类型;所有 operation/option 必须被说明书条目引用,静态值必须符合 schema,任何未绑定 Provider 都会在 Rust 契约测试中失败。 - 每个共享配置 option 必须从默认配置可读、绑定到类型化 GlobalConfig,并能通过真实 ConfigService 写入后回读;Desktop 原生 Provider 也必须逐项绑定,新增但漏接的 handler 会阻断 CI。 - Operation 可声明结构化参数,但必须拒绝未知字段;无参数的 UI 动作若误声明参数,生成会失败。 -- Tauri 命令、设置页、场景、产品动作和交互源码按结构闭包校验;新增事实如果没有业务绑定、说明证据或明确的内部分类会直接失败。 +- Tauri 命令、设置页、场景和产品动作按结构闭包校验;新增事实如果没有业务绑定、说明证据或明确的内部分类会直接失败。UI 交互源码清单在内存中审计,不作为需提交的生成产物。 - 所有投影共享同一个 graph hash;生成文件有差异就失败,不存在可通过抬高计数或更新摘要绕过的基线。 - Every settings page, product action, and scene registration must map to one semantic entry. @@ -1592,7 +1591,7 @@ Docs, website, search, and agents see only features, settings, and documented su - Every item must declare its control class. Every operation/option must be referenced by a manual item, static values must satisfy their schema, and Rust contract tests reject provider bindings without an implementation. - Every shared config option must be readable from defaults, bind to typed GlobalConfig, and round-trip through the real ConfigService. Desktop native providers are exhaustively bound as well, so a new but unwired handler fails CI. - Operations may declare structured arguments but must reject unknown fields. Argument declarations on parameterless UI actions fail generation. -- Tauri commands, settings pages, scenes, product actions, and interaction sources are checked as structural closure; a new fact without an owner binding, documentation evidence, or explicit internal classification fails. +- Tauri commands, settings pages, scenes, and product actions are checked as structural closure; a new fact without an owner binding, documentation evidence, or explicit internal classification fails. The UI interaction-source inventory is audited in memory instead of becoming a committed generated artifact. - Every projection carries the same graph hash. Generated drift fails directly, with no editable count or digest baseline that can be raised to bypass review. `; } @@ -1623,7 +1622,7 @@ async function main() { publicCatalog, runtimeCatalog, technicalMap, - interactionMap, + interactionAudit, openAudit, } = buildCapabilityCatalog(); const drift = []; @@ -1636,9 +1635,8 @@ async function main() { drift, ); await compareOrWrite(TECHNICAL_MAP_PATH, `${JSON.stringify(technicalMap, null, 2)}\n`, drift); - await compareOrWrite(UI_INTERACTION_MAP_PATH, `${JSON.stringify(interactionMap, null, 2)}\n`, drift); await compareOrWrite(OPEN_CONTROL_AUDIT_PATH, `${JSON.stringify(openAudit, null, 2)}\n`, drift); - await compareOrWrite(path.join(DOCS_ROOT, 'README.md'), renderReadme(publicCatalog, technicalMap, interactionMap), drift); + await compareOrWrite(path.join(DOCS_ROOT, 'README.md'), renderReadme(publicCatalog, technicalMap), drift); const expectedDocs = new Set(); for (const capability of publicCatalog.capabilities) { @@ -1665,6 +1663,8 @@ async function main() { console.log( `${checkMode ? 'Verified' : 'Generated'} ${publicCatalog.counts.features} features + ` + `${publicCatalog.counts.settings} settings; audited ${technicalMap.commandCount} Tauri commands ` + + `and ${interactionAudit.interactionCount} UI interaction candidates across ` + + `${interactionAudit.fileCount} files ` + `(${publicCatalog.digest.slice(0, 12)}).`, ); } diff --git a/scripts/interactive-capabilities.test.mjs b/scripts/interactive-capabilities.test.mjs index ed9647b332..cac3b5a8be 100644 --- a/scripts/interactive-capabilities.test.mjs +++ b/scripts/interactive-capabilities.test.mjs @@ -298,6 +298,7 @@ test('built-in and external browsers share one agent action contract', async () }); test('docs, runtime, and technical views are generated projections of one semantic source', async () => { + const { interactionAudit } = buildCapabilityCatalog(); const source = JSON.parse(await read('src/shared/interactive-capabilities/catalog.json')); const publicCatalog = JSON.parse(await read('docs/interactive-capabilities/capabilities.json')); const runtimeCatalog = JSON.parse(await read( @@ -309,12 +310,9 @@ test('docs, runtime, and technical views are generated projections of one semant const technicalMap = JSON.parse(await read( 'docs/interactive-capabilities/technical/tauri-command-map.json', )); - const interactionMap = JSON.parse(await read( - 'docs/interactive-capabilities/technical/ui-interaction-inventory.json', - )); const sourceIds = source.capabilities.map(({ id }) => id); - assert.deepEqual(interactionMap.roots, ['src/web-ui/src']); + assert.deepEqual(interactionAudit.roots, ['src/web-ui/src']); assert.deepEqual(publicCatalog.capabilities.map(({ id }) => id), sourceIds); assert.deepEqual(publicCatalog.searchAcceptance, source.searchAcceptance); assert.deepEqual(runtimeCatalog.searchAcceptance, source.searchAcceptance); @@ -324,7 +322,7 @@ test('docs, runtime, and technical views are generated projections of one semant assert.equal(publicCatalog.digest, runtimeCatalog.digest); assert.equal(publicCatalog.digest, productControlCatalog.digest); assert.equal(publicCatalog.digest, technicalMap.catalogDigest); - assert.equal(publicCatalog.digest, interactionMap.catalogDigest); + assert.equal(publicCatalog.digest, interactionAudit.catalogDigest); assert.deepEqual(publicCatalog.definitions, runtimeCatalog.definitions); assert.deepEqual(publicCatalog.definitions, productControlCatalog.definitions); assert.ok(publicCatalog.definitions.length > publicCatalog.capabilities.length); @@ -337,21 +335,21 @@ test('docs, runtime, and technical views are generated projections of one semant ); } } - assert.equal(interactionMap.fileCount, interactionMap.files.length); + assert.equal(interactionAudit.fileCount, interactionAudit.files.length); assert.equal( - interactionMap.interactionCount, - interactionMap.files.reduce((total, file) => total + file.interactionCount, 0), + interactionAudit.interactionCount, + interactionAudit.files.reduce((total, file) => total + file.interactionCount, 0), ); - assert.ok(interactionMap.files.every(({ interactionCount, digest }) => + assert.ok(interactionAudit.files.every(({ interactionCount, digest }) => interactionCount > 0 && /^[a-f0-9]{64}$/u.test(digest))); - const interactionSourceFiles = interactionMap.files.map(({ sourceFile }) => sourceFile); + const interactionSourceFiles = interactionAudit.files.map(({ sourceFile }) => sourceFile); assert.deepEqual(interactionSourceFiles, [...interactionSourceFiles].sort()); assert.ok(interactionSourceFiles.every((sourceFile) => !sourceFile.includes('/generated/'))); - assert.ok(interactionMap.files.some(({ sourceFile }) => + assert.ok(interactionAudit.files.some(({ sourceFile }) => sourceFile.endsWith('/BrowserPanel.tsx'))); - assert.ok(interactionMap.files.some(({ sourceFile }) => + assert.ok(interactionAudit.files.some(({ sourceFile }) => sourceFile.endsWith('/AssistantDefaultsPage.tsx'))); - assert.ok(interactionMap.files.some(({ sourceFile }) => + assert.ok(interactionAudit.files.some(({ sourceFile }) => sourceFile.endsWith('/AppearanceSettingsPage.tsx'))); assert.equal(publicCatalog.source, 'src/shared/interactive-capabilities/catalog.json'); diff --git a/src/web-ui/src/flow_chat/components/modern/ModernFlowChatContainer.tsx b/src/web-ui/src/flow_chat/components/modern/ModernFlowChatContainer.tsx index af8acce4f8..8065fc17f0 100644 --- a/src/web-ui/src/flow_chat/components/modern/ModernFlowChatContainer.tsx +++ b/src/web-ui/src/flow_chat/components/modern/ModernFlowChatContainer.tsx @@ -2361,7 +2361,7 @@ export const ModernFlowChatContainer: React.FC = ( parentSessionId: selection.parentSessionId, workspacePath: selection.workspacePath || activeSession.workspacePath, sessionKind: 'subagent', - sessionTitle: selection.agentId || selection.title, + sessionTitle: selection.displayTitle, agentType: selection.agentType, parentToolCallId: selection.parentToolCallId, subagentType: selection.subagentType, diff --git a/src/web-ui/src/flow_chat/components/modern/SessionTreePopover.test.tsx b/src/web-ui/src/flow_chat/components/modern/SessionTreePopover.test.tsx index be0c55c71e..2af5c4ba7c 100644 --- a/src/web-ui/src/flow_chat/components/modern/SessionTreePopover.test.tsx +++ b/src/web-ui/src/flow_chat/components/modern/SessionTreePopover.test.tsx @@ -142,7 +142,7 @@ describe('SessionTreePopover', () => { })); }); - it('maps sibling avatars from session IDs and uses Runtime agent IDs as names', async () => { + it('maps sibling avatars from session IDs and formats Runtime agent IDs as names', async () => { mocks.sessions.set('child-2', createSession('child-2', 'subagent', 'root')); mocks.sessions.set('child-3', createSession('child-3', 'subagent', 'root')); mocks.getSessionLineage.mockResolvedValue({ @@ -186,7 +186,7 @@ describe('SessionTreePopover', () => { expect(subagentNodes).toHaveLength(3); expect(subagentNodes.map(node => node.querySelector('.session-tree-popover__node-title')?.textContent)) - .toEqual(['parser-review', 'test-runner', 'docs-audit']); + .toEqual(['Parser review', 'Test runner', 'Docs audit']); }); it('closes a sibling action-menu portal and restores focus with the parent', async () => { @@ -273,6 +273,7 @@ describe('SessionTreePopover', () => { expect(onSelectSession).toHaveBeenCalledWith(expect.objectContaining({ sessionId: 'child', agentId: 'parser-review', + displayTitle: 'Parser review', isRoot: false, })); expect(onRequestClose).toHaveBeenCalledTimes(1); diff --git a/src/web-ui/src/flow_chat/components/modern/SessionTreePopover.tsx b/src/web-ui/src/flow_chat/components/modern/SessionTreePopover.tsx index d3808305a0..bf655b4df0 100644 --- a/src/web-ui/src/flow_chat/components/modern/SessionTreePopover.tsx +++ b/src/web-ui/src/flow_chat/components/modern/SessionTreePopover.tsx @@ -24,6 +24,7 @@ import { type SessionLineageNode, } from '../../utils/sessionLineage'; import { + formatAgentIdForDisplay, SubagentAvatar, } from '../../subagent-identity'; import './SessionTreePopover.scss'; @@ -34,6 +35,7 @@ export interface SessionTreeSelection { parentSessionId?: string; parentToolCallId?: string; title: string; + displayTitle: string; agentType?: string; subagentType?: string; agentId?: string; @@ -69,6 +71,12 @@ function nodeHasActiveWork(node: SessionLineageNode): boolean { return node.lifecycle === 'running' || node.lifecycle === 'finishing'; } +function nodeDisplayTitle(node: SessionLineageNode): string { + return !node.isRoot && node.agentId + ? formatAgentIdForDisplay(node.agentId) + : node.title; +} + export const SessionTreePopover: React.FC = ({ sessionId, fallbackWorkspacePath, @@ -322,6 +330,7 @@ export const SessionTreePopover: React.FC = ({ parentSessionId: node.parentSessionId, parentToolCallId: node.parentToolCallId, title: node.title, + displayTitle: nodeDisplayTitle(node), agentType: node.agentType, subagentType: node.subagentType, agentId: node.agentId, @@ -362,6 +371,7 @@ export const SessionTreePopover: React.FC = ({ parentSessionId: node.parentSessionId, parentToolCallId: node.parentToolCallId, title: node.title, + displayTitle: nodeDisplayTitle(node), agentType: node.agentType, subagentType: node.subagentType, agentId: node.agentId, @@ -393,12 +403,16 @@ export const SessionTreePopover: React.FC = ({ ? t('flowChatHeader.agentTreeCancelling') : lifecycleLabel(node.lifecycle, t); const secondaryLabel = node.subagentType || node.agentType; - const primaryLabel = node.isRoot ? node.title : node.agentId || node.title; + const rawPrimaryLabel = node.isRoot ? node.title : node.agentId || node.title; + const primaryLabel = nodeDisplayTitle(node); + const descriptiveTitle = node.title !== primaryLabel && node.title !== rawPrimaryLabel + ? node.title + : undefined; const nodeMeta = node.isRoot ? secondaryLabel - : [secondaryLabel, node.title] + : [secondaryLabel, descriptiveTitle] .filter((value, index, values): value is string => - Boolean(value) && values.indexOf(value) === index && value !== primaryLabel + Boolean(value) && values.indexOf(value) === index ) .join(' · '); const canCancel = !!onCancelSession && !node.isRoot && nodeHasActiveWork(node); @@ -443,7 +457,9 @@ export const SessionTreePopover: React.FC = ({ onClick={() => handleSelect(node)} aria-label={node.isRoot ? undefined - : [primaryLabel, secondaryLabel, node.title, statusLabel].filter(Boolean).join(', ')} + : [primaryLabel, secondaryLabel, descriptiveTitle, statusLabel] + .filter(Boolean) + .join(', ')} > {node.isRoot ?