From 27c5bd6ae200e1b1d0affbebdc76213edfb59a3d Mon Sep 17 00:00:00 2001 From: LoadChange Date: Tue, 13 Oct 2026 16:45:08 +0800 Subject: [PATCH 1/4] =?UTF-8?q?sync:=20=E5=AF=B9=E9=BD=90=E4=B8=8A?= =?UTF-8?q?=E6=B8=B8=20v3.15.1=EF=BC=88=E4=B8=8A=E6=B8=B8=202026-10-10=20?= =?UTF-8?q?=E5=BF=AB=E7=85=A7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按上游快照整体同步,保留 CCbuddy 的产品边界(BYOK、数据隔离、 品牌与历史查看)。同步方式:以 v3.14.3 为基线做三方合并, 再补齐被引用但缺失的上游源码文件。 - 更新 1847 个已有文件到 v3.15.1 - 新增 371 个上游源码文件(协议、services 拆分、UI、desktop host 等) - 协议:ccbuddy-protocol 新增 topic resource relay、 workflows-for-run 等 schema;导入历史保留 externalHistory 分支 - services:node.ts 采用上游装配并重新套用关闭点 (createDisabledOAuthService / createLocalOnlyApiClient / createUnsupportedConversationShareService / 空账号配置源 / 关闭 CDN 远端刷新 / 关闭启动后台任务 / 本地场景目录) - desktop host:remote workspace 集合采用上游版并关闭云账号端口 - UI:WorkspaceShellLayout/App 采用上游版,应用 logo 指向 CCbuddy 图标; 错误横幅只提供模型服务设置,不再出现升级入口 - file/workspaceFileIgnore.ts:保留 .ccbuddyignore 存放于应用配置目录 - 测试补齐 remoteWorkspaceCollection 新增的 localOnboardingRecordService 参数 验证:pnpm typecheck 通过;pnpm lint 0 error;architecture:check 通过。 未纳入:上游测试套件与 docs/specs 文档、上游新增独立包 (android / web-share / share-ui / stream-animate / e2e-report / dev-docs)。 --- .agents/skills/ai-elements/SKILL.md | 22 +- .../skills/ai-elements/references/agent.md | 63 +- .../skills/ai-elements/references/artifact.md | 54 +- .../ai-elements/references/attachments.md | 72 +- .../ai-elements/references/audio-player.md | 76 +- .../skills/ai-elements/references/canvas.md | 10 +- .../references/chain-of-thought.md | 60 +- .../ai-elements/references/checkpoint.md | 61 +- .../ai-elements/references/code-block.md | 88 +- .../skills/ai-elements/references/commit.md | 156 +- .../ai-elements/references/confirmation.md | 59 +- .../ai-elements/references/connection.md | 14 +- .../skills/ai-elements/references/context.md | 64 +- .../skills/ai-elements/references/controls.md | 10 +- .../ai-elements/references/conversation.md | 67 +- .agents/skills/ai-elements/references/edge.md | 28 +- .../references/environment-variables.md | 92 +- .../ai-elements/references/file-tree.md | 38 +- .../skills/ai-elements/references/image.md | 17 +- .../ai-elements/references/inline-citation.md | 108 +- .../ai-elements/references/jsx-preview.md | 37 +- .../skills/ai-elements/references/message.md | 129 +- .../ai-elements/references/mic-selector.md | 97 +- .../ai-elements/references/model-selector.md | 88 +- .agents/skills/ai-elements/references/node.md | 54 +- .../ai-elements/references/open-in-chat.md | 30 +- .../ai-elements/references/package-info.md | 72 +- .../skills/ai-elements/references/panel.md | 12 +- .../skills/ai-elements/references/persona.md | 28 +- .agents/skills/ai-elements/references/plan.md | 56 +- .../ai-elements/references/prompt-input.md | 270 +- .../skills/ai-elements/references/queue.md | 104 +- .../ai-elements/references/reasoning.md | 79 +- .../skills/ai-elements/references/sandbox.md | 57 +- .../ai-elements/references/schema-display.md | 16 +- .../skills/ai-elements/references/shimmer.md | 14 +- .../skills/ai-elements/references/snippet.md | 42 +- .../skills/ai-elements/references/sources.md | 50 +- .../ai-elements/references/speech-input.md | 29 +- .../ai-elements/references/stack-trace.md | 126 +- .../ai-elements/references/suggestion.md | 21 +- .agents/skills/ai-elements/references/task.md | 49 +- .../skills/ai-elements/references/terminal.md | 60 +- .../ai-elements/references/test-results.md | 118 +- .agents/skills/ai-elements/references/tool.md | 68 +- .../skills/ai-elements/references/toolbar.md | 10 +- .../ai-elements/references/transcription.md | 24 +- .../ai-elements/references/voice-selector.md | 188 +- .../ai-elements/references/web-preview.md | 51 +- .../skills/architecture-governance/SKILL.md | 24 +- .../agents/openai.yaml | 2 +- .../references/ai-guidance.md | 6 +- .../references/golden-module/CONTRACT.md | 2 +- .../references/module-contract.md | 2 +- .../references/policy-schema.md | 8 +- .../references/rule-catalog.md | 29 +- .../references/troubleshooting.md | 13 +- .agents/skills/dep-refs/SKILL.md | 10 +- .../skills/feature-boundary-planner/SKILL.md | 193 +- .../references/case-planning-template.md | 78 +- .../references/ccbuddy-feature-graph.yaml | 8944 +++++++++++++++-- .../references/impact-brief-template.md | 94 +- .agents/skills/react-best-practices/AGENTS.md | 1585 +-- .agents/skills/react-best-practices/README.md | 123 +- .agents/skills/react-best-practices/SKILL.md | 22 +- .../react-best-practices/rules/_template.md | 4 +- .../rules/advanced-effect-event-deps.md | 38 +- .../rules/advanced-event-handler-refs.md | 30 +- .../rules/advanced-init-once.md | 18 +- .../rules/advanced-use-latest.md | 20 +- .../rules/async-api-routes.md | 21 +- .../async-cheap-condition-before-await.md | 4 +- .../rules/async-defer-await.md | 52 +- .../rules/async-dependencies.md | 35 +- .../rules/async-parallel.md | 12 +- .../rules/async-suspense-boundaries.md | 26 +- .../rules/bundle-analyzable-paths.md | 23 +- .../rules/bundle-barrel-imports.md | 16 +- .../rules/bundle-conditional.md | 24 +- .../rules/bundle-defer-third-party.md | 15 +- .../rules/bundle-dynamic-imports.md | 15 +- .../rules/bundle-preload.md | 24 +- .../rules/client-event-listeners.md | 48 +- .../rules/client-localstorage-schema.md | 33 +- .../rules/client-passive-event-listeners.md | 40 +- .../rules/client-swr-dedup.md | 24 +- .../rules/js-batch-dom-css.md | 75 +- .../rules/js-cache-function-results.md | 16 +- .../rules/js-cache-property-access.md | 8 +- .../rules/js-cache-storage.md | 34 +- .../rules/js-combine-iterations.md | 18 +- .../rules/js-early-exit.md | 24 +- .../rules/js-flatmap-filter.md | 29 +- .../rules/js-hoist-regexp.md | 6 +- .../rules/js-index-maps.md | 14 +- .../rules/js-length-check-first.md | 13 +- .../rules/js-min-max-loop.md | 52 +- .../rules/js-request-idle-callback.md | 47 +- .../rules/js-tosorted-immutable.md | 2 +- .../rules/rendering-activity.md | 6 +- .../rules/rendering-animate-svg-wrapper.md | 17 +- .../rules/rendering-conditional-render.md | 12 +- .../rules/rendering-content-visibility.md | 4 +- .../rules/rendering-hoist-jsx.md | 18 +- .../rules/rendering-hydration-no-flicker.md | 34 +- .../rendering-hydration-suppress-warning.md | 10 +- .../rules/rendering-resource-hints.md | 40 +- .../rules/rendering-script-defer-async.md | 8 +- .../rules/rendering-usetransition-loading.md | 42 +- .../rules/rerender-defer-reads.md | 20 +- .../rules/rerender-dependencies.md | 18 +- .../rules/rerender-derived-state-no-effect.md | 20 +- .../rules/rerender-derived-state.md | 10 +- .../rules/rerender-functional-setstate.md | 41 +- .../rules/rerender-lazy-state-init.md | 34 +- .../rules/rerender-memo-with-default-value.md | 2 + .../rules/rerender-memo.md | 20 +- .../rules/rerender-move-effect-to-event.md | 20 +- .../rules/rerender-no-inline-components.md | 23 +- .../rerender-simple-expression-in-memo.md | 10 +- .../rules/rerender-split-combined-hooks.md | 34 +- .../rules/rerender-transitions.md | 24 +- .../rules/rerender-use-deferred-value.md | 24 +- .../rerender-use-ref-transient-values.md | 42 +- .../rules/server-after-nonblocking.md | 46 +- .../rules/server-auth-actions.md | 64 +- .../rules/server-cache-lru.md | 16 +- .../rules/server-cache-react.md | 34 +- .../rules/server-dedup-props.md | 6 +- .../rules/server-hoist-static-io.md | 25 +- .../rules/server-no-shared-module-state.md | 14 +- .../rules/server-parallel-fetching.md | 30 +- .../rules/server-parallel-nested-fetching.md | 12 +- .../rules/server-serialization.md | 16 +- .dockerignore | 3 + .env.development | 6 +- .env.production | 7 +- .gitattributes | 5 + .oxfmtrc.json | 4 +- .oxlintrc.json | 1 + .vscode/extensions.json | 2 +- .vscode/launch.json | 29 +- .vscode/tasks.json | 30 +- CONTEXT.md | 14 +- DESIGN.md | 145 +- apps/ccbuddy-cli/AGENTS.md | 24 +- apps/ccbuddy-cli/README.md | 39 +- apps/ccbuddy-cli/dependencies/README.md | 21 +- apps/ccbuddy-cli/package.json | 12 +- .../packages/adapters/package.json | 5 +- .../adapters/src/auth/coding-plan-api-key.ts | 437 +- .../src/auth/zai-business-token-cache.ts | 125 + .../adapters/src/browser/page-command.ts | 2 +- .../packages/adapters/src/browser/session.ts | 2 +- .../packages/adapters/src/config/schema.ts | 29 +- .../adapters/src/device/cli-device-mid.ts | 2 +- .../adapters/src/device/process-probe.ts | 4 +- .../adapters/src/exec/bash-file-output.ts | 3 +- .../adapters/src/exec/bash-shell-provider.ts | 28 +- .../adapters/src/exec/bash-startup-script.ts | 31 +- .../packages/adapters/src/exec/cwd-capture.ts | 7 +- .../src/exec/embedded-search-prelude.ts | 9 + .../adapters/src/exec/shell-init-snapshot.ts | 50 +- .../packages/adapters/src/http/index.ts | 30 +- .../adapters/src/http/response-body.ts | 26 +- .../packages/adapters/src/index.ts | 1 + .../packages/adapters/src/mcp/network.ts | 28 +- .../adapters/src/mcp/oauth-credentials.ts | 19 +- .../packages/adapters/src/mcp/oauth-errors.ts | 28 +- .../adapters/src/mcp/oauth-interactive.ts | 2 +- .../packages/adapters/src/mcp/oauth-lease.ts | 11 +- .../adapters/src/mcp/oauth-provider.ts | 6 +- .../adapters/src/mcp/oauth-refresh.ts | 18 +- .../packages/adapters/src/mcp/oauth-shared.ts | 6 +- .../packages/adapters/src/mcp/oauth.ts | 550 +- .../adapters/src/mcp/official-auth.ts | 4 +- .../packages/adapters/src/mcp/pool.ts | 2 +- .../packages/adapters/src/mcp/process-tree.ts | 2 +- .../adapters/src/mcp/stdio-transport.ts | 10 +- .../packages/adapters/src/mcp/telemetry.ts | 4 +- .../adapters/src/mcp/windows-job-object.ts | 22 +- .../src/model/account-request-retry.ts | 122 + .../src/model/anthropic-request-metadata.ts | 2 +- .../src/model/anthropic-stream-compat.ts | 46 +- .../src/model/empty-completion-retry.ts | 6 +- .../model/endpoint-routing-edition/index.ts | 9 + .../adapters/src/model/failure-classifier.ts | 2 +- .../packages/adapters/src/model/index.ts | 6 +- .../adapters/src/model/model-execution.ts | 83 +- .../src/model/model-request-headers.ts | 25 + .../src/model/off-peak-request-auth.ts | 39 + .../src/model/official-coding-plan-gateway.ts | 64 +- .../adapters/src/model/offpeak-retry.ts | 19 +- .../src/model/openai-responses-json-compat.ts | 2 +- .../model/provider-endpoint-routing-fetch.ts | 92 + .../provider-endpoint-routing-options.ts | 12 + .../model/reasoning-history-normalization.ts | 4 +- .../model/request-security-edition/index.ts | 10 + .../request-security-edition/recovery.ts | 26 + .../adapters/src/model/request-security.ts | 24 + .../adapters/src/model/retry-budget.ts | 23 + .../adapters/src/model/runner-attribution.ts | 10 +- .../adapters/src/model/runner-diagnostics.ts | 10 +- .../adapters/src/model/runner-generate.ts | 41 +- .../src/model/runner-network-headers.ts | 2 + .../adapters/src/model/runner-options.ts | 6 +- .../src/model/runner-runtime-headers.ts | 3 +- .../adapters/src/model/runner-runtime.ts | 5 +- .../adapters/src/model/runner-status.ts | 45 + .../adapters/src/model/runner-stream.ts | 75 +- .../packages/adapters/src/model/runner.ts | 38 +- .../adapters/src/model/stream-idle-timeout.ts | 5 +- .../packages/adapters/src/model/transform.ts | 4 +- .../adapters/src/network/incoming-response.ts | 77 + .../adapters/src/network/proxy-fetch.ts | 38 +- .../adapters/src/plugins/atomic-directory.ts | 13 +- .../src/plugins/github-archive-source.ts | 10 +- .../adapters/src/plugins/hook-sources.ts | 7 +- .../packages/adapters/src/plugins/index.ts | 3 + .../src/plugins/markdown-frontmatter.ts | 7 +- .../adapters/src/plugins/marketplace.ts | 243 +- .../adapters/src/plugins/source-errors.ts | 8 +- .../adapters/src/plugins/zip-source.ts | 4 +- .../packages/adapters/src/skills/scan.ts | 2 +- .../src/storage/fs-fault-injection.ts | 45 +- .../adapters/src/storage/session-store.ts | 6 +- .../src/storage/session-store/codecs.ts | 1 + .../storage/session-store/migration-runner.ts | 2 +- .../src/storage/session-store/migrations.ts | 2 +- .../repositories/dwf-journal-artifacts.ts | 89 +- .../repositories/dwf-journal-codecs.ts | 4 +- .../repositories/dwf-journal-fields.ts | 153 + .../repositories/dwf-journal-introspection.ts | 19 +- .../repositories/dwf-journal-pages.ts | 109 + .../repositories/dwf-journal-reads.ts | 238 + .../session-store/repositories/dwf-journal.ts | 99 +- .../session-store/repositories/sessions.ts | 2 +- .../packages/adapters/src/tools/index.ts | 4 + .../packages/bootstrap/package.json | 3 + .../bootstrap/src/app/built-in-node-repl.ts | 2 +- .../bootstrap/src/app/bundled-plugins.ts | 2 +- .../bootstrap/src/app/bundled-skills.ts | 114 +- .../packages/bootstrap/src/app/create-app.ts | 167 +- .../src/app/dynamic-workflow-gate.ts | 4 +- .../src/app/dynamic-workflow-import.ts | 118 +- ...ynamic-workflow-run-artifact-projection.ts | 31 +- .../dynamic-workflow-run-artifact-queries.ts | 33 +- .../src/app/dynamic-workflow-run-compile.ts | 131 + .../src/app/dynamic-workflow-run-elapsed.ts | 19 +- .../src/app/dynamic-workflow-run-fill.ts | 324 + .../src/app/dynamic-workflow-run-holes.ts | 309 + .../app/dynamic-workflow-run-introspection.ts | 67 +- .../src/app/dynamic-workflow-run-journal.ts | 36 +- .../src/app/dynamic-workflow-run-label.ts | 2 +- .../app/dynamic-workflow-run-launch-anchor.ts | 107 +- .../src/app/dynamic-workflow-run-launch.ts | 225 +- .../app/dynamic-workflow-run-observation.ts | 122 +- .../dynamic-workflow-run-progress-payload.ts | 227 + .../src/app/dynamic-workflow-run-replay.ts | 80 +- .../src/app/dynamic-workflow-run-retune.ts | 25 +- .../src/app/dynamic-workflow-run-roster.ts | 16 +- .../dynamic-workflow-run-sequence-capture.ts | 19 +- .../src/app/dynamic-workflow-run-service.ts | 139 +- .../src/app/dynamic-workflow-run-submit.ts | 172 +- .../src/app/dynamic-workflow-run-workspace.ts | 6 +- .../app/dynamic-workflow-snippet-service.ts | 9 +- ...y-cli-personal-provider-config-importer.ts | 4 +- .../src/app/node-repl-browser-broker.ts | 6 +- .../src/app/official-plugin-cache-fs.ts | 2 +- .../src/app/official-plugin-definitions.ts | 35 +- .../src/app/plugin-runtime-features.ts | 2 +- .../app/process-provider-registry-runtime.ts | 159 +- .../app/provider-registry-model-runtime.ts | 7 +- .../src/app/script-workflow-child-runtime.ts | 79 +- .../src/app/script-workflow-runtime.ts | 6 +- .../bootstrap/src/app/session-facade.ts | 13 +- .../bootstrap/src/app/session-store.ts | 20 +- .../standalone-account-provider-runtime.ts | 155 +- .../bootstrap/src/app/startup-marks.ts | 7 +- .../bootstrap/src/app/visualize-skill-gate.ts | 12 + .../bootstrap/src/app/workflow-actor-model.ts | 63 +- .../src/app/workflow-actor-permission.ts | 86 + .../bootstrap/src/app/workflow-actor-tools.ts | 18 +- .../src/app/workflow-actor-transcript.ts | 2 +- .../src/app/workflow-concurrency-governor.ts | 116 +- .../src/app/workflow-default-concurrency.ts | 55 + .../src/app/workflow-driver-concurrency.ts | 16 +- .../src/app/workflow-driver-helpers.ts | 2 +- .../src/app/workflow-driver-quiescence.ts | 63 +- .../src/app/workflow-driver-submit-bridge.ts | 10 +- .../src/app/workflow-driver-tool-target.ts | 4 +- .../src/app/workflow-driver-types.ts | 15 +- .../bootstrap/src/app/workflow-driver.ts | 16 +- .../bootstrap/src/app/workflow-facade.ts | 3 +- .../src/app/workflow-git-world-read.ts | 4 +- .../bootstrap/src/app/workflow-run-control.ts | 46 +- .../bootstrap/src/app/workflow-seat-gate.ts | 4 +- .../bootstrap/src/app/workflow-world-read.ts | 24 +- .../src/app/workspace-hook-review-mutation.ts | 2 +- .../bootstrap/src/app/workspace-hook-trust.ts | 49 +- .../bootstrap/src/auth-login-contract.ts | 86 + .../bootstrap/src/auth-login-persistence.ts | 130 + .../packages/bootstrap/src/auth-login.ts | 339 +- .../bootstrap/src/builtin-prompt-command.ts | 51 +- .../bootstrap/src/builtin-workflow-command.ts | 11 +- .../src/ccbuddy-protocol-entrypoint.ts | 67 +- .../assistant-feedback-persistence.ts | 2 +- .../attachment-upload-registry.ts | 7 +- .../ccbuddy-protocol-v4/cold-event-merge.ts | 5 +- .../cold-session-resume.ts | 4 +- .../src/ccbuddy-protocol-v4/command-inbox.ts | 8 +- .../commands/attachment-refs.ts | 9 +- .../ccbuddy-protocol-v4/commands/executor.ts | 8 +- .../handlers/canonical-intent-replay.ts | 119 + .../commands/handlers/fork-edit-retry.ts | 150 +- .../commands/handlers/goal-compact.ts | 2 +- .../commands/handlers/highspeed-metrics.ts | 46 + .../commands/handlers/index.ts | 4 + .../handlers/interaction-background.ts | 2 +- .../commands/handlers/model-config.ts | 2 +- .../commands/handlers/queue.ts | 61 +- .../commands/handlers/session-flow.ts | 314 +- .../commands/handlers/session-mgmt.ts | 18 +- .../commands/input-admission.ts | 169 + .../commands/input-intent.ts | 32 +- .../commands/prompt-turn.ts | 18 +- .../src/ccbuddy-protocol-v4/commands/types.ts | 41 +- .../conversation-telemetry-facts.ts | 6 +- .../conversation-topic-publisher.ts | 72 +- .../ccbuddy-protocol-v4/cua-app-snapshot.ts | 4 +- .../ccbuddy-protocol-v4/event-normalizer.ts | 26 +- .../highspeed-metrics-persistence.ts | 189 + .../interaction-registry.ts | 6 +- .../persistent-command-facts.ts | 2 +- .../persistent-command-index.ts | 6 +- .../ccbuddy-protocol-v4/product-projection.ts | 309 +- .../ccbuddy-protocol-v4/projection-rows.ts | 21 +- .../ccbuddy-protocol-v4/projection-state.ts | 8 +- .../sessions-index-fanout-throttle.ts | 9 +- .../sessions-index-projection.ts | 2 +- .../sessions-index-publisher.ts | 46 +- .../transcript-hydration.ts | 245 +- .../src/ccbuddy-protocol-v4/v4-gateway.ts | 108 +- .../workspace-config-publisher.ts | 46 +- .../src/ccbuddy-protocol/automation-port.ts | 15 +- .../browser-control-broker.ts | 113 +- .../dynamic-workflow-policy.ts | 29 +- .../ccbuddy-protocol/fork-model-selection.ts | 50 + .../ccbuddy-protocol/interaction-broker.ts | 66 +- .../interaction-response-race.ts | 2 + .../src/ccbuddy-protocol/model-execution.ts | 3 + .../src/ccbuddy-protocol/model-mapper.ts | 2 +- .../src/ccbuddy-protocol/offpeak-port.ts | 9 +- .../plugin-reference-catalog.ts | 2 + .../bootstrap/src/ccbuddy-protocol/plugins.ts | 19 +- .../provider-runtime-headers.ts | 12 +- .../ccbuddy-protocol/saved-workflows-run.ts | 201 + .../src/ccbuddy-protocol/saved-workflows.ts | 2 +- .../src/ccbuddy-protocol/server-types.ts | 21 +- .../bootstrap/src/ccbuddy-protocol/server.ts | 46 +- .../src/ccbuddy-protocol/session-mapper.ts | 22 +- .../src/ccbuddy-protocol/session-residency.ts | 6 +- .../ccbuddy-protocol/session-resident-pool.ts | 15 +- .../skill-reference-catalog.ts | 1 + .../src/ccbuddy-protocol/slash-commands.ts | 7 +- .../subagent-session-query.ts | 6 +- .../ccbuddy-protocol/topic-resource-port.ts | 66 + .../src/ccbuddy-protocol/transport.ts | 29 +- .../ccbuddy-protocol/usage-stats-builder.ts | 2 +- .../src/ccbuddy-protocol/v4-bridge.ts | 252 +- .../ccbuddy-protocol/v4-workspace-config.ts | 2 +- .../workflow-settings-answer.ts | 32 + .../workspace-model-runtime.ts | 1 + .../bootstrap/src/custom-command-prompt.ts | 9 +- .../packages/bootstrap/src/index.ts | 8 + .../packages/bootstrap/src/mcp-config.ts | 20 +- .../packages/bootstrap/src/model-config.ts | 5 +- .../packages/bootstrap/src/model-factory.ts | 5 + .../bootstrap/src/permission-options.ts | 6 +- .../packages/bootstrap/src/plugins.ts | 38 +- .../bootstrap/src/process-resource-sampler.ts | 4 +- ...rovider-endpoint-routing-source-headers.ts | 80 + .../src/provider-endpoint-routing.ts | 98 + .../bootstrap/src/skill-command-overrides.ts | 2 +- .../packages/bootstrap/src/skills.ts | 19 +- .../bootstrap/src/slash-command-surface.ts | 4 +- .../bootstrap/src/subagent-runtime-config.ts | 38 + .../packages/browser-use-plugin/README.md | 5 +- .../packages/browser-use-plugin/docs/api.json | 2 +- .../browser-use-plugin/docs/overview.md | 9 +- .../browser-use-plugin/docs/workflow.md | 2 +- .../packages/browser-use-plugin/package.json | 6 +- .../browser-use-plugin/scripts/build.mjs | 1 + .../skills/control-browser/SKILL.md | 17 +- .../skills/dynamic-workflows/SKILL.md | 1453 +-- .../skills/dynamic-workflows/examples.md | 311 +- .../skills/dynamic-workflows/patterns.md | 340 +- apps/ccbuddy-cli/packages/cli/package.json | 2 + .../packages/cli/scripts/build-sea.mjs | 13 +- .../packages/cli/scripts/build.mjs | 13 +- .../scripts/sea-official-plugin-assets.mjs | 110 +- .../cli/scripts/sea-runtime-tool-assets.mjs | 1 + .../cli/scripts/sea-runtime-tool-prepare.mjs | 5 + .../packages/cli/scripts/upload-sea-smb.mjs | 53 +- .../ccbuddy-cli/packages/cli/src/arguments.ts | 8 +- .../ccbuddy-cli/packages/cli/src/cli-types.ts | 7 +- .../packages/cli/src/command-center/create.ts | 143 +- .../cli/src/command-center/handlers/dwf.ts | 3 + .../cli/src/command-center/handlers/expert.ts | 4 +- .../cli/src/command-center/handlers/model.ts | 2 +- .../packages/cli/src/command-center/modes.ts | 8 +- .../cli/src/command-center/slash-commands.ts | 45 +- .../packages/cli/src/command-center/types.ts | 10 +- apps/ccbuddy-cli/packages/cli/src/env.ts | 2 +- .../packages/cli/src/headless-workflow.ts | 10 +- .../internal-search/embedded-search-cli.ts | 8 +- .../packages/cli/src/process-errors.ts | 4 +- .../packages/cli/src/prompt-command.ts | 70 +- apps/ccbuddy-cli/packages/cli/src/run.ts | 52 +- .../packages/cli/src/sea-runtime-tools.ts | 4 +- .../packages/cli/src/tui-command.ts | 7 +- .../cli/src/tui-prompt-handler-runtime.ts | 14 + .../packages/cli/src/tui-prompt-handler.ts | 8 + .../packages/cli/src/workflow-mode.ts | 51 + .../packages/contracts/package.json | 5 +- .../contracts/src/events/event-reducer.ts | 1 + .../events/in-memory-session-event-store.ts | 6 +- .../src/events/session-event-retention.ts | 19 + .../contracts/src/events/session.events.ts | 56 +- .../packages/contracts/src/index.ts | 2 + .../src/interfaces/browser-control.port.ts | 25 +- .../dynamic-workflow-run-hole.port.ts | 102 + .../dynamic-workflow-run-retune.port.ts | 18 +- .../dynamic-workflow-run-workspace.port.ts | 11 +- .../interfaces/dynamic-workflow-run.port.ts | 146 +- .../contracts/src/interfaces/index.ts | 1 + .../src/interfaces/permission-full-access.ts | 2 +- .../src/interfaces/permission.port.ts | 16 +- .../provider-endpoint-routing.port.ts | 24 + .../src/interfaces/session-store.port.ts | 6 + .../contracts/src/interfaces/session.port.ts | 88 +- .../src/interfaces/topic-resource.port.ts | 20 + .../packages/contracts/src/model/index.ts | 17 + .../contracts/src/model/invocation-context.ts | 7 +- .../packages/contracts/src/plugins/index.ts | 3 +- .../src/telemetry/agent-execution.ts | 2 + .../packages/contracts/src/telemetry/index.ts | 16 +- .../contracts/src/tools/amend-workflow.ts | 25 +- .../contracts/src/tools/automation.ts | 2 +- .../contracts/src/tools/create-workflow.ts | 117 +- .../src/tools/eval-workflow-snippet.ts | 6 +- .../contracts/src/tools/fill-workflow-hole.ts | 124 + .../contracts/src/tools/get-workflow-run.ts | 40 + .../packages/contracts/src/tools/index.ts | 4 + .../packages/contracts/src/tools/off-peak.ts | 4 +- .../packages/contracts/src/tools/plan-mode.ts | 10 +- .../src/tools/read-session-context.ts | 49 +- .../contracts/src/tools/save-workflow.ts | 26 +- .../contracts/src/tools/workflow-settings.ts | 103 + apps/ccbuddy-cli/packages/core/package.json | 5 +- .../core/src/agent/agent-listing-metadata.ts | 39 + .../core/src/agent/compact-session.ts | 6 +- .../packages/core/src/agent/loaded-skills.ts | 2 +- .../core/src/agent/message-history.ts | 9 +- .../src/agent/read-file-state-hydrator.ts | 13 +- .../src/agent/session-history-hydrator.ts | 41 +- .../packages/core/src/agent/turn-state.ts | 3 +- .../core/src/browser-client/facade.ts | 14 +- .../core/src/browser-client/selection.ts | 2 +- .../packages/core/src/compact/microcompact.ts | 14 +- .../packages/core/src/compact/policy.ts | 2 +- .../packages/core/src/context/builder.ts | 7 +- .../core/src/context/sections/memory.ts | 23 +- .../core/src/embedded-search/capability.ts | 8 +- .../packages/core/src/errors/error-payload.ts | 13 +- apps/ccbuddy-cli/packages/core/src/index.ts | 10 + .../packages/core/src/memory/dream.ts | 239 + .../packages/core/src/memory/extraction.ts | 8 +- .../core/src/memory/memory-agent-loop.ts | 10 +- .../core/src/memory/memory-file-path.ts | 3 +- .../memory/project-memory-retrieval-branch.ts | 14 + .../core/src/memory/recall/content.ts | 99 + .../packages/core/src/memory/recall/index.ts | 43 +- .../core/src/memory/recall/manifest.ts | 34 +- .../core/src/memory/recall/selector.ts | 191 + .../packages/core/src/memory/recall/types.ts | 24 + .../packages/core/src/permission/broker.ts | 7 + .../core/src/permission/plan-mode-policy.ts | 2 +- .../core/src/permission/rule-matching.ts | 2 +- .../packages/core/src/permission/service.ts | 57 +- .../src/permission/workflow-draft-path.ts | 30 +- .../core/src/repl/browser-turn-state.ts | 16 +- .../packages/core/src/repl/instrument.ts | 23 +- .../core/src/repl/node-repl-session.ts | 5 +- .../src/runtime-task/notification-policy.ts | 2 +- .../workflow-notification-copy.ts | 63 + .../core/src/runtime/agent-runtime.ts | 51 +- .../packages/core/src/runtime/deps.ts | 1 + .../core/src/runtime/execution-state.ts | 2 +- .../core/src/runtime/helpers/agent-listing.ts | 41 + .../helpers/attachment-path-reference.ts | 2 + .../core/src/runtime/helpers/attachments.ts | 46 +- .../core/src/runtime/helpers/compact-media.ts | 2 +- .../runtime/helpers/compact-post-reminders.ts | 6 +- .../core/src/runtime/helpers/compact.ts | 19 +- .../helpers/context-usage-breakdown.ts | 2 +- .../runtime/helpers/conversation-quotes.ts | 68 + .../core/src/runtime/helpers/conversation.ts | 5 +- .../core/src/runtime/helpers/media-budget.ts | 4 +- .../core/src/runtime/helpers/model-errors.ts | 22 +- .../src/runtime/helpers/official-cua-media.ts | 7 +- .../persisted-remote-session-path-repair.ts | 2 +- .../runtime/helpers/plan-file-continuity.ts | 17 +- .../runtime/helpers/project-memory-agent.ts | 1 - .../runtime/helpers/project-memory-dream.ts | 253 + .../runtime/helpers/project-memory-recall.ts | 312 + .../src/runtime/helpers/project-memory.ts | 2 +- .../core/src/runtime/helpers/rewind.ts | 82 +- .../src/runtime/helpers/runtime-reminders.ts | 12 +- .../core/src/runtime/helpers/runtime-tools.ts | 6 +- .../helpers/subagent-interaction-broker.ts | 12 +- .../src/runtime/helpers/tool-allowlist.ts | 19 +- .../helpers/tool-result-media-persistence.ts | 25 +- .../core/src/runtime/internal-turn-methods.ts | 1 + .../packages/core/src/runtime/internal.ts | 17 + .../methods/background-notifications.ts | 4 +- .../runtime/methods/compact-active-helpers.ts | 41 +- .../src/runtime/methods/compact-active.ts | 14 +- .../methods/compact-summary-model-request.ts | 2 - .../core/src/runtime/methods/compact.ts | 4 + .../core/src/runtime/methods/config.ts | 22 +- .../core/src/runtime/methods/context.ts | 14 +- .../methods/dynamic-workflow-activation.ts | 182 + .../dynamic-workflow-run-hole-notification.ts | 147 + .../methods/dynamic-workflow-run-progress.ts | 4 + .../dynamic-workflow-run-settings-turn.ts | 18 +- .../methods/dynamic-workflow-run-settings.ts | 59 +- .../methods/dynamic-workflow-run-start.ts | 15 +- .../methods/dynamic-workflow-run-track.ts | 4 + .../runtime/methods/embedded-search-branch.ts | 3 +- .../core/src/runtime/methods/events.ts | 3 + .../core/src/runtime/methods/index.ts | 2 + .../methods/input-intent-persistence.ts | 22 + .../packages/core/src/runtime/methods/mcp.ts | 14 +- .../runtime/methods/message-persistence.ts | 8 +- .../methods/model-request-session-type.ts | 1 + .../runtime/methods/model-runtime-headers.ts | 7 +- .../methods/model-streaming-event-queue.ts | 11 +- .../core/src/runtime/methods/model.ts | 5 +- .../src/runtime/methods/plugin-reference.ts | 2 +- .../src/runtime/methods/prompt-admission.ts | 15 + .../core/src/runtime/methods/residency.ts | 3 +- .../core/src/runtime/methods/resume.ts | 6 + .../methods/runtime-command-active-loop.ts | 2 +- .../core/src/runtime/methods/runtime-model.ts | 34 +- .../core/src/runtime/methods/session-fork.ts | 31 +- .../methods/session-shell-environment.ts | 10 +- .../src/runtime/methods/shell-environment.ts | 6 +- .../core/src/runtime/methods/steering.ts | 22 +- .../methods/streaming-tool-coordinator.ts | 143 +- .../src/runtime/methods/subagent-messages.ts | 2 +- .../core/src/runtime/methods/subagent.ts | 91 +- .../methods/synthetic-notice-metadata.ts | 2 + .../methods/target-completion-verification.ts | 2 - .../core/src/runtime/methods/target.ts | 2 +- .../methods/title-generation-sidecar.ts | 1 - .../runtime/methods/tool-result-settlement.ts | 283 + .../methods/turn-execution-fallback.ts | 259 + .../src/runtime/methods/turn-loop-state.ts | 8 +- .../core/src/runtime/methods/turn-loop.ts | 60 +- .../src/runtime/methods/turn-model-step.ts | 59 +- .../core/src/runtime/methods/turn-model.ts | 22 + .../methods/turn-output-token-continuation.ts | 2 +- .../core/src/runtime/methods/turn-stop.ts | 2 +- .../runtime/methods/turn-tool-visibility.ts | 34 + .../core/src/runtime/methods/turn-tools.ts | 266 +- .../packages/core/src/runtime/methods/turn.ts | 61 +- .../methods/workspace-generate-text.ts | 6 +- .../packages/core/src/runtime/types.ts | 50 +- .../core/src/session-context/parts.ts | 2 + .../session-context/read-session-context.ts | 3 + .../core/src/session-context/topic-archive.ts | 105 + .../src/session-context/topic-resource.ts | 150 + .../core/src/subagent/borrowed-mcp-port.ts | 2 +- .../src/subagent/completion-notification.ts | 21 +- .../core/src/subagent/context-builder.ts | 17 +- .../core/src/subagent/coordinator-response.ts | 2 +- .../packages/core/src/subagent/definitions.ts | 41 + .../packages/core/src/subagent/index.ts | 2 + .../packages/core/src/subagent/listing.ts | 70 + .../packages/core/src/subagent/mcp-config.ts | 64 +- .../core/src/subagent/persistent-memory.ts | 6 +- .../packages/core/src/subagent/profile.ts | 276 +- .../packages/core/src/subagent/runner.ts | 17 +- .../core/src/subagent/tool-event-mirror.ts | 66 +- .../packages/core/src/subagent/tool-policy.ts | 17 +- .../core/src/system-reminder/source.ts | 25 +- .../core/src/telemetry/runtime-telemetry.ts | 1 + .../packages/core/src/tool/compat.ts | 2 +- .../packages/core/src/tool/edit-matchers.ts | 2 +- .../tool/executor/background-task-output.ts | 18 +- .../src/tool/executor/background-tasks.ts | 91 +- .../core/src/tool/executor/call-runner.ts | 66 +- .../tool/executor/create-workflow-display.ts | 23 +- .../packages/core/src/tool/executor/events.ts | 10 +- .../packages/core/src/tool/executor/impl.ts | 1 + .../core/src/tool/executor/permission-flow.ts | 591 +- .../executor/permission-input-adjustments.ts | 105 + .../tool/executor/permission-input-recheck.ts | 80 +- .../src/tool/executor/permission-input.ts | 33 + .../src/tool/executor/permission-request.ts | 138 + .../executor/permission-responder-race.ts | 4 +- .../src/tool/executor/permission-response.ts | 111 + .../executor/permission-rules-persistence.ts | 78 +- .../executor/result-content-projection.ts | 6 +- .../src/tool/executor/result-serialization.ts | 2 +- .../packages/core/src/tool/executor/types.ts | 3 + .../src/tool/executor/workflow-artifact.ts | 21 +- .../packages/core/src/tool/handlers/agent.ts | 21 +- .../handlers/amend-workflow-description.ts | 4 +- .../tool/handlers/amend-workflow-resolve.ts | 32 +- .../tool/handlers/amend-workflow-retune.ts | 95 +- .../tool/handlers/amend-workflow-source.ts | 26 +- .../core/src/tool/handlers/amend-workflow.ts | 69 +- .../handlers/bash-background-lifecycle.ts | 2 +- .../src/tool/handlers/bash-command-parser.ts | 29 + .../bash-command-permission-policy.ts | 23 +- .../handlers/bash-command-rule-evaluator.ts | 6 +- .../core/src/tool/handlers/bash-cwd-policy.ts | 4 +- .../src/tool/handlers/bash-image-output.ts | 5 +- .../core/src/tool/handlers/bash-output.ts | 5 +- .../tool/handlers/bash-read-file-sources.ts | 4 +- .../core/src/tool/handlers/bash-semantics.ts | 157 +- .../packages/core/src/tool/handlers/bash.ts | 94 +- .../handlers/create-workflow-description.ts | 15 +- .../handlers/create-workflow-graph-bounds.ts | 94 +- .../tool/handlers/create-workflow-source.ts | 51 +- .../core/src/tool/handlers/create-workflow.ts | 94 +- .../packages/core/src/tool/handlers/cron.ts | 8 +- .../packages/core/src/tool/handlers/edit.ts | 2 +- .../eval-workflow-snippet-description.ts | 4 +- .../tool/handlers/eval-workflow-snippet.ts | 3 +- .../fill-workflow-hole-description.ts | 19 + .../handlers/fill-workflow-hole-resolve.ts | 331 + .../handlers/fill-workflow-hole-splice.ts | 28 + .../src/tool/handlers/fill-workflow-hole.ts | 373 + .../tool/handlers/get-workflow-run-format.ts | 38 + .../tool/handlers/get-workflow-run-summary.ts | 10 +- .../src/tool/handlers/get-workflow-run.ts | 21 +- .../packages/core/src/tool/handlers/glob.ts | 5 +- .../packages/core/src/tool/handlers/grep.ts | 2 +- .../core/src/tool/handlers/guarded/cmd.ts | 117 + .../core/src/tool/handlers/guarded/command.ts | 130 + .../core/src/tool/handlers/guarded/find.ts | 55 + .../core/src/tool/handlers/guarded/git.ts | 140 + .../core/src/tool/handlers/guarded/options.ts | 112 + .../tool/handlers/guarded/windows-delete.ts | 67 + .../core/src/tool/handlers/guarded/word.ts | 49 + .../src/tool/handlers/guarded/wrappers.ts | 35 + .../packages/core/src/tool/handlers/index.ts | 23 +- .../core/src/tool/handlers/node-repl.ts | 2 + .../core/src/tool/handlers/off-peak.ts | 4 +- .../core/src/tool/handlers/plan-mode.ts | 4 +- .../src/tool/handlers/read-session-context.ts | 30 +- .../core/src/tool/handlers/read-text.ts | 2 +- .../packages/core/src/tool/handlers/read.ts | 2 +- .../src/tool/handlers/reply-to-channel.ts | 145 + .../handlers/save-workflow-description.ts | 4 +- .../packages/core/src/tool/handlers/skill.ts | 33 +- .../src/tool/handlers/task-output-bash.ts | 4 +- .../core/src/tool/handlers/task-output.ts | 14 +- .../packages/core/src/tool/handlers/todo.ts | 4 +- .../src/tool/handlers/webfetch-processing.ts | 1 - .../core/src/tool/handlers/webfetch.ts | 2 +- .../core/src/tool/handlers/websearch.ts | 1 - .../src/tool/handlers/workflow-description.ts | 3 + .../handlers/workflow-draft-read-state.ts | 5 +- .../core/src/tool/handlers/workflow-drafts.ts | 6 +- .../src/tool/handlers/workflow-path-source.ts | 6 +- .../tool/handlers/workflow-script-models.ts | 227 + .../handlers/workflow-settings-adjustment.ts | 200 + .../src/tool/handlers/workflow-skill-gate.ts | 21 +- .../core/src/tool/handlers/workflow.ts | 138 + .../packages/core/src/tool/handlers/write.ts | 2 +- .../packages/core/src/tool/index.ts | 2 +- .../core/src/tool/input-normalization.ts | 6 +- .../tool/input-validation-model-content.ts | 2 +- .../core/src/tool/read-file-state-metadata.ts | 7 +- .../packages/core/src/tool/read-file-state.ts | 19 +- .../src/tool/result-persistence-format.ts | 2 +- .../packages/core/src/tool/tool-visibility.ts | 2 +- .../packages/core/src/tool/types.ts | 35 +- apps/ccbuddy-cli/packages/debug/package.json | 9 +- .../packages/debug/server/analyzer.ts | 2 +- .../packages/debug/server/network-capture.ts | 2 + .../packages/debug/src/gantt-style.ts | 2 +- .../dynamic-workflow-runtime/README.md | 9 +- .../dynamic-workflow-runtime/package.json | 10 +- .../src/child-cell-streams.ts | 145 + .../src/child-source.ts | 81 +- .../dynamic-workflow-runtime/src/harness.ts | 32 +- .../dynamic-workflow-runtime/src/protocol.ts | 12 +- .../packages/dynamic-workflow/.oxlintrc.json | 20 +- .../packages/dynamic-workflow/README.md | 56 +- .../packages/dynamic-workflow/package.json | 13 +- .../src/analysis/actor-models.ts | 237 + .../src/analysis/actor-names.ts | 6 +- .../dynamic-workflow/src/analysis/analyze.ts | 31 +- .../src/analysis/artifact-types.ts | 8 + .../src/analysis/artifacts.ts | 19 +- .../src/analysis/callbacks.ts | 21 + .../dynamic-workflow/src/analysis/calls.ts | 35 + .../src/analysis/causality-graph-lanes.ts | 10 + .../src/analysis/causality-graph-types.ts | 13 +- .../src/analysis/causality-graph.ts | 22 +- .../src/analysis/causality-order-calls.ts | 67 +- .../src/analysis/causality-order-state.ts | 25 +- .../src/analysis/causality-order-types.ts | 12 + .../src/analysis/causality-order.ts | 6 +- .../src/analysis/core-json.ts | 7 +- .../dynamic-workflow/src/analysis/core.ts | 53 +- .../dynamic-workflow/src/analysis/domain.ts | 8 +- .../src/analysis/facade-misuse.ts | 9 +- .../src/analysis/flow-graph.ts | 23 +- .../src/analysis/flow-phase.ts | 45 +- .../src/analysis/flow-strands.ts | 2 +- .../dynamic-workflow/src/analysis/graph.ts | 19 +- .../dynamic-workflow/src/analysis/hole-id.ts | 47 + .../src/analysis/hole-sites.ts | 269 + .../src/analysis/hole-splice.ts | 134 + .../src/analysis/interpret.ts | 17 + .../dynamic-workflow/src/analysis/mermaid.ts | 12 + .../src/analysis/phase-graph.ts | 7 +- .../src/analysis/serialize.ts | 17 +- .../src/analysis/site-phases.ts | 68 + .../src/analysis/sites-labels.ts | 36 +- .../dynamic-workflow/src/analysis/sites.ts | 86 +- .../dynamic-workflow/src/analysis/state.ts | 10 +- .../dynamic-workflow/src/analysis/types.ts | 4 +- .../dynamic-workflow/src/compiler/compile.ts | 5 + .../src/engine/cached-ask-facts.ts | 52 + .../src/engine/concurrency.ts | 107 +- .../src/engine/engine-artifacts-primary.ts | 10 +- .../src/engine/engine-artifacts.ts | 12 +- .../src/engine/engine-config.ts | 91 + .../src/engine/engine-holes.ts | 226 + .../src/engine/engine-launch.ts | 28 +- .../src/engine/engine-phase-stamp.ts | 19 +- .../src/engine/engine-report.ts | 32 +- .../src/engine/engine-resume.ts | 44 + .../src/engine/engine-state.ts | 19 +- .../src/engine/engine-world.ts | 11 +- .../dynamic-workflow/src/engine/engine.ts | 195 +- .../dynamic-workflow/src/engine/errors.ts | 22 +- .../src/engine/hash-mismatch.ts | 20 + .../src/engine/imported-cache-types.ts | 5 +- .../src/engine/imported-cache.ts | 22 +- .../dynamic-workflow/src/engine/index.ts | 16 + .../src/engine/journal-memory.ts | 124 +- .../src/engine/journal-read-types.ts | 92 + .../dynamic-workflow/src/engine/persona.ts | 45 + .../src/engine/replay-order.ts | 51 +- .../src/engine/scheduler-types.ts | 60 +- .../dynamic-workflow/src/engine/scheduler.ts | 188 +- .../dynamic-workflow/src/engine/types.ts | 184 +- .../dynamic-workflow/src/facade/dts-hole.ts | 27 + .../dynamic-workflow/src/facade/dts-model.ts | 18 + .../dynamic-workflow/src/facade/dts-stream.ts | 42 + .../dynamic-workflow/src/facade/dts.ts | 287 +- .../dynamic-workflow/src/facade/registry.ts | 41 +- .../src/facade/report-caps.ts | 30 +- .../packages/dynamic-workflow/src/index.ts | 40 + .../src/lowering/lower-hole.ts | 88 + .../dynamic-workflow/src/lowering/lower.ts | 73 +- .../dynamic-workflow/src/projections.ts | 3 + apps/ccbuddy-cli/packages/i18n/package.json | 3 + .../packages/i18n/src/locales/en-US.ts | 6 +- .../packages/i18n/src/locales/zh-CN.ts | 6 +- .../.ccbuddy-plugin/plugin.json | 2 +- .../packages/node-repl-host/package.json | 6 +- .../packages/node-repl-host/scripts/build.mjs | 1 + .../node-repl-host/src/browser-bridge.ts | 20 +- .../node-repl-host/src/runtime-bridge.ts | 1 - .../packages/node-repl-host/src/server.ts | 2 +- .../node-repl-host/src/tool-contract.ts | 4 +- .../packages/shared-types/src/index.ts | 1 - .../packages/telemetry/package.json | 5 +- .../telemetry/src/agent-trace-runtime.ts | 13 + .../telemetry/src/agent-trace-support.ts | 2 +- .../telemetry/src/model-api-recorder.ts | 3 + .../packages/telemetry/src/otlp-exporter.ts | 14 +- .../src/request-observation-target.ts | 6 + .../src/request-security-edition/index.ts | 6 + apps/ccbuddy-cli/packages/tui/package.json | 2 + .../packages/tui/src/app-approval-panel.tsx | 5 +- .../packages/tui/src/app-approval.ts | 17 +- .../packages/tui/src/app-compact-timeline.ts | 10 +- .../packages/tui/src/app-empty-transcript.tsx | 19 +- .../packages/tui/src/app-file-mentions.ts | 4 +- .../packages/tui/src/app-input-pane.tsx | 38 +- .../packages/tui/src/app-input-status.tsx | 8 +- .../ccbuddy-cli/packages/tui/src/app-input.ts | 2 +- .../packages/tui/src/app-markdown-theme.ts | 7 +- .../packages/tui/src/app-markdown.tsx | 2 +- .../packages/tui/src/app-mode-command.ts | 8 +- .../tui/src/app-mode-suggestion-panel.tsx | 2 +- apps/ccbuddy-cli/packages/tui/src/app-mode.ts | 2 +- .../packages/tui/src/app-model-ref.ts | 2 +- .../packages/tui/src/app-motion.tsx | 24 +- .../tui/src/app-session-event-handler.ts | 11 +- .../packages/tui/src/app-shiki-diff-view.tsx | 28 +- .../packages/tui/src/app-shiki-highlighter.ts | 15 +- .../packages/tui/src/app-sidebar-layout.ts | 8 +- .../packages/tui/src/app-submit.ts | 2 +- .../tui/src/app-thought-components.tsx | 4 +- .../packages/tui/src/app-tool-transcript.ts | 4 + .../ccbuddy-cli/packages/tui/src/app-view.tsx | 2 +- .../packages/tui/src/app-workflow-card.tsx | 2 +- .../packages/tui/src/app-workflow-seed.ts | 8 +- apps/ccbuddy-cli/packages/tui/src/tui.tsx | 5 +- apps/ccbuddy-cli/packages/tui/src/types.ts | 5 +- .../tools/prompt-trajectory/README.md | 42 +- .../tools/prompt-trajectory/package.json | 3 +- .../tools/prompt-trajectory/src/cli.ts | 30 +- .../tools/prompt-trajectory/src/derive.ts | 21 +- .../tools/prompt-trajectory/src/model-io.ts | 10 +- .../src/openai-provider-proxy.ts | 7 +- .../tools/prompt-trajectory/src/record.ts | 12 +- .../tools/prompt-trajectory/src/testcases.ts | 216 + .../tools/prompt-trajectory/tsconfig.json | 2 +- apps/ccbuddy-cli/turbo.json | 18 +- architecture-policy.yaml | 6 + config/README.md | 4 +- harness/remote/README.md | 3 +- knip.json | 33 +- mise.toml | 4 + packages/ccbuddy-cua/broker-server.d.ts | 8 + packages/ccbuddy-cua/broker-server.js | 19 + packages/ccbuddy-cua/package.json | 1 + packages/ccbuddy-server-cli/package.json | 6 +- .../src/ipc/controlClient.ts | 21 +- .../ccbuddy-server-cli/src/packaging/stage.ts | 231 +- .../src/packaging/stageCli.ts | 111 +- .../src/platform/serviceManager.ts | 102 +- .../src/runtime/immutableRelease.ts | 10 +- .../src/runtime/installationOwnership.ts | 38 +- .../ccbuddy-server-cli/src/runtime/paths.ts | 27 +- .../src/runtime/releaseDownload.ts | 36 +- .../src/runtime/releaseInstaller.ts | 47 +- .../src/runtime/serviceInstallation.ts | 65 +- .../src/runtime/stableLauncher.ts | 4 +- .../src/runtime/statusSnapshot.ts | 17 +- .../src/runtime/updatePreparation.ts | 48 +- .../src/server-core/core.ts | 8 +- .../src/server-core/http.ts | 26 +- .../src/server-core/parentDisconnect.ts | 2 +- .../src/server-core/taskActivityTracker.ts | 6 +- .../src/supervisor/supervisor.ts | 123 +- packages/ccbuddy-server-cli/tsconfig.json | 6 +- packages/client/src/globals.d.ts | 64 + packages/client/src/index.ts | 12 + packages/client/src/remoteServiceAccess.ts | 20 + ...emoteControlAcknowledgedRelayBatchQueue.ts | 92 + ...bRemoteControlAcknowledgedRelayDeadline.ts | 82 + ...bRemoteControlAcknowledgedRelayProtocol.ts | 384 + ...teControlAcknowledgedRelayProtocolTypes.ts | 155 + .../webRemoteControlRelayPayloadSerializer.ts | 52 + .../src/webRemoteControlRelayProtocol.ts | 224 + packages/desktop/build/installer.nsh | 28 +- packages/desktop/electron-builder.config.js | 253 +- .../windows-browser-import-helper/Program.cs | 2 +- packages/desktop/package.json | 39 +- packages/desktop/scripts/bundle.mjs | 15 +- .../desktop/scripts/computer-use-producer.mjs | 35 + .../desktop/scripts/devElectronAppBundle.mjs | 16 +- .../scripts/prepare-agent-node-bundle.mjs | 165 +- .../scripts/prepare-runtime-assets.mjs | 8 +- .../desktop/scripts/sharp-package-assets.mjs | 374 + .../scripts/windows-cua-helper-assets.mjs | 983 ++ .../desktop/src/host/botGroupTaskScope.ts | 16 + .../src/host/browserControlMainBridge.ts | 6 +- packages/desktop/src/host/cronBotDelivery.ts | 3 + packages/desktop/src/host/cronRunLifecycle.ts | 11 +- .../src/host/hostMemoryDiagnosticsLog.ts | 2 +- .../desktop/src/host/hostMessagePortGuard.ts | 4 +- .../desktop/src/host/hostNetworkCapture.ts | 22 + .../src/host/hostRemoteWorkspaceProxyState.ts | 4 +- .../host/hostResourceTelemetryEnvironment.ts | 8 +- .../desktop/src/host/hostResourceUsage.ts | 8 +- .../src/host/hostSelfResourceTelemetry.ts | 4 +- .../desktop/src/host/hostShutdownPhases.ts | 2 +- .../src/host/hostUncaughtExceptionGuard.ts | 4 +- .../src/host/hostWorkspaceTaskTracker.ts | 4 +- packages/desktop/src/host/index.ts | 264 +- .../host/legacyRemoteWorkspaceRpcContract.ts | 4 +- .../desktop/src/host/offPeakDispatchPlan.ts | 6 +- .../src/host/remoteDynamicWorkflowUserMode.ts | 31 + .../host/remoteMediaPreviewProxyHelpers.ts | 2 +- .../src/host/remotePromptAttachments.ts | 8 +- .../host/remoteProviderProvisioningService.ts | 21 +- .../host/remoteWorkspaceCloudBoundary.test.ts | 2 + .../host/remoteWorkspaceServiceCollection.ts | 221 +- .../src/host/serverRemoteConnection.ts | 280 + .../desktop/src/host/taskRealtimeBridge.ts | 2 +- .../src/host/windowHostAttachmentRegistry.ts | 8 +- .../host/windowHostControllerProjection.ts | 2 +- .../src/host/windowHostControllerService.ts | 2 +- .../host/windowRemoteConnectionRegistry.ts | 79 +- .../src/host/windowTopicResourceRelay.ts | 48 + packages/desktop/src/main/about.ts | 27 +- packages/desktop/src/main/appARMSBootstrap.ts | 196 +- .../desktop/src/main/appShutdownPolicy.ts | 4 +- packages/desktop/src/main/applicationIcons.ts | 16 +- .../src/main/armsBrowserPerfLoadNudge.ts | 2 +- packages/desktop/src/main/armsUserIdentity.ts | 8 +- packages/desktop/src/main/autoUpdater.ts | 243 +- .../desktop/src/main/browserDataManager.ts | 35 +- .../browserCloseTabNotification.ts | 2 +- .../main/browserView/browserGuestManager.ts | 37 +- .../browserPlaywrightDomSnapshot.ts | 4 +- .../browserView/browserPlaywrightExecutor.ts | 4 +- .../browserPlaywrightLocatorExecutor.ts | 213 +- .../browserView/browserPlaywrightTimeout.ts | 2 +- .../browserScreenshotTransientRetry.ts | 2 +- .../browserView/browserTabRecoveryStore.ts | 8 +- .../browserView/browserTabResidencyPolicy.ts | 8 +- .../browserView/browserVirtualClipboard.ts | 48 +- .../electronBrowserWebmRecorder.ts | 8 +- .../src/main/ccbuddyDataSizeScanner.ts | 2 +- .../desktop/src/main/chromeCookieManager.ts | 2 +- .../src/main/chromeExecutableDiscovery.ts | 54 +- .../src/main/chromeLocalStorageManager.ts | 6 +- .../src/main/chromeProfileDiscovery.ts | 2 +- .../desktop/src/main/crashDumpAnnotations.ts | 8 +- .../src/main/cuaAccessibilitySettings.ts | 12 +- packages/desktop/src/main/cuaOsSupport.ts | 4 +- .../src/main/cuaPermissionDragPanel.ts | 4 +- .../src/main/cuaPermissionPanelPositioner.ts | 2 +- .../desktop/src/main/cuaPipFocusRouter.ts | 6 +- .../main/cuaSystemSettingsWindowWatcher.ts | 4 +- .../src/main/desktopApplicationMenu.ts | 69 +- .../src/main/desktopArchitectureGuard.ts | 12 +- .../src/main/desktopArmsCustomEvent.ts | 4 +- .../desktop/src/main/desktopBrowserDataIpc.ts | 63 +- .../desktop/src/main/desktopBrowserViewIpc.ts | 2 +- .../main/desktopCCbuddyDataSizeTelemetry.ts | 28 +- ...opChromiumHardwareAccelerationBootstrap.ts | 6 +- .../src/main/desktopCommandHandlers.ts | 85 +- .../src/main/desktopContextPromptRollout.ts | 11 +- .../desktop/src/main/desktopCrashCapture.ts | 16 +- .../src/main/desktopCuaHelperInstaller.ts | 4 +- .../src/main/desktopDataBaseDirBootstrap.ts | 4 +- packages/desktop/src/main/desktopDeviceMid.ts | 28 +- .../desktop/src/main/desktopElectronApp.ts | 6 +- .../desktop/src/main/desktopHostProcess.ts | 19 +- .../src/main/desktopLinuxAppImageIcon.ts | 4 +- .../main/desktopLinuxDeepLinkRegistration.ts | 8 +- .../desktop/src/main/desktopMainIpcHelpers.ts | 16 + .../src/main/desktopMainIpcPlatform.ts | 80 +- .../desktop/src/main/desktopMainIpcRemote.ts | 23 +- .../desktop/src/main/desktopNetworkPolicy.ts | 25 +- .../src/main/desktopNetworkTelemetry.ts | 43 +- .../desktop/src/main/desktopNotifications.ts | 11 +- .../desktop/src/main/desktopOAuthDeepLink.ts | 10 +- .../desktop/src/main/desktopProviderConfig.ts | 5 +- .../desktop/src/main/desktopRemoteSessions.ts | 38 +- .../main/desktopRemoteUsageArmsTelemetry.ts | 55 +- .../src/main/desktopResourceTelemetry.ts | 8 +- .../desktop/src/main/desktopRuntimeEnv.ts | 53 +- packages/desktop/src/main/desktopSaveFile.ts | 13 +- .../src/main/desktopStabilityTelemetry.ts | 55 +- .../desktop/src/main/desktopTelemetryFetch.ts | 2 +- packages/desktop/src/main/desktopTray.ts | 24 +- .../desktop/src/main/desktopTraySupport.ts | 241 + .../src/main/desktopWebRemoteControlIpc.ts | 149 + .../src/main/desktopWindowButtonPosition.ts | 35 +- .../desktop/src/main/desktopWindowChrome.ts | 51 +- .../src/main/desktopWindowChromeState.ts | 4 +- .../src/main/desktopWindowLifecycle.ts | 20 +- .../desktopWindowsOpenFolderContextMenu.ts | 8 +- .../src/main/desktopWslTargetResolver.ts | 5 +- packages/desktop/src/main/editors.ts | 2 +- .../src/main/embeddedBrowserBluetoothGuard.ts | 107 + .../src/main/embeddedBrowserDeviceOptions.ts | 30 + .../main/embeddedBrowserJavaScriptDialog.ts | 9 +- .../main/embeddedBrowserPermissionPolicy.ts | 398 + .../main/embeddedBrowserPermissionUiBridge.ts | 282 + .../embeddedBrowserSitePermissionStore.ts | 52 + .../main/embeddedBrowserSitePermissions.ts | 92 + packages/desktop/src/main/exportLogs.ts | 28 +- packages/desktop/src/main/forceUpdateGuard.ts | 18 +- .../desktop/src/main/forceUpdatePrompt.ts | 68 +- .../src/main/localMediaPreviewProtocol.ts | 2 +- packages/desktop/src/main/logRetention.ts | 7 +- packages/desktop/src/main/logger.ts | 35 + .../src/main/longTaskAttributionSummary.ts | 8 +- .../src/main/manifestUpdateProvider.ts | 6 +- .../src/main/mcpUserDirectory/index.ts | 80 +- .../src/main/mcpUserDirectory/types.ts | 17 +- .../src/main/mcpUserDirectory/utils.ts | 18 + .../desktop/src/main/networkCaptureBuffer.ts | 43 + .../src/main/networkTelemetryAggregator.ts | 4 +- .../desktop/src/main/observeBeforeRequest.ts | 54 + .../main/processResourceExternalAppSamples.ts | 6 +- .../main/processResourceRendererHeapSource.ts | 2 +- .../src/main/processResourceRoleClassifier.ts | 6 +- .../main/processResourceWindowAggregator.ts | 2 +- .../src/main/processResourceWindowEvent.ts | 2 +- packages/desktop/src/main/remoteCdn.ts | 121 +- .../src/main/rendererActionTraceExporter.ts | 2 +- .../src/main/rendererActionTraceIpc.ts | 12 +- .../src/main/rendererActionTraceRollout.ts | 4 +- .../main/request-security-edition/index.ts | 8 + .../src/main/resourceManagerNetwork.ts | 123 + .../src/main/resourceManagerStorage.ts | 2 +- .../desktop/src/main/resourceManagerWindow.ts | 9 +- .../desktop/src/main/singleFeatureRollout.ts | 8 +- packages/desktop/src/main/startupWorkspace.ts | 31 +- .../src/main/startupWorkspaceDeepLinkGate.ts | 2 +- .../src/main/storageScanWorkerProtocol.ts | 2 +- packages/desktop/src/main/unreadBadge.ts | 2 +- .../src/main/webRemoteControlFeatureGate.ts | 17 + .../src/main/webRemoteControlManager.ts | 1662 +++ .../main/webRemoteControlRelayAuthProvider.ts | 24 + ...ebRemoteControlRelayAuthStorageProvider.ts | 103 + .../main/webRemoteControlRendererReconnect.ts | 53 + .../webRemoteControlSharedHostAttachments.ts | 189 + .../src/main/webRemoteControlStatusEvents.ts | 26 + .../src/main/webRemoteControlTransport.ts | 790 ++ packages/desktop/src/main/windowsAumidIcon.ts | 2 +- .../src/main/windowsChromeAppBoundKey.ts | 9 +- .../src/main/windowsCuaOperationIndicator.ts | 4 +- .../windowsCuaOperationIndicatorContent.ts | 4 +- .../src/main/windowsInstallResourceLocks.ts | 27 +- .../desktop/src/main/workflowArtifactFile.ts | 136 + .../embeddedBrowserJavaScriptDialog.ts | 43 + .../src/preload/embeddedBrowserWheel.ts | 2 +- packages/desktop/src/preload/index.ts | 91 + .../desktop/src/preload/resourceManager.ts | 7 + .../src/renderer/cua-permission-panel.html | 2 + .../renderer/cuaPermissionPanelMessages.ts | 2 +- packages/desktop/src/renderer/index.html | 51 +- .../src/renderer/src/desktopPlatform.ts | 63 +- packages/desktop/src/renderer/src/main.tsx | 16 +- .../src/remoteWorkspaceSessionServices.ts | 9 + .../src/renderer/src/resource-manager.tsx | 8 +- .../src/scheduler/manualClaimRelease.ts | 12 +- .../scheduler/offPeakDispatchSettlement.ts | 6 +- .../scheduler/schedulerResourceTelemetry.ts | 2 +- .../src/shared/armsRumBridgeForward.ts | 8 +- packages/desktop/src/shared/armsRumShared.ts | 2 +- packages/desktop/tsconfig.json | 3 +- packages/desktop/tsconfig.scheduler.json | 24 +- packages/desktop/tsup.config.ts | 153 +- packages/desktop/vite.config.ts | 30 +- packages/formal-proof/README.md | 2 + packages/formal-proof/src/styles.css | 7 +- packages/model-option-map/package.json | 4 +- packages/provider-node/package.json | 5 +- packages/provider/package.json | 4 +- .../src/config/provider-data-schema.ts | 4 +- .../provider/src/config/rule-data-schema.ts | 2 +- packages/rpc/package.json | 3 +- .../bundledCCbuddyBuiltinProviderConfig.ts | 2 +- packages/server/src/entry-http.ts | 5 +- packages/server/src/entry-stdio.ts | 26 +- packages/server/src/http.ts | 23 +- .../src/remote/ccbuddyAgentDevDeploy.ts | 24 + .../ccbuddyAgentOfficialPluginAssets.ts | 46 +- packages/server/src/remote/connect.ts | 21 +- packages/server/src/remote/create-backend.ts | 2 + packages/server/src/stdio.ts | 17 +- packages/server/src/stdioDeviceMid.ts | 10 +- packages/server/src/stdioServices.ts | 9 +- packages/server/tsup.config.ts | 11 +- packages/services/package.json | 12 +- packages/services/src/accessor.ts | 8 + .../src/bigmodel/codingPlanEntitlement.ts | 4 +- .../services/src/bigmodel/teamPlanApiKey.ts | 40 +- .../services/src/bots/botConfigHelpers.ts | 7 + .../src/bots/botRemoteWorkspaceBridge.ts | 5 +- packages/services/src/bots/bots.ts | 50 + packages/services/src/bots/botsService.ts | 4074 +++++++- .../src/bots/channelMentionResolver.ts | 100 + packages/services/src/bots/channelReply.ts | 225 + packages/services/src/bots/commandParser.ts | 14 + .../services/src/bots/feishuChannelRuntime.ts | 14 +- .../services/src/bots/groupAdminAttention.ts | 53 + .../src/bots/groupDeliveryThrottle.ts | 12 + packages/services/src/bots/groupQueueCard.ts | 50 + packages/services/src/bots/groupReply.ts | 12 + .../services/src/bots/groupResultDelivery.ts | 92 + packages/services/src/bots/groupSessions.ts | 37 + packages/services/src/bots/messages.ts | 21 + .../src/bots/providers/feishuGroupMessages.ts | 154 + .../src/bots/providers/feishuProvider.ts | 1125 ++- .../src/bots/providers/groupInputReaction.ts | 45 + .../bots/providers/groupMemberDirectory.ts | 46 + .../src/bots/providers/telegramProvider.ts | 47 +- packages/services/src/bots/providers/types.ts | 29 +- packages/services/src/bots/taskStreamHub.ts | 51 + .../src/bots/telegramChannelRuntime.ts | 122 +- .../services/src/bots/topicContinuation.ts | 112 + packages/services/src/bots/topicHistory.ts | 93 + .../src/bots/topicHistoryAttachment.ts | 73 + .../src/bots/topicPreparationState.ts | 76 + packages/services/src/bots/topicResource.ts | 163 + .../services/src/bots/weixinChannelRuntime.ts | 29 +- .../src/ccbuddy-agent/agentTelemetryEnv.ts | 6 +- .../src/ccbuddy-agent/botTopicAdmission.ts | 33 + .../src/ccbuddy-agent/ccbuddyAgent.ts | 112 +- .../ccbuddyAgentConnectionScope.ts | 2 +- .../ccbuddyAgentPresentationSurface.ts | 2 +- .../ccbuddyAgentProcessManager.ts | 110 +- .../src/ccbuddy-agent/ccbuddyAgentService.ts | 697 +- .../ccbuddyAgentWorkflowParams.ts | 26 +- .../ccbuddy-agent/ccbuddyProtocolClient.ts | 47 +- .../ccbuddySessionEventCoalescer.ts | 4 +- .../ccbuddy-agent/ccbuddyStdioTapDevConfig.ts | 6 +- .../ccbuddy-agent/ccbuddyStdioTransport.ts | 34 +- .../ccbuddy-agent/ccbuddyTaskIndexSyncer.ts | 7 +- .../ccbuddyTaskServiceAdapter.ts | 605 +- .../src/ccbuddy-agent/ccbuddyV4HostCommand.ts | 20 +- .../ccbuddy-agent/cuaOperationTurnTracker.ts | 2 +- .../ccbuddy-agent/groupAttachmentUpload.ts | 84 + .../src/ccbuddy-agent/groupRuntimeSnapshot.ts | 126 + .../localRuntimeNetworkCapture.ts | 66 + .../src/ccbuddy-agent/topicResourceBridge.ts | 78 + .../src/ccbuddy-agent/topicResourcePeers.ts | 72 + .../src/ccbuddy-agent/topicResourceRelay.ts | 138 + .../topicResourceRelayChannel.ts | 79 + .../ccbuddy-agent/topicResourceRelayClient.ts | 88 + .../src/ccbuddy-agent/topicResourceUpload.ts | 85 + .../src/ccbuddy-session/ccbuddySession.ts | 15 +- .../ccbuddy-session/ccbuddySessionService.ts | 6 +- .../src/cloud-content/cloudContent.ts | 13 + .../src/cloud-content/cloudContentService.ts | 149 + .../src/cloud-content/contentBundleCache.ts | 318 + .../bigmodelCodingPlanSubscriptionProvider.ts | 256 +- .../codingPlanSubscription.ts | 11 +- .../codingPlanSubscriptionService.ts | 20 +- .../conversation-share/conversationShare.ts | 8 +- .../conversationShareArtifactDiscovery.ts | 18 +- .../conversationShareHttpClient.ts | 86 +- .../conversationShareInlineImages.ts | 101 + .../conversationShareIntegrity.ts | 2 +- .../conversationSharePublicProjection.ts | 4 +- .../conversationShareService.ts | 84 +- .../sharedContextFormatter.ts | 4 +- .../cuaStandaloneStatusLaunch.ts | 24 + .../src/cua-permission-broker/index.ts | 10 +- .../stableCuaTransport.ts | 51 + .../windowsCuaDevRuntime.ts | 6 +- .../windowsCuaHelperHostSupport.ts | 10 +- .../src/feedback/feedbackLogArchive.ts | 149 +- packages/services/src/file/fileService.ts | 4 +- .../services/src/file/workspaceFileIgnore.ts | 73 +- .../src/fileWatcher/fileWatcherService.ts | 7 +- packages/services/src/fs/atomicFileUtils.ts | 23 +- packages/services/src/fs/fsFaultInjection.ts | 24 +- .../src/git/gitCommitMessageGenerator.ts | 8 +- .../services/src/highspeed/highspeedCard.ts | 18 + .../src/highspeed/highspeedCardService.ts | 382 + .../src/highspeed/highspeedHttpTransport.ts | 305 + .../src/highspeed/highspeedMockTransport.ts | 62 + .../src/hooks/workspaceHookSettingsModel.ts | 2 +- packages/services/src/index.ts | 13 + .../marketing-touch/marketingAssetRegistry.ts | 119 + .../src/marketing-touch/marketingTouch.ts | 15 + .../marketing-touch/marketingTouchService.ts | 80 + .../services/src/mcp-sync/mcpSyncService.ts | 219 +- packages/services/src/memory/memory.ts | 40 +- packages/services/src/memory/memoryService.ts | 168 +- .../accountProjectTokenClient.ts | 52 + .../accountProviderApiKeyResolver.ts | 135 +- .../accountProviderConnectionResolver.ts | 15 +- .../accountProviderCredentialKey.ts | 2 +- .../accountProviderCredentialService.ts | 119 +- .../accountProviderInvalidation.ts | 2 +- .../accountProviderRequestAuthService.ts | 70 +- .../accountProviderTeamPlanRequestKey.ts | 165 +- .../ccbuddyBuiltinRemoteConfig.ts | 2 +- .../codingPlanProviderAvailability.ts | 10 +- .../legacyCCbuddyConfigProviderReader.ts | 2 +- .../legacyModelProviderSerialized.ts | 101 +- .../providerProvisioningSource.ts | 17 +- .../providerProvisioningTarget.ts | 31 +- packages/services/src/node.ts | 718 +- .../src/oauth/oauthUnauthorizedRequest.ts | 91 +- .../oauth/providers/bigmodelProviderConfig.ts | 2 +- .../src/oauth/providers/zaiProviderConfig.ts | 2 +- .../official-mcp/officialMcpCredentials.ts | 8 +- .../official-mcp/officialMcpIssuanceAudit.ts | 2 +- .../services/src/output-style/outputStyle.ts | 44 + .../src/output-style/outputStyleService.ts | 277 + packages/services/src/paths.ts | 20 +- .../src/plugin-sync/pluginSyncArchive.ts | 36 +- .../src/plugins/installedPluginRoots.ts | 8 +- .../src/plugins/pluginManagementService.ts | 2 +- .../src/process/processResourceSampler.ts | 18 +- .../src/providers/api/nodeApiClient.ts | 105 +- .../src/providers/api/nodeApiNetwork.ts | 2 +- .../src/runtime-tools/agentProxyEnv.ts | 6 +- .../services/src/runtime-tools/appCaCert.ts | 4 +- .../src/runtime-tools/clientPlatform.ts | 4 +- .../services/src/runtime-tools/nodeEnv.ts | 4 +- .../src/runtime-tools/runtimeCommandEnv.ts | 2 +- .../src/runtime-tools/runtimeToolResolver.ts | 24 +- .../services/src/session/automationCron.ts | 2 +- .../services/src/session/automationRepo.ts | 2 +- .../services/src/session/automationService.ts | 8 +- .../src/session/ccbuddyTaskService.ts | 103 +- .../buildImportedClaudeTaskFile.ts | 2 +- .../claudeNativeSessionImportParser.ts | 244 +- .../claudeNativeSessionImportRepo.ts | 2 +- .../importedClaudeHistoryRepair.ts | 50 +- .../persistImportedClaudeTask.ts | 2 +- .../src/session/offPeakMockGateway.ts | 14 +- .../src/session/offPeakRuntimeModel.ts | 7 +- .../src/session/offPeakServerClient.ts | 6 +- .../src/session/offPeakTaskService.ts | 25 +- .../src/session/sessionModeOptions.ts | 19 + .../services/src/session/taskIndexRepo.ts | 366 +- .../src/session/tasksDatabase/startup.ts | 2 +- .../src/setting/normalizeSettingsPatch.ts | 9 + .../src/setting/observableSettingService.ts | 4 +- .../src/setting/settingsWriteQueue.ts | 16 +- .../src/settings-sync/settingsSyncService.ts | 245 +- .../src/skill-sync/skillSyncArchive.ts | 32 +- .../src/skill-sync/skillSyncErrors.ts | 2 +- .../services/src/skills/skillDiscoveryWalk.ts | 2 +- packages/services/src/skills/skillsService.ts | 35 +- .../services/src/storage/adapters/fsWalker.ts | 6 +- .../storage/adapters/inProcessScanRunner.ts | 2 +- .../src/storage/adapters/rootsResolver.ts | 2 +- .../src/storage/adapters/volumeProbe.ts | 2 +- .../src/storage/app/storageService.ts | 4 +- .../services/src/storage/domain/cleanPlan.ts | 4 +- .../src/storage/domain/storageCatalog.ts | 2 +- .../src/storage/domain/usageAggregate.ts | 4 +- .../src/subagents/subagentConfigScope.ts | 343 + .../src/subagents/subagentMarkdown.ts | 13 +- .../src/subagents/subagentRuntimeConfig.ts | 230 + .../src/subagents/subagentsService.ts | 105 +- .../services/src/telemetry/telemetryCore.ts | 85 +- .../services/src/terminal/terminalService.ts | 32 +- .../providers/bigmodelUsageQuotaMapper.ts | 18 +- .../providers/bigmodelUsageQuotaProvider.ts | 108 +- .../providers/ccbuddyMcpQuotaProvider.ts | 9 +- .../services/src/usage-stats/usageStats.ts | 2 + .../src/usage-stats/usageStatsService.ts | 45 + packages/shared/package.json | 26 +- packages/shared/src/api-key-usage-scene.ts | 8 + packages/shared/src/attachment-source.ts | 5 + packages/shared/src/bots.ts | 376 +- packages/shared/src/browser-use/commands.ts | 4 +- .../shared/src/ccbuddy-agent-model-state.ts | 22 +- packages/shared/src/ccbuddy-agent-policy.ts | 25 +- packages/shared/src/ccbuddy-agent-runtime.ts | 2 +- .../src/ccbuddy-protocol-legacy-types.ts | 4 +- .../shared/src/ccbuddy-protocol-v4/apply.ts | 24 +- .../src/ccbuddy-protocol-v4/attachment-ref.ts | 3 + .../src/ccbuddy-protocol-v4/coalesce.ts | 11 +- .../shared/src/ccbuddy-protocol-v4/command.ts | 128 +- .../create-session-config.ts | 15 + .../create-workflow-display.ts | 48 +- .../shared/src/ccbuddy-protocol-v4/delta.ts | 5 +- .../shared/src/ccbuddy-protocol-v4/index.ts | 1 + .../src/ccbuddy-protocol-v4/input-intent.ts | 7 + .../shared/src/ccbuddy-protocol-v4/rows.ts | 33 +- .../sessions-index-workflow-activity.ts | 40 +- .../src/ccbuddy-protocol-v4/snapshot.ts | 1 + .../src/ccbuddy-protocol-v4/submission.ts | 2 +- .../src/ccbuddy-protocol-v4/toolDisplay.ts | 23 +- .../src/ccbuddy-protocol-v4/transport.ts | 26 +- .../src/ccbuddy-protocol-v4/wire-assembler.ts | 5 +- .../src/ccbuddy-protocol-v4/wire-fault.ts | 5 +- .../ccbuddy-protocol-v4/wire-reassembly.ts | 12 +- .../ccbuddy-protocol-v4/workflow-artifacts.ts | 66 +- .../workflow-command-rejections.ts | 30 + .../ccbuddy-protocol-v4/workflow-row-meta.ts | 25 +- .../workflow-run-settings-command.ts | 4 +- .../workflow-runs-actor-session.ts | 57 + .../workflow-runs-actor-status.ts | 5 +- .../ccbuddy-protocol-v4/workflow-runs-caps.ts | 9 +- .../workflow-runs-concurrency.ts | 72 +- .../workflow-runs-delta.ts | 11 +- .../workflow-runs-entries.ts | 50 +- .../workflow-runs-eviction.ts | 29 +- .../workflow-runs-holes.ts | 205 + .../workflow-runs-legacy.ts | 2 +- .../workflow-runs-phases.ts | 11 +- .../workflow-runs-reducer.ts | 57 +- .../workflow-runs-started.ts | 7 +- .../workflow-runs-tables.ts | 3 +- .../workflow-runs-unlisted.ts | 9 +- .../src/ccbuddy-protocol-v4/workflow-runs.ts | 129 +- packages/shared/src/ccbuddy-protocol/index.ts | 429 +- packages/shared/src/ccbuddy-protocol/trace.ts | 11 + .../src/ccbuddy-session-content-profile.ts | 62 + .../shared/src/ccbuddy-slash-command-help.ts | 366 +- .../shared/src/ccbuddy-task-mode-schema.ts | 14 +- .../shared/src/ccbuddy-task-types-core.ts | 25 +- packages/shared/src/ccbuddy-task-types.ts | 26 + packages/shared/src/ccbuddyEndpoint.ts | 262 +- packages/shared/src/channel-mention.ts | 131 + packages/shared/src/channels.ts | 117 + packages/shared/src/clientConfig.ts | 22 +- packages/shared/src/cloudContent.ts | 125 + .../shared/src/coding-plan-subscription.ts | 70 + .../conversation-message-projection-policy.ts | 2 + packages/shared/src/conversationSelection.ts | 37 + .../shared/src/dynamic-workflow-feature.ts | 73 +- packages/shared/src/env.ts | 26 +- packages/shared/src/errors.ts | 63 + packages/shared/src/execution-state.ts | 2 +- packages/shared/src/highspeed.ts | 230 + packages/shared/src/index.ts | 61 +- packages/shared/src/marketingTouch.ts | 185 + packages/shared/src/mcp.ts | 14 +- packages/shared/src/memory.ts | 9 + packages/shared/src/model-execution.ts | 48 + packages/shared/src/networkCapture.ts | 50 + packages/shared/src/node.ts | 1 + packages/shared/src/node/networkCapture.ts | 102 + .../shared/src/node/officialPluginCache.ts | 2 +- .../src/node/subagentMarkdownMigration.ts | 2 +- packages/shared/src/output-style.ts | 18 + packages/shared/src/platform.ts | 190 +- packages/shared/src/plugin-marketplaces.ts | 18 + .../shared/src/project-access-token-client.ts | 332 + .../src/project-access-token-response.ts | 9 + packages/shared/src/project-access-token.ts | 216 + packages/shared/src/protocol.ts | 42 +- packages/shared/src/provider-provisioning.ts | 28 +- packages/shared/src/providers.ts | 2 +- .../shared/src/remote-workspace-identity.ts | 56 +- packages/shared/src/remoteEnvironmentKey.ts | 17 + packages/shared/src/remoteTarget.ts | 25 +- packages/shared/src/remoteUsageTelemetry.ts | 79 + .../src/request-security-edition/index.ts | 2 + .../src/request-security-edition/policy.ts | 7 + .../verification-policy.ts | 46 + packages/shared/src/rewardsBridge.ts | 91 + packages/shared/src/rewardsEmbedded.ts | 66 + .../src/subagent-profile-frontmatter.ts | 243 + .../shared/src/subagent-profile-parser.ts | 226 + packages/shared/src/subagent-profile.ts | 62 + .../shared/src/subagent-runtime-config.ts | 51 + packages/shared/src/subagents-types.ts | 8 +- packages/shared/src/task-realtime-core.ts | 10 +- packages/shared/src/test-ids-workflow.ts | 6 + packages/shared/src/test-ids.ts | 22 + packages/shared/src/tool-identity.ts | 4 + packages/shared/src/tool-plan-adapter.ts | 18 +- packages/shared/src/usage-stats.ts | 14 + packages/shared/src/validation.ts | 384 +- packages/shared/src/validationAppSettings.ts | 63 +- .../src/web-remote-control-heartbeat.ts | 58 + .../src/web-remote-control-rpc-transport.ts | 766 ++ packages/shared/src/web-remote-control.ts | 1040 ++ packages/shared/tsconfig.json | 3 + packages/ui/package.json | 20 +- packages/ui/src/App.tsx | 114 +- packages/ui/src/AssistantPreviewCards.tsx | 17 +- packages/ui/src/BotsDialog.tsx | 16 +- .../ui/src/BotsDialog/BoundGroupsCard.tsx | 108 + .../src/BotsDialog/PrivateDeliveryRetry.tsx | 31 + .../src/BotsDialog/ProviderSettingsCard.tsx | 8 + .../src/ChatEmptyScratchWorkspaceDialog.tsx | 147 + packages/ui/src/ChatEmptyState.tsx | 103 +- packages/ui/src/ChatErrorBanner.tsx | 45 +- .../src/ChatMediaAttachmentPreviewDialog.tsx | 10 +- packages/ui/src/CodingPlanBillingDiscount.tsx | 329 + .../ui/src/CodingPlanUsageRemainingPanel.tsx | 11 +- .../src/ConversationSharePermissionPicker.tsx | 4 +- .../ui/src/DesktopOverlayWindowControls.tsx | 10 + packages/ui/src/DesktopTopOverlay.tsx | 10 +- packages/ui/src/DirectoryBrowser.tsx | 23 +- packages/ui/src/ElicitationDialog.tsx | 34 +- packages/ui/src/EmbeddedBrowserPaneParts.tsx | 32 +- packages/ui/src/GitBranchSwitcher.tsx | 102 +- packages/ui/src/GitPane/helpers.ts | 17 +- .../ui/src/InteractionRequestOriginBadge.tsx | 24 +- packages/ui/src/LexicalChatInput.tsx | 39 +- packages/ui/src/ModelConfigSelect.tsx | 20 +- packages/ui/src/ModelTrajectoryExpansion.ts | 2 +- packages/ui/src/ModelTrajectoryPane.tsx | 2 +- .../ui/src/ModelTrajectoryPaneDetails.tsx | 38 + packages/ui/src/ModelTrajectorySearch.ts | 4 +- packages/ui/src/PermissionDialog.tsx | 135 +- packages/ui/src/PreviewPane.tsx | 41 +- .../ui/src/RemoteConnectionDialogContent.tsx | 48 +- packages/ui/src/RemoteConnectionFields.tsx | 103 +- packages/ui/src/Root.tsx | 311 +- packages/ui/src/SSHDialog.tsx | 20 + packages/ui/src/SettingsPage.tsx | 66 +- packages/ui/src/SortableWorkspaceSidebar.tsx | 6 + packages/ui/src/TaskActionMenuContent.tsx | 43 +- packages/ui/src/TaskInteractionBadge.tsx | 6 +- packages/ui/src/TaskList.tsx | 7 +- packages/ui/src/TaskListItem.tsx | 157 +- packages/ui/src/TaskListItemContextMenu.tsx | 11 +- packages/ui/src/ToolCallBlocks.tsx | 2 +- .../ToolCallBlocks/QueuedSummaryContent.tsx | 14 +- .../ui/src/ToolCallBlocks/ToolSummaryRow.tsx | 2 +- .../ui/src/ToolCallBlocks/fileSummaryTypes.ts | 2 + .../renderers/ExecuteCommand.tsx | 72 + .../renderers/WorkflowRetuneRow.tsx | 31 +- .../ToolCallBlocks/renderers/agentHelpers.ts | 41 +- .../renderers/changes-group.tsx | 4 +- .../renderers/create-workflow.tsx | 43 +- .../renderers/createWorkflowHoleInput.ts | 75 + .../renderers/createWorkflowInput.ts | 86 +- .../ToolCallBlocks/renderers/cron-create.tsx | 45 +- .../ToolCallBlocks/renderers/cua-group.tsx | 4 +- .../ui/src/ToolCallBlocks/renderers/cua.tsx | 4 +- .../renderers/cuaAccessDetails.ts | 4 +- .../renderers/cuaErrorDetails.ts | 2 +- .../renderers/cuaResultState.ts | 10 +- .../src/ToolCallBlocks/renderers/execute.tsx | 26 +- .../src/ToolCallBlocks/renderers/explore.tsx | 2 +- .../ToolCallBlocks/renderers/list-models.tsx | 9 +- .../renderers/list-saved-workflows.tsx | 2 +- .../ui/src/ToolCallBlocks/renderers/mcp.tsx | 13 +- .../renderers/offpeak-create.tsx | 9 +- .../renderers/workflow-diagnostics.tsx | 2 +- .../renderers/workflow-draft-row.tsx | 6 +- .../renderers/workflow-fill-row.tsx | 99 + .../src/ToolCallBlocks/toolResultDisplay.ts | 13 +- packages/ui/src/WebRemoteControlDialog.tsx | 705 +- .../src/WebRemoteControlFeatureProvider.tsx | 25 + .../ui/src/WebRemoteControlMobileShell.tsx | 346 + .../ui/src/WebRemoteControlMobileTaskHome.tsx | 986 ++ packages/ui/src/WebRemoteControlTaskIndex.tsx | 618 ++ .../ui/src/WebRemoteControlTaskIndexRow.tsx | 283 + packages/ui/src/WebRemoteControlThemeMenu.tsx | 57 + packages/ui/src/WorkflowPermissionBlock.tsx | 146 +- packages/ui/src/WorkflowPermissionHoles.tsx | 43 + .../src/WorkspaceArchivedTasksFlatSection.tsx | 316 +- .../ui/src/WorkspaceEditorButtonGroup.tsx | 2 +- .../ui/src/WorkspaceGroupedTasksSection.tsx | 428 +- packages/ui/src/WorkspaceHeader.tsx | 14 + packages/ui/src/WorkspaceHeaderSections.tsx | 506 +- .../WorkspaceHeaderActionSection.tsx | 17 +- .../ui/src/WorkspaceHeaderSections/shared.ts | 5 + packages/ui/src/WorkspaceHelpMenuButton.tsx | 28 +- .../ui/src/WorkspacePinnedTasksSection.tsx | 10 +- packages/ui/src/WorkspacePluginPreview.tsx | 45 +- packages/ui/src/WorkspaceSidebar.tsx | 515 +- .../ReconnectingRemoteWorkspaceLogTooltip.tsx | 14 +- .../taskGroupTogglePresentation.ts | 12 +- packages/ui/src/WorkspaceSidebarFooter.tsx | 262 +- .../WorkspaceSidebarFooterPlanBadgeHelpers.ts | 2 +- .../WorkspaceSidebarFooterUsageSummary.tsx | 10 +- packages/ui/src/WorkspaceSidebarItem.tsx | 24 +- .../ui/src/WorkspaceTimelineTasksSection.tsx | 292 +- .../src/WorkspaceWebRemoteControlTrigger.tsx | 147 +- .../src/app-shell/AnimatedSidePanePanel.tsx | 84 +- .../ui/src/app-shell/SidePaneTabTrigger.tsx | 11 +- .../app-shell/SubagentDirectorySidePane.tsx | 12 +- .../src/app-shell/SubagentSessionSidePane.tsx | 3 + .../app-shell/WorkflowArtifactSidePane.tsx | 44 +- .../src/app-shell/WorkflowRunFillFrames.tsx | 147 + .../ui/src/app-shell/WorkflowRunHoleParts.tsx | 147 + .../app-shell/WorkflowRunPaneSaveSlots.tsx | 87 + .../ui/src/app-shell/WorkflowRunPhaseList.tsx | 414 +- .../src/app-shell/WorkflowRunPhasePills.tsx | 160 + .../ui/src/app-shell/WorkflowRunSidePane.tsx | 70 +- .../app-shell/WorkflowRunSidePaneSections.tsx | 49 +- .../src/app-shell/WorkflowRunSpineParts.tsx | 279 +- .../app-shell/WorkflowWorkspaceSidePane.tsx | 13 +- .../ui/src/app-shell/WorkspaceShellLayout.tsx | 4087 +++++--- .../app-shell/animatedSidePanePanelModel.ts | 28 +- .../src/app-shell/sidePaneTabPresentation.ts | 4 + .../src/app-shell/taskNavigationWorkspace.ts | 2 +- packages/ui/src/app-shell/types.ts | 25 +- .../app-shell/useWorkflowRunPaneSettings.ts | 2 +- .../app-shell/webRemoteNavigationLayout.ts | 98 + .../ArtifactOpenAsFileButton.tsx | 217 + .../WorkflowArtifactBody.tsx | 3 +- .../WorkflowArtifactTilePreview.tsx | 16 +- .../artifactPresentation.tsx | 23 + .../workflow-artifacts/presets/apply.ts | 69 +- .../workflow-artifacts/presets/spec.ts | 45 + packages/ui/src/app-shell/workflowRunPanel.ts | 10 +- packages/ui/src/app-shell/workflowRunSpine.ts | 224 +- .../ui/src/app-shell/workflowRunThrottle.ts | 46 +- .../src/app-shell/workflowWorkspaceLogbook.ts | 7 +- .../app-shell/workflowWorkspaceTranscript.ts | 12 +- .../ui/src/assets/highspeed/lightning.svg | 3 + .../src/assets/highspeed/share-card-light.svg | 3 + .../ui/src/assets/highspeed/share-card.svg | 57 + .../highspeed/share-dialog-noise-light.png | Bin 0 -> 81323 bytes .../assets/highspeed/share-dialog-noise.png | Bin 0 -> 81323 bytes .../model-provider-logo-sources.json | 2 +- .../src/browser-use/BrowserPermissionIcon.tsx | 46 + .../BrowserSitePermissionsPage.tsx | 136 + .../browser-use/BrowserSiteSettingsEntry.tsx | 74 + .../browser-use/BrowserUseSidePaneContent.tsx | 5 +- .../EmbeddedBrowserPermissionPrompts.tsx | 382 + .../ui/src/browser-use/UnifiedBrowserView.tsx | 38 +- .../browserPermissionCapabilities.ts | 38 + .../ui/src/browser-use/browserViewportZoom.ts | 2 +- .../useBrowserScreenshotSurfaceRequest.ts | 4 +- .../src/browser-use/useDesktopZoomFactor.ts | 2 +- .../CodingPlanContextUsage.tsx | 46 +- .../StartPlanContextBalance.tsx | 72 +- .../ThoughtLevelCycleControl.tsx | 2 +- .../codingPlanQuotaResetAutoPlay.ts | 2 +- .../codingPlanResetOpportunityBadge.ts | 17 +- .../contextQuotaResetOpportunityReminder.tsx | 12 +- .../src/chat-input-toolbar/contextUsage.tsx | 220 +- .../ui/src/chat-input-toolbar/display-help.ts | 4 + .../ui/src/chat-input-toolbar/display.tsx | 160 +- .../src/chat-input-toolbar/modelSelection.ts | 17 +- .../chat-input-toolbar/thoughtLevelOptions.ts | 2 +- .../command-center/CommandCenterDialog.tsx | 60 +- .../commandCenterSearchHistory.ts | 2 +- .../src/components/EmbeddedWebsiteHeader.tsx | 2 + .../CloudContentDialog.tsx | 240 + .../CloudDialogDescription.tsx | 193 + .../cloud-content-dialog/CloudDialogHero.tsx | 259 + .../CloudDialogMediaHero.tsx | 205 + .../cloudContentDialogTypes.ts | 93 + .../cloudDescriptionStyle.ts | 80 + .../cloudLottieRuntime.ts | 60 + .../useCloudHeroEnvironment.ts | 24 + .../CodingPlanQuotaResetDialog.tsx | 205 +- .../buildCodingPlanQuotaResetDialogConfig.ts | 17 +- .../icons/dynamicWorkflowModeIcons.ts | 34 + .../marketing-touch/MarketingBanner.tsx | 127 + .../marketing-touch/MarketingDialogs.tsx | 96 + .../MarketingFailureDialog.tsx | 49 + .../MarketingTouchProvider.tsx | 403 + .../marketing-touch/marketingPopupAdapter.ts | 101 + .../marketing-touch/marketingResources.ts | 175 + .../marketingTouchController.ts | 346 + .../marketing-touch/marketingTouchPoller.ts | 73 + .../useMarketingBannerVisible.ts | 19 + .../useMarketingTaskCompletionRefresh.ts | 62 + packages/ui/src/components/ui/README.md | 2 +- .../src/components/ui/floating-particles.tsx | 225 + packages/ui/src/components/ui/select.tsx | 53 + .../components/workflow-graph/lane-name.ts | 6 +- .../workflow-graph/participant-model.ts | 23 +- .../ui/src/components/workflow-graph/types.ts | 7 +- .../TaskWorkflowRunLines.tsx | 75 +- .../workflow-run-line/WorkflowRunRail.tsx | 98 + .../WorkflowAskSettingsLines.tsx | 289 + .../WorkflowAskSettingsParts.tsx | 213 + .../workflow-timeline/WorkflowCardChrome.tsx | 2 +- .../WorkflowCompletionCard.tsx | 15 +- .../workflow-timeline/WorkflowHoleParts.tsx | 101 + .../workflow-timeline/WorkflowRunDigest.tsx | 33 +- .../WorkflowRunSaveControls.tsx | 357 + .../WorkflowRunSettingsFields.tsx | 33 +- .../WorkflowRunSettingsPopover.tsx | 162 +- .../workflow-timeline/WorkflowSaveFields.tsx | 251 + .../workflow-timeline/WorkflowSavePopover.tsx | 260 + .../WorkflowStreamChevrons.tsx | 110 + .../workflow-timeline/WorkflowTimeline.tsx | 70 +- .../WorkflowTimelineArcs.tsx | 23 +- .../WorkflowTimelineFills.tsx | 299 + .../WorkflowTimelineLedge.tsx | 21 +- .../WorkflowTimelineStation.tsx | 89 +- .../WorkflowTimelineTracks.tsx | 40 +- .../WorkflowTruncatedNotice.tsx | 3 +- .../workflow-timeline/roster-model.ts | 2 +- .../workflow-timeline/stage-lamps.ts | 131 + .../workflow-timeline/station-observation.ts | 13 +- .../workflow-timeline/subagent-model-label.ts | 21 + .../workflow-timeline/timeline-bands.ts | 104 +- .../workflow-timeline/timeline-cache.ts | 4 +- .../workflow-timeline/timeline-frames.ts | 240 + .../workflow-timeline/timeline-geometry.ts | 18 +- .../workflow-timeline/timeline-holes.ts | 344 + .../workflow-timeline/timeline-model.ts | 214 +- .../timeline-pill-activity.ts | 34 + .../workflow-timeline/timeline-summary.ts | 11 +- .../workflow-timeline/use-fill-growth.ts | 78 + .../useWorkflowSettingsModelChoices.ts | 176 + .../workflow-timeline/workflowAskSettings.ts | 69 + .../workflow-timeline/workflowRunSave.ts | 109 + .../workflow-timeline/workflowRunSettings.ts | 56 +- .../workflowSettingsChange.ts | 26 +- .../CuaPermissionObservationAttachment.tsx | 6 +- packages/ui/src/embeddedBrowserHelpers.ts | 36 +- packages/ui/src/env.d.ts | 3 - .../ui/src/feedback/FeatureRequestDialog.tsx | 25 +- .../FeedbackBackgroundUploadIndicator.tsx | 12 +- .../ui/src/feedback/FeedbackSubmitForm.tsx | 7 +- packages/ui/src/feedback/TicketsView.tsx | 4 +- .../src/feedback/feedbackContactPreference.ts | 8 +- packages/ui/src/feedback/feedbackIcons.tsx | 71 + packages/ui/src/feedback/feedbackMeta.ts | 111 +- .../ui/src/feedback/feedbackSubmissionJob.ts | 4 +- packages/ui/src/feedback/feedbackUserView.ts | 121 +- packages/ui/src/gen-ui/contract.ts | 1 + packages/ui/src/gen-ui/domain/sourceFiles.ts | 18 + packages/ui/src/git-action-menu/display.ts | 11 + .../ui/src/git-graph/GitGraphCommitDetail.tsx | 19 +- packages/ui/src/git-graph/GitGraphPane.tsx | 39 +- packages/ui/src/git-graph/layout.ts | 25 +- packages/ui/src/git-graph/layoutAlgorithm.ts | 10 +- .../src/global-notice/GlobalNoticeSurface.tsx | 44 + .../ui/src/global-notice/globalNoticeStore.ts | 201 + .../highspeed/HighspeedActivationVisual.tsx | 53 + .../src/highspeed/HighspeedModelIndicator.tsx | 69 + .../highspeed/HighspeedShareNoticeCard.tsx | 333 + .../highspeed/highspeedConversationRows.ts | 15 + .../highspeed/highspeedFooterExpiryClock.ts | 62 + .../ui/src/highspeed/highspeedOutputFooter.ts | 154 + .../ui/src/highspeed/highspeedSavedTime.ts | 91 + packages/ui/src/highspeed/highspeedSend.ts | 158 + packages/ui/src/highspeed/highspeedShare.ts | 306 + .../highspeed/highspeedShareDiagnostics.ts | 65 + packages/ui/src/highspeed/highspeedTime.ts | 7 + .../ui/src/highspeed/highspeedToastClaims.ts | 10 + .../src/highspeed/highspeedTurnHydration.ts | 177 + .../ui/src/highspeed/highspeedTurnStore.ts | 424 + .../highspeed/useHighspeedComposerEntrance.ts | 42 + packages/ui/src/hooks/chatActionHelpers.ts | 106 + packages/ui/src/hooks/index.ts | 1 + .../ui/src/hooks/useActiveTaskSnapshotMeta.ts | 8 +- packages/ui/src/hooks/useAppKeyboard.ts | 2 +- packages/ui/src/hooks/useAppPanels.ts | 17 + .../src/hooks/useAutomationProjectOptions.ts | 6 +- .../ui/src/hooks/useBackgroundBashOutput.ts | 2 +- packages/ui/src/hooks/useBotBoundGroups.ts | 119 + .../ui/src/hooks/useBotGroupMemberNames.ts | 48 + packages/ui/src/hooks/useBotGroupTask.ts | 151 + .../src/hooks/useBotPrivateDeliveryRetry.ts | 33 + .../ui/src/hooks/useBrowserSitePermissions.ts | 102 + .../ui/src/hooks/useCCbuddyTaskService.ts | 14 +- .../ui/src/hooks/useClaudeSessionMigration.ts | 135 +- .../ui/src/hooks/useClientScenesResource.ts | 4 +- .../ui/src/hooks/useCodingPlanQuotaResetUi.ts | 47 +- packages/ui/src/hooks/useCuaComposerEntry.ts | 5 +- .../hooks/useDynamicWorkflowAvailability.ts | 42 +- packages/ui/src/hooks/useGitRepository.ts | 2 +- packages/ui/src/hooks/useGroupedTaskView.ts | 14 +- packages/ui/src/hooks/useModelTrajectory.ts | 2 +- packages/ui/src/hooks/usePluginCreator.ts | 16 +- .../ui/src/hooks/usePluginReferenceCatalog.ts | 8 +- packages/ui/src/hooks/usePptxFileWatch.ts | 29 +- .../ui/src/hooks/useProviderSettingsView.ts | 4 +- .../useRemoteConnectionEntryVisibility.ts | 10 + .../ui/src/hooks/useRemoteConnectionForm.ts | 33 +- .../ui/src/hooks/useRemoteConnectionLogs.ts | 16 +- .../useResolvedRemoteWorkspaceSessionId.ts | 2 +- packages/ui/src/hooks/useSessionSubagents.ts | 10 +- packages/ui/src/hooks/useSkills.ts | 11 +- .../ui/src/hooks/useStartPlanEntitlement.ts | 21 + packages/ui/src/hooks/useSystemService.ts | 11 +- packages/ui/src/hooks/useTabPersistence.ts | 10 +- .../useTaskInteractionAutoResolutionSnooze.ts | 2 +- .../src/hooks/useTaskNativeSessionLogFile.ts | 4 +- packages/ui/src/hooks/useUsageEntitlement.ts | 4 +- packages/ui/src/hooks/useUsageStats.ts | 2 +- .../ui/src/hooks/useVulnerabilityReportUrl.ts | 33 + .../ui/src/hooks/useWebRemoteControlStatus.ts | 94 + .../src/hooks/useWebRemoteControlTaskOpen.ts | 196 + .../src/hooks/useWorkflowRunArtifactBytes.ts | 8 + .../src/hooks/useWorkflowRunArtifactData.ts | 57 +- .../hooks/useWorkflowRunJournalSummaries.ts | 2 +- packages/ui/src/hooks/useWorkflowRunSave.ts | 214 + .../src/hooks/useWorkspaceActiveTaskState.ts | 40 +- packages/ui/src/hooks/useWorkspaceHomePath.ts | 6 +- .../hooks/useWorkspaceOpenInEditorTarget.ts | 39 +- .../hooks/useWorkspaceProviderConfigFile.ts | 234 + .../ui/src/hooks/useWorkspaceServices.tsx | 10 +- .../workspaceTaskListRefreshSignatures.ts | 4 +- packages/ui/src/i18n/IntlProvider.tsx | 74 +- packages/ui/src/i18n/locales/en-US.ts | 640 +- packages/ui/src/i18n/locales/zh-CN.ts | 595 +- packages/ui/src/index.ts | 8 + packages/ui/src/lib/accountProviderAccess.ts | 2 +- .../src/lib/armsCustomEventObservability.ts | 2 +- packages/ui/src/lib/askUserQuestion.ts | 64 +- packages/ui/src/lib/assistantCodeComment.ts | 4 +- .../ui/src/lib/assistantDirectiveParser.ts | 6 +- .../ui/src/lib/assistantFileReferences.ts | 2 +- packages/ui/src/lib/assistantPreviewCards.ts | 23 + packages/ui/src/lib/automationTelemetry.ts | 4 +- packages/ui/src/lib/browserEnvironment.ts | 6 +- .../lib/buildGroupedTaskViewFromSessions.ts | 2 +- packages/ui/src/lib/builtinSkillI18n.ts | 107 +- packages/ui/src/lib/ccbuddyFileCitation.ts | 8 +- .../ui/src/lib/ccbuddyProviderPreference.ts | 52 + packages/ui/src/lib/ccbuddyProviders.ts | 22 + .../ui/src/lib/ccbuddySessionProjection.ts | 3437 ++++++- .../ui/src/lib/ccbuddyTaskUsageFallback.ts | 4 + packages/ui/src/lib/ccbuddyUiError.ts | 28 +- packages/ui/src/lib/chatAttachments.ts | 188 +- .../ui/src/lib/chatComposerDraftStorage.ts | 2 +- packages/ui/src/lib/chatErrorAttribution.ts | 2 + .../src/lib/chatErrorAttributionEvidence.ts | 3 +- .../ui/src/lib/chatErrorBannerTelemetry.ts | 12 +- packages/ui/src/lib/chatPlaceholder.ts | 18 +- packages/ui/src/lib/chatPrepareError.ts | 41 +- .../ui/src/lib/chatSessionScrollMemory.ts | 54 +- packages/ui/src/lib/chatStatus.ts | 82 +- packages/ui/src/lib/codeViewer.ts | 2 +- .../ui/src/lib/codingPlanFunnelTelemetry.ts | 12 +- packages/ui/src/lib/codingPlanProvider.ts | 8 +- .../ui/src/lib/codingPlanQuotaPresentation.ts | 18 +- packages/ui/src/lib/codingPlanQuotaResetUi.ts | 85 +- packages/ui/src/lib/codingPlanUsageSources.ts | 6 +- packages/ui/src/lib/composerRecent.ts | 24 +- .../ui/src/lib/conversationSelectionGuard.ts | 2 +- .../src/lib/conversationSelectionReference.ts | 46 +- .../ui/src/lib/conversationShareContext.ts | 2 +- packages/ui/src/lib/conversationShareError.ts | 35 +- ...ationTelemetryParityScenarioDefinitions.ts | 1250 +++ .../conversationTelemetryParityStateE2E.ts | 68 + packages/ui/src/lib/cuaComposerEntryState.ts | 2 +- packages/ui/src/lib/cuaPermissionAction.ts | 2 +- .../ui/src/lib/cuaPermissionStatusCache.ts | 11 +- .../ui/src/lib/cuaPermissionStatusStore.ts | 17 +- .../ui/src/lib/developerToolsPreference.ts | 2 +- packages/ui/src/lib/diagramViewport.ts | 6 +- packages/ui/src/lib/diffsHighlighterEngine.ts | 2 +- .../ui/src/lib/documentHiddenMotionPause.ts | 25 + packages/ui/src/lib/fileDisplay.tsx | 43 +- packages/ui/src/lib/gitAutoRefresh.ts | 6 +- .../src/lib/groupedTaskExpansionPreference.ts | 5 +- packages/ui/src/lib/helpMenuActions.ts | 4 +- packages/ui/src/lib/keyboardShortcuts.ts | 86 + packages/ui/src/lib/marketingNavigation.ts | 92 + packages/ui/src/lib/memoryDiagnostics.ts | 4 +- packages/ui/src/lib/mermaidLanguage.ts | 12 +- packages/ui/src/lib/mermaidRenderBudget.ts | 23 +- packages/ui/src/lib/messageTelemetry.ts | 47 + packages/ui/src/lib/mobileTextInput.ts | 102 + packages/ui/src/lib/modelConfigSync.ts | 37 +- .../ui/src/lib/modelProviderAvailability.ts | 2 +- packages/ui/src/lib/offPeakTelemetry.ts | 8 +- packages/ui/src/lib/officeFilePreview.ts | 2 +- packages/ui/src/lib/pdfJsAssets.ts | 2 +- packages/ui/src/lib/planToolCall.ts | 4 +- packages/ui/src/lib/planUsageArmsTelemetry.ts | 54 +- packages/ui/src/lib/pptxElementReference.ts | 63 +- .../ui/src/lib/pptxElementReferencePreview.ts | 15 +- packages/ui/src/lib/pptxPreviewData.ts | 2 +- packages/ui/src/lib/promptHistoryStorage.ts | 7 +- packages/ui/src/lib/promptInputTriggers.ts | 37 +- .../ui/src/lib/promptTemplateTelemetry.ts | 6 +- packages/ui/src/lib/providerBusinessError.ts | 51 +- .../src/lib/providerFamilyDomainSettings.ts | 15 +- .../src/lib/providerSettingsFormProjection.ts | 2 +- .../ui/src/lib/providerSettingsSnapshot.ts | 9 +- .../ui/src/lib/reactErrorArmsTelemetry.ts | 10 +- .../ui/src/lib/remoteConnectionDialogState.ts | 19 +- .../src/lib/remoteConnectionDockerOptions.ts | 10 +- packages/ui/src/lib/remoteConnectionWizard.ts | 39 +- packages/ui/src/lib/remoteWorkspaceHistory.ts | 107 +- .../ui/src/lib/rendererCCbuddyEndpoint.ts | 2 +- packages/ui/src/lib/rendererNavigation.ts | 2 +- packages/ui/src/lib/rootStartupGate.ts | 43 +- .../ui/src/lib/sendFunnelArmsTelemetry.ts | 14 +- packages/ui/src/lib/sessionCreateTelemetry.ts | 2 +- .../ui/src/lib/sessionOpenArmsTelemetry.ts | 26 +- packages/ui/src/lib/settingsNavigation.ts | 15 +- packages/ui/src/lib/shikiHighlighter.ts | 8 +- .../ui/src/lib/sidebarCodingPlanUpgrade.ts | 76 + .../lib/sidebarPurposeSectionPreferences.ts | 8 +- packages/ui/src/lib/sidebarTaskPreferences.ts | 3 +- ...idebarUsageCodingPlanProviderPreference.ts | 27 +- packages/ui/src/lib/skillSourceFilter.ts | 2 +- packages/ui/src/lib/streamClientId.ts | 18 + packages/ui/src/lib/taskChangeSummary.ts | 222 +- packages/ui/src/lib/taskFileTreeTarget.ts | 4 +- packages/ui/src/lib/taskLifecycleEvents.ts | 4 +- packages/ui/src/lib/taskListMembershipSets.ts | 14 +- packages/ui/src/lib/taskListMetaSync.ts | 220 +- packages/ui/src/lib/taskListOrdering.ts | 4 +- packages/ui/src/lib/taskListRefreshPolicy.ts | 82 +- packages/ui/src/lib/taskModelRecovery.ts | 27 +- packages/ui/src/lib/taskNavigationHistory.ts | 20 +- packages/ui/src/lib/taskQueryCache.ts | 9 +- .../ui/src/lib/taskRuntimeDisplayStatus.ts | 9 + packages/ui/src/lib/taskSidePaneMemory.ts | 8 +- packages/ui/src/lib/taskStatusUnreadSync.ts | 6 +- packages/ui/src/lib/taskTimelineGroups.ts | 6 +- packages/ui/src/lib/teamPlanDisplayName.ts | 6 +- packages/ui/src/lib/toolCallTree.ts | 173 + packages/ui/src/lib/toolError.ts | 14 +- packages/ui/src/lib/toolIdentity.ts | 108 +- packages/ui/src/lib/uiFontSize.ts | 2 +- packages/ui/src/lib/uiPerfArmsTelemetry.ts | 43 +- packages/ui/src/lib/unreadTaskCount.ts | 13 +- .../src/lib/usageEntitlementRefreshPolicy.ts | 26 +- packages/ui/src/lib/userActionTelemetry.ts | 10 +- packages/ui/src/lib/userActionTraceCatalog.ts | 4 +- packages/ui/src/lib/webElementContext.ts | 12 + .../src/lib/webRemoteControlMobileTaskHome.ts | 205 + .../ui/src/lib/webRemoteControlTaskIndex.ts | 421 + .../ui/src/lib/webRemoteControlTaskSync.ts | 44 + packages/ui/src/lib/whiteboard.ts | 2 +- packages/ui/src/lib/workDuration.ts | 12 + packages/ui/src/lib/workflowRunAckStore.ts | 13 +- packages/ui/src/lib/workflowRunLine.ts | 19 +- packages/ui/src/lib/workflowToolNames.ts | 9 + .../ui/src/lib/workspaceEditorSelection.ts | 6 +- .../src/lib/workspaceExpansionPreference.ts | 9 +- packages/ui/src/lib/workspaceFileDrag.ts | 2 +- .../ui/src/lib/workspacePathNavigation.ts | 8 + packages/ui/src/lib/workspacePurpose.ts | 12 +- packages/ui/src/lib/workspaceRemovalSafety.ts | 13 +- .../ui/src/lib/workspaceRpcAvailability.ts | 17 +- .../ui/src/lib/workspaceSessionReloadPlan.ts | 23 +- packages/ui/src/lib/workspaceSidePane.ts | 202 +- packages/ui/src/lib/workspaceSidebarDrag.ts | 15 +- .../ui/src/lib/workspaceSidebarResizeState.ts | 22 +- packages/ui/src/lib/wslUncWorkspace.ts | 6 +- packages/ui/src/logger.ts | 2 +- .../ui/src/login/LoginApiKeyForm.helpers.ts | 15 +- packages/ui/src/mentions/MentionPlugin.tsx | 17 +- .../ui/src/mentions/PromptClipboardPlugin.tsx | 2 +- .../ui/src/mentions/activePromptInputToken.ts | 4 +- .../src/mentions/components/MentionPanel.tsx | 6 +- packages/ui/src/mentions/mentionMarkdown.ts | 45 +- packages/ui/src/mentions/mentionSearch.ts | 8 +- .../ui/src/mentions/nodes/mentionIconDom.ts | 23 +- .../providers/pluginsMentionProvider.ts | 4 +- .../providers/sessionsMentionProvider.ts | 62 +- .../providers/subagentsMentionProvider.ts | 38 +- .../ui/src/messageChangeSummaryPreview.ts | 68 +- .../ui/src/onboarding/OnboardingDialog.tsx | 10 + .../src/onboarding/OnboardingDialogParts.tsx | 63 +- .../ui/src/onboarding/useOnboardingTrigger.ts | 2 +- packages/ui/src/permissionWorkflowSettings.ts | 77 + .../components/PluginUiLauncherItems.tsx | 45 +- .../presentation/presentationElementModel.ts | 66 +- .../presentationPdfPrintExport.ts | 8 +- packages/ui/src/presentation/types.ts | 23 +- packages/ui/src/previewPaneCodeReview.ts | 7 +- packages/ui/src/previewPaneContent.tsx | 2 +- packages/ui/src/previewPaneImageContent.tsx | 10 +- .../ui/src/prompt-editor/ChatPromptEditor.tsx | 69 +- .../prompt-editor/useComposerToolbarFit.ts | 2 +- .../ui/src/quickpick/HighlightedMatchText.tsx | 2 +- .../src/quickpick/conversationFindSearch.ts | 2 +- packages/ui/src/quickpick/quickPickStyles.ts | 2 + .../src/quickpick/taskFindNavigationState.ts | 2 +- .../RemoteConnectionConnectingStep.tsx | 2 +- .../ui/src/request-security-edition/claim.ts | 11 + .../ui/src/request-security-edition/errors.ts | 21 + .../ui/src/request-security-edition/index.ts | 11 + .../src/request-security-edition/messages.ts | 10 + .../ui/src/request-security-edition/parity.ts | 3 + packages/ui/src/request-security.ts | 6 + .../src/resource-manager/NetworkSection.tsx | 176 + .../resource-manager/ResourceManagerApp.tsx | 13 +- .../resource-manager/resourceUsageParts.tsx | 2 +- .../src/resource-manager/resourceUsageView.ts | 2 +- .../storage/storageCategoryPresentation.ts | 4 +- .../storage/useStorageUsage.ts | 4 +- packages/ui/src/rewards/RewardsProvider.tsx | 78 + packages/ui/src/rewards/RewardsWebview.tsx | 278 + packages/ui/src/root/RootStartupLoading.tsx | 48 +- packages/ui/src/root/RootWorkspaceContent.tsx | 92 +- .../ui/src/root/WorkspaceSettingsLayer.tsx | 3 + .../reconnectRemoteWorkspaceHistoryEntry.ts | 10 +- .../root/reconnectingRemoteWorkspaceLogs.ts | 7 +- .../ui/src/root/rootPlatformWorkspaceSync.ts | 57 +- .../ui/src/root/rootWorkspaceShellTarget.ts | 2 +- packages/ui/src/root/types.ts | 52 +- .../useProviderAvailabilityLoginEntryGuard.ts | 2 +- .../ui/src/root/useRemoteWorkspaceHistory.ts | 18 +- .../root/useRemoteWorkspaceTabLifecycle.ts | 19 +- packages/ui/src/root/useRootOAuthEffects.ts | 2 +- .../ui/src/root/useRootPlatformEffects.ts | 48 +- .../src/root/useRootProviderStateRefresh.ts | 18 +- .../ui/src/root/useRootWorkspaceActions.ts | 6 +- .../settings/AutomationDesignPrimitives.tsx | 33 +- .../ui/src/settings/AutomationEditView.tsx | 26 +- .../ui/src/settings/AutomationsSection.tsx | 54 +- .../CodingPlanEmbeddedWebviewDialog.tsx | 4 + .../src/settings/CodingPlanUpgradeDialog.tsx | 10 +- .../settings/DynamicWorkflowModeSetting.tsx | 144 + .../settings/ExternalAgentImportDialog.tsx | 230 +- packages/ui/src/settings/HooksList.tsx | 22 +- packages/ui/src/settings/HooksSection.tsx | 70 +- .../settings/InstalledPluginManagement.tsx | 307 +- .../ui/src/settings/McpSettingsSection.tsx | 507 +- .../ui/src/settings/ModelProviderSection.tsx | 54 +- packages/ui/src/settings/OffPeakEditView.tsx | 16 +- .../ui/src/settings/OffPeakHistoryTab.tsx | 32 +- packages/ui/src/settings/OffPeakTaskList.tsx | 30 +- packages/ui/src/settings/PluginAddMenu.tsx | 4 +- packages/ui/src/settings/PluginStoreCard.tsx | 33 +- .../ui/src/settings/PluginStoreDetailView.tsx | 4 +- .../ui/src/settings/PluginStoreListView.tsx | 5 +- packages/ui/src/settings/PluginStorePage.tsx | 53 + .../src/settings/PluginStoreSourcesDialog.tsx | 21 +- packages/ui/src/settings/PluginsSection.tsx | 10 +- .../ui/src/settings/RemoteMcpSyncDialog.tsx | 74 +- .../src/settings/RemotePluginSyncDialog.tsx | 294 +- .../ui/src/settings/RemoteSkillSyncDialog.tsx | 52 +- .../ui/src/settings/RemoteSyncActions.tsx | 38 +- .../ui/src/settings/SettingsPageParts.tsx | 40 + .../ui/src/settings/SettingsSegmentedTabs.tsx | 2 +- packages/ui/src/settings/SkillsSection.tsx | 200 +- packages/ui/src/settings/SubagentsSection.tsx | 20 +- .../src/settings/WorkspaceHookTrustNotice.tsx | 2 +- .../settings/automationAgentConfigOptions.ts | 48 +- packages/ui/src/settings/automationFormat.ts | 18 + .../ui/src/settings/automationStatusFilter.ts | 6 +- .../src/settings/automationTemplateCatalog.ts | 17 + .../codingPlanUpgradeLoginRecovery.ts | 7 +- .../ui/src/settings/commandWorkspaceScope.ts | 17 +- .../src/settings/computerUseAvailability.ts | 6 +- .../settings/cuaPermissionRestartVerify.ts | 4 +- packages/ui/src/settings/mcpSettingsShared.ts | 11 + .../CodingPlanStatusActions.tsx | 40 +- .../CodingPlanStatusMeta.tsx | 14 +- .../model-provider-section/Detail.tsx | 42 +- .../InlineEditableProviderCard.tsx | 16 +- .../ModelConfigHelp.tsx | 2 +- .../model-provider-section/Navigation.tsx | 8 +- .../ProviderApiFormatSelect.tsx | 2 +- .../ProviderCardSections.tsx | 11 +- .../ProviderDetailFeedback.tsx | 4 +- .../ProviderFamilyModeHeader.tsx | 4 +- .../model-provider-section/ProviderLogo.tsx | 2 +- .../ProviderModelMetadataDialog.tsx | 2 +- .../model-provider-section/SectionLayout.tsx | 2 +- .../SortableProviderModelList.tsx | 8 +- .../StartPlanBalanceCard.tsx | 27 +- .../model-provider-section/StartPlanCard.tsx | 11 +- .../model-provider-section/StatusCards.tsx | 48 +- .../codingPlanEmbeddedWebview.ts | 18 +- .../codingPlanEnterpriseTiers.ts | 91 + .../codingPlanProductPresentation.ts | 178 +- .../codingPlanPurchaseAuth.ts | 41 +- .../model-provider-section/constants.ts | 2 +- .../enterpriseCodingPlanProducts.ts | 297 +- .../model-provider-section/oauthActions.ts | 31 + .../providerFamilyConnectionVisibility.ts | 31 +- .../useCodingPlanEntitlements.ts | 2 +- .../useCodingPlanProducts.ts | 152 +- .../useEnterpriseCodingPlanProducts.ts | 6 +- .../model-provider-section/useIdleTrigger.ts | 2 +- .../useModelProviderNavigation.ts | 36 +- .../useOptimisticReorder.ts | 2 +- .../useStartPlanPreview.ts | 15 + .../settings/model-provider-section/utils.tsx | 18 +- .../ui/src/settings/offPeakUiPresentation.ts | 24 +- .../officialMarketplaceAutoRefresh.ts | 8 +- .../settings/pluginCapabilityProjection.ts | 10 +- packages/ui/src/settings/pluginConfigPatch.ts | 2 +- .../ui/src/settings/pluginCreatorPrefill.ts | 6 +- .../settings/pluginManagedResourceGroups.ts | 4 +- packages/ui/src/settings/pluginSourceLabel.ts | 33 + .../ui/src/settings/pluginStoreListing.ts | 17 +- .../ui/src/settings/recommendedPlugins.json | 4 + .../ui/src/settings/recommendedPlugins.ts | 9 + .../AutomationsPageTitleSwitch.tsx | 2 +- .../saved-workflows/SavedWorkflowCard.tsx | 2 +- .../SavedWorkflowLaunchDialog.tsx | 10 +- .../saved-workflows/SavedWorkflowsSection.tsx | 65 +- .../saved-workflows/savedWorkflowArgsForm.ts | 33 +- .../useSavedWorkflowRunOpeners.ts | 2 +- .../ui/src/settings/settingsPageConfig.ts | 4 +- .../settings/usage-stats/AppUsagePanel.tsx | 8 +- .../usage-stats/CodingPlanUsagePanel.tsx | 48 +- .../usage-stats/usageStatsUiParts.tsx | 71 +- .../ui/src/settings/useAutomationTemplates.ts | 2 +- .../ui/src/settings/usePluginUninstall.ts | 7 +- .../settings/workspaceHookReviewCommands.ts | 2 +- packages/ui/src/settingsPageHelpers.tsx | 33 +- packages/ui/src/shortcuts/bindings.ts | 4 +- .../ui/src/shortcuts/composerShortcuts.ts | 4 +- packages/ui/src/shortcuts/conflicts.ts | 27 +- .../SidebarBottomActivity.tsx | 23 + packages/ui/src/slashCommandHelpers.ts | 28 + packages/ui/src/store/StoreProvider.tsx | 2 +- .../ui/src/store/automationManagementStore.ts | 2 +- .../src/store/ccbuddySessionStoreSelectors.ts | 31 +- .../ui/src/store/ccbuddySessionStoreTypes.ts | 2 +- .../ccbuddySessionStoreWorkspaceSlice.ts | 10 +- .../ui/src/store/codeCommentPreviewStore.ts | 181 +- .../ui/src/store/codingPlanQuotaResetState.ts | 18 +- packages/ui/src/store/confirmDialogStore.ts | 2 +- .../store/conversationShareSelectionStore.ts | 33 +- .../store/dynamicWorkflowAvailabilityStore.ts | 21 +- .../store/embeddedBrowserPermissionStore.ts | 26 + packages/ui/src/store/mcpStore.ts | 237 +- packages/ui/src/store/mcpStoreDesktop.ts | 12 + packages/ui/src/store/mcpStoreHelpers.ts | 31 +- packages/ui/src/store/modelTrajectoryStore.ts | 2 +- packages/ui/src/store/offPeakTaskStore.ts | 8 +- .../ui/src/store/pluginManagementStore.ts | 5 +- .../src/store/pluginManagementStoreLoading.ts | 2 +- packages/ui/src/store/savedWorkflowStore.ts | 11 + .../ui/src/store/subagentsContextStore.ts | 2 +- packages/ui/src/store/taskQueryCacheStore.ts | 6 + .../ui/src/store/workflowRunSavedStore.ts | 148 + .../ui/src/store/workspaceHookReviewStore.ts | 15 +- packages/ui/src/styles.css | 248 +- packages/ui/src/terminal/terminalLinks.ts | 2 +- .../ui/src/terminal/terminalPanelState.ts | 4 +- packages/ui/src/terminal/terminalTheme.ts | 4 +- packages/ui/src/test-actions.ts | 6 +- packages/ui/src/types/cloudLottie.d.ts | 5 + packages/ui/src/updateStatusModel.ts | 33 +- .../ui/src/useTaskListItemContextActions.ts | 166 +- packages/ui/src/v4/BotGroupDeliveryAction.tsx | 180 + .../ui/src/v4/BotGroupMemberNamesContext.ts | 7 + packages/ui/src/v4/BotGroupSourceLabel.tsx | 44 + packages/ui/src/v4/BotTopicPreparation.tsx | 91 + packages/ui/src/v4/ChannelMentionContent.tsx | 65 + .../src/v4/ConversationAgentToolCallRow.tsx | 2 +- .../v4/ConversationBottomDockTransition.tsx | 16 +- packages/ui/src/v4/ConversationComposer.tsx | 156 +- .../ui/src/v4/ConversationDraftEmptyState.tsx | 100 +- .../ConversationDraftSuggestedPluginFlow.tsx | 8 + ...ersationDraftSuggestedPromptsContainer.tsx | 22 +- .../src/v4/ConversationFileSummaryPanel.tsx | 78 +- packages/ui/src/v4/ConversationHeader.tsx | 20 +- .../src/v4/ConversationPendingGuideList.tsx | 3 +- packages/ui/src/v4/ConversationQueuePanel.tsx | 45 +- .../ui/src/v4/ConversationQuotaBanner.tsx | 47 +- packages/ui/src/v4/ConversationRowView.tsx | 325 +- .../v4/ConversationShareConfirmationDock.tsx | 33 +- .../src/v4/ConversationShareSelectionDock.tsx | 2 +- .../v4/ConversationShareSelectionPanel.tsx | 8 +- .../ConversationShareSelectionReopenTab.tsx | 2 +- .../src/v4/ConversationShareSuccessDock.tsx | 2 +- .../ui/src/v4/ConversationStatusPanel.tsx | 595 +- packages/ui/src/v4/ConversationTimeline.tsx | 175 +- packages/ui/src/v4/ConversationTurnGroup.tsx | 331 +- .../ui/src/v4/ConversationTurnNavigator.tsx | 54 +- .../ui/src/v4/ConversationUserInputBody.tsx | 11 +- .../ui/src/v4/ConversationUserInputBubble.tsx | 45 + .../src/v4/ConversationUserInputContent.tsx | 6 +- .../src/v4/ConversationWorkflowCompletion.tsx | 57 +- .../ui/src/v4/ConversationWorkflowDigests.tsx | 3 +- .../src/v4/PendingCommandRecoveryBanner.tsx | 2 +- packages/ui/src/v4/SessionPane.tsx | 1207 ++- .../src/v4/SessionSubscriptionErrorPanel.tsx | 4 +- packages/ui/src/v4/V4ChatPane.tsx | 5 +- packages/ui/src/v4/V4ConversationContext.tsx | 6 +- packages/ui/src/v4/V4InteractionDialogs.tsx | 44 +- packages/ui/src/v4/V4UserInputDialog.tsx | 8 +- packages/ui/src/v4/V4WorkspaceChatArea.tsx | 30 +- packages/ui/src/v4/WorkbenchPane.tsx | 6 +- packages/ui/src/v4/WorkbenchSplitDivider.tsx | 10 +- .../ui/src/v4/WorkflowNotificationHoleRow.tsx | 158 + .../ui/src/v4/WorkflowNotificationToolRow.tsx | 34 +- packages/ui/src/v4/WorkflowToolSummary.tsx | 42 +- .../ui/src/v4/WorkspaceHookPendingBanner.tsx | 15 +- packages/ui/src/v4/ackActivationBarrier.ts | 2 +- packages/ui/src/v4/activeTaskProvider.ts | 2 +- .../ui/src/v4/agentConversationTransport.ts | 4 +- .../ui/src/v4/agentSessionsIndexTransport.ts | 32 +- .../ui/src/v4/assistantPreviewPptxAutoOpen.ts | 6 +- .../ui/src/v4/attachmentUploadTransaction.ts | 8 +- packages/ui/src/v4/botGroupDeliveryContext.ts | 20 + .../src/v4/buildTaskListResultFromSessions.ts | 10 +- packages/ui/src/v4/commandAckObservability.ts | 2 +- packages/ui/src/v4/commandFactory.ts | 6 +- .../src/v4/composer/ContextAttachmentPill.tsx | 2 +- .../ConversationBackgroundWorkTrigger.tsx | 13 +- .../ConversationSelectionReferenceChip.tsx | 20 +- .../ui/src/v4/composer/V4ComposerCuaEntry.tsx | 2 +- .../v4/composer/V4ComposerModeControls.tsx | 7 +- .../ui/src/v4/composer/V4ComposerToolbar.tsx | 130 +- .../ui/src/v4/composer/attachmentUpload.ts | 24 + .../ui/src/v4/composer/composerAutoFocus.ts | 2 +- .../ui/src/v4/composer/composerDraftStore.ts | 5 +- .../composerDraftWorkspaceTransfer.ts | 24 +- .../src/v4/composer/composerPromptContexts.ts | 17 +- .../src/v4/composer/followupModeSettings.ts | 11 +- .../ui/src/v4/composer/modelTriggerDisplay.ts | 2 +- .../ui/src/v4/composer/toolbarShortcuts.ts | 11 +- .../src/v4/composer/useCodeCommentContexts.ts | 64 +- .../src/v4/composer/useComposerAttachments.ts | 22 +- .../src/v4/composer/useDraftConfigControl.ts | 6 +- .../v4/composer/useDraftModelReadinessGate.ts | 30 +- .../v4/composer/useDraftRuntimeRebuildGate.ts | 12 +- .../src/v4/composer/useDraftSessionPrewarm.ts | 16 +- .../v4/composer/usePrimaryFollowupModifier.ts | 4 +- .../src/v4/composer/useWebElementContexts.ts | 4 +- packages/ui/src/v4/configCommandBarrier.ts | 76 +- .../src/v4/conversationAssistantWorkItems.ts | 2 +- packages/ui/src/v4/conversationCuaGroups.ts | 2 +- .../ui/src/v4/conversationFindHighlightDom.ts | 28 +- packages/ui/src/v4/conversationFindIndex.ts | 45 +- .../ui/src/v4/conversationGoalSummaryModel.ts | 8 +- packages/ui/src/v4/conversationLayout.ts | 17 +- .../ui/src/v4/conversationProjectionStore.ts | 90 +- packages/ui/src/v4/conversationRowContext.ts | 21 + packages/ui/src/v4/conversationRowSharing.ts | 107 + .../ui/src/v4/conversationShareAttempt.ts | 2 +- .../ui/src/v4/conversationShareModeMotion.ts | 6 +- .../src/v4/conversationSharePreflightCache.ts | 20 +- .../v4/conversationShareScrollbarMetrics.ts | 4 +- .../conversationShareSelectionPanelLayout.ts | 12 +- .../ui/src/v4/conversationStatusPanelModel.ts | 47 +- .../ui/src/v4/conversationTimelineLiveTail.ts | 2 +- .../src/v4/conversationTransportDelayE2E.ts | 6 +- .../v4/conversationTurnNavigatorHelpers.ts | 47 +- .../src/v4/conversationTurnRenderUnitTypes.ts | 67 + .../ui/src/v4/conversationTurnRenderUnits.ts | 66 +- .../ui/src/v4/draftSuggestedPromptItems.ts | 2 +- .../ui/src/v4/draftSuggestedPromptPrefill.ts | 54 +- .../v4/highspeed/HighSpeedDiffusionCanvas.tsx | 276 + .../ui/src/v4/highspeed/highSpeedDiffusion.ts | 83 + .../ui/src/v4/mapSessionSummaryToTaskMeta.ts | 20 +- packages/ui/src/v4/paneLayoutPersistence.ts | 48 +- packages/ui/src/v4/paneLayoutStore.ts | 19 +- packages/ui/src/v4/paneLayoutTree.ts | 39 +- packages/ui/src/v4/pendingCommandRegistry.ts | 13 +- packages/ui/src/v4/pendingCommandWorkspace.ts | 4 +- packages/ui/src/v4/pendingGuideProjection.ts | 10 +- .../ui/src/v4/pluginReferenceIconContext.tsx | 5 +- packages/ui/src/v4/promptScrollFocusPolicy.ts | 2 +- .../ui/src/v4/savedWorkflowHubContext.tsx | 52 + packages/ui/src/v4/sessionDataLayer.ts | 14 +- .../v4/sessionQuotaBannerDismissalStore.ts | 4 +- packages/ui/src/v4/sessionQuotaBannerState.ts | 6 +- packages/ui/src/v4/sessionsIndexRegistry.ts | 9 + packages/ui/src/v4/sessionsIndexStore.ts | 6 +- packages/ui/src/v4/slashCommands.ts | 11 +- packages/ui/src/v4/startPlanQuotaBuckets.ts | 2 +- .../ui/src/v4/startPlanQuotaReminderStore.ts | 2 +- .../ui/src/v4/taskListMembershipVersion.ts | 11 +- packages/ui/src/v4/taskListRowActivity.ts | 4 +- .../telemetry/conversationPromptTelemetry.ts | 2 +- .../conversationTelemetryParityE2E.ts | 416 + .../conversationTelemetrySupervisor.ts | 12 +- .../telemetry/useSessionOpenArmsTelemetry.ts | 2 +- .../useSessionSubscriptionErrorTelemetry.ts | 14 +- packages/ui/src/v4/timelineRowHeightCache.ts | 8 +- packages/ui/src/v4/timelineScrollAnchor.ts | 70 +- packages/ui/src/v4/topicInputMessages.ts | 30 + .../ui/src/v4/topicPreparationRenderUnits.ts | 52 + packages/ui/src/v4/topicWireDecoder.ts | 2 +- .../src/v4/useAssistantPreviewCardsForRow.ts | 17 +- .../ui/src/v4/useConversationTimelineFind.ts | 100 +- .../ui/src/v4/usePaneSessionPersistence.ts | 11 +- .../ui/src/v4/usePendingCommandRecovery.ts | 2 +- .../v4/useTreemappingConversationMessage.ts | 19 +- .../src/v4/useWorkspaceSessionsIndexItems.ts | 2 +- .../v4/windowControllerTaskListRegistry.ts | 2 +- packages/ui/src/v4/workbenchGroupStore.ts | 35 +- packages/ui/src/v4/workbenchLayout.ts | 6 +- .../ui/src/v4/workbenchSessionPlacement.ts | 2 +- packages/ui/src/v4/workflowRunCardJoin.ts | 119 +- packages/ui/src/v4/workflowTurnDigests.ts | 30 +- .../ui/src/v4/workspaceConnectionRegistry.ts | 13 +- .../webRemoteControlTerminalTransportState.ts | 37 + packages/ui/src/windowCaptionControls.ts | 6 +- .../workspaceFileSearchFilterBackend.ts | 7 +- .../workspace-file-tree/WorkspaceFileTree.tsx | 86 +- .../WorkspaceFileTreeList.tsx | 43 +- .../ui/src/workspace-file-tree/gitStatus.ts | 2 +- .../useWorkspaceFileTreeStickyFolders.ts | 15 +- .../workspace-grouped-tasks/group-item.tsx | 117 +- .../task-context-menu-content.tsx | 31 +- .../src/workspace-grouped-tasks/task-item.tsx | 3 + .../src/workspace-grouped-tasks/task-row.tsx | 149 +- .../virtualized-group-task-list.tsx | 8 +- packages/ui/tsconfig.json | 6 +- packages/ui/vite/pdfJsCMapsPlugin.ts | 4 +- packages/web/index.html | 124 +- .../web/src/auth/WebLoggedInWaitingPage.tsx | 65 + packages/web/src/auth/WebLoginPage.tsx | 43 + .../src/auth/browserOAuthCredentialRepo.ts | 2 +- packages/web/src/auth/oauthStateCodec.ts | 27 +- packages/web/src/auth/webZaiOAuthConfig.ts | 13 +- packages/web/src/main.tsx | 2284 ++++- .../share/ConversationShareLandingPage.tsx | 4 +- .../share/conversationSharePreviewClient.ts | 6 +- packages/web/src/share/shareHeaderLayout.ts | 2 +- .../web/src/webRemoteControlDeviceInfo.ts | 104 + .../web/src/webRemoteControlFailureScreen.tsx | 361 + packages/web/src/webRemoteControlLifecycle.ts | 68 + .../src/webRemoteControlRelayAuthProvider.ts | 34 + packages/web/src/webRemoteControlRoute.ts | 16 + packages/web/src/webRemoteControlTaskRead.ts | 68 + packages/web/src/webRemoteControlThemeSeed.ts | 48 + packages/web/src/webRemoteControlTransport.ts | 1110 ++ packages/web/src/webRemoteControlVersion.ts | 69 + .../web/src/webRemoteControlVersionNotice.tsx | 59 + .../webRemoteControlWorkspaceBridgeSession.ts | 51 + packages/web/vite.config.ts | 9 +- packages/web/vite/remoteFrontendVersion.mjs | 53 + pnpm-workspace.yaml | 1 + scripts/architecture/index.mjs | 12 +- scripts/architecture/policy.mjs | 4 +- scripts/bootstrap.mjs | 50 + scripts/build-desktop-agent-cli.mjs | 18 +- scripts/builtin-provider-config.mjs | 8 +- scripts/ccbuddy-distribution-smoke.mjs | 11 +- scripts/check-workspace-freshness.mjs | 13 +- scripts/dep-refs.mjs | 52 +- scripts/dev-desktop-cua-env.mjs | 38 + scripts/dev-desktop-env.mjs | 55 +- scripts/download-native-search-tools.mjs | 97 + scripts/licenses.mjs | 23 +- scripts/native-search-tools-config.mjs | 59 + scripts/package-native-search-tools.mjs | 43 +- scripts/prebuilt-binary-download.mjs | 148 + scripts/prebuilt-binary-extract.mjs | 2 +- scripts/prepare-native-search-tools.mjs | 30 +- scripts/prepare-prebuilds.sh | 2 +- scripts/remote-native-search-tools-config.mjs | 15 +- scripts/stage-dev-cua-plugin-runtime.mjs | 39 + scripts/third-party-notices.mjs | 6 +- scripts/third-party-npm.mjs | 108 +- third-party/copied-components.json | 50 + third-party/inventory.json | 1889 +++- third-party/native-search/sources.json | 4 +- third-party/npm-overrides.json | 114 +- 2218 files changed, 122816 insertions(+), 22672 deletions(-) create mode 100644 apps/ccbuddy-cli/packages/adapters/src/auth/zai-business-token-cache.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/model/account-request-retry.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/model/endpoint-routing-edition/index.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/model/off-peak-request-auth.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/model/provider-endpoint-routing-fetch.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/model/provider-endpoint-routing-options.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/model/request-security-edition/index.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/model/request-security-edition/recovery.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/model/request-security.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/network/incoming-response.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/storage/session-store/repositories/dwf-journal-fields.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/storage/session-store/repositories/dwf-journal-pages.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/storage/session-store/repositories/dwf-journal-reads.ts create mode 100644 apps/ccbuddy-cli/packages/adapters/src/tools/index.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/app/dynamic-workflow-run-compile.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/app/dynamic-workflow-run-fill.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/app/dynamic-workflow-run-holes.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/app/dynamic-workflow-run-progress-payload.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/app/visualize-skill-gate.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/app/workflow-actor-permission.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/app/workflow-default-concurrency.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/auth-login-contract.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/auth-login-persistence.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/commands/handlers/canonical-intent-replay.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/commands/handlers/highspeed-metrics.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/commands/input-admission.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/highspeed-metrics-persistence.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/fork-model-selection.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/saved-workflows-run.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/topic-resource-port.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/workflow-settings-answer.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/provider-endpoint-routing-source-headers.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/provider-endpoint-routing.ts create mode 100644 apps/ccbuddy-cli/packages/bootstrap/src/subagent-runtime-config.ts create mode 100644 apps/ccbuddy-cli/packages/cli/src/workflow-mode.ts create mode 100644 apps/ccbuddy-cli/packages/contracts/src/interfaces/dynamic-workflow-run-hole.port.ts create mode 100644 apps/ccbuddy-cli/packages/contracts/src/interfaces/provider-endpoint-routing.port.ts create mode 100644 apps/ccbuddy-cli/packages/contracts/src/interfaces/topic-resource.port.ts create mode 100644 apps/ccbuddy-cli/packages/contracts/src/tools/fill-workflow-hole.ts create mode 100644 apps/ccbuddy-cli/packages/contracts/src/tools/workflow-settings.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/agent/agent-listing-metadata.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/memory/dream.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/memory/project-memory-retrieval-branch.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/memory/recall/content.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/memory/recall/selector.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/runtime/helpers/agent-listing.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/runtime/helpers/conversation-quotes.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/runtime/helpers/project-memory-dream.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/runtime/helpers/project-memory-recall.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/runtime/methods/dynamic-workflow-activation.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/runtime/methods/dynamic-workflow-run-hole-notification.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/runtime/methods/tool-result-settlement.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/runtime/methods/turn-execution-fallback.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/runtime/methods/turn-tool-visibility.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/session-context/topic-archive.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/session-context/topic-resource.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/subagent/definitions.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/subagent/listing.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/executor/permission-input-adjustments.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/executor/permission-input.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/executor/permission-request.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/executor/permission-response.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/fill-workflow-hole-description.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/fill-workflow-hole-resolve.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/fill-workflow-hole-splice.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/fill-workflow-hole.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/guarded/cmd.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/guarded/command.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/guarded/find.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/guarded/git.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/guarded/options.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/guarded/windows-delete.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/guarded/word.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/guarded/wrappers.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/reply-to-channel.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/workflow-description.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/workflow-script-models.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/workflow-settings-adjustment.ts create mode 100644 apps/ccbuddy-cli/packages/core/src/tool/handlers/workflow.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow-runtime/src/child-cell-streams.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/analysis/actor-models.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/analysis/hole-id.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/analysis/hole-sites.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/analysis/hole-splice.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/analysis/site-phases.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/engine/cached-ask-facts.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/engine/engine-config.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/engine/engine-holes.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/engine/engine-resume.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/engine/hash-mismatch.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/engine/journal-read-types.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/engine/persona.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/facade/dts-hole.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/facade/dts-model.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/facade/dts-stream.ts create mode 100644 apps/ccbuddy-cli/packages/dynamic-workflow/src/lowering/lower-hole.ts create mode 100644 apps/ccbuddy-cli/packages/telemetry/src/request-observation-target.ts create mode 100644 apps/ccbuddy-cli/packages/telemetry/src/request-security-edition/index.ts create mode 100644 apps/ccbuddy-cli/tools/prompt-trajectory/src/testcases.ts create mode 100644 packages/client/src/webRemoteControlAcknowledgedRelayBatchQueue.ts create mode 100644 packages/client/src/webRemoteControlAcknowledgedRelayDeadline.ts create mode 100644 packages/client/src/webRemoteControlAcknowledgedRelayProtocol.ts create mode 100644 packages/client/src/webRemoteControlAcknowledgedRelayProtocolTypes.ts create mode 100644 packages/client/src/webRemoteControlRelayPayloadSerializer.ts create mode 100644 packages/client/src/webRemoteControlRelayProtocol.ts create mode 100644 packages/desktop/scripts/computer-use-producer.mjs create mode 100644 packages/desktop/scripts/sharp-package-assets.mjs create mode 100644 packages/desktop/scripts/windows-cua-helper-assets.mjs create mode 100644 packages/desktop/src/host/botGroupTaskScope.ts create mode 100644 packages/desktop/src/host/hostNetworkCapture.ts create mode 100644 packages/desktop/src/host/remoteDynamicWorkflowUserMode.ts create mode 100644 packages/desktop/src/host/serverRemoteConnection.ts create mode 100644 packages/desktop/src/host/windowTopicResourceRelay.ts create mode 100644 packages/desktop/src/main/desktopTraySupport.ts create mode 100644 packages/desktop/src/main/desktopWebRemoteControlIpc.ts create mode 100644 packages/desktop/src/main/embeddedBrowserBluetoothGuard.ts create mode 100644 packages/desktop/src/main/embeddedBrowserDeviceOptions.ts create mode 100644 packages/desktop/src/main/embeddedBrowserPermissionPolicy.ts create mode 100644 packages/desktop/src/main/embeddedBrowserPermissionUiBridge.ts create mode 100644 packages/desktop/src/main/embeddedBrowserSitePermissionStore.ts create mode 100644 packages/desktop/src/main/embeddedBrowserSitePermissions.ts create mode 100644 packages/desktop/src/main/networkCaptureBuffer.ts create mode 100644 packages/desktop/src/main/observeBeforeRequest.ts create mode 100644 packages/desktop/src/main/request-security-edition/index.ts create mode 100644 packages/desktop/src/main/resourceManagerNetwork.ts create mode 100644 packages/desktop/src/main/webRemoteControlFeatureGate.ts create mode 100644 packages/desktop/src/main/webRemoteControlManager.ts create mode 100644 packages/desktop/src/main/webRemoteControlRelayAuthProvider.ts create mode 100644 packages/desktop/src/main/webRemoteControlRelayAuthStorageProvider.ts create mode 100644 packages/desktop/src/main/webRemoteControlRendererReconnect.ts create mode 100644 packages/desktop/src/main/webRemoteControlSharedHostAttachments.ts create mode 100644 packages/desktop/src/main/webRemoteControlStatusEvents.ts create mode 100644 packages/desktop/src/main/webRemoteControlTransport.ts create mode 100644 packages/desktop/src/main/workflowArtifactFile.ts create mode 100644 packages/services/src/bots/channelMentionResolver.ts create mode 100644 packages/services/src/bots/channelReply.ts create mode 100644 packages/services/src/bots/groupAdminAttention.ts create mode 100644 packages/services/src/bots/groupDeliveryThrottle.ts create mode 100644 packages/services/src/bots/groupQueueCard.ts create mode 100644 packages/services/src/bots/groupReply.ts create mode 100644 packages/services/src/bots/groupResultDelivery.ts create mode 100644 packages/services/src/bots/groupSessions.ts create mode 100644 packages/services/src/bots/providers/feishuGroupMessages.ts create mode 100644 packages/services/src/bots/providers/groupInputReaction.ts create mode 100644 packages/services/src/bots/providers/groupMemberDirectory.ts create mode 100644 packages/services/src/bots/taskStreamHub.ts create mode 100644 packages/services/src/bots/topicContinuation.ts create mode 100644 packages/services/src/bots/topicHistory.ts create mode 100644 packages/services/src/bots/topicHistoryAttachment.ts create mode 100644 packages/services/src/bots/topicPreparationState.ts create mode 100644 packages/services/src/bots/topicResource.ts create mode 100644 packages/services/src/ccbuddy-agent/botTopicAdmission.ts create mode 100644 packages/services/src/ccbuddy-agent/groupAttachmentUpload.ts create mode 100644 packages/services/src/ccbuddy-agent/groupRuntimeSnapshot.ts create mode 100644 packages/services/src/ccbuddy-agent/localRuntimeNetworkCapture.ts create mode 100644 packages/services/src/ccbuddy-agent/topicResourceBridge.ts create mode 100644 packages/services/src/ccbuddy-agent/topicResourcePeers.ts create mode 100644 packages/services/src/ccbuddy-agent/topicResourceRelay.ts create mode 100644 packages/services/src/ccbuddy-agent/topicResourceRelayChannel.ts create mode 100644 packages/services/src/ccbuddy-agent/topicResourceRelayClient.ts create mode 100644 packages/services/src/ccbuddy-agent/topicResourceUpload.ts create mode 100644 packages/services/src/cloud-content/cloudContent.ts create mode 100644 packages/services/src/cloud-content/cloudContentService.ts create mode 100644 packages/services/src/cloud-content/contentBundleCache.ts create mode 100644 packages/services/src/conversation-share/conversationShareInlineImages.ts create mode 100644 packages/services/src/cua-permission-broker/cuaStandaloneStatusLaunch.ts create mode 100644 packages/services/src/cua-permission-broker/stableCuaTransport.ts create mode 100644 packages/services/src/highspeed/highspeedCard.ts create mode 100644 packages/services/src/highspeed/highspeedCardService.ts create mode 100644 packages/services/src/highspeed/highspeedHttpTransport.ts create mode 100644 packages/services/src/highspeed/highspeedMockTransport.ts create mode 100644 packages/services/src/marketing-touch/marketingAssetRegistry.ts create mode 100644 packages/services/src/marketing-touch/marketingTouch.ts create mode 100644 packages/services/src/marketing-touch/marketingTouchService.ts create mode 100644 packages/services/src/model-provider/accountProjectTokenClient.ts create mode 100644 packages/services/src/output-style/outputStyle.ts create mode 100644 packages/services/src/output-style/outputStyleService.ts create mode 100644 packages/services/src/subagents/subagentConfigScope.ts create mode 100644 packages/services/src/subagents/subagentRuntimeConfig.ts create mode 100644 packages/shared/src/api-key-usage-scene.ts create mode 100644 packages/shared/src/attachment-source.ts create mode 100644 packages/shared/src/ccbuddy-protocol-v4/create-session-config.ts create mode 100644 packages/shared/src/ccbuddy-protocol-v4/workflow-command-rejections.ts create mode 100644 packages/shared/src/ccbuddy-protocol-v4/workflow-runs-actor-session.ts create mode 100644 packages/shared/src/ccbuddy-protocol-v4/workflow-runs-holes.ts create mode 100644 packages/shared/src/ccbuddy-protocol/trace.ts create mode 100644 packages/shared/src/ccbuddy-session-content-profile.ts create mode 100644 packages/shared/src/channel-mention.ts create mode 100644 packages/shared/src/cloudContent.ts create mode 100644 packages/shared/src/conversationSelection.ts create mode 100644 packages/shared/src/highspeed.ts create mode 100644 packages/shared/src/marketingTouch.ts create mode 100644 packages/shared/src/memory.ts create mode 100644 packages/shared/src/networkCapture.ts create mode 100644 packages/shared/src/node/networkCapture.ts create mode 100644 packages/shared/src/output-style.ts create mode 100644 packages/shared/src/project-access-token-client.ts create mode 100644 packages/shared/src/project-access-token-response.ts create mode 100644 packages/shared/src/project-access-token.ts create mode 100644 packages/shared/src/request-security-edition/index.ts create mode 100644 packages/shared/src/request-security-edition/policy.ts create mode 100644 packages/shared/src/request-security-edition/verification-policy.ts create mode 100644 packages/shared/src/rewardsBridge.ts create mode 100644 packages/shared/src/rewardsEmbedded.ts create mode 100644 packages/shared/src/subagent-profile-frontmatter.ts create mode 100644 packages/shared/src/subagent-profile-parser.ts create mode 100644 packages/shared/src/subagent-profile.ts create mode 100644 packages/shared/src/subagent-runtime-config.ts create mode 100644 packages/shared/src/web-remote-control-heartbeat.ts create mode 100644 packages/shared/src/web-remote-control-rpc-transport.ts create mode 100644 packages/shared/src/web-remote-control.ts create mode 100644 packages/ui/src/BotsDialog/BoundGroupsCard.tsx create mode 100644 packages/ui/src/BotsDialog/PrivateDeliveryRetry.tsx create mode 100644 packages/ui/src/CodingPlanBillingDiscount.tsx create mode 100644 packages/ui/src/DesktopOverlayWindowControls.tsx create mode 100644 packages/ui/src/ToolCallBlocks/renderers/ExecuteCommand.tsx create mode 100644 packages/ui/src/ToolCallBlocks/renderers/createWorkflowHoleInput.ts create mode 100644 packages/ui/src/ToolCallBlocks/renderers/workflow-fill-row.tsx create mode 100644 packages/ui/src/WebRemoteControlFeatureProvider.tsx create mode 100644 packages/ui/src/WebRemoteControlMobileShell.tsx create mode 100644 packages/ui/src/WebRemoteControlMobileTaskHome.tsx create mode 100644 packages/ui/src/WebRemoteControlTaskIndex.tsx create mode 100644 packages/ui/src/WebRemoteControlTaskIndexRow.tsx create mode 100644 packages/ui/src/WebRemoteControlThemeMenu.tsx create mode 100644 packages/ui/src/WorkflowPermissionHoles.tsx create mode 100644 packages/ui/src/app-shell/WorkflowRunFillFrames.tsx create mode 100644 packages/ui/src/app-shell/WorkflowRunHoleParts.tsx create mode 100644 packages/ui/src/app-shell/WorkflowRunPaneSaveSlots.tsx create mode 100644 packages/ui/src/app-shell/WorkflowRunPhasePills.tsx create mode 100644 packages/ui/src/app-shell/webRemoteNavigationLayout.ts create mode 100644 packages/ui/src/app-shell/workflow-artifacts/ArtifactOpenAsFileButton.tsx create mode 100644 packages/ui/src/assets/highspeed/lightning.svg create mode 100644 packages/ui/src/assets/highspeed/share-card-light.svg create mode 100644 packages/ui/src/assets/highspeed/share-card.svg create mode 100644 packages/ui/src/assets/highspeed/share-dialog-noise-light.png create mode 100644 packages/ui/src/assets/highspeed/share-dialog-noise.png create mode 100644 packages/ui/src/browser-use/BrowserPermissionIcon.tsx create mode 100644 packages/ui/src/browser-use/BrowserSitePermissionsPage.tsx create mode 100644 packages/ui/src/browser-use/BrowserSiteSettingsEntry.tsx create mode 100644 packages/ui/src/browser-use/EmbeddedBrowserPermissionPrompts.tsx create mode 100644 packages/ui/src/browser-use/browserPermissionCapabilities.ts create mode 100644 packages/ui/src/components/cloud-content-dialog/CloudContentDialog.tsx create mode 100644 packages/ui/src/components/cloud-content-dialog/CloudDialogDescription.tsx create mode 100644 packages/ui/src/components/cloud-content-dialog/CloudDialogHero.tsx create mode 100644 packages/ui/src/components/cloud-content-dialog/CloudDialogMediaHero.tsx create mode 100644 packages/ui/src/components/cloud-content-dialog/cloudContentDialogTypes.ts create mode 100644 packages/ui/src/components/cloud-content-dialog/cloudDescriptionStyle.ts create mode 100644 packages/ui/src/components/cloud-content-dialog/cloudLottieRuntime.ts create mode 100644 packages/ui/src/components/cloud-content-dialog/useCloudHeroEnvironment.ts create mode 100644 packages/ui/src/components/icons/dynamicWorkflowModeIcons.ts create mode 100644 packages/ui/src/components/marketing-touch/MarketingBanner.tsx create mode 100644 packages/ui/src/components/marketing-touch/MarketingDialogs.tsx create mode 100644 packages/ui/src/components/marketing-touch/MarketingFailureDialog.tsx create mode 100644 packages/ui/src/components/marketing-touch/MarketingTouchProvider.tsx create mode 100644 packages/ui/src/components/marketing-touch/marketingPopupAdapter.ts create mode 100644 packages/ui/src/components/marketing-touch/marketingResources.ts create mode 100644 packages/ui/src/components/marketing-touch/marketingTouchController.ts create mode 100644 packages/ui/src/components/marketing-touch/marketingTouchPoller.ts create mode 100644 packages/ui/src/components/marketing-touch/useMarketingBannerVisible.ts create mode 100644 packages/ui/src/components/marketing-touch/useMarketingTaskCompletionRefresh.ts create mode 100644 packages/ui/src/components/ui/floating-particles.tsx create mode 100644 packages/ui/src/components/workflow-run-line/WorkflowRunRail.tsx create mode 100644 packages/ui/src/components/workflow-timeline/WorkflowAskSettingsLines.tsx create mode 100644 packages/ui/src/components/workflow-timeline/WorkflowAskSettingsParts.tsx create mode 100644 packages/ui/src/components/workflow-timeline/WorkflowHoleParts.tsx create mode 100644 packages/ui/src/components/workflow-timeline/WorkflowRunSaveControls.tsx create mode 100644 packages/ui/src/components/workflow-timeline/WorkflowSaveFields.tsx create mode 100644 packages/ui/src/components/workflow-timeline/WorkflowSavePopover.tsx create mode 100644 packages/ui/src/components/workflow-timeline/WorkflowStreamChevrons.tsx create mode 100644 packages/ui/src/components/workflow-timeline/WorkflowTimelineFills.tsx create mode 100644 packages/ui/src/components/workflow-timeline/stage-lamps.ts create mode 100644 packages/ui/src/components/workflow-timeline/timeline-frames.ts create mode 100644 packages/ui/src/components/workflow-timeline/timeline-holes.ts create mode 100644 packages/ui/src/components/workflow-timeline/timeline-pill-activity.ts create mode 100644 packages/ui/src/components/workflow-timeline/use-fill-growth.ts create mode 100644 packages/ui/src/components/workflow-timeline/useWorkflowSettingsModelChoices.ts create mode 100644 packages/ui/src/components/workflow-timeline/workflowAskSettings.ts create mode 100644 packages/ui/src/components/workflow-timeline/workflowRunSave.ts create mode 100644 packages/ui/src/feedback/feedbackIcons.tsx create mode 100644 packages/ui/src/gen-ui/domain/sourceFiles.ts create mode 100644 packages/ui/src/global-notice/GlobalNoticeSurface.tsx create mode 100644 packages/ui/src/global-notice/globalNoticeStore.ts create mode 100644 packages/ui/src/highspeed/HighspeedActivationVisual.tsx create mode 100644 packages/ui/src/highspeed/HighspeedModelIndicator.tsx create mode 100644 packages/ui/src/highspeed/HighspeedShareNoticeCard.tsx create mode 100644 packages/ui/src/highspeed/highspeedConversationRows.ts create mode 100644 packages/ui/src/highspeed/highspeedFooterExpiryClock.ts create mode 100644 packages/ui/src/highspeed/highspeedOutputFooter.ts create mode 100644 packages/ui/src/highspeed/highspeedSavedTime.ts create mode 100644 packages/ui/src/highspeed/highspeedSend.ts create mode 100644 packages/ui/src/highspeed/highspeedShare.ts create mode 100644 packages/ui/src/highspeed/highspeedShareDiagnostics.ts create mode 100644 packages/ui/src/highspeed/highspeedTime.ts create mode 100644 packages/ui/src/highspeed/highspeedToastClaims.ts create mode 100644 packages/ui/src/highspeed/highspeedTurnHydration.ts create mode 100644 packages/ui/src/highspeed/highspeedTurnStore.ts create mode 100644 packages/ui/src/highspeed/useHighspeedComposerEntrance.ts create mode 100644 packages/ui/src/hooks/chatActionHelpers.ts create mode 100644 packages/ui/src/hooks/useBotBoundGroups.ts create mode 100644 packages/ui/src/hooks/useBotGroupMemberNames.ts create mode 100644 packages/ui/src/hooks/useBotGroupTask.ts create mode 100644 packages/ui/src/hooks/useBotPrivateDeliveryRetry.ts create mode 100644 packages/ui/src/hooks/useBrowserSitePermissions.ts create mode 100644 packages/ui/src/hooks/useStartPlanEntitlement.ts create mode 100644 packages/ui/src/hooks/useVulnerabilityReportUrl.ts create mode 100644 packages/ui/src/hooks/useWebRemoteControlStatus.ts create mode 100644 packages/ui/src/hooks/useWebRemoteControlTaskOpen.ts create mode 100644 packages/ui/src/hooks/useWorkflowRunSave.ts create mode 100644 packages/ui/src/hooks/useWorkspaceProviderConfigFile.ts create mode 100644 packages/ui/src/lib/ccbuddyProviderPreference.ts create mode 100644 packages/ui/src/lib/ccbuddyProviders.ts create mode 100644 packages/ui/src/lib/conversationTelemetryParityScenarioDefinitions.ts create mode 100644 packages/ui/src/lib/conversationTelemetryParityStateE2E.ts create mode 100644 packages/ui/src/lib/documentHiddenMotionPause.ts create mode 100644 packages/ui/src/lib/marketingNavigation.ts create mode 100644 packages/ui/src/lib/taskRuntimeDisplayStatus.ts create mode 100644 packages/ui/src/lib/webRemoteControlMobileTaskHome.ts create mode 100644 packages/ui/src/lib/webRemoteControlTaskIndex.ts create mode 100644 packages/ui/src/lib/webRemoteControlTaskSync.ts create mode 100644 packages/ui/src/permissionWorkflowSettings.ts create mode 100644 packages/ui/src/request-security-edition/claim.ts create mode 100644 packages/ui/src/request-security-edition/errors.ts create mode 100644 packages/ui/src/request-security-edition/index.ts create mode 100644 packages/ui/src/request-security-edition/messages.ts create mode 100644 packages/ui/src/request-security-edition/parity.ts create mode 100644 packages/ui/src/request-security.ts create mode 100644 packages/ui/src/resource-manager/NetworkSection.tsx create mode 100644 packages/ui/src/rewards/RewardsProvider.tsx create mode 100644 packages/ui/src/rewards/RewardsWebview.tsx create mode 100644 packages/ui/src/settings/DynamicWorkflowModeSetting.tsx create mode 100644 packages/ui/src/settings/recommendedPlugins.json create mode 100644 packages/ui/src/settings/recommendedPlugins.ts create mode 100644 packages/ui/src/sidebar-activity/SidebarBottomActivity.tsx create mode 100644 packages/ui/src/store/embeddedBrowserPermissionStore.ts create mode 100644 packages/ui/src/store/workflowRunSavedStore.ts create mode 100644 packages/ui/src/types/cloudLottie.d.ts create mode 100644 packages/ui/src/v4/BotGroupDeliveryAction.tsx create mode 100644 packages/ui/src/v4/BotGroupMemberNamesContext.ts create mode 100644 packages/ui/src/v4/BotGroupSourceLabel.tsx create mode 100644 packages/ui/src/v4/BotTopicPreparation.tsx create mode 100644 packages/ui/src/v4/ChannelMentionContent.tsx create mode 100644 packages/ui/src/v4/ConversationUserInputBubble.tsx create mode 100644 packages/ui/src/v4/WorkflowNotificationHoleRow.tsx create mode 100644 packages/ui/src/v4/botGroupDeliveryContext.ts create mode 100644 packages/ui/src/v4/conversationRowSharing.ts create mode 100644 packages/ui/src/v4/conversationTurnRenderUnitTypes.ts create mode 100644 packages/ui/src/v4/highspeed/HighSpeedDiffusionCanvas.tsx create mode 100644 packages/ui/src/v4/highspeed/highSpeedDiffusion.ts create mode 100644 packages/ui/src/v4/savedWorkflowHubContext.tsx create mode 100644 packages/ui/src/v4/telemetry/conversationTelemetryParityE2E.ts create mode 100644 packages/ui/src/v4/topicInputMessages.ts create mode 100644 packages/ui/src/v4/topicPreparationRenderUnits.ts create mode 100644 packages/ui/src/webRemoteControlTerminalTransportState.ts create mode 100644 packages/web/src/auth/WebLoggedInWaitingPage.tsx create mode 100644 packages/web/src/auth/WebLoginPage.tsx create mode 100644 packages/web/src/webRemoteControlDeviceInfo.ts create mode 100644 packages/web/src/webRemoteControlFailureScreen.tsx create mode 100644 packages/web/src/webRemoteControlLifecycle.ts create mode 100644 packages/web/src/webRemoteControlRelayAuthProvider.ts create mode 100644 packages/web/src/webRemoteControlRoute.ts create mode 100644 packages/web/src/webRemoteControlTaskRead.ts create mode 100644 packages/web/src/webRemoteControlThemeSeed.ts create mode 100644 packages/web/src/webRemoteControlTransport.ts create mode 100644 packages/web/src/webRemoteControlVersion.ts create mode 100644 packages/web/src/webRemoteControlVersionNotice.tsx create mode 100644 packages/web/src/webRemoteControlWorkspaceBridgeSession.ts create mode 100644 packages/web/vite/remoteFrontendVersion.mjs create mode 100644 scripts/dev-desktop-cua-env.mjs create mode 100644 scripts/download-native-search-tools.mjs create mode 100644 scripts/prebuilt-binary-download.mjs create mode 100644 scripts/stage-dev-cua-plugin-runtime.mjs diff --git a/.agents/skills/ai-elements/SKILL.md b/.agents/skills/ai-elements/SKILL.md index 6c6ed85d..656fdda8 100644 --- a/.agents/skills/ai-elements/SKILL.md +++ b/.agents/skills/ai-elements/SKILL.md @@ -46,7 +46,11 @@ After installing AI Elements components, you can use them in your application li ```tsx title="conversation.tsx" "use client"; -import { Message, MessageContent, MessageResponse } from "@/components/ai-elements/message"; +import { + Message, + MessageContent, + MessageResponse, +} from "@/components/ai-elements/message"; import { useChat } from "@ai-sdk/react"; const Example = () => { @@ -60,7 +64,11 @@ const Example = () => { {parts.map((part, i) => { switch (part.type) { case "text": - return {part.text}; + return ( + + {part.text} + + ); } })} @@ -86,12 +94,16 @@ After installation, no additional setup is needed. The component’s styles (Tai For example, if you'd like to remove the rounding on `Message`, you can go to `components/ai-elements/message.tsx` and remove `rounded-lg` as follows: ```tsx title="components/ai-elements/message.tsx" highlight="8" -export const MessageContent = ({ children, className, ...props }: MessageContentProps) => ( +export const MessageContent = ({ + children, + className, + ...props +}: MessageContentProps) => (
@@ -152,4 +164,4 @@ If none of these answers help, open an [issue on GitHub](https://github.com/verc ## Available Components -See the `references/` folder for detailed documentation on each component. Paths beginning with `scripts/` in those references are examples relative to this skill directory, not repository-root scripts. They are component examples, not installed application features. +See the `references/` folder for detailed documentation on each component. diff --git a/.agents/skills/ai-elements/references/agent.md b/.agents/skills/ai-elements/references/agent.md index c0fd8775..d9ab22e2 100644 --- a/.agents/skills/ai-elements/references/agent.md +++ b/.agents/skills/ai-elements/references/agent.md @@ -61,11 +61,14 @@ const outputSchema = `z.object({ export default function Page() { return ( - + - Analyze the sentiment of the provided text and return a structured analysis with sentiment - classification, confidence score, and summary. + Analyze the sentiment of the provided text and return a structured + analysis with sentiment classification, confidence score, and summary. @@ -91,48 +94,48 @@ export default function Page() { ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any props are spread to the root div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any props are spread to the root div. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | -------- | ------------------------------------------------ | -| `name` | `string` | Required | The name of the agent. | -| `model` | `string` | - | The model identifier (e.g. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `name` | `string` | Required | The name of the agent. | +| `model` | `string` | - | The model identifier (e.g. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ------------------------------------------------ | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | -------- | ------------------------------------------------ | -| `children` | `string` | Required | The instruction text. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `string` | Required | The instruction text. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | ---------------------------------------- | ------- | ------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the Accordion component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the Accordion component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | -------- | ----------------------------------------------------------------------- | -| `tool` | `Tool` | Required | The tool object from the AI SDK containing description and inputSchema. | -| `value` | `string` | Required | Unique identifier for the accordion item. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the AccordionItem component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `tool` | `Tool` | Required | The tool object from the AI SDK containing description and inputSchema. | +| `value` | `string` | Required | Unique identifier for the accordion item. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the AccordionItem component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | -------- | ------------------------------------------------------------------- | -| `schema` | `string` | Required | The output schema as a string (displayed with syntax highlighting). | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `schema` | `string` | Required | The output schema as a string (displayed with syntax highlighting). | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the container div. | diff --git a/.agents/skills/ai-elements/references/artifact.md b/.agents/skills/ai-elements/references/artifact.md index bfed329c..88324728 100644 --- a/.agents/skills/ai-elements/references/artifact.md +++ b/.agents/skills/ai-elements/references/artifact.md @@ -41,51 +41,51 @@ See `scripts/artifact.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | --------------------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | --------------------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | --------------------------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying paragraph element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying paragraph element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | --------------------------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying paragraph element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying paragraph element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | --------------------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------- | ------------------------------------------------------------------------ | -| `tooltip` | `string` | - | Tooltip text to display on hover. | -| `label` | `string` | - | Screen reader label for the action button. | -| `icon` | `LucideIcon` | - | Lucide icon component to display in the button. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `tooltip` | `string` | - | Tooltip text to display on hover. | +| `label` | `string` | - | Screen reader label for the action button. | +| `icon` | `LucideIcon` | - | Lucide icon component to display in the button. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------- | ------------------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | --------------------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the underlying div element. | diff --git a/.agents/skills/ai-elements/references/attachments.md b/.agents/skills/ai-elements/references/attachments.md index a3c8a10c..27f54b9c 100644 --- a/.agents/skills/ai-elements/references/attachments.md +++ b/.agents/skills/ai-elements/references/attachments.md @@ -95,82 +95,82 @@ See `scripts/attachments-list.tsx` for this example. Container component that sets the layout variant. -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ------------------------------------- | -| `variant` | `unknown` | - | The display layout variant. | -| `...props` | `React.HTMLAttributes` | - | Spread to the underlying div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `variant` | `unknown` | - | The display layout variant. | +| `...props` | `React.HTMLAttributes` | - | Spread to the underlying div element. | ### `` Individual attachment item wrapper. -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ----------------------------------------------------------------- | -| `data` | `unknown` | - | The attachment data (FileUIPart or SourceDocumentUIPart with id). | -| `onRemove` | `() => void` | - | Callback fired when the remove button is clicked. | -| `...props` | `React.HTMLAttributes` | - | Spread to the underlying div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `data` | `unknown` | - | The attachment data (FileUIPart or SourceDocumentUIPart with id). | +| `onRemove` | `() => void` | - | Callback fired when the remove button is clicked. | +| `...props` | `React.HTMLAttributes` | - | Spread to the underlying div element. | ### `` Displays the media preview (image, video, or icon). -| Prop | Type | Default | Description | -| -------------- | -------------------------------------- | ------- | ---------------------------------------------------- | -| `fallbackIcon` | `React.ReactNode` | - | Custom icon to display when no preview is available. | -| `...props` | `React.HTMLAttributes` | - | Spread to the underlying div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `fallbackIcon` | `React.ReactNode` | - | Custom icon to display when no preview is available. | +| `...props` | `React.HTMLAttributes` | - | Spread to the underlying div element. | ### `` Displays the filename and optional media type. -| Prop | Type | Default | Description | -| --------------- | -------------------------------------- | ------- | -------------------------------------------------- | -| `showMediaType` | `boolean` | `false` | Whether to show the media type below the filename. | -| `...props` | `React.HTMLAttributes` | - | Spread to the underlying div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `showMediaType` | `boolean` | `false` | Whether to show the media type below the filename. | +| `...props` | `React.HTMLAttributes` | - | Spread to the underlying div element. | ### `` Remove button that appears on hover. -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------- | ------------------------------------------ | -| `label` | `string` | - | Screen reader label for the button. | -| `...props` | `React.ComponentProps` | - | Spread to the underlying Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `label` | `string` | - | Screen reader label for the button. | +| `...props` | `React.ComponentProps` | - | Spread to the underlying Button component. | ### `` Wrapper for hover preview functionality. -| Prop | Type | Default | Description | -| ------------ | ---------------------------------------- | ------- | --------------------------------------------- | -| `openDelay` | `number` | `0` | Delay in ms before opening the hover card. | -| `closeDelay` | `number` | `0` | Delay in ms before closing the hover card. | -| `...props` | `React.ComponentProps` | - | Spread to the underlying HoverCard component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `openDelay` | `number` | `0` | Delay in ms before opening the hover card. | +| `closeDelay` | `number` | `0` | Delay in ms before closing the hover card. | +| `...props` | `React.ComponentProps` | - | Spread to the underlying HoverCard component. | ### `` Trigger element for the hover card. -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ---------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Spread to the underlying HoverCardTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Spread to the underlying HoverCardTrigger component. | ### `` Content displayed in the hover card. -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ---------------------------------------------------- | -| `align` | `unknown` | - | Alignment of the hover card content. | -| `...props` | `React.ComponentProps` | - | Spread to the underlying HoverCardContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `align` | `unknown` | - | Alignment of the hover card content. | +| `...props` | `React.ComponentProps` | - | Spread to the underlying HoverCardContent component. | ### `` Empty state component when no attachments are present. -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the underlying div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the underlying div element. | ## Utility Functions diff --git a/.agents/skills/ai-elements/references/audio-player.md b/.agents/skills/ai-elements/references/audio-player.md index 0fbc6f50..84b872f3 100644 --- a/.agents/skills/ai-elements/references/audio-player.md +++ b/.agents/skills/ai-elements/references/audio-player.md @@ -51,91 +51,91 @@ See `scripts/audio-player-remote.tsx` for this example. Root MediaController component. Accepts all MediaController props except `audio` (which is set to `true` by default). -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------------- | ------- | ------------------------------------------------------------------------------- | -| `style` | `CSSProperties` | - | Custom CSS properties can be passed to override media-chrome theming variables. | -| `...props` | `Omit, ` | - | Any other props are spread to the MediaController component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `style` | `CSSProperties` | - | Custom CSS properties can be passed to override media-chrome theming variables. | +| `...props` | `Omit, ` | - | Any other props are spread to the MediaController component. | ### `` The audio element that contains the media source. Accepts either a remote URL or AI SDK Speech Result data. -| Prop | Type | Default | Description | -| ---------- | ---------------------------- | ------- | -------------------------------------------------------------------------------- | -| `src` | `string` | - | The URL of the audio file to play (for remote audio). | -| `data` | `SpeechResult[` | - | AI SDK Speech Result audio data with base64 encoding (for AI-generated audio). | -| `...props` | `Omit` Container for control buttons, wraps children in a ButtonGroup. -| Prop | Type | Default | Description | -| ---------- | ---------------------------------------------- | ------- | ------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaControlBar component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaControlBar component. | ### `` Play/pause button wrapped in a shadcn Button component. -| Prop | Type | Default | Description | -| ---------- | ---------------------------------------------- | ------- | ------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaPlayButton component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaPlayButton component. | ### `` Seek backward button wrapped in a shadcn Button component. -| Prop | Type | Default | Description | -| ------------ | ------------------------------------------------------ | ------- | -------------------------------------------------------------------- | -| `seekOffset` | `number` | `10` | The number of seconds to seek backward. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaSeekBackwardButton component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `seekOffset` | `number` | `10` | The number of seconds to seek backward. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaSeekBackwardButton component. | ### `` Seek forward button wrapped in a shadcn Button component. -| Prop | Type | Default | Description | -| ------------ | ----------------------------------------------------- | ------- | ------------------------------------------------------------------- | -| `seekOffset` | `number` | `10` | The number of seconds to seek forward. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaSeekForwardButton component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `seekOffset` | `number` | `10` | The number of seconds to seek forward. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaSeekForwardButton component. | ### `` Displays the current playback time, wrapped in ButtonGroupText. -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaTimeDisplay component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaTimeDisplay component. | ### `` Seek slider for controlling playback position, wrapped in ButtonGroupText. -| Prop | Type | Default | Description | -| ---------- | --------------------------------------------- | ------- | ----------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaTimeRange component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaTimeRange component. | ### `` Displays the total duration of the audio, wrapped in ButtonGroupText. -| Prop | Type | Default | Description | -| ---------- | --------------------------------------------------- | ------- | ----------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaDurationDisplay component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaDurationDisplay component. | ### `` Mute/unmute button, wrapped in ButtonGroupText. -| Prop | Type | Default | Description | -| ---------- | ---------------------------------------------- | ------- | ------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaMuteButton component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaMuteButton component. | ### `` Volume slider control, wrapped in ButtonGroupText. -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaVolumeRange component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the MediaVolumeRange component. | diff --git a/.agents/skills/ai-elements/references/canvas.md b/.agents/skills/ai-elements/references/canvas.md index f8b75028..8c746570 100644 --- a/.agents/skills/ai-elements/references/canvas.md +++ b/.agents/skills/ai-elements/references/canvas.md @@ -11,6 +11,8 @@ A React Flow-based canvas component for building interactive node-based interfac The `Canvas` component provides a React Flow-based canvas for building interactive node-based interfaces. It comes pre-configured with sensible defaults for AI applications, including panning, zooming, and selection behaviors. + + ## Installation ```bash @@ -33,7 +35,7 @@ npx ai-elements@latest add canvas ### `` -| Prop | Type | Default | Description | -| ---------- | ---------------- | ------- | --------------------------------------------------------------------------------------- | -| `children` | `ReactNode` | - | Child components like Background, Controls, or MiniMap. | -| `...props` | `ReactFlowProps` | - | Any other React Flow props like nodes, edges, nodeTypes, edgeTypes, onNodesChange, etc. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `ReactNode` | - | Child components like Background, Controls, or MiniMap. | +| `...props` | `ReactFlowProps` | - | Any other React Flow props like nodes, edges, nodeTypes, edgeTypes, onNodesChange, etc. | diff --git a/.agents/skills/ai-elements/references/chain-of-thought.md b/.agents/skills/ai-elements/references/chain-of-thought.md index 22ba304b..1c0b8173 100644 --- a/.agents/skills/ai-elements/references/chain-of-thought.md +++ b/.agents/skills/ai-elements/references/chain-of-thought.md @@ -38,51 +38,51 @@ npx ai-elements@latest add chain-of-thought ### `` -| Prop | Type | Default | Description | -| -------------- | ------------------------- | ------- | --------------------------------------------------- | -| `open` | `boolean` | - | Controlled open state of the collapsible. | -| `defaultOpen` | `boolean` | `false` | Default open state when uncontrolled. | -| `onOpenChange` | `(open: boolean) => void` | - | Callback when the open state changes. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the root div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `open` | `boolean` | - | Controlled open state of the collapsible. | +| `defaultOpen` | `boolean` | `false` | Default open state when uncontrolled. | +| `onOpenChange` | `(open: boolean) => void` | - | Callback when the open state changes. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the root div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | ------- | --------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Custom header text. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Custom header text. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger component. | ### `` -| Prop | Type | Default | Description | -| ------------- | ----------------------- | --------- | --------------------------------------------------- | -| `icon` | `LucideIcon` | `DotIcon` | Icon to display for the step. | -| `label` | `string` | - | The main text label for the step. | -| `description` | `string` | - | Optional description text shown below the label. | -| `status` | `unknown` | - | Visual status of the step. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the root div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `icon` | `LucideIcon` | `DotIcon` | Icon to display for the step. | +| `label` | `string` | - | The main text label for the step. | +| `description` | `string` | - | Optional description text shown below the label. | +| `status` | `unknown` | - | Visual status of the step. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the root div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | -------------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any props are spread to the container div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any props are spread to the container div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------ | ------- | -------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any props are spread to the Badge component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any props are spread to the Badge component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | ------- | --------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any props are spread to the CollapsibleContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any props are spread to the CollapsibleContent component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | -------------------------------------------------------- | -| `caption` | `string` | - | Optional caption text displayed below the image. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the container div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `caption` | `string` | - | Optional caption text displayed below the image. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the container div element. | diff --git a/.agents/skills/ai-elements/references/checkpoint.md b/.agents/skills/ai-elements/references/checkpoint.md index 420bb512..5c3182c0 100644 --- a/.agents/skills/ai-elements/references/checkpoint.md +++ b/.agents/skills/ai-elements/references/checkpoint.md @@ -40,9 +40,20 @@ Add the following component to your frontend: import { useState, Fragment } from "react"; import { useChat } from "@ai-sdk/react"; -import { Checkpoint, CheckpointIcon, CheckpointTrigger } from "@/components/ai-elements/checkpoint"; -import { Message, MessageContent, MessageResponse } from "@/components/ai-elements/message"; -import { Conversation, ConversationContent } from "@/components/ai-elements/conversation"; +import { + Checkpoint, + CheckpointIcon, + CheckpointTrigger, +} from "@/components/ai-elements/checkpoint"; +import { + Message, + MessageContent, + MessageResponse, +} from "@/components/ai-elements/message"; +import { + Conversation, + ConversationContent, +} from "@/components/ai-elements/conversation"; type CheckpointType = { id: string; @@ -77,7 +88,9 @@ const CheckpointDemo = () => { {messages.map((message, index) => { - const checkpoint = checkpoints.find((cp) => cp.messageIndex === index); + const checkpoint = checkpoints.find( + (cp) => cp.messageIndex === index + ); return ( @@ -89,7 +102,11 @@ const CheckpointDemo = () => { {checkpoint && ( - restoreToCheckpoint(checkpoint.messageIndex)}> + + restoreToCheckpoint(checkpoint.messageIndex) + } + > Restore checkpoint @@ -113,7 +130,9 @@ export default CheckpointDemo; Allow users to manually create checkpoints at important conversation points: ```tsx - + ``` ### Automatic Checkpoints @@ -148,24 +167,24 @@ const restoreAndBranch = (messageIndex: number) => { ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ------------------------------------------------------------------------------------------ | -| `children` | `React.ReactNode` | - | The checkpoint icon and trigger components. Automatically includes a Separator at the end. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | The checkpoint icon and trigger components. Automatically includes a Separator at the end. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root div. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------- | ------- | ----------------------------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Custom icon content. If not provided, defaults to a BookmarkIcon from lucide-react. | -| `...props` | `LucideProps` | - | Any other props are spread to the BookmarkIcon component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Custom icon content. If not provided, defaults to a BookmarkIcon from lucide-react. | +| `...props` | `LucideProps` | - | Any other props are spread to the BookmarkIcon component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------- | ------------------------------------------------------------------------ | -| `children` | `React.ReactNode` | - | The text or content to display in the trigger button. | -| `tooltip` | `string` | - | Optional tooltip text shown on hover. | -| `variant` | `string` | - | The button variant style. | -| `size` | `string` | - | The button size. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | The text or content to display in the trigger button. | +| `tooltip` | `string` | - | Optional tooltip text shown on hover. | +| `variant` | `string` | - | The button variant style. | +| `size` | `string` | - | The button size. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | diff --git a/.agents/skills/ai-elements/references/code-block.md b/.agents/skills/ai-elements/references/code-block.md index 7e85ee4a..69d44274 100644 --- a/.agents/skills/ai-elements/references/code-block.md +++ b/.agents/skills/ai-elements/references/code-block.md @@ -77,69 +77,69 @@ See `scripts/code-block.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ----------------- | ----------------- | ------- | ------------------------------------------------- | -| `code` | `string` | - | The code content to display. | -| `language` | `BundledLanguage` | - | The programming language for syntax highlighting. | -| `showLineNumbers` | `boolean` | `false` | Whether to show line numbers. | -| `children` | `React.ReactNode` | - | Child elements like CodeBlockHeader. | -| `className` | `string` | - | Additional CSS classes. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `code` | `string` | - | The code content to display. | +| `language` | `BundledLanguage` | - | The programming language for syntax highlighting. | +| `showLineNumbers` | `boolean` | `false` | Whether to show line numbers. | +| `children` | `React.ReactNode` | - | Child elements like CodeBlockHeader. | +| `className` | `string` | - | Additional CSS classes. | ### `` Container for the header row. Uses flexbox with `justify-between`. -| Prop | Type | Default | Description | -| ----------- | ----------------- | ------- | -------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Header content (CodeBlockTitle, CodeBlockActions, etc.). | -| `className` | `string` | - | Additional CSS classes. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Header content (CodeBlockTitle, CodeBlockActions, etc.). | +| `className` | `string` | - | Additional CSS classes. | ### `` Left-aligned container for icon and filename. Uses flexbox with `gap-2`. -| Prop | Type | Default | Description | -| ----------- | ----------------- | ------- | ---------------------------------------------- | -| `children` | `React.ReactNode` | - | Title content (icon, CodeBlockFilename, etc.). | -| `className` | `string` | - | Additional CSS classes. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Title content (icon, CodeBlockFilename, etc.). | +| `className` | `string` | - | Additional CSS classes. | ### `` Displays the filename in monospace font. -| Prop | Type | Default | Description | -| ----------- | ----------------- | ------- | ------------------------ | -| `children` | `React.ReactNode` | - | The filename to display. | -| `className` | `string` | - | Additional CSS classes. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | The filename to display. | +| `className` | `string` | - | Additional CSS classes. | ### `` Right-aligned container for action buttons. Uses flexbox with `gap-2`. -| Prop | Type | Default | Description | -| ----------- | ----------------- | ------- | ---------------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Action buttons (CodeBlockCopyButton, CodeBlockLanguageSelector, etc.). | -| `className` | `string` | - | Additional CSS classes. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Action buttons (CodeBlockCopyButton, CodeBlockLanguageSelector, etc.). | +| `className` | `string` | - | Additional CSS classes. | ### `` -| Prop | Type | Default | Description | -| ----------- | ------------------------ | ------- | ------------------------------------------------------------ | -| `onCopy` | `() => void` | - | Callback fired after a successful copy. | -| `onError` | `(error: Error) => void` | - | Callback fired if copying fails. | -| `timeout` | `number` | `2000` | How long to show the copied state (ms). | -| `children` | `React.ReactNode` | - | Custom content for the button. Defaults to copy/check icons. | -| `className` | `string` | - | Additional CSS classes. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `onCopy` | `() => void` | - | Callback fired after a successful copy. | +| `onError` | `(error: Error) => void` | - | Callback fired if copying fails. | +| `timeout` | `number` | `2000` | How long to show the copied state (ms). | +| `children` | `React.ReactNode` | - | Custom content for the button. Defaults to copy/check icons. | +| `className` | `string` | - | Additional CSS classes. | ### `` Wrapper for the language selector. Extends shadcn/ui Select. -| Prop | Type | Default | Description | -| --------------- | ------------------------- | ------- | ---------------------------------------------- | -| `value` | `string` | - | The currently selected language. | -| `onValueChange` | `(value: string) => void` | - | Callback when the language changes. | -| `children` | `React.ReactNode` | - | Selector components (Trigger, Content, Items). | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `value` | `string` | - | The currently selected language. | +| `onValueChange` | `(value: string) => void` | - | Callback when the language changes. | +| `children` | `React.ReactNode` | - | Selector components (Trigger, Content, Items). | ### `` @@ -157,10 +157,10 @@ Dropdown content container. Defaults to `align="end"`. Individual language option in the dropdown. -| Prop | Type | Default | Description | -| ---------- | ----------------- | ------- | ------------------- | -| `value` | `string` | - | The language value. | -| `children` | `React.ReactNode` | - | The display label. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `value` | `string` | - | The language value. | +| `children` | `React.ReactNode` | - | The display label. | ### `` @@ -170,8 +170,8 @@ Low-level container component with performance optimizations (`contentVisibility Low-level component that handles syntax highlighting. Used internally by CodeBlock, but can be used directly for custom layouts. -| Prop | Type | Default | Description | -| ----------------- | ----------------- | ------- | ------------------------------------------------- | -| `code` | `string` | - | The code content to display. | -| `language` | `BundledLanguage` | - | The programming language for syntax highlighting. | -| `showLineNumbers` | `boolean` | `false` | Whether to show line numbers. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `code` | `string` | - | The code content to display. | +| `language` | `BundledLanguage` | - | The programming language for syntax highlighting. | +| `showLineNumbers` | `boolean` | `false` | Whether to show line numbers. | diff --git a/.agents/skills/ai-elements/references/commit.md b/.agents/skills/ai-elements/references/commit.md index 6fd82daf..46991b46 100644 --- a/.agents/skills/ai-elements/references/commit.md +++ b/.agents/skills/ai-elements/references/commit.md @@ -41,144 +41,144 @@ npx ai-elements@latest add commit ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | ------------------------------------ | -| `...props` | `React.ComponentProps` | - | Spread to the Collapsible component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Spread to the Collapsible component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | ------- | ------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Spread to the CollapsibleTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Spread to the CollapsibleTrigger component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | -------- | ------------------------------- | -| `initials` | `string` | Required | Author initials to display. | -| `...props` | `React.ComponentProps` | - | Spread to the Avatar component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `initials` | `string` | Required | Author initials to display. | +| `...props` | `React.ComponentProps` | - | Spread to the Avatar component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | ------- | --------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | ------- | --------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | ------- | --------------------------- | -| `children` | `React.ReactNode` | - | Custom separator content. | -| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Custom separator content. | +| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | -------- | ---------------------------------------------------- | -| `date` | `Date` | Required | Commit date. | -| `children` | `React.ReactNode` | - | Custom timestamp content. Defaults to relative time. | -| `...props` | `React.HTMLAttributes` | - | Spread to the time element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `date` | `Date` | Required | Commit date. | +| `children` | `React.ReactNode` | - | Custom timestamp content. Defaults to relative time. | +| `...props` | `React.HTMLAttributes` | - | Spread to the time element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | -------- | ----------------------------------- | -| `hash` | `string` | Required | Commit hash to copy. | -| `onCopy` | `() => void` | - | Callback after successful copy. | -| `onError` | `(error: Error) => void` | - | Callback if copying fails. | -| `timeout` | `number` | `2000` | Duration to show copied state (ms). | -| `...props` | `React.ComponentProps` | - | Spread to the Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `hash` | `string` | Required | Commit hash to copy. | +| `onCopy` | `() => void` | - | Callback after successful copy. | +| `onError` | `(error: Error) => void` | - | Callback if copying fails. | +| `timeout` | `number` | `2000` | Duration to show copied state (ms). | +| `...props` | `React.ComponentProps` | - | Spread to the Button component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | ------- | ------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Spread to the CollapsibleContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Spread to the CollapsibleContent component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the row div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the row div. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | -------- | --------------------------- | -| `status` | `unknown` | Required | File change status. | -| `children` | `React.ReactNode` | - | Custom status label. | -| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `status` | `unknown` | Required | File change status. | +| `children` | `React.ReactNode` | - | Custom status label. | +| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | ------- | --------------------------------- | -| `...props` | `React.ComponentProps` | - | Spread to the FileIcon component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Spread to the FileIcon component. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | ------- | --------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | -------- | --------------------------- | -| `count` | `number` | Required | Number of lines added. | -| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `count` | `number` | Required | Number of lines added. | +| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | -------- | --------------------------- | -| `count` | `number` | Required | Number of lines deleted. | -| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `count` | `number` | Required | Number of lines deleted. | +| `...props` | `React.HTMLAttributes` | - | Spread to the span element. | diff --git a/.agents/skills/ai-elements/references/confirmation.md b/.agents/skills/ai-elements/references/confirmation.md index 7a6456d9..49ffbec0 100644 --- a/.agents/skills/ai-elements/references/confirmation.md +++ b/.agents/skills/ai-elements/references/confirmation.md @@ -68,9 +68,9 @@ const Example = () => { }; const latestMessage = messages[messages.length - 1]; - const deleteTool = latestMessage?.parts?.find((part) => part.type === "tool-delete_file") as - | DeleteFileToolUIPart - | undefined; + const deleteTool = latestMessage?.parts?.find( + (part) => part.type === "tool-delete_file" + ) as DeleteFileToolUIPart | undefined; return (
@@ -82,7 +82,8 @@ const Example = () => { {deleteTool?.approval && ( - This tool wants to delete: {deleteTool.input?.filePath} + This tool wants to delete:{" "} + {deleteTool.input?.filePath}
Do you approve this action?
@@ -221,48 +222,48 @@ See `scripts/confirmation-rejected.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ----------- | ------------------------------------ | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `approval` | `ToolUIPart[` | - | The approval object containing the approval ID and status. If not provided or undefined, the component will not render. | -| `state` | `ToolUIPart[` | - | The current state of the tool (input-streaming, input-available, approval-requested, approval-responded, output-denied, or output-available). Will not render for input-streaming or input-available states. | -| `className` | `string` | - | Additional CSS classes to apply to the Alert component. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the Alert component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `approval` | `ToolUIPart[` | - | The approval object containing the approval ID and status. If not provided or undefined, the component will not render. | +| `state` | `ToolUIPart[` | - | The current state of the tool (input-streaming, input-available, approval-requested, approval-responded, output-denied, or output-available). Will not render for input-streaming or input-available states. | +| `className` | `string` | - | Additional CSS classes to apply to the Alert component. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the Alert component. | ### `` A styled description element for displaying a title or label within the confirmation alert. -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying AlertDescription component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying AlertDescription component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------- | ------- | ----------------------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | The content to display when approval is requested. Only renders when state is | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | The content to display when approval is requested. Only renders when state is | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------- | ------- | ---------------------------------------------------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | The content to display when approval is accepted. Only renders when approval.approved is true and state is | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | The content to display when approval is accepted. Only renders when approval.approved is true and state is | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------- | ------- | ----------------------------------------------------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | The content to display when approval is rejected. Only renders when approval.approved is false and state is | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | The content to display when approval is rejected. Only renders when approval.approved is false and state is | ### `` -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ------------------------------------------------------------------------- | -| `className` | `string` | - | Additional CSS classes to apply to the actions container. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. Only renders when state is | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes to apply to the actions container. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. Only renders when state is | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the Button component. Styled with h-8 px-3 text-sm classes by default. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the Button component. Styled with h-8 px-3 text-sm classes by default. | diff --git a/.agents/skills/ai-elements/references/connection.md b/.agents/skills/ai-elements/references/connection.md index fff96490..ed8325ff 100644 --- a/.agents/skills/ai-elements/references/connection.md +++ b/.agents/skills/ai-elements/references/connection.md @@ -11,6 +11,8 @@ A custom connection line component for React Flow-based canvases with animated b The `Connection` component provides a styled connection line for React Flow canvases. It renders an animated bezier curve with a circle indicator at the target end, using consistent theming through CSS variables. + + ## Installation ```bash @@ -31,9 +33,9 @@ npx ai-elements@latest add connection ### `` -| Prop | Type | Default | Description | -| ------- | -------- | ------- | ----------------------------------------------- | -| `fromX` | `number` | - | The x-coordinate of the connection start point. | -| `fromY` | `number` | - | The y-coordinate of the connection start point. | -| `toX` | `number` | - | The x-coordinate of the connection end point. | -| `toY` | `number` | - | The y-coordinate of the connection end point. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `fromX` | `number` | - | The x-coordinate of the connection start point. | +| `fromY` | `number` | - | The y-coordinate of the connection start point. | +| `toX` | `number` | - | The x-coordinate of the connection end point. | +| `toY` | `number` | - | The y-coordinate of the connection end point. | diff --git a/.agents/skills/ai-elements/references/context.md b/.agents/skills/ai-elements/references/context.md index 313d1a51..a93fc643 100644 --- a/.agents/skills/ai-elements/references/context.md +++ b/.agents/skills/ai-elements/references/context.md @@ -36,58 +36,58 @@ npx ai-elements@latest add context ### `` -| Prop | Type | Default | Description | -| ------------ | --------------------------- | ------- | ----------------------------------------------------------------------------------------- | -| `maxTokens` | `number` | - | The total context window size in tokens. | -| `usedTokens` | `number` | - | The number of tokens currently used. | -| `usage` | `LanguageModelUsage` | - | Detailed token usage breakdown from the AI SDK (input, output, reasoning, cached tokens). | -| `modelId` | `ModelId` | - | Model identifier for cost calculation (e.g., | -| `...props` | `ComponentProps` | - | Any other props are spread to the HoverCard component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `maxTokens` | `number` | - | The total context window size in tokens. | +| `usedTokens` | `number` | - | The number of tokens currently used. | +| `usage` | `LanguageModelUsage` | - | Detailed token usage breakdown from the AI SDK (input, output, reasoning, cached tokens). | +| `modelId` | `ModelId` | - | Model identifier for cost calculation (e.g., | +| `...props` | `ComponentProps` | - | Any other props are spread to the HoverCard component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------ | ------- | ------------------------------------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Custom trigger element. If not provided, renders a default button with percentage and icon. | -| `...props` | `ComponentProps} + {!hasPermission && ( + + )}
); } @@ -143,13 +146,13 @@ export default function Example() { #### Return Value -| Prop | Type | Default | Description | -| --------------- | --------------------- | ------- | ---------------------------------------------------------------- | --------------------------------------- | -| `devices` | `MediaDeviceInfo[]` | - | Array of available audio input devices. | -| `loading` | `boolean` | - | Whether devices are currently being loaded. | -| `error` | `string | null` | - | Error message if device loading failed. | -| `hasPermission` | `boolean` | - | Whether microphone permission has been granted. | -| `loadDevices` | `() => Promise` | - | Function to request microphone permission and load device names. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `devices` | `MediaDeviceInfo[]` | - | Array of available audio input devices. | +| `loading` | `boolean` | - | Whether devices are currently being loaded. | +| `error` | `string | null` | - | Error message if device loading failed. | +| `hasPermission` | `boolean` | - | Whether microphone permission has been granted. | +| `loadDevices` | `() => Promise` | - | Function to request microphone permission and load device names. | ## Behavior diff --git a/.agents/skills/ai-elements/references/model-selector.md b/.agents/skills/ai-elements/references/model-selector.md index e5b9851a..7250a323 100644 --- a/.agents/skills/ai-elements/references/model-selector.md +++ b/.agents/skills/ai-elements/references/model-selector.md @@ -34,86 +34,86 @@ npx ai-elements@latest add model-selector ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------- | -------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Dialog component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Dialog component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | --------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DialogTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DialogTrigger component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | --------------------------------------------------------------------- | -| `title` | `ReactNode` | - | Accessible title for the dialog (rendered in sr-only). | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DialogContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `title` | `ReactNode` | - | Accessible title for the dialog (rendered in sr-only). | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DialogContent component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | --------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandDialog component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandDialog component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------- | ------- | -------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandInput component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandInput component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | ------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandList component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandList component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------- | ------- | -------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandEmpty component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandEmpty component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------- | ------- | -------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandGroup component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandGroup component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | ------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandItem component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandItem component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ---------------------------------------------- | ------- | ----------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandShortcut component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandShortcut component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandSeparator component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CommandSeparator component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ---------------------------- | -------- | -------------------------------------------------------------------------------------------------- | -| `provider` | `string` | Required | The AI provider name. Supports major providers like | -| `...props` | `Omit` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | --------------------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ---------------------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying span element. | diff --git a/.agents/skills/ai-elements/references/node.md b/.agents/skills/ai-elements/references/node.md index efee37bb..cff8053a 100644 --- a/.agents/skills/ai-elements/references/node.md +++ b/.agents/skills/ai-elements/references/node.md @@ -11,6 +11,8 @@ A composable node component for React Flow-based canvases with Card-based stylin The `Node` component provides a composable, Card-based node for React Flow canvases. It includes support for connection handles, structured layouts, and consistent styling using shadcn/ui components. + + ## Installation ```bash @@ -32,47 +34,47 @@ npx ai-elements@latest add node ### `` -| Prop | Type | Default | Description | -| ----------- | ----------------------------- | ------- | -------------------------------------------------------------------------------------- | -| `handles` | `unknown` | - | Configuration for connection handles. Target renders on the left, source on the right. | -| `className` | `string` | - | Additional CSS classes to apply to the node. | -| `...props` | `ComponentProps` | - | Any other props are spread to the underlying Card component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `handles` | `unknown` | - | Configuration for connection handles. Target renders on the left, source on the right. | +| `className` | `string` | - | Additional CSS classes to apply to the node. | +| `...props` | `ComponentProps` | - | Any other props are spread to the underlying Card component. | ### `` -| Prop | Type | Default | Description | -| ----------- | ----------------------------------- | ------- | ------------------------------------------------------------------ | -| `className` | `string` | - | Additional CSS classes to apply to the header. | -| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardHeader component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes to apply to the header. | +| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardHeader component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ---------------------------------- | ------- | ----------------------------------------------------------------- | -| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardTitle component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardTitle component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ---------------------------------------- | ------- | ----------------------------------------------------------------------- | -| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardDescription component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardDescription component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------- | ------- | ------------------------------------------------------------------ | -| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardAction component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardAction component. | ### `` -| Prop | Type | Default | Description | -| ----------- | ------------------------------------ | ------- | ------------------------------------------------------------------- | -| `className` | `string` | - | Additional CSS classes to apply to the content. | -| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes to apply to the content. | +| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardContent component. | ### `` -| Prop | Type | Default | Description | -| ----------- | ----------------------------------- | ------- | ------------------------------------------------------------------ | -| `className` | `string` | - | Additional CSS classes to apply to the footer. | -| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardFooter component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes to apply to the footer. | +| `...props` | `ComponentProps` | - | Any other props are spread to the underlying CardFooter component. | diff --git a/.agents/skills/ai-elements/references/open-in-chat.md b/.agents/skills/ai-elements/references/open-in-chat.md index dc06e18d..202b2d52 100644 --- a/.agents/skills/ai-elements/references/open-in-chat.md +++ b/.agents/skills/ai-elements/references/open-in-chat.md @@ -44,30 +44,30 @@ npx ai-elements@latest add open-in-chat ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------- | ------- | ------------------------------------------------------------------ | -| `query` | `string` | - | The query text to be sent to all AI platforms. | -| `...props` | `React.ComponentProps` | - | Props to spread to the underlying radix-ui DropdownMenu component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `query` | `string` | - | The query text to be sent to all AI platforms. | +| `...props` | `React.ComponentProps` | - | Props to spread to the underlying radix-ui DropdownMenu component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------------- | ------- | ---------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Custom trigger button. | -| `...props` | `React.ComponentProps` | - | Props to spread to the underlying DropdownMenuTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Custom trigger button. | +| `...props` | `React.ComponentProps` | - | Props to spread to the underlying DropdownMenuTrigger component. | ### `` -| Prop | Type | Default | Description | -| ----------- | -------------------------------------------------- | ------- | ---------------------------------------------------------------- | -| `className` | `string` | - | Additional CSS classes to apply to the dropdown content. | -| `...props` | `React.ComponentProps` | - | Props to spread to the underlying DropdownMenuContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes to apply to the dropdown content. | +| `...props` | `React.ComponentProps` | - | Props to spread to the underlying DropdownMenuContent component. | ### ``, ``, ``, ``, ``, `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Props to spread to the underlying DropdownMenuItem component. The query is automatically provided via context from the parent OpenIn component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Props to spread to the underlying DropdownMenuItem component. The query is automatically provided via context from the parent OpenIn component. | ### ``, ``, `` diff --git a/.agents/skills/ai-elements/references/package-info.md b/.agents/skills/ai-elements/references/package-info.md index 7c9751ee..aed93503 100644 --- a/.agents/skills/ai-elements/references/package-info.md +++ b/.agents/skills/ai-elements/references/package-info.md @@ -40,63 +40,63 @@ npx ai-elements@latest add package-info ### `` -| Prop | Type | Default | Description | -| ---------------- | -------------------------------------- | -------- | ---------------------------- | -| `name` | `string` | Required | Package name. | -| `currentVersion` | `string` | - | Current installed version. | -| `newVersion` | `string` | - | New version being installed. | -| `changeType` | `unknown` | - | Type of version change. | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `name` | `string` | Required | Package name. | +| `currentVersion` | `string` | - | Current installed version. | +| `newVersion` | `string` | - | New version being installed. | +| `changeType` | `unknown` | - | Type of version change. | +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the header div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the header div. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Custom name content. Defaults to the name from context. | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Custom name content. Defaults to the name from context. | +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ------------------------------------------------------------------ | -| `children` | `React.ReactNode` | - | Custom change type label. Defaults to the changeType from context. | -| `...props` | `React.HTMLAttributes` | - | Spread to the Badge component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Custom change type label. Defaults to the changeType from context. | +| `...props` | `React.HTMLAttributes` | - | Spread to the Badge component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | --------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Custom version content. Defaults to version transition display. | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Custom version content. Defaults to version transition display. | +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | ------------------------ | -| `...props` | `React.HTMLAttributes` | - | Spread to the p element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the p element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------- | -| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | -------- | ---------------------- | -| `name` | `string` | Required | Dependency name. | -| `version` | `string` | - | Dependency version. | -| `...props` | `React.HTMLAttributes` | - | Spread to the row div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `name` | `string` | Required | Dependency name. | +| `version` | `string` | - | Dependency version. | +| `...props` | `React.HTMLAttributes` | - | Spread to the row div. | diff --git a/.agents/skills/ai-elements/references/panel.md b/.agents/skills/ai-elements/references/panel.md index e38c1682..0c7612a1 100644 --- a/.agents/skills/ai-elements/references/panel.md +++ b/.agents/skills/ai-elements/references/panel.md @@ -11,6 +11,8 @@ A styled panel component for React Flow-based canvases to position custom UI ele The `Panel` component provides a positioned container for custom UI elements on React Flow canvases. It includes modern card styling with backdrop blur and flexible positioning options. + + ## Installation ```bash @@ -31,8 +33,8 @@ npx ai-elements@latest add panel ### `` -| Prop | Type | Default | Description | -| ----------- | ------------------------------ | ------- | --------------------------------------------------- | -| `position` | `unknown` | - | Position of the panel on the canvas. | -| `className` | `string` | - | Additional CSS classes to apply to the panel. | -| `...props` | `ComponentProps` | - | Any other props from @xyflow/react Panel component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `position` | `unknown` | - | Position of the panel on the canvas. | +| `className` | `string` | - | Additional CSS classes to apply to the panel. | +| `...props` | `ComponentProps` | - | Any other props from @xyflow/react Panel component. | diff --git a/.agents/skills/ai-elements/references/persona.md b/.agents/skills/ai-elements/references/persona.md index 3ef7dab3..6ca841a5 100644 --- a/.agents/skills/ai-elements/references/persona.md +++ b/.agents/skills/ai-elements/references/persona.md @@ -63,17 +63,17 @@ See `scripts/persona-command.tsx` for this example. The root component that renders the animated AI visual. -| Prop | Type | Default | Description | -| ------------- | ----------------- | ------- | --------------------------------------------------------------------------- | -| `state` | `unknown` | - | The current state of the AI persona. Controls which animation is displayed. | -| `variant` | `unknown` | - | The visual style variant to display. | -| `className` | `string` | - | Additional CSS classes to apply to the component. | -| `onLoad` | `RiveParameters[` | - | Callback fired when the Rive file starts loading. | -| `onLoadError` | `RiveParameters[` | - | Callback fired if the Rive file fails to load. | -| `onReady` | `() => void` | - | Callback fired when the Rive animation is ready to play. | -| `onPause` | `RiveParameters[` | - | Callback fired when the animation is paused. | -| `onPlay` | `RiveParameters[` | - | Callback fired when the animation starts playing. | -| `onStop` | `RiveParameters[` | - | Callback fired when the animation is stopped. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `state` | `unknown` | - | The current state of the AI persona. Controls which animation is displayed. | +| `variant` | `unknown` | - | The visual style variant to display. | +| `className` | `string` | - | Additional CSS classes to apply to the component. | +| `onLoad` | `RiveParameters[` | - | Callback fired when the Rive file starts loading. | +| `onLoadError` | `RiveParameters[` | - | Callback fired if the Rive file fails to load. | +| `onReady` | `() => void` | - | Callback fired when the Rive animation is ready to play. | +| `onPause` | `RiveParameters[` | - | Callback fired when the animation is paused. | +| `onPlay` | `RiveParameters[` | - | Callback fired when the animation starts playing. | +| `onStop` | `RiveParameters[` | - | Callback fired when the animation is stopped. | ## States @@ -112,9 +112,9 @@ import { Persona } from "@repo/elements/persona"; import { useState } from "react"; export default function App() { - const [state, setState] = useState<"idle" | "listening" | "thinking" | "speaking" | "asleep">( - "idle", - ); + const [state, setState] = useState< + "idle" | "listening" | "thinking" | "speaking" | "asleep" + >("idle"); const startListening = () => setState("listening"); const startThinking = () => setState("thinking"); diff --git a/.agents/skills/ai-elements/references/plan.md b/.agents/skills/ai-elements/references/plan.md index 86f8ddda..bbf1fe87 100644 --- a/.agents/skills/ai-elements/references/plan.md +++ b/.agents/skills/ai-elements/references/plan.md @@ -35,52 +35,52 @@ npx ai-elements@latest add plan ### `` -| Prop | Type | Default | Description | -| ------------- | ------------------------------------------ | ------- | -------------------------------------------------------------------------------------------- | -| `isStreaming` | `boolean` | `false` | Whether content is currently streaming. Enables shimmer animations on title and description. | -| `defaultOpen` | `boolean` | - | Whether the plan is expanded by default. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the Collapsible component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `isStreaming` | `boolean` | `false` | Whether content is currently streaming. Enables shimmer animations on title and description. | +| `defaultOpen` | `boolean` | - | Whether the plan is expanded by default. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the Collapsible component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------- | ------- | ------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CardHeader component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CardHeader component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------------------- | -| `children` | `string` | - | The title text. Displays with shimmer animation when isStreaming is true. | -| `...props` | `Omit, ` | - | Any other props (except children) are spread to the CardTitle component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `string` | - | The title text. Displays with shimmer animation when isStreaming is true. | +| `...props` | `Omit, ` | - | Any other props (except children) are spread to the CardTitle component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------------- | ------- | ------------------------------------------------------------------------------- | -| `children` | `string` | - | The description text. Displays with shimmer animation when isStreaming is true. | -| `...props` | `Omit, ` | - | Any other props (except children) are spread to the CardDescription component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `string` | - | The description text. Displays with shimmer animation when isStreaming is true. | +| `...props` | `Omit, ` | - | Any other props (except children) are spread to the CardDescription component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger component. Renders as a Button with chevron icon. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger component. Renders as a Button with chevron icon. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | -------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CardContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CardContent component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------- | ------- | ------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CardAction component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CardAction component. | diff --git a/.agents/skills/ai-elements/references/prompt-input.md b/.agents/skills/ai-elements/references/prompt-input.md index b3606ff7..14aef512 100644 --- a/.agents/skills/ai-elements/references/prompt-input.md +++ b/.agents/skills/ai-elements/references/prompt-input.md @@ -21,7 +21,7 @@ npx ai-elements@latest add prompt-input ## Usage with AI SDK -Build a fully functional chat app using `PromptInput`, [`Conversation`](conversation.md) with a model picker: +Build a fully functional chat app using `PromptInput`, [`Conversation`](/components/conversation) with a model picker: Add the following component to your frontend: @@ -64,7 +64,11 @@ import { ConversationContent, ConversationScrollButton, } from "@/components/ai-elements/conversation"; -import { Message, MessageContent, MessageResponse } from "@/components/ai-elements/message"; +import { + Message, + MessageContent, + MessageResponse, +} from "@/components/ai-elements/message"; const PromptInputAttachmentsDisplay = () => { const attachments = usePromptInputAttachments(); @@ -119,7 +123,7 @@ const InputDemo = () => { model: model, webSearch: useWebSearch, }, - }, + } ); setText(""); }; @@ -136,7 +140,9 @@ const InputDemo = () => { switch (part.type) { case "text": return ( - {part.text} + + {part.text} + ); default: return null; @@ -149,12 +155,20 @@ const InputDemo = () => {
- + - setText(e.target.value)} value={text} /> + setText(e.target.value)} + value={text} + /> @@ -267,42 +281,42 @@ See `scripts/prompt-input-tooltip.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ----------------- | --------------------------------------------------------- | ------- | ---------------------------------------------------------------------- | -| `onSubmit` | `(message: PromptInputMessage, event: FormEvent) => void` | - | Handler called when the form is submitted with message text and files. | -| `accept` | `string` | - | File types to accept (e.g., | -| `multiple` | `boolean` | - | Whether to allow multiple file selection. | -| `globalDrop` | `boolean` | - | When true, accepts file drops anywhere on the document. | -| `syncHiddenInput` | `boolean` | - | Render a hidden input with given name for native form posts. | -| `maxFiles` | `number` | - | Maximum number of files allowed. | -| `maxFileSize` | `number` | - | Maximum file size in bytes. | -| `onError` | `(err: { code: ` | - | Handler for file validation errors. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root form element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `onSubmit` | `(message: PromptInputMessage, event: FormEvent) => void` | - | Handler called when the form is submitted with message text and files. | +| `accept` | `string` | - | File types to accept (e.g., | +| `multiple` | `boolean` | - | Whether to allow multiple file selection. | +| `globalDrop` | `boolean` | - | When true, accepts file drops anywhere on the document. | +| `syncHiddenInput` | `boolean` | - | Render a hidden input with given name for native form posts. | +| `maxFiles` | `number` | - | Maximum number of files allowed. | +| `maxFileSize` | `number` | - | Maximum file size in bytes. | +| `onError` | `(err: { code: ` | - | Handler for file validation errors. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root form element. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | ------- | ---------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Textarea component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Textarea component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the toolbar div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the toolbar div. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | -------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the tools div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the tools div. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------------------------------------------------- | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------- | -| `tooltip` | `string | { content: ReactNode; shortcut?: string; side?: ` | - | Optional tooltip to display on hover. Can be a string or an object with content, shortcut, and side properties. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `tooltip` | `string | { content: ReactNode; shortcut?: string; side?: ` | - | Optional tooltip to display on hover. Can be a string or an object with content, shortcut, and side properties. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | #### Tooltip Examples @@ -325,196 +339,196 @@ See `scripts/prompt-input-tooltip.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------- | --------------------------------------------------------------------------- | -| `status` | `ChatStatus` | - | Current chat status to determine button icon (submitted, streaming, error). | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `status` | `ChatStatus` | - | Current chat status to determine button icon (submitted, streaming, error). | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------- | -------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Select component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Select component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | --------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying SelectTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying SelectTrigger component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | --------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying SelectContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying SelectContent component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------- | ------- | ------------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying SelectItem component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying SelectItem component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | ------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying SelectValue component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying SelectValue component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the body div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the body div. | ### Attachments -Attachment components have been moved to a separate module. See the [Attachment](attachments.md) component documentation for details on ``, ``, ``, ``, and ``. +Attachment components have been moved to a separate module. See the [Attachment](/components/attachment) component documentation for details on ``, ``, ``, ``, and ``. ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------- | ------- | -------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DropdownMenu component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DropdownMenu component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------- | -------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Button component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------------- | ------- | --------------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DropdownMenuContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DropdownMenuContent component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DropdownMenuItem component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DropdownMenuItem component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------------------ | -| `label` | `string` | - | Label for the menu item. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DropdownMenuItem component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `label` | `string` | - | Label for the menu item. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DropdownMenuItem component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------------------ | -| `label` | `string` | - | Label for the menu item. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DropdownMenuItem component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `label` | `string` | - | Label for the menu item. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying DropdownMenuItem component. | ### `` -| Prop | Type | Default | Description | -| -------------- | ----------------- | ------- | --------------------------------------------------------------- | -| `initialInput` | `string` | - | Initial text input value. | -| `children` | `React.ReactNode` | - | Child components that will have access to the provider context. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `initialInput` | `string` | - | Initial text input value. | +| `children` | `React.ReactNode` | - | Child components that will have access to the provider context. | Optional global provider that lifts PromptInput state outside of PromptInput. When used, it allows you to access and control the input state from anywhere within the provider tree. If not used, PromptInput stays fully self-managed. ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------------- | ------- | --------------------------------------------------------------------------- | -| `...props` | `Omit, ` | - | Any other props (except align) are spread to the InputGroupAddon component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `Omit, ` | - | Any other props (except align) are spread to the InputGroupAddon component. | ### `` -| Prop | Type | Default | Description | -| ------------ | ---------------------------------------- | ------- | ------------------------------------------------------ | -| `openDelay` | `number` | `0` | Delay in milliseconds before opening. | -| `closeDelay` | `number` | `0` | Delay in milliseconds before closing. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the HoverCard component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `openDelay` | `number` | `0` | Delay in milliseconds before opening. | +| `closeDelay` | `number` | `0` | Delay in milliseconds before closing. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the HoverCard component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the HoverCardTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the HoverCardTrigger component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------- | -| `align` | `unknown` | - | Alignment of the hover card content. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the HoverCardContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `align` | `unknown` | - | Alignment of the hover card content. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the HoverCardContent component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | --------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the h3 element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the h3 element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the Command component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the Command component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------- | ------- | --------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandInput component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandInput component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | -------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandList component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandList component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------- | ------- | --------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandEmpty component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandEmpty component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------- | ------- | --------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandGroup component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandGroup component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | -------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandItem component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandItem component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandSeparator component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandSeparator component. | ## Hooks diff --git a/.agents/skills/ai-elements/references/queue.md b/.agents/skills/ai-elements/references/queue.md index 424c45ee..a072bb72 100644 --- a/.agents/skills/ai-elements/references/queue.md +++ b/.agents/skills/ai-elements/references/queue.md @@ -43,100 +43,100 @@ See `scripts/queue-prompt-input.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the root div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the root div. | ### `` -| Prop | Type | Default | Description | -| ------------- | ------------------------------------------ | ------- | -------------------------------------------------------- | -| `defaultOpen` | `boolean` | `true` | Whether the section is open by default. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the Collapsible component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `defaultOpen` | `boolean` | `true` | Whether the section is open by default. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the Collapsible component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ------------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the button element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the button element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ----------------------------------------------- | -| `label` | `string` | - | The label text to display. | -| `count` | `number` | - | The count to display before the label. | -| `icon` | `React.ReactNode` | - | An optional icon to display before the count. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `label` | `string` | - | The label text to display. | +| `count` | `number` | - | The count to display before the label. | +| `icon` | `React.ReactNode` | - | An optional icon to display before the count. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | ------- | --------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------- | ------- | ------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the ScrollArea component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the ScrollArea component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | --------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the li element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the li element. | ### `` -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ------------------------------------------------------------- | -| `completed` | `boolean` | `false` | Whether the item is completed. Affects the indicator styling. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `completed` | `boolean` | `false` | Whether the item is completed. Affects the indicator styling. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ----------------------------------------------------------------------------------- | -| `completed` | `boolean` | `false` | Whether the item is completed. Affects text styling with strikethrough and opacity. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `completed` | `boolean` | `false` | Whether the item is completed. Affects text styling with strikethrough and opacity. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ---------------------------------------------------- | -| `completed` | `boolean` | `false` | Whether the item is completed. Affects text styling. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `completed` | `boolean` | `false` | Whether the item is completed. Affects text styling. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | ----------------------------------------------------------------------------- | -| `...props` | `Omit, ` | - | Any other props (except variant and size) are spread to the Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `Omit, ` | - | Any other props (except variant and size) are spread to the Button component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the img element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the img element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ----------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | ## Type Exports diff --git a/.agents/skills/ai-elements/references/reasoning.md b/.agents/skills/ai-elements/references/reasoning.md index 13808e35..5a3427b8 100644 --- a/.agents/skills/ai-elements/references/reasoning.md +++ b/.agents/skills/ai-elements/references/reasoning.md @@ -30,7 +30,11 @@ Add the following component to your frontend: ```tsx title="app/page.tsx" "use client"; -import { Reasoning, ReasoningContent, ReasoningTrigger } from "@/components/ai-elements/reasoning"; +import { + Reasoning, + ReasoningContent, + ReasoningTrigger, +} from "@/components/ai-elements/reasoning"; import { Conversation, ConversationContent, @@ -43,7 +47,11 @@ import { PromptInputSubmit, } from "@/components/ai-elements/prompt-input"; import { Spinner } from "@/components/ui/spinner"; -import { Message, MessageContent, MessageResponse } from "@/components/ai-elements/message"; +import { + Message, + MessageContent, + MessageResponse, +} from "@/components/ai-elements/message"; import { useState } from "react"; import { useChat } from "@ai-sdk/react"; import type { UIMessage } from "ai"; @@ -58,13 +66,16 @@ const MessageParts = ({ isStreaming: boolean; }) => { // Consolidate all reasoning parts into one block - const reasoningParts = message.parts.filter((part) => part.type === "reasoning"); + const reasoningParts = message.parts.filter( + (part) => part.type === "reasoning" + ); const reasoningText = reasoningParts.map((part) => part.text).join("\n\n"); const hasReasoning = reasoningParts.length > 0; // Check if reasoning is still streaming (last part is reasoning on last message) const lastPart = message.parts.at(-1); - const isReasoningStreaming = isLastMessage && isStreaming && lastPart?.type === "reasoning"; + const isReasoningStreaming = + isLastMessage && isStreaming && lastPart?.type === "reasoning"; return ( <> @@ -76,7 +87,11 @@ const MessageParts = ({ )} {message.parts.map((part, i) => { if (part.type === "text") { - return {part.text}; + return ( + + {part.text} + + ); } return null; })} @@ -117,7 +132,10 @@ const ReasoningDemo = () => { - + ` -| Prop | Type | Default | Description | -| -------------- | ------------------------------------------ | ------- | ------------------------------------------------------------------------------- | -| `isStreaming` | `boolean` | `false` | Whether the reasoning is currently streaming (auto-opens and closes the panel). | -| `open` | `boolean` | - | Controlled open state. | -| `defaultOpen` | `boolean` | `true` | Default open state when uncontrolled. | -| `onOpenChange` | `(open: boolean) => void` | - | Callback when open state changes. | -| `duration` | `number` | - | Duration in seconds to display (can be controlled externally). | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Collapsible component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `isStreaming` | `boolean` | `false` | Whether the reasoning is currently streaming (auto-opens and closes the panel). | +| `open` | `boolean` | - | Controlled open state. | +| `defaultOpen` | `boolean` | `true` | Default open state when uncontrolled. | +| `onOpenChange` | `(open: boolean) => void` | - | Callback when open state changes. | +| `duration` | `number` | - | Duration in seconds to display (can be controlled externally). | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Collapsible component. | ### `` -| Prop | Type | Default | Description | -| -------------------- | -------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------- | -| `getThinkingMessage` | `(isStreaming: boolean, duration?: number) => ReactNode` | - | Optional function to customize the thinking message. Receives isStreaming and duration parameters. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CollapsibleTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `getThinkingMessage` | `(isStreaming: boolean, duration?: number) => ReactNode` | - | Optional function to customize the thinking message. Receives isStreaming and duration parameters. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CollapsibleTrigger component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | -------- | -------------------------------------------------------------------------- | -| `children` | `string` | Required | The reasoning text to display (rendered via Streamdown). | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CollapsibleContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `string` | Required | The reasoning text to display (rendered via Streamdown). | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying CollapsibleContent component. | ## Hooks @@ -218,9 +237,9 @@ const { isStreaming, isOpen, setIsOpen, duration } = useReasoning(); Returns: -| Prop | Type | Default | Description | -| ------------- | ------------------------- | ---------- | ----------------------------------------- | ------------------------------------------------ | -| `isStreaming` | `boolean` | - | Whether reasoning is currently streaming. | -| `isOpen` | `boolean` | - | Whether the reasoning panel is open. | -| `setIsOpen` | `(open: boolean) => void` | - | Function to set the open state. | -| `duration` | `number | undefined` | - | Duration in seconds (undefined while streaming). | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `isStreaming` | `boolean` | - | Whether reasoning is currently streaming. | +| `isOpen` | `boolean` | - | Whether the reasoning panel is open. | +| `setIsOpen` | `(open: boolean) => void` | - | Function to set the open state. | +| `duration` | `number | undefined` | - | Duration in seconds (undefined while streaming). | diff --git a/.agents/skills/ai-elements/references/sandbox.md b/.agents/skills/ai-elements/references/sandbox.md index f82d58d4..5200a89f 100644 --- a/.agents/skills/ai-elements/references/sandbox.md +++ b/.agents/skills/ai-elements/references/sandbox.md @@ -58,7 +58,10 @@ export const CodeSandbox = ({ toolPart }: CodeSandboxProps) => { return ( - + @@ -84,50 +87,50 @@ export const CodeSandbox = ({ toolPart }: CodeSandboxProps) => { ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | ------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Collapsible component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Collapsible component. | ### `` -| Prop | Type | Default | Description | -| ----------- | ------------- | ----------- | -------------------------------------------------------------------------- | -| `title` | `string` | `undefined` | The title displayed in the header (e.g., filename). | -| `state` | `ToolUIPart[` | Required | The current execution state, used to display the appropriate status badge. | -| `className` | `string` | - | Additional CSS classes for the header. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `title` | `string` | `undefined` | The title displayed in the header (e.g., filename). | +| `state` | `ToolUIPart[` | Required | The current execution state, used to display the appropriate status badge. | +| `className` | `string` | - | Additional CSS classes for the header. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | ------- | ----------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------- | ------- | ------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Tabs component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying Tabs component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ------------------------------------------------ | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | ------- | ---------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying TabsList component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying TabsList component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | ------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying TabsTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying TabsTrigger component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | ------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying TabsContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying TabsContent component. | diff --git a/.agents/skills/ai-elements/references/schema-display.md b/.agents/skills/ai-elements/references/schema-display.md index b27b6b21..df4a2c41 100644 --- a/.agents/skills/ai-elements/references/schema-display.md +++ b/.agents/skills/ai-elements/references/schema-display.md @@ -60,14 +60,14 @@ See `scripts/schema-display-nested.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| -------------- | ------------------- | ------- | ------------------------- | -| `method` | `unknown` | - | HTTP method. | -| `path` | `string` | - | API endpoint path. | -| `description` | `string` | - | Endpoint description. | -| `parameters` | `SchemaParameter[]` | - | URL/query parameters. | -| `requestBody` | `SchemaProperty[]` | - | Request body properties. | -| `responseBody` | `SchemaProperty[]` | - | Response body properties. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `method` | `unknown` | - | HTTP method. | +| `path` | `string` | - | API endpoint path. | +| `description` | `string` | - | Endpoint description. | +| `parameters` | `SchemaParameter[]` | - | URL/query parameters. | +| `requestBody` | `SchemaProperty[]` | - | Request body properties. | +| `responseBody` | `SchemaProperty[]` | - | Response body properties. | ### `SchemaParameter` diff --git a/.agents/skills/ai-elements/references/shimmer.md b/.agents/skills/ai-elements/references/shimmer.md index 8776fea4..fb72da4d 100644 --- a/.agents/skills/ai-elements/references/shimmer.md +++ b/.agents/skills/ai-elements/references/shimmer.md @@ -46,10 +46,10 @@ See `scripts/shimmer-elements.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ----------- | ------------- | ------- | -------------------------------------------------------------------------- | -| `children` | `string` | - | The text content to apply the shimmer effect to. | -| `as` | `ElementType` | - | The HTML element or React component to render. | -| `className` | `string` | - | Additional CSS classes to apply to the component. | -| `duration` | `number` | `2` | The duration of the shimmer animation in seconds. | -| `spread` | `number` | `2` | The spread multiplier for the shimmer gradient, multiplied by text length. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `string` | - | The text content to apply the shimmer effect to. | +| `as` | `ElementType` | - | The HTML element or React component to render. | +| `className` | `string` | - | Additional CSS classes to apply to the component. | +| `duration` | `number` | `2` | The duration of the shimmer animation in seconds. | +| `spread` | `number` | `2` | The spread multiplier for the shimmer gradient, multiplied by text length. | diff --git a/.agents/skills/ai-elements/references/snippet.md b/.agents/skills/ai-elements/references/snippet.md index 3aa3b086..5ca51078 100644 --- a/.agents/skills/ai-elements/references/snippet.md +++ b/.agents/skills/ai-elements/references/snippet.md @@ -36,36 +36,36 @@ See `scripts/snippet-plain.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------- | -------- | ---------------------------------------------------- | -| `code` | `string` | Required | The code content to display. | -| `children` | `React.ReactNode` | - | Child elements like SnippetAddon, SnippetInput, etc. | -| `...props` | `React.ComponentProps` | - | Spread to the InputGroup component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `code` | `string` | Required | The code content to display. | +| `children` | `React.ReactNode` | - | Child elements like SnippetAddon, SnippetInput, etc. | +| `...props` | `React.ComponentProps` | - | Spread to the InputGroup component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ---------------------------------------------- | ------- | ---------------------------------------- | -| `...props` | `React.ComponentProps` | - | Spread to the InputGroupAddon component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Spread to the InputGroupAddon component. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------------- | ------- | --------------------------------------- | -| `...props` | `React.ComponentProps` | - | Spread to the InputGroupText component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Spread to the InputGroupText component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------------- | ------- | ---------------------------------------------------------------------------------- | -| `...props` | `Omit, ` | - | Spread to the InputGroupInput component. Value and readOnly are set automatically. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `Omit, ` | - | Spread to the InputGroupInput component. Value and readOnly are set automatically. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ----------------------------------------- | -| `onCopy` | `() => void` | - | Callback fired after a successful copy. | -| `onError` | `(error: Error) => void` | - | Callback fired if copying fails. | -| `timeout` | `number` | `2000` | How long to show the copied state (ms). | -| `children` | `React.ReactNode` | - | Custom button content. | -| `...props` | `React.ComponentProps` | - | Spread to the InputGroupButton component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `onCopy` | `() => void` | - | Callback fired after a successful copy. | +| `onError` | `(error: Error) => void` | - | Callback fired if copying fails. | +| `timeout` | `number` | `2000` | How long to show the copied state (ms). | +| `children` | `React.ReactNode` | - | Custom button content. | +| `...props` | `React.ComponentProps` | - | Spread to the InputGroupButton component. | diff --git a/.agents/skills/ai-elements/references/sources.md b/.agents/skills/ai-elements/references/sources.md index 19ca1c71..6fdbb5de 100644 --- a/.agents/skills/ai-elements/references/sources.md +++ b/.agents/skills/ai-elements/references/sources.md @@ -29,7 +29,12 @@ Add the following component to your frontend: "use client"; import { useChat } from "@ai-sdk/react"; -import { Source, Sources, SourcesContent, SourcesTrigger } from "@/components/ai-elements/sources"; +import { + Source, + Sources, + SourcesContent, + SourcesTrigger, +} from "@/components/ai-elements/sources"; import { PromptInput, type PromptInputMessage, @@ -41,7 +46,11 @@ import { ConversationContent, ConversationScrollButton, } from "@/components/ai-elements/conversation"; -import { Message, MessageContent, MessageResponse } from "@/components/ai-elements/message"; +import { + Message, + MessageContent, + MessageResponse, +} from "@/components/ai-elements/message"; import { useState } from "react"; import { DefaultChatTransport } from "ai"; @@ -71,7 +80,11 @@ const SourceDemo = () => { {message.role === "assistant" && ( part.type === "source-url").length} + count={ + message.parts.filter( + (part) => part.type === "source-url" + ).length + } /> {message.parts.map((part, i) => { switch (part.type) { @@ -112,7 +125,10 @@ const SourceDemo = () => {
- + ` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root div. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | -------- | --------------------------------------------------------------- | -| `count` | `number` | Required | The number of sources to display in the trigger. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `count` | `number` | Required | The number of sources to display in the trigger. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the content container. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the content container. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------- | -| `...props` | `React.AnchorHTMLAttributes` | - | Any other props are spread to the anchor element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.AnchorHTMLAttributes` | - | Any other props are spread to the anchor element. | diff --git a/.agents/skills/ai-elements/references/speech-input.md b/.agents/skills/ai-elements/references/speech-input.md index c3837839..b6cf6da8 100644 --- a/.agents/skills/ai-elements/references/speech-input.md +++ b/.agents/skills/ai-elements/references/speech-input.md @@ -38,12 +38,12 @@ npx ai-elements@latest add speech-input The component extends the shadcn/ui Button component, so all Button props are available. -| Prop | Type | Default | Description | -| ----------------------- | -------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `onTranscriptionChange` | `(text: string) => void` | - | Callback fired when final transcription text is available. Only fires for completed phrases, not interim results. | -| `onAudioRecorded` | `(audioBlob: Blob) => Promise` | - | Callback for MediaRecorder fallback. Required for Firefox/Safari support. Receives recorded audio blob and should return transcribed text from an external service (e.g., OpenAI Whisper). | -| `lang` | `string` | - | Language for speech recognition. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the Button component, including variant, size, disabled, etc. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `onTranscriptionChange` | `(text: string) => void` | - | Callback fired when final transcription text is available. Only fires for completed phrases, not interim results. | +| `onAudioRecorded` | `(audioBlob: Blob) => Promise` | - | Callback for MediaRecorder fallback. Required for Firefox/Safari support. Receives recorded audio blob and should return transcribed text from an external service (e.g., OpenAI Whisper). | +| `lang` | `string` | - | Language for speech recognition. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the Button component, including variant, size, disabled, etc. | ## Behavior @@ -125,13 +125,16 @@ const handleAudioRecorded = async (audioBlob: Blob): Promise => { formData.append("file", audioBlob, "audio.webm"); formData.append("model", "whisper-1"); - const response = await fetch("https://api.openai.com/v1/audio/transcriptions", { - method: "POST", - headers: { - Authorization: `Bearer ${process.env.OPENAI_API_KEY}`, - }, - body: formData, - }); + const response = await fetch( + "https://api.openai.com/v1/audio/transcriptions", + { + method: "POST", + headers: { + Authorization: `Bearer ${process.env.OPENAI_API_KEY}`, + }, + body: formData, + } + ); const data = await response.json(); return data.text; diff --git a/.agents/skills/ai-elements/references/stack-trace.md b/.agents/skills/ai-elements/references/stack-trace.md index 9f68c1bd..e1d08b51 100644 --- a/.agents/skills/ai-elements/references/stack-trace.md +++ b/.agents/skills/ai-elements/references/stack-trace.md @@ -50,12 +50,18 @@ export default function Page() { return (
{messages.map((message) => { - const toolInvocations = message.parts?.filter((part) => part.type === "tool-invocation"); + const toolInvocations = message.parts?.filter( + (part) => part.type === "tool-invocation" + ); return toolInvocations?.map((tool) => { if (tool.toolName === "runCode" && tool.result?.error) { return ( - + @@ -138,88 +144,88 @@ See `scripts/stack-trace-no-internal.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ----------------- | -------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------- | -| `trace` | `string` | - | The raw stack trace string to parse and display. | -| `open` | `boolean` | - | Controlled open state. | -| `defaultOpen` | `boolean` | `false` | Whether the content is expanded by default. | -| `onOpenChange` | `(open: boolean) => void` | - | Callback when open state changes. | -| `onFilePathClick` | `(path: string, line?: number, column?: number) => void` | - | Callback when a file path is clicked. Receives the file path, line number, and column number. | -| `children` | `React.ReactNode` | - | Child elements (StackTraceHeader, StackTraceContent, etc.). | -| `className` | `string` | - | Additional CSS classes. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `trace` | `string` | - | The raw stack trace string to parse and display. | +| `open` | `boolean` | - | Controlled open state. | +| `defaultOpen` | `boolean` | `false` | Whether the content is expanded by default. | +| `onOpenChange` | `(open: boolean) => void` | - | Callback when open state changes. | +| `onFilePathClick` | `(path: string, line?: number, column?: number) => void` | - | Callback when a file path is clicked. Receives the file path, line number, and column number. | +| `children` | `React.ReactNode` | - | Child elements (StackTraceHeader, StackTraceContent, etc.). | +| `className` | `string` | - | Additional CSS classes. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root div. | ### `` -| Prop | Type | Default | Description | -| ----------- | ------------------------------------------------- | ------- | ----------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Header content (typically StackTraceError and StackTraceActions). | -| `className` | `string` | - | Additional CSS classes. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Header content (typically StackTraceError and StackTraceActions). | +| `className` | `string` | - | Additional CSS classes. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger. | ### `` -| Prop | Type | Default | Description | -| ----------- | -------------------------------------- | ------- | ------------------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Error content (typically StackTraceErrorType and StackTraceErrorMessage). | -| `className` | `string` | - | Additional CSS classes. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Error content (typically StackTraceErrorType and StackTraceErrorMessage). | +| `className` | `string` | - | Additional CSS classes. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ----------- | --------------------------------------- | ------- | -------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Custom content. Defaults to the parsed error type (e.g., | -| `className` | `string` | - | Additional CSS classes. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Custom content. Defaults to the parsed error type (e.g., | +| `className` | `string` | - | Additional CSS classes. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ----------- | --------------------------------------- | ------- | ----------------------------------------------------- | -| `children` | `React.ReactNode` | - | Custom content. Defaults to the parsed error message. | -| `className` | `string` | - | Additional CSS classes. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Custom content. Defaults to the parsed error message. | +| `className` | `string` | - | Additional CSS classes. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ----------- | -------------------------------------- | ------- | --------------------------------------------------------------------------- | -| `children` | `React.ReactNode` | - | Action buttons (typically StackTraceCopyButton and StackTraceExpandButton). | -| `className` | `string` | - | Additional CSS classes. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `React.ReactNode` | - | Action buttons (typically StackTraceCopyButton and StackTraceExpandButton). | +| `className` | `string` | - | Additional CSS classes. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ----------- | ------------------------------------- | ------- | ------------------------------------------------------------------------ | -| `onCopy` | `() => void` | - | Callback fired after a successful copy. | -| `onError` | `(error: Error) => void` | - | Callback fired if copying fails. | -| `timeout` | `number` | `2000` | How long to show the copied state (ms). | -| `children` | `React.ReactNode` | - | Custom content for the button. Defaults to copy/check icons. | -| `className` | `string` | - | Additional CSS classes. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `onCopy` | `() => void` | - | Callback fired after a successful copy. | +| `onError` | `(error: Error) => void` | - | Callback fired if copying fails. | +| `timeout` | `number` | `2000` | How long to show the copied state (ms). | +| `children` | `React.ReactNode` | - | Custom content for the button. Defaults to copy/check icons. | +| `className` | `string` | - | Additional CSS classes. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | ### `` -| Prop | Type | Default | Description | -| ----------- | -------------------------------------- | ------- | ------------------------------------------------ | -| `className` | `string` | - | Additional CSS classes. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the container div. | ### `` -| Prop | Type | Default | Description | -| ----------- | ------------------------------------------------- | ------- | --------------------------------------------------------------------------------------- | -| `maxHeight` | `number` | `400` | Maximum height of the content area. Enables scrolling when content exceeds this height. | -| `children` | `React.ReactNode` | - | Content to display (typically StackTraceFrames). | -| `className` | `string` | - | Additional CSS classes. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `maxHeight` | `number` | `400` | Maximum height of the content area. Enables scrolling when content exceeds this height. | +| `children` | `React.ReactNode` | - | Content to display (typically StackTraceFrames). | +| `className` | `string` | - | Additional CSS classes. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent. | ### `` -| Prop | Type | Default | Description | -| -------------------- | -------------------------------------- | ------- | ------------------------------------------------------------ | -| `showInternalFrames` | `boolean` | `true` | Whether to show internal frames (node_modules, node: paths). | -| `className` | `string` | - | Additional CSS classes. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the container div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `showInternalFrames` | `boolean` | `true` | Whether to show internal frames (node_modules, node: paths). | +| `className` | `string` | - | Additional CSS classes. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the container div. | diff --git a/.agents/skills/ai-elements/references/suggestion.md b/.agents/skills/ai-elements/references/suggestion.md index 543e0238..f701305d 100644 --- a/.agents/skills/ai-elements/references/suggestion.md +++ b/.agents/skills/ai-elements/references/suggestion.md @@ -72,7 +72,10 @@ const SuggestionDemo = () => { /> ))} - + ` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------- | ------- | ------------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying ScrollArea component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying ScrollArea component. | ### `` -| Prop | Type | Default | Description | -| ------------ | -------------------------------------------- | -------- | ------------------------------------------------------------------------ | -| `suggestion` | `string` | Required | The suggestion string to display and emit on click. | -| `onClick` | `(suggestion: string) => void` | - | Callback fired when the suggestion is clicked. | -| `...props` | `Omit, ` | - | Any other props are spread to the underlying shadcn/ui Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `suggestion` | `string` | Required | The suggestion string to display and emit on click. | +| `onClick` | `(suggestion: string) => void` | - | Callback fired when the suggestion is clicked. | +| `...props` | `Omit, ` | - | Any other props are spread to the underlying shadcn/ui Button component. | diff --git a/.agents/skills/ai-elements/references/task.md b/.agents/skills/ai-elements/references/task.md index b117d283..1f745c35 100644 --- a/.agents/skills/ai-elements/references/task.md +++ b/.agents/skills/ai-elements/references/task.md @@ -21,7 +21,7 @@ npx ai-elements@latest add task ## Usage with AI SDK -Build a mock async programming agent using `experimental_generateObject`. +Build a mock async programming agent using [`experimental_generateObject`](/docs/reference/ai-sdk-ui/use-object). Add the following component to your frontend: @@ -77,7 +77,10 @@ const TaskDemo = () => { {item.text} - + {item.file.name} @@ -101,14 +104,18 @@ const TaskDemo = () => {
- {isLoading && !object &&
Generating tasks...
} + {isLoading && !object && ( +
Generating tasks...
+ )} {object?.tasks?.map((task: any, taskIndex: number) => ( {task.items?.map((item: any, itemIndex: number) => ( - {renderTaskItem(item, itemIndex)} + + {renderTaskItem(item, itemIndex)} + ))} @@ -191,32 +198,32 @@ export async function POST(req: Request) { ### `` -| Prop | Type | Default | Description | -| ------------- | ------------------------------------------ | ------- | ------------------------------------------------------------- | -| `defaultOpen` | `boolean` | `true` | Whether the task is open by default. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the root Collapsible component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `defaultOpen` | `boolean` | `true` | Whether the task is open by default. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the root Collapsible component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | -------- | --------------------------------------------------------------- | -| `title` | `string` | Required | The title of the task that will be displayed in the trigger. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `title` | `string` | Required | The title of the task that will be displayed in the trigger. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | ------- | --------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ------------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ------------------------------------------------- | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div. | diff --git a/.agents/skills/ai-elements/references/terminal.md b/.agents/skills/ai-elements/references/terminal.md index e1725618..381de1b8 100644 --- a/.agents/skills/ai-elements/references/terminal.md +++ b/.agents/skills/ai-elements/references/terminal.md @@ -57,54 +57,54 @@ See `scripts/terminal-clear.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ------------- | ------------ | ------- | ------------------------------------------------ | -| `output` | `string` | - | Terminal output text (supports ANSI codes). | -| `isStreaming` | `boolean` | `false` | Show streaming indicator. | -| `autoScroll` | `boolean` | `true` | Auto-scroll to bottom on new output. | -| `onClear` | `() => void` | - | Callback to clear output (enables clear button). | -| `className` | `string` | - | Additional CSS classes. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `output` | `string` | - | Terminal output text (supports ANSI codes). | +| `isStreaming` | `boolean` | `false` | Show streaming indicator. | +| `autoScroll` | `boolean` | `true` | Auto-scroll to bottom on new output. | +| `onClear` | `() => void` | - | Callback to clear output (enables clear button). | +| `className` | `string` | - | Additional CSS classes. | ### `` -| Prop | Type | Default | Description | -| --------- | ------------------------ | ------- | ----------------------------------- | -| `onCopy` | `() => void` | - | Callback after successful copy. | -| `onError` | `(error: Error) => void` | - | Callback if copying fails. | -| `timeout` | `number` | `2000` | Duration to show copied state (ms). | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `onCopy` | `() => void` | - | Callback after successful copy. | +| `onError` | `(error: Error) => void` | - | Callback if copying fails. | +| `timeout` | `number` | `2000` | Duration to show copied state (ms). | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------- | --------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the Button component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | diff --git a/.agents/skills/ai-elements/references/test-results.md b/.agents/skills/ai-elements/references/test-results.md index 535c8c11..cc7eb7ff 100644 --- a/.agents/skills/ai-elements/references/test-results.md +++ b/.agents/skills/ai-elements/references/test-results.md @@ -55,110 +55,110 @@ See `scripts/test-results-errors.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ----------- | --------- | ------- | ----------------------- | -| `summary` | `unknown` | - | Test results summary. | -| `className` | `string` | - | Additional CSS classes. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `summary` | `unknown` | - | Test results summary. | +| `className` | `string` | - | Additional CSS classes. | ### `` -| Prop | Type | Default | Description | -| ------------- | --------- | ------- | --------------------- | -| `name` | `string` | - | Suite name. | -| `status` | `unknown` | - | Overall suite status. | -| `defaultOpen` | `boolean` | - | Initially expanded. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `name` | `string` | - | Suite name. | +| `status` | `unknown` | - | Overall suite status. | +| `defaultOpen` | `boolean` | - | Initially expanded. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------- | ------- | -------------------- | -| `name` | `string` | - | Test name. | -| `status` | `unknown` | - | Test status. | -| `duration` | `number` | - | Test duration in ms. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `name` | `string` | - | Test name. | +| `status` | `unknown` | - | Test status. | +| `duration` | `number` | - | Test duration in ms. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | ------- | ----------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | ------- | --------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger component. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `passed` | `number` | `0` | Number of passed tests. | -| `failed` | `number` | `0` | Number of failed tests. | -| `skipped` | `number` | `0` | Number of skipped tests. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `passed` | `number` | `0` | Number of passed tests. | +| `failed` | `number` | `0` | Number of failed tests. | +| `skipped` | `number` | `0` | Number of skipped tests. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | ------- | --------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent component. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | ------- | ----------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | ------- | ----------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ---------- | --------------------------------------- | ------- | ----------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the span element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the div element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | -------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the p element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the p element. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the pre element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the pre element. | diff --git a/.agents/skills/ai-elements/references/tool.md b/.agents/skills/ai-elements/references/tool.md index 1d2894d2..e355a2b0 100644 --- a/.agents/skills/ai-elements/references/tool.md +++ b/.agents/skills/ai-elements/references/tool.md @@ -21,7 +21,7 @@ npx ai-elements@latest add tool ## Usage in AI SDK -Build a simple stateful weather app that renders the last message in a tool using `useChat`. +Build a simple stateful weather app that renders the last message in a tool using [`useChat`](/docs/reference/ai-sdk-ui/use-chat). Add the following component to your frontend: @@ -74,7 +74,7 @@ const Example = () => { const latestMessage = messages[messages.length - 1]; const weatherTool = latestMessage?.parts?.find( - (part) => part.type === "tool-fetch_weather_data", + (part) => part.type === "tool-fetch_weather_data" ) as WeatherToolUIPart | undefined; return ( @@ -87,12 +87,17 @@ const Example = () => { {weatherTool && ( - + {formatWeatherResult(weatherTool.output)} + + {formatWeatherResult(weatherTool.output)} + } errorText={weatherTool.errorText} /> @@ -138,8 +143,13 @@ export async function POST(req: Request) { fetch_weather_data: { description: "Fetch weather information for a specific location", parameters: z.object({ - location: z.string().describe("The city or location to get weather for"), - units: z.enum(["celsius", "fahrenheit"]).default("celsius").describe("Temperature units"), + location: z + .string() + .describe("The city or location to get weather for"), + units: z + .enum(["celsius", "fahrenheit"]) + .default("celsius") + .describe("Temperature units"), }), inputSchema: z.object({ location: z.string(), @@ -212,41 +222,41 @@ See `scripts/tool-output-error.tsx` for this example. ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | ------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the root Collapsible component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the root Collapsible component. | ### `` -| Prop | Type | Default | Description | -| ----------- | ------------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------- | -| `title` | `string` | - | Custom title to display instead of the derived tool name. | -| `type` | `ToolUIPart[` | Required | The type/name of the tool. | -| `state` | `ToolUIPart[` | Required | The current state of the tool (input-streaming, input-available, output-available, or output-error). | -| `toolName` | `string` | - | Required when type is | -| `className` | `string` | - | Additional CSS classes to apply to the header. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `title` | `string` | - | Custom title to display instead of the derived tool name. | +| `type` | `ToolUIPart[` | Required | The type/name of the tool. | +| `state` | `ToolUIPart[` | Required | The current state of the tool (input-streaming, input-available, output-available, or output-error). | +| `toolName` | `string` | - | Required when type is | +| `className` | `string` | - | Additional CSS classes to apply to the header. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleTrigger. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------------- | ------- | ----------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CollapsibleContent. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | --------------------------------------------------------------------- | -| `input` | `ToolUIPart[` | - | The input parameters passed to the tool, displayed as formatted JSON. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `input` | `ToolUIPart[` | - | The input parameters passed to the tool, displayed as formatted JSON. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div. | ### `` -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ------------------------------------------------- | -| `output` | `React.ReactNode` | - | The output/result of the tool execution. | -| `errorText` | `ToolUIPart[` | - | An error message if the tool execution failed. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `output` | `React.ReactNode` | - | The output/result of the tool execution. | +| `errorText` | `ToolUIPart[` | - | An error message if the tool execution failed. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the underlying div. | ## Type Exports diff --git a/.agents/skills/ai-elements/references/toolbar.md b/.agents/skills/ai-elements/references/toolbar.md index 104e71d5..4eb95a37 100644 --- a/.agents/skills/ai-elements/references/toolbar.md +++ b/.agents/skills/ai-elements/references/toolbar.md @@ -11,6 +11,8 @@ A styled toolbar component for React Flow nodes with flexible positioning and cu The `Toolbar` component provides a positioned toolbar that attaches to nodes in React Flow canvases. It features modern card styling with backdrop blur and flexbox layout for action buttons and controls. + + ## Installation ```bash @@ -31,7 +33,7 @@ npx ai-elements@latest add toolbar ### `` -| Prop | Type | Default | Description | -| ----------- | ------------------------------------ | ------- | --------------------------------------------------------------------------------------------- | -| `className` | `string` | - | Additional CSS classes to apply to the toolbar. | -| `...props` | `ComponentProps` | - | Any other props from @xyflow/react NodeToolbar component (position, offset, isVisible, etc.). | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes to apply to the toolbar. | +| `...props` | `ComponentProps` | - | Any other props from @xyflow/react NodeToolbar component (position, offset, isVisible, etc.). | diff --git a/.agents/skills/ai-elements/references/transcription.md b/.agents/skills/ai-elements/references/transcription.md index 3a677a4c..72194306 100644 --- a/.agents/skills/ai-elements/references/transcription.md +++ b/.agents/skills/ai-elements/references/transcription.md @@ -36,23 +36,23 @@ npx ai-elements@latest add transcription Root component that provides context and manages transcript state. Uses render props pattern for rendering segments. -| Prop | Type | Default | Description | -| ------------- | ------------------------------------------------------------- | ------- | --------------------------------------------------------------------- | -| `segments` | `TranscriptionSegment[]` | - | Array of transcription segments from AI SDK transcribe() function. | -| `currentTime` | `number` | `0` | Current playback time in seconds (controlled). | -| `onSeek` | `(time: number) => void` | - | Callback fired when a segment is clicked or when currentTime changes. | -| `children` | `(segment: TranscriptionSegment, index: number) => ReactNode` | - | Render function that receives each segment and its index. | -| `...props` | `Omit void` | - | Callback fired when a segment is clicked or when currentTime changes. | +| `children` | `(segment: TranscriptionSegment, index: number) => ReactNode` | - | Render function that receives each segment and its index. | +| `...props` | `Omit` Individual segment button with automatic state styling and click-to-seek functionality. -| Prop | Type | Default | Description | -| ---------- | ----------------------- | ------- | ------------------------------------------------- | -| `segment` | `TranscriptionSegment` | - | The transcription segment data. | -| `index` | `number` | - | The segment index. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the button element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `segment` | `TranscriptionSegment` | - | The transcription segment data. | +| `index` | `number` | - | The segment index. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the button element. | ## Behavior diff --git a/.agents/skills/ai-elements/references/voice-selector.md b/.agents/skills/ai-elements/references/voice-selector.md index e06789e7..945a156b 100644 --- a/.agents/skills/ai-elements/references/voice-selector.md +++ b/.agents/skills/ai-elements/references/voice-selector.md @@ -38,184 +38,184 @@ npx ai-elements@latest add voice-selector Root Dialog component that provides context for all child components. Manages both voice selection and dialog open states. -| Prop | Type | Default | Description | -| --------------- | ------------------------------------- | ------------------- | --------------------------------------------------------------------------- | ----------------------------------------------- | -| `value` | `string` | - | The selected voice ID (controlled). | -| `defaultValue` | `string` | - | The default selected voice ID (uncontrolled). | -| `onValueChange` | `(value: string | undefined) => void` | - | Callback fired when the selected voice changes. | -| `defaultOpen` | `boolean` | `false` | The default open state (uncontrolled). | -| `open` | `boolean` | - | The open state (controlled). | -| `onOpenChange` | `(open: boolean) => void` | - | Callback fired when the open state changes. | -| `modal` | `boolean` | `true` | Whether the dialog is modal (blocks interaction with the rest of the page). | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the Dialog component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `value` | `string` | - | The selected voice ID (controlled). | +| `defaultValue` | `string` | - | The default selected voice ID (uncontrolled). | +| `onValueChange` | `(value: string | undefined) => void` | - | Callback fired when the selected voice changes. | +| `defaultOpen` | `boolean` | `false` | The default open state (uncontrolled). | +| `open` | `boolean` | - | The open state (controlled). | +| `onOpenChange` | `(open: boolean) => void` | - | Callback fired when the open state changes. | +| `modal` | `boolean` | `true` | Whether the dialog is modal (blocks interaction with the rest of the page). | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the Dialog component. | ### `` Button or element that opens the voice selector dialog. -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------- | -| `asChild` | `boolean` | `false` | Change the default rendered element for the one passed as a child, merging their props and behavior. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the DialogTrigger component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `asChild` | `boolean` | `false` | Change the default rendered element for the one passed as a child, merging their props and behavior. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the DialogTrigger component. | ### `` Container for the Command component and voice list, rendered inside the dialog. -| Prop | Type | Default | Description | -| ----------- | -------------------------------------------- | ------- | --------------------------------------------------------------------------------------- | -| `title` | `ReactNode` | - | The title for screen readers. Hidden visually but accessible to assistive technologies. | -| `className` | `string` | - | Additional CSS classes to apply to the dialog content. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the DialogContent component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `title` | `ReactNode` | - | The title for screen readers. Hidden visually but accessible to assistive technologies. | +| `className` | `string` | - | Additional CSS classes to apply to the dialog content. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the DialogContent component. | ### `` Alternative dialog implementation using CommandDialog for a full-screen command palette style. -| Prop | Type | Default | Description | -| ---------- | -------------------------------------------- | ------- | ---------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandDialog component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandDialog component. | ### `` Search input for filtering voices. -| Prop | Type | Default | Description | -| ------------- | ------------------------------------------- | ------- | --------------------------------------------------------- | -| `placeholder` | `string` | - | Placeholder text for the search input. | -| `className` | `string` | - | Additional CSS classes to apply. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandInput component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `placeholder` | `string` | - | Placeholder text for the search input. | +| `className` | `string` | - | Additional CSS classes to apply. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandInput component. | ### `` Scrollable container for voice items and groups. -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | -------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandList component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandList component. | ### `` Message shown when no voices match the search query. -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------- | ------- | --------------------------------------------------------- | -| `children` | `ReactNode` | - | The message to display. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandEmpty component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `children` | `ReactNode` | - | The message to display. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandEmpty component. | ### `` Groups related voices together with an optional heading. -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------- | ------- | --------------------------------------------------------- | -| `heading` | `string` | - | The heading text for the group. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandGroup component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `heading` | `string` | - | The heading text for the group. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandGroup component. | ### `` Selectable item representing a voice. -| Prop | Type | Default | Description | -| ---------- | ------------------------------------------ | ------- | ---------------------------------------------------------------- | -| `value` | `string` | - | The unique identifier for this voice. Used for search filtering. | -| `onSelect` | `(value: string) => void` | - | Callback fired when the voice is selected. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandItem component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `value` | `string` | - | The unique identifier for this voice. Used for search filtering. | +| `onSelect` | `(value: string) => void` | - | Callback fired when the voice is selected. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandItem component. | ### `` Visual separator between voice groups. -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandSeparator component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandSeparator component. | ### `` Displays the voice name with proper styling. -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ----------------------------------------------- | -| `className` | `string` | - | Additional CSS classes to apply. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes to apply. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | ### `` Displays the voice gender metadata with icons from Lucide. Supports multiple gender identities with corresponding icons. -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ------------------------------------------------------------------------- | -| `value` | `unknown` | - | The gender value that determines which icon to display. Supported values: | -| `className` | `string` | - | Additional CSS classes to apply. | -| `children` | `ReactNode` | - | Override the icon with custom content. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `value` | `unknown` | - | The gender value that determines which icon to display. Supported values: | +| `className` | `string` | - | Additional CSS classes to apply. | +| `children` | `ReactNode` | - | Override the icon with custom content. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | ### `` Displays the voice accent metadata with emoji flags representing different countries/regions. -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ------------------------------------------------------------------------------------------------------ | -| `value` | `unknown` | - | The accent value that determines which flag emoji to display. Supports 27 different accents including: | -| `className` | `string` | - | Additional CSS classes to apply. | -| `children` | `ReactNode` | - | Override the flag emoji with custom content. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `value` | `unknown` | - | The accent value that determines which flag emoji to display. Supports 27 different accents including: | +| `className` | `string` | - | Additional CSS classes to apply. | +| `children` | `ReactNode` | - | Override the flag emoji with custom content. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | ### `` Displays the voice age metadata with muted styling and tabular numbers for consistent alignment. -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ----------------------------------------------- | -| `className` | `string` | - | Additional CSS classes to apply. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes to apply. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | ### `` Displays a description for the voice with muted styling. -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ----------------------------------------------- | -| `className` | `string` | - | Additional CSS classes to apply. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes to apply. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | ### `` Container for grouping voice attributes (gender, accent, age) together. Use with `VoiceSelectorBullet` for separation. -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ---------------------------------------------- | -| `className` | `string` | - | Additional CSS classes to apply. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes to apply. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the div element. | ### `` Displays a bullet separator (•) between voice attributes. Hidden from screen readers via `aria-hidden`. -| Prop | Type | Default | Description | -| ----------- | ----------------------- | ------- | ----------------------------------------------- | -| `className` | `string` | - | Additional CSS classes to apply. | -| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `className` | `string` | - | Additional CSS classes to apply. | +| `...props` | `React.ComponentProps<` | - | Any other props are spread to the span element. | ### `` Displays keyboard shortcuts for voice items. -| Prop | Type | Default | Description | -| ---------- | ---------------------------------------------- | ------- | ------------------------------------------------------------ | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandShortcut component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the CommandShortcut component. | ### `` A button that allows users to preview/play a voice sample before selecting it. Shows play, pause, or loading icons based on state. -| Prop | Type | Default | Description | -| ----------- | ---------------------------- | ------- | ------------------------------------------------------------------------------------ | -| `playing` | `boolean` | - | Whether the voice is currently playing. Shows pause icon when true. | -| `loading` | `boolean` | - | Whether the voice preview is loading. Shows loading spinner and disables the button. | -| `onPlay` | `() => void` | - | Callback fired when the preview button is clicked. | -| `className` | `string` | - | Additional CSS classes to apply. | -| `...props` | `Omit void` | - | Callback fired when the preview button is clicked. | +| `className` | `string` | - | Additional CSS classes to apply. | +| `...props` | `Omit void` | - | Function to update the selected voice ID. | -| `open` | `boolean` | - | Whether the dialog is currently open. | -| `setOpen` | `(open: boolean) => void` | - | Function to control the dialog open state. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `value` | `string | undefined` | - | The currently selected voice ID. | +| `setValue` | `(value: string | undefined) => void` | - | Function to update the selected voice ID. | +| `open` | `boolean` | - | Whether the dialog is currently open. | +| `setOpen` | `(open: boolean) => void` | - | Function to control the dialog open state. | diff --git a/.agents/skills/ai-elements/references/web-preview.md b/.agents/skills/ai-elements/references/web-preview.md index 7b388852..8d8c04d9 100644 --- a/.agents/skills/ai-elements/references/web-preview.md +++ b/.agents/skills/ai-elements/references/web-preview.md @@ -101,7 +101,10 @@ const WebPreviewDemo = () => { )}
- + ` -| Prop | Type | Default | Description | -| ------------- | -------------------------------------- | ------- | ------------------------------------------- | -| `defaultUrl` | `string` | - | The initial URL to load in the preview. | -| `onUrlChange` | `(url: string) => void` | - | Callback fired when the URL changes. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `defaultUrl` | `string` | - | The initial URL to load in the preview. | +| `onUrlChange` | `(url: string) => void` | - | Callback fired when the URL changes. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root div. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ------------------------------------------------------- | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the navigation container. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the navigation container. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------- | ------- | ------------------------------------------------------------------------ | -| `tooltip` | `string` | - | Tooltip text to display on hover. | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `tooltip` | `string` | - | Tooltip text to display on hover. | +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Button component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ------------------------------------ | ------- | ----------------------------------------------------------------------- | -| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Input component. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `...props` | `React.ComponentProps` | - | Any other props are spread to the underlying shadcn/ui Input component. | ### `` -| Prop | Type | Default | Description | -| ---------- | ----------------------------------------------- | ------- | ------------------------------------------------------- | -| `loading` | `React.ReactNode` | - | Optional loading indicator to display over the preview. | -| `...props` | `React.IframeHTMLAttributes` | - | Any other props are spread to the underlying iframe. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `loading` | `React.ReactNode` | - | Optional loading indicator to display over the preview. | +| `...props` | `React.IframeHTMLAttributes` | - | Any other props are spread to the underlying iframe. | ### `` -| Prop | Type | Default | Description | -| ---------- | -------------------------------------- | ------- | ---------------------------------------------------- | -| `logs` | `Array<{ level: ` | - | Console log entries to display in the console panel. | -| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root div. | +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `logs` | `Array<{ level: ` | - | Console log entries to display in the console panel. | +| `...props` | `React.HTMLAttributes` | - | Any other props are spread to the root div. | diff --git a/.agents/skills/architecture-governance/SKILL.md b/.agents/skills/architecture-governance/SKILL.md index 4882d980..ec7464f5 100644 --- a/.agents/skills/architecture-governance/SKILL.md +++ b/.agents/skills/architecture-governance/SKILL.md @@ -1,6 +1,6 @@ --- name: architecture-governance -description: Apply the repository's architecture policy to code changes by generating a bounded context package, checking module and layer boundaries, and reporting baseline-aware violations. Use for any code change; skip for documentation-only work. +description: Check CCbuddy module and layer boundaries for code changes. Generate bounded context for cross-module or ownership changes; skip documentation-only work. --- # Architecture governance @@ -9,16 +9,16 @@ Use this skill before editing code in the CCbuddy repository. It is a design gui ## Before writing code -1. Identify changed files and their modules with `pnpm architecture:check --changed`. -2. Run `pnpm architecture:context ` (or the reusable wrapper `node .agents/skills/architecture-governance/scripts/context-package.mjs `). Read the target contract, directly referenced contracts, and any existing relevant spec and tests before opening broad implementation files. Do not assume a documentation or test path exists; verify it in the checkout. -3. Write or update the spec before implementation; create its directory when needed. State the behavior, ownership, invariants, failure semantics, and migration boundary in the spec. -4. Make a short design decision before coding: +1. Identify intended files and modules from the task, contracts, and existing tests. Run `pnpm architecture:check --changed` for the current baseline; a clean diff does not identify files you have not edited yet. +2. For cross-module changes, state ownership changes, or an unclear contract, run `pnpm architecture:context ` (or `node .agents/skills/architecture-governance/scripts/context-package.mjs `). For a local change with a known contract, read only the relevant contract, spec, and affected tests; expand when a concrete dependency or evidence gap requires it. +3. Apply the spec and regression-evidence rules in [AGENTS.md](../../../AGENTS.md). New behavior needs a spec before implementation; restoring already specified behavior needs regression evidence, not a duplicate feature document. Pure refactors update docs only when contracts change. +4. For changes to mutable state, asynchronous behavior, or module boundaries, make the relevant design decisions before coding: - **One owner:** name the single component that owns each piece of mutable state. Other layers read through its contract and send commands; they do not keep a second accepted queue, cache, or derived truth. - **One path:** reuse an existing command, service, hook, adapter, or contract when it already expresses the behavior. Do not create a parallel helper for the same responsibility. - - **Explicit boundaries:** choose the layer for every new file and the public contract for every cross-module edge. Use the module's declared `layers` and `layerOrder`; a file may import only its own layer or lower ones through their public surface. `domain` is pure (no IO, no `await` on the world), `app` decides side effects through ports, `adapters` executes them, `ui` depends only on this module's `contract.ts`. Quick test: needs `await`? not domain. Knows it is sqlite / MessagePort / a timer? adapters. + - **Explicit boundaries:** choose the layer for every new file and the public contract for every cross-module edge. Keep `ui → hooks/services → app → domain → adapters` and keep IO out of domain. - **Explicit time:** for asynchronous or remote behavior, write the event order, owner/lease, idempotency key, stale-result rule, replay/resume boundary, and desktop versus mobile delivery kind before implementation. - - **Bounded context:** prefer the generated reading package over copying whole implementations into the prompt. Read more only when a contract or test proves it is necessary. -5. If the change crosses modules or changes state ownership, include the decision in the spec and add or update the module contract before implementation. + - **Bounded context:** use the relevant contracts, specs, and tests. A generated reading package helps when dependencies are unclear; do not require a whole-module reading pass for every local edit. +5. If the change alters a public contract, ownership, or allowed dependency, record that decision in the relevant spec/contract before implementation. Editing files in two modules alone does not require a new document. Use the root task boundary for when to consult the user; ordinary authorized implementation choices proceed autonomously. Use this compact design sketch while planning stateful changes: @@ -38,13 +38,11 @@ mobile: replayable ─ snapshot + gap repair ┘ ## During and after editing 6. Keep changes inside the declared module and its allowed layer direction. Add a module dependency or public contract before introducing a cross-module edge. -7. Run `pnpm architecture:check --changed` again after editing. Report new violations separately from baseline violations, along with changed modules, tests, state owners, event-order assumptions, and net line changes. +7. Run `pnpm architecture:check --changed` after editing. Report new violations separately from baseline violations; include owners and event-order assumptions when affected. Follow the root validation matrix, finish after required checks pass, and expand checks only for new edits, failures, or unresolved risks. -The executable policy is `architecture-policy.yaml`; do not duplicate its rules in this file or in AGENTS.md. Use `pnpm architecture:baseline:update` only when a reviewed change intentionally changes the accepted legacy baseline. CI never refreshes baseline automatically. +The executable policy is `architecture-policy.yaml`; keep its detailed rule definitions there. Check the actual managed-module coverage before claiming the gate verifies a boundary: a passing result does not prove unconfigured modules or runtime semantics are correct. Use `pnpm architecture:baseline:update` only when a reviewed change intentionally changes the accepted legacy baseline. CI never refreshes baseline automatically. -When adding source, identify its owning module. If a new managed module is required, register its roots, dependencies, layers and public entrypoints in `architecture-policy.yaml`, and keep the local manifest consistent with that policy. Use the existing managed modules and the fixture below as examples. - -For a new managed module, provide `module.ts`, `contract.ts`, `contract.example.ts`, and a short `CONTRACT.md`. Keep runtime and persistence details behind the contract. Prefer typed service calls for one-to-one interactions, commands for state changes, and typed events for broadcast facts. +For a new managed module, provide `module.ts`, `contract.ts`, `contract.example.ts`, `contract.test.ts`, and a short `CONTRACT.md`. Keep runtime and persistence details behind the contract. Prefer typed service calls for one-to-one interactions, commands for state changes, and typed events for broadcast facts. See [policy-schema.md](references/policy-schema.md), [module-contract.md](references/module-contract.md), and [rule-catalog.md](references/rule-catalog.md) when the change needs their detailed guidance. The [golden-module](references/golden-module) fixture is the smallest compliant example. See [ai-guidance.md](references/ai-guidance.md) for the anti-patterns this workflow is designed to prevent and the questions an agent must answer before proposing code. diff --git a/.agents/skills/architecture-governance/agents/openai.yaml b/.agents/skills/architecture-governance/agents/openai.yaml index b81ba6db..7411ef53 100644 --- a/.agents/skills/architecture-governance/agents/openai.yaml +++ b/.agents/skills/architecture-governance/agents/openai.yaml @@ -1,4 +1,4 @@ interface: display_name: Architecture Governance short_description: Check module boundaries and prepare a bounded code context - default_prompt: Use $architecture-governance before editing code to inspect the affected module, generate its context package, and run the architecture checks before and after the change. + default_prompt: Use $architecture-governance to check affected module boundaries. Generate context for cross-module, ownership, or unclear-contract changes, and run the architecture checks before and after code changes. diff --git a/.agents/skills/architecture-governance/references/ai-guidance.md b/.agents/skills/architecture-governance/references/ai-guidance.md index 9cb1ea72..4dbe9509 100644 --- a/.agents/skills/architecture-governance/references/ai-guidance.md +++ b/.agents/skills/architecture-governance/references/ai-guidance.md @@ -1,6 +1,6 @@ # AI implementation guidance -Architecture governance is a pre-code decision protocol. A coding agent should be able to answer these questions before producing a patch: +Architecture governance is a pre-code decision protocol. Apply the rows relevant to the change: state/ordering questions apply to stateful behavior, and contract questions apply to boundary changes. A local fix with an established contract does not need a new design record. Use the root AGENTS.md for spec requirements and when user input is necessary. | Decision | Required answer | | -------- | ------------------------------------------------------------------------------------------------------------- | @@ -23,7 +23,7 @@ The agent should reject these shapes during design: - a remote stream change that mixes desktop `continuous` and mobile `replayable` semantics; - a broad refactor that changes unrelated modules without an explicit migration boundary. -The patch description should include a small decision record: +For stateful or cross-boundary changes, capture the relevant decisions in the existing spec/contract or patch description; omit fields that do not apply: ```text owner: @@ -34,4 +34,4 @@ delivery: contracts/spec/tests: ``` -This guidance complements executable rules. The policy checker can prove import and size constraints; the decision record makes ownership, reuse, and time semantics explicit before an agent writes code. +This guidance complements executable rules. The policy checker verifies configured import and size constraints within its managed coverage; the decision record explains ownership, reuse, and time semantics that the checker cannot prove. diff --git a/.agents/skills/architecture-governance/references/golden-module/CONTRACT.md b/.agents/skills/architecture-governance/references/golden-module/CONTRACT.md index ec61ab5f..dddad9b4 100644 --- a/.agents/skills/architecture-governance/references/golden-module/CONTRACT.md +++ b/.agents/skills/architecture-governance/references/golden-module/CONTRACT.md @@ -1,3 +1,3 @@ # Golden module -This fixture demonstrates the smallest managed module: a manifest, a narrow port, an example, and no implementation details in the public surface. +This fixture demonstrates the smallest managed module: a manifest, a narrow port, an example, a contract test, and no implementation details in the public surface. diff --git a/.agents/skills/architecture-governance/references/module-contract.md b/.agents/skills/architecture-governance/references/module-contract.md index da338829..4b8686d4 100644 --- a/.agents/skills/architecture-governance/references/module-contract.md +++ b/.agents/skills/architecture-governance/references/module-contract.md @@ -2,4 +2,4 @@ A managed module exposes only its contract entrypoint. The contract contains branded identifiers, schemas, typed commands, events, errors, and the semantics required by callers. `domain` stays pure, `app` owns use-case orchestration, `adapters` owns IO and process boundaries, and `ui` consumes the module port/read model. -The example is part of the agent context package. The short `CONTRACT.md` records invariants that types cannot express. +The example and contract test are part of the agent context package. The short `CONTRACT.md` records only invariants that types and tests cannot express. diff --git a/.agents/skills/architecture-governance/references/policy-schema.md b/.agents/skills/architecture-governance/references/policy-schema.md index 12266525..bdda3e67 100644 --- a/.agents/skills/architecture-governance/references/policy-schema.md +++ b/.agents/skills/architecture-governance/references/policy-schema.md @@ -1,9 +1,7 @@ # Policy schema -`architecture-policy.yaml` contains `version: 1`, `modules`, global thresholds and optional exceptions. The current parser is `scripts/architecture/policy.mjs`. +`architecture-policy.yaml` contains `version: 1`, a list of modules, global thresholds, and optional exceptions. -Each module declares an `id`, one or more `roots`, optional `managed: true`, `requires`, `publicEntrypoints`, `layers`, `layerOrder` and `owner`. Existing legacy modules can remain unmanaged. Dependencies must name registered module IDs. +Each module has an `id`, one or more `roots`, optional `managed: true`, `requires`, `provides`, `publicEntrypoints`, and an optional `owner`. Existing modules may remain unmanaged while they are in baseline migration. -Global keys are `maxFileLines`, `maxContractLines`, `maxPublicMethods`, `forbidCycles`, `forbidDeepImports` and `managedOnly`. Layer names and ordering come from each module's configuration; do not assume a global layer list. - -The policy owns module topology. A managed module's `module.ts` declares local dependencies; keep it consistent with the policy. Verify supported options in the parser before documenting or using them. +The policy owns path and layer topology. A module's `module.ts` owns its local dependency declaration. Do not add a second hand-maintained dependency graph. diff --git a/.agents/skills/architecture-governance/references/rule-catalog.md b/.agents/skills/architecture-governance/references/rule-catalog.md index 92701487..309de436 100644 --- a/.agents/skills/architecture-governance/references/rule-catalog.md +++ b/.agents/skills/architecture-governance/references/rule-catalog.md @@ -1,20 +1,17 @@ # Rule catalog -| Rule | Meaning | Typical fix | -| -------------------------- | ------------------------------------------------------------------------------- | ----------------------------------------------------------------- | -| `module-dependency` | Cross-module import is missing from `requires` | Add a public contract or move the integration owner | -| `deep-import` | Import bypasses a module public entrypoint | Import the contract/index entrypoint | -| `cycle` | The managed dependency graph contains a cycle | Split the owner or invert the dependency through a port | -| `max-file-lines` | Managed source exceeds the policy budget | Split by responsibility; do not add a disable | -| `max-contract-lines` | A contract is too broad | Split the capability or reduce the public surface | -| `max-public-methods` | A contract exposes too many methods | Split the capability or introduce a narrower read/write contract | -| `layer-direction` | A layer imports a higher implementation layer | Depend on a lower layer port or move the integration owner | -| `domain-io` | Domain code imports process, network, filesystem, or timer APIs | Move IO to an adapter and pass a typed port into the domain | -| `ui-implementation-import` | A file in a `ui` layer imports a repository, runtime, or service implementation | Depend on the module port / read model exposed by `contract.ts` | -| `expired-exception` | A configured exception has expired | Resolve the violation and remove the expired exception | -| `missing-module-artifact` | A managed module lacks its manifest or contract fixtures | Add the required module contract, example, test, and CONTRACT.md | -| `disable-count` | Managed code adds a lint suppression | Fix the underlying violation or add a reviewed expiring exception | +| Rule | Meaning | Typical fix | +| --- | --- | --- | +| `module-dependency` | Cross-module import is missing from `requires` | Add a public contract or move the integration owner | +| `deep-import` | Import bypasses a module public entrypoint | Import the contract/index entrypoint | +| `cycle` | The managed dependency graph contains a cycle | Split the owner or invert the dependency through a port | +| `max-file-lines` | Managed source exceeds the policy budget | Split by responsibility; do not add a disable | +| `max-contract-lines` | A contract is too broad | Split the capability or reduce the public surface | +| `max-public-methods` | A contract exposes too many methods | Split the capability or introduce a narrower read/write contract | +| `layer-direction` | A layer imports a higher implementation layer | Depend on a lower layer port or move the integration owner | +| `domain-io` | Domain code imports process, network, filesystem, or timer APIs | Move IO to an adapter and pass a typed port into the domain | +| `ui-implementation-import` | UI imports a repository, runtime, or service implementation | Call a UI hook backed by the service contract | +| `missing-module-artifact` | A managed module lacks its manifest or contract fixtures | Add the required module contract, example, test, and CONTRACT.md | +| `disable-count` | Managed code adds a lint suppression | Fix the underlying violation or add a reviewed expiring exception | Existing violations are suppressible only through `.architecture-baseline.json`; new violations remain blocking. - -The current resolver follows relative imports among discovered source files. Workspace package names, path aliases and dynamic imports need separate inspection. `--changed` selects working-tree differences from `HEAD` and untracked files; use a full check when reviewing committed changes. diff --git a/.agents/skills/architecture-governance/references/troubleshooting.md b/.agents/skills/architecture-governance/references/troubleshooting.md index 0ee2143f..793ba254 100644 --- a/.agents/skills/architecture-governance/references/troubleshooting.md +++ b/.agents/skills/architecture-governance/references/troubleshooting.md @@ -1,11 +1,6 @@ # Troubleshooting -- `module-dependency`: use a public contract or declare the dependency in both the local manifest and policy after confirming its owner. -- `deep-import`: use the target module's declared public entrypoint. -- `cycle`: move shared types into a contract or invert the dependency through a port. -- `missing-module-artifact`: add the managed module's manifest, contract, example or contract document reported by the check. -- `expired-exception`: resolve the underlying violation and remove the expired exception; do not silently extend it. -- Changed-file scope: `pnpm architecture:check --changed` selects differences from `HEAD` plus untracked files. Run `pnpm architecture:check` for a full scan; committed changes are no longer a dirty-worktree diff. -- Baseline mismatch: inspect the failures first. Use `pnpm architecture:baseline:update` only for an explicitly reviewed baseline change. - -The check currently resolves relative imports. Inspect workspace aliases and package imports separately; a passing result does not prove that every dependency was analyzed. +- `module-dependency`: import the target module's public contract, or add the dependency to `module.ts` and policy after confirming the integration owner. +- `deep-import`: replace an internal path with the target module's declared public entrypoint. +- `cycle`: move the shared type into a contract or create an application/integration owner; do not silence the cycle. +- baseline mismatch: run the check without changing baseline, then use `architecture:baseline:update` only in a reviewed migration PR. diff --git a/.agents/skills/dep-refs/SKILL.md b/.agents/skills/dep-refs/SKILL.md index 7ffea950..dec8a88d 100644 --- a/.agents/skills/dep-refs/SKILL.md +++ b/.agents/skills/dep-refs/SKILL.md @@ -1,6 +1,6 @@ --- name: dep-refs -description: Use when needs to inspect TypeScript export references in the ccbuddy workspace, list exports from a file, verify whether an export is unused before deletion, investigate who imports a symbol during refactors, or combine pnpm knip unused-export results with pnpm dep:refs symbol-level reference tracing. +description: Use when the agent needs to inspect TypeScript export references in the ccbuddy workspace, list exports from a file, verify whether an export is unused before deletion, investigate who imports a symbol during refactors, or combine pnpm knip unused-export results with pnpm dep:refs symbol-level reference tracing. disable-model-invocation: true --- @@ -19,19 +19,19 @@ pnpm knip Use `knip` to find likely unused exports, then inspect any risky or unclear export with `dep:refs`: ```bash -pnpm dep:refs packages/shared/src/remoteTarget.ts:stripRemoteTargetSecrets +pnpm dep:refs packages/services/src/bots/botsService.ts:createBotsService ``` List all exports in a file when the exact symbol name is unknown: ```bash -pnpm dep:refs --list-exports packages/shared/src/remoteTarget.ts +pnpm dep:refs --list-exports packages/services/src/bots/botsService.ts ``` Use scoped scans for fast exploration only when the scope is intentionally limited: ```bash -pnpm dep:refs --scope packages/services packages/shared/src/remoteTarget.ts:stripRemoteTargetSecrets +pnpm dep:refs --scope packages/services packages/services/src/bots/botsService.ts:createBotsService ``` Before claiming an export is safe to delete, prefer an unscoped `dep:refs` run so cross-package callers are not missed. @@ -41,7 +41,7 @@ Before claiming an export is safe to delete, prefer an unscoped `dep:refs` run s Use silent pnpm mode for machine-readable output, because normal `pnpm` output includes extra banner lines: ```bash -pnpm -s dep:refs packages/shared/src/remoteTarget.ts:stripRemoteTargetSecrets --json | jq . +pnpm -s dep:refs packages/services/src/bots/botsService.ts:createBotsService --json | jq . ``` Use JSON when summarizing many symbols, feeding results to `jq`, or comparing `references` and `reExports` counts programmatically. diff --git a/.agents/skills/feature-boundary-planner/SKILL.md b/.agents/skills/feature-boundary-planner/SKILL.md index 5bba3756..cc9614a0 100644 --- a/.agents/skills/feature-boundary-planner/SKILL.md +++ b/.agents/skills/feature-boundary-planner/SKILL.md @@ -1,68 +1,177 @@ --- name: feature-boundary-planner -description: Map a CCbuddy behavior change to current UI surfaces, state owners, protocol commands, persistence, and validation. Use for impact analysis, product-boundary planning, or an implementation handoff grounded in the checked-out source. +description: Use when the agent needs to discover the blast radius of a CCbuddy feature or behavior change, answer "if I change X what other features or UI surfaces should I inspect?", map shared UI components, option builders, state owners, protocol commands, persistence and tests with codegraph, clarify product boundaries, prune state combinations, and prepare specs, case catalogs, coverage matrices, or E2E handoffs before implementation. --- # Feature Boundary Planner -Trace the requested behavior through the current checkout. A feature belongs in the result only when current source or an explicit new requirement supports it. Verify referenced paths and symbols before using them; do not reconstruct removed functionality from historical catalogs. +Use this skill from the CCbuddy repository root before implementation when a request needs feature-impact discovery, product-boundary clarification, coverage planning, or an E2E handoff. -## Choose The Scope +Treat impact discovery and boundary planning as two connected jobs: -- **impact-only:** inspect and report without changing code or product specs. -- **planning:** establish behavior and acceptance cases before implementation. -- **implementation-handoff:** turn confirmed decisions into a bounded implementation and validation plan. +1. Determine where the capability appears and what a change can affect. +2. Decide what the affected states should do and which combinations need coverage. -Use the mode implied by the request. Clarify only unknown decisions that materially change the scope; do not ask the user to reconfirm facts already established in this task. +Do not begin with a large Cartesian product. Build a compact semantic impact map, verify it against live code, then ask only the questions that change the result. -## Find Current Evidence +## Choose The Operating Mode -1. Search aliases and node IDs in [ccbuddy-feature-graph.yaml](references/ccbuddy-feature-graph.yaml) for the user's terms. Read only matched nodes and their one-hop relationships, then verify the declared files, symbols and semantics against the current checkout. The graph is a curated seed index, not a complete feature inventory. Use [source-discovery.md](references/source-discovery.md) to fill gaps or start when there is no match. Read the relevant existing contracts and package scripts; read `DESIGN.md` for UI work and `CONTEXT.md` for plugin-store work. -2. Locate the entrypoint with `rg --files` and focused `rg -n` searches. Trace direct callers with `pnpm dep:refs :` when the symbol is a TypeScript export. If an indexed codegraph tool is available, use it as additional evidence and verify its paths against the checkout. -3. Classify the change: presentation, option source, draft/default, validation, commit effect, persistence, or recovery. -4. Trace each user surface separately through validation and the command that commits the change. Shared UI components do not establish shared state or side effects. -5. Identify the authoritative owner, derived views, protocol boundary, persistence and failure behavior. Name the semantic reason for each upstream or downstream dependency; imports alone do not prove a product relationship. -6. Inspect one meaningful semantic hop first, expanding only when an unresolved owner or caller requires it. Rank relationships as must-inspect, should-inspect, conditional, invariant-only, or evidence-only. +- `impact-only`: Produce an Impact Brief. Do not change product code or existing product specs. +- `planning`: Produce the Impact Brief, clarify product semantics, and update specs or planning documents before code. +- `implementation-handoff`: Complete planning and prepare accepted cases for implementation or `e2e-case-lifecycle`. -For stateful or asynchronous behavior, show a concise diagram: +Infer the least expansive mode from the user's request. A request to scan, explain, diagnose, or report impact is `impact-only`. A request to change or build uses `planning` unless the user explicitly limits the work. -```text -user action → surface draft → validation → owner command → event / persistence - └── derived UI projection -``` +## Required Reading -## Maintain The Seed Graph +For every impact scan, read: -Keep existing node IDs for unchanged semantic boundaries and add aliases for new terminology. Report missing seeds or changed relationships as `graph-drift-candidate`; static reachability alone does not establish a product dependency. +- `docs/feature-impact-discovery.md` +- `references/ccbuddy-feature-graph.yaml` +- `references/impact-brief-template.md` +- the relevant rows in `references/ccbuddy-domain-cross-products.md` -In `impact-only` mode, report proposed graph changes without editing files. In planning or implementation, update only verified entries within the task's scope. Follow the [graph contract](../../../docs/skills/feature-boundary-graph.md): check YAML parsing, unique IDs, relationship endpoints and ranks, and tracked source paths and symbols. Do not restore missing historical docs or claim test coverage from a graph entry. +For `planning` or `implementation-handoff`, also read: -## Plan And Prune +- `packages/formal-proof/README.md` +- `references/case-planning-template.md` +- the current feature spec, nearby case catalog, coverage matrix, decision worksheet, and testing workflow. -In planning modes, write or update a feature spec before implementation. Create the spec directory if needed; do not assume an existing case catalog, test runner, or coverage workflow. +When conversation/session behavior is affected, read: -Select only dimensions that can change behavior: state, event, target, client mode, delivery kind, workspace identity, runtime availability and persistence source. Prefer representative and high-risk combinations over a global Cartesian product. +- `docs/conversation-protocol-declaration.md` +- `docs/conversation-product-state-space.md` +- `docs/conversation-session-case-catalog.md` +- `docs/testing/conversation-session-e2e-coverage-matrix.md` +- `docs/testing/conversation-session-e2e-development-workflow.md` +- `docs/testing/conversation-session-requirement-matrix-workflow.md` -Classify cases as accepted, undefined, pruned, ignored, or bug-candidate. Give every pruned case an invariant or guard; leave undefined behavior as a concrete decision. Record accepted cases with setup, action, assertions and required evidence using [case-planning-template.md](references/case-planning-template.md). +Read only the domain-specific references routed by the feature graph and domain map. Prefer current fact/architecture docs over historical plans. -Before handing off validation, check which tests, fixtures and commands actually exist in the target package. Distinguish planned tests, executed tests and admitted regression coverage. A missing test path is a gap, not coverage. +## Classify The Change Layer -## Output +Classify the proposed change before expanding the graph. Use one or more of: -Use [impact-brief-template.md](references/impact-brief-template.md) for the relevant parts of the result: +- `presentation`: labels, layout, visibility, interaction controls, responsive behavior, theme, or locale. +- `option-source`: candidates, grouping, sorting, filtering, registry, or discovery. +- `draft-default`: initial value, inheritance, fallback, or local edit state. +- `validation`: availability, permissions, guards, blocking, or error presentation. +- `commit-effect`: command/service invoked and the runtime state changed by the action. +- `persistence`: saved representation, load, migration, isolation key, or cache. +- `recovery`: queue, snapshot, reconnect, replay, owner command, or stream recovery. -- behavior summary and scope; -- UI surface matrix, shared implementation and divergent behavior; -- ranked dependencies with current file/symbol evidence; -- state owners, validation points, commit commands and persistence; -- invariants and representative validation cases; -- unresolved decisions, unavailable evidence and relevant graph drift or updates. +Do a low-cost scan before asking the user to classify an ambiguous change. Ask only when two interpretations would materially change the impact conclusion. -## Boundaries +## Discover Feature And UI Impact -- Preserve `workspaceIdentity?.trim() || workspacePath` for isolation and `workspacePath` for execution/display. -- Keep desktop `desktop-continuous` delivery separate from mobile `web-remote-replayable` recovery. -- Trace accepted commands to their authoritative owner; do not turn a client draft or optimistic overlay into another accepted queue. -- Treat runtime state, snapshots, indexes, settings and caches as distinct until their synchronization is proven. -- Do not infer current functionality from a directory left behind by build artifacts, an old document, or a historical branch. -- Do not silently change product semantics to match an implementation discrepancy; report the evidence and the decision needed. +1. Match the user's terms to capability aliases in `references/ccbuddy-feature-graph.yaml`. +2. Load the matched capability, its declared UI surfaces, shared implementation, state owners, invariants, docs, and one-hop semantic neighbors. +3. Use codegraph before text search for indexed code: + - Explore every declared symbol/file seed. + - Find direct callers of shared components, option builders, hooks, stores, services, and protocol commands. + - Trace each UI surface through `local display/draft -> default/inheritance -> validation/gating -> commit command/service -> authoritative runtime or persistence owner`. + - Run impact analysis at depth 2 by default. Expand to depth 3 only when a critical owner or sink is still unresolved. + - Treat affected tests as evidence, not proof of a product dependency. +4. Use `rg` only for docs, config, generated files, unindexed content, or precise string checks after the graph has identified the area. +5. Compare live callers with declared surfaces. Record missing or stale declarations as `graph-drift-candidate`; do not silently rewrite product semantics from static reachability. +6. Rank each relationship: + - `must-inspect`: shared edit point, owner, or commit path. + - `should-inspect`: shared option source, default, validation, or high-value invariant. + - `conditional`: relevant only for a change layer, client mode, workspace type, or runtime condition. + - `invariant-only`: no expected edit, but isolation must be verified. + - `evidence-only`: test or reachable implementation used only as supporting evidence. + +Never report every reachable node as an affected feature. Explain the semantic edge and why it matters for this change layer. + +## Build The UI Surface Matrix + +For every UI entry point, record: + +- user scenario and entry component; +- shared component, option builder, hook, store, or service; +- displayed value and local draft owner; +- default, inheritance, and fallback source; +- validation and gating; +- commit command/service; +- authoritative runtime owner or persistence sink; +- desktop/web/mobile and local/remote differences; +- behavior that must remain isolated from other surfaces. + +Shared UI does not imply shared behavior. The same `model` label can mean current conversation runtime, an automation record, a Subagent Markdown field, or a built-in override. Preserve those state and commit boundaries unless the user explicitly changes the product contract. + +## Clarify Product Boundaries + +After impact discovery, convert only undefined or conflicting relations into questions. + +- Ask 3-7 concrete questions per round. +- Include small candidate answer sets and state what each answer includes, prunes, or leaves undefined. +- Cover trigger, allowed state, target, forbidden side effects, isolation boundary, and proof evidence. +- Summarize fixed boundaries and remaining unknowns after each answer batch. +- Do not ask the user to reconfirm facts already established by code or current source-of-truth docs. + +If the user has not named any capability or behavior, ask one concise scope question before scanning. + +## Curate The Feature Graph + +Turn confirmed scan results into reusable retrieval data. + +- In `impact-only` mode, include a proposed graph delta in the Impact Brief but do not edit the graph. +- In `planning` and `implementation-handoff` modes, update `references/ccbuddy-feature-graph.yaml` after the relevant product semantics are confirmed. +- Add or update capability aliases, source docs, exact code seeds, UI surfaces, state owners, services, persistence nodes, delivery boundaries, typed edges, ranks, and conditions. +- Use one UI surface node per distinct user scenario and state/commit contract. Put nested component call sites for that same surface into multiple `codeSeeds` instead of inventing duplicate product surfaces. +- Keep node IDs stable. Add aliases when terminology changes; do not rename IDs merely to match new UI copy. +- Persist only named product semantics. Leave raw reachability, tests, and unexplained callers as drift or evidence. +- Re-run graph integrity and codegraph seed checks after every graph edit. + +## Enumerate And Prune + +Run this section only in `planning` or `implementation-handoff` mode. + +1. Select 1-4 primary domains and the high-risk cross-products that can change semantics. +2. Extract only behavior-changing dimensions: product state, event, target, UI surface, client mode, delivery kind, workspace identity, model/provider config, runtime/network/filesystem/auth state, persistence source, and evidence layer. +3. Enumerate with `state -> candidate -> guard -> effect -> case`. Prefer pairwise and high-risk combinations over global expansion. +4. Present 3-7 candidate decisions at a time and prune with the user. +5. Classify every candidate as `accepted`, `undefined`, `pruned`, `ignored`, or `bug-candidate`. +6. Give every pruned case a guard/invariant reason. Give every undefined case a concrete question and candidate answers. +7. Record accepted cases with setup, action, assertions, and evidence. + +## Write Docs Before Code + +In planning modes, update or create the feature spec, catalog, matrix, decision worksheet, or backlog before implementation. For conversation-related E2E work, update the conversation case catalog and coverage matrix and obtain pruning decisions before writing tests. + +Hand accepted E2E cases to `e2e-case-lifecycle` when they require manual-review specs, provider replay fixtures, Docker isolation, timing control, or CI promotion. + +## Output Contract + +Always use `references/impact-brief-template.md` and include: + +- feature summary and change-layer classification; +- UI Surface Matrix; +- shared implementation versus divergent behavior; +- ranked upstream/downstream relationships; +- state owners, validation points, commit sinks, and persistence; +- must-preserve invariants; +- codegraph seeds, direct callers, impact depth, and test evidence; +- graph drift candidates; +- confirmed or proposed graph delta; +- unresolved questions that would change scope. + +For planning modes, append the sections in `references/case-planning-template.md`: clarification log, dimensions, candidate combinations, pruning decisions, accepted cases, coverage rows, and E2E handoff notes. Keep case IDs stable. + +## Guardrails + +- Static reachability is not a product dependency. Require a named semantic edge. +- Shared components, hooks, labels, or fields do not prove shared state or commit effects. +- Trace every UI surface to its own validation and commit sink. +- Keep semantic expansion to one meaningful hop and codegraph impact to depth 2 by default; never start at depth 5. +- Report graph drift for human confirmation instead of automatically declaring new product semantics. +- Do not turn an `impact-only` request into code or product-spec edits. +- Do not enumerate a large matrix before the first impact and clarification pass. +- Do not guess undefined product behavior. Record the decision and ask the user. +- Do not write E2E code until accepted semantics exist in docs. +- Do not claim coverage from a path that lacks setup, action, and assertion. +- Mark implementation/spec conflicts as `bug-candidate`; do not rewrite the contract to match current code without confirmation. +- Keep desktop `desktop-continuous` and mobile `web-remote-replayable` semantics separate. +- Preserve workspace isolation with `workspaceIdentity?.trim() || workspacePath`; use `workspacePath` for execution and display. +- Treat task sqlite index, session snapshots, runtime snapshots, localStorage, settings files, provider registry, and backend APIs as distinct sources until synchronization is proven. +- Split environment faults, remote/replayable semantics, performance, telemetry, persistence migrations, and tool cross-products into specialized docs when they would obscure the main feature path. diff --git a/.agents/skills/feature-boundary-planner/references/case-planning-template.md b/.agents/skills/feature-boundary-planner/references/case-planning-template.md index 31f98f94..49ac58e6 100644 --- a/.agents/skills/feature-boundary-planner/references/case-planning-template.md +++ b/.agents/skills/feature-boundary-planner/references/case-planning-template.md @@ -4,92 +4,92 @@ Use this shape when creating a feature-specific decision or coverage-planning do ## Feature Summary -| Field | Value | -| --------------------- | ----- | -| Change | | -| User-visible surfaces | | -| Existing docs | | -| Existing code owners | | -| Out of scope | | +| Field | Value | +| --- | --- | +| Change | | +| User-visible surfaces | | +| Existing docs | | +| Existing code owners | | +| Out of scope | | ## Clarification Log | Round | Question | User answer | Boundary fixed | Follow-up needed | -| ----- | -------- | ----------- | -------------- | ---------------- | -| | | | | yes/no | +| --- | --- | --- | --- | --- | +| | | | | yes/no | ## Boundary Decisions -| Boundary | Decision | Includes | Excludes / prunes | Source | -| -------- | -------- | -------- | ----------------- | -------------- | -| | | | | user/docs/code | +| Boundary | Decision | Includes | Excludes / prunes | Source | +| --- | --- | --- | --- | --- | +| | | | | user/docs/code | ## Domain Scope | Domain | Include? | Why it can change behavior | Primary sources | -| ------ | -------- | -------------------------- | --------------- | -| | yes/no | | | +| --- | --- | --- | --- | +| | yes/no | | | ## High-Risk Cross-Products -| Cross-product | Candidate risk | Initial handling | -| ------------- | -------------- | ------------------------ | -| | | enumerate/prune/ask user | +| Cross-product | Candidate risk | Initial handling | +| --- | --- | --- | +| | | enumerate/prune/ask user | ## Concept Map | Concept | Why it matters | Source | -| ------- | -------------- | ------ | -| | | | +| --- | --- | --- | +| | | | ## State Owners | State / fact | Authority | Mirrors / caches | Evidence | -| ------------ | --------- | ---------------- | -------- | -| | | | | +| --- | --- | --- | --- | +| | | | | ## Dimensions | Dimension | Values / equivalence classes | Source | Include? | Reason | -| --------- | ---------------------------- | ------ | -------- | ------ | -| | | | yes/no | | +| --- | --- | --- | --- | --- | +| | | | yes/no | | ## Candidate Combinations -| Candidate ID | State | Event | Target/surface | Expected guard/effect | Initial status | Notes | -| ------------ | ----- | ----- | -------------- | --------------------- | ----------------------------------------------- | ----- | -| | | | | | accepted/undefined/pruned/ignored/bug-candidate | | +| Candidate ID | State | Event | Target/surface | Expected guard/effect | Initial status | Notes | +| --- | --- | --- | --- | --- | --- | --- | +| | | | | | accepted/undefined/pruned/ignored/bug-candidate | | ## Pruning Decisions | Decision ID | Pruned combinations | Guard/invariant | Product reason | Representative coverage | -| ----------- | ------------------- | --------------- | -------------- | ----------------------- | -| | | | | | +| --- | --- | --- | --- | --- | +| | | | | | ## Questions For User | Question ID | Candidate(s) | Need to decide | Options | Impact | -| ----------- | ------------ | -------------- | ------- | ------ | -| | | | | | +| --- | --- | --- | --- | --- | +| | | | | | ## Accepted Cases -| Case ID | Setup | Action | Assertions | Evidence layers | E2E status | -| ------- | ----- | ------ | ---------- | ----------------------------------- | ----------------------------- | -| | | | | UI + runtime/protocol/network/files | missing/planned/manual-review | +| Case ID | Setup | Action | Assertions | Evidence layers | E2E status | +| --- | --- | --- | --- | --- | --- | +| | | | | UI + runtime/protocol/network/files | missing/planned/manual-review | ## Matrix Backfill -| File | Change | -| -------------------------- | ------ | -| case catalog | | -| coverage matrix | | -| decision worksheet/backlog | | +| File | Change | +| --- | --- | +| case catalog | | +| coverage matrix | | +| decision worksheet/backlog | | ## E2E Handoff Notes - Provider fixture: - File-system fixture: - Timing strategy: -- Execution environment and available runner: +- Docker preset: - Review risks: diff --git a/.agents/skills/feature-boundary-planner/references/ccbuddy-feature-graph.yaml b/.agents/skills/feature-boundary-planner/references/ccbuddy-feature-graph.yaml index 0fa0b3e0..9fc54778 100644 --- a/.agents/skills/feature-boundary-planner/references/ccbuddy-feature-graph.yaml +++ b/.agents/skills/feature-boundary-planner/references/ccbuddy-feature-graph.yaml @@ -1,600 +1,8366 @@ -# Maintainer contract: docs/skills/feature-boundary-graph.md -# Search aliases and IDs first; read only the relevant nodes and one-hop relationships. schemaVersion: 1 -graphId: ccbuddy-feature-relationships -purpose: - Curated source discovery seeds, not an exhaustive feature catalog or a product authority. Verify - matched nodes and relationships against the current checkout. +graphId: "ccbuddy-feature-relationships" +purpose: "Seed semantic feature-impact discovery; verify every result against the current codegraph index." + rules: - semanticExpansion: - Load matched nodes and one meaningful semantic hop; expand only for unresolved owners - or callers. - driftPolicy: - Report missing paths, symbols or changed semantics as graph-drift-candidate; do not infer - product rules from reachability. - stableIdPolicy: - Keep existing IDs when the semantic boundary is unchanged; use aliases for terminology - changes. - persistencePolicy: - Impact-only reports proposed graph changes. Planning or implementation may update - verified entries within the requested scope. + semanticExpansion: "Follow one meaningful product edge by default." + codegraphImpactDepth: 2 + maximumCodegraphImpactDepth: 3 + driftPolicy: "Report live callers missing from this graph as graph-drift-candidate; require human confirmation before adding product semantics." + stableIdPolicy: "Keep node IDs stable; add aliases for terminology changes and multiple codeSeeds for nested call sites on the same product surface." + persistencePolicy: "In planning modes, write confirmed semantic nodes and edges back to this graph; in impact-only mode, report a proposed graph delta." relationRanks: - - must-inspect - - should-inspect - - conditional - - invariant-only - - evidence-only + - "must-inspect" + - "should-inspect" + - "conditional" + - "invariant-only" + - "evidence-only" + nodes: - - id: capability.model-selection - kind: capability - label: Model selection - aliases: - - select model - - model switch - - model picker - - 选择模型 - - 模型选择 - - 切换模型 - codeSeeds: - - file: packages/provider/src/facades.ts - symbol: ModelSelectionFacade - - file: packages/ui/src/hooks/useModelSelectionView.ts - symbol: useModelSelectionView - invariants: - - "Shared model controls do not share commit effects: conversation commands, automation records - and Subagent configuration have separate owners." - - id: surface.conversation-model-control - kind: ui-surface - label: Conversation composer model control - codeSeeds: - - file: packages/ui/src/v4/composer/V4ComposerToolbar.tsx - symbol: V4ComposerModelControlsImpl - - file: packages/ui/src/v4/SessionPane.tsx - symbol: handleSelectModel - - id: surface.automation-edit - kind: ui-surface - label: Automation edit model control - codeSeeds: - - file: packages/ui/src/settings/AutomationEditView.tsx - symbol: AutomationEditView - - file: packages/ui/src/settings/AutomationsSection.tsx - symbol: handleEditSubmit - - id: surface.user-subagent-form - kind: ui-surface - label: User Subagent form model control - codeSeeds: - - symbol: SubagentForm - file: packages/ui/src/settings/SubagentsSection.tsx - - id: surface.builtin-subagent-model - kind: ui-surface - label: Built-in and plugin Subagent model override - codeSeeds: - - symbol: SubagentModelOverrideControl - file: packages/ui/src/settings/SubagentsSection.tsx - - id: shared-ui.model-config-select - kind: shared-ui - label: ModelConfigSelect - codeSeeds: - - symbol: ModelConfigSelect - file: packages/ui/src/ModelConfigSelect.tsx - - id: shared-ui.model-select-groups - kind: shared-ui - label: Model selection option builder - codeSeeds: - - symbol: buildRegistryModelSelectGroups - file: packages/ui/src/lib/modelSelectionGroups.ts - - id: state.renderer-model-selection-read - kind: state-owner - label: Renderer target-host model selection read lifecycle - codeSeeds: - - symbol: useModelSelectionServiceView - file: packages/ui/src/hooks/useModelSelectionView.ts - - symbol: useModelSelectionView - file: packages/ui/src/hooks/useModelSelectionView.ts - - id: service.host-model-selection - kind: service - label: Target Workspace Host model selection service - codeSeeds: - - file: packages/services/src/model-provider/providerFacadeServices.ts - symbol: IModelSelectionService - - file: packages/ui/src/hooks/useWorkspaceServices.tsx - symbol: useWorkspaceServicesResolution - - id: capability.automations - kind: capability - label: Scheduled automations - aliases: - - automation - - scheduled task - - cron - - 自动化 - - 定时任务 - codeSeeds: - - file: packages/services/src/session/automationService.ts - symbol: AutomationService - - id: state.automation-form-draft - kind: state-owner - label: Automation edit React draft - codeSeeds: - - symbol: AutomationEditView - file: packages/ui/src/settings/AutomationEditView.tsx - - id: service.automation - kind: service - label: Automation service - codeSeeds: - - symbol: AutomationService - file: packages/services/src/session/automationService.ts - - id: persistence.automation-record - kind: persistence - label: Persisted automation record - codeSeeds: - - file: packages/services/src/session/automationRepo.ts - symbol: AutomationRepo - - id: capability.subagents - kind: capability - label: Subagents - aliases: - - subagent - - agent profile - - 子代理 - - 智能体配置 - codeSeeds: - - file: packages/ui/src/settings/SubagentsSection.tsx - symbol: SubagentsSection - - file: apps/ccbuddy-cli/packages/core/src/tool/handlers/agent.ts - symbol: agentHandler - - id: state.subagent-form-draft - kind: state-owner - label: Subagent form draft - codeSeeds: - - symbol: SubagentForm - file: packages/ui/src/settings/SubagentsSection.tsx - - id: service.subagents - kind: service - label: Subagents service - codeSeeds: - - file: packages/services/src/subagents/subagents.ts - symbol: ISubagentsService - - file: packages/services/src/subagents/subagentsService.ts - symbol: createSubagentsService - - id: persistence.subagent-markdown - kind: persistence - label: User agent Markdown, built-in and plugin agent overrides - codeSeeds: - - file: packages/services/src/subagents/subagentsService.ts - symbol: createSubagentsService - - file: packages/services/src/subagents/subagentStorage.ts - symbol: resolveSubagentStateFile - - id: capability.conversation-runtime - kind: capability - label: Conversation and session runtime - aliases: - - conversation - - chat - - session - - turn steer - - guide - - follow-up queue - - 对话 - - 会话 - - 引导 - - 消息队列 - codeSeeds: - - file: apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/v4-gateway.ts - symbol: ConversationV4Gateway - - file: apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/commands/handlers/session-flow.ts - symbol: sendText - - id: state.conversation-projection - kind: state-owner - label: Client conversation projection and pending optimistic overlay - codeSeeds: - - file: packages/ui/src/v4/conversationProjectionStore.ts - symbol: ConversationProjectionStore - invariants: - - Snapshots replace state; only contiguous deltas apply. Gaps require resync, and pending optimistic - commands are not accepted runtime facts. - - id: capability.workspace-identity - kind: capability - label: Workspace identity and remote runtime isolation - aliases: - - workspace identity - - remote workspace - - SSH - - WSL - - Docker - - 工作区隔离 - codeSeeds: - - file: packages/ui/src/lib/remoteWorkspaceHistory.ts - symbol: buildRemoteWorkspaceIdentity - - file: packages/services/src/ccbuddy-agent/ccbuddyAgentConnectionScope.ts - symbol: workspaceKey - - id: service.workspace-identity-builder - kind: service - label: Remote workspace identity builder - codeSeeds: - - symbol: buildRemoteWorkspaceIdentity - file: packages/ui/src/lib/remoteWorkspaceHistory.ts - - id: boundary.workspace-key - kind: delivery-boundary - label: workspaceIdentity fallback isolation key - codeSeeds: - - file: packages/ui/src/lib/remoteWorkspaceHistory.ts - symbol: buildWorkspaceSessionKey - - file: packages/services/src/session/taskIndexRepo.ts - symbol: workspaceKey - invariants: - - Use workspaceIdentity?.trim() || workspacePath for isolation; workspacePath remains the execution - and display path. - - id: persistence.task-index - kind: persistence - label: Task sqlite index - codeSeeds: - - symbol: TaskIndexRepo - file: packages/services/src/session/taskIndexRepo.ts - - id: service.ccbuddy-agent-connection-scope - kind: service - label: Host-trusted CCbuddy Agent attachment connection scope - codeSeeds: - - symbol: createCCbuddyAgentConnectionScope - file: packages/services/src/ccbuddy-agent/ccbuddyAgentConnectionScope.ts - - id: boundary.desktop-continuous - kind: delivery-boundary - label: Desktop continuous delivery - codeSeeds: - - file: packages/shared/src/ccbuddy-protocol-v4/core.ts - symbol: DELIVERY_PROFILES - - file: packages/services/src/ccbuddy-agent/ccbuddyAgentConnectionScope.ts - symbol: CCbuddyAgentV4ClientMode - - id: boundary.web-remote-replayable - kind: delivery-boundary - label: Web remote replayable delivery - codeSeeds: - - file: packages/shared/src/ccbuddy-protocol-v4/core.ts - symbol: DELIVERY_PROFILES - - file: packages/services/src/ccbuddy-agent/ccbuddyAgentConnectionScope.ts - symbol: CCbuddyAgentV4ClientMode - - id: capability.composer-trigger-routing - kind: capability - label: Composer primary and compatibility trigger routing - aliases: - - composer prefix routing - - mention panel routing + - id: "capability.permission-full-access" + kind: "capability" + label: "Approval full access updates task and pending input permissions" + aliases: ["完全访问", "审批权限同步", "fullAccess"] + docs: + [ + "docs/permission-project-approval.md", + "docs/working-memory/provider-refactor/steps/todo-158-permission-dialog-full-access-and-queued-mode.md", + ] + codeSeeds: + - file: "apps/ccbuddy-cli/packages/core/src/runtime/permission-full-access.ts" + symbol: "grantPermissionFullAccess" + - file: "packages/ui/src/v4/composer/composerPermissionGrant.ts" + symbol: "applyComposerPermissionGrant" + - id: "surface.permission-full-access" + kind: "ui-surface" + label: "Shared desktop/mobile approval full access action" + codeSeeds: + - file: "packages/ui/src/v4/V4InteractionDialogs.tsx" + symbol: "V4InteractionDialogs" + - file: "packages/ui/src/PermissionDialog.tsx" + symbol: "PermissionDialog" + - id: "capability.plugin-store-mode-order" + kind: "capability" + label: "Public plugin categories ordered by interface mode" + aliases: ["插件分类排序", "Code Work 插件排序", "pluginStoreOrder", "@ 插件排序", "+ 插件排序"] + docs: ["docs/plugins/plugin-store-mode-order.md", "docs/plugin-marketplace-ui-ux.md"] + codeSeeds: + - file: "packages/ui/src/settings/PluginStoreListView.tsx" + symbol: "PluginStoreListView" + - file: "packages/ui/src/settings/pluginStoreListing.ts" + symbol: "groupItemsByCategory" + - file: "packages/ui/src/hooks/usePluginStoreOrder.ts" + symbol: "usePluginStoreOrder" + - file: "packages/ui/src/mentions/providers/pluginsMentionProvider.ts" + symbol: "usePluginsMentionProvider" + - file: "packages/shared/src/pluginStoreOrdering.ts" + symbol: "sortPluginStoreEntries" + - file: "packages/services/src/ccbuddy-agent/pluginReferenceCatalogRequest.ts" + symbol: "requestPluginReferenceCatalog" + - file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/plugin-reference-catalog.ts" + symbol: "getPluginReferenceCatalog" + - file: "packages/shared/src/pluginStoreOrder.ts" + symbol: "parsePluginStoreOrder" + - file: "packages/services/src/client-config/clientConfigService.ts" + symbol: "createClientConfigService" + invariants: + - "coding selects code and general selects work without requests; category membership remains marketplace-owned." + - "Configured items precede default-sorted remainder; explicit other rank is allowed; featured, personal, search and installed ordering remain isolated." + - "Window Local Host owns the independent public ClientConfigService; remote workspace and mobile attachments reuse it. Legacy config readers stay unchanged." + - "Public config cache is partitioned by endpoint/version/platform; failed refresh keeps the last successful snapshot; late UI results cannot cross service or request generations." + - "Retired guides maps to utilities in list and detail; legal is localized and only appears when it contains plugins." + - "@ and + share official category/plugin ordering, with personal entries retaining relative order afterward; fuzzy score remains primary. Display category cannot widen frozen Session identity or enable disabled plugins." + - "Legacy referenceCatalog omits category; only method-not-found on referenceCatalogWithCategory falls back. Closed Pickers do not request config; mode changes only reorder locally." + - id: "capability.referrals-embedded" + kind: "capability" + label: "Rewards center embedded website" + aliases: ["奖励中心", "Rewards", "邀请好友"] + docs: ["docs/rewards-embedded.md"] + codeSeeds: + - file: "packages/ui/src/rewards/RewardsProvider.tsx" + symbol: "RewardsProvider" + - file: "packages/ui/src/rewards/RewardsWebview.tsx" + symbol: "RewardsWebview" + - file: "packages/shared/src/rewardsBridge.ts" + symbol: "installRewardsPageBridge" + invariants: + - "Current-account credentials stay inside trusted embedded origins; no token in URL or bridge events." + - "Website invitation records remain static until a server contract is supplied." + - id: "capability.foreground-bash-output" + kind: "capability" + label: "Foreground Bash output viewport" + aliases: ["前台 Bash 实时输出", "Bash 五行输出", "Bash 吸底"] + docs: ["docs/bash-background-parity.md"] + codeSeeds: + - file: "packages/ui/src/ToolCallBlocks/renderers/execute.tsx" + symbol: "ExecuteToolCallBlock" + - file: "packages/ui/src/ToolCallBlocks/renderers/ExecuteOutput.tsx" + symbol: "ExecuteOutput" + - file: "packages/ui/src/components/ui/scroll-fade-viewport.tsx" + symbol: "ScrollFadeViewport" + - file: "apps/ccbuddy-cli/packages/adapters/src/exec/bash-progress-poller.ts" + symbol: "subscribeBashOutputProgress" + invariants: + - "Only expanded details render output; running and final fit short content with a five-line maximum and no additional notices or file links." + - "Follow bounded previews by default; scrolling up freezes one window and scrolling to the bottom resumes; no frontend polling or output history accumulation." + - "CLI execution, background output query, and desktop/mobile delivery boundaries are unchanged." + - id: "capability.background-bash-output" + kind: "capability" + label: "Background Bash live output details" + aliases: ["后台 Bash 输出", "后台终端进展", "background Bash logs"] + docs: ["docs/background-bash-output-details.md", "docs/bash-background-parity.md"] + codeSeeds: + - file: "packages/ui/src/v4/ConversationStatusPanel.tsx" + symbol: "RunningStatusItem" + - file: "packages/ui/src/app-shell/BackgroundBashOutputSidePane.tsx" + symbol: "BackgroundBashOutputSidePane" + - file: "packages/ui/src/hooks/useBackgroundBashOutput.ts" + symbol: "useBackgroundBashOutput" + - file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/background-bash-output.ts" + symbol: "readBackgroundBashOutput" + invariants: + - "Visible selected tab only; bounded 8 KiB tail; no model tool or runtime startup." + - "Frozen workspace/session/work identity; no output in replay events or persisted projections." + - id: "capability.interface-mode" + kind: "capability" + label: "General and coding interface modes" + aliases: ["通用模式", "编程模式"] + docs: ["docs/ui/general-coding-mode.md", "docs/testing/general-coding-mode-verification.md"] + codeSeeds: + - file: "packages/ui/src/lib/interfaceMode.ts" + symbol: "normalizeInterfaceMode" + - file: "packages/ui/src/hooks/useInterfaceMode.ts" + symbol: "useIsGeneralMode" + invariants: + - "Display preference does not change Agent capabilities or canonical task records." + - id: "state.interface-mode" + kind: "state" + label: "Renderer interface preference with persistence and broadcast" + codeSeeds: + - file: "packages/ui/src/store/index.ts" + symbol: "createCCbuddyStore" + - id: "surface.interface-mode-panels" + kind: "surface" + label: "Review and terminal creation entries with existing panels retained" + codeSeeds: + - file: "packages/ui/src/hooks/useAppPanels.ts" + symbol: "useAppPanels" + - id: "capability.dangerous-command-approval" + kind: "capability" + label: "Guarded permission mode" + aliases: ["guarded", "dangerousCommandRules", "危险命令确认", "强制单次确认"] + docs: + - "docs/dangerous-command-approval-v1-plan.md" + codeSeeds: + - symbol: "matchDangerousCommand" + file: "apps/ccbuddy-cli/packages/core/src/tool/handlers/guarded/command.ts" + - symbol: "resolveToolPermission" + file: "apps/ccbuddy-cli/packages/core/src/tool/executor/permission-flow.ts" + - symbol: "buildProtocolPermissionOptions" + file: "apps/ccbuddy-cli/packages/bootstrap/src/permission-options.ts" + - symbol: "getCCbuddyAgentAvailableModes" + file: "packages/shared/src/ccbuddy-agent-model-state.ts" + - symbol: "buildAutomationModeOption" + file: "packages/ui/src/settings/automationAgentConfigOptions.ts" + - symbol: "filterModeOptions" + file: "apps/ccbuddy-cli/packages/tui/src/app-mode-command.ts" + invariants: + - "Only guarded mode explicit catalog matches add mandatory one-time approval; unsupported analysis retains YOLO policy. Existing modes and defaults are unchanged." + - "Guarded replaces Edit only in selectable menus and shortcut cycles; persisted edit values and explicit legacy commands retain their original policy. YOLO and full-auto aliases remain unchanged." + - "V1 targets bounded syntax in existing POSIX, Git Bash, and CMD shells; PowerShell payload analysis is out of scope and Bash AST must not stand in for CMD parsing." + - "Deletion catalog includes recursive or syntactically batch rm, forced git clean, POSIX/Git Bash find -delete, CMD rd/rmdir /s and del/erase, and CMD/Git Bash robocopy MIR/PURGE unless reliably list-only. Quoted/escaped glob is not batch evidence; no filesystem expansion, indirect exec wrappers, or JOB file inspection." + - "Matched input requires direct approval across guarded ingress and inherited children; no Hook auto-allow or project permission persistence." + - "Ordinary and Explore subagents inherit guarded; dynamic-workflow subagents inherit the launching session's permission mode (guarded included) journaled when their run was created, and ask permissions and AskUserQuestion questions through the parent broker with a subagent origin; legacy workflow/script children remain YOLO while their guarded parent mode is preserved. Unattended guarded automation waits for approval." + - "Approval remains bound to the actual input version; desktop continuous, mobile replayable, and workspace identity remain isolated." + - id: "capability.marketing-touch" + kind: "capability" + label: "Marketing Touch card and popup delivery" + aliases: ["活动 banner", "营销弹窗", "远端 Hero", "Marketing Touch"] + docs: ["docs/marketing-touch-client.md", "docs/cloud-content-dialog.md"] + codeSeeds: + - file: "packages/ui/src/components/marketing-touch/MarketingTouchProvider.tsx" + symbol: "MarketingTouchProvider" + - id: "state.marketing-touch-controller" + kind: "state" + label: "Shell-owned marketing scheduling and action state" + codeSeeds: + - file: "packages/ui/src/components/marketing-touch/marketingTouchController.ts" + symbol: "createMarketingTouchController" + - id: "service.marketing-touch" + kind: "service" + label: "Authenticated delivery and confirm/cancel reports" + codeSeeds: + - file: "packages/services/src/marketing-touch/marketingTouchService.ts" + symbol: "createMarketingTouchService" + - id: "capability.delete-all-archived-tasks" + kind: "capability" + label: "Delete all archived tasks in the window" + aliases: ["一键删除所有归档任务", "批量删除归档任务", "归档更多菜单"] + docs: ["docs/task/delete-all-archived-tasks.md"] + codeSeeds: + - file: "packages/services/src/session/taskIndexRepo.ts" + symbol: "TaskIndexRepo" + invariants: + - "Confirm all window scopes; delete only targets still archived in the write transaction." + - "Keep CLI sessions and files; preserve workspace identity and existing source routing." + - id: "surface.desktop-archived-tasks" + kind: "ui-surface" + label: "Desktop archived task list" + codeSeeds: + - file: "packages/ui/src/WorkspaceSidebar.tsx" + symbol: "WorkspaceSidebar" + - file: "packages/ui/src/DeleteAllArchivedTasksButton.tsx" + symbol: "DeleteAllArchivedTasksButton" + - file: "packages/ui/src/WorkspaceArchivedTasksFlatSection.tsx" + symbol: "WorkspaceArchivedTasksFlatSection" + - id: "surface.web-archived-tasks" + kind: "ui-surface" + label: "Web remote archived task list" + codeSeeds: + - file: "packages/ui/src/WorkspaceSidebar.tsx" + symbol: "WorkspaceSidebar" + - file: "packages/ui/src/DeleteAllArchivedTasksButton.tsx" + symbol: "DeleteAllArchivedTasksButton" + - file: "packages/ui/src/WebRemoteControlTaskIndex.tsx" + symbol: "WebRemoteControlTaskIndex" + - id: "capability.help-client-config" + kind: "capability" + label: "Community and feedback client configuration" + aliases: ["用户社群", "帮助配置", "feedbackUrl"] + docs: ["docs/ui/settings-community-link-config.md", "docs/testing/help-client-config-e2e.md"] + codeSeeds: + - file: "packages/shared/src/helpAppConfig.ts" + symbol: "createHelpAppConfigReader" + - file: "packages/desktop/src/main/desktopHelpConfig.ts" + symbol: "createDesktopHelpConfigReader" + - file: "packages/web/src/communityUrl.ts" + symbol: "resolveWebHelpConfig" + - id: "capability.subagent-computer-use-boundary" + kind: "capability" + label: "Subagent official Computer Use boundary" + aliases: + - "subagent CUA restriction" + - "子 Agent Computer Use 限制" + - "subagent computer use unavailable" + docs: + - "docs/cua/2026-08-18-subagent-computer-use-unavailable-spec.md" + - "apps/ccbuddy-cli/docs/design/v2/tool/07-subagent.md" + codeSeeds: + - symbol: "createBorrowedSubagentMcpAccess" + file: "apps/ccbuddy-cli/packages/core/src/subagent/borrowed-mcp-port.ts" + - symbol: "resolveSubagentMcpAccess" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/subagent.ts" + - symbol: "resolveSubagentSkillPort" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/subagent.ts" + - symbol: "main" + file: "apps/ccbuddy-cli/packages/node-repl-host/src/server.ts" + invariants: + - "Only authority-verified official CUA is restricted; third-party MCP/Skill is unchanged." + - "Main CUA and desktop/web delivery boundaries are unchanged." + + - id: "capability.model-io-full-retention" + kind: "capability" + label: "ModelIO full retention diagnostics" + aliases: + - "modelio full retention" + - "full model io" + - "完整保留模型 I/O" + - "模型轨迹全量保留" + docs: + - "docs/model-io-full-retention-setting.md" + - "apps/ccbuddy-cli/docs/design/v2/model/README.md" + codeSeeds: + - symbol: "writeModelIODebugRecord" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-debug.ts" + - symbol: "AiSdkModelAdapter" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner.ts" + + - id: "capability.agent-core-runtime" + kind: "capability" + label: "CCbuddy CLI agent core runtime" + aliases: + - "agent core" + - "turn runtime" + - "智能体核心" + - "回合运行时" + docs: + - "docs/product-capability-map.md" + - "apps/ccbuddy-cli/docs/design/v2/runtime-refactor.md" + - "apps/ccbuddy-cli/docs/design/v2/loop/architecture.md" + + - id: "capability.read-pdf" + kind: "capability" + label: "Read PDF native input and page extraction" + aliases: + - "Read pages" + - "PDF Read" + - "PDF 页面提取" + docs: + - "apps/ccbuddy-cli/docs/design/v2/tool/01-read.md" + - "apps/ccbuddy-cli/docs/design/v2/tool/00-tool-change-chain.md" + codeSeeds: + - symbol: "readToolEntry" + file: "apps/ccbuddy-cli/packages/core/src/tool/handlers/read.ts" + - symbol: "createPopplerPdfDocumentAdapter" + file: "apps/ccbuddy-cli/packages/adapters/src/pdf/index.ts" + - symbol: "persistToolResultMediaAttachments" + file: "apps/ccbuddy-cli/packages/core/src/runtime/helpers/tool-result-media-persistence.ts" + - symbol: "toAiSdkMessages" + file: "apps/ccbuddy-cli/packages/adapters/src/model/transform.ts" + invariants: + - "supportsPdf conditionally controls both provider-visible and executor Read schemas from the current turn snapshot." + - "Native PDF and extracted page images keep supportsPdf and supportsImages as independent capabilities." + - "Live and cold-resumed page images keep the same page order through the existing tool media artifact layout." + - "Images, extracted PDF pages, native PDFs, binary files, and videos share one 40MiB provider-request budget measured as full data URL bytes; per-file video input validation remains separate." + + - id: "capability.browser-use-agent-guidance" + kind: "capability" + label: "Browser Use agent navigation, locator planning and popup recovery guidance" + aliases: + - "Browser Use explicit navigation wait" + - "DOMContentLoaded wait" + - "Browser Use locator planning" + - "snapshot-proven locator" + - "generic click target" + - "popup recovery" + - "浏览器显式导航等待" + - "浏览器智能体定位" + - "弹窗标签恢复" + docs: + - "docs/browser-use/2026-07-31-browser-generic-target-popup-recovery-guidance-spec.md" + - "docs/browser-use/2026-07-10-browser-use-codex-parity-spec.md" + - "docs/testing/browser-use-codex-parity-coverage-matrix.md" + codeSeeds: + - symbol: "loadBrowserDocumentation" + file: "apps/ccbuddy-cli/packages/core/src/browser-client/documentation.ts" + - symbol: "buildJsToolDescription" + file: "apps/ccbuddy-cli/packages/core/src/tool/handlers/node-repl.ts" + - symbol: "TAB_CONTEXT_RECOVERY_HINT" + file: "packages/desktop/src/main/browserView/browserGuestManager.ts" + - file: "apps/ccbuddy-cli/packages/browser-use-plugin/docs/api.json" + - file: "apps/ccbuddy-cli/packages/browser-use-plugin/docs/overview.md" + - file: "apps/ccbuddy-cli/packages/browser-use-plugin/docs/playwright.md" + - file: "apps/ccbuddy-cli/packages/browser-use-plugin/docs/workflow.md" + - file: "apps/ccbuddy-cli/packages/browser-use-plugin/skills/control-browser/SKILL.md" + + - id: "capability.browser-use-plugin-distribution" + kind: "capability" + label: "Browser Use official plugin versioning and distribution" + aliases: + - "Browser Use plugin version" + - "Browser Use official cache" + - "Browser Use SEA assets" + - "浏览器插件版本" + - "浏览器插件发布" + docs: + - "docs/browser-use/2026-08-14-browser-use-plugin-version-0-3-0-spec.md" + - "docs/browser-use/2026-08-06-browser-use-plugin-version-0-2-1-spec.md" + - "docs/browser-use/2026-08-02-browser-use-plugin-version-0-1-3-spec.md" + - "apps/ccbuddy-cli/docs/design/v2/plugin-compat.md" + - "docs/browser-use/2026-07-13-node-repl-mcp-runtime-spec.md" + codeSeeds: + - file: "apps/ccbuddy-cli/packages/browser-use-plugin/package.json" + - file: "apps/ccbuddy-cli/packages/browser-use-plugin/.ccbuddy-plugin/plugin.json" + - symbol: "OFFICIAL_PLUGIN_DEFINITIONS" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/official-plugin-definitions.ts" + - symbol: "OFFICIAL_BROWSER_USE_REQUIRED_SEED_PATHS" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/official-plugin-definitions.ts" + - symbol: "officialSeaPlugins" + file: "apps/ccbuddy-cli/packages/cli/scripts/sea-official-plugin-assets.mjs" + - symbol: "NODE_REPL_SERVER_VERSION" + file: "apps/ccbuddy-cli/packages/node-repl-host/src/tool-contract.ts" + - symbol: "REMOTE_AGENT_OFFICIAL_PLUGIN_INCLUDED_TOP_LEVEL_PATHS" + file: "packages/server/src/remote/ccbuddyAgentOfficialPluginAssets.ts" + - symbol: "REMOTE_AGENT_OFFICIAL_PLUGIN_REQUIRED_RELATIVE_PATHS" + file: "packages/server/src/remote/ccbuddyAgentOfficialPluginAssets.ts" + - file: "packages/desktop/scripts/prepare-agent-node-bundle.mjs" + - file: "scripts/prepare-prebuilds.mjs" + + - id: "capability.model-capabilities" + kind: "capability" + label: "Model capabilities" + aliases: + - "model platform" + - "model config" + - "model catalog" + - "CCbuddy Built-in Model Config Rules" + - "模型能力" + - "模型平台" + - "模型配置" + - "模型启停" + - "Model ID 冲突" + - "GLM-x-preview-f" + - "x-preview-f-free" + docs: + - "docs/product-capability-map.md" + - "docs/working-memory/provider-refactor/steps/03-staging-integration.md" + - "docs/working-memory/provider-refactor/design/registry/configuration.md" + - "docs/working-memory/provider-refactor/design/registry/provider-and-model-configuration-overview.md" + - "docs/working-memory/provider-refactor/design/registry/request-compatibility-and-access-protocols.md" + - "docs/working-memory/provider-refactor/design/registry/model-membership-and-enablement.md" + - "docs/working-memory/provider-refactor/design/registry/ccbuddy-builtin-provider-config.md" + - "docs/working-memory/provider-refactor/design/model/input-output-format.md" + - "docs/working-memory/provider-refactor/design/model/model-option-map.md" + - "docs/working-memory/provider-refactor/design/model/option-map-writing-style.md" + - "docs/working-memory/provider-refactor/steps/todo-98-builtin-option-map-formatting-regression.md" + - "docs/working-memory/provider-refactor/steps/todo-95-builtin-reasoning-map-simplification-and-fallback.md" + - "docs/working-memory/provider-refactor/steps/todo-03-provider-model-ownership-and-property-totality.md" + - "docs/working-memory/provider-refactor/steps/todo-14-post-refactor-mechanical-zero.md" + - "docs/working-memory/provider-refactor/steps/todo-55-provider-template-inheritance-cutover.md" + - "docs/model-provider-opencode-config.md" + - "docs/model-request-output-tokens.md" + - "docs/superpowers/specs/2026-07-10-glm-52-suffixed-variant-media-fallback-design.md" + - "docs/superpowers/specs/2026-07-17-kimi-k3-model-adapter-design.md" + - "docs/superpowers/specs/2026-08-14-glm-5-3-model-adapter-design.md" + - "docs/superpowers/specs/2026-08-21-model-provider-modality-settings-design.md" + codeSeeds: + - symbol: "ModelInputFormatConfig" + file: "packages/provider/src/config/model-config.ts" + - symbol: "ModelConfigRules" + file: "packages/provider/src/config/model-config.ts" + - symbol: "compileModelOptionMaps" + file: "packages/model-option-map/src/option-maps.ts" + - symbol: "createModelOptionMapFetch" + file: "apps/ccbuddy-cli/packages/adapters/src/model/model-option-map-fetch.ts" + - symbol: "ProviderConfigResolver" + file: "packages/provider/src/resolver.ts" + - symbol: "ProviderRegistry" + file: "packages/provider/src/registry.ts" + - symbol: "ProviderSettingsFacade" + file: "packages/provider/src/facades.ts" + - symbol: "createProviderModelDraftValues" + file: "packages/ui/src/settings/model-provider-section/ProviderModelMetadata.ts" + - symbol: "ApiProviderModelRuntime" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/provider-registry-model-runtime.ts" + - symbol: "compactActiveConversation" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/compact-active.ts" + - symbol: "ccbuddySessionSettingsToCCbuddyConfigOptions" + file: "packages/shared/src/ccbuddy-agent-model-state.ts" + invariants: + - "Each complete Model Option Spec owns a restricted CEL map from its effective value to an RFC 7396 raw request-body patch. Config validation and runtime execution share @ccbuddy/model-option-map; the adapter applies reasoningLevel then maxOutputTokens after AI SDK serialization and schema compatibility but before body-dependent signing, so reasoningMapping, AI SDK reasoning namespaces, and duplicate max-output authorities are not model facts." + + - id: "capability.model-selection" + kind: "capability" + label: "Model selection" + aliases: + - "select model" + - "model switch" + - "model picker" + - "选择模型" + - "模型选择" + - "切换模型" + docs: + - "docs/ui/chat-model-select-menu.md" + - "docs/chat/manual-model-switch-resolution-chain.md" + - "docs/chat/new-task-model-resolution-chain.md" + - "docs/working-memory/provider-refactor/steps/todo-12-model-selection-validation-boundary-cutover.md" + - "docs/working-memory/provider-refactor/steps/todo-13-target-host-model-selection-authority.md" + - "docs/working-memory/provider-refactor/steps/todo-14-post-refactor-mechanical-zero.md" + - "docs/working-memory/provider-refactor/design/interaction/selection-state.md" + - "docs/working-memory/provider-refactor/steps/todo-34-model-selection-async-state-and-repo-wiki-draft.md" + - "docs/working-memory/provider-refactor/steps/todo-68-active-model-context-single-source.md" + - "docs/working-memory/provider-refactor/steps/todo-87-selection-view-unified-resolution.md" + - "docs/working-memory/provider-refactor/steps/todo-95-builtin-reasoning-map-simplification-and-fallback.md" + - "docs/working-memory/provider-refactor/steps/todo-96-selection-offline-migration-and-resolution-consolidation.md" + - "docs/working-memory/provider-refactor/steps/todo-97-subagent-markdown-in-place-migration-and-legacy-read-audit.md" + - "docs/working-memory/provider-refactor/steps/todo-99-worker-account-selection-repair.md" + codeSeeds: + - symbol: "ModelSelectionFacade" + file: "packages/provider/src/facades.ts" + - symbol: "ApiProviderModelRuntime" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/provider-registry-model-runtime.ts" + - symbol: "useModelSelectionServiceView" + file: "packages/ui/src/hooks/useModelSelectionView.ts" + - symbol: "resolveEffectiveModelSelection" + file: "packages/provider/src/effective-model-selection.ts" + - symbol: "resolveAutomationSubmissionModelSelection" + file: "packages/desktop/src/host/automationModelSelection.ts" + - symbol: "createNodeModelSelectionFacade" + file: "packages/provider-node/src/model-selection-facade.ts" + - symbol: "resolveSubagentSelection" + file: "apps/ccbuddy-cli/packages/core/src/runtime/helpers/subagent-selection.ts" + invariants: + - "ModelSelectionFacade projects visible user candidates and change events only; authoritative selection validation occurs against the current process Registry when ModelFactory builds a Model. Internal products such as Off-Peak may preflight an exact hidden selection through the Registry, but that preflight never replaces final Model construction validation." + - "User-visible model candidates, option specs, and preferredSelection come atomically from the target Workspace Host: local workspaces use Local Host and remote workspaces use Remote Host, with no Base/Local fallback while a remote target is waiting or disconnected. App Recent is isolated by workspaceKey = workspaceIdentity?.trim() || workspacePath; the Renderer may prefer a still-selectable Recent over Host preferredSelection, while final execution validation remains in the target Worker Registry and ModelFactory." + - "ModelSelection stores provider/model identity and selected options. ModelFactory validates and freezes complete execution selections; it never fills missing reasoning. New default completion and an explicit user model-menu choice use the highest public level (Todo 88). Auxiliary low-cost calls explicitly use values[0], while invalid saved Session/Composer effective selections remain empty without fallback or empty-selection notifications." + - "ModelSelection is future Model-creation intent, not a current execution fact. Each model step creates one immutable Active Model and uses that same object for Context current-model identity, model-aware tool projection, request options, and the Adapter request. Guide creates a new model step; execution-scoped Off-Peak and inherited Subagents must not mix their Active Model with Session Selection." + - "Implemented (Todo 87/99): A target-host selection read accepts original intent and returns a caller-specific effectiveSelection. Account and Personal/Built-in updates recompute temporary results without overwriting intent; UI reads share subscriptions and bounded cancellable read recovery. Composer, Automation, and Bot consume this result at their own commit boundaries. Bound Bot reads the Session original selection, never a second Bot preference; explicit /model commits the complete Session selection immediately. Managed Worker explicit Subagents use the same local facade through dependency injection, including Workflow children; implicit Subagents inherit Parent and execution overrides take priority. Ordinary providers keep identity and account plans follow the current plan. Off-Peak keeps its original provider and Ticket; cross-account remapping is excluded. Frozen runs and history do not remap. No new send-time synchronization barrier or storage migration is introduced. Worker account receivedRevision acknowledges receipt, not Registry application." + + - id: "capability.provider-templates" + kind: "capability" + label: "Built-in Provider Templates and Personal Provider inheritance" + aliases: + - "Provider Template" + - "provider template inheritance" + - "template-created provider" + - "供应商模板" + - "模板创建供应商" + docs: + - "docs/working-memory/provider-refactor/design/registry/configuration.md" + - "docs/working-memory/provider-refactor/design/registry/provider-and-model-configuration-overview.md" + - "docs/working-memory/provider-refactor/steps/todo-55-provider-template-inheritance-cutover.md" + - "docs/working-memory/provider-refactor/steps/todo-61-provider-template-picker-and-brand-metadata.md" + codeSeeds: + - symbol: "ProviderTemplateMap" + file: "packages/provider/src/config/provider-config.ts" + - symbol: "ProviderConfigResolver" + file: "packages/provider/src/resolver.ts" + - symbol: "ProviderSettingsFacade" + file: "packages/provider/src/facades.ts" + - symbol: "ProviderTemplatePicker" + file: "packages/ui/src/settings/model-provider-section/ProviderTemplatePicker.tsx" + - symbol: "resolveBuiltinProviderLogoAsset" + file: "packages/ui/src/settings/model-provider-section/ProviderLogo.tsx" + invariants: + - "A Provider Template is an inheritance baseline, not a Provider: it has a templateId but no providerId, group, Registry identity, execution state, or recursive Template parent." + - "A Template-created Personal Provider has its own providerId and resolves Template -> Personal; runtime execution uses only the resulting Effective Provider identity, API, Access, and Model Config." + - "Account Providers remain concrete Built-in Provider roots and are constrained by Account Config; ordinary API services are Templates that create Personal Provider instances." + - "ProviderTemplate is a domain shell containing localized name metadata and a Provider Config Overlay; Model Config Rules remain centralized so their precedence stays explicit." + - "Provider branding is declared once by Provider Config.logo; the UI logo resource table maps open built-in keys to packaged theme assets and unknown keys fall back without affecting executability." + + - id: "capability.plan-entitlements" + kind: "capability" + label: "Plan identity, entitlements, quota, and billing" + aliases: + - "Coding Plan" + - "Team Plan" + - "Start Plan" + - "套餐权益" + - "套餐额度" + docs: + - "docs/usage-stats-app-coding-plan-split.md" + - "docs/zai-start-plan-provider.md" + - "docs/model-provider-family-merge.md" + - "docs/input-model-provider-team-plan-linkage.md" + - "docs/working-memory/provider-refactor/steps/todo-32-team-plan-settings-effective-provider-boundary.md" + - "docs/working-memory/provider-refactor/steps/todo-51-provider-access-consumer-and-offpeak-auth-closeout.md" + codeSeeds: + - symbol: "ModelProviderSectionDetail" + file: "packages/ui/src/settings/model-provider-section/Detail.tsx" + - symbol: "resolveTeamScopedPlanNavItem" + file: "packages/ui/src/settings/model-provider-section/Detail.tsx" + - symbol: "appendSubscribedTeamPlanItems" + file: "packages/ui/src/settings/model-provider-section/providerFamilyConnectionVisibility.ts" + - symbol: "useCodingPlanEntitlements" + file: "packages/ui/src/settings/model-provider-section/useCodingPlanEntitlements.ts" + - symbol: "buildVisibleFamilyConnectionItems" + file: "packages/ui/src/settings/model-provider-section/providerFamilyConnectionVisibility.ts" + - symbol: "resolveLatestModelProviderFamilyConnectionSelection" + file: "packages/ui/src/lib/modelProviderFamilyConnectionSelection.ts" + invariants: + - "Team Plan entitlement, quota, credential, and error state controls only the plan status card and related actions. Provider Settings renders Provider and Model facts from ProviderSettingsView effectiveConfig; entitlement status never hides an existing Effective Provider or causes Renderer to reapply Account Overlay." + - "An active Start Plan remains independently queryable and selectable alongside personal or Team Coding Plan." + - "Start remains visible in settings regardless of entitlement; executable models follow Registry availability. No inactive Start silently falls back to paid quota. Recommendation shares quota identity and requires a successful sample within 60 seconds, including side first-input submission." + + - id: "capability.app-usage" + kind: "capability" + label: "App Usage analytics from CCbuddy CLI usage facts" + aliases: + - "App Usage" + - "usage stats" + - "应用用量" + - "用量统计" + docs: + - "docs/product-capability-map.md" + - "docs/usage-stats-app-coding-plan-split.md" + - "apps/ccbuddy-cli/docs/design/v2/usage-observability.md" + + - id: "capability.data-observability" + kind: "capability" + label: "Product telemetry, runtime observability, and monitoring" + aliases: + - "telemetry" + - "ARMS" + - "monitoring" + - "埋点" + - "监控" + - "可观测性" + docs: + - "docs/product-capability-map.md" + - "docs/monitoring/performance-telemetry-catalog.md" + - "docs/monitoring/business-monitoring.md" + - "docs/monitoring/event-report-delivery-reliability.md" + - "docs/monitoring/ccbuddy-cli-resource-telemetry.md" + - "docs/monitoring/process-resource-telemetry.md" + - "docs/monitoring/process-resource-telemetry-fixes.md" + - "docs/monitoring/ccbuddy-data-size-arms-telemetry.md" + - "docs/monitoring/mcp-process-arms-telemetry.md" + - "docs/monitoring/remote-usage-telemetry-v1.md" + - "docs/trace/model-attempt-error-diagnostics.md" + codeSeeds: + - symbol: "sanitizeTelemetryError" + file: "apps/ccbuddy-cli/packages/telemetry/src/error-sanitizer.ts" + - symbol: "TerminalStreamChunkError" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-retry.ts" + - symbol: "createCCbuddyProcessResourceSampler" + file: "apps/ccbuddy-cli/packages/bootstrap/src/process-resource-sampler.ts" + - symbol: "createCCbuddyAgentService" + file: "packages/services/src/ccbuddy-agent/ccbuddyAgentService.ts" + - symbol: "ingestCliResourceSample" + file: "packages/desktop/src/main/processResourceCliSource.ts" + - symbol: "registerHostServiceResourceTelemetry" + file: "packages/desktop/src/host/hostServiceResourceTelemetry.ts" + - symbol: "createMcpTelemetryTracker" + file: "apps/ccbuddy-cli/packages/adapters/src/mcp/telemetry.ts" + - symbol: "reportMcpTelemetryToArms" + file: "packages/desktop/src/main/desktopMcpTelemetry.ts" + invariants: + - "Resource telemetry stays outside desktop continuous and mobile replayable task delivery." + - "Host runtime environment identity isolates equal-hardware remote samples; identity is never an ARMS property." + - "Only a Server advertising processResourceTelemetry receives resource subscriptions; old Server connections remain usable." + - "Bash completion tokens are deduplicated at the main resource outlet across Host processes and omitted from ARMS." + + - id: "capability.renderer-user-action-trace" + kind: "capability" + label: "Desktop Renderer semantic user action trace" + aliases: + - "renderer action trace" + - "ui_action" + - "Renderer 用户操作 Trace" + docs: + - "docs/trace/desktop-renderer-user-action-trace.md" + codeSeeds: + - symbol: "USER_ACTION_CATALOG" + file: "packages/ui/src/lib/userActionTraceCatalog.ts" + - symbol: "RendererUserActionTelemetry" + file: "packages/ui/src/lib/userActionTelemetry.ts" + - symbol: "createRendererActionTraceBroker" + file: "packages/desktop/src/main/rendererActionTraceBroker.ts" + invariants: + - "Only Electron Desktop Renderer creates ui_action spans; Web/mobile remain no-op." + - "Host, CLI, RPC and CCbuddy Protocol receive no trace changes." + - "Product /event/report remains unchanged and separate." + + - id: "capability.ccbuddy-data-size-telemetry" + kind: "capability" + label: "CCbuddy local data directory size telemetry" + aliases: + - "CCbuddy data size" + - "disk usage telemetry" + - "CCbuddy 数据目录占用" + - "磁盘占用埋点" + docs: + - "docs/monitoring/ccbuddy-data-size-arms-telemetry.md" + - "docs/monitoring/performance-monitoring.md" + codeSeeds: + - symbol: "createCCbuddyDataSizeTelemetryScheduler" + file: "packages/desktop/src/main/desktopCCbuddyDataSizeTelemetry.ts" + - symbol: "scanCCbuddyDataDirectory" + file: "packages/desktop/src/main/ccbuddyDataSizeScanner.ts" + - symbol: "scanCCbuddyDataDirectoryInWorker" + file: "packages/desktop/src/main/ccbuddyDataSizeWorkerClient.ts" + - symbol: "writeCCbuddyDataSizeTelemetryState" + file: "packages/desktop/src/main/ccbuddyDataSizeTelemetryState.ts" + - symbol: "getCCbuddyDataRootDir" + file: "packages/services/src/paths.ts" + invariants: + - "Measure only the local getCCbuddyDataRootDir logical byte size; never report paths, file names, workspace ids or remote targets." + - "Directory traversal runs in a Worker and stays outside conversation continuous/replayable delivery." + - "A running CCbuddy task always blocks collection; successful reports are limited to one per device per 24 hours." + + - id: "capability.resource-manager" + kind: "capability" + label: "Resource Manager window (CPU / memory by base services, built-in plugins, community plugins)" + aliases: + - "资源管理器" + - "存储管理" + - "Storage management" + - "Resource Manager" + - "Process Monitor" + - "进程监视器" + - "CPU 内存占用" + - "网络请求" + - "Network requests" + docs: + - "docs/electron/resource-manager.md" + - "docs/electron/resource-manager-network.md" + - "docs/electron/process-naming.md" + - "docs/settings-storage-management.md" + - "docs/windows-caption-help-menu.md" + codeSeeds: + - symbol: "WorkspaceHelpMenuButton" + file: "packages/ui/src/WorkspaceHelpMenuButton.tsx" + - symbol: "buildResourceUsageSnapshot" + file: "packages/desktop/src/main/resourceManagerWindow.ts" + - symbol: "requestHostResourceUsage" + file: "packages/desktop/src/main/resourceManagerHostSampling.ts" + - symbol: "createHostResourceUsageResponder" + file: "packages/desktop/src/host/hostResourceUsage.ts" + - symbol: "attributeHostProcessTree" + file: "packages/services/src/process/processResourceSampler.ts" + - symbol: "collectLocalRuntimeChildProcesses" + file: "packages/services/src/ccbuddy-agent/ccbuddyAgentService.ts" + - symbol: "listChildProcesses" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/process-child-processes.ts" + - symbol: "registerResourceManagerStorageIpc" + file: "packages/desktop/src/main/resourceManagerStorage.ts" + - symbol: "startResourceManagerNetwork" + file: "packages/desktop/src/main/resourceManagerNetwork.ts" + - symbol: "LocalRuntimeNetworkCapture" + file: "packages/services/src/ccbuddy-agent/localRuntimeNetworkCapture.ts" + - symbol: "createStorageService" + file: "packages/services/src/storage/app/storageService.ts" + - symbol: "classifyStoragePath" + file: "packages/services/src/storage/domain/storageCatalog.ts" + invariants: + - "Electron main never spawns an external process for sampling; external process CPU/RSS is sampled inside the window Host only while a snapshot request is in flight." + - "Plugin attribution comes from the CLI process/childProcesses request (pid + mcpSource + pluginName); official marketplace MCP trees and browser-use guest renderers are built-in plugins, every other MCP tree is a community plugin." + - "CPU is machine-normalized (100% = all logical cores) for every row so group subtotals and the app total are additive." + - "The window is desktop-only and outside conversation continuous/replayable delivery; it must not change the 60s CLI resource telemetry cadence or MCP memory telemetry." + - "Network capture runs only for the resource-manager window lifetime, records bounded metadata from local Main/Host/App Renderer/CLI, and excludes MCP, subprocesses, remote CLI and external browser sessions without changing proxy routing." + + - id: "capability.engineering-infrastructure" + kind: "capability" + label: "Engineering infrastructure outside the product runtime" + aliases: + - "engineering infrastructure" + - "developer productivity" + - "工程基础设施" + - "研发效能" + docs: + - "docs/product-capability-map.md" + - "docs/product-capability-map-engineering-infrastructure.md" + + - id: "capability.build-release-engineering" + kind: "capability" + label: "Build and release engineering" + aliases: + - "CI/CD" + - "release pipeline" + - "packaging" + - "构建发布" + - "发版" + docs: + - "docs/product-capability-map-engineering-infrastructure.md" + - "docs/desktop/ccbuddy-preview-packaging.md" + codeSeeds: + - symbol: "runDesktopProductionBuild" + file: "packages/desktop/scripts/run-production-build.mjs" + + - id: "capability.development-storage-isolation" + kind: "capability" + label: "Local development user-data isolation" + aliases: + - "development data root" + - "ccbuddy-dev" + - "dev storage profile" + - "开发态数据隔离" + - "开发数据库隔离" + docs: + - "docs/desktop/configurable-data-directory.md" + - "docs/testing/desktop-e2e-container.md" + codeSeeds: + - symbol: "resolveCCbuddyStorageProfile" + file: "packages/shared/src/storageProfile.ts" + - symbol: "applyEarlyDataBaseDirBootstrap" + file: "packages/desktop/src/main/desktopDataBaseDirBootstrap.ts" + - symbol: "resolveCCbuddyStorageRoot" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/ccbuddy-storage-root.ts" + + - id: "capability.embedded-native-search" + kind: "capability" + label: "Embedded native search runtime" + aliases: + - "native search" + - "bfs" + - "ugrep" + - "embedded search" + - "原生搜索" + docs: + - "docs/runtime-tools/embedded-search-native-build.md" + - "docs/runtime-tools/ripgrep-runtime.md" + codeSeeds: + - symbol: "resolveNativeSearchPrebuiltPlan" + file: "scripts/native-search-tools-config.mjs" + - symbol: "buildRuntimeToolEnvPatch" + file: "packages/services/src/runtime-tools/runtimeToolResolver.ts" + - symbol: "buildEmbeddedSearchPreludeContent" + file: "apps/ccbuddy-cli/packages/adapters/src/exec/embedded-search-prelude.ts" + + - id: "capability.test-automation-platform" + kind: "capability" + label: "Shared E2E and replay test automation platform" + aliases: + - "E2E" + - "test automation" + - "capture replay" + - "测试自动化" + - "回放测试" + docs: + - "docs/product-capability-map-engineering-infrastructure.md" + - "docs/testing/conversation-session-e2e-development-workflow.md" + - "docs/testing/desktop-e2e-container.md" + codeSeeds: + - symbol: "config" + file: "packages/desktop/wdio.conf.ts" + - symbol: "startConversationModelProviderReplayServer" + file: "packages/desktop/test/e2e/helpers/model-provider-replay.ts" + + - id: "capability.quality-intelligence" + kind: "capability" + label: "Quality intelligence and engineering governance" + aliases: + - "quality data" + - "E2E report" + - "coverage governance" + - "质量数据" + - "覆盖率治理" + docs: + - "docs/product-capability-map-engineering-infrastructure.md" + - "docs/testing/desktop-e2e-reporting.md" + - "docs/testing/e2e-failure-artifact-report-upload.md" + codeSeeds: + - symbol: "createE2EReporter" + file: "packages/desktop/test/e2e/reporting/e2e-reporting.ts" + - symbol: "createE2EReportViewerUrl" + file: "packages/e2e-report/src/node/index.ts" + + - id: "capability.office-computer-use-incubation" + kind: "capability" + label: "Office Suite and Computer Use incubation" + aliases: + - "Office Suite" + - "Office preview" + - "Office editing" + - "Computer Use" + - "办公套件" + - "文档预览编辑" + - "计算机操作" + docs: + - "docs/product-capability-map.md" + - "docs/product-capability-map-office-computer-use.md" + + - id: "capability.office-suite" + kind: "capability" + label: "Office document preview, editing, and Agent production" + aliases: + - "DOCX" + - "XLSX" + - "PPTX" + - "PDF preview" + - "文档编辑" + - "表格编辑" + - "演示文稿编辑" + docs: + - "docs/product-capability-map-office-computer-use.md" + - "docs/document-skills-plugin.md" + + - id: "capability.pptx-element-reference" + kind: "capability" + label: "PPTX preview element reference and verified OOXML update" + aliases: + - "PPTX element selection" + - "presentation element reference" + - "PPTX resolver" + - "PPTX 元素引用" + - "演示文稿元素选择" + docs: + - "docs/ui/pptx-preview.md" + - "docs/conversation-session-case-catalog.md" + codeSeeds: + - symbol: "PresentationPreviewDocument" + file: "packages/ui/src/presentation/types.ts" + - symbol: "serializeComposerPromptContexts" + file: "packages/ui/src/v4/composer/composerPromptContexts.ts" + + - id: "capability.computer-use" + kind: "capability" + label: "Computer Use observation, input, task UX, and takeover" + aliases: + - "CUA" + - "ccbuddy-cua" + - "Computer Use plugin" + - "computer-use" + - "desktop control" + - "get_app_state" + - "open_application" + - "open app" + - "打开应用" + - "request_access" + - "CUA permission onboarding" + - "Read app interface" + - "读取应用界面" + - "电脑控制" + - "桌面操作" + docs: + - "docs/product-capability-map-office-computer-use.md" + - "docs/cua-permission-broker/ccbuddy-cua-permission-broker.md" + - "docs/cua-get-app-state-user-title.md" + - "docs/testing/cua-e2e-case-catalog.md" + - "docs/cua/2026-08-25-cua-request-access-onboarding-spec.md" + - "docs/superpowers/specs/2026-08-23-computer-use-plugin-display-name-spec.md" + codeSeeds: + - symbol: "resolvePluginDisplayName" + file: "packages/ui/src/settings/pluginStoreListing.ts" + - symbol: "OFFICIAL_PLUGIN_DEFINITIONS" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/official-plugin-definitions.ts" + - file: "apps/ccbuddy-cli/packages/ccbuddy-cua-plugin/skills/computer-use/SKILL.md" + + - id: "capability.conversation-runtime" + kind: "capability" + label: "Conversation and session runtime" + aliases: + - "conversation" + - "chat" + - "session" + - "turn steer" + - "guide" + - "follow-up queue" + - "对话" + - "会话" + - "引导" + - "消息队列" + docs: + - "docs/conversation-protocol-declaration.md" + - "docs/conversation-product-state-space.md" + - "docs/chat/interaction-behavior.md" + - "docs/ui/chat-message-queue.md" + - "docs/architecture/message-flow.md" + - "docs/v4-refactor/17-cold-resume-runtime-activation.md" + codeSeeds: + - symbol: "ConversationV4Gateway.normalizeRuntimeEventSequence" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/v4-gateway.ts" + - symbol: "startPromptTurn" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/commands/prompt-turn.ts" + - symbol: "sendText" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/commands/handlers/session-flow.ts" + - symbol: "drainPendingInput" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/steering.ts" + invariants: + - "3.12.2: all new and cold-resumed runtimes normalize compatibility budget inputs to preflight-v1; runtime preferences never await client/configs for budgeting." + + - id: "capability.selection-side-chat" + kind: "capability" + label: "Selection side conversation and App slash shortcuts" + aliases: + - "/side" + - "/btw" + - "selection side chat" + - "辅助对话" + docs: + - "docs/ui/conversation-selection-side-chat.md" + - "docs/conversation-session-case-catalog.md" + codeSeeds: + - symbol: "handleOpenSelectionSideConversation" + file: "packages/ui/src/v4/SessionPane.tsx" + - symbol: "createSelectionSideConversation" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/session-fork.ts" + + - id: "capability.provider-retry-live-tail" + kind: "capability" + label: "Conversation provider retry live-tail presentation" + aliases: + - "apiRetry" + - "stream recovery retry status" + - "provider retry live tail" + - "模型重连状态" + - "重连次数" + docs: + - "docs/v4-composer-api-retry-status.md" + - "apps/ccbuddy-cli/docs/design/v2/model/stream-error-retry.md" + - "docs/conversation-session-case-catalog.md" + codeSeeds: + - symbol: "ChatApiRetryStatus" + file: "packages/ui/src/chat-input-toolbar/display.tsx" + - symbol: "TurnChatLoadingSlot" + file: "packages/ui/src/v4/ConversationTurnGroup.tsx" + - symbol: "ProductProjection" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/product-projection.ts" + - symbol: "ccbuddyApiRetryFromStreamRecoveryPayload" + file: "packages/shared/src/ccbuddy-api-retry-status.ts" + + - id: "capability.model-stream-recovery" + kind: "capability" + label: "Model SSE recovery from a provider-safe anchor" + aliases: + - "partial output recovery" + - "reasoning-only retry" + - "thinking stall recovery" + - "SSE 断流恢复" + - "思考阶段重试" + docs: + - "apps/ccbuddy-cli/docs/design/v2/model/stream-error-retry.md" + - "apps/ccbuddy-cli/docs/design/v2/model/streaming-tool-execution-and-recovery.md" + - "docs/testing/conversation-session-environment-fault-catalog.md" + codeSeeds: + - symbol: "recoverPartialAssistantOutputFailure" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/streaming-recovery.ts" + - symbol: "createStreamingToolCoordinator" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/streaming-tool-coordinator.ts" + + - id: "capability.model-empty-completion-retry" + kind: "capability" + label: "Model zero-output completion retry" + aliases: + - "empty model response retry" + - "zero-output completion retry" + - "空返回重试" + - "finish=other 空响应" + docs: + - "apps/ccbuddy-cli/docs/design/v2/model/stream-error-retry.md" + codeSeeds: + - symbol: "canRetryEmptyCompletion" + file: "apps/ccbuddy-cli/packages/adapters/src/model/empty-completion-retry.ts" + - symbol: "isZeroOutputModelCompletion" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-diagnostics.ts" + - symbol: "runGenerateText" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-generate.ts" + - symbol: "runStreamText" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-stream.ts" + + - id: "capability.assistant-file-preview-links" + kind: "capability" + label: "Assistant file preview cards" + aliases: + - "Assistant Preview Cards" + - "回复文件预览卡片" + docs: + - "docs/ui/assistant-preview-cards.md" + codeSeeds: + - symbol: "buildAssistantPreviewCards" + file: "packages/ui/src/lib/assistantPreviewCards.ts" + - symbol: "extractAssistantFileReferences" + file: "packages/ui/src/lib/assistantFileReferences.ts" + - symbol: "resolveMarkdownFileLink" + file: "packages/ui/src/lib/markdownFileLink.ts" + - symbol: "useAssistantPreviewCardsForAssistantTextRow" + file: "packages/ui/src/v4/useAssistantPreviewCardsForRow.ts" + - symbol: "SessionPane" + file: "packages/ui/src/v4/SessionPane.tsx" + - id: "capability.session-residency-management" + kind: "capability" + label: "CLI session resident pool and cold deactivation" + aliases: + - "session resident pool" + - "session residency" + - "session deactivation" + - "session LRU" + - "会话常驻池" + - "会话内存回收" + - "会话去激活" + docs: + - "docs/session-idle-deactivation.md" + - "apps/ccbuddy-cli/docs/design/v2/session-idle-deactivation.md" + codeSeeds: + - symbol: "SessionResidentPool" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/session-resident-pool.ts" + - symbol: "deactivateSessionRecord" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/session-residency.ts" + - symbol: "hasResidencyBlockingWork" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/residency.ts" + - symbol: "acquireSessionResidencyFinalization" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/session-residency.ts" + - symbol: "clearSession" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/command-inbox.ts" + + - id: "capability.ask-user-question-auto-resolution" + kind: "capability" + label: "AskUserQuestion auto-resolution preference" + aliases: + - "AskUserQuestion countdown" + - "ask user question auto continue" + - "提问自动继续" + - "提问自动倒计时" + docs: + - "docs/ask-user-question-auto-resolution.md" + - "docs/conversation-session-case-catalog.md" + + - id: "capability.project-memory" + kind: "capability" + label: "CLI project Memory" + aliases: + - "Memory Extraction" + - "headless Memory Extraction gate" + - "project memory" + - "持久 Memory" + docs: + - "apps/ccbuddy-cli/docs/design/v2/memory/README.md" + codeSeeds: + - symbol: "MemorySettingsSection" + file: "packages/ui/src/settings/MemorySettingsSection.tsx" + - symbol: "IMemoryService" + file: "packages/services/src/memory/memory.ts" + + - id: "capability.conversation-query-navigation" + kind: "capability" + label: "Complete conversation query navigation" + aliases: + - "conversation query navigator" + - "conversation query map" + - "turn navigator" + - "对话问题导航" + - "问题目录" + docs: + - "docs/ui/conversation-turn-navigator.md" + + - id: "capability.markdown-image-gallery" + kind: "capability" + label: "Responsive Markdown image gallery and preview" + aliases: + - "markdown images" + - "image gallery" + - "Markdown 图片" + - "图片画廊" + docs: + - "docs/ui/markdown-preview-renderers.md" + codeSeeds: + - symbol: "MarkdownImage" + file: "packages/ui/src/components/ai-elements/markdown-image.tsx" + - symbol: "normalizeConsecutiveMarkdownImageBlocks" + file: "packages/ui/src/components/ai-elements/markdown-image.tsx" + + - id: "capability.shared-image-preview" + kind: "capability" + label: "Shared conversation image gallery" + aliases: + - "BUA image preview" + - "Browser Use screenshot preview" + - "node_repl image lightbox" + - "message image thumbnails" + - "消息图片缩略图" + - "共享图片预览" + docs: + - "docs/ui/shared-image-preview-dialog.md" + codeSeeds: + - symbol: "ImagePreviewDialog" + file: "packages/ui/src/components/ai-elements/image-preview-dialog.tsx" + - symbol: "ImageThumbnailGallery" + file: "packages/ui/src/components/ai-elements/image-thumbnail-gallery.tsx" + - symbol: "NodeReplImageGrid" + file: "packages/ui/src/ToolCallBlocks/renderers/nodeReplImageGrid.tsx" + + - id: "capability.browser-screenshot-surface" + kind: "capability" + label: "Browser Use background screenshot surface" + aliases: + - "BUA background screenshot" + - "browser screenshot surface" + - "backgroundThrottling" + - "浏览器后台截图" + - "后台截图表面" + docs: + - "docs/superpowers/specs/2026-07-23-browser-background-screenshot-surface-design.md" + - "docs/superpowers/specs/2026-07-24-browser-screenshot-negative-zoom-design.md" + - "docs/browser-use/2026-07-15-browser-turn-final-screenshot-spec.md" + codeSeeds: + - symbol: "BrowserGuestManager" + file: "packages/desktop/src/main/browserView/browserGuestManager.ts" + - symbol: "DesktopBrowserScreenshotSurfaceCoordinator" + file: "packages/desktop/src/main/browserView/browserScreenshotSurfaceCoordinator.ts" + + - id: "capability.browser-webview-video-recording" + kind: "capability" + label: "Browser Use embedded WebView scenario video recording" + aliases: + - "Browser Use recording" + - "IAB video recording" + - "WebView screencast" + - "内置浏览器录屏" + - "WebView 视频录制" + docs: + - "docs/browser-use/2026-08-12-browser-webview-video-recording-spec.md" + - "docs/browser-use/2026-08-14-browser-use-plugin-version-0-3-0-spec.md" + - "docs/browser-use/browser-use-plugin-runtime-boundary.md" + codeSeeds: + - symbol: "BrowserGuestManager" + file: "packages/desktop/src/main/browserView/browserGuestManager.ts" + - symbol: "Tab" + file: "apps/ccbuddy-cli/packages/core/src/browser-client/facade.ts" + - symbol: "createBrowserControlMainBridge" + file: "packages/desktop/src/host/browserControlMainBridge.ts" + - symbol: "materializeBrowserRecordingArtifact" + file: "packages/desktop/src/host/browserRecordingArtifactMaterializer.ts" + - symbol: "recordBrowserVideo" + file: "packages/desktop/src/main/browserView/browserVideoRecorder.ts" + + - id: "capability.embedded-browser-network-policy" + kind: "capability" + label: "Desktop renderer and embedded Browser explicit proxy and custom CA policy" + aliases: + - "embedded browser custom CA" + - "embedded browser proxy" + - "self-signed certificate in Browser" + - "内置浏览器自签名证书" + - "内置浏览器代理" + docs: + - "apps/ccbuddy-cli/docs/design/v2/model/http-proxy.md" + - "docs/testing/browser-use-codex-parity-coverage-matrix.md" + codeSeeds: + - symbol: "applyDesktopChromiumNetworkPolicies" + file: "packages/desktop/src/main/desktopNetworkPolicy.ts" + - symbol: "EMBEDDED_BROWSER_PARTITION" + file: "packages/desktop/src/main/browserDataManager.ts" + - symbol: "BrowserViewportSurface" + file: "packages/ui/src/browser-use/BrowserViewportSurface.tsx" + + - id: "capability.host-api-network-policy" + kind: "capability" + label: "Window Host app-managed API explicit proxy, No Proxy, and custom CA policy" + aliases: + - "Host API proxy" + - "Host network egress" + - "Host OAuth proxy" + - "Host 外部 API 代理" + - "Host 网络出口" + docs: + - "docs/superpowers/specs/2026-08-25-host-api-proxy-design.md" + - "docs/architecture/external-api-client.md" + - "apps/ccbuddy-cli/docs/design/v2/model/http-proxy.md" + codeSeeds: + - symbol: "NodeApiClient" + file: "packages/services/src/providers/api/nodeApiClient.ts" + - symbol: "createLocalServices" + file: "packages/services/src/node.ts" + - symbol: "createRemoteWorkspaceServiceCollection" + file: "packages/desktop/src/host/remoteWorkspaceServiceCollection.ts" + invariants: + - "AppSettings is the only Host app-managed proxy, No Proxy, and custom CA authority; ambient shell proxy and CA variables remain sanitized." + - "The first phase injects a request-scoped transport into NodeApiClient and never installs a process-global dispatcher." + - "Desktop-attached remote app-global services use the desktop Host policy; server remote services retain server authority." + - "Conversation delivery, workspace identity, Agent/CLI, Electron Session, Bot, telemetry, object-upload, WebSocket, SSH, and RPC behavior remain unchanged." + + - id: "capability.embedded-browser-responsive-viewport" + kind: "capability" + label: "Embedded browser free-size responsive viewport" + aliases: + - "browser free mode" + - "responsive browser viewport" + - "自由尺寸" + - "内置浏览器自由模式" + - "浏览器显示偏好" + - "恢复上次浏览器尺寸" + docs: + - "docs/browser-use/2026-07-15-responsive-browser-viewport-spec.md" + - "docs/testing/browser-use-codex-parity-coverage-matrix.md" + codeSeeds: + - symbol: "ResponsiveBrowserViewport" + file: "packages/ui/src/browser-use/ResponsiveBrowserViewport.tsx" + - symbol: "ResponsiveBrowserResizeHandles" + file: "packages/ui/src/browser-use/ResponsiveBrowserResizeHandles.tsx" + - symbol: "useResponsiveBrowserViewportControl" + file: "packages/ui/src/browser-use/useResponsiveBrowserViewportControl.ts" + + - id: "capability.browser-tab-residency" + kind: "capability" + label: "Desktop embedded Browser 32-tab hard limit and process-local lifetime" + aliases: + - "browser tab hard limit" + - "logical tab limit" + - "browser tab limit" + - "browser tabs cleared on restart" + - "Browser 标签上限" + - "浏览器逻辑 Tab 上限" + - "内置浏览器 Tab 上限" + - "重启清空浏览器 Tab" + - "Browser Guest route residency" + - "自动化页后台 Guest" + docs: + - "docs/browser-use/2026-07-31-browser-tab-residency-budget-spec.md" + - "docs/browser-use/2026-07-12-browser-tab-process-lifetime-spec.md" + - "docs/browser-use/2026-07-14-browser-tab-conversation-isolation-spec.md" + - "docs/browser-use/2026-08-25-browser-guest-route-residency-spec.md" + codeSeeds: + - symbol: "BrowserGuestManager" + file: "packages/desktop/src/main/browserView/browserGuestManager.ts" + - symbol: "AnimatedSidePanePanel" + file: "packages/ui/src/app-shell/AnimatedSidePanePanel.tsx" + - symbol: "WorkspaceShellLayout" + file: "packages/ui/src/app-shell/WorkspaceShellLayout.tsx" + + - id: "capability.office-file-preview" + kind: "capability" + label: "Office file preview" + aliases: + - "DOCX preview" + - "Word preview" + - "file preview" + - "DOCX 预览" + - "Office 文件预览" + docs: + - "docs/ui/office-file-preview.md" + codeSeeds: + - symbol: "getOfficeFilePreviewKind" + file: "packages/ui/src/lib/officeFilePreview.ts" + - symbol: "installDocumentLinkSafety" + file: "packages/ui/src/lib/officeFilePreview.ts" + - symbol: "PreviewPaneOfficeContent" + file: "packages/ui/src/previewPaneOfficeContent.tsx" + - symbol: "PdfViewer" + file: "packages/ui/src/components/ui/pdf-viewer.tsx" + + - id: "capability.mcp-async-tool-catalog" + kind: "capability" + label: "MCP asynchronous tool catalog advertisement" + aliases: + - "MCP async initialization" + - "MCP tool catalog cache" + - "MCP warm startup" + - "MCP 异步初始化" + - "MCP 工具目录缓存" + docs: + - "docs/mcp-async-tool-catalog-cache.md" + - "docs/mcp-platform-boundary.md" + - "docs/runtime-tools/mcp-status-list-control-plane.md" + codeSeeds: + - symbol: "startMcpStartup" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/mcp.ts" + - symbol: "registerMcpTools" + file: "apps/ccbuddy-cli/packages/core/src/mcp/index.ts" + + - id: "capability.mcp-dual-era-version-negotiation" + kind: "capability" + label: "MCP dual-era client version negotiation" + aliases: + - "MCP auto negotiation" + - "MCP server/discover fallback" + - "MCP legacy and modern compatibility" + - "MCP 双版本兼容" + - "MCP 自动协商" + docs: + - "docs/mcp-dual-era-version-negotiation.md" + - "docs/mcp-platform-boundary.md" + codeSeeds: + - symbol: "NodeMcpAdapter" + file: "apps/ccbuddy-cli/packages/adapters/src/mcp/index.ts" + - symbol: "resolveVersionNegotiationMode" + file: "apps/ccbuddy-cli/packages/adapters/src/mcp/index.ts" + - symbol: "ProcessTreeStdioClientTransport" + file: "apps/ccbuddy-cli/packages/adapters/src/mcp/stdio-transport.ts" + + - id: "capability.stateless-browser-use-mcp" + kind: "capability" + label: "MCP 2026-07-28 stateless node_repl Browser Use" + aliases: + - "stateless browser use" + - "shared node_repl MCP" + - "stateless node repl" + - "Browser Use 无状态" + - "MCP 2026-07-28" + docs: + - "docs/mcp-stateless-node-repl.md" + - "docs/browser-use/2026-07-28-stateless-browser-use-mcp-spec.md" + - "docs/browser-use/browser-use-plugin-runtime-boundary.md" + codeSeeds: + - symbol: "createNodeReplMcpRuntime" + file: "apps/ccbuddy-cli/packages/node-repl-host/src/server.ts" + - symbol: "createNodeReplBrowserBroker" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/node-repl-browser-broker.ts" + - file: "apps/ccbuddy-cli/packages/node-repl-host/src/tool-contract.ts" + - file: "apps/ccbuddy-cli/packages/browser-use-plugin/skills/control-browser/SKILL.md" + - file: "apps/ccbuddy-cli/packages/contracts/src/tools/node-repl.ts" + + - id: "capability.automations" + kind: "capability" + label: "Scheduled automations" + aliases: + - "automation" + - "scheduled task" + - "cron" + - "自动化" + - "定时任务" + docs: + - "docs/ui/scheduled-tasks-main-view.md" + - "docs/automation-edit-status.md" + - "docs/testing/automation-workspace-selection-boundary.md" + + - id: "capability.off-peak-telemetry" + kind: "capability" + label: "Off-Peak creation, upgrade, and automatic-turn telemetry" + aliases: + - "off_peak_task_create_result" + - "off_peak_task_id" + - "session_idle_time" + - "coding_plan_upgrade_ck" + - "闲时任务埋点" + - "闲时任务升级埋点" + docs: + - "docs/monitoring/off-peak-task-telemetry-v1.md" + - "docs/off-peak-task/spec.md" + - "docs/coding-plan-purchase-funnel-telemetry.md" + + - id: "capability.off-peak-model-execution" + kind: "capability" + label: "Off-Peak model execution" + aliases: + - "idle model" + - "idle plan model" + - "turnRuntimeModel" + - "executionOnly" + - "闲时模型" + - "闲时任务模型执行" + docs: + - "docs/working-memory/provider-refactor/steps/04-model-execution-cutover.md" + - "docs/working-memory/provider-refactor/design/execution/execution.md" + - "docs/working-memory/provider-refactor/design/registry/model-creation.md" + - "docs/working-memory/provider-refactor/design/registry/ccbuddy-builtin-provider-config.md" + - "docs/off-peak-task/spec.md" + codeSeeds: + - symbol: "buildOffPeakRequestAuth" + file: "packages/services/src/session/offPeakRuntimeModel.ts" + - symbol: "dispatchOffPeakRun" + file: "packages/desktop/src/host/index.ts" + - symbol: "sessionFlowHandlers" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/commands/handlers/session-flow.ts" + - symbol: "applySubmissionExecutionState" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/turn-model.ts" + - symbol: "ApiProviderModelRuntime" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/provider-registry-model-runtime.ts" + invariants: + - "Z.ai and BigModel each own one complete hidden Off-Peak Built-in Provider in the ordinary Registry. Account connection enables only the current family; neither Provider changes family at execution time, and visibility filters only Provider Settings and Model Selection." + - "3.12.2: supported local hosts advertise OffPeak tools without reading client/configs; OffPeakCreate validates gray configuration, plan and model in the Host handler before ticket/task creation. Page visibility and remote/subagent restrictions stay separate." + - "Off-Peak submissions use one standard ModelSelection and the ordinary ModelFactory; request auth, ticket, attribution, and child override are narrow execution context rather than a second model config." + - "An idle turn never writes or restores App Recent, Configured Default, or Session Selection, and never enters the ordinary busy queue." + - "Todo104 storage refinement: editing migrated Off-Peak tasks updates model_selection without clearing or back-writing the published model/thought_level columns; those columns remain rollback snapshots, not a second execution selection. New records need not synthesize legacy values." + - "Permission approval or denial continues the same automatic turn on the idle model; no provider handoff occurs." + - "Foreground children create their own Model from the idle override and request auth; background children are rejected before a model request." + + - id: "capability.official-server-mcp" + kind: "capability" + label: "Official Server MCP authentication, quota, and unavailable banner" + aliases: + - "official MCP" + - "Server MCP" + - "CCbuddy MCP quota" + - "官方 MCP" + - "官方 MCP 额度" + docs: + - "docs/coding-plan/ccbuddy-official-server-mcp-auth-spec.md" + - "docs/coding-plan/ccbuddy-official-server-mcp-quota-banner-spec.md" + codeSeeds: + - symbol: "resolveOfficialMcpCredentials" + file: "packages/services/src/official-mcp/officialMcpCredentials.ts" + + - id: "capability.mcp-settings-diagnostics" + kind: "capability" + label: "MCP Settings localized diagnostics and Plugin ownership grouping" + aliases: + - "MCP Settings errors" + - "MCP Plugin grouping" + - "MCP 设置页错误" + - "MCP 插件分组" + docs: + - "docs/settings-mcp-list.md" + - "docs/plugin-capabilities-settings.md" + - "docs/runtime-tools/mcp-status-list-control-plane.md" + codeSeeds: + - symbol: "McpSettingsSection" + file: "packages/ui/src/settings/McpSettingsSection.tsx" + - symbol: "mergeMcpServerStatusSnapshots" + file: "packages/ui/src/store/mcpStoreStatusList.ts" + - symbol: "listMcpServers" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/mcp.ts" + - symbol: "fetchMcpQuotaSnapshot" + file: "packages/services/src/usage-stats/providers/ccbuddyMcpQuotaProvider.ts" + - symbol: "useV4SessionQuotaBanner" + file: "packages/ui/src/v4/useV4SessionQuotaBanner.ts" + + - id: "capability.subagents" + kind: "capability" + label: "Subagents" + aliases: + - "subagent" + - "agent profile" + - "子代理" + - "智能体配置" + docs: + - "docs/subagents-built-in-model-overrides.md" + - "docs/subagent-session-side-tabs.md" + - "docs/working-memory/provider-refactor/steps/todo-97-subagent-markdown-in-place-migration-and-legacy-read-audit.md" + - "docs/working-memory/provider-refactor/design/execution/execution.md" + - "docs/working-memory/provider-refactor/steps/04-model-execution-cutover.md" + - "docs/superpowers/plans/2026-07-06-subagent-permission-delegation.md" + codeSeeds: + - symbol: "AgentInputSchema" + file: "apps/ccbuddy-cli/packages/contracts/src/tools/agent.ts" + - symbol: "agentHandler" + file: "apps/ccbuddy-cli/packages/core/src/tool/handlers/agent.ts" + - symbol: "createExploreSubagentPort" + file: "apps/ccbuddy-cli/packages/core/src/subagent/runner.ts" + - symbol: "migrateUserSubagentMarkdown" + file: "packages/shared/src/node/subagentMarkdownMigration.ts" + - symbol: "parseSubagentMarkdownSelection" + file: "packages/shared/src/subagent-markdown-selection.ts" + invariants: + - "Host and standalone Agent await offline migration of user-directory Markdown and builtin state before formal reads. Markdown keeps model/thoughtLevel; intermediate modelSelection is not consumed. Only user Markdown provider values are rewritten, preserving unrelated bytes; project/plugin files and symlinks are excluded. JSON uses builtInModelSelectionOverrides after one-way import. Ordinary readers do not remap legacy identities or fall back to old fields. Explicit execution still validates its concrete selection; Host effective-selection protocol remains a separate Todo96 decision." + + - id: "capability.provider-registry" + kind: "capability" + label: "Model provider registry" + aliases: + - "provider" + - "custom provider" + - "provider registry" + - "CCbuddy Built-in Provider Config" + - "Account Provider Config" + - "Account Built-in Provider Config" + - "Effective Built-in Provider Config" + - "Provider Template" + - "Personal Provider Config" + - "Effective Provider Config" + - "模型供应商" + - "自定义 provider" + docs: + - "docs/working-memory/provider-refactor/steps/03-staging-integration.md" + - "docs/working-memory/provider-refactor/design/design.md" + - "docs/working-memory/provider-refactor/design/registry/configuration.md" + - "docs/working-memory/provider-refactor/design/registry/registry.md" + - "docs/working-memory/provider-refactor/design/registry/model-membership-and-enablement.md" + - "docs/working-memory/provider-refactor/design/registry/model-creation.md" + - "docs/working-memory/provider-refactor/steps/04-model-execution-cutover.md" + - "docs/working-memory/provider-refactor/steps/todo-03-provider-model-ownership-and-property-totality.md" + - "docs/working-memory/provider-refactor/research/model-abstraction-unification-cleanup-audit.md" + - "docs/working-memory/provider-refactor/steps/todo-00-model-abstraction-unification-roadmap.md" + - "docs/working-memory/provider-refactor/steps/todo-01-core-model-adapter-boundary-cleanup.md" + - "docs/working-memory/provider-refactor/steps/todo-02-ai-sdk-execution-registry-retirement.md" + - "docs/working-memory/provider-refactor/steps/todo-04-core-model-connection-port-retirement.md" + - "docs/working-memory/provider-refactor/steps/todo-05-model-ref-retirement.md" + - "docs/working-memory/provider-refactor/steps/todo-07-account-connection-selection-and-access-context-cutover.md" + - "docs/working-memory/provider-refactor/steps/todo-10-ccbuddy-builtin-provider-config-naming-cutover.md" + - "docs/working-memory/provider-refactor/steps/todo-12-model-selection-validation-boundary-cutover.md" + - "docs/working-memory/provider-refactor/steps/todo-13-target-host-model-selection-authority.md" + - "docs/working-memory/provider-refactor/steps/todo-20-account-overlay-atomicity-and-review-closeout.md" + - "docs/working-memory/provider-refactor/steps/todo-21-ccbuddy-builtin-config-ownership-and-model-activation-order.md" + - "docs/working-memory/provider-refactor/steps/todo-32-team-plan-settings-effective-provider-boundary.md" + - "docs/working-memory/provider-refactor/steps/todo-51-provider-access-consumer-and-offpeak-auth-closeout.md" + - "docs/working-memory/provider-refactor/steps/todo-55-provider-template-inheritance-cutover.md" + - "docs/model-provider-presets.md" + - "docs/model-provider-config-overrides.md" + - "docs/model-provider-catalog-metadata.md" + codeSeeds: + - file: "packages/provider/src/index.ts" + - symbol: "ProviderConfigResolver" + file: "packages/provider/src/resolver.ts" + - symbol: "ProviderTemplateMap" + file: "packages/provider/src/config/provider-config.ts" + - symbol: "AccountProviderService" + file: "packages/provider/src/account-provider-service.ts" + - symbol: "ApiProviderModelRuntime" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/provider-registry-model-runtime.ts" + - symbol: "RuntimeModelFactory" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/provider-registry-model-runtime.ts" + - symbol: "ApiProviderModelRuntime" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/provider-registry-model-runtime.ts" + invariants: + - "Model input/output format facts use the same properties.input_format/output_format shape in Config, Model, Runtime, and protocol; no parallel media capability DTO is authoritative." + - "Provider/Model Config overlays and Personal updates may be sparse; after resolve, validateComplete supplies diagnostics and Provider/Model requireComplete boundaries are the only path into Registry, whose configs and properties are statically complete." + - "Concrete Providers resolve from an optional Provider Template baseline followed by Built-in Concrete Provider, Account Config when applicable, and Personal Config; Personal remains the final user override." + - "Account Config is derived only for concrete Built-in Account Providers and does not inspect or constrain Personal-only Providers." + - "Provider Config has no top-level enabled field. A Personal Provider exists in Settings when its Personal definition exists; an Account Provider has fixed Family placement, while zhipu-account access.entitled expresses account eligibility. Registry admission still requires complete Effective Provider Config and an enabled, complete Model." + - "Every Account snapshot declares basedOnCCbuddyBuiltinRevision; Registry publishes only a matching Built-in/Account pair, retains the prior complete Registry while Account recomputes, and never blocks Personal-only updates on Account refresh." + - "CCbuddy Built-in Active/LKG and refresh control are physically isolated by normalized CCbuddy control-plane Endpoint under platform/appVersion; revisions and fallbacks never cross Endpoint directories." + - "Provider startup requires a valid trusted Bundled baseline, not every auxiliary source: disposable Active/LKG and Configured Default failures fall back, invalid Personal config is preserved for recovery then replaced by an empty in-memory or persisted overlay, and first-load Account resolution failure publishes a matching entitled=false overlay. Only an invalid Bundled baseline or an internal Resolver/Registry invariant failure blocks startup." + - "Personal Config cross-process observation uses one asynchronous content-revision polling loop rather than fs.watch; same-process saves publish immediately, other processes self-heal within one interval, and provider connectivity explicitly refreshes the Worker Registry before lookup without creating a Host-side Model path." + - "Normal Built-in and Account Built-in assembly maintains builtinModelIds while Personal settings maintains modelIds; strict source schemas reject fields outside each source boundary before all inputs enter the shared Provider/Model overlay types." + - "Model Config enabled is the only per-model execution gate. Built-in general rules provide the complete default, more specific Built-in rules may default-disable retired models, and later Personal provider-model rules express user overrides. Settings retains disabled members for editing and re-enabling, while Registry, selection candidates, defaults, fallbacks, exact ModelFactory creation, tests, and internal tasks reject them. Existing Active Models are not interrupted by a later config refresh." + - "Model Config has no visibility field. Provider visibility is the only user-facing visibility boundary; hidden complete Providers keep enabled models in the ordinary Registry for exact internal creation but are absent from Settings and Selection facades." + - "Personal Repository presence is the only authority for whether a normal Provider has been added: standard-builtin overlays are created only by addBuiltinProvider, standard-personal providers only by createPersonalProvider, and ordinary save updates existing overlays without reviving deletion; fixed Z.ai/BigModel Family providers may materialize their first sparse Personal overlay through Family settings." + - "At the inventory boundary, missing or null collections normalize to empty, Built-in membership wins a cross-source duplicate, and repeated ids within one array retain the first occurrence. Resolver ignores later duplicates deterministically and Settings normalizes Provider-owned arrays on save; no conflict DTO or suspended second identity is created." + - "Provider modelOrder and Personal top-level providerOrder own user sorting. The shared owned-order algorithm yields unmentioned Built-in + requested valid members + unmentioned Personal; Family Providers remain outside the sortable standard segment. Settings, Registry, and Selection preserve that inventory and filter it without secondary sorting." + - "Provider group is explicit at root declarations, immutable through Account/Personal overlays, and complete in Effective Provider, Registry, and Settings DTOs; it replaces an additional builtin boolean, and Renderer never infers grouping from ids, preset lists, or Personal map membership." + - "Effective Model Rules resolve against Effective Provider Config and are composed as CCbuddy Built-in rules + Personal Match rules + Personal provider-model rules; each group preserves internal order and Personal exact rules always apply last." + - "CCbuddy Built-in Model Rules use physical authoring order rather than a priority mechanism: complete baseline, Model Match, Model + API Match, Model + API + Endpoint Match, Provider-scoped Match for service facts that apply to all current/future members, then narrow Provider-Model Exact Rules; Resolver preserves that Built-in order without dynamic specificity sorting." + - "Z.ai/BigModel Start, Individual, and Team Plan Providers expose Image/Video input for every member because the plan service performs visual-to-text processing before the model API; this is a Provider-scoped Built-in Model Rule and never changes the native capability of ordinary Account API models. Individual and Team static membership is ordered GLM-5.3, GLM-5.3-Flash, GLM-5.2, GLM-5-Turbo, while Start membership remains Account-returned." + - "Both Built-in and Personal Model Rule sources may use structured provider-model rules for an exact providerId/modelId target or match rules for a target set. Built-in exact rules are release-owned; only Personal exact rules follow Settings rename/delete lifecycle. Match rules are never guessed, renamed, or deleted by Provider/Model lifecycle operations." + - "The Provider Config chain uses ccbuddyBuiltin/ccbuddy-builtin naming across domain APIs, source paths, process fields, environment variables, and packaged assets; the unshipped official naming has no alias, fallback, importer, or dual-read compatibility, while unrelated Official MCP/Plugin/CUA concepts retain their own terminology." + - "Account-type Provider Config does not manage account credentials; Services resolve them at request time and the server makes the final authorization decision." + - "Account Connection owns current-account facts. Built-in Provider Config owns zhipu-account family/mode; Account Built-in Provider Config projects only entitled and account-specific model membership, while account identity, Coding Plan project keys, Team scope, JWT, and other dynamic credentials stay inside request-time Services." + - "Start Plan, Individual Coding Plan, Team Coding Plan, and Off-Peak are separate fixed-kind Built-in Providers with enabled=true. Account Built-in overlay marks the compatible current connection entitled without rewriting Provider enabled, and Resolver admits only enabled, entitled, complete Providers to Registry." + - "Welcome manual API-key setup locates the fixed zai-api or bigmodel-api Built-in Provider and saves only a sparse Personal Provider Overlay. It does not create a custom Provider, copy Built-in endpoint/schema/models, enter Account Request Auth, or mutate an existing explicit Family Connection Selection." + - "Off-Peak request auth combines CCbuddy JWT, the compatible Coding Plan project key, and the Off-Peak ticket through one Registry-backed host-private credential resolver. Desktop Host dispatch does not scan Provider Settings or independently infer the current account Provider." + - "Five strict input schemas enforce CCbuddy Built-in Provider, Account Provider, Personal Provider, CCbuddy Built-in Model Rule, and Personal Model Rule field ownership before common overlay and completeness validation. UI visibility remains a separate presentation decision." + - "Provider Access owns challenge, requestSigning, and executionProtocol product protocols; Model Config and Runtime do not infer Captcha, V4 signing, or Off-Peak behavior from model/provider ids." + - "A request-auth Provider receives dynamic credentials per request and fails before network I/O when they are absent." + - "RuntimeModelFactoryInput cannot override Registry-owned context, properties, or provider options; execution-scoped MCS force is consumed where Provider messages are projected, including Full Compact, and never becomes Model Config or a ModelFactory capability input." + - "Published Legacy Provider store shapes may be parsed only by importer-private Services types and helpers; they are not Shared, Protocol, UI, Registry, Runtime, or test-fixture contracts." + - "The unversioned Legacy CLI importer migrates only explicitly represented facts without capability guesses; after the forced-upgrade compatibility window it and its legacy parser dependencies are removed, while normal schemaVersion migrations remain." + - "Core uses ModelSelection for future intent and Model for active execution; it does not call a model Adapter or query a physical Provider Connection." + - "The business Provider Registry is the only Provider/Model fact registry; Adapter execution projections and caches are one-way private implementation details." + - "Model identity does not carry reasoning options; do not introduce a general ModelIdentity while ModelSelection, Model, or local event fields already express the required semantics." + - "reasoningLevel.values is ordered from the lowest to the highest public level; default remains the ordinary request default, while explicitly low-cost auxiliary calls, including Provider connectivity, uniformly select values[0] without guessing disabled aliases." + + - id: "capability.provider-endpoint-routing" + kind: "capability" + label: "CCbuddy CLI provider endpoint routing" + aliases: + - "provider endpoint routing" + - "proxy endpoint mapping" + - "agent configs proxy" + - "模型流量转发" + - "动态端点转发" + - "静态网关" + docs: + - "apps/ccbuddy-cli/docs/design/v2/model/provider-endpoint-routing.md" + - "apps/ccbuddy-cli/docs/design/v2/model/http-proxy.md" + + - id: "capability.model-request-session-type-attribution" + kind: "capability" + label: "Model request session type attribution header" + aliases: + - "x-ccbuddy-session-type" + - "model request session type" + - "模型请求 session 分类" + - "主会话子代理请求归因" + docs: + - "docs/superpowers/specs/2026-06-09-agent-model-request-session-header-design.md" + - "apps/ccbuddy-cli/docs/design/v2/model/README.md" + codeSeeds: + - symbol: "ModelRequestSessionType" + file: "apps/ccbuddy-cli/packages/contracts/src/model/index.ts" + - symbol: "resolveModelRequestSessionTypeFromTaskType" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/model-request-session-type.ts" + - symbol: "createModelRequestAttributionHeaders" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-status.ts" + + - id: "capability.anthropic-request-metadata" + kind: "capability" + label: "Anthropic request attribution metadata" + aliases: + - "Anthropic metadata" + - "metadata.user_id" + - "Anthropic device id" + - "Anthropic 请求归因" + - "模型请求设备 ID" + docs: + - "docs/anthropic-request-metadata.md" + + - id: "capability.anthropic-reasoning-history-replay" + kind: "capability" + label: "Anthropic reasoning history replay and signature repair" + aliases: + - "thinking signature replay" + - "reasoning history normalization" + - "signature repair retry" + - "Anthropic 推理历史回放" + - "thinking 签名修复" + docs: + - "apps/ccbuddy-cli/docs/design/v2/model/anthropic-reasoning-history-replay.md" + + - id: "capability.model-reasoning-request-projection" + kind: "capability" + label: "Provider-visible reasoning history projection" + aliases: + - "empty reasoning stub" + - "reasoning_content replay" + - "reasoning request projection" + - "空 reasoning 请求投影" + docs: + - "apps/ccbuddy-cli/docs/design/v2/model/README.md" + - "apps/ccbuddy-cli/docs/design/v2/model/anthropic-reasoning-history-replay.md" + + - id: "capability.oauth-login-attribution" + kind: "capability" + label: "OAuth login marketing attribution" + aliases: + - "OAuth attribution" + - "marketing attribution" + - "OAuth 归因" + - "登录归因" + docs: + - "docs/oauth/app-marketing-attribution.md" + + - id: "capability.remote-delivery" + kind: "capability" + label: "Web remote realtime delivery" + aliases: + - "mobile remote" + - "replayable" + - "remote control" + - "手机远控" + - "重连恢复" + docs: + - "docs/web-remote-control/web-remote-control-architecture.md" + - "docs/web-remote-control/task-realtime-sync.md" + - "docs/web-remote-control-task-command-queue.md" + + - id: "capability.workspace-identity" + kind: "capability" + label: "Workspace identity and remote runtime isolation" + aliases: + - "workspace identity" + - "remote workspace" + - "SSH" + - "WSL" + - "Docker" + - "工作区隔离" + docs: + - "docs/remote-workspace-session-unified-settings.md" + - "docs/ssh-remote-app-global-state-authority.md" + - "docs/v4-refactor/14-sessions-index.md" + + - id: "capability.remote-provider-provisioning" + kind: "capability" + label: "Remote Environment Provider Provisioning v0" + aliases: + - "provider provisioning" + - "remote provider sync" + - "Environment provider sync" + - "远程 Provider 配置同步" + - "远程环境模型配置镜像" + docs: + - "docs/remote/provider-provisioning.md" + - "docs/remote-workspace-session-unified-settings.md" + - "docs/working-memory/provider-refactor/steps/todo-56-remote-provider-provisioning-environment-sync.md" + codeSeeds: + - symbol: "ProviderProvisioningEnvironmentCoordinator" + file: "packages/desktop/src/main/providerProvisioningEnvironmentCoordinator.ts" + - symbol: "createProviderProvisioningSource" + file: "packages/services/src/model-provider/providerProvisioningSource.ts" + - symbol: "createProviderProvisioningTarget" + file: "packages/services/src/model-provider/providerProvisioningTarget.ts" + invariants: + - "The Local Environment is the v0 authority; each online Remote Environment receives a replace-style execution mirror, while Built-in Release and already-created Active Models are unchanged." + - "Provisioning is deduplicated by Remote Environment rather than Workspace, window, workspacePath, workspaceIdentity, or remoteSessionId; one lane provides single-flight plus a latest-state trailing refresh." + - "Desktop Main coordinates only Environment identity, trigger, generation, and correlation metadata. The selected Local Host reads Config and allowlisted credentials and sends the envelope to the Remote Target; Main never receives Config or Secret values." + - "Desktop continuous and Web remote replayable session-delivery semantics are invariant under Provider Provisioning." + + - id: "capability.remote-file-actions" + kind: "capability" + label: "Remote workspace file actions in local applications" + aliases: + - "WSL Explorer" + - "remote open in editor" + - "远程文件打开" + - "在资源管理器中打开" + docs: + - "docs/wsl-open-in-editor.md" + + - id: "capability.workspace-file-tree" + kind: "capability" + label: "Workspace file tree navigation" + aliases: + - "file tree" + - "compact folders" + - "sticky folders" + - "文件树" + - "目录吸顶" + docs: + - "docs/ui/workspace-file-tree.md" + - "docs/testing/workspace-file-tree-e2e-coverage.md" + + - id: "surface.workspace-file-tree-panel" + kind: "ui-surface" + label: "Workspace file tree panel" + codeSeeds: + - symbol: "WorkspaceFileTree" + file: "packages/ui/src/workspace-file-tree/WorkspaceFileTree.tsx" + - symbol: "WorkspaceFileTreeRowView" + file: "packages/ui/src/workspace-file-tree/WorkspaceFileTreeRowView.tsx" + - symbol: "WorkspaceFileTreeStickyFolders" + file: "packages/ui/src/workspace-file-tree/WorkspaceFileTreeStickyFolders.tsx" + + - id: "state.workspace-file-tree-projection" + kind: "state-owner" + label: "Workspace file tree lazy-load and flattened row projection" + codeSeeds: + - symbol: "useWorkspaceFileTreeData" + file: "packages/ui/src/workspace-file-tree/useWorkspaceFileTreeData.ts" + - symbol: "flattenWorkspaceFileTreeRows" + file: "packages/ui/src/workspace-file-tree/model.ts" + + - id: "evidence.workspace-file-tree-e2e" + kind: "evidence" + label: "Workspace file tree E2E coverage" + docs: + - "docs/testing/workspace-file-tree-e2e-coverage.md" + + - id: "capability.prompt-attachment-materialization" + kind: "capability" + label: "Prompt attachment materialization" + aliases: + - "prompt attachment" + - "attachment staging" + - "WSL attachment" + - "附件物化" + - "附件预传" + - "图片派生路径" + - "媒体派生路径" + docs: + - "docs/remote-prompt-attachment-materialization.md" + - "docs/conversation-session-case-catalog.md" + - "apps/ccbuddy-cli/docs/design/v2/message-attachments.md" + - "docs/ui/chat-file-attachments.md" + codeSeeds: + - symbol: "NodeToolArtifactStore.ensureMediaAttachmentPath" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/index.ts" + - symbol: "projectMessagesWithMediaAttachmentPaths" + file: "apps/ccbuddy-cli/packages/core/src/runtime/helpers/media-attachment-path.ts" + + - id: "capability.video-input" + kind: "capability" + label: "Video input" + aliases: + - "video attachment" + - "video Read" + - "视频输入" + - "视频附件" + docs: + - "docs/plans/2026-08-17-video-input-support-plan.md" + - "apps/ccbuddy-cli/docs/design/v2/message-attachments.md" + - "apps/ccbuddy-cli/docs/design/v2/tool/01-read.md" + codeSeeds: + - symbol: "ModelVideoContentBlock" + file: "apps/ccbuddy-cli/packages/contracts/src/model/index.ts" + - symbol: "resolveTurnAttachments" + file: "apps/ccbuddy-cli/packages/core/src/runtime/helpers/attachments.ts" + - symbol: "readVideoFile" + file: "apps/ccbuddy-cli/packages/core/src/tool/handlers/read-video.ts" + - symbol: "toAiSdkMessages" + file: "apps/ccbuddy-cli/packages/adapters/src/model/transform.ts" + + - id: "capability.task-persistence" + kind: "capability" + label: "Task persistence, index, and snapshots" + aliases: + - "task index" + - "snapshot" + - "restore" + - "任务持久化" + - "任务恢复" + docs: + - "docs/task/task-sqlite-index.md" + - "docs/task/task-snapshot-on-demand.md" + - "docs/working-memory/provider-refactor/steps/todo-109-database-migration-consolidation-and-rollback-readability.md" + - "docs/desktop/database-migration-startup-gate-plan.md" + + - id: "capability.desktop-app-shutdown" + kind: "capability" + label: "Desktop app shutdown and update-install handoff" + aliases: + - "app quit" + - "Windows shutdown" + - "quitAndInstall" + - "应用退出" + - "更新安装退出" + docs: + - "docs/desktop/agent-shutdown-latency.md" + - "docs/desktop/windows-update-install-handoff.md" + + - id: "capability.desktop-startup-critical-path" + kind: "capability" + label: "Desktop Local Host and active-workspace startup critical path" + aliases: + - "desktop startup performance" + - "runtime env prewarm" + - "active-first tab restore" + - "桌面启动性能" + - "环境预热" + - "活动工作区优先恢复" + - "数据库迁移启动 loading" + - "大库升级等待" + - "主界面前统一准备数据库" + - "迁移空间不足提示" + docs: + - "docs/desktop/startup-critical-path.md" + - "docs/desktop/database-migration-startup-gate-plan.md" + - "docs/desktop/database-startup-plan-review.md" + - "docs/working-memory/provider-refactor/steps/todo-145-global-database-startup-loading.md" + codeSeeds: + - symbol: "prepareRuntimeProcessEnvPatch" + file: "packages/services/src/runtime-tools/runtimeCommandEnv.ts" + - symbol: "createWindow" + file: "packages/desktop/src/main/desktopWindowLifecycle.ts" + - symbol: "useTabPersistence" + file: "packages/ui/src/hooks/useTabPersistence.ts" + - symbol: "RootStartupLoading" + file: "packages/ui/src/root/RootStartupLoading.tsx" + - symbol: "runSqliteSessionMigrations" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/session-store/migration-runner.ts" + - file: "packages/desktop/src/renderer/src/main.tsx" + - file: "packages/desktop/src/host/index.ts" + - symbol: "TaskIndexRepo" + file: "packages/services/src/session/taskIndexRepo.ts" + - symbol: "SqliteSessionMigrationError" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/session-store/errors.ts" + - symbol: "dispatchFinalArmsCustomEvent" + file: "packages/desktop/src/main/desktopArmsCustomEvent.ts" + invariants: + - "Todo145 planned: global database preparation precedes business Root and background admission; includes Host tasks-index initialization and session storage, preserves frozen migration SQL/checksums and SQLite authority. Current workspace-driven loading does not satisfy the planned contract." + - "Todo145 planned: structured storage-full errors drive UI and telemetry; periodic statfs aggregates observed available-space decline, never claims exclusive migration disk usage. Telemetry failure must not gate application readiness." + + - id: "state.desktop-runtime-process-env" + kind: "state-owner" + label: "Per-window bounded runtime process environment patch" + codeSeeds: + - symbol: "buildRuntimeProcessEnvPatch" + file: "packages/services/src/runtime-tools/runtimeCommandEnv.ts" + - symbol: "initializeRuntimeProcessEnv" + file: "packages/services/src/runtime-tools/runtimeCommandEnv.ts" + + - id: "state.desktop-tab-restore-projection" + kind: "state-owner" + label: "Renderer-local pending, active-ready, and complete tab restore projection" + codeSeeds: + - symbol: "useTabPersistence" + file: "packages/ui/src/hooks/useTabPersistence.ts" + - symbol: "completeTabRestore" + file: "packages/ui/src/store/tabStore.ts" + + - id: "service.desktop-local-host-startup" + kind: "service" + label: "Desktop per-window Local Host startup gate" + codeSeeds: + - symbol: "createWindow" + file: "packages/desktop/src/main/desktopWindowLifecycle.ts" + - symbol: "spawnHostProcess" + file: "packages/desktop/src/main/desktopHostProcess.ts" + + - id: "evidence.desktop-startup-critical-path-tests" + kind: "evidence" + label: "Desktop runtime env, Host deadline, and tab restore tests" + codeSeeds: + - file: "packages/services/test/runtimeCommandEnv.test.ts" + - file: "packages/desktop/test/desktopWindowLifecycle.test.ts" + - file: "packages/ui/test/useTabPersistence.test.ts" + - file: "packages/ui/test/remoteWorkspaceSessionPersistence.test.ts" + + - id: "surface.app-usage-dashboard" + kind: "ui-surface" + label: "Settings App Usage dashboard" + codeSeeds: + - symbol: "AppUsagePanel" + file: "packages/ui/src/settings/usage-stats/AppUsagePanel.tsx" + - symbol: "UsageStatsSection" + file: "packages/ui/src/settings/UsageStatsSection.tsx" + + - id: "surface.resource-manager-window" + kind: "ui-surface" + label: "Help menu Resource Manager window" + codeSeeds: + - symbol: "ResourceManagerApp" + file: "packages/ui/src/resource-manager/ResourceManagerApp.tsx" + - symbol: "StorageSection" + file: "packages/ui/src/resource-manager/storage/StorageSection.tsx" + - symbol: "NetworkSection" + file: "packages/ui/src/resource-manager/NetworkSection.tsx" + - symbol: "openResourceManager" + file: "packages/desktop/src/main/resourceManagerWindow.ts" + - symbol: "WindowsCaptionMenuButton" + file: "packages/ui/src/WindowsCaptionMenuButton.tsx" + + - id: "surface.plan-usage" + kind: "ui-surface" + label: "Coding Plan and Team Plan usage surfaces" + codeSeeds: + - symbol: "CodingPlanUsagePanel" + file: "packages/ui/src/settings/usage-stats/CodingPlanUsagePanel.tsx" + + - id: "surface.start-plan-manual-claim" + kind: "ui-surface" + label: "Marketing Touch claim banner and result dialog (formerly manual claim)" + docs: + - "docs/zai-start-plan-provider.md" + - "docs/cloud-content-dialog.md" + - "docs/testing/marketing-touch-e2e-implementation.md" + - "docs/marketing-touch-client.md" + codeSeeds: + - symbol: "MarketingBanner" + file: "packages/ui/src/components/marketing-touch/MarketingBanner.tsx" + - symbol: "MarketingDialogs" + file: "packages/ui/src/components/marketing-touch/MarketingDialogs.tsx" + + - id: "capability.cloud-content-dialog" + kind: "capability" + label: "Cloud-driven content dialog and Hero resources" + aliases: + - "cloud content dialog" + - "remote Hero" + - "云端内容弹窗" + - "远端 Hero 资源" + docs: + - "docs/cloud-content-dialog.md" + codeSeeds: + - symbol: "CloudContentDialog" + file: "packages/ui/src/components/cloud-content-dialog/CloudContentDialog.tsx" + - symbol: "cloudContentPayloadSchema" + file: "packages/shared/src/cloudContent.ts" + - symbol: "CloudDialogHero" + file: "packages/ui/src/components/cloud-content-dialog/CloudDialogHero.tsx" + + - id: "surface.cloud-content-preview" + kind: "ui-surface" + label: "Retired Desktop dev HTTP content preview; no production entry" + docs: + - "docs/cloud-content-dialog.md" + codeSeeds: [] + + - id: "service.cloud-content-assets" + kind: "state-owner" + label: "Host-exclusive content ZIP cache and resource leases" + codeSeeds: + - symbol: "createCloudContentService" + file: "packages/services/src/cloud-content/cloudContentService.ts" + - symbol: "createContentBundleCache" + file: "packages/services/src/cloud-content/contentBundleCache.ts" + + - id: "shared.cloud-dialog-hero" + kind: "shared-ui" + label: "Sandboxed cloud dialog Hero renderer" + docs: + - "docs/cloud-content-dialog.md" + codeSeeds: + - symbol: "CloudDialogHero" + file: "packages/ui/src/components/cloud-content-dialog/CloudDialogHero.tsx" + - file: "packages/ui/src/assets/cloud-content/weekend-plan-hero.html" + + - id: "state.start-plan-model-guide-request" + kind: "state-owner" + label: "Retired claim-triggered model guide; Marketing Touch does not select models" + codeSeeds: [] + + - id: "evidence.start-plan-manual-claim-tests" + kind: "evidence" + label: "Start Plan manual claim focused and Desktop E2E coverage" + docs: + - "docs/testing/marketing-touch-e2e-audit.md" + - "docs/testing/marketing-touch-e2e-implementation.md" + codeSeeds: + - file: "packages/ui/test/marketingTouchProvider.test.ts" + - file: "packages/desktop/test/e2e/ui-shell/manual-review/pending/marketing-touch-delivery.test.ts" + - file: "packages/desktop/test/e2e/ui-shell/manual-review/pending/marketing-touch-entitlement.test.ts" + - file: "packages/ui/test/aliyunCaptchaRuntime.test.ts" + + - id: "surface.office-document-workbench" + kind: "ui-surface" + label: "Office preview and editing workbench" + codeSeeds: + - symbol: "PreviewPane" + file: "packages/ui/src/PreviewPane.tsx" + - symbol: "PdfViewer" + file: "packages/ui/src/components/ui/pdf-viewer.tsx" + + - id: "surface.pptx-element-selection" + kind: "ui-surface" + label: "Preview Pane explicit PPTX element selection" + codeSeeds: + - symbol: "PptxPreviewViewer" + file: "packages/ui/src/components/ui/pptx-preview-viewer.tsx" + - symbol: "PptxRendererPreviewDocument" + file: "packages/ui/src/presentation/pptxRendererPreviewEngine.ts" + + - id: "surface.composer-presentation-reference" + kind: "ui-surface" + label: "Conversation Composer PPTX element reference chip" + codeSeeds: + - symbol: "ConversationComposer" + file: "packages/ui/src/v4/ConversationComposer.tsx" + - symbol: "PptxElementReferenceChip" + file: "packages/ui/src/v4/composer/PptxElementReferenceChip.tsx" + - symbol: "serializeComposerPromptContexts" + file: "packages/ui/src/v4/composer/composerPromptContexts.ts" + + - id: "surface.computer-use-task-experience" + kind: "ui-surface" + label: "Computer Use task, permission, and takeover experience" + codeSeeds: + - symbol: "ComputerUseSection" + file: "packages/ui/src/settings/ComputerUseSection.tsx" + - symbol: "useCuaPermissionStatus" + file: "packages/ui/src/hooks/useCuaPermissionStatus.ts" + - symbol: "CuaToolCallBlock" + file: "packages/ui/src/ToolCallBlocks/renderers/cua.tsx" + - symbol: "createWindowsCuaOperationIndicator" + file: "packages/desktop/src/main/windowsCuaOperationIndicator.ts" + - symbol: "createCuaOperationTurnTracker" + file: "packages/services/src/ccbuddy-agent/cuaOperationTurnTracker.ts" + + - id: "surface.browser-use-side-pane-guest" + kind: "ui-surface" + label: "Browser Use side pane guest and background capture layer" + codeSeeds: + - symbol: "BrowserUseSidePaneContent" + file: "packages/ui/src/browser-use/BrowserUseSidePaneContent.tsx" + - symbol: "UnifiedBrowserView" + file: "packages/ui/src/browser-use/UnifiedBrowserView.tsx" + + - id: "surface.human-browser-side-pane-guest" + kind: "ui-surface" + label: "Human-opened Browser side pane guest" + codeSeeds: + - symbol: "AnimatedSidePanePanel" + file: "packages/ui/src/app-shell/AnimatedSidePanePanel.tsx" + - symbol: "UnifiedBrowserView" + file: "packages/ui/src/browser-use/UnifiedBrowserView.tsx" + - symbol: "useAppPanels" + file: "packages/ui/src/app-shell/useAppPanels.ts" + + - id: "surface.desktop-network-policy-setting" + kind: "ui-surface" + label: "Desktop HTTP proxy, No Proxy, and custom certificate settings" + codeSeeds: + - symbol: "GeneralSectionContent" + file: "packages/ui/src/settingsPageHelpers.tsx" + - symbol: "SettingsPage" + file: "packages/ui/src/SettingsPage.tsx" + + - id: "surface.browser-tab-shell" + kind: "ui-surface" + label: "Desktop Browser and Browser Use logical tab shell" + codeSeeds: + - symbol: "AnimatedSidePanePanel" + file: "packages/ui/src/app-shell/AnimatedSidePanePanel.tsx" + - symbol: "BrowserUseSidePaneContent" + file: "packages/ui/src/browser-use/BrowserUseSidePaneContent.tsx" + - symbol: "UnifiedBrowserView" + file: "packages/ui/src/browser-use/UnifiedBrowserView.tsx" + + - id: "surface.project-task-list" + kind: "ui-surface" + label: "Project workspace task list" + aliases: + - "Project sidebar" + - "workspace task rows" + - "项目任务列表" + codeSeeds: + - symbol: "WorkspaceSidebar" + file: "packages/ui/src/WorkspaceSidebar.tsx" + - symbol: "SortableWorkspaceSidebarItem" + file: "packages/ui/src/SortableWorkspaceSidebar.tsx" + - symbol: "WorkspaceSidebarItem" + file: "packages/ui/src/WorkspaceSidebarItem.tsx" + + - id: "capability.task-title-overflow-marquee" + kind: "capability" + label: "Task title overflow fade and row-hover marquee" + aliases: + - "task title marquee" + - "task name mask" + - "task 名称走马灯" + - "task 名称 mask" + docs: + - "docs/ui/task-item-title-overflow.md" + codeSeeds: + - symbol: "TaskTitleOverflowText" + file: "packages/ui/src/components/TaskTitleOverflowText.tsx" + + - id: "shared-ui.task-title-overflow-text" + kind: "shared-ui" + label: "Shared task title overflow and marquee renderer" + codeSeeds: + - symbol: "TaskTitleOverflowText" + file: "packages/ui/src/components/TaskTitleOverflowText.tsx" + + - id: "surface.preview-pane-office-file" + kind: "ui-surface" + label: "Preview Pane Office file surface" + codeSeeds: + - symbol: "PreviewPane" + file: "packages/ui/src/PreviewPane.tsx" + - symbol: "PreviewPaneOfficeContent" + file: "packages/ui/src/previewPaneOfficeContent.tsx" + + - id: "surface.conversation-assistant-file-preview" + kind: "ui-surface" + label: "Conversation assistant file preview cards" + codeSeeds: + - symbol: "AssistantPreviewCards" + file: "packages/ui/src/AssistantPreviewCards.tsx" + - symbol: "AssistantTextRowView" + file: "packages/ui/src/v4/ConversationRowView.tsx" + + - id: "surface.git-review-file-actions" + kind: "ui-surface" + label: "Git review file context actions" + aliases: + - "Review file manager action" + - "审查区文件管理器" + codeSeeds: + - symbol: "GitPane" + file: "packages/ui/src/GitPane.tsx" + - symbol: "GitPaneChangeCard" + file: "packages/ui/src/GitPaneChangeCard.tsx" + + - id: "shared-ui.remote-file-context-actions" + kind: "shared-ui" + label: "Workspace-scoped remote file context actions" + codeSeeds: + - symbol: "useFileContextActions" + file: "packages/ui/src/hooks/useFileContextActions.ts" + - symbol: "useTaskListItemContextActions" + file: "packages/ui/src/useTaskListItemContextActions.ts" + - symbol: "useWorkspaceOpenInEditorTarget" + file: "packages/ui/src/hooks/useWorkspaceOpenInEditorTarget.ts" + + - id: "surface.grouped-task-list" + kind: "ui-surface" + label: "Custom grouped task list" + aliases: + - "Group sidebar" + - "grouped tasks" + - "分组任务列表" + codeSeeds: + - symbol: "WorkspaceGroupedTasksSection" + file: "packages/ui/src/WorkspaceGroupedTasksSection.tsx" + - symbol: "useGroupedTaskView" + file: "packages/ui/src/hooks/useGroupedTaskView.ts" + + - id: "surface.pinned-task-list" + kind: "ui-surface" + label: "Global pinned task list" + aliases: + - "Pinned sidebar" + - "已置顶" + - "置顶任务列表" + codeSeeds: + - symbol: "WorkspacePinnedTasksSection" + file: "packages/ui/src/WorkspacePinnedTasksSection.tsx" + + - id: "surface.mobile-remote-task-home" + kind: "ui-surface" + label: "Mobile remote task home" + aliases: + - "mobile task list" + - "remote task status" + - "手机远控任务首页" + - "手机任务状态" + docs: + - "docs/web-remote-control/mobile-task-home-design.md" + codeSeeds: + - symbol: "WebRemoteControlMobileTaskHome" + file: "packages/ui/src/WebRemoteControlMobileTaskHome.tsx" + - symbol: "buildWebRemoteControlTaskTargets" + file: "packages/ui/src/lib/webRemoteControlTaskIndex.ts" + + - id: "surface.desktop-web-remote-control-dialog" + kind: "ui-surface" + label: "Desktop Web Remote Control dialog" + aliases: + - "Web Remote Control QR dialog" + - "手机远控二维码弹窗" + docs: + - "docs/web-remote-control/web-remote-control-architecture.md" + codeSeeds: + - symbol: "WebRemoteControlDialog" + file: "packages/ui/src/WebRemoteControlDialog.tsx" + + - id: "state.task-list-row-projection" + kind: "state-owner" + label: "Task list row and membership projection" + codeSeeds: + - symbol: "useWorkspaceTaskLists" + file: "packages/ui/src/hooks/useWorkspaceTaskLists.ts" + - symbol: "buildTaskListResult" + file: "packages/ui/src/v4/buildTaskListResultFromSessions.ts" + - symbol: "buildGroupedTaskViewFromSessions" + file: "packages/ui/src/lib/buildGroupedTaskViewFromSessions.ts" + + - id: "state.preview-pane-office-render" + kind: "state-owner" + label: "Preview Pane local Office render lifecycle" + codeSeeds: + - symbol: "PreviewPaneOfficeDocxContent" + file: "packages/ui/src/previewPaneOfficeDocxContent.tsx" + + - id: "state.pptx-preview-element-selection" + kind: "state-owner" + label: "PPTX viewer generation-scoped element selection" + codeSeeds: + - symbol: "PptxPreviewViewer" + file: "packages/ui/src/components/ui/pptx-preview-viewer.tsx" + + - id: "state.pptx-preview-ai-edit-draft" + kind: "state-owner" + label: "PPTX viewer-local AI edit comment draft" + codeSeeds: + - symbol: "PptxSelectionActionBar" + file: "packages/ui/src/components/ui/pptx-selection-action-bar.tsx" + - symbol: "PptxPreviewViewer" + file: "packages/ui/src/components/ui/pptx-preview-viewer.tsx" + + - id: "state.composer-presentation-reference-draft" + kind: "state-owner" + label: "Renderer-local scoped Composer PPTX references" + codeSeeds: + - symbol: "ConversationComposer" + file: "packages/ui/src/v4/ConversationComposer.tsx" + + - id: "state.pptx-reference-preview-navigation" + kind: "state-owner" + label: "Renderer-local PPTX reference file and page navigation request" + codeSeeds: + - symbol: "PptxPreviewViewer" + file: "packages/ui/src/components/ui/pptx-preview-viewer.tsx" + - symbol: "openCodeViewerSidePane" + file: "packages/ui/src/lib/workspaceSidePane.ts" + + - id: "state.web-remote-task-target-projection" + kind: "state-owner" + label: "Web remote task target projection" + codeSeeds: + - symbol: "buildWebRemoteControlTaskTargets" + file: "packages/ui/src/lib/webRemoteControlTaskIndex.ts" + + - id: "service.ccbuddy-task-list" + kind: "service" + label: "CCbuddy task list service" + codeSeeds: + - symbol: "ICCbuddyTaskService" + file: "packages/services/src/session/ccbuddyTaskService.ts" + + - id: "service.workspace-file-binary-preview" + kind: "service" + label: "Workspace-scoped bounded binary preview read" + codeSeeds: + - symbol: "readBinaryPreview" + file: "packages/services/src/file/fileService.ts" + + - id: "service.ccbuddy-task-index-syncer" + kind: "service" + label: "Sessions-index to task-index synchronizer" + codeSeeds: + - symbol: "createCCbuddyTaskIndexSyncer" + file: "packages/services/src/ccbuddy-agent/ccbuddyTaskIndexSyncer.ts" + + - id: "surface.conversation-model-control" + kind: "ui-surface" + label: "Conversation composer model control" + codeSeeds: + - symbol: "V4ComposerModelControlsImpl" + file: "packages/ui/src/v4/composer/V4ComposerToolbar.tsx" + + - id: "surface.subagent-session-detail" + kind: "ui-surface" + label: "Read-only Subagent session conversation detail" + aliases: + - "Subagent detail tab" + - "child session detail" + - "子智能体详情" + docs: + - "docs/subagent-session-side-tabs.md" + - "docs/v4-composer-api-retry-status.md" + - "docs/chat/manual-model-switch-resolution-chain.md" + codeSeeds: + - symbol: "SubagentSessionSidePane" + file: "packages/ui/src/app-shell/SubagentSessionSidePane.tsx" + - symbol: "SessionPane" + file: "packages/ui/src/v4/SessionPane.tsx" + - symbol: "ConversationTimeline" + file: "packages/ui/src/v4/ConversationTimeline.tsx" + - symbol: "ConversationTurnGroup" + file: "packages/ui/src/v4/ConversationTurnGroup.tsx" + + - id: "surface.conversation-query-edit" + kind: "ui-surface" + label: "Conversation real-user query inline edit" + aliases: + - "edit user query" + - "编辑用户消息" + - "队列消费消息编辑" + codeSeeds: + - symbol: "ConversationRowView" + file: "packages/ui/src/v4/ConversationRowView.tsx" + - symbol: "SessionPane" + file: "packages/ui/src/v4/SessionPane.tsx" + + - id: "surface.parent-task-blocking-interaction" + kind: "ui-surface" + label: "Parent task permission and user-input dialogs" + aliases: + - "subagent permission" + - "subagent AskUserQuestion" + - "子代理权限" + - "子代理提问" + codeSeeds: + - symbol: "V4InteractionDialogs" + file: "packages/ui/src/v4/V4InteractionDialogs.tsx" + - symbol: "onPermissionRequested" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/product-projection.ts" + + - id: "surface.conversation-tool-call" + kind: "ui-surface" + label: "Conversation tool call cards" + aliases: + - "TaskOutput card" + - "RespondToCoordinator card" + - "工具调用卡片" + - "CUA Group" + - "Computer Use 工具聚合" + docs: + - "docs/ui/tool-display-rendering.md" + - "docs/task-output-contract.md" + - "docs/subagent-respond-to-coordinator.md" + - "docs/cua/cua-tool-app-identity-summary.md" + codeSeeds: + - symbol: "resolveToolCallRenderer" + file: "packages/ui/src/ToolCallBlocks.tsx" + - symbol: "toolCallRowToLegacyNode" + file: "packages/ui/src/v4/toolCallRowAdapter.ts" + - symbol: "ProductProjection" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/product-projection.ts" + - symbol: "prepareCuaGroupFlowItems" + file: "packages/ui/src/v4/conversationCuaGroups.ts" + + - id: "surface.ask-user-question-auto-resolution-setting" + kind: "ui-surface" + label: "Settings interaction auto-resolution switch" + codeSeeds: + - symbol: "GeneralSectionContent" + file: "packages/ui/src/settingsPageHelpers.tsx" + - symbol: "SettingsPage" + file: "packages/ui/src/SettingsPage.tsx" + + - id: "surface.message-stream-reasoning-setting" + kind: "ui-surface" + label: "Settings message stream reasoning visibility switch" + codeSeeds: + - symbol: "GeneralSectionContent" + file: "packages/ui/src/settingsPageHelpers.tsx" + - symbol: "SettingsPage" + file: "packages/ui/src/SettingsPage.tsx" + + - id: "state.conversation-reasoning-visibility" + kind: "state-owner" + label: "Renderer-resolved conversation reasoning visibility" + codeSeeds: + - symbol: "SessionPane" + file: "packages/ui/src/v4/SessionPane.tsx" + - symbol: "isConversationReasoningRowVisible" + file: "packages/ui/src/v4/conversationRowContext.ts" + + - id: "surface.data-directory-setting" + kind: "ui-surface" + label: "Settings data storage directory" + codeSeeds: + - symbol: "GeneralSectionContent" + file: "packages/ui/src/settingsPageHelpers.tsx" + - symbol: "SettingsPage" + file: "packages/ui/src/SettingsPage.tsx" + + - id: "surface.model-io-full-retention-setting" + kind: "ui-surface" + label: "Settings ModelIO full retention switch" + codeSeeds: + - symbol: "GeneralSectionContent" + file: "packages/ui/src/settingsPageHelpers.tsx" + - symbol: "SettingsPage" + file: "packages/ui/src/SettingsPage.tsx" + + - id: "surface.conversation-query-navigator" + kind: "ui-surface" + label: "Conversation complete query navigator rail" + codeSeeds: + - symbol: "ConversationTurnNavigator" + file: "packages/ui/src/v4/ConversationTurnNavigator.tsx" + - symbol: "ConversationTimeline" + file: "packages/ui/src/v4/ConversationTimeline.tsx" + + - id: "surface.conversation-composer-attachments" + kind: "ui-surface" + label: "Conversation composer attachments" + codeSeeds: + - symbol: "useComposerAttachments" + file: "packages/ui/src/v4/composer/useComposerAttachments.ts" + + - id: "surface.conversation-sent-media-preview" + kind: "ui-surface" + label: "Sent conversation image and video preview" + aliases: + - "sent video preview" + - "已发送视频预览" + - "媒体附件预览" + docs: + - "docs/plans/2026-08-17-video-input-support-plan.md" + - "docs/conversation-session-case-catalog.md" + codeSeeds: + - symbol: "UserInputAttachmentList" + file: "packages/ui/src/v4/ConversationRowView.tsx" + - symbol: "ChatMediaAttachmentPreviewDialog" + file: "packages/ui/src/ChatMediaAttachmentPreviewDialog.tsx" + - symbol: "ConversationV4Gateway.attachmentRead" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/v4-gateway.ts" + - symbol: "ConversationV4Gateway.attachmentPreviewSource" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/v4-gateway.ts" + - symbol: "installLocalMediaPreviewProtocol" + file: "packages/desktop/src/main/localMediaPreviewProtocol.ts" + + - id: "surface.automation-edit" + kind: "ui-surface" + label: "Automation edit model control" + codeSeeds: + - symbol: "AutomationEditView" + file: "packages/ui/src/settings/AutomationEditView.tsx" + + - id: "surface.automation-template-gallery" + kind: "ui-surface" + label: "Scheduled and Off-Peak template gallery" + aliases: + - "scheduled-task templates" + - "off-peak-task templates" + - "自动化模板" + codeSeeds: + - symbol: "AutomationsSection" + file: "packages/ui/src/settings/AutomationsSection.tsx" + - symbol: "AutomationTemplateSkeletonGrid" + file: "packages/ui/src/settings/AutomationTemplateSkeletonGrid.tsx" + + - id: "surface.off-peak-home-template-carousel" + kind: "ui-surface" + label: "New Task Off-Peak template carousel" + codeSeeds: + - symbol: "OffPeakNewTaskEntry" + file: "packages/ui/src/v4/OffPeakNewTaskEntry.tsx" + + - id: "surface.off-peak-creation" + kind: "ui-surface" + label: "Off-Peak creation entries and result reporting" + codeSeeds: + - symbol: "OffPeakNewTaskEntry" + file: "packages/ui/src/v4/OffPeakNewTaskEntry.tsx" + - symbol: "handleOffPeakSubmit" + file: "packages/ui/src/settings/AutomationsSection.tsx" + + - id: "surface.off-peak-upgrade" + kind: "ui-surface" + label: "Off-Peak Coding Plan upgrade entries" + codeSeeds: + - symbol: "OffPeakNewTaskEntry" + file: "packages/ui/src/v4/OffPeakNewTaskEntry.tsx" + - symbol: "handleOpenCodingPlanUpgrade" + file: "packages/ui/src/settings/AutomationsSection.tsx" + + - id: "surface.conversation-automation-tools" + kind: "ui-surface" + label: "Conversation automation management tools" + aliases: + - "CronCreate" + - "CronList" + - "CronUpdate" + - "CronDelete" + - "会话内定时任务管理" + codeSeeds: + - symbol: "cronUpdateToolEntry" + file: "apps/ccbuddy-cli/packages/core/src/tool/handlers/cron.ts" + - symbol: "createProtocolAutomationPort" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/automation-port.ts" + - symbol: "resolveCronAutomationTurnCards" + file: "packages/ui/src/v4/ConversationTurnGroup.tsx" + + - id: "surface.user-subagent-form" + kind: "ui-surface" + label: "User Subagent form model control" + codeSeeds: + - symbol: "SubagentForm" + file: "packages/ui/src/settings/SubagentsSection.tsx" + + - id: "surface.builtin-subagent-model" + kind: "ui-surface" + label: "Built-in and plugin Subagent model override" + codeSeeds: + - symbol: "SubagentModelOverrideControl" + file: "packages/ui/src/settings/SubagentsSection.tsx" + + - id: "surface.provider-settings" + kind: "ui-surface" + label: "Model provider settings and model capability editor" + docs: + - "docs/working-memory/provider-refactor/steps/todo-98-builtin-option-map-formatting-regression.md" + - "docs/working-memory/provider-refactor/steps/todo-93-account-plan-loss-manual-switch.md" + - "docs/working-memory/provider-refactor/steps/todo-92-model-smart-config-and-override-feedback.md" + - "docs/working-memory/provider-refactor/steps/todo-91-connectivity-probe-prompt-contract.md" + - "docs/working-memory/provider-refactor/steps/todo-90-model-add-edit-shared-recommended-draft.md" + - "docs/superpowers/specs/2026-06-04-model-provider-model-editor-design.md" + - "docs/superpowers/specs/2026-08-21-model-provider-modality-settings-design.md" + - "docs/working-memory/provider-refactor/design/registry/model-membership-and-enablement.md" + - "docs/working-memory/provider-refactor/design/registry/provider-and-model-configuration-overview.md" + - "docs/working-memory/provider-refactor/design/registry/settings.md" + - "docs/working-memory/provider-refactor/steps/todo-21-ccbuddy-builtin-config-ownership-and-model-activation-order.md" + - "docs/working-memory/provider-refactor/steps/todo-61-provider-template-picker-and-brand-metadata.md" + codeSeeds: + - symbol: "ModelProviderSection" + file: "packages/ui/src/settings/ModelProviderSection.tsx" + - symbol: "createAccountConnectionRefreshObserver" + file: "packages/ui/src/root/accountConnectionRefreshObserver.ts" + - symbol: "refreshRestoredOAuthProviderFamilyAfterStartup" + file: "packages/ui/src/root/oauthProviderFamilySelectionRefresh.ts" + - symbol: "useRootOAuthEffects" + file: "packages/ui/src/root/useRootOAuthEffects.ts" + - symbol: "ProviderModelMetadataDialog" + file: "packages/ui/src/settings/model-provider-section/ProviderModelMetadataDialog.tsx" + - symbol: "ProviderModelInputModalityOptions" + file: "packages/ui/src/settings/model-provider-section/ProviderModelModalityOptions.tsx" + - symbol: "ModelRowInput" + file: "packages/ui/src/settings/model-provider-section/ProviderFormControls.tsx" + - symbol: "InlineEditableProviderCard" + file: "packages/ui/src/settings/model-provider-section/InlineEditableProviderCard.tsx" + - symbol: "ModelProviderSectionDetail" + file: "packages/ui/src/settings/model-provider-section/Detail.tsx" + - symbol: "ProviderTemplatePicker" + file: "packages/ui/src/settings/model-provider-section/ProviderTemplatePicker.tsx" + - symbol: "ProviderLogo" + file: "packages/ui/src/settings/model-provider-section/ProviderLogo.tsx" + - symbol: "ProviderDetailFeedbackBoundary" + file: "packages/ui/src/settings/model-provider-section/ProviderDetailFeedback.tsx" + - symbol: "resolveProviderModelDraftCommit" + file: "packages/ui/src/settings/model-provider-section/ProviderModelMetadata.ts" + + - id: "capability.customize-capability-search" + kind: "capability" + label: "Scope-aware Plugin capability search" + aliases: + - "Plugin search" + - "Customize search" + - "插件 MCP Skills 搜索" + docs: + - "docs/plugin-capabilities-settings.md" + codeSeeds: + - symbol: "PluginsSection" + file: "packages/ui/src/settings/PluginsSection.tsx" + + - id: "surface.customize-capability-settings" + kind: "ui-surface" + label: "Plugin, MCPs and Skills settings" + codeSeeds: + - symbol: "PluginsSection" + file: "packages/ui/src/settings/PluginsSection.tsx" + - symbol: "McpSettingsSection" + file: "packages/ui/src/settings/McpSettingsSection.tsx" + - symbol: "SkillsSection" + file: "packages/ui/src/settings/SkillsSection.tsx" + + - id: "state.customize-tab-search-query" + kind: "state-owner" + label: "Plugin tab-local search query state" + codeSeeds: + - symbol: "PluginsSection" + file: "packages/ui/src/settings/PluginsSection.tsx" + + - id: "evidence.customize-capability-settings-tests" + kind: "evidence" + label: "Plugin scope projection and search tests" + docs: + - "docs/plugin-capabilities-settings.md" + codeSeeds: + - file: "packages/ui/test/pluginSettingsSection.test.ts" + - file: "packages/ui/test/pluginCapabilityProjection.test.ts" + + - id: "capability.skill-catalog-discovery" + kind: "capability" + label: "Workspace and user Skill catalog discovery" + aliases: + - "Skills discovery" + - ".ccbuddy/skills and .agents/skills" + - "技能目录发现" + - "用户技能引用" + docs: + - "docs/external-agent-skills-import.md" + - "docs/ui/mention-panel-layout.md" + codeSeeds: + - symbol: "resolveDefaultSkillRoots" + file: "apps/ccbuddy-cli/packages/adapters/src/skills/roots.ts" + - symbol: "createSkillsService" + file: "packages/services/src/skills/skillsService.ts" + - symbol: "filterSkillsForProvider" + file: "packages/ui/src/lib/skillSourceFilter.ts" + + - id: "surface.composer-skill-compatibility-picker" + kind: "ui-surface" + label: "Composer compatible Skill picker ($ and Yen aliases)" + aliases: + - "$ Skills picker" + - "$ 面板" + - "¥ 技能面板" + codeSeeds: + - symbol: "MentionPlugin" + file: "packages/ui/src/mentions/MentionPlugin.tsx" + - symbol: "useSkillsMentionProvider" + file: "packages/ui/src/mentions/providers/skillsMentionProvider.ts" + + - id: "service.workspace-skills-catalog" + kind: "service" + label: "Host workspace and user Skills catalog service" + codeSeeds: + - symbol: "createSkillsService" + file: "packages/services/src/skills/skillsService.ts" + - symbol: "discoverSkills" + file: "packages/services/src/skills/skillsService.ts" + + - id: "persistence.skill-roots" + kind: "persistence" + label: "Workspace and user .ccbuddy/skills and .agents/skills roots" + docs: + - "docs/external-agent-skills-import.md" + codeSeeds: + - symbol: "resolveDefaultSkillRoots" + file: "apps/ccbuddy-cli/packages/adapters/src/skills/roots.ts" + - symbol: "resolveAncestorWorkspaceRoots" + file: "packages/services/src/skills/skillsService.ts" + + - id: "evidence.skill-catalog-discovery-tests" + kind: "evidence" + label: "Skill root discovery and composer source filtering tests" + docs: + - "docs/external-agent-skills-import.md" + codeSeeds: + - file: "apps/ccbuddy-cli/packages/adapters/tests/skills.test.ts" + - file: "packages/services/test/skillsService.test.ts" + - file: "packages/ui/test/skillSourceFilter.test.ts" + + - id: "capability.command-workspace-scope" + kind: "capability" + label: "Concrete Workspace scope selection for Commands" + aliases: + - "Command Workspace scope" + - "Command new Workspace selector" + - "命令工作区选择" + docs: + - "docs/settings-command-list.md" + codeSeeds: + - symbol: "CommandsSection" + file: "packages/ui/src/settings/CommandsSection.tsx" + - symbol: "CommandForm" + file: "packages/ui/src/settings/CommandForm.tsx" + + - id: "surface.command-settings-editor" + kind: "ui-surface" + label: "Command settings create and edit form" + codeSeeds: + - symbol: "CommandsSection" + file: "packages/ui/src/settings/CommandsSection.tsx" + - symbol: "CommandForm" + file: "packages/ui/src/settings/CommandForm.tsx" + + - id: "state.command-form-scope-key" + kind: "state-owner" + label: "Command form concrete User or Workspace scope key" + codeSeeds: + - symbol: "CommandsSection" + file: "packages/ui/src/settings/CommandsSection.tsx" + + - id: "shared-ui.customize-scope-menu" + kind: "shared-ui" + label: "User and concrete Workspace scope menu" + codeSeeds: + - symbol: "PluginScopeMenu" + file: "packages/ui/src/settings/PluginScopeMenu.tsx" + + - id: "service.workspace-commands" + kind: "service" + label: "Workspace-resolved Commands Host service" + codeSeeds: + - symbol: "useWorkspaceServicesResolution" + file: "packages/ui/src/hooks/useWorkspaceServices.tsx" + - symbol: "createCommandsService" + file: "packages/services/src/commands/commandsService.ts" + + - id: "persistence.command-settings-directories" + kind: "persistence" + label: "User and Workspace command directories" + docs: + - "docs/settings-command-list.md" + codeSeeds: + - symbol: "getCommandsRootForStorage" + file: "packages/services/src/commands/commandsService.ts" + + - id: "evidence.command-workspace-scope-tests" + kind: "evidence" + label: "Command Workspace scope selection tests" + docs: + - "docs/settings-command-list.md" + codeSeeds: + - file: "packages/ui/test/settingsCommandWorkspaceScope.test.ts" + + - id: "surface.project-memory-settings" + kind: "ui-surface" + label: "Project Memory toggle and local-only project-first read-only viewer" + codeSeeds: + - symbol: "MemorySettingsSection" + file: "packages/ui/src/settings/MemorySettingsSection.tsx" + - symbol: "MemorySettingsViewer" + file: "packages/ui/src/settings/MemorySettingsViewer.tsx" + + - id: "shared-ui.model-config-select" + kind: "shared-ui" + label: "ModelConfigSelect" + codeSeeds: + - symbol: "ModelConfigSelect" + file: "packages/ui/src/ModelConfigSelect.tsx" + + - id: "shared-ui.model-select-groups" + kind: "shared-ui" + label: "Model selection option builder" + codeSeeds: + - symbol: "buildRegistryModelSelectGroups" + file: "packages/ui/src/lib/modelSelectionGroups.ts" + + - id: "shared-ui.model-providers-hook" + kind: "shared-ui" + label: "Model provider registry hook" + codeSeeds: + - symbol: "useModelProviders" + file: "packages/ui/src/hooks/useModelProviders.ts" + + - id: "state.conversation-projection" + kind: "state-owner" + label: "Conversation UI projection and current runtime config" + docs: + - "docs/conversation-protocol-declaration.md" + - "docs/v4-refactor/03-commands.md" + - "docs/v4-refactor/04-sync-and-recovery.md" + codeSeeds: + - symbol: "ConversationProjectionStore" + file: "packages/ui/src/v4/conversationProjectionStore.ts" + - symbol: "expectAcceptedInputProjection" + file: "packages/ui/src/v4/conversationProjectionStore.ts" + - symbol: "ProductProjection" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/product-projection.ts" + invariants: + - "An accepted sendText waits for the same sourceCommandId queue item or real-user userInput row; complete silence triggers one same-sub recovery without synthesizing a row, creating a renderer queue, or replaying the command." + - "The watchdog reuses the trusted attachment's desktop-continuous or web-remote-replayable delivery boundary; it does not move conversation state into host, relay, or renderer-local queue." + + - id: "state.cua-action-state-authority" + kind: "state-owner" + label: "CUA element action mutation epoch and authoritative post-state" + docs: + - "docs/cua/2026-08-18-ax-action-state-consistency.md" + codeSeeds: + - symbol: "registerMcpTools" + file: "apps/ccbuddy-cli/packages/core/src/mcp/index.ts" + - symbol: "serializeOutput" + file: "apps/ccbuddy-cli/packages/core/src/tool/executor/result-serialization.ts" + invariants: + - "Only ccbuddy-cua owns pre/post state ids and mutation epochs; CCbuddy preserves or safely rejects their atomic projection." + - "A synced outcome and its post-state reach the model together; over-budget or malformed pairs become refresh_required." + + - id: "state.message-history-model-provenance" + kind: "state-owner" + label: "Assistant model provenance in canonical model history" + codeSeeds: + - symbol: "MessageHistoryImpl" + file: "apps/ccbuddy-cli/packages/core/src/agent/message-history.ts" + - symbol: "hydrateMessageHistoryFromSession" + file: "apps/ccbuddy-cli/packages/core/src/agent/session-history-hydrator.ts" + + - id: "state.subagent-child-runtime" + kind: "state-owner" + label: "Subagent child runtime events and tool execution" + codeSeeds: + - symbol: "createDefaultSubagentPort" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/subagent.ts" + - symbol: "mirrorSubagentToolEvent" + file: "apps/ccbuddy-cli/packages/core/src/subagent/tool-event-mirror.ts" + + - id: "state.mcp-tool-catalog-cache" + kind: "state-owner" + label: "Process-scoped sanitized MCP tool catalog cache" + docs: + - "docs/mcp-async-tool-catalog-cache.md" + + - id: "state.assistant-file-preview-projection" + kind: "state-owner" + label: "Turn-local assistant file preview projection" + docs: + - "docs/ui/assistant-preview-cards.md" + codeSeeds: + - symbol: "buildAssistantPreviewCardsForAssistantTextRow" + file: "packages/ui/src/v4/assistantPreviewCards.ts" + - symbol: "resolveMarkdownFileLink" + file: "packages/ui/src/lib/markdownFileLink.ts" + - symbol: "SessionPane" + file: "packages/ui/src/v4/SessionPane.tsx" + + - id: "state.browser-context-handle-registry" + kind: "state-owner" + label: "Agent-owned BrowserControl session and tab authority" + docs: + - "docs/mcp-stateless-node-repl.md" + - "docs/browser-use/2026-07-28-stateless-browser-use-mcp-spec.md" + codeSeeds: + - symbol: "createProtocolBrowserControlBroker" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/browser-control-broker.ts" + - symbol: "requireSession" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/server-types.ts" + + - id: "state.browser-screenshot-surface-coordination" + kind: "state-owner" + label: "Desktop main transient browser screenshot surface groups" + codeSeeds: + - symbol: "DesktopBrowserScreenshotSurfaceCoordinator" + file: "packages/desktop/src/main/browserView/browserScreenshotSurfaceCoordinator.ts" + - symbol: "BrowserScreenshotSurfaceCoordinator" + file: "packages/desktop/src/main/browserView/browserScreenshotSurfaceContracts.ts" + + - id: "state.browser-recording-job-registry" + kind: "state-owner" + label: "Desktop main transient Browser Use recording jobs" + docs: + - "docs/browser-use/2026-08-12-browser-webview-video-recording-spec.md" + codeSeeds: + - symbol: "BrowserGuestManager" + file: "packages/desktop/src/main/browserView/browserGuestManager.ts" + - file: "packages/desktop/src/main/browserView/browserVideoRecorder.ts" + + - id: "state.embedded-browser-resize-gesture" + kind: "state-owner" + label: "Renderer-local responsive viewport pointer gesture" + codeSeeds: + - symbol: "ResponsiveBrowserViewport" + file: "packages/ui/src/browser-use/ResponsiveBrowserViewport.tsx" + + - id: "state.embedded-browser-fit-presentation" + kind: "state-owner" + label: "Renderer-local responsive Fit canvas presentation" + docs: + - "docs/browser-use/2026-07-15-responsive-browser-viewport-spec.md" + codeSeeds: + - symbol: "ResponsiveBrowserViewport" + file: "packages/ui/src/browser-use/ResponsiveBrowserViewport.tsx" + - symbol: "resolveBrowserViewportScale" + file: "packages/ui/src/browser-use/browserViewportZoom.ts" + + - id: "state.embedded-browser-human-viewport-preference" + kind: "state-owner" + label: "App-global human Browser viewport presentation preference" + docs: + - "docs/browser-use/2026-07-15-responsive-browser-viewport-spec.md" + codeSeeds: + - symbol: "useResponsiveBrowserViewportControl" + file: "packages/ui/src/browser-use/useResponsiveBrowserViewportControl.ts" + - symbol: "useSettings" + file: "packages/ui/src/hooks/useSettingService.ts" + + - id: "state.browser-tab-residency" + kind: "state-owner" + label: "Process-local logical Browser tab catalog and LRU activity" + docs: + - "docs/browser-use/2026-07-31-browser-tab-residency-budget-spec.md" + codeSeeds: + - symbol: "BrowserUseSidePaneTab" + file: "packages/ui/src/lib/workspaceSidePane.ts" + - symbol: "BrowserGuestManager" + file: "packages/desktop/src/main/browserView/browserGuestManager.ts" + + - id: "state.automation-form-draft" + kind: "state-owner" + label: "Automation edit React draft" + codeSeeds: + - symbol: "AutomationEditView" + file: "packages/ui/src/settings/AutomationEditView.tsx" + + - id: "state.off-peak-turn-attribution" + kind: "state-owner" + label: "Turn-scoped Off-Peak telemetry attribution" + codeSeeds: + - symbol: "backgroundSeedFromTurnStarted" + file: "packages/ui/src/v4/telemetry/conversationTelemetrySupervisor.ts" + - symbol: "turnStartedFactSchema" + file: "packages/shared/src/ccbuddy-protocol-v4/telemetry.ts" + + - id: "state.coding-plan-purchase-funnel" + kind: "state-owner" + label: "Coding Plan purchase funnel context" + codeSeeds: + - symbol: "createCodingPlanFunnelContext" + file: "packages/ui/src/lib/codingPlanFunnelTelemetry.ts" + - symbol: "CodingPlanUpgradeDialogProvider" + file: "packages/ui/src/settings/CodingPlanUpgradeDialogProvider.tsx" + - symbol: "resolveCodingPlanEntryPlanStateFromProviderSettings" + file: "packages/ui/src/lib/codingPlanFunnelTelemetry.ts" + invariants: + - "Individual and Team entitled account Providers are Coding Plan; Start remains separate. Enabled/model readiness does not imply subscription ownership." + - "Provider ID compatibility is confined to event builders; actual Registry, selection, auth, and telemetry source facts remain unchanged." + + - id: "state.subagent-form-draft" + kind: "state-owner" + label: "Subagent form draft" + codeSeeds: + - symbol: "SubagentForm" + file: "packages/ui/src/settings/SubagentsSection.tsx" + + - id: "state.renderer-model-selection-read" + kind: "state-owner" + label: "Renderer target-host model selection read lifecycle" + codeSeeds: + - symbol: "useModelSelectionServiceView" + file: "packages/ui/src/hooks/useModelSelectionView.ts" + - symbol: "useModelSelectionView" + file: "packages/ui/src/hooks/useModelSelectionView.ts" + + - id: "state.oauth-pending-callback" + kind: "state-owner" + label: "OAuth pending callback lifecycle" + codeSeeds: + - symbol: "OAuthService" + file: "packages/services/src/oauth/oauthService.ts" + + - id: "state.provider-endpoint-routing-snapshot" + kind: "state-owner" + label: "Process-local routing registry; dynamic implementations own their snapshot" + codeSeeds: + - symbol: "resolveProcessProviderEndpointRoutingPort" + file: "apps/ccbuddy-cli/packages/bootstrap/src/provider-endpoint-routing.ts" + + - id: "service.model-provider" + kind: "service" + label: "Model provider service and registry" + codeSeeds: + - symbol: "IModelProviderService" + file: "packages/services/src/model-provider/modelProvider.ts" + + - id: "service.provider-settings" + kind: "service" + label: "Target Environment provider settings service" + codeSeeds: + - symbol: "ProviderSettingsFacade" + file: "packages/provider/src/facades.ts" + - symbol: "ProviderConfigService" + file: "packages/provider/src/config-service.ts" + - symbol: "IProviderSettingsService" + file: "packages/services/src/model-provider/providerFacadeServices.ts" + - symbol: "useProviderSettingsServiceView" + file: "packages/ui/src/hooks/useProviderSettingsView.ts" + + - id: "persistence.model-provider-config" + kind: "persistence" + label: "Sparse Personal provider membership, order and exact model configuration" + docs: + - "docs/working-memory/provider-refactor/design/registry/settings.md" + codeSeeds: + - symbol: "NodePersonalProviderConfigRepository" + file: "packages/provider-node/src/personal-provider-config-repository.ts" + + - id: "service.workspace-file-existence-check" + kind: "service" + label: "Workspace Host cached file existence check" + docs: + - "docs/ui/assistant-preview-cards.md" + codeSeeds: + - symbol: "createFileService" + file: "packages/services/src/file/fileService.ts" + + - id: "service.provider-endpoint-routing" + kind: "service" + label: "CCbuddy CLI provider endpoint routing service" + codeSeeds: + - symbol: "createProviderEndpointRoutingPort" + file: "apps/ccbuddy-cli/packages/adapters/src/model/endpoint-routing-edition/index.ts" + - symbol: "createProviderEndpointRoutingFetch" + file: "apps/ccbuddy-cli/packages/adapters/src/model/provider-endpoint-routing-fetch.ts" + + - id: "service.active-session-model-limits" + kind: "service" + label: "Active session model limit synchronization" + codeSeeds: + - symbol: "refreshActiveWorkspaceSessionModelLimits" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/active-session-model-limits.ts" + - symbol: "emitModelSelected" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/steering.ts" + + - id: "service.automation" + kind: "service" + label: "Automation service" + codeSeeds: + - symbol: "AutomationService" + file: "packages/services/src/session/automationService.ts" + + - id: "service.host-model-selection" + kind: "service" + label: "Target Workspace Host model selection service" + docs: + - "docs/working-memory/provider-refactor/steps/todo-13-target-host-model-selection-authority.md" + - "docs/working-memory/provider-refactor/steps/todo-34-model-selection-async-state-and-repo-wiki-draft.md" + codeSeeds: + - symbol: "IModelSelectionService" + file: "packages/services/src/model-provider/providerFacadeServices.ts" + - symbol: "useWorkspaceServicesResolution" + file: "packages/ui/src/hooks/useWorkspaceServices.tsx" + - symbol: "useModelSelectionServiceView" + file: "packages/ui/src/hooks/useModelSelectionView.ts" + - file: "packages/desktop/src/host/remoteWorkspaceServiceCollection.ts" + + - id: "service.subagents" + kind: "service" + label: "Subagents service" + codeSeeds: + - symbol: "ISubagentsService" + file: "packages/services/src/subagents/subagents.ts" + + - id: "service.conversation-row-actions" + kind: "service" + label: "Conversation row action command authority" + codeSeeds: + - symbol: "resolveRowActionTarget" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/product-projection.ts" + - symbol: "editUserQuery" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/commands/handlers/fork-edit-retry.ts" + + - id: "service.selection-side-session-creation" + kind: "service" + label: "Selection side session command and atomic conversation fork" + codeSeeds: + - symbol: "createSelectionSideSession" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/commands/handlers/selection-side-session.ts" + - symbol: "createSelectionSideConversation" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/session-fork.ts" + + - id: "service.project-memory-extraction-lifecycle" + kind: "service" + label: "Project Memory Extraction scheduler lifecycle" + codeSeeds: + - symbol: "createMemoryExtractionScheduler" + file: "apps/ccbuddy-cli/packages/core/src/memory/extraction.ts" + - symbol: "scheduleProjectMemoryExtraction" + file: "apps/ccbuddy-cli/packages/core/src/runtime/helpers/project-memory-extraction.ts" + - symbol: "createSessionFacade" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/session-facade.ts" + + - id: "service.headless-cli-prompt-runtime" + kind: "service" + label: "Headless CLI prompt and target runtime" + codeSeeds: + - symbol: "runPrompt" + file: "apps/ccbuddy-cli/packages/cli/src/prompt-command.ts" + - symbol: "run" + file: "apps/ccbuddy-cli/packages/cli/src/run.ts" + + - id: "service.project-memory-catalog" + kind: "service" + label: "Local Project Memory read-only catalog" + codeSeeds: + - symbol: "IMemoryService" + file: "packages/services/src/memory/memory.ts" + - symbol: "createMemoryService" + file: "packages/services/src/memory/memoryService.ts" + + - id: "service.subagent-interaction-broker" + kind: "service" + label: "Subagent parent-routed blocking interaction broker" + codeSeeds: + - symbol: "createSubagentInteractionBroker" + file: "apps/ccbuddy-cli/packages/core/src/runtime/helpers/subagent-interaction-broker.ts" + - symbol: "createProtocolInteractionBroker" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/interaction-broker.ts" + + - id: "service.interaction-auto-resolution-runtime" + kind: "service" + label: "CLI interaction auto-resolution registry" + codeSeeds: + - symbol: "V4InteractionRegistry" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/interaction-registry.ts" + - symbol: "syncAppRuntimePreferences" + file: "packages/services/src/ccbuddy-agent/ccbuddyAgentService.ts" + - symbol: "createCCbuddyAgentService" + file: "packages/services/src/ccbuddy-agent/ccbuddyAgentService.ts" + - symbol: "createBotRemoteWorkspaceService" + file: "packages/services/src/bots/botRemoteWorkspaceBridge.ts" + - symbol: "syncAppRuntimePreferences" + file: "packages/services/src/bots/botsService.ts" + + - id: "service.conversation-rows-range" + kind: "service" + label: "Conversation read-only rows range query" + codeSeeds: + - symbol: "loadAllOlder" + file: "packages/ui/src/v4/conversationProjectionStore.ts" + - symbol: "getRowsRange" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/conversation-topic-publisher.ts" + + - id: "service.session-runtime-activation" + kind: "service" + label: "Persisted session runtime activation" + docs: + - "docs/v4-refactor/17-cold-resume-runtime-activation.md" + codeSeeds: + - symbol: "activateSessionForResume" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/server-operations.ts" + - symbol: "ColdSessionResumeCoordinator" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/cold-session-resume.ts" + - symbol: "createConversationV4Gateway" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/v4-bridge.ts" + + - id: "service.persisted-remote-session-repair" + kind: "service" + label: "Persisted remote session identity and path repair" + docs: + - "docs/v4-refactor/14-sessions-index.md" + codeSeeds: + - symbol: "repairPersistedRemoteSessionPaths" + file: "apps/ccbuddy-cli/packages/core/src/runtime/helpers/persisted-remote-session-path-repair.ts" + - symbol: "claimLegacySessionWorkspace" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/session-store/repositories/sessions.ts" + - symbol: "activateSessionForResume" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/server-operations.ts" + + - id: "service.mcp-session-runtime" + kind: "service" + label: "Session-scoped live MCP runtime" + codeSeeds: + - symbol: "McpPort" + file: "apps/ccbuddy-cli/packages/contracts/src/interfaces/mcp.port.ts" + - symbol: "createMcpConnectionPool" + file: "apps/ccbuddy-cli/packages/adapters/src/mcp/pool.ts" + + - id: "service.shared-browser-use-mcp-runtime" + kind: "service" + label: "Workspace-scoped shared stateless node_repl MCP runtime" + docs: + - "docs/mcp-stateless-node-repl.md" + - "docs/browser-use/2026-07-28-stateless-browser-use-mcp-spec.md" + codeSeeds: + - symbol: "NodeMcpAdapter" + file: "apps/ccbuddy-cli/packages/adapters/src/mcp/index.ts" + - symbol: "createMcpConnectionPool" + file: "apps/ccbuddy-cli/packages/adapters/src/mcp/pool.ts" + + - id: "service.oauth" + kind: "service" + label: "OAuth service" + codeSeeds: + - symbol: "OAuthService" + file: "packages/services/src/oauth/oauthService.ts" + + - id: "service.telemetry-core" + kind: "service" + label: "Telemetry core report pipeline" + codeSeeds: + - symbol: "createTelemetryCore" + file: "packages/services/src/telemetry/telemetryCore.ts" + + - id: "service.cli-agent-telemetry" + kind: "service" + label: "CCbuddy CLI agent OTLP telemetry" + codeSeeds: + - symbol: "AgentExecutionTelemetryRuntime" + file: "apps/ccbuddy-cli/packages/telemetry/src/agent-trace-runtime.ts" + - symbol: "RuntimeTelemetryFacade" + file: "apps/ccbuddy-cli/packages/core/src/telemetry/runtime-telemetry.ts" + + - id: "service.off-peak-task" + kind: "service" + label: "Off-Peak ticket and local task creation boundary" + codeSeeds: + - symbol: "OffPeakTaskService" + file: "packages/services/src/session/offPeakTaskService.ts" + - symbol: "useOffPeakTaskStore" + file: "packages/ui/src/store/offPeakTaskStore.ts" + invariants: + - "Provider start only waits for readiness; off-peak credentials explicitly read the latest completed Registry snapshot." + - "Initialization, connection changes, completed Registry notifications and manual refresh share serialized eligibility checks; support and availability publish together only for the latest generation." + + - id: "service.cli-device-mid" + kind: "service" + label: "CCbuddy CLI deviceMid ensure" + codeSeeds: + - symbol: "ensureCliDeviceMid" + file: "apps/ccbuddy-cli/packages/adapters/src/device/cli-device-mid.ts" + + - id: "service.anthropic-request-options" + kind: "service" + label: "Anthropic model request metadata options" + codeSeeds: + - symbol: "createAnthropicRequestMetadataUserId" + file: "apps/ccbuddy-cli/packages/adapters/src/model/anthropic-request-metadata.ts" + - symbol: "createGenerateTextOptions" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-options.ts" + - symbol: "createStreamTextOptions" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-options.ts" + + - id: "service.model-request-session-type-attribution" + kind: "service" + label: "Runtime model request session type attribution" + codeSeeds: + - symbol: "resolveModelRequestSessionTypeFromTaskType" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/model-request-session-type.ts" + - symbol: "resolveModelRequestSessionType" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-status.ts" + - symbol: "createModelRequestAttributionHeaders" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-status.ts" + + - id: "service.anthropic-reasoning-history-projection" + kind: "service" + label: "Anthropic request-local reasoning history projection" + codeSeeds: + - symbol: "AiSdkModelAdapter" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner.ts" + - symbol: "normalizeReasoningHistory" + file: "apps/ccbuddy-cli/packages/adapters/src/model/reasoning-history-normalization.ts" + - symbol: "repairReasoningHistoryAfterSignatureRejection" + file: "apps/ccbuddy-cli/packages/adapters/src/model/reasoning-history-normalization.ts" + - symbol: "runGenerateText" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-generate.ts" + - symbol: "runStreamText" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-stream.ts" + + - id: "service.model-reasoning-request-projection" + kind: "service" + label: "Model request-local reasoning content projection" + codeSeeds: + - symbol: "toAiSdkMessages" + file: "apps/ccbuddy-cli/packages/adapters/src/model/transform.ts" + - symbol: "withOpenAiCompatibleReasoningContent" + file: "apps/ccbuddy-cli/packages/adapters/src/model/reasoning-content-compat.ts" + - symbol: "withDeepSeekV4AnthropicThinkingReplay" + file: "apps/ccbuddy-cli/packages/adapters/src/model/anthropic-reasoning-metadata.ts" + + - id: "service.usage-stats-bridge" + kind: "service" + label: "Host App Usage protocol bridge" + codeSeeds: + - symbol: "createUsageStatsService" + file: "packages/services/src/usage-stats/usageStatsService.ts" + - symbol: "getAppUsageStats" + file: "packages/services/src/ccbuddy-agent/ccbuddyAgentService.ts" + + - id: "service.plan-entitlements" + kind: "service" + label: "Plan identity, subscription, quota, and monitor services" + codeSeeds: + - symbol: "BigModelUsageQuotaProvider" + file: "packages/services/src/usage-stats/providers/bigmodelUsageQuotaProvider.ts" + - symbol: "createCodingPlanSubscriptionService" + file: "packages/services/src/coding-plan-subscription/codingPlanSubscriptionService.ts" + + - id: "service.office-document-platform" + kind: "service" + label: "Planned workspace-scoped Office parsing, conversion, and save service" + + - id: "service.document-skills" + kind: "service" + label: "Official DOCX, PDF, PPTX, and XLSX document skills with judge subagent" + docs: + - "docs/document-skills-plugin.md" + codeSeeds: + - symbol: "OFFICIAL_PLUGIN_DEFINITIONS" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/official-plugin-definitions.ts" + - symbol: "collectFilesystemPluginFiles" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/bundled-plugins.ts" + - symbol: "collectSeaOfficialPluginAssets" + file: "apps/ccbuddy-cli/packages/cli/scripts/sea-official-plugin-assets.mjs" + - symbol: "enumeratePluginComponents" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/plugin-components.ts" + - symbol: "loadPluginAgentProfiles" + file: "apps/ccbuddy-cli/packages/bootstrap/src/subagents.ts" + invariants: + - "Every official packaging and seed whitelist preserves agents/, and document-skills completeness requires agents/judge.md before a cache is reusable." + + - id: "service.pptx-reference-resolver" + kind: "service" + label: "Official marketplace-aligned PPTX production skill" + codeSeeds: + - file: "apps/ccbuddy-cli/packages/document-skills-plugin/agents/judge.md" + + - id: "service.cua-platform" + kind: "service" + label: "Desktop-local Computer Use Helper, trust broker, observation, and native input" + aliases: + - "Helper lifecycle" + - "CUA Helper health check" + - "CUA Helper recovery" + docs: + - "docs/cua-permission-broker/2026-09-02-helper-lifecycle-agent-runtime-isolation-spec.md" + - "docs/testing/cua-e2e-case-catalog.md" + codeSeeds: + - symbol: "createDefaultCuaProductHelper" + file: "packages/services/src/node.ts" + - symbol: "buildCuaProductHelperAgentEnv" + file: "packages/services/src/node.ts" + - symbol: "ICuaPermissionService" + file: "packages/services/src/cua-permission-broker/cuaPermissionService.ts" + - symbol: "WindowsCuaHelperHost" + file: "packages/services/src/cua-permission-broker/windowsCuaDevHelperHost.ts" + - symbol: "resolveWindowsCuaRuntime" + file: "packages/services/src/cua-permission-broker/windowsCuaDevRuntime.ts" + invariants: + - "Default services assembly never schedules periodic Helper health probes or automatic recovery; health checks and recovery run only at explicit CUA demand boundaries." + - "Helper readiness, health failure, and recovery never dispose or restart Agent runtime." + + - id: "state.windows-cua-operation-indicator" + kind: "state-owner" + label: "Windows CUA tool-triggered operation indicator projection" + docs: + - "docs/superpowers/specs/2026-08-04-windows-cua-operation-indicator-design.md" + - "docs/testing/cua-e2e-case-catalog.md" + codeSeeds: + - symbol: "createWindowsCuaOperationIndicator" + file: "packages/desktop/src/main/windowsCuaOperationIndicator.ts" + - symbol: "createCuaOperationTurnTracker" + file: "packages/services/src/ccbuddy-agent/cuaOperationTurnTracker.ts" + + - id: "service.cua-helper-build-release" + kind: "service" + label: "Canonical CCbuddy Computer Use Helper build and release" + aliases: + - "cua-helper-build" + - "CUA Helper packaging" + docs: + - "docs/superpowers/specs/2026-08-19-cua-producer-0.5.7-integration.md" + - "docs/desktop/macos-dmg-signing-notarization.md" + codeSeeds: + - file: "scripts/build-cua-helper-app.mjs" + - file: "scripts/package-cua-helper-release.mjs" + - file: "packages/desktop/electron-builder.config.js" + - file: "packages/desktop/src/main/desktopCuaHelperInstaller.ts" + + - id: "state.cua-frame-pixel-authority" + kind: "state-owner" + label: "CUA immutable raster, WindowServer provenance, and native pixel dispatch authority" + docs: + - "docs/superpowers/specs/2026-08-14-cua-final-raster-integrity-contract.md" + - "docs/cua/2026-08-18-frame-pixel-zoom-regression.md" + codeSeeds: + - file: "apps/ccbuddy-cli/packages/ccbuddy-cua-plugin/upstream.json" + - file: "apps/ccbuddy-cli/packages/core/src/mcp/index.ts" + invariants: + - "Official CUA raster bytes and adjacent image_ref reach the model unchanged." + - "Coordinate strategy=event uses WindowServer provenance and never requires AX hit-test." + - "Window, full-display, and nested Zoom pixels share one final native stale/occlusion gate." + + - id: "service.cua-plugin-dev-runtime-assets" + kind: "service" + label: "CUA SDK/skill Dev build, validation, and filesystem seed assets" + docs: + - "docs/cua-permission-broker/cua-dev-mcp-runtime-assets.md" + codeSeeds: + - file: "scripts/build-desktop-agent-cli.mjs" + - file: "apps/ccbuddy-cli/packages/ccbuddy-cua-plugin/scripts/computer-use-client.mjs" + - symbol: "resolveOfficialPluginRoots" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/bundled-plugins.ts" + + - id: "service.cua-node-repl-bridge" + kind: "service" + label: "Shared node_repl Computer Use bridge" + docs: + - "docs/cua/2026-08-24-cua-node-repl-sdk-migration-spec.md" + codeSeeds: + - symbol: "createNodeReplMcpRuntime" + file: "apps/ccbuddy-cli/packages/node-repl-host/src/server.ts" + - symbol: "createComputerUseBridgeGlobals" + file: "apps/ccbuddy-cli/packages/node-repl-host/src/cua-bridge.ts" + - symbol: "createNodeReplCuaBroker" + file: "apps/ccbuddy-cli/packages/node-repl-host/src/cua-broker.ts" + invariants: + - "Only node_repl js/js_add_node_module_dir/js_reset are model-visible; CUA is SDK-only." + - "Subagent requests are rejected and remote callers attach to an existing shared host." + + - id: "state.cua-shared-host-runtime" + kind: "state-owner" + label: "Shared-host CUA runtime session, frame, and safety state" + docs: + - "docs/cua/2026-08-24-cua-node-repl-sdk-migration-spec.md" + codeSeeds: + - symbol: "createComputerUseRuntime" + file: "../ccbuddy-cua/src/tools/computer-use-runtime.ts" + - symbol: "setupComputerUseRuntime" + file: "apps/ccbuddy-cli/packages/ccbuddy-cua-plugin/scripts/computer-use-client.mjs" + invariants: + - "Session keys use workspaceKey + remoteSessionId + sessionId." + - "AccessibilitySession, frame freshness, kill switch, input holds, and possibly-sent remain runtime-owned." + - "Runtime state never enters relay/main, conversation snapshots, or replay queues." + + - id: "service.cua-tool-contract-projection" + kind: "service" + status: "removed" + label: "[Removed] CUA model-facing MCP tool projection and user-title projection" + docs: + - "docs/cua-get-app-state-user-title.md" + codeSeeds: + - symbol: "registerMcpTools" + file: "apps/ccbuddy-cli/packages/core/src/mcp/index.ts" + - symbol: "CuaToolCallBlock" + file: "packages/ui/src/ToolCallBlocks/renderers/cua.tsx" + + - id: "service.shared-host-attachment" + kind: "service" + label: "Web remote shared-host attachment" + codeSeeds: + - symbol: "createWebRemoteControlSharedHostAttachments" + file: "packages/desktop/src/main/webRemoteControlSharedHostAttachments.ts" + + - id: "service.desktop-web-remote-control-authorization" + kind: "service" + label: "Desktop Web Remote Control start dispatch boundary" + codeSeeds: + - symbol: "registerWebRemoteControlIpcHandlers" + file: "packages/desktop/src/main/desktopWebRemoteControlIpc.ts" + - symbol: "authorizeStart" + file: "packages/desktop/src/main/webRemoteControlManager.ts" + invariants: + - "Start and reset-pairing do not add Desktop native confirmation; QR refresh keeps its renderer confirmation." + - "The internal one-time ticket binds window and workspace targets but is not proof of user authorization and is not an XSS mitigation." + - "Renderer-reachable IPC dependencies expose only target-bound start/reset methods." + + - id: "service.desktop-app-shutdown-policy" + kind: "service" + label: "Desktop app shutdown policy" + codeSeeds: + - symbol: "resolveAppShutdownPolicy" + file: "packages/desktop/src/main/appShutdownPolicy.ts" + - symbol: "prepareAppQuit" + file: "packages/desktop/src/main/index.ts" + + - id: "service.data-directory-setting" + kind: "service" + label: "Data directory validation, copy, and bootstrap pointer service" + codeSeeds: + - symbol: "createSettingService" + file: "packages/services/src/setting/settingService.ts" + - symbol: "getCCbuddyDataRootDir" + file: "packages/services/src/paths.ts" + + - id: "service.model-io-runtime-preference-sync" + kind: "service" + label: "App-to-CLI ModelIO retention preference sync" + codeSeeds: + - symbol: "syncAppRuntimePreferences" + file: "packages/services/src/ccbuddy-agent/ccbuddyAgentService.ts" + - symbol: "updateModelIoPreferences" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/model-io-preferences.ts" + + - id: "service.desktop-browser-screenshot-activity" + kind: "service" + label: "Desktop owner-renderer and target-guest bounded screenshot activity lease" + codeSeeds: + - symbol: "DesktopBrowserScreenshotActivityController" + file: "packages/desktop/src/main/browserView/browserScreenshotActivityController.ts" + + - id: "service.desktop-chromium-network-policy" + kind: "service" + label: "Desktop main Chromium Session proxy and certificate policy" + docs: + - "apps/ccbuddy-cli/docs/design/v2/model/http-proxy.md" + codeSeeds: + - symbol: "applyDesktopChromiumNetworkPolicies" + file: "packages/desktop/src/main/desktopNetworkPolicy.ts" + - symbol: "applyDesktopSessionNetworkPolicy" + file: "packages/desktop/src/main/desktopNetworkPolicy.ts" + + - id: "service.host-api-network-policy" + kind: "service" + label: "Window Host lifecycle-scoped app-managed API network transport" + docs: + - "docs/superpowers/specs/2026-08-25-host-api-proxy-design.md" + codeSeeds: + - symbol: "NodeApiClient" + file: "packages/services/src/providers/api/nodeApiClient.ts" + - symbol: "createLocalServices" + file: "packages/services/src/node.ts" + - symbol: "createRemoteWorkspaceServiceCollection" + file: "packages/desktop/src/host/remoteWorkspaceServiceCollection.ts" + + - id: "service.desktop-browser-tab-residency" + kind: "service" + label: "Per-BrowserWindow logical Browser tab limit scheduler" + docs: + - "docs/browser-use/2026-07-31-browser-tab-residency-budget-spec.md" + codeSeeds: + - symbol: "BrowserGuestManager" + file: "packages/desktop/src/main/browserView/browserGuestManager.ts" + + - id: "service.workspace-identity-builder" + kind: "service" + label: "Remote workspace identity builder" + codeSeeds: + - symbol: "buildRemoteWorkspaceIdentity" + file: "packages/ui/src/lib/remoteWorkspaceHistory.ts" + + - id: "service.native-search-release-plan" + kind: "service" + label: "Native search platform release and ABI contract" + codeSeeds: + - symbol: "resolveNativeSearchPrebuiltPlan" + file: "scripts/native-search-tools-config.mjs" + - symbol: "verifyBuiltNativeSearchTools" + file: "scripts/native-search-tools-verify.mjs" + + - id: "service.prompt-attachment-transfer" + kind: "service" + label: "Prompt attachment transfer service" + codeSeeds: + - symbol: "IPromptAttachmentTransferService" + file: "packages/services/src/prompt-attachment-transfer/promptAttachmentTransfer.ts" + - symbol: "createRemotePromptAttachmentTransferService" + file: "packages/desktop/src/host/promptAttachmentTransferService.ts" + + - id: "persistence.automation-record" + kind: "persistence" + label: "Persisted automation record" + codeSeeds: + - symbol: "AutomationService" + file: "packages/services/src/session/automationService.ts" + + - id: "persistence.usage-observability-db" + kind: "persistence" + label: "CCbuddy CLI model, turn, and tool usage facts" + codeSeeds: + - symbol: "queryAppUsage" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/session-store/repositories/usage.ts" + - symbol: "buildAppUsageSnapshot" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/usage-stats-builder.ts" + + - id: "persistence.subagent-markdown" + kind: "persistence" + label: "User agent Markdown, built-in and plugin agent overrides" + codeSeeds: + - symbol: "ISubagentsService" + file: "packages/services/src/subagents/subagents.ts" + + - id: "persistence.session-model-timeline" + kind: "persistence" + label: "Session model change timeline parts" + codeSeeds: + - symbol: "persistPendingModelChangeTimeline" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/timeline-persistence.ts" + - symbol: "synthesizeEventsFromMessages" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/transcript-hydration.ts" + + - id: "persistence.session-media-artifacts" + kind: "persistence" + label: "Provider-neutral session media artifacts" + docs: + - "docs/plans/2026-08-17-video-input-support-plan.md" + - "apps/ccbuddy-cli/docs/design/v2/message-attachments.md" + - "apps/ccbuddy-cli/docs/design/v2/session-persistence.md" + codeSeeds: + - symbol: "persistToolResultMediaAttachments" + file: "apps/ccbuddy-cli/packages/core/src/runtime/helpers/tool-result-media-persistence.ts" + - symbol: "hydrateMessageHistoryFromSession" + file: "apps/ccbuddy-cli/packages/core/src/agent/session-history-hydrator.ts" + - symbol: "NodeToolArtifactStore" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/index.ts" + + - id: "persistence.assistant-message-model-provenance" + kind: "persistence" + label: "Persisted assistant provider and model provenance" + codeSeeds: + - symbol: "persistAssistantMessage" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/message-persistence.ts" + - symbol: "hydrateMessageHistoryFromSession" + file: "apps/ccbuddy-cli/packages/core/src/agent/session-history-hydrator.ts" + + - id: "persistence.task-index" + kind: "persistence" + label: "Task sqlite index" + codeSeeds: + - symbol: "TaskIndexRepo" + file: "packages/services/src/session/taskIndexRepo.ts" + + - id: "persistence.app-settings" + kind: "persistence" + label: "Application settings file" + codeSeeds: + - symbol: "appSettingsSchema" + file: "packages/shared/src/validationAppSettings.ts" + - symbol: "createSettingService" + file: "packages/services/src/setting/settingService.ts" + + - id: "persistence.model-io-jsonl" + kind: "persistence" + label: "Per-session ModelIO JSONL diagnostics" + codeSeeds: + - symbol: "writeModelIODebugRecord" + file: "apps/ccbuddy-cli/packages/adapters/src/model/runner-debug.ts" + - symbol: "readModelTrajectory" + file: "packages/services/src/ccbuddy-agent/modelTrajectory.ts" + + - id: "persistence.project-memory-files" + kind: "persistence" + label: "Local Project Memory Markdown files" + codeSeeds: + - symbol: "resolveProjectMemoryRoot" + file: "apps/ccbuddy-cli/packages/core/src/memory/project-root.ts" + - symbol: "createMemoryService" + file: "packages/services/src/memory/memoryService.ts" + + - id: "persistence.oauth-login-attribution" + kind: "persistence" + label: "OAuth login attribution credential" + codeSeeds: + - symbol: "OAuthCredentialRepo" + file: "packages/services/src/oauth/repo/oauthCredentialRepo.ts" + + - id: "persistence.telemetry-device-mid" + kind: "persistence" + label: "Host telemetry state deviceMid" + codeSeeds: + - symbol: "ensureDesktopDeviceMidSync" + file: "packages/desktop/src/main/desktopDeviceMid.ts" + - symbol: "createTelemetryCore" + file: "packages/services/src/telemetry/telemetryCore.ts" + - symbol: "ensureCliDeviceMid" + file: "apps/ccbuddy-cli/packages/adapters/src/device/cli-device-mid.ts" + + - id: "persistence.native-search-shared-deps" + kind: "persistence" + label: "Immutable native search prebuilt archives" + docs: + - "docs/runtime-tools/embedded-search-native-build.md" + + - id: "persistence.browser-tab-recovery-store" + kind: "persistence" + label: "Legacy disabled Browser tab recovery catalog" + aliases: + - "browser-tab-recovery.json" + - "retired browser tab pageState repository" + docs: + - "docs/browser-use/2026-07-31-browser-tab-residency-budget-spec.md" + + - id: "boundary.desktop-continuous" + kind: "delivery-boundary" + label: "Desktop continuous delivery" + + - id: "boundary.web-remote-replayable" + kind: "delivery-boundary" + label: "Web remote replayable delivery" + + - id: "boundary.workspace-key" + kind: "delivery-boundary" + label: "workspaceIdentity fallback isolation key" + + - id: "capability.composer-trigger-routing" + kind: "capability" + label: "Composer primary and compatibility trigger routing" + aliases: + - "composer prefix routing" + - "mention panel routing" - "@ and slash picker" - - 输入框候选分组 - - 输入框触发器 + - "输入框候选分组" + - "输入框触发器" + docs: + - "docs/ui/mention-panel-layout.md" codeSeeds: - - symbol: extractActivePromptInputTrigger - file: packages/ui/src/lib/promptInputTriggers.ts - - symbol: ChatPromptActionMenu - file: packages/ui/src/prompt-editor/ChatPromptActionMenu.tsx - - id: surface.composer-at-context-picker - kind: ui-surface - label: Composer @ context picker (Plugins, files, sessions, Whiteboards) + - symbol: "extractActivePromptInputTrigger" + file: "packages/ui/src/lib/promptInputTriggers.ts" + - symbol: "ChatPromptActionMenu" + file: "packages/ui/src/prompt-editor/ChatPromptActionMenu.tsx" + + - id: "capability.plan-slash-shortcut" + kind: "capability" + label: "App Composer /plan mode shortcut" + aliases: + - "/plan" + - "Plan mode composer shortcut" + - "Composer Plan 快捷命令" + docs: + - "docs/plan-slash-command.md" + - "docs/conversation-session-case-catalog.md" + codeSeeds: + - symbol: "parseV4VisibleSlashCommand" + file: "packages/ui/src/v4/slashCommands.ts" + - symbol: "SessionPane" + file: "packages/ui/src/v4/SessionPane.tsx" + - symbol: "listProtocolSlashCommands" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/slash-commands.ts" + + - id: "surface.composer-at-context-picker" + kind: "ui-surface" + label: "Composer @ context picker (Plugins, files, sessions, Whiteboards)" aliases: - "@ context picker" - "@ 面板" codeSeeds: - - symbol: MentionPlugin - file: packages/ui/src/mentions/MentionPlugin.tsx - - symbol: useFileMentionProvider - file: packages/ui/src/mentions/providers/fileMentionProvider.ts - - symbol: useSessionsMentionProvider - file: packages/ui/src/mentions/providers/sessionsMentionProvider.ts - - symbol: useWhiteboardMentionProvider - file: packages/ui/src/mentions/providers/whiteboardMentionProvider.ts - - id: surface.composer-slash-capability-picker - kind: ui-surface - label: Composer slash picker (commands, Skills, Subagents) - aliases: - - slash capability picker - - / 面板 - codeSeeds: - - symbol: SlashCommandPlugin - file: packages/ui/src/SlashCommandPlugin.tsx - - symbol: useSlashCommandMentionPanelSections - file: packages/ui/src/slashCommandPanelSections.tsx - - symbol: buildSlashApplyMentionPayload - file: packages/ui/src/lib/slashApplyMentionPayload.ts - - id: surface.composer-skill-compatibility-picker - kind: ui-surface - label: Composer compatible Skill picker ($ and Yen aliases) - aliases: - - $ Skills picker - - $ 面板 - - ¥ 技能面板 - codeSeeds: - - symbol: MentionPlugin - file: packages/ui/src/mentions/MentionPlugin.tsx - - symbol: useSkillsMentionProvider - file: packages/ui/src/mentions/providers/skillsMentionProvider.ts - - id: service.composer-host-file-search - kind: service - label: Host-owned bounded Composer file search - codeSeeds: - - symbol: createFileService - file: packages/services/src/file/fileService.ts - - id: service.conversation-command-inbox - kind: service - label: CLI serial command admission and idempotency - codeSeeds: - - file: apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/command-inbox.ts - symbol: CommandInbox - aliases: - - busy input - - running input - - 命令接纳 - - 输入队列 - - id: state.conversation-product-projection - kind: state-owner - label: CLI authoritative projection of runtime events - codeSeeds: - - file: apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/product-projection.ts - symbol: ProductProjection - - id: service.conversation-topic-publisher - kind: service - label: CLI conversation delta publication and subscription recovery - codeSeeds: - - file: apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/conversation-topic-publisher.ts - symbol: ConversationTopicPublisher - - id: state.composer-submission-intent - kind: state-owner - label: Renderer model intent for the next submission - codeSeeds: - - file: packages/ui/src/v4/SessionPane.tsx - symbol: handleSelectModel - - file: packages/ui/src/v4/SessionPane.tsx - symbol: createComposerSubmissionConfig - - id: service.conversation-submission - kind: service - label: CLI sendText submission handling - codeSeeds: - - file: apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/commands/handlers/session-flow.ts - symbol: sendText - - id: service.runtime-submission-execution - kind: service - label: Runtime applies the admitted submission selection at execution - codeSeeds: - - file: apps/ccbuddy-cli/packages/core/src/runtime/methods/turn-model.ts - symbol: applySubmissionExecutionState + - symbol: "MentionPlugin" + file: "packages/ui/src/mentions/MentionPlugin.tsx" + - symbol: "useFileMentionProvider" + file: "packages/ui/src/mentions/providers/fileMentionProvider.ts" + - symbol: "useSessionsMentionProvider" + file: "packages/ui/src/mentions/providers/sessionsMentionProvider.ts" + - symbol: "useWhiteboardMentionProvider" + file: "packages/ui/src/mentions/providers/whiteboardMentionProvider.ts" + + - id: "service.composer-host-file-search" + kind: "service" + label: "Host-owned bounded Composer file search" + docs: + - "docs/superpowers/specs/2026-08-26-local-file-mention-stability.md" + codeSeeds: + - symbol: "createFileService" + file: "packages/services/src/file/fileService.ts" + + - id: "surface.composer-slash-capability-picker" + kind: "ui-surface" + label: "Composer slash picker (commands, Skills, Subagents)" + aliases: + - "slash capability picker" + - "/ 面板" + codeSeeds: + - symbol: "SlashCommandPlugin" + file: "packages/ui/src/SlashCommandPlugin.tsx" + - symbol: "useSlashCommandMentionPanelSections" + file: "packages/ui/src/slashCommandPanelSections.tsx" + - symbol: "buildSlashApplyMentionPayload" + file: "packages/ui/src/lib/slashApplyMentionPayload.ts" + + - id: "surface.conversation-selection-side-slash" + kind: "ui-surface" + label: "Composer /side and /btw shortcuts with optional text input" + aliases: + - "side slash commands" + - "辅助对话斜杠命令" + docs: + - "docs/ui/conversation-selection-side-chat.md" + codeSeeds: + - symbol: "appSlashCommands" + file: "packages/ui/src/v4/SessionPane.tsx" + - symbol: "parseSelectionSideSlashCommand" + file: "packages/ui/src/v4/slashCommands.ts" + - symbol: "SlashCommandPlugin" + file: "packages/ui/src/SlashCommandPlugin.tsx" + + - id: "capability.session-skill-catalog" + kind: "capability" + label: "Composer workspace/session Skill catalog lifecycle" + aliases: + - "session skill catalog" + - "Skill 候选冻结" + - "新建对话刷新 Skill" + docs: + - "docs/ui/conversation-skill-catalog-lifecycle.md" + - "docs/ui/mention-panel-layout.md" + codeSeeds: + - symbol: "useSkills" + file: "packages/ui/src/hooks/useSkills.ts" + - symbol: "getSkillReferenceCatalog" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/skill-reference-catalog.ts" + + - id: "capability.plugin-source-acquisition" + kind: "capability" + label: "Plugin marketplace and install source acquisition" + aliases: + - "plugin source materialization" + - "GitHub Archive plugin install" + - "plugin install without git" + - "插件来源物化" + - "无 Git 安装插件" + docs: + - "docs/plugin-github-archive-source.md" + - "docs/claude-code-marketplace-plugin-compat.md" + - "docs/plugin-management-lifecycle-case-catalog.md" + codeSeeds: + - symbol: "loadMarketplaceFromSource" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/marketplace.ts" + - symbol: "resolvePluginSourceRoot" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/marketplace.ts" + - symbol: "resolveZipPluginSource" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/zip-source.ts" + + - id: "service.plugin-source-materializer" + kind: "service" + label: "GitHub Archive or system Git plugin source materializer" + codeSeeds: + - symbol: "resolvePluginSourceRoot" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/marketplace.ts" + - symbol: "loadMarketplaceFromSource" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/marketplace.ts" + - symbol: "execGitCommand" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/marketplace.ts" + + - id: "persistence.plugin-marketplace-installed-cache" + kind: "persistence" + label: "Known marketplace snapshots and installed plugin cache" + codeSeeds: + - symbol: "loadKnownMarketplacesSync" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/marketplace.ts" + - symbol: "copyMarketplaceDirectoryPlugins" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/marketplace.ts" + - symbol: "cacheMarketplacePlugin" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/marketplace.ts" + + - id: "boundary.plugin-agent-host" + kind: "delivery-boundary" + label: "Plugin operations execute in the authoritative local or remote Agent Host" + codeSeeds: + - symbol: "updatePluginMarketplace" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/plugins.ts" + - symbol: "PluginSyncService" + file: "packages/services/src/plugin-sync/pluginSyncService.ts" + + - id: "capability.workspace-project-plugin-scope" + kind: "capability" + label: "Claude-shaped User and Workspace Plugin scope with open CCbuddy config" + aliases: + - "Workspace-level Plugin" + - "project Plugin scope" + - "workspace plugin config" + - "项目级插件" + - "工作区插件" + docs: + - "docs/plugins/workspace-level-plugin-architecture.md" + - "docs/plugins/workspace-level-plugin-proposal-comparison.md" + - "docs/plugin-management-lifecycle-case-catalog.md" + codeSeeds: + - symbol: "createConfig" + file: "apps/ccbuddy-cli/packages/adapters/src/config/config-factory.ts" + - symbol: "mergeConfigs" + file: "apps/ccbuddy-cli/packages/adapters/src/config/config-merger.ts" + - symbol: "resolveStartupPlugins" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/startup-marks.ts" + + - id: "surface.workspace-plugin-scope-controls" + kind: "ui-surface" + label: "Plugin User and Workspace configuration views" + aliases: + - "Plugin scope selector" + - "project enable" + - "插件作用域" + codeSeeds: + - symbol: "PluginsSection" + file: "packages/ui/src/settings/PluginsSection.tsx" + - symbol: "PluginScopeMenu" + file: "packages/ui/src/settings/PluginScopeMenu.tsx" + - symbol: "InstalledPluginDetailDialog" + file: "packages/ui/src/settings/InstalledPluginManagement.tsx" + - symbol: "requestPluginStoreOpen" + file: "packages/ui/src/lib/pluginStoreNavigation.ts" + - symbol: "setPendingSettingsPluginIntent" + file: "packages/ui/src/lib/settingsNavigation.ts" + - symbol: "PluginStorePage" + file: "packages/ui/src/settings/PluginStorePage.tsx" + + - id: "state.workspace-plugin-effective-config" + kind: "state-owner" + label: "User and Workspace effective Plugin configuration" + aliases: + - "effective enabledPlugins" + - "Plugin config precedence" + - "插件有效配置" + codeSeeds: + - symbol: "createConfig" + file: "apps/ccbuddy-cli/packages/adapters/src/config/config-factory.ts" + - symbol: "mergeConfigs" + file: "apps/ccbuddy-cli/packages/adapters/src/config/config-merger.ts" + - symbol: "resolveEnabled" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/index.ts" + + - id: "persistence.workspace-plugin-project-config" + kind: "persistence" + label: "Tracked workspace .ccbuddy/config.json Plugin declaration and sensitive options" + aliases: + - ".ccbuddy/config.json plugins" + - "project enabledPlugins" + codeSeeds: + - symbol: "loadProjectConfigs" + file: "apps/ccbuddy-cli/packages/adapters/src/config/project-config.adapter.ts" + - symbol: "resolvePluginConfigPathForScope" + file: "packages/services/src/settings-sync/settingsSyncService.ts" + + - id: "boundary.workspace-plugin-trust" + kind: "delivery-boundary" + label: "Workspace Plugin trust and MCP approval gates intentionally disabled" + aliases: + - "Workspace trust" + - "project Plugin trust" + - "工作区信任" + - "no Workspace trust" + - "no Plugin MCP approval" + docs: + - "docs/plugins/workspace-level-plugin-architecture.md" + - "docs/security/deep-link-project-trust-boundary.md" + + - id: "boundary.workspace-plugin-sensitive-config" + kind: "delivery-boundary" + label: "Plaintext Workspace Plugin credentials and secrets with output redaction" + aliases: + - "project Plugin secret" + - "sensitive plugin options" + - "项目插件凭据" + docs: + - "docs/plugins/workspace-level-plugin-architecture.md" + codeSeeds: + - symbol: "configureCCbuddyPlugin" + file: "apps/ccbuddy-cli/packages/bootstrap/src/plugins.ts" + - symbol: "resolvePluginMcpServers" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/mcp.ts" + - symbol: "PluginConfigControls" + file: "packages/ui/src/settings/PluginConfigControls.tsx" + + - id: "evidence.workspace-project-plugin-cases" + kind: "evidence" + label: "Workspace Plugin lifecycle cases and coverage" + docs: + - "docs/plugin-management-lifecycle-case-catalog.md" + - "docs/testing/plugin-management-lifecycle-e2e-coverage-matrix.md" + + - id: "evidence.plugin-source-acquisition-tests" + kind: "evidence" + label: "No-Git GitHub Archive, refresh isolation and atomic cache tests" + docs: + - "docs/testing/plugin-management-lifecycle-e2e-coverage-matrix.md" + codeSeeds: + - file: "apps/ccbuddy-cli/packages/adapters/tests/plugins.test.ts" + - file: "apps/ccbuddy-cli/packages/bootstrap/tests/marketplace-import-e2e.test.ts" + + - id: "capability.plugin-catalog-runtime-separation" + kind: "capability" + label: "Plugin Catalog and Runtime separation for builtin uninstall/detail" + aliases: + - "builtin plugin uninstall detail" + - "suppressed builtin catalog" + - "内置插件卸载后详情" + - "插件 Catalog Runtime 分离" + docs: + - "docs/specs/builtin-plugin-catalog-runtime-separation.md" + - "docs/plugin-management-lifecycle-case-catalog.md" + - "docs/adr/0001-store-listing-in-marketplace-catalog.md" + codeSeeds: + - symbol: "seedBundledOfficialPlugins" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/bundled-plugins.ts" + - symbol: "writeOfficialMarketplace" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/bundled-plugins.ts" + - symbol: "uninstallCCbuddyMarketplacePlugin" + file: "apps/ccbuddy-cli/packages/bootstrap/src/plugins.ts" + - symbol: "describeMarketplacePlugin" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/marketplace.ts" + - symbol: "discoverNodePluginsSync" + file: "apps/ccbuddy-cli/packages/adapters/src/plugins/index.ts" + - symbol: "buildStoreItems" + file: "packages/ui/src/settings/pluginStoreListing.ts" + - symbol: "PluginStoreDetailView" + file: "packages/ui/src/settings/PluginStoreDetailView.tsx" + + - id: "state.plugin-runtime-suppression" + kind: "state-owner" + label: "User-owned suppressed builtin runtime filter" + docs: + - "docs/specs/builtin-plugin-catalog-runtime-separation.md" + codeSeeds: + - symbol: "suppressedBuiltins" + file: "apps/ccbuddy-cli/packages/adapters/src/config/schema.ts" + - symbol: "addSuppressedBuiltinInFileConfig" + file: "apps/ccbuddy-cli/packages/adapters/src/config/file-config.adapter.ts" + - symbol: "removeSuppressedBuiltinInFileConfig" + file: "apps/ccbuddy-cli/packages/adapters/src/config/file-config.adapter.ts" + + - id: "service.plugin-catalog-detail" + kind: "service" + label: "Read-only Marketplace plugin detail and component enumeration" + docs: + - "docs/specs/builtin-plugin-catalog-runtime-separation.md" + - "docs/plugin-marketplace-ui-ux.md" + codeSeeds: + - symbol: "describeCCbuddyPlugin" + file: "apps/ccbuddy-cli/packages/bootstrap/src/plugins.ts" + - symbol: "describePlugin" + file: "packages/ui/src/store/pluginManagementStore.ts" + - symbol: "PluginStoreDetailView" + file: "packages/ui/src/settings/PluginStoreDetailView.tsx" + + - id: "evidence.plugin-catalog-runtime-tests" + kind: "evidence" + label: "Builtin uninstall/detail parity and Catalog/Runtime separation tests" + docs: + - "docs/plugin-management-lifecycle-case-catalog.md" + - "docs/testing/plugin-management-lifecycle-e2e-coverage-matrix.md" + codeSeeds: + - file: "apps/ccbuddy-cli/packages/bootstrap/tests/plugins.test.ts" + - file: "apps/ccbuddy-cli/packages/adapters/tests/plugins.test.ts" + - file: "packages/ui/test/pluginStoreListing.test.ts" + + - id: "capability.plugin-reference" + kind: "capability" + label: "Plugin conversation reference (@ Plugin capability hint)" + aliases: + - "plugin mention" + - "plugin reference" + - "@ plugin" + - "plugin_reference reminder" + - "插件引用" + - "引用插件" + docs: + - "docs/plugin-reference-mention.md" + + - id: "surface.composer-mention-plugins" + kind: "ui-surface" + label: "Plugin group and chip inside the Composer @ context picker" + aliases: + - "plugins mention group" + - "plugin chip" + - "@ 面板 Plugins 分组" + codeSeeds: + - symbol: "usePluginsMentionProvider" + file: "packages/ui/src/mentions/providers/pluginsMentionProvider.ts" + - symbol: "MentionPlugin" + file: "packages/ui/src/mentions/MentionPlugin.tsx" + - symbol: "buildPluginMentionMarkdown" + file: "packages/ui/src/mentions/mentionMarkdown.ts" + + - id: "surface.plugin-store-example-prompt-try" + kind: "ui-surface" + label: "Plugin Store Try now and example prompt entries" + aliases: + - "plugin store try" + - "try now" + - "example prompt try" + - "插件商店试用" + - "立即试用" + - "示例提示词胶囊" + codeSeeds: + - symbol: "PluginStoreDetailView" + file: "packages/ui/src/settings/PluginStoreDetailView.tsx" + - symbol: "handleUsePrompt" + file: "packages/ui/src/settings/PluginsSection.tsx" + - symbol: "buildPluginMentionMarkdown" + file: "packages/ui/src/mentions/mentionMarkdown.ts" + + - id: "surface.new-task-suggested-prompts" + kind: "ui-surface" + label: "New Task draft suggested prompt prefill" + aliases: + - "draft suggested prompts" + - "recommended prompt pills" + - "New Task 推荐提示词" + - "草稿页推荐提示词" + docs: + - "docs/ui/conversation-draft-suggested-prompts.md" + codeSeeds: + - symbol: "getRecommendedPromptPool" + file: "packages/ui/src/v4/featureSuggestedPrompts.ts" + - symbol: "getRecommendedPromptsForPane" + file: "packages/ui/src/v4/featureSuggestedPromptRotation.ts" + - symbol: "ConversationDraftSuggestedPrompts" + file: "packages/ui/src/v4/ConversationDraftSuggestedPrompts.tsx" + - symbol: "ConversationDraftSuggestedPromptsContainer" + file: "packages/ui/src/v4/ConversationDraftSuggestedPromptsContainer.tsx" + - symbol: "buildDraftSuggestedPromptPrefill" + file: "packages/ui/src/v4/draftSuggestedPromptPrefill.ts" + - symbol: "mapClientScenesToDraftSuggestedPromptItems" + file: "packages/ui/src/v4/draftSuggestedPromptItems.ts" + - symbol: "SessionPane" + file: "packages/ui/src/v4/SessionPane.tsx" + + - id: "service.client-scenes" + kind: "service" + label: "CCbuddy Client Scenes option source" + aliases: + - "clientScenesService" + - "draft-suggestion scene" + - "scheduled-task scene" + - "off-peak-task scene" + - "推荐提示词配置" + docs: + - "docs/ccbuddy-client-scenes-api.md" + codeSeeds: + - symbol: "IClientScenesService" + file: "packages/services/src/client-scenes/clientScenes.ts" + - symbol: "createClientScenesService" + file: "packages/services/src/client-scenes/clientScenesService.ts" + + - id: "shared-ui.automation-template-catalog" + kind: "shared-ui" + label: "Client Scenes automation template mapper and loader" + codeSeeds: + - symbol: "mapClientScenesToAutomationTemplates" + file: "packages/ui/src/settings/automationTemplateCatalog.ts" + - symbol: "useAutomationTemplates" + file: "packages/ui/src/settings/useAutomationTemplates.ts" + + - id: "state.plugin-reference-session-catalog" + kind: "state-owner" + label: "Session-frozen plugin identity catalog" + aliases: + - "plugin reference catalog" + - "session plugin catalog" + - "冻结插件目录" + codeSeeds: + - symbol: "buildPluginReferenceCatalog" + file: "apps/ccbuddy-cli/packages/core/src/plugin-reference/catalog.ts" + - symbol: "resolveStartupPlugins" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/startup-marks.ts" + + - id: "state.session-skill-catalog" + kind: "state-owner" + label: "Agent runtime-frozen Session Skill catalog" + aliases: + - "skillLoadOutcome" + - "Session Skill 快照" + codeSeeds: + - symbol: "getSkillCatalog" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/context.ts" + - symbol: "ensureContextInitialized" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/context.ts" + + - id: "service.skill-reference-catalog" + kind: "service" + label: "skills/referenceCatalog protocol query (session vs workspace authority)" + codeSeeds: + - symbol: "getSkillReferenceCatalog" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/skill-reference-catalog.ts" + - symbol: "getSkillReferenceCatalog" + file: "packages/services/src/ccbuddy-agent/ccbuddyAgentService.ts" + + - id: "service.plugin-reference-catalog" + kind: "service" + label: "plugins/referenceCatalog protocol query (session vs workspace authority)" + codeSeeds: + - symbol: "getPluginReferenceCatalog" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/plugins.ts" + - symbol: "getPluginReferenceCatalog" + file: "packages/services/src/ccbuddy-agent/ccbuddyAgentService.ts" + + - id: "service.suggested-plugin-reference-resolution" + kind: "service" + label: "Trusted suggested-prompt Plugin refresh, install candidate resolution, and cancellation" + aliases: + - "plugins/resolveSuggestedReference" + - "推荐插件可信解析" + - "推荐提示词一键安装" + docs: + - "docs/ui/conversation-draft-suggested-prompts.md" + - "docs/plugin-management-lifecycle-case-catalog.md" + codeSeeds: + - symbol: "resolveSuggestedPluginReference" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/plugin-reference-catalog.ts" + - symbol: "withPluginOperationSignal" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/server.ts" + - symbol: "resolveSuggestedPluginReference" + file: "packages/services/src/ccbuddy-agent/ccbuddyAgentService.ts" + + - id: "service.plugin-reference-reminder" + kind: "service" + label: "Turn plugin_reference reminder injection (live capability intersection)" + codeSeeds: + - symbol: "buildPluginReferenceReminderBody" + file: "apps/ccbuddy-cli/packages/core/src/plugin-reference/reminder.ts" + - symbol: "injectPluginReferenceReminderFromTurn" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/plugin-reference.ts" + + - id: "persistence.plugin-reference-reminder-history" + kind: "persistence" + label: "Append-only model-only plugin_reference notices in session history" + codeSeeds: + - symbol: "persistSyntheticUserNoticeForSession" + file: "apps/ccbuddy-cli/packages/core/src/runtime/methods/message-persistence.ts" + - symbol: "hydrateMessageHistoryFromSession" + file: "apps/ccbuddy-cli/packages/core/src/agent/session-history-hydrator.ts" + + - id: "boundary.local-development-runtime" + kind: "delivery-boundary" + label: "Local source development runtime" + + - id: "boundary.packaged-desktop-runtime" + kind: "delivery-boundary" + label: "Packaged Stable or Preview desktop runtime" + + - id: "boundary.ccbuddy-cli-provider-transport" + kind: "delivery-boundary" + label: "CCbuddy CLI default AI SDK provider transport" + + - id: "boundary.cua-desktop-local" + kind: "delivery-boundary" + label: "macOS and Windows desktop-local CUA authorization boundary" + + - id: "evidence.conversation-catalog" + kind: "evidence" + label: "Conversation case catalog and E2E matrix" + docs: + - "docs/conversation-session-case-catalog.md" + - "docs/testing/conversation-session-e2e-coverage-matrix.md" + + - id: "evidence.conversation-fault-catalog" + kind: "evidence" + label: "Conversation environment fault catalog and coverage matrix" + docs: + - "docs/testing/conversation-session-environment-fault-catalog.md" + - "docs/testing/conversation-session-fault-e2e-coverage-matrix.md" + - "docs/testing/conversation-session-network-sse-decision-worksheet.md" + codeSeeds: + - file: "apps/ccbuddy-cli/packages/core/tests/runtime-stream-recovery.test.ts" + - file: "apps/ccbuddy-cli/packages/bootstrap/tests/product-projection.test.ts" + + - id: "evidence.development-storage-isolation" + kind: "evidence" + label: "Development storage Docker E2E and path tests" + codeSeeds: + - file: "packages/desktop/test/e2e/conversation-session/conversation-session-development-storage-isolation.test.ts" + - file: "packages/shared/test/storageProfile.test.ts" + - file: "packages/desktop/test/desktopStorageProfile.test.ts" + + - id: "evidence.model-io-full-retention-tests" + kind: "evidence" + label: "ModelIO full retention schema, UI, protocol, and writer tests" + codeSeeds: + - file: "packages/shared/test/appSettings.test.ts" + - file: "packages/ui/test/settingsDataBaseDirControl.test.ts" + - file: "packages/ui/test/useSettingServiceAutoResolution.test.ts" + - file: "packages/services/test/ccbuddyAgentService.test.ts" + - file: "apps/ccbuddy-cli/packages/bootstrap/tests/ccbuddy-protocol.test.ts" + - file: "apps/ccbuddy-cli/packages/adapters/tests/runner.test.ts" + + - id: "evidence.model-request-session-type-tests" + kind: "evidence" + label: "Model request session type classification and transport tests" + codeSeeds: + - file: "apps/ccbuddy-cli/packages/core/tests/model-request-session-type.test.ts" + - file: "apps/ccbuddy-cli/packages/adapters/tests/runner-options.test.ts" + - file: "apps/ccbuddy-cli/packages/adapters/tests/runner.test.ts" + + - id: "evidence.mcp-runtime-tests" + kind: "evidence" + label: "MCP runtime, tool bridge, and lifecycle tests" + codeSeeds: + - file: "apps/ccbuddy-cli/packages/core/tests/mcp-runtime.test.ts" + - file: "apps/ccbuddy-cli/packages/core/tests/mcp-tool-bridge.test.ts" + - file: "apps/ccbuddy-cli/packages/adapters/tests/mcp.test.ts" + - file: "apps/ccbuddy-cli/packages/adapters/tests/mcp-process-lifecycle.test.ts" + - file: "apps/ccbuddy-cli/packages/adapters/tests/mcp-version-negotiation.test.ts" + - file: "packages/desktop/test/upstreamReplayServer.test.ts" + - file: "packages/desktop/test/e2e/settings/mcp-dual-era-version-negotiation.test.ts" + - file: "packages/desktop/test/e2e/conversation-session/manual-review/pending/conversation-session-browser-use-iab-multisession.test.ts" + + - id: "capability.window-single-host-controller-r1" + kind: "capability" + label: "R1 window-scoped single Host controller" + aliases: + - "single window Host" + - "窗口唯一 Host" + - "R1 Host controller" + docs: + - "docs/architecture/r1-single-window-host-refactor.md" + - "docs/architecture/ccbuddy-code-architecture-overview.md" + codeSeeds: + - symbol: "createRemoteWorkspaceSessionManager" + file: "packages/desktop/src/main/desktopRemoteSessions.ts" + - file: "packages/desktop/src/host/index.ts" + - symbol: "useGlobalTaskList" + file: "packages/ui/src/hooks/useGlobalTaskList.ts" + - symbol: "createWebRemoteControlSharedHostAttachments" + file: "packages/desktop/src/main/webRemoteControlSharedHostAttachments.ts" + + - id: "state.window-host-controller-projection" + kind: "state-owner" + label: "Window Host workspace and task projection" + docs: + - "docs/architecture/r1-single-window-host-refactor.md" + - "docs/web-remote-control/task-realtime-sync.md" + codeSeeds: + - symbol: "useGlobalTaskList" + file: "packages/ui/src/hooks/useGlobalTaskList.ts" + - file: "packages/services/src/task-index" + + - id: "service.window-host-remote-connection-registry" + kind: "service" + label: "Window Host remote connection and logical session registry" + docs: + - "docs/architecture/r1-single-window-host-refactor.md" + codeSeeds: + - symbol: "createWindowRemoteConnectionRegistry" + file: "packages/desktop/src/host/windowRemoteConnectionRegistry.ts" + - symbol: "createRemoteWorkspaceSessionManager" + file: "packages/desktop/src/main/desktopRemoteSessions.ts" + + - id: "boundary.window-host-scoped-service-attachment" + kind: "boundary" + label: "Window Host local and remote scoped MessagePort attachment" + docs: + - "docs/architecture/r1-single-window-host-refactor.md" + - "docs/web-remote-control/web-remote-control-architecture.md" + codeSeeds: + - file: "packages/desktop/src/host/index.ts" + - symbol: "createWebRemoteControlSharedHostAttachments" + file: "packages/desktop/src/main/webRemoteControlSharedHostAttachments.ts" + - file: "packages/desktop/src/renderer/src/main.tsx" + + - id: "evidence.ssh-remote-p0-e2e" + kind: "evidence" + label: "Real SSH connection lifecycle and multi-workspace P0 Electron E2E" + docs: + - "docs/testing/ssh-remote-p0-e2e-plan.md" + - "docs/conversation-session-case-catalog.md" + - "docs/testing/conversation-session-e2e-coverage-matrix.md" + codeSeeds: + - file: "packages/desktop/test/e2e/conversation-session/conversation-session-ssh-remote-p0.test.ts" + - file: "packages/desktop/test/e2e/conversation-session/manual-review/pending/conversation-session-ssh-remote-cancel-retry.test.ts" + + - id: "capability.unified-ccbuddy-lite-server" + kind: "capability" + label: "Unified CCbuddy Lite and multi-server control" + aliases: + - "CCbuddy Lite" + - "multi-server" + - "unified remote architecture" + - "统一多端架构" + - "多 Server 管理" + docs: + - "docs/architecture/unified-ccbuddy-lite-server-multi-server-plan.md" + - "docs/architecture/ccbuddy-code-architecture-overview.md" + + - id: "surface.multi-server-controller-ui" + kind: "ui-surface" + label: "Desktop, Browser, and attached Mobile multi-server view" + docs: + - "docs/architecture/unified-ccbuddy-lite-server-multi-server-plan.md" + codeSeeds: + - symbol: "Root" + file: "packages/ui/src/Root.tsx" + - file: "packages/web/src/main.tsx" + - file: "packages/desktop/src/renderer/src/main.tsx" + + - id: "state.controller-server-directory" + kind: "state-owner" + label: "Controller-local server connections and aggregate projection" + docs: + - "docs/architecture/unified-ccbuddy-lite-server-multi-server-plan.md" + + - id: "service.ccbuddy-stable-launcher" + kind: "service" + label: "Planned stable launcher, bootstrap, and version runtime manager" + docs: + - "docs/architecture/unified-ccbuddy-lite-server-multi-server-plan.md" + + - id: "service.multi-server-controller" + kind: "service" + label: "Planned Desktop and Lite multi-server connection controller" + docs: + - "docs/architecture/unified-ccbuddy-lite-server-multi-server-plan.md" + codeSeeds: + - symbol: "connectRemote" + file: "packages/server/src/remote/connect.ts" + - symbol: "createRemoteWorkspaceSessionManager" + file: "packages/desktop/src/main/desktopRemoteSessions.ts" + + - id: "persistence.ccbuddy-server-identity" + kind: "persistence" + label: "Planned persistent server identity and server-local workspace registry" + docs: + - "docs/architecture/unified-ccbuddy-lite-server-multi-server-plan.md" + + - id: "persistence.ccbuddy-resource-store" + kind: "persistence" + label: "Planned source-server prompt resource store" + docs: + - "docs/architecture/unified-ccbuddy-lite-server-multi-server-plan.md" + - "docs/remote-prompt-attachment-materialization.md" + + - id: "boundary.unified-server-transport" + kind: "delivery-boundary" + label: "Transport-independent Server RPC over local, WebSocket, and SSH tunnel" + docs: + - "docs/architecture/unified-ccbuddy-lite-server-multi-server-plan.md" + - "docs/architecture/rpc.md" + + - id: "evidence.browser-screenshot-surface-tests" + kind: "evidence" + label: "Browser screenshot surface and bounded activity coverage" + codeSeeds: + - file: "packages/desktop/test/browserScreenshotSurfaceCoordinator.test.ts" + - file: "packages/desktop/test/browserScreenshotSurfaceCoordinatorWiring.test.ts" + - file: "packages/desktop/test/browserScreenshotActivityController.test.ts" + - file: "packages/desktop/test/browserGuestManager.test.ts" + - file: "packages/desktop/scripts/browser-background-activity-smoke.mjs" + + - id: "evidence.browser-webview-video-recording-tests" + kind: "evidence" + label: "Browser WebView recording schema, SDK, main, artifact and runtime coverage" + codeSeeds: + - file: "packages/shared/test/browserControlProtocol.test.ts" + - file: "apps/ccbuddy-cli/packages/core/tests/browser-client.test.ts" + - file: "packages/desktop/test/browserGuestManager.test.ts" + - file: "packages/desktop/test/browserControlMainBridge.test.ts" + - file: "packages/desktop/test/browserRecordingArtifactMaterializer.test.ts" + - file: "packages/desktop/test/browserVideoRecorder.test.ts" + + - id: "evidence.embedded-browser-network-policy-tests" + kind: "evidence" + label: "Desktop Chromium Session network policy target and certificate tests" + docs: + - "docs/testing/browser-use-codex-parity-coverage-matrix.md" + codeSeeds: + - file: "packages/desktop/test/desktopNetworkPolicy.test.ts" + + - id: "evidence.host-api-network-policy-tests" + kind: "evidence" + label: "Host API proxy, No Proxy, custom CA, lifecycle, and remote-authority tests" + docs: + - "docs/superpowers/specs/2026-08-25-host-api-proxy-design.md" + codeSeeds: + - file: "packages/services/test/nodeApiClient.test.ts" + - file: "packages/services/test/nodeApiClientEndpoint.test.ts" + - file: "packages/desktop/src/host/remoteWorkspaceServiceCollection.ts" + + - id: "evidence.embedded-browser-responsive-viewport-tests" + kind: "evidence" + label: "Responsive browser viewport interaction coverage" + codeSeeds: + - file: "packages/ui/test/UnifiedBrowserView.test.ts" + - file: "packages/shared/test/appSettings.test.ts" + - file: "packages/desktop/test/e2e/browser-human-viewport-preference.test.ts" + + - id: "evidence.browser-use-agent-guidance-tests" + kind: "evidence" + label: "Browser Use bundled and fallback agent guidance coverage" + codeSeeds: + - file: "apps/ccbuddy-cli/packages/core/tests/browser-manifest.test.ts" + + - id: "evidence.browser-use-plugin-distribution-tests" + kind: "evidence" + label: "Browser Use package, manifest, seed, SEA, and cache version alignment coverage" + codeSeeds: + - file: "apps/ccbuddy-cli/packages/bootstrap/tests/plugins.test.ts" + - file: "apps/ccbuddy-cli/packages/bootstrap/tests/bundled-plugins-resilience.test.ts" + - file: "apps/ccbuddy-cli/packages/cli/tests/build-sea.test.mjs" + - file: "apps/ccbuddy-cli/packages/adapters/tests/plugins.test.ts" + - file: "apps/ccbuddy-cli/packages/node-repl-host/test/mcp-server.test.ts" + - file: "packages/server/test/remoteDeploy.test.ts" + - file: "packages/desktop/test/runtime-asset-scripts.test.ts" + - id: "capability.side-pane-tab-strip" + kind: "capability" + label: "Responsive Side Pane tab strip" + aliases: + - "side panel tabs" + - "side pane tabs" + - "侧边面板标签" + docs: + - "docs/ui/side-pane-tabs.md" + - "docs/testing/side-pane-tabs-e2e-case-catalog.md" + - "docs/testing/side-pane-tabs-e2e-coverage-matrix.md" + codeSeeds: + - symbol: "AnimatedSidePanePanel" + file: "packages/ui/src/app-shell/AnimatedSidePanePanel.tsx" + - symbol: "SortableSidePaneTabTrigger" + file: "packages/ui/src/app-shell/SidePaneTabTrigger.tsx" + - symbol: "SidePaneTabTitleTooltip" + file: "packages/ui/src/app-shell/SidePaneTabTitleTooltip.tsx" + + - id: "surface.workspace-side-pane-tab-strip" + kind: "ui-surface" + label: "Workspace Side Pane tab strip" + codeSeeds: + - symbol: "AnimatedSidePanePanel" + file: "packages/ui/src/app-shell/AnimatedSidePanePanel.tsx" + + - id: "capability.windows-window-chrome" + kind: "capability" + label: "Windows version-aware workspace window chrome" + aliases: + - "Windows rounded corners" + - "Windows maximize chrome" + - "Windows 窗口圆角" + docs: + - "docs/ui/windows-titlebar-menu.md" + codeSeeds: + - symbol: "useAppChromeState" + file: "packages/ui/src/app-shell/useAppChromeState.ts" + + - id: "surface.workspace-shell-window-edge" + kind: "ui-surface" + label: "Workspace shell outer window edge" + docs: + - "docs/ui/windows-titlebar-menu.md" + codeSeeds: + - symbol: "WorkspaceShellLayout" + file: "packages/ui/src/app-shell/WorkspaceShellLayout.tsx" + + - id: "state.desktop-window-chrome" + kind: "state-owner" + label: "Electron BrowserWindow maximize and Windows build state" + codeSeeds: + - symbol: "createBrowserWindow" + file: "packages/desktop/src/main/desktopWindowChrome.ts" + + - id: "evidence.browser-tab-residency-tests" + kind: "evidence" + label: "Browser tab residency policy, persistence, lifecycle, and Electron resource evidence" + docs: + - "docs/conversation-session-case-catalog.md" + - "docs/testing/conversation-session-e2e-coverage-matrix.md" + - "docs/testing/browser-use-codex-parity-coverage-matrix.md" + codeSeeds: + - file: "packages/desktop/test/browserGuestManager.test.ts" + - file: "packages/ui/test/UnifiedBrowserView.test.ts" + + - id: "capability.workspace-hook-persistent-trust" + kind: "capability" + label: "Workspace Hook persistent trust and runtime admission" + aliases: + - "workspace hook trust" + - "hook trust" + - "workspace hook review" + - "工作区 Hook 信任" + - "钩子信任" + docs: + - "docs/specs/workspace-hook-trust-persistent-only.md" + codeSeeds: + - symbol: "WorkspaceHookReviewController" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/workspace-hook-review-controller.ts" + - symbol: "useWorkspaceHookInlineTrust" + file: "packages/ui/src/settings/useWorkspaceHookInlineTrust.ts" + + - id: "capability.conversation-hook-turn-summary" + kind: "capability" + label: "Conversation turn Hook execution summary" + aliases: + - "Hook UI" + - "Hook execution summary" + - "conversation Hook icon" + - "对话钩子图标" + - "本轮钩子" + docs: + - "docs/chat/conversation-hook-turn-summary.md" + codeSeeds: + - symbol: "ProductProjection.onHookRunLifecycle" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/product-projection.ts" + - symbol: "ConversationHookDetailsAction" + file: "packages/ui/src/v4/ConversationHookDetailsAction.tsx" + - symbol: "ConversationTurnGroup" + file: "packages/ui/src/v4/ConversationTurnGroup.tsx" + + - id: "surface.conversation-turn-hook-summary" + kind: "ui-surface" + label: "Conversation terminal turn Hook action and details Popover" + docs: + - "docs/chat/conversation-hook-turn-summary.md" + codeSeeds: + - symbol: "ConversationHookDetailsAction" + file: "packages/ui/src/v4/ConversationHookDetailsAction.tsx" + - symbol: "ConversationAssistantTextActions" + file: "packages/ui/src/v4/ConversationRowView.tsx" + - symbol: "ConversationTurnGroup" + file: "packages/ui/src/v4/ConversationTurnGroup.tsx" + + - id: "surface.workspace-hook-settings-trust-row" + kind: "ui-surface" + label: "Settings Workspace Hook trust row" + docs: + - "docs/specs/workspace-hook-trust-persistent-only.md" + codeSeeds: + - symbol: "HooksSection" + file: "packages/ui/src/settings/HooksSection.tsx" + - symbol: "HooksList" + file: "packages/ui/src/settings/HooksList.tsx" + + - id: "capability.hooks-settings" + kind: "capability" + label: "Scoped Hooks settings and plugin Hook projection" + aliases: + - "Hooks settings" + - "钩子设置" + docs: + - "docs/settings-hook-list.md" + - "docs/hooks-runtime-contract.md" + - "docs/plugin-hooks-compat.md" + codeSeeds: + - symbol: "HooksSection" + file: "packages/ui/src/settings/HooksSection.tsx" + - symbol: "HooksList" + file: "packages/ui/src/settings/HooksList.tsx" + - symbol: "HookForm" + file: "packages/ui/src/settings/HookForm.tsx" + + - id: "surface.hooks-settings" + kind: "ui-surface" + label: "Independent Hooks settings page" + codeSeeds: + - symbol: "HooksSection" + file: "packages/ui/src/settings/HooksSection.tsx" + + - id: "state.hooks-settings-store" + kind: "state-owner" + label: "Workspace-isolated Hooks settings store" + codeSeeds: + - symbol: "useHooksStore" + file: "packages/ui/src/store/hooksStore.ts" + + - id: "persistence.hooks-config-files" + kind: "persistence" + label: "User and workspace .ccbuddy Hook configuration files" + docs: + - "docs/hooks-runtime-contract.md" + + - id: "state.workspace-hook-review-renderer-binding" + kind: "state-owner" + label: "Renderer Workspace Hook command and immutable review bindings" + codeSeeds: + - symbol: "useWorkspaceHookReviewStore" + file: "packages/ui/src/store/workspaceHookReviewStore.ts" + + - id: "service.workspace-hook-runtime-review-controller" + kind: "service" + label: "Runtime Workspace Hook review and Trust mutation controller" + codeSeeds: + - symbol: "WorkspaceHookReviewController" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/workspace-hook-review-controller.ts" + + - id: "service.workspace-hook-settings-pretrust" + kind: "service" + label: "Workspace-scoped Settings pretrust authority without a task" + codeSeeds: + - symbol: "grantWorkspaceHookTrust" + file: "apps/ccbuddy-cli/packages/bootstrap/src/workspace-hook-trust-cli.ts" + - symbol: "grantWorkspaceHookTrustForProtocol" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/workspace-hook-trust.ts" + - symbol: "createHooksService" + file: "packages/services/src/hooks/hooksService.ts" + + - id: "state.workspace-hook-managed-policy" + kind: "state-owner" + label: "Trusted Host-owned Workspace Hook managed policy provider" + codeSeeds: + - symbol: "WorkspaceHookPolicyProvider" + file: "apps/ccbuddy-cli/packages/core/src/hooks/workspace-hook-policy.ts" + - symbol: "CCbuddyProtocolAgentDependencies" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol/server-types.ts" + + - id: "persistence.workspace-hook-trust-store" + kind: "persistence" + label: "User-owned Workspace Hook persistent Trust store" + codeSeeds: + - symbol: "FileWorkspaceHookTrustStore" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/workspace-hook-trust-store.ts" + + - id: "evidence.workspace-hook-persistent-trust-tests" + kind: "evidence" + label: "Workspace Hook Settings, controller, identity, and Trust store coverage" + codeSeeds: + - file: "packages/ui/test/hooksSection.test.ts" + - file: "packages/ui/test/workspaceHookInlineTrust.test.ts" + - file: "packages/ui/test/workspaceHookReviewStore.test.ts" + - file: "apps/ccbuddy-cli/packages/bootstrap/tests/workspace-hook-review-controller.test.ts" + - file: "apps/ccbuddy-cli/packages/adapters/tests/workspace-hook-trust-store.test.ts" + - id: "capability.workflow-run-confirmation" + kind: "capability" + label: "CreateWorkflow run confirmation gate with analysis preview" + aliases: + - "workflow confirmation" + - "run this workflow" + - "CreateWorkflow permission" + - "运行工作流确认" + - "工作流权限" + docs: + - "docs/dynamic-workflow/launch.md" + - "apps/ccbuddy-cli/packages/dynamic-workflow/docs/analysis.md" + codeSeeds: + - symbol: "createWorkflowToolEntry" + file: "apps/ccbuddy-cli/packages/core/src/tool/handlers/create-workflow.ts" + - symbol: "resolveToolPermission" + file: "apps/ccbuddy-cli/packages/core/src/tool/executor/permission-flow.ts" + - symbol: "buildProtocolPermissionOptions" + file: "apps/ccbuddy-cli/packages/bootstrap/src/permission-options.ts" + - symbol: "onPermissionRequested" + file: "apps/ccbuddy-cli/packages/bootstrap/src/ccbuddy-protocol-v4/product-projection.ts" + + - id: "surface.workflow-run-confirmation-dialog" + kind: "ui-surface" + label: "Workflow run confirmation permission block (graph primary, folded script)" + aliases: + - "workflow permission block" + - "工作流确认弹窗" + codeSeeds: + - symbol: "WorkflowPermissionBlock" + file: "packages/ui/src/WorkflowPermissionBlock.tsx" + - symbol: "PermissionDialog" + file: "packages/ui/src/PermissionDialog.tsx" + - symbol: "pendingPermissionToLegacyRequest" + file: "packages/ui/src/v4/pendingInteractionAdapter.ts" + + - id: "capability.workflow-live-run" + kind: "capability" + label: "Dynamic workflow live run: engine submit, background lifecycle and live progress" + aliases: + - "workflow live run" + - "workflow execution engine wiring" + - "dynamic workflow run" + - "workflowRuns state key" + - "工作流实时运行" + - "工作流执行引擎接线" + - "运行工作流" + docs: + - "docs/dynamic-workflow/presentation.md" + - "apps/ccbuddy-cli/packages/dynamic-workflow/docs/execution-engine.md" + - "apps/ccbuddy-cli/packages/dynamic-workflow/docs/analysis.md" + codeSeeds: + - symbol: "createWorkflowToolEntry" + file: "apps/ccbuddy-cli/packages/core/src/tool/handlers/create-workflow.ts" + - symbol: "runWorkflowScript" + file: "apps/ccbuddy-cli/packages/dynamic-workflow-runtime/src/harness.ts" + - symbol: "WorkflowEngine" + file: "apps/ccbuddy-cli/packages/dynamic-workflow/src/engine/engine.ts" + - symbol: "createAgentRuntimeWorkflowDriver" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/workflow-driver.ts" + - symbol: "createScriptWorkflowAgentRuntime" + file: "apps/ccbuddy-cli/packages/bootstrap/src/app/script-workflow-child-runtime.ts" + - symbol: "BackgroundTaskTracker" + file: "apps/ccbuddy-cli/packages/core/src/tool/executor/background-tasks.ts" + - symbol: "statePatchSchema" + file: "packages/shared/src/ccbuddy-protocol-v4/delta.ts" + - symbol: "createDwfJournalStore" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/session-store/repositories/dwf-journal.ts" + + - id: "surface.workflow-run-detail-pane" + kind: "ui-surface" + label: "Workflow run side-pane tab (live causality graph, budget, cancel, event log)" + aliases: + - "workflow-run tab" + - "workflow run detail" + - "live workflow graph" + - "工作流运行详情" + - "工作流实时图" + docs: + - "docs/dynamic-workflow/presentation.md" + codeSeeds: + - symbol: "WorkflowCausalityGraph" + file: "packages/ui/src/components/workflow-graph/workflow-causality-graph.tsx" + - symbol: "WorkflowStepFlowNode" + file: "packages/ui/src/components/workflow-graph/step-node.tsx" + - symbol: "WorkspaceSidePaneTab" + file: "packages/ui/src/lib/workspaceSidePane.ts" + + - id: "surface.workflow-actor-transcript" + kind: "ui-surface" + label: "Workflow actor transcript drill-down (read-only nested SessionPane)" + aliases: + - "actor transcript tab" + - "workflow agent session" + - "工作流 actor 会话" + - "工作流智能体 transcript" + docs: + - "docs/dynamic-workflow/presentation.md" + - "docs/subagent-session-side-tabs.md" + codeSeeds: + - symbol: "SubagentSessionSidePane" + file: "packages/ui/src/app-shell/SubagentSessionSidePane.tsx" + - symbol: "SessionPane" + file: "packages/ui/src/v4/SessionPane.tsx" + + - id: "surface.workflow-tool-card-run-state" + kind: "ui-surface" + label: "CreateWorkflow tool card run state (compact clickable card once a run is joined)" + aliases: + - "workflow tool card" + - "workflow started card" + - "工作流工具卡" + - "工作流卡片运行态" + docs: + - "docs/dynamic-workflow/presentation.md" + codeSeeds: + - symbol: "CreateWorkflowToolCallBlock" + file: "packages/ui/src/ToolCallBlocks/renderers/create-workflow.tsx" + - symbol: "workflowRunByToolCallId" + file: "packages/ui/src/v4/SessionPane.tsx" + + - id: "surface.workflow-task-island" + kind: "ui-surface" + label: "Workflows section in the conversation status capsule (Task Island) showing running workflow runs" + aliases: + - "task island" + - "workflow island" + - "workflow running pill" + - "任务岛" + - "工作流浮岛" + - "工作流分区" + docs: + - "docs/dynamic-workflow/presentation.md" + codeSeeds: + - symbol: "WorkflowStatusSection" + file: "packages/ui/src/v4/ConversationStatusPanel.tsx" + - symbol: "buildRunningWorkflowRuns" + file: "packages/ui/src/v4/conversationStatusPanelModel.ts" + - symbol: "getComposerBackgroundWorkCounts" + file: "packages/ui/src/v4/composer/ConversationBackgroundWorkTrigger.tsx" + + - id: "capability.workflow-run-introspection" + kind: "capability" + label: "Workflow run introspection tools: ListWorkflowRuns / GetWorkflowRun read-only model tools over the dwf journal" + aliases: + - "list workflow runs" + - "workflow run status tool" + - "ListWorkflowRuns" + - "GetWorkflowRun" + - "工作流运行列表" + - "工作流状态查询" + - "工作流内省工具" + docs: + - "docs/dynamic-workflow/launch.md" + codeSeeds: + - symbol: "listWorkflowRunsToolEntry" + file: "apps/ccbuddy-cli/packages/core/src/tool/handlers/list-workflow-runs.ts" + - symbol: "getWorkflowRunToolEntry" + file: "apps/ccbuddy-cli/packages/core/src/tool/handlers/get-workflow-run.ts" + - symbol: "createDwfJournalStore" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/session-store/repositories/dwf-journal.ts" + + - id: "surface.submit-result-tool-card" + kind: "ui-surface" + label: "submit_result tool card (已提交结果): dedicated renderer for workflow actors' structured result submissions" + aliases: + - "submit result card" + - "submit_result renderer" + - "已提交结果" + - "提交结果工具卡" + docs: + - "docs/chat/submit-result-tool-card.md" + codeSeeds: + - symbol: "SubmitResultToolCallBlock" + file: "packages/ui/src/ToolCallBlocks/renderers/submit-result.tsx" + - symbol: "CCBUDDY_KNOWN_TOOL_NAMES" + file: "packages/shared/src/tool-identity.ts" + - symbol: "SUBMIT_RESULT_TOOL_NAME" + file: "apps/ccbuddy-cli/packages/contracts/src/tools/submit-result.ts" + + - id: "state.workflow-run-journal" + kind: "state-owner" + label: "Dynamic workflow run journal and cancel registry (engine-owned run truth)" + docs: + - "apps/ccbuddy-cli/packages/dynamic-workflow/docs/execution-engine.md" + codeSeeds: + - symbol: "JournalStorePort" + file: "apps/ccbuddy-cli/packages/dynamic-workflow/src/engine/types.ts" + - symbol: "SqliteDwfJournalStore" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/session-store/repositories/dwf-journal.ts" + + - id: "capability.conversation-sharing" + kind: "capability" + label: "Conversation sharing and shared-context continuation" + aliases: + - "share conversation" + - "conversation share" + - "会话分享" + - "回到 CCbuddy 继续" + docs: + - "docs/conversation-share-v1.md" + codeSeeds: + - symbol: "ConversationShareService" + file: "packages/services/src/conversation-share/conversationShareService.ts" + - symbol: "ConversationShareMenu" + file: "packages/ui/src/ConversationShareMenu.tsx" + - symbol: "formatSharedContextV1" + file: "packages/services/src/conversation-share/sharedContextFormatter.ts" + + - id: "surface.conversation-share-publish" + kind: "ui-surface" + label: "Desktop conversation share selection and publish" + codeSeeds: + - symbol: "ConversationShareMenu" + file: "packages/ui/src/ConversationShareMenu.tsx" + - symbol: "ConversationShareConfirmationDock" + file: "packages/ui/src/v4/ConversationShareConfirmationDock.tsx" + + - id: "service.conversation-share" + kind: "service" + label: "Conversation share API, remote artifact staging, and local import" + codeSeeds: + - symbol: "IConversationShareService" + file: "packages/services/src/conversation-share/conversationShare.ts" + - symbol: "ConversationShareHttpClient" + file: "packages/services/src/conversation-share/conversationShareHttpClient.ts" + + - id: "surface.conversation-share-handover" + kind: "ui-surface" + label: "Desktop Share URL handover task" + docs: + - "docs/working-memory/provider-refactor/steps/todo-139-share-import-new-task-selection.md" + invariants: + - "Only reused=false import results seed an independent Composer draft before activation, keyed by the returned workspace identity. Copy initialized Root selection only; otherwise use the ordinary new-task Recent/default initializer after the View is ready. Empty history is not an import marker; user edits and reused sessions win. Import never updates Recent or waits for model execution." + codeSeeds: + - symbol: "seedImportedSessionDraft" + file: "packages/ui/src/v4/composer/newTaskDraft.ts" + - symbol: "useDraftConfigControl" + file: "packages/ui/src/v4/composer/useDraftConfigControl.ts" + - symbol: "ConversationShareLandingPage" + file: "packages/web/src/share/ConversationShareLandingPage.tsx" + - symbol: "useRootPlatformEffects" + file: "packages/ui/src/root/useRootPlatformEffects.ts" + - symbol: "ConversationShareImportNotice" + file: "packages/ui/src/v4/ConversationShareImportNotice.tsx" + + - id: "shared-ui.conversation-share-context-chip" + kind: "shared-ui" + label: "Share URL context chip and parser" + codeSeeds: + - symbol: "serializeConversationShareContext" + file: "packages/ui/src/lib/conversationShareContext.ts" + - symbol: "parseConversationShareContext" + file: "packages/ui/src/lib/conversationShareContext.ts" + + - id: "persistence.conversation-share-context" + kind: "persistence" + label: "Shared context import status and provenance" + codeSeeds: + - symbol: "transitionSharedContextImport" + file: "apps/ccbuddy-cli/packages/adapters/src/storage/session-store/sqlite-session-store.ts" + + - id: "service.ccbuddy-agent-connection-scope" + kind: "service" + label: "Host-trusted CCbuddy Agent attachment connection scope" + codeSeeds: + - symbol: "createCCbuddyAgentConnectionScope" + file: "packages/services/src/ccbuddy-agent/ccbuddyAgentConnectionScope.ts" + + - id: "capability.plugin-creator-entry" + kind: "capability" + label: "Localized plugin management and bundled Plugin Creator draft entry" + aliases: + ["plugin-creator", "创建插件", "插件本地化", "添加插件市场", "拼音搜索", "插件默认展开"] + docs: ["docs/plugin-creator.md", "docs/plugin-capabilities-settings.md"] + codeSeeds: + - file: "packages/ui/src/settings/PluginAddMenu.tsx" + - file: "packages/ui/src/hooks/usePluginCreator.ts" + - file: "packages/ui/src/settings/pluginStoreListing.ts" + - file: "packages/ui/src/settings/pluginSearch.ts" + - file: "packages/ui/src/settings/PluginStoreListView.tsx" + - file: "packages/ui/src/settings/pluginCapabilityProjection.ts" + - file: "apps/ccbuddy-cli/packages/bootstrap/src/app/official-plugin-definitions.ts" + invariants: + - "Creator only prefills an unsent draft using the target host official skill path." + - "Market and User management share the two-item menu; Workspace config adds no marketplace mutations." + - "Localization joins by complete pluginId; identity and runtime payloads do not change." + - "Market groups show all cards by default; manual collapse stays local to the current page." + + - id: "capability.bot-group-collaboration" + kind: "capability" + label: "Bot group and topic collaboration" + aliases: ["群聊机器人", "话题续接", "ReplyToChannel", "渠道提及", "Bot 历史附件"] + docs: ["docs/bots-feishu-group-collaboration.md", "docs/bots-topic-input-materials.md", "docs/testing/bots-e2e-coverage-matrix.md"] + codeSeeds: + - file: "packages/services/src/bots/botsService.ts" + symbol: "createBotsService" + - file: "packages/services/src/bots/channelReply.ts" + symbol: "replyToBotChannel" + - file: "packages/services/src/bots/topicContinuation.ts" + symbol: "createTopicContinuation" + - id: "surface.bot-bound-groups" + kind: "ui-surface" + label: "Bot settings bound group controls" + codeSeeds: + - file: "packages/ui/src/BotsDialog/BoundGroupsCard.tsx" + symbol: "BoundGroupsCard" + - id: "surface.bot-channel-messages" + kind: "ui-surface" + label: "Canonical group input and native mentions" + codeSeeds: + - file: "packages/ui/src/v4/ChannelMentionContent.tsx" + symbol: "ChannelMentionContent" + - file: "packages/ui/src/v4/BotTopicPreparation.tsx" + symbol: "BotTopicPreparationList" + edges: - - from: capability.model-selection - to: surface.conversation-model-control - type: renders-in - rank: must-inspect - - from: surface.conversation-model-control - to: shared-ui.model-config-select - type: shares-component - rank: must-inspect - - from: capability.model-selection - to: surface.automation-edit - type: renders-in - rank: must-inspect - - from: surface.automation-edit - to: shared-ui.model-config-select - type: shares-component - rank: must-inspect - - from: capability.model-selection - to: surface.user-subagent-form - type: renders-in - rank: must-inspect - - from: surface.user-subagent-form - to: shared-ui.model-config-select - type: shares-component - rank: must-inspect - - from: capability.model-selection - to: surface.builtin-subagent-model - type: renders-in - rank: must-inspect - - from: surface.builtin-subagent-model - to: shared-ui.model-config-select - type: shares-component - rank: must-inspect - - from: surface.conversation-model-control - to: shared-ui.model-select-groups - type: options-from - rank: should-inspect - - from: surface.user-subagent-form - to: shared-ui.model-select-groups - type: options-from - rank: should-inspect - - from: surface.builtin-subagent-model - to: shared-ui.model-select-groups - type: options-from - rank: should-inspect - - from: capability.model-selection - to: service.host-model-selection - type: reads-candidates-from - rank: must-inspect - - from: service.host-model-selection - to: state.renderer-model-selection-read - type: is-read-through - rank: must-inspect - - from: state.renderer-model-selection-read - to: boundary.workspace-key - type: isolated-by - rank: must-inspect - condition: - Read the selected workspace service; remote-waiting remains unavailable and must not use - a local fallback. - - from: capability.automations - to: surface.automation-edit - type: renders-in - rank: must-inspect - - from: surface.automation-edit - to: state.automation-form-draft - type: owns-draft - rank: must-inspect - - from: surface.automation-edit - to: state.renderer-model-selection-read - type: reads-target-options-through - rank: should-inspect - - from: state.automation-form-draft - to: service.automation - type: commits-to - rank: must-inspect - condition: - Trace onSubmit through AutomationsSection and the automation management store to the selected - service; editing a field alone does not mutate a conversation. - - from: service.automation - to: persistence.automation-record - type: persists-to - rank: must-inspect - - from: capability.subagents - to: surface.user-subagent-form - type: renders-in - rank: must-inspect - - from: capability.subagents - to: surface.builtin-subagent-model - type: renders-in - rank: must-inspect - - from: surface.user-subagent-form - to: state.subagent-form-draft - type: owns-draft - rank: must-inspect - - from: state.subagent-form-draft - to: service.subagents - type: commits-to - rank: must-inspect - condition: The form saves through createAgent or updateAgent. - - from: surface.builtin-subagent-model - to: service.subagents - type: commits-to - rank: must-inspect - condition: Built-in and plugin overrides use setBuiltInModelOverride and setPluginAgentModelOverride. - - from: service.subagents - to: persistence.subagent-markdown - type: persists-to - rank: must-inspect - condition: - User/workspace definitions use Markdown; built-in/plugin overrides use the agent state - file. Neither is a live conversation model switch. - - from: capability.conversation-runtime - to: service.conversation-command-inbox - type: admits-commands-through - rank: must-inspect - - from: capability.conversation-runtime - to: state.conversation-product-projection - type: projects-runtime-events-through - rank: must-inspect - - from: state.conversation-product-projection - to: service.conversation-topic-publisher - type: publishes-deltas-through - rank: must-inspect - - from: service.conversation-topic-publisher - to: state.conversation-projection - type: delivers-snapshot-and-deltas-to - rank: must-inspect - - from: capability.conversation-runtime - to: service.ccbuddy-agent-connection-scope - type: attaches-through - rank: must-inspect - - from: service.conversation-topic-publisher - to: boundary.desktop-continuous - type: uses-delivery-policy - rank: conditional - condition: For Desktop continuous attachments. - - from: service.ccbuddy-agent-connection-scope - to: boundary.desktop-continuous - type: injects-trusted-client-mode - rank: conditional - condition: For Desktop continuous attachments. - - from: service.conversation-topic-publisher - to: boundary.web-remote-replayable - type: uses-delivery-policy - rank: conditional - condition: For replayable Web remote and mobile attachments. - - from: service.ccbuddy-agent-connection-scope - to: boundary.web-remote-replayable - type: injects-trusted-client-mode - rank: conditional - condition: For replayable Web remote and mobile attachments. - - from: boundary.web-remote-replayable - to: boundary.desktop-continuous - type: must-remain-isolated-from - rank: invariant-only - - from: state.conversation-projection - to: service.conversation-command-inbox - type: must-not-duplicate-admission-of - rank: invariant-only - condition: - The client may display pending optimistic commands; accepted input order and idempotency - remain CLI-owned. - - from: capability.workspace-identity - to: service.workspace-identity-builder - type: implemented-by - rank: must-inspect - - from: service.workspace-identity-builder - to: boundary.workspace-key - type: supplies-identity-for - rank: must-inspect - - from: service.ccbuddy-agent-connection-scope - to: boundary.workspace-key - type: isolated-by - rank: must-inspect - - from: persistence.task-index - to: boundary.workspace-key - type: isolated-by - rank: must-inspect - - from: persistence.task-index - to: state.conversation-product-projection - type: must-not-replace - rank: invariant-only - condition: Task index metadata is distinct from canonical conversation content and runtime state. - - from: capability.composer-trigger-routing - to: surface.composer-at-context-picker - type: renders-in - rank: must-inspect - - from: capability.composer-trigger-routing - to: surface.composer-slash-capability-picker - type: renders-in - rank: must-inspect - - from: capability.composer-trigger-routing - to: surface.composer-skill-compatibility-picker - type: renders-in - rank: must-inspect - - from: surface.composer-at-context-picker - to: service.composer-host-file-search - type: options-from - rank: conditional - condition: - Only file candidates use bounded Host file search; other mention providers keep their own - option sources. - - from: service.composer-host-file-search - to: boundary.workspace-key - type: isolated-by - rank: must-inspect - - from: capability.composer-trigger-routing - to: capability.conversation-runtime - type: preserves-canonical-input-for - rank: invariant-only - condition: - Changing candidate discovery or grouping must preserve the selected item representation - submitted to the conversation. - - from: surface.conversation-model-control - to: state.composer-submission-intent - type: edits-draft - rank: must-inspect - condition: - The menu updates the next submission intent even for an existing conversation; it does - not immediately switch the running model. - - from: state.composer-submission-intent - to: service.conversation-submission - type: submits-selection-to - rank: must-inspect - condition: Sending captures modelSelection in the submission; subsequent menu edits affect later sends. - - from: service.conversation-submission - to: service.conversation-command-inbox - type: requires-admission-through - rank: must-inspect - condition: V4 commands pass through CommandInbox before the gateway dispatches their handlers. - - from: service.conversation-submission - to: service.runtime-submission-execution - type: schedules-selection-for - rank: must-inspect - condition: - CLI applies admitted configuration when execution starts, or when a Guide reaches the next - model step. - - from: service.runtime-submission-execution - to: state.conversation-product-projection - type: emits-model-selection-for - rank: must-inspect - condition: Applied runtime model selection is projected through ModelSelected events. + - from: "capability.permission-full-access" + to: "surface.permission-full-access" + type: "renders-in" + rank: "must-inspect" + condition: "Only explicit fullAccessOption capability; preserve each Plan, project defaults and ordinary Composer menu isolation." + - from: "capability.plugin-creator-entry" + to: "surface.workspace-plugin-scope-controls" + type: "exposed-through" + rank: "must-inspect" + - from: "capability.plugin-creator-entry" + to: "surface.plugin-store-example-prompt-try" + type: "shares-new-task-prefill" + rank: "must-inspect" + - from: "capability.plugin-creator-entry" + to: "capability.workspace-identity" + type: "isolated-by" + rank: "must-inspect" + - from: "capability.plugin-creator-entry" + to: "boundary.plugin-agent-host" + type: "resolves-skill-from-target" + rank: "must-inspect" + - from: "capability.plugin-store-mode-order" + to: "state.interface-mode" + type: "selects-order-from" + rank: "must-inspect" + - from: "capability.marketing-touch" + to: "capability.referrals-embedded" + type: "navigates-through-window-provider" + rank: "must-inspect" + condition: "navigate page=rewards preserves login continuation and single confirm reporting." + - from: "capability.interface-mode" + to: "state.interface-mode" + type: "configured-by" + rank: "must-inspect" + - from: "state.interface-mode" + to: "surface.interface-mode-panels" + type: "filters-creation-without-closing-existing" + rank: "must-inspect" + - from: "state.interface-mode" + to: "state.conversation-projection" + type: "filters-rendering-without-mutating" + rank: "must-inspect" + - from: "state.interface-mode" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "state.interface-mode" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "capability.dangerous-command-approval" + to: "surface.parent-task-blocking-interaction" + type: "requires-direct-approval-in" + rank: "must-inspect" + - from: "capability.dangerous-command-approval" + to: "boundary.desktop-continuous" + type: "preserves-delivery-boundary" + rank: "invariant-only" + - from: "capability.dangerous-command-approval" + to: "boundary.web-remote-replayable" + type: "preserves-delivery-boundary" + rank: "invariant-only" + - from: "capability.dangerous-command-approval" + to: "boundary.workspace-key" + type: "preserves-identity-isolation" + rank: "invariant-only" + - from: "capability.referrals-embedded" + to: "state.coding-plan-purchase-funnel" + type: "shares-presentation-only" + rank: "should-inspect" + condition: "Shared navigation header must preserve Coding Plan callbacks and purchase behavior." + - from: "capability.referrals-embedded" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "capability.marketing-touch" + to: "state.marketing-touch-controller" + type: "owned-by" + rank: "must-inspect" + - from: "state.marketing-touch-controller" + to: "service.marketing-touch" + type: "queries-and-reports-through" + rank: "must-inspect" + - from: "capability.marketing-touch" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "capability.marketing-touch" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "capability.delete-all-archived-tasks" + to: "surface.desktop-archived-tasks" + type: "renders-in" + rank: "must-inspect" + - from: "capability.delete-all-archived-tasks" + to: "surface.web-archived-tasks" + type: "renders-in" + rank: "must-inspect" + - from: "capability.delete-all-archived-tasks" + to: "capability.task-persistence" + type: "commits-to" + rank: "must-inspect" + - from: "surface.message-stream-reasoning-setting" + to: "persistence.app-settings" + type: "persists-to" + rank: "must-inspect" + - from: "persistence.app-settings" + to: "state.conversation-reasoning-visibility" + type: "projects-renderer-preference-to" + rank: "must-inspect" + condition: "A missing migration marker forces true exactly once; after the marker is persisted, the stored boolean is authoritative." + - from: "state.conversation-reasoning-visibility" + to: "state.conversation-projection" + type: "filters-rendering-without-mutating" + rank: "must-inspect" + condition: "The resolved preference hides only later reasoning rows when false; the first reasoning row stays visible and canonical projection is unchanged." + - from: "state.conversation-reasoning-visibility" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "state.conversation-reasoning-visibility" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "capability.hooks-settings" + to: "surface.hooks-settings" + type: "renders-in" + rank: "must-inspect" + - from: "surface.hooks-settings" + to: "state.hooks-settings-store" + type: "reads-and-commits-through" + rank: "must-inspect" + - from: "state.hooks-settings-store" + to: "persistence.hooks-config-files" + type: "persists-to" + rank: "must-inspect" + condition: "workspaceIdentity?.trim() || workspacePath isolates state; workspacePath selects the file target." + - from: "capability.hooks-settings" + to: "capability.agent-core-runtime" + type: "must-preserve-runtime-contract" + rank: "invariant-only" + condition: "Workspace hooks remain editable but are excluded from runtime; enabled plugin hooks remain runtime-owned snapshots." + + - from: "capability.customize-capability-search" + to: "surface.customize-capability-settings" + type: "renders-in" + rank: "must-inspect" + - from: "surface.customize-capability-settings" + to: "state.customize-tab-search-query" + type: "owns-draft" + rank: "must-inspect" + condition: "Each capability tab retains its own query; scope changes filter the newly selected isolated scope without sharing resources across workspace identities." + - from: "capability.customize-capability-search" + to: "evidence.customize-capability-settings-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.command-workspace-scope" + to: "surface.command-settings-editor" + type: "renders-in" + rank: "must-inspect" + - from: "surface.command-settings-editor" + to: "shared-ui.customize-scope-menu" + type: "shares-component" + rank: "must-inspect" + - from: "surface.command-settings-editor" + to: "state.command-form-scope-key" + type: "owns-draft" + rank: "must-inspect" + condition: "A new form defaults to User; editing retains a locked owner scope and never migrates storage." + - from: "state.command-form-scope-key" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "must-inspect" + condition: "Workspace options use workspaceIdentity?.trim() || workspacePath; file IO continues to use workspacePath." + - from: "surface.command-settings-editor" + to: "service.workspace-commands" + type: "commits-to" + rank: "must-inspect" + condition: "A concrete Workspace selection resolves that tab's local or remote Host service before writing." + - from: "service.workspace-commands" + to: "persistence.command-settings-directories" + type: "persists-to" + rank: "must-inspect" + - from: "capability.command-workspace-scope" + to: "surface.customize-capability-settings" + type: "shares-scope-option-contract-with" + rank: "should-inspect" + condition: "Commands reuse the concrete User and open-Workspace option contract without joining Plugin list state." + - from: "capability.command-workspace-scope" + to: "evidence.command-workspace-scope-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.browser-use-plugin-distribution" + to: "capability.build-release-engineering" + type: "packaged-and-versioned-by" + rank: "must-inspect" + - from: "capability.browser-use-plugin-distribution" + to: "capability.agent-core-runtime" + type: "seeds-runtime-assets-for" + rank: "must-inspect" + - from: "capability.browser-use-plugin-distribution" + to: "evidence.browser-use-plugin-distribution-tests" + type: "covered-by" + rank: "evidence-only" + - from: "capability.browser-use-plugin-distribution" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.browser-use-plugin-distribution" + to: "boundary.web-remote-replayable" + type: "must-not-change-delivery" + rank: "invariant-only" + + - from: "capability.browser-use-agent-guidance" + to: "capability.agent-core-runtime" + type: "guides-tool-planning-in" + rank: "must-inspect" + - from: "capability.browser-use-agent-guidance" + to: "evidence.browser-use-agent-guidance-tests" + type: "covered-by" + rank: "evidence-only" + - from: "capability.browser-use-agent-guidance" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.browser-use-agent-guidance" + to: "boundary.web-remote-replayable" + type: "must-not-change-delivery" + rank: "invariant-only" + + - from: "capability.windows-window-chrome" + to: "surface.workspace-shell-window-edge" + type: "renders-in" + rank: "must-inspect" + - from: "surface.workspace-shell-window-edge" + to: "state.desktop-window-chrome" + type: "projects-from" + rank: "must-inspect" + - from: "capability.windows-window-chrome" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.assistant-file-preview-links" + to: "surface.conversation-assistant-file-preview" + type: "renders-in" + rank: "must-inspect" + - from: "surface.conversation-assistant-file-preview" + to: "state.assistant-file-preview-projection" + type: "projects-from" + rank: "must-inspect" + condition: "Cards derive from terminal assistant text plus current-turn fileChanges; SessionPane shares a bounded in-flight/result query cache above virtualized rows, and terminal cache identity includes the authoritative active/reverted fileChanges state so rewind cannot reuse pre-rewind results. Assistant body text keeps the existing Streamdown behavior and does not auto-link plain file-name mentions." + - from: "state.assistant-file-preview-projection" + to: "service.workspace-file-existence-check" + type: "validates-through" + rank: "must-inspect" + condition: "Workspace-relative references are lexically normalized and rejected if they escape the workspace before Host I/O; only the first 15 reverse-occurrence candidates are checked, and at most 10 valid cards render." + - from: "service.workspace-file-existence-check" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "must-inspect" + condition: "useWorkspaceServices selects the local or remote Host file service; workspacePath remains the file execution path." + - from: "surface.conversation-assistant-file-preview" + to: "surface.preview-pane-office-file" + type: "opens-in" + rank: "must-inspect" + - from: "state.assistant-file-preview-projection" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "state.assistant-file-preview-projection" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "capability.workspace-file-tree" + to: "surface.workspace-file-tree-panel" + type: "renders-in" + rank: "must-inspect" + - from: "surface.workspace-file-tree-panel" + to: "state.workspace-file-tree-projection" + type: "projects-from" + rank: "must-inspect" + - from: "capability.workspace-file-tree" + to: "evidence.workspace-file-tree-e2e" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.office-file-preview" + to: "surface.preview-pane-office-file" + type: "renders-in" + rank: "must-inspect" + - from: "surface.preview-pane-office-file" + to: "state.preview-pane-office-render" + type: "owns-local-render-lifecycle" + rank: "must-inspect" + condition: "DOCX rendering is local to the active Preview Pane and stale asynchronous results must not replace a newer source." + - from: "surface.preview-pane-office-file" + to: "service.workspace-file-binary-preview" + type: "reads-through" + rank: "must-inspect" + - from: "service.workspace-file-binary-preview" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "must-inspect" + condition: "The selected workspace service owns file reads; workspacePath remains the execution path." + - from: "state.preview-pane-office-render" + to: "boundary.desktop-continuous" + type: "must-remain-isolated-from" + rank: "invariant-only" + - from: "state.preview-pane-office-render" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "invariant-only" + - from: "capability.side-pane-tab-strip" + to: "surface.workspace-side-pane-tab-strip" + type: "renders-in" + rank: "must-inspect" + - from: "surface.workspace-side-pane-tab-strip" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "surface.workspace-side-pane-tab-strip" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery" + rank: "invariant-only" + + - from: "capability.markdown-image-gallery" + to: "capability.shared-image-preview" + type: "shares-component" + rank: "must-inspect" + - from: "capability.shared-image-preview" + to: "capability.conversation-runtime" + type: "renders-in" + rank: "must-inspect" + condition: "Markdown and Browser Use / node_repl images render inside conversation rows." + - from: "capability.shared-image-preview" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.shared-image-preview" + to: "boundary.web-remote-replayable" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.markdown-image-gallery" + to: "capability.conversation-runtime" + type: "renders-in" + rank: "must-inspect" + condition: "Assistant conversation rows render Markdown through the shared MessageResponse component." + - from: "capability.markdown-image-gallery" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.markdown-image-gallery" + to: "boundary.web-remote-replayable" + type: "must-not-change-delivery" + rank: "invariant-only" + + - from: "capability.embedded-browser-network-policy" + to: "surface.desktop-network-policy-setting" + type: "configured-in" + rank: "must-inspect" + - from: "surface.desktop-network-policy-setting" + to: "persistence.app-settings" + type: "persists-explicit-network-policy-to" + rank: "must-inspect" + - from: "capability.embedded-browser-network-policy" + to: "service.desktop-chromium-network-policy" + type: "implemented-by" + rank: "must-inspect" + - from: "service.desktop-chromium-network-policy" + to: "surface.browser-use-side-pane-guest" + type: "configures-electron-session-for" + rank: "must-inspect" + condition: "Desktop startup applies the explicit proxy, No Proxy, and custom CA policy independently to defaultSession and persist:ccbuddy-embedded-browser; persist:ccbuddy-coding-plan and other dedicated partitions remain isolated." + - from: "service.desktop-chromium-network-policy" + to: "boundary.desktop-continuous" + type: "owned-locally-by" + rank: "must-inspect" + - from: "service.desktop-chromium-network-policy" + to: "boundary.web-remote-replayable" + type: "must-not-add-recovery-state-to" + rank: "invariant-only" + condition: "The Electron Session policy affects the existing shared desktop guest only; it adds no relay, task snapshot, or mobile replayable state." + - from: "capability.embedded-browser-network-policy" + to: "evidence.embedded-browser-network-policy-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.host-api-network-policy" + to: "surface.desktop-network-policy-setting" + type: "configured-in" + rank: "must-inspect" + condition: "AppSettings httpProxy, httpProxyNoProxy, and httpProxyCaCertPath remain the only explicit desktop authority and take effect for Host API egress on the next Window Host lifecycle." + - from: "surface.desktop-network-policy-setting" + to: "service.host-api-network-policy" + type: "supplies-lifecycle-snapshot-to" + rank: "must-inspect" + - from: "capability.host-api-network-policy" + to: "service.host-api-network-policy" + type: "implemented-by" + rank: "must-inspect" + - from: "service.host-api-network-policy" + to: "service.oauth" + type: "injects-node-api-client-transport-for" + rank: "must-inspect" + condition: "OAuth token and user-info requests use the final rewritten URL for No Proxy selection and fail closed when an explicit proxy or custom CA is invalid." + - from: "service.host-api-network-policy" + to: "service.model-provider" + type: "injects-node-api-client-transport-for" + rank: "must-inspect" + condition: "Preset provider refresh, endpoint configuration, billing, and connectivity requests that already use NodeApiClient follow the same Host lifecycle policy; Agent model transport remains separate." + - from: "service.host-api-network-policy" + to: "service.plan-entitlements" + type: "injects-node-api-client-transport-for" + rank: "must-inspect" + condition: "Host-owned Coding Plan subscription and usage requests follow the explicit desktop policy without moving plan authority into relay, main, or remote Agent state." + - from: "service.host-api-network-policy" + to: "service.client-scenes" + type: "injects-node-api-client-transport-for" + rank: "must-inspect" + condition: "Client scenes keeps its current service/cache authority; only the Host HTTP transport changes." + - from: "service.host-api-network-policy" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "service.host-api-network-policy" + to: "boundary.web-remote-replayable" + type: "must-not-add-recovery-state-to" + rank: "invariant-only" + condition: "Mobile remote reuses the existing shared-host attachment; proxy policy adds no relay, snapshot, queue, owner, or replay state." + - from: "capability.host-api-network-policy" + to: "evidence.host-api-network-policy-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.browser-screenshot-surface" + to: "surface.browser-use-side-pane-guest" + type: "composes-guest-in" + rank: "must-inspect" + - from: "surface.browser-use-side-pane-guest" + to: "state.browser-screenshot-surface-coordination" + type: "prepared-and-released-by" + rank: "must-inspect" + - from: "capability.browser-screenshot-surface" + to: "state.browser-screenshot-surface-coordination" + type: "coordinated-by" + rank: "must-inspect" + - from: "state.browser-screenshot-surface-coordination" + to: "service.desktop-browser-screenshot-activity" + type: "temporarily-wakes-owner-renderer-and-target-guest-through" + rank: "must-inspect" + condition: "Only the active screenshot preparation group holds a bounded, event-loop-fair activity lease for its owner renderer and target guest; each continuous pump turn yields a macrotask so IPC, timeout, cancellation, and lifecycle events remain schedulable, while sibling guests, queued groups, and persistent tabs remain background-throttled." + - from: "service.desktop-browser-screenshot-activity" + to: "boundary.desktop-continuous" + type: "owned-locally-by" + rank: "must-inspect" + - from: "service.desktop-browser-screenshot-activity" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "invariant-only" + condition: "Screenshot activity is transient Electron main state and never enters relay, task snapshots, or mobile recovery." + - from: "capability.browser-screenshot-surface" + to: "boundary.workspace-key" + type: "preserves-existing-scope" + rank: "invariant-only" + - from: "capability.browser-screenshot-surface" + to: "evidence.browser-screenshot-surface-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.browser-webview-video-recording" + to: "surface.browser-use-side-pane-guest" + type: "records-guest-from" + rank: "must-inspect" + condition: "Recording captures the already-authorized IAB guest and runs its restricted action DSL through trusted CDP input; it never launches an independent Chromium runtime." + - from: "capability.browser-webview-video-recording" + to: "state.browser-recording-job-registry" + type: "owned-transiently-by" + rank: "must-inspect" + condition: "Jobs are scoped by browser generation, window, workspaceKey, remoteSessionId, session, clientMode and tab; recording ids are correlation handles, not authorization." + - from: "state.browser-recording-job-registry" + to: "state.browser-screenshot-surface-coordination" + type: "holds-bounded-capture-lease-through" + rank: "must-inspect" + condition: "Preparing and capturing hold the target guest's background surface so hidden side panes keep producing screencast frames; every terminal path releases the lease." + - from: "capability.browser-webview-video-recording" + to: "capability.stateless-browser-use-mcp" + type: "exposed-to-plugins-through" + rank: "must-inspect" + condition: "Third-party plugins call the official Tab recording facade from fresh node_repl kernels; no plugin manifest can claim raw CDP or Electron authority." + - from: "state.browser-recording-job-registry" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "must-inspect" + condition: "Every status and cancel request rechecks workspaceIdentity?.trim() || workspacePath, remoteSessionId, session, browser generation, clientMode and tab ownership." + - from: "capability.browser-webview-video-recording" + to: "boundary.desktop-continuous" + type: "executes-locally-without-changing-delivery" + rank: "must-inspect" + - from: "capability.browser-webview-video-recording" + to: "boundary.web-remote-replayable" + type: "must-not-enter-replayable-state" + rank: "invariant-only" + condition: "Mobile remote may call the shared-host BrowserControl RPC, but recording jobs and frame/artifact state never enter relay, task snapshots, replay queues or a second mobile runtime." + - from: "capability.browser-webview-video-recording" + to: "evidence.browser-webview-video-recording-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.embedded-browser-responsive-viewport" + to: "surface.browser-use-side-pane-guest" + type: "renders-in" + rank: "must-inspect" + condition: "Agent Browser Use reuses the viewport renderer but never reads or writes the human presentation preference." + - from: "capability.embedded-browser-responsive-viewport" + to: "surface.human-browser-side-pane-guest" + type: "renders-in" + rank: "must-inspect" + - from: "surface.human-browser-side-pane-guest" + to: "state.embedded-browser-human-viewport-preference" + type: "initializes-once-from-and-commits-human-actions-to" + rank: "must-inspect" + condition: "Each new human Browser tab consumes normal/responsive mode, last valid viewport, and preview zoom once; mounted tabs keep tab-local runtime state after setting broadcasts." + - from: "state.embedded-browser-human-viewport-preference" + to: "persistence.app-settings" + type: "persists-to" + rank: "must-inspect" + condition: "Only presentation preference is persisted; Browser tab shells, URLs, history, pageState, guest identity, and Agent viewport runtime are excluded." + - from: "state.embedded-browser-human-viewport-preference" + to: "surface.browser-use-side-pane-guest" + type: "must-remain-isolated-from" + rank: "must-inspect" + condition: "Agent-created tabs, claim, navigate, viewport set/reset, and renderer viewport events neither inherit nor mutate the human preference; Agent creation remains 1280x720 Fit." + - from: "state.embedded-browser-human-viewport-preference" + to: "boundary.desktop-continuous" + type: "owned-as-app-setting-outside-task-delivery" + rank: "must-inspect" + - from: "state.embedded-browser-human-viewport-preference" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "invariant-only" + condition: "The preference never enters task stream, snapshot, replay, relay, owner queue, or mobile recovery state." + - from: "surface.browser-use-side-pane-guest" + to: "state.embedded-browser-resize-gesture" + type: "owns-local-pointer-lifecycle" + rank: "must-inspect" + condition: "Pointer up, cancel, lost capture, window blur, mode exit, and unmount must end the renderer-local drag; refocus never resumes it without a new pointerdown." + - from: "state.embedded-browser-resize-gesture" + to: "boundary.desktop-continuous" + type: "owned-locally-by" + rank: "must-inspect" + - from: "state.embedded-browser-resize-gesture" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "invariant-only" + condition: "The pointer gesture is renderer-local UI state and never enters task snapshots, replay, relay, or mobile recovery." + - from: "surface.browser-use-side-pane-guest" + to: "state.embedded-browser-fit-presentation" + type: "owns-local-fit-presentation" + rank: "must-inspect" + condition: "Only positive composed canvas measurements are authoritative; display:none 0x0 samples preserve the last valid Fit scale, and a newly composed tab is remeasured before its first visible paint." + - from: "state.embedded-browser-fit-presentation" + to: "boundary.desktop-continuous" + type: "owned-locally-by" + rank: "must-inspect" + - from: "state.embedded-browser-fit-presentation" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "invariant-only" + condition: "Fit canvas measurement is renderer-local presentation state and never enters task snapshots, replay, relay, mobile recovery, guest viewport commands, or tab ownership." + - from: "state.embedded-browser-fit-presentation" + to: "evidence.embedded-browser-responsive-viewport-tests" + type: "covered-by" + rank: "evidence-only" + - from: "capability.embedded-browser-responsive-viewport" + to: "evidence.embedded-browser-responsive-viewport-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.browser-tab-residency" + to: "surface.browser-tab-shell" + type: "renders-logical-tabs-in" + rank: "must-inspect" + - from: "capability.automations" + to: "surface.browser-use-side-pane-guest" + type: "may-trigger-background-guest-while" + rank: "must-inspect" + condition: "Immediate and scheduled automation runs may create Browser Use tabs while the Automations main view remains visible; the Desktop Side Pane host stays mounted but collapsed, completes guest attach without stealing focus, and adds no mobile replayable state or second BrowserWindow." + - from: "surface.browser-tab-shell" + to: "state.browser-tab-residency" + type: "projects-and-reports" + rank: "must-inspect" + - from: "state.browser-tab-residency" + to: "service.desktop-browser-tab-residency" + type: "scheduled-by" + rank: "must-inspect" + condition: "Each BrowserWindow keeps at most 32 process-local logical Browser/Browser Use tabs; the oldest safe candidate is fully closed, and complete app restart begins with an empty tab catalog." + - from: "service.desktop-browser-tab-residency" + to: "persistence.browser-tab-recovery-store" + type: "must-remain-disconnected-from" + rank: "invariant-only" + condition: "Desktop main no longer injects, reads, or appends the legacy recovery repository; Browser tabs are never restored across complete app restart." + - from: "service.desktop-browser-tab-residency" + to: "capability.desktop-app-shutdown" + type: "ends-all-tabs-with" + rank: "must-inspect" + condition: "Normal quit, update-install quit, and the next packaged or development process do not persist or restore Browser tab shells, URLs, history, or pageState." + - from: "service.desktop-browser-tab-residency" + to: "service.desktop-browser-screenshot-activity" + type: "honors-protection-lease-from" + rank: "must-inspect" + condition: "A Browser screenshot/capture target cannot be automatically closed until the bounded activity and screenshot surface leases truly release." + - from: "service.desktop-browser-tab-residency" + to: "boundary.desktop-continuous" + type: "owned-locally-by" + rank: "must-inspect" + - from: "service.desktop-browser-tab-residency" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "invariant-only" + condition: "Residency, pageState, guest generations, and renderer budgets remain Electron-local and never enter relay or mobile task snapshots." + - from: "service.desktop-browser-tab-residency" + to: "boundary.workspace-key" + type: "isolates-logical-tabs-and-snapshots-by" + rank: "must-inspect" + condition: "Remote scopes additionally preserve remoteSessionId; physical BrowserWindow budget sharing never permits logical state sharing." + - from: "capability.browser-tab-residency" + to: "evidence.browser-tab-residency-tests" + type: "covered-by" + rank: "evidence-only" + - from: "capability.browser-tab-residency" + to: "boundary.local-development-runtime" + type: "clears-on-process-restart-in" + rank: "must-inspect" + - from: "capability.browser-tab-residency" + to: "boundary.packaged-desktop-runtime" + type: "clears-on-process-restart-in" + rank: "must-inspect" + + - from: "capability.provider-endpoint-routing" + to: "service.provider-endpoint-routing" + type: "implemented-by" + rank: "must-inspect" + - from: "service.provider-endpoint-routing" + to: "state.provider-endpoint-routing-snapshot" + type: "owns-lazy-cache" + rank: "must-inspect" + condition: "The registry shares a port by endpoint and network policy. Dynamic implementations refresh stale snapshots with coalesced GETs; static implementations do no configuration IO. Neither persists routing state." + - from: "service.provider-endpoint-routing" + to: "boundary.ccbuddy-cli-provider-transport" + type: "rewrites-endpoint-for" + rank: "must-inspect" + condition: "Only default AI SDK provider fetches are rewritten before proxy/no-proxy resolution." + - from: "boundary.ccbuddy-cli-provider-transport" + to: "service.provider-endpoint-routing" + type: "supplies-x-api-key-id-on-stale-refresh" + rank: "must-inspect" + condition: "For dynamic implementations, only account requestAuth.apiKeyId may cross into a stale agent/configs GET as x-api-key-id; manual keys, PAT, Authorization and model headers remain isolated. Static implementations do not request configuration. The ID is not logged or persisted by routing." + - from: "capability.provider-registry" + to: "boundary.ccbuddy-cli-provider-transport" + type: "creates" + rank: "must-inspect" + - from: "boundary.ccbuddy-cli-provider-transport" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "boundary.ccbuddy-cli-provider-transport" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + + - from: "capability.agent-core-runtime" + to: "capability.conversation-runtime" + type: "executes-authoritative-turns-for" + rank: "must-inspect" + condition: "Conversation commands, queue state, and projection are owned by the CLI runtime rather than Renderer or Host." + - from: "capability.agent-core-runtime" + to: "capability.model-capabilities" + type: "consumes-runtime-capabilities-from" + rank: "must-inspect" + + - from: "capability.read-pdf" + to: "capability.model-capabilities" + type: "conditions-tool-shape-and-media-branch-on" + rank: "must-inspect" + condition: "supportsPdf controls native PDF/schema exposure; supportsImages independently gates pages rendering." + - from: "capability.read-pdf" + to: "capability.agent-core-runtime" + type: "executes-through" + rank: "must-inspect" + condition: "Main, subagent, project-memory and workflow runtimes share the injected PdfDocumentPort." + - from: "capability.read-pdf" + to: "boundary.ccbuddy-cli-provider-transport" + type: "projects-ordered-tool-media-through" + rank: "must-inspect" + condition: "Anthropic and Responses keep structured tool media; Chat keeps summary in tool output and ordered images in one following user message." + - from: "capability.read-pdf" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "capability.read-pdf" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + + - from: "capability.plan-entitlements" + to: "service.plan-entitlements" + type: "implemented-by" + rank: "must-inspect" + condition: "Personal Coding Plan, Team Plan, and Start Plan retain distinct identity, credential, quota, and billing semantics." + - from: "service.plan-entitlements" + to: "surface.plan-usage" + type: "projects-remote-quota-to" + rank: "must-inspect" + - from: "capability.plan-entitlements" + to: "capability.provider-registry" + type: "gates-provider-availability" + rank: "must-inspect" + condition: "Plan facts affect Built-in account Provider availability only through Account Config and the formal Provider Resolver. Renderer plan-card status does not reapply Account Overlay or gate Effective Provider and Model visibility in Provider Settings." + - from: "capability.plan-entitlements" + to: "surface.provider-settings" + type: "renders-status-card-without-owning-provider-configuration" + rank: "must-inspect" + condition: "Team Plan selection scopes entitlement and quota requests, while ProviderSettingsView independently supplies the Effective Provider and Model editor. Loading, request failure, credential unavailability, or explicit non-allocation never hides an existing Provider configuration." + + - from: "capability.plan-entitlements" + to: "surface.start-plan-manual-claim" + type: "renders-claimable-preview-in" + rank: "must-inspect" + condition: "Preview is exposure-only; claim requires authentication and captcha, and success remains authoritative across best-effort refresh failures." + - from: "surface.start-plan-manual-claim" + to: "service.plan-entitlements" + type: "claims-and-refreshes-through" + rank: "must-inspect" + - from: "surface.start-plan-manual-claim" + to: "boundary.web-remote-replayable" + type: "must-not-create-recovery-state-in" + rank: "invariant-only" + - from: "surface.start-plan-manual-claim" + to: "evidence.start-plan-manual-claim-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.cloud-content-dialog" + to: "shared.cloud-dialog-hero" + type: "implemented-by" + rank: "must-inspect" + - from: "service.cloud-content-assets" + to: "capability.desktop-app-shutdown" + type: "must-finish-async-resource-release-before-host-exit" + rank: "must-inspect" + condition: "CloudContentService exposes async-only disposal. Host shutdown must await it without requiring a synchronous disposeAll method; released leases return 404 and the host-owned cache root is removed." + - from: "capability.marketing-touch" + to: "capability.cloud-content-dialog" + type: "renders-through" + rank: "must-inspect" + - from: "capability.marketing-touch" + to: "service.cloud-content-assets" + type: "resolves-resources-through" + rank: "must-inspect" + condition: "Host owns validated ZIP leases; loopback URLs must not be reused by Web/mobile. Marketing Web bundle uses the declared fallback." + - from: "surface.start-plan-manual-claim" + to: "shared.cloud-dialog-hero" + type: "renders-result-hero-through" + rank: "must-inspect" + condition: "Server VisualBody is prepared before presentation; claim/report remain controller-owned, provider refresh uses ProviderSettingsService, and navigation never selects a model." + - from: "shared.cloud-dialog-hero" + to: "boundary.web-remote-replayable" + type: "must-not-create-recovery-state-in" + rank: "invariant-only" + + - from: "capability.app-usage" + to: "persistence.usage-observability-db" + type: "reads-authoritative-facts-from" + rank: "must-inspect" + condition: "App Usage reads model_usage, turn_usage, and tool_usage; it must not fall back to Coding Plan monitor data or session JSON estimates." + - from: "persistence.usage-observability-db" + to: "service.usage-stats-bridge" + type: "queries-through-protocol" + rank: "must-inspect" + - from: "service.usage-stats-bridge" + to: "surface.app-usage-dashboard" + type: "projects-snapshot-to" + rank: "must-inspect" + - from: "capability.app-usage" + to: "capability.plan-entitlements" + type: "must-remain-separate-from" + rank: "invariant-only" + + - from: "capability.resource-manager" + to: "surface.resource-manager-window" + type: "projects-snapshot-to" + rank: "must-inspect" + condition: "The renderer polls window.resourceManager.getSnapshot() every 1s and keeps only group expansion state; all metrics come from the main-built snapshot." + - from: "capability.resource-manager" + to: "capability.data-observability" + type: "must-remain-separate-from" + rank: "invariant-only" + condition: "Shares the main-process Host/Agent pid registry and CLI MCP tracker, but never alters telemetry sampling cadence or ARMS payloads." + - from: "capability.resource-manager" + to: "capability.computer-use" + type: "conditional-attribution-of" + rank: "conditional" + condition: "Official computer-use MCP subtree is attributed to built-in plugins; the macOS CUA Helper launched via LaunchServices is not a Host descendant and is not attributed yet." + + - from: "capability.data-observability" + to: "service.telemetry-core" + type: "reports-product-events-through" + rank: "must-inspect" + condition: "Product /report, ARMS/RUM, conversation telemetry, logging, and local App Usage remain distinct channels." + - from: "capability.data-observability" + to: "service.cli-agent-telemetry" + type: "reports-agent-runtime-traces-through" + rank: "must-inspect" + condition: "CLI agent OTLP traces remain distinct from product /report, ARMS/RUM, local logs, and local App Usage." + - from: "capability.renderer-user-action-trace" + to: "capability.data-observability" + type: "specializes-renderer-observability-within" + rank: "must-inspect" + condition: "Renderer ui_action uses a compiled catalog and bounded Desktop-only export; it does not reuse or mutate /event/report." + - from: "capability.data-observability" + to: "capability.ccbuddy-data-size-telemetry" + type: "contains" + rank: "must-inspect" + condition: "Desktop main schedules and reports one bounded local data-size snapshot while a Worker owns directory traversal." + - from: "capability.ccbuddy-data-size-telemetry" + to: "capability.development-storage-isolation" + type: "resolves-local-root-through" + rank: "must-inspect" + condition: "Default and custom data roots use getCCbuddyDataRootDir after dataBaseDir bootstrap." + - from: "capability.ccbuddy-data-size-telemetry" + to: "boundary.desktop-continuous" + type: "reports-outside-conversation-delivery" + rank: "invariant-only" + - from: "capability.ccbuddy-data-size-telemetry" + to: "boundary.web-remote-replayable" + type: "must-not-report-through" + rank: "invariant-only" + - from: "capability.data-observability" + to: "service.mcp-session-runtime" + type: "observes-process-lifecycle-and-resource-of" + rank: "must-inspect" + condition: "Only successful stdio runtime instances, unexpected exits, first session startup counts and five-minute memory samples are reported; raw MCP names, commands, paths, credentials, stderr and PIDs remain local. A tracked process is only suspected orphaned after it has no pool owner for strictly more than 60 seconds and is still observed by the OS sampler." + - from: "service.mcp-session-runtime" + to: "boundary.desktop-continuous" + type: "reports-outside-conversation-delivery" + rank: "invariant-only" + condition: "MCP telemetry uses a strict process notification and trusted Host relay; it does not enter conversation frames, snapshots, queues or replay state." + - from: "service.mcp-session-runtime" + to: "boundary.web-remote-replayable" + type: "must-not-report-through" + rank: "invariant-only" + condition: "Mobile attachments reuse the existing Agent/MCP runtime and never subscribe to, cache or replay MCP telemetry." + - from: "capability.workspace-identity" + to: "service.telemetry-core" + type: "reports-remote-workspace-lifecycle-through" + rank: "must-inspect" + condition: "Only terminal remote connect outcomes and low-cardinality remote_kind/connect_trigger/error_category are reported; paths, identities, session ids, and remote target details must never enter telemetry." + - from: "capability.remote-delivery" + to: "service.telemetry-core" + type: "reports-adoption-lifecycle-through" + rank: "must-inspect" + condition: "Desktop reports entry/start/pair/bridge lifecycle events best effort; Web and relay add no reporter or rpc-frame inspection, and desktop-continuous remains isolated from web-remote-replayable." + + - from: "capability.engineering-infrastructure" + to: "capability.build-release-engineering" + type: "contains" + rank: "must-inspect" + - from: "capability.model-io-full-retention" + to: "surface.model-io-full-retention-setting" + type: "renders-in" + rank: "must-inspect" + - from: "surface.model-io-full-retention-setting" + to: "persistence.app-settings" + type: "persists-to" + rank: "must-inspect" + - from: "persistence.app-settings" + to: "service.model-io-runtime-preference-sync" + type: "projects-to" + rank: "must-inspect" + - from: "service.model-io-runtime-preference-sync" + to: "persistence.model-io-jsonl" + type: "controls-retention-of" + rank: "must-inspect" + - from: "capability.model-io-full-retention" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.model-io-full-retention" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery" + rank: "invariant-only" + - from: "capability.model-io-full-retention" + to: "evidence.model-io-full-retention-tests" + type: "covered-by" + rank: "evidence-only" + - from: "capability.development-storage-isolation" + to: "surface.data-directory-setting" + type: "renders-effective-root-in" + rank: "should-inspect" + - from: "surface.data-directory-setting" + to: "service.data-directory-setting" + type: "commits-to" + rank: "must-inspect" + - from: "service.data-directory-setting" + to: "persistence.desktop-user-data-root" + type: "copies-and-points-to" + rank: "must-inspect" + - from: "capability.development-storage-isolation" + to: "persistence.desktop-user-data-root" + type: "selects-root-for" + rank: "must-inspect" + - from: "capability.development-storage-isolation" + to: "boundary.local-development-runtime" + type: "uses-dev-root-in" + rank: "must-inspect" + condition: "Only app.isPackaged=false uses the dev profile and .ccbuddy-dev root." + - from: "capability.development-storage-isolation" + to: "boundary.packaged-desktop-runtime" + type: "uses-stable-root-in" + rank: "must-inspect" + condition: "Packaged Stable and packaged Preview both use the stable profile and .ccbuddy root; CCBUDDY_ENV does not select storage." + - from: "persistence.desktop-user-data-root" + to: "boundary.workspace-key" + type: "must-not-rewrite-workspace-project-config" + rank: "invariant-only" + condition: "Workspace .ccbuddy files remain project content and are not renamed to .ccbuddy-dev." + - from: "capability.development-storage-isolation" + to: "evidence.development-storage-isolation" + type: "covered-by" + rank: "evidence-only" + - from: "capability.build-release-engineering" + to: "capability.embedded-native-search" + type: "produces-runtime-assets-for" + rank: "must-inspect" + - from: "capability.embedded-native-search" + to: "service.native-search-release-plan" + type: "versioned-and-validated-by" + rank: "must-inspect" + - from: "service.native-search-release-plan" + to: "persistence.native-search-shared-deps" + type: "publishes-immutable-archives-to" + rank: "must-inspect" + - from: "capability.embedded-native-search" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "capability.embedded-native-search" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "capability.engineering-infrastructure" + to: "capability.test-automation-platform" + type: "contains" + rank: "must-inspect" + - from: "capability.engineering-infrastructure" + to: "capability.quality-intelligence" + type: "contains" + rank: "must-inspect" + - from: "capability.test-automation-platform" + to: "capability.quality-intelligence" + type: "publishes-test-results-to" + rank: "must-inspect" + - from: "capability.build-release-engineering" + to: "capability.quality-intelligence" + type: "is-gated-by" + rank: "should-inspect" + - from: "capability.build-release-engineering" + to: "capability.desktop-app-shutdown" + type: "produces-update-artifacts-consumed-by" + rank: "must-inspect" + condition: "CI owns build, signing, notarization, artifact upload, and release promotion; the Host runtime owns update checks, download, and install handoff." + - from: "capability.quality-intelligence" + to: "capability.data-observability" + type: "must-remain-separate-from" + rank: "invariant-only" + condition: "Test results, coverage, failure artifacts, and engineering trends must not be reported as product telemetry, ARMS/RUM, Conversation telemetry, or App Usage." + + - from: "capability.office-computer-use-incubation" + to: "capability.office-suite" + type: "contains" + rank: "must-inspect" + - from: "capability.office-computer-use-incubation" + to: "capability.computer-use" + type: "contains" + rank: "must-inspect" + - from: "capability.office-suite" + to: "surface.office-document-workbench" + type: "renders-in" + rank: "must-inspect" + condition: "PDF, DOCX, XLSX, and PPTX preview exist today; Preview Pane PPTX remains read-only and native Office editing is still bounded separately." + - from: "surface.office-document-workbench" + to: "service.office-document-platform" + type: "commits-to" + rank: "conditional" + condition: "Planned native Office editing must use a workspace-scoped Host service rather than direct Renderer Node or LibreOffice IO." + - from: "service.document-skills" + to: "capability.office-suite" + type: "produces-workspace-artifacts-for" + rank: "must-inspect" + condition: "The official plugin provides DOCX/PDF production and a narrow PPTX reference resolver; it is independent from a future native editor draft." + - from: "service.document-skills" + to: "surface.office-document-workbench" + type: "produces-previewable-artifacts-for" + rank: "should-inspect" + - from: "capability.pptx-element-reference" + to: "surface.pptx-element-selection" + type: "selects-in" + rank: "must-inspect" + - from: "surface.pptx-element-selection" + to: "state.pptx-preview-element-selection" + type: "owns-local-draft" + rank: "must-inspect" + condition: "Selection is generation-scoped renderer state; source/page changes clear local selection without deleting Composer references." + - from: "surface.pptx-element-selection" + to: "state.pptx-preview-ai-edit-draft" + type: "owns-local-draft" + rank: "must-inspect" + condition: "AI Edit captures optional selectedText and opens a local comment draft aligned with the existing code-comment interaction; Composer remains unchanged until explicit confirmation." + - from: "state.pptx-preview-ai-edit-draft" + to: "surface.composer-presentation-reference" + type: "commits-on-confirmation-to" + rank: "must-inspect" + condition: "Cancel discards only the local draft; Add to conversation trims optional comment, dispatches one reference, and keeps the selected element." + - from: "state.pptx-preview-ai-edit-draft" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "invariant-only" + condition: "The unsent instruction draft is renderer-local and never enters task snapshots, replay, relay, main, Host, or Agent runtime state." + - from: "surface.pptx-element-selection" + to: "surface.composer-presentation-reference" + type: "adds-structured-reference-to" + rank: "must-inspect" + condition: "Only the focused primary Composer in the same workspace and remote-session scope accepts the event." + - from: "surface.composer-presentation-reference" + to: "state.composer-presentation-reference-draft" + type: "owns-local-draft" + rank: "must-inspect" + - from: "surface.composer-presentation-reference" + to: "state.pptx-reference-preview-navigation" + type: "opens-referenced-page-through" + rank: "must-inspect" + condition: "A concrete draft or historical reference item exits viewer selection, opens or reuses the scoped PPTX preview, and best-effort navigates by a repeatable request id." + - from: "state.pptx-reference-preview-navigation" + to: "surface.office-document-workbench" + type: "projects-to" + rank: "must-inspect" + condition: "Missing file and missing page use separate toasts; a readable file remains open when only the referenced page cannot be located." + - from: "state.pptx-reference-preview-navigation" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "invariant-only" + condition: "Navigation is renderer-local UI intent and does not enter task snapshot, replay, relay, main, or Agent runtime state." + - from: "state.composer-presentation-reference-draft" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "must-inspect" + condition: "workspaceIdentity?.trim() || workspacePath, remoteSessionId, and draft/session scope remain distinct coordinates." + - from: "state.composer-presentation-reference-draft" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "invariant-only" + condition: "Unsent references remain renderer-local; sent prompt text follows existing replayable delivery without new relay or main state." + - from: "capability.pptx-element-reference" + to: "service.pptx-reference-resolver" + type: "mutates-through" + rank: "must-inspect" + condition: "textFingerprint validates the full shape or table-cell text; optional selectedText and comment are model context only and never replace the resolver conflict object. New prompt tails name presentation element comments and explicitly require per-reference comment handling without depending on skill loading." + - from: "service.pptx-reference-resolver" + to: "boundary.workspace-key" + type: "preserves-execution-scope" + rank: "must-inspect" + condition: "The Agent executes against workspacePath after exact source fingerprint and OOXML locator validation; renderer and relay do not own file IO." + - from: "capability.computer-use" + to: "surface.computer-use-task-experience" + type: "renders-in" + rank: "must-inspect" + - from: "surface.computer-use-task-experience" + to: "state.windows-cua-operation-indicator" + type: "projects-tool-triggered-state-through" + rank: "must-inspect" + condition: "Desktop-local Windows only; each official CUA tool-started refreshes a 10-second safety deadline, while terminal/runtime-unavailable events clear the projection." + - from: "state.windows-cua-operation-indicator" + to: "boundary.cua-desktop-local" + type: "must-remain-local-to" + rank: "invariant-only" + condition: "The indicator is a Main-owned ephemeral BrowserWindow and never enters web-remote replayable state, snapshots, relay, or a second runtime." + - from: "state.windows-cua-operation-indicator" + to: "capability.desktop-startup-critical-path" + type: "must-not-enter-business-window-routing" + rank: "invariant-only" + condition: "CUA indicator windows are excluded from Explorer/deep-link target selection and primary application window resolution." + - from: "capability.computer-use" + to: "service.cua-platform" + type: "implemented-by" + rank: "must-inspect" + - from: "capability.computer-use" + to: "service.cua-helper-build-release" + type: "packaged-by" + rank: "must-inspect" + condition: "Stable builds assemble CCbuddy Computer Use.app; local development builds assemble CCbuddy Computer Use Dev.app. Both use the CCbuddy Computer Use executable and producer-owned identity constants." + - from: "capability.build-release-engineering" + to: "service.cua-helper-build-release" + type: "produces-signed-runtime-through" + rank: "must-inspect" + - from: "service.cua-helper-build-release" + to: "service.cua-platform" + type: "supplies-canonical-helper-to" + rank: "must-inspect" + condition: "Build, package, CI staging, signing, notarization, installation, and diagnostics must resolve the same producer-owned app, display, executable, bundle, and team identities." + - from: "service.cua-helper-build-release" + to: "boundary.packaged-desktop-runtime" + type: "installs-into" + rank: "must-inspect" + - from: "capability.computer-use" + to: "state.cua-frame-pixel-authority" + type: "issues-and-consumes-immutable-frames-through" + rank: "must-inspect" + condition: "Screenshot, get_app_state window rasters and Zoom child rasters all project model pixels through one producer frame registry and Helper native gate." + - from: "state.cua-frame-pixel-authority" + to: "service.cua-platform" + type: "dispatches-windowserver-verified-pixels-through" + rank: "must-inspect" + condition: "Capture and dispatch use the same WindowServer owner policy; element/AX actions remain a separate semantic path." + - from: "state.cua-frame-pixel-authority" + to: "service.cua-tool-contract-projection" + type: "requires-byte-and-adjacency-preservation-from" + rank: "must-inspect" + - from: "state.cua-frame-pixel-authority" + to: "boundary.web-remote-replayable" + type: "must-not-enter-replayable-state" + rank: "invariant-only" + condition: "Frame registry, WindowServer snapshots and native dispatch remain desktop-local ephemeral authority." + - from: "capability.computer-use" + to: "service.cua-plugin-dev-runtime-assets" + type: "requires-model-runtime-from" + rank: "must-inspect" + condition: "Computer Use Helper readiness is independent from the shared node_repl SDK/skill assets." + - from: "capability.computer-use" + to: "service.cua-node-repl-bridge" + type: "projects-through-shared-node-repl" + rank: "must-inspect" + condition: "The model invokes only mcp__node_repl__js; the bridge bootstraps agent.computerUse per Worker." + - from: "service.cua-node-repl-bridge" + to: "state.cua-shared-host-runtime" + type: "routes-requests-to" + rank: "must-inspect" + condition: "Authenticated workspace/session context selects one shared-host CUA runtime session." + - from: "state.cua-shared-host-runtime" + to: "boundary.cua-desktop-local" + type: "owns-ephemeral-authority-within" + rank: "invariant-only" + condition: "Native Helper/TCC and action safety remain desktop-local and fail closed." + - from: "state.cua-shared-host-runtime" + to: "boundary.web-remote-replayable" + type: "must-not-enter-replayable-state" + rank: "invariant-only" + condition: "Mobile remote only attaches to the existing shared host; relay/main do not own CUA state." + - from: "capability.build-release-engineering" + to: "service.cua-plugin-dev-runtime-assets" + type: "produces-dev-runtime-assets-for" + rank: "must-inspect" + condition: "Ordinary desktop Dev builds must stage and validate the CUA SDK/docs/Skill before the Agent bundle is started; Browser owns the only node_repl MCP." + - from: "service.cua-plugin-dev-runtime-assets" + to: "service.cua-node-repl-bridge" + type: "supplies-sdk-assets-to" + rank: "must-inspect" + condition: "Filesystem seed must copy the CUA SDK/docs/Skill into the official plugin cache before shared node_repl bootstraps a Worker." + - from: "service.cua-plugin-dev-runtime-assets" + to: "boundary.cua-desktop-local" + type: "must-not-bypass" + rank: "invariant-only" + condition: "A valid MCP artifact never bypasses product enablement, broker socket/token, Helper trust, or macOS TCC authorization." + - from: "capability.computer-use" + to: "service.cua-node-repl-bridge" + type: "executes-sdk-through" + rank: "must-inspect" + condition: "Current model calls enter only through node_repl js and the agent.computerUse SDK." + - from: "service.cua-tool-contract-projection" + to: "surface.computer-use-task-experience" + type: "historical-transcript-only" + rank: "evidence-only" + - from: "service.cua-tool-contract-projection" + to: "service.cua-platform" + type: "removed-execution-path" + rank: "evidence-only" + condition: "Legacy CUA title/alias projection is retained only for read-only transcript parsing; new execution never dispatches these entries." + - from: "service.cua-platform" + to: "state.cua-action-state-authority" + type: "owns-mutation-epoch-and-post-state" + rank: "must-inspect" + condition: "ccbuddy-cua invalidates pre-action state ids and only publishes synced after a full authoritative observation." + - from: "service.cua-tool-contract-projection" + to: "state.cua-action-state-authority" + type: "historical-transcript-only" + rank: "evidence-only" + condition: "Historical transcripts remain readable; current action-state returns through the generic node_repl result." + - from: "state.cua-action-state-authority" + to: "state.conversation-projection" + type: "must-not-change-session-semantics" + rank: "invariant-only" + condition: "The bounded tool result follows existing lifecycle/history; no new conversation state, queue, owner, snapshot, or replay semantics are introduced." + - from: "service.cua-platform" + to: "boundary.cua-desktop-local" + type: "authorized-by" + rank: "must-inspect" + condition: "Current product CUA is enabled by default but remains desktop-local: macOS uses the signed Helper/TCC boundary, while Windows uses the packaged Host-managed Helper runtime; explicit 0/false/off disables it and both platforms fail closed." + - from: "service.cua-platform" + to: "capability.agent-core-runtime" + type: "must-remain-isolated-from" + rank: "must-inspect" + condition: "Helper health is checked only at explicit CUA demand boundaries; periodic probes and timer-triggered recovery are forbidden, and every Helper lifecycle result leaves Agent process/session ownership unchanged." + - from: "surface.computer-use-task-experience" + to: "state.conversation-projection" + type: "projects-from" + rank: "should-inspect" + condition: "Current UI reuses generic tool/interaction projection; a dedicated live control and takeover protocol is still planned." + - from: "boundary.web-remote-replayable" + to: "boundary.cua-desktop-local" + type: "must-not-create-independent-runtime-for" + rank: "invariant-only" + condition: "Mobile remote may attach to an existing local Host but must not install or launch a separate Computer Use Helper." + + - from: "capability.desktop-app-shutdown" + to: "service.desktop-app-shutdown-policy" + type: "selects-budget-through" + rank: "must-inspect" + condition: "Windows normal quit uses the short frequent-operation budget; update-install keeps the strict resource-release barrier." + - from: "service.desktop-app-shutdown-policy" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "service.desktop-app-shutdown-policy" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + + - from: "capability.desktop-startup-critical-path" + to: "service.desktop-local-host-startup" + type: "starts-local-host-through" + rank: "must-inspect" + - from: "service.desktop-local-host-startup" + to: "state.desktop-runtime-process-env" + type: "consumes-bounded-patch-from" + rank: "must-inspect" + condition: "Environment prewarm is advisory and bounded; failure or timeout passes a complete shell-free fallback patch and never re-enters synchronous login-shell capture in Local Host." + - from: "capability.desktop-startup-critical-path" + to: "state.desktop-tab-restore-projection" + type: "restores-active-first-through" + rank: "must-inspect" + - from: "state.desktop-tab-restore-projection" + to: "persistence.app-settings" + type: "restores-from-and-persists-complete-state-to" + rank: "must-inspect" + condition: "The active-ready projection is transient and cannot overwrite lastWorkspaceSession; a user-closed active tab cannot be resurrected by deferred completion." + - from: "service.desktop-local-host-startup" + to: "boundary.desktop-continuous" + type: "owned-locally-by" + rank: "must-inspect" + - from: "service.desktop-local-host-startup" + to: "boundary.web-remote-replayable" + type: "must-not-create-independent-host-for" + rank: "invariant-only" + - from: "state.desktop-tab-restore-projection" + to: "boundary.web-remote-replayable" + type: "must-not-publish-partial-workspace-snapshot-to" + rank: "invariant-only" + condition: "Main workspace sync and Web remote task/workspace snapshots wait for complete tab restore; mobile keeps shared-host replayable semantics." + - from: "state.desktop-tab-restore-projection" + to: "boundary.workspace-key" + type: "preserves-isolation" + rank: "must-inspect" + - from: "capability.desktop-startup-critical-path" + to: "evidence.desktop-startup-critical-path-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.project-memory" + to: "service.project-memory-extraction-lifecycle" + type: "runs-background-through" + rank: "must-inspect" + - from: "capability.project-memory" + to: "service.headless-cli-prompt-runtime" + type: "preserves-main-memory-in" + rank: "should-inspect" + condition: "`-p/--prompt` and `--target` retain the active Main Memory prompt/index or Recall branch, custom-agent Memory and session persistence." + - from: "service.headless-cli-prompt-runtime" + to: "service.project-memory-extraction-lifecycle" + type: "suppresses-automatic-scheduling-in" + rank: "must-inspect" + condition: "By default both non-interactive entry points materialize `memory.extractionEnabled=false`; the scheduler returns before enabled-root resolution, snapshot acquisition, provider work, cursor updates or file mutation. TUI and app-server keep the default enabled lifecycle." + - from: "service.headless-cli-prompt-runtime" + to: "service.project-memory-extraction-lifecycle" + type: "waits-before-close-for" + rank: "must-inspect" + condition: "Explicit --memory-bench with -p/--prompt enables Extraction for this invocation and waits without a drain deadline before normal close. Effective Project Memory must already be enabled; signals retain cancellation, and other entry points keep their existing close policy." + - from: "capability.project-memory" + to: "surface.project-memory-settings" + type: "renders-read-only-local-catalog-in" + rank: "must-inspect" + - from: "surface.project-memory-settings" + to: "persistence.app-settings" + type: "commits-enable-toggle-to" + rank: "must-inspect" + condition: "The toggle remains session-scoped; existing runtimes keep their materialized value." + - from: "surface.project-memory-settings" + to: "service.project-memory-catalog" + type: "reads-local-snapshots-through" + rank: "must-inspect" + condition: "Only the Desktop local-Host viewer reads the catalog, and it performs no catalog read while Memory is disabled. The UI navigates project list -> project memories -> one document and reads document content only after explicit file selection. Web Remote and Mobile render a local-desktop notice instead." + - from: "service.project-memory-catalog" + to: "persistence.project-memory-files" + type: "reads-without-mutating" + rank: "must-inspect" + - from: "surface.project-memory-settings" + to: "boundary.web-remote-replayable" + type: "must-not-add-remote-aggregation-to" + rank: "invariant-only" + condition: "Web Remote and Mobile keep the Memory toggle but do not render or query the Project Memory viewer." + - from: "surface.project-memory-settings" + to: "boundary.desktop-continuous" + type: "must-not-trigger-provider-or-runtime" + rank: "invariant-only" + - from: "service.project-memory-extraction-lifecycle" + to: "capability.conversation-runtime" + type: "cancels-on-session-close-with" + rank: "must-inspect" + condition: "Session close rejects new Extraction scheduling, drops latest pending, aborts running work, then performs bounded drain before owned resources close." + - from: "service.project-memory-extraction-lifecycle" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "service.project-memory-extraction-lifecycle" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + + - from: "capability.provider-templates" + to: "capability.provider-registry" + type: "supplies-inheritance-baseline-to" + rank: "must-inspect" + condition: "Resolver applies at most one Template baseline before Concrete Provider layers; Registry receives only the completed Effective Provider with its real providerId." + - from: "capability.provider-templates" + to: "surface.provider-settings" + type: "creates-personal-provider-through" + rank: "must-inspect" + condition: "Template selection creates a new Personal Provider identity; editing or deleting that instance never mutates the Built-in Template." + - from: "capability.remote-provider-provisioning" + to: "capability.provider-registry" + type: "projects-local-config-into-remote-environment-for" + rank: "must-inspect" + condition: "A replace-style envelope updates the Remote Environment stores and refreshes its Registry; it does not transfer a Registry Snapshot or mutate existing Active Models." + - from: "capability.remote-provider-provisioning" + to: "capability.workspace-identity" + type: "deduplicates-by-remote-environment-beyond" + rank: "must-inspect" + condition: "Environment identity owns synchronization lanes; workspaceIdentity, workspacePath and remoteSessionId remain workspace/session identities and are not Provisioning deduplication keys." + - from: "capability.remote-provider-provisioning" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "capability.remote-provider-provisioning" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + + - from: "capability.model-capabilities" + to: "capability.model-selection" + type: "owns-capability-boundary-for" + rank: "must-inspect" + - from: "capability.model-capabilities" + to: "capability.provider-registry" + type: "owns-capability-boundary-for" + rank: "must-inspect" + - from: "capability.model-capabilities" + to: "service.active-session-model-limits" + type: "projects-selected-model-limits-through" + rank: "must-inspect" + condition: "Context window and max output tokens come from the Model selected for the execution; input/output formats stay on Model.properties and are not copied into a runtime capability map." + - from: "capability.model-capabilities" + to: "capability.conversation-runtime" + type: "configures-runtime-for" + rank: "must-inspect" + - from: "capability.model-capabilities" + to: "boundary.ccbuddy-cli-provider-transport" + type: "maps-effective-options-into-final-request-body-for" + rank: "must-inspect" + condition: "Active Model option maps apply ordered RFC 7396 patches to the final serialized JSON body before request signing; debug and Model IO observe the patched body, and no parallel reasoning/max-output mapping remains." + - from: "capability.model-capabilities" + to: "surface.user-subagent-form" + type: "options-from" + rank: "must-inspect" + condition: "A matching workspace-config modelThoughtLevels declaration wins; a missing target model or capability field falls back to App provider metadata without waiting for configOptionsStatus, while catalog reconciliation continues independently in the background." + - from: "capability.model-capabilities" + to: "surface.builtin-subagent-model" + type: "options-from" + rank: "must-inspect" + condition: "A matching workspace-config modelThoughtLevels declaration wins; a missing target model or capability field falls back to App provider metadata without waiting for configOptionsStatus, while catalog reconciliation continues independently in the background." + + - from: "capability.model-selection" + to: "surface.conversation-model-control" + type: "renders-in" + rank: "must-inspect" + - from: "capability.model-selection" + to: "surface.automation-edit" + type: "renders-in" + rank: "must-inspect" + - from: "capability.model-selection" + to: "surface.user-subagent-form" + type: "renders-in" + rank: "must-inspect" + - from: "capability.model-selection" + to: "surface.builtin-subagent-model" + type: "renders-in" + rank: "must-inspect" + - from: "capability.provider-registry" + to: "surface.provider-settings" + type: "renders-in" + rank: "must-inspect" + - from: "capability.model-selection" + to: "capability.provider-registry" + type: "options-from" + rank: "should-inspect" + - from: "capability.model-selection" + to: "service.host-model-selection" + type: "implemented-by" + rank: "must-inspect" + condition: "The target Workspace Host atomically supplies visible candidates, option specs, and preferredSelection; App Recent stays Renderer-owned and workspaceKey-scoped, while the target Worker Registry and ModelFactory retain final execution validation." + - from: "service.host-model-selection" + to: "state.renderer-model-selection-read" + type: "is-read-through" + rank: "must-inspect" + condition: "Renderer distinguishes loading, target unavailable, first-read error, and ready; owner changes discard stale results, revisions are monotonic, reload is explicit, and a Ready last-known-good survives background refresh failure." + - from: "state.renderer-model-selection-read" + to: "shared-ui.model-select-groups" + type: "permits-projection-only-when-ready" + rank: "must-inspect" + - from: "state.renderer-model-selection-read" + to: "boundary.web-remote-replayable" + type: "must-not-fallback-to-local-host-in" + rank: "must-inspect" + condition: "Remote waiting or disconnection is unavailable; it never reads Base/Local Host candidates and does not change task replay semantics." + - from: "service.host-model-selection" + to: "surface.conversation-model-control" + type: "supplies-target-environment-options-to" + rank: "must-inspect" + condition: "Local panes read Local Host; remote panes read Remote Host; remote waiting or disconnection never falls back to Base/Local Host." + - from: "service.host-model-selection" + to: "surface.automation-edit" + type: "supplies-selected-workspace-options-to" + rank: "must-inspect" + - from: "service.provider-settings" + to: "surface.provider-settings" + type: "supplies-lifecycle-view-to" + rank: "must-inspect" + condition: "Initial loading, first-read error with reload, and Ready ProviderSettingsView remain distinct; a Ready last-known-good survives background refresh failure." + - from: "service.host-model-selection" + to: "surface.user-subagent-form" + type: "supplies-local-environment-options-to" + rank: "must-inspect" + condition: "Subagent Settings manages Local Environment config only; remote Environment Subagent config remains independently persisted and is not editable by this UI phase." + - from: "service.host-model-selection" + to: "surface.builtin-subagent-model" + type: "supplies-local-environment-options-to" + rank: "must-inspect" + condition: "Built-in Subagent overrides edited in Settings belong to Local Environment only; remote overrides remain owned by the Remote Environment." + + - from: "capability.anthropic-request-metadata" + to: "service.anthropic-request-options" + type: "implemented-by" + rank: "must-inspect" + - from: "service.anthropic-request-options" + to: "capability.provider-registry" + type: "applies-to-provider-kind" + rank: "must-inspect" + condition: "Only providerKind=anthropic receives metadata.user_id." + - from: "service.anthropic-request-options" + to: "service.cli-device-mid" + type: "reads-device-identity-through" + rank: "must-inspect" + - from: "service.cli-device-mid" + to: "persistence.telemetry-device-mid" + type: "reads-creates" + rank: "must-inspect" + condition: "The actual local or remote Agent runtime uses its own CCBUDDY_DATA_BASE_DIR and shares the deviceMid field with Desktop/telemetry when colocated." + - from: "service.telemetry-core" + to: "persistence.telemetry-device-mid" + type: "shares-device-identity-with" + rank: "must-inspect" + - from: "service.anthropic-request-options" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "service.anthropic-request-options" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + + - from: "capability.model-request-session-type-attribution" + to: "service.model-request-session-type-attribution" + type: "implemented-by" + rank: "must-inspect" + - from: "service.model-request-session-type-attribution" + to: "boundary.ccbuddy-cli-provider-transport" + type: "injects-managed-request-header-at" + rank: "must-inspect" + condition: "Every generateText, streamText, retry, and recovery request sends exactly one x-ccbuddy-session-type value; managed attribution overrides a conflicting provider static header." + - from: "service.model-request-session-type-attribution" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "service.model-request-session-type-attribution" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "capability.model-request-session-type-attribution" + to: "evidence.model-request-session-type-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.anthropic-reasoning-history-replay" + to: "service.anthropic-reasoning-history-projection" + type: "implemented-by" + rank: "must-inspect" + - from: "capability.model-reasoning-request-projection" + to: "service.model-reasoning-request-projection" + type: "implemented-by" + rank: "must-inspect" + - from: "service.model-reasoning-request-projection" + to: "boundary.ccbuddy-cli-provider-transport" + type: "projects-request-local-history-to" + rank: "must-inspect" + condition: "Exact-empty reasoning blocks without provider options are omitted only from serializer input; opaque provider metadata, whitespace-only reasoning, OpenAI Responses references, and provider-required tool-call placeholders remain unchanged, while canonical and persisted history are not mutated." + - from: "service.anthropic-reasoning-history-projection" + to: "boundary.ccbuddy-cli-provider-transport" + type: "projects-request-local-history-to" + rank: "must-inspect" + condition: "Only Anthropic requests normalize reasoning history, exactly once per logical request before its physical attempts; ordinary and signature-repair retries reuse or derive from that request-local projection, while canonical MessageHistory and persisted messages remain unchanged." + - from: "persistence.assistant-message-model-provenance" + to: "state.message-history-model-provenance" + type: "hydrates-model-provenance-into" + rank: "must-inspect" + condition: "Persisted assistant providerID, modelID, and variant restore ModelInputMessage.modelRef without adding a storage migration." + - from: "state.message-history-model-provenance" + to: "service.anthropic-reasoning-history-projection" + type: "supplies-source-model-identity-to" + rank: "must-inspect" + condition: "Live result.model and resumed assistant metadata supply the same providerId + modelId identity; missing provenance remains unknown rather than being inferred as cross-model." + - from: "service.anthropic-reasoning-history-projection" + to: "state.conversation-projection" + type: "reports-signature-repair-through" + rank: "should-inspect" + condition: "A confirmed signature rejection reuses model_retry_scheduled and the existing control.apiRetry live-tail state." + - from: "service.anthropic-reasoning-history-projection" + to: "persistence.usage-observability-db" + type: "counts-physical-retry-through" + rank: "should-inspect" + condition: "Usage counts the existing model_retry_scheduled event; no separate repair counter or persistence path is introduced." + + - from: "surface.conversation-model-control" + to: "shared-ui.model-config-select" + type: "shares-component" + rank: "must-inspect" + - from: "surface.automation-edit" + to: "shared-ui.model-config-select" + type: "shares-component" + rank: "must-inspect" + - from: "surface.user-subagent-form" + to: "shared-ui.model-config-select" + type: "shares-component" + rank: "must-inspect" + - from: "surface.builtin-subagent-model" + to: "shared-ui.model-config-select" + type: "shares-component" + rank: "must-inspect" + + - from: "surface.conversation-model-control" + to: "shared-ui.model-select-groups" + type: "options-from" + rank: "should-inspect" + - from: "surface.automation-edit" + to: "shared-ui.model-select-groups" + type: "options-from" + rank: "should-inspect" + - from: "surface.user-subagent-form" + to: "shared-ui.model-select-groups" + type: "options-from" + rank: "should-inspect" + - from: "surface.builtin-subagent-model" + to: "shared-ui.model-select-groups" + type: "options-from" + rank: "should-inspect" + + - from: "shared-ui.model-select-groups" + to: "service.host-model-selection" + type: "projects-ready-view-from" + rank: "must-inspect" + condition: "The builder only accepts a Ready target-host ModelSelectionView; loading, unavailable, and error remain caller-owned lifecycle states." + - from: "capability.model-capabilities" + to: "shared-ui.model-select-groups" + type: "projects-vision-badge-from-input-format" + rank: "must-inspect" + condition: "Any enabled non-text properties.input_format leaf marks the model item as Vision; model ids remain opaque strings, including nested slashes." + - from: "capability.model-capabilities" + to: "surface.provider-settings" + type: "renders-vision-badge-in" + rank: "must-inspect" + condition: "The compact model row renders Vision beside context capacity without changing model metadata or persistence." + - from: "surface.provider-settings" + to: "service.provider-settings" + type: "commits-to" + rank: "must-inspect" + - from: "surface.provider-settings" + to: "capability.provider-registry" + type: "configures-explicit-model-input-format-for" + rank: "must-inspect" + condition: "Text is locked for input, output is text-only, Image/Video are editable, hidden Audio/PDF leaves are preserved, and changes affect Models created after the Registry refresh." + - from: "surface.provider-settings" + to: "capability.provider-registry" + type: "configures-provider-owned-model-membership-activation-and-order-for" + rank: "must-inspect" + condition: "Built-in ids are read-only, Personal ids are editable, Effective Model Config enabled controls activation, and providerOrder/modelOrder control sorting. Disabled members remain editable but cannot be tested or created; Built-in wins duplicate ids and later duplicates are ignored then normalized on save." + - from: "surface.provider-settings" + to: "capability.provider-registry" + type: "resolves-model-config-rules-for-draft-display" + rank: "must-inspect" + condition: "Add/edit Model dialogs share resolveModelConfig and a 1200ms idle/blur flush trigger; persisted Personal Config remains sparse, Renderer discards stale resolutions, and only reports loaded defaults when inheritedConfig actually changes." + - from: "capability.provider-registry" + to: "surface.provider-settings" + type: "renders-builtin-provider-connection-facts-read-only-in" + rank: "must-inspect" + condition: "Standard Built-in Providers display the same Base URL and API Schema facts as Personal Providers, but freeze those Built-in-owned fields; API Key and Personal Model Config permissions remain independent." + - from: "capability.provider-registry" + to: "shared-ui.model-select-groups" + type: "projects-visible-enabled-candidates-to" + rank: "must-inspect" + condition: "Only executable members from visible Providers enter user candidates. Hidden Providers remain available to exact internal Registry creation; disabled, incomplete, or duplicate-later members do not enter Registry or fallback, and candidate order is preserved without UI re-sorting." + - from: "service.model-provider" + to: "persistence.model-provider-config" + type: "persists-through" + rank: "must-inspect" + - from: "persistence.model-provider-config" + to: "capability.provider-registry" + type: "projects-explicit-input-output-format-into" + rank: "must-inspect" + - from: "service.model-provider" + to: "capability.provider-registry" + type: "owns-registry-for" + rank: "must-inspect" + - from: "capability.provider-registry" + to: "service.active-session-model-limits" + type: "supplies-explicitly-selected-model-limits-to" + rank: "must-inspect" + condition: "Selection/admission supplies the chosen Model limits; a Provider Config refresh alone must not hot-mutate an already created Active Model." + - from: "service.active-session-model-limits" + to: "capability.conversation-runtime" + type: "updates-runtime-config-for" + rank: "must-inspect" + - from: "service.active-session-model-limits" + to: "state.conversation-projection" + type: "projects-capacity-to" + rank: "must-inspect" + condition: "A same-model ModelSelected replaces maxTokens, preserves usedTokens, and uses null for unknown capacity." + + - from: "surface.conversation-model-control" + to: "state.conversation-projection" + type: "commits-to" + rank: "must-inspect" + - from: "capability.conversation-runtime" + to: "surface.conversation-query-edit" + type: "renders-in" + rank: "must-inspect" + - from: "capability.provider-retry-live-tail" + to: "state.conversation-projection" + type: "projects-from" + rank: "must-inspect" + condition: "ProductProjection owns the authoritative control.apiRetry runtime state; UI does not infer retry from transport or elapsed time." + - from: "capability.provider-retry-live-tail" + to: "surface.subagent-session-detail" + type: "renders-in" + rank: "must-inspect" + condition: "Main and read-only child details share ConversationTimeline; child display does not enable manual retry." + - from: "capability.provider-retry-live-tail" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + condition: "The <=2 presentation threshold must not alter desktop direct continuous delivery or runtime snapshot authority." + - from: "capability.provider-retry-live-tail" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + condition: "The <=2 presentation threshold must not alter mobile replayable gap/snapshot recovery." + - from: "capability.provider-retry-live-tail" + to: "evidence.conversation-catalog" + type: "covered-by" + rank: "evidence-only" + condition: "SAT25, SAT25a and SAT25b define the threshold equivalence classes and their loading/retry assertions." + - from: "capability.model-stream-recovery" + to: "capability.provider-retry-live-tail" + type: "projects-recovery-status-through" + rank: "must-inspect" + condition: "Adapter pre-output retries and core safe-anchor recovery share control.apiRetry, but reasoning remains real-time and therefore recovers in core after crossing the adapter boundary." + - from: "capability.model-stream-recovery" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "capability.model-stream-recovery" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "capability.model-stream-recovery" + to: "evidence.conversation-fault-catalog" + type: "covered-by" + rank: "evidence-only" + condition: "Fault subcase S02-R1 defines reasoning-only retryable interruption recovery while preserving tool, cancellation, queue, and delivery boundaries." + - from: "capability.model-empty-completion-retry" + to: "capability.provider-retry-live-tail" + type: "projects-recovery-status-through" + rank: "must-inspect" + condition: "Generic zero-output completions publish the same model_request_failed/model_retry_scheduled status path while the adapter-specific empty-completion budget remains capped at one retry." + - from: "capability.ask-user-question-auto-resolution" + to: "surface.ask-user-question-auto-resolution-setting" + type: "configured-in" + rank: "must-inspect" + - from: "surface.ask-user-question-auto-resolution-setting" + to: "persistence.app-settings" + type: "persists-to" + rank: "must-inspect" + - from: "persistence.app-settings" + to: "service.interaction-auto-resolution-runtime" + type: "syncs-runtime-preference-to" + rank: "must-inspect" + condition: "Each renderer syncs the app-global preference to its connected local or remote host and cached remote Bot runtimes; inactive workspaces and uncached Bot targets do not spawn a Host or CLI only for preference delivery." + - from: "service.interaction-auto-resolution-runtime" + to: "surface.parent-task-blocking-interaction" + type: "projects-authoritative-state-to" + rank: "must-inspect" + - from: "service.interaction-auto-resolution-runtime" + to: "boundary.workspace-key" + type: "routes-by" + rank: "must-inspect" + - from: "service.interaction-auto-resolution-runtime" + to: "boundary.desktop-continuous" + type: "projects-through" + rank: "invariant-only" + - from: "service.interaction-auto-resolution-runtime" + to: "boundary.web-remote-replayable" + type: "recovers-through" + rank: "invariant-only" + - from: "capability.ask-user-question-auto-resolution" + to: "evidence.conversation-catalog" + type: "covered-by" + rank: "evidence-only" + - from: "capability.subagents" + to: "state.subagent-child-runtime" + type: "executes-with" + rank: "must-inspect" + condition: "Agent tool input does not select a model; the resolved Agent profile is the only child-model authority, with parent-model inheritance when profile.model is absent." + - from: "capability.subagents" + to: "surface.subagent-session-detail" + type: "renders-child-owned-conversation-in" + rank: "must-inspect" + - from: "surface.subagent-session-detail" + to: "state.conversation-projection" + type: "projects-from" + rank: "must-inspect" + condition: "Main and child details share SessionPane and ConversationTimeline; read-only child details may display provider retry and durable initial-model facts without enabling composer or row actions." + - from: "state.subagent-child-runtime" + to: "persistence.session-model-timeline" + type: "persists-initial-effective-model-to" + rank: "must-inspect" + condition: "Only a fresh child records model_change with absent source before its first input; resumed and pre-existing children are not backfilled." + - from: "persistence.session-model-timeline" + to: "state.conversation-projection" + type: "recovers-model-boundaries-through" + rank: "must-inspect" + condition: "A source-less model_change synthesizes previousModelRef=null as a generic empty-to-model boundary; ordinary A-to-B model changes keep complete source identity." + - from: "surface.subagent-session-detail" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "surface.subagent-session-detail" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "capability.subagents" + to: "surface.parent-task-blocking-interaction" + type: "renders-blocking-interactions-in" + rank: "must-inspect" + - from: "state.subagent-child-runtime" + to: "service.subagent-interaction-broker" + type: "delegates-blocking-interactions-through" + rank: "must-inspect" + - from: "state.subagent-child-runtime" + to: "state.conversation-projection" + type: "mirrors-blocking-interaction-events-to" + rank: "must-inspect" + condition: "PermissionRequested/Resolved/Denied events use the parent session while preserving the child origin and stable mirrored tool identity." + - from: "service.subagent-interaction-broker" + to: "state.conversation-projection" + type: "shares-parent-request-identity-with" + rank: "must-inspect" + condition: "The broker response route and parent projection share the unchanged requestId; the broker alone does not create pendingInteractions." + - from: "state.conversation-projection" + to: "surface.parent-task-blocking-interaction" + type: "drives" + rank: "must-inspect" + - from: "capability.conversation-runtime" + to: "surface.conversation-tool-call" + type: "renders-in" + rank: "must-inspect" + - from: "surface.conversation-tool-call" + to: "state.conversation-projection" + type: "projects-from" + rank: "must-inspect" + - from: "surface.conversation-tool-call" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "surface.conversation-tool-call" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "state.subagent-child-runtime" + to: "state.conversation-projection" + type: "must-not-persist-raw-events-to" + rank: "invariant-only" + condition: "Raw child events and model-io remain child-owned; only parent-routed live interaction/tool mirrors enter the parent projection." + - from: "surface.conversation-query-edit" + to: "service.conversation-row-actions" + type: "commits-to" + rank: "must-inspect" + - from: "service.conversation-row-actions" + to: "state.conversation-projection" + type: "resolves-target-from" + rank: "must-inspect" + condition: "canEdit and editUserQuery must share the same canonical edit target authority at one projection revision." + - from: "state.conversation-projection" + to: "capability.conversation-runtime" + type: "owns-runtime-for" + rank: "must-inspect" + - from: "state.conversation-projection" + to: "evidence.conversation-catalog" + type: "covered-by" + rank: "evidence-only" + condition: "A12 covers the normal sendText path: timely authoritative row/queue settles without recovery; complete topic silence triggers one same-sub resync and never replays the command." + - from: "state.conversation-projection" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + condition: "Accepted-input projection watchdog reuses same-sub recovery and never switches desktop continuous to replayable delivery." + - from: "state.conversation-projection" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + condition: "Accepted-input projection watchdog reuses the existing replayable same-sub recovery; it does not create a host-local queue or bypass snapshot/gap recovery." + - from: "capability.conversation-query-navigation" + to: "surface.conversation-query-navigator" + type: "renders-in" + rank: "must-inspect" + - from: "surface.conversation-query-navigator" + to: "state.conversation-projection" + type: "projects-from" + rank: "must-inspect" + - from: "surface.conversation-query-navigator" + to: "service.conversation-rows-range" + type: "hydrates-through" + rank: "must-inspect" + condition: "Only while the pane-wide navigator passes its layout gate; narrow mobile does not hydrate full history for a hidden rail." + - from: "service.conversation-rows-range" + to: "state.conversation-projection" + type: "reads-authoritative-history-from" + rank: "must-inspect" + - from: "surface.conversation-query-navigator" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "surface.conversation-query-navigator" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + + - from: "capability.task-persistence" + to: "service.session-runtime-activation" + type: "restores-through" + rank: "must-inspect" + - from: "capability.workspace-identity" + to: "service.persisted-remote-session-repair" + type: "repairs-legacy-state-through" + rank: "must-inspect" + condition: "Only task-allowlisted null identities or deterministic historical remote path shapes may be repaired; ambiguous path-only ownership stays fail-closed." + - from: "service.persisted-remote-session-repair" + to: "service.session-runtime-activation" + type: "repairs-before-materialization" + rank: "must-inspect" + - from: "service.persisted-remote-session-repair" + to: "boundary.workspace-key" + type: "preserves-isolation" + rank: "must-inspect" + - from: "service.session-runtime-activation" + to: "state.conversation-projection" + type: "activates-before-hydration" + rank: "must-inspect" + condition: "V4 cold subscribe preserves runtime/config/workspace/restore-warning side effects but must not materialize a legacy full session snapshot. One gateway READY promise covers activation and projection hydration; query and command wait before reading current facts." + - from: "service.session-runtime-activation" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "service.session-runtime-activation" + to: "boundary.web-remote-replayable" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "service.session-runtime-activation" + to: "boundary.workspace-key" + type: "preserves-isolation" + rank: "must-inspect" + - from: "capability.agent-core-runtime" + to: "capability.session-residency-management" + type: "provides-authoritative-work-guards-to" + rank: "must-inspect" + condition: "Resident eviction must use the runtime-owned blocking-work aggregate (active/queued/runtime-drain, task registry, detached sidecars, memory work) plus protocol finalization leases; activeAbortController alone is insufficient." + - from: "capability.session-residency-management" + to: "capability.conversation-runtime" + type: "bounds-resident-materialization-of" + rank: "must-inspect" + condition: "Each CLI targets a bounded number of resident sessions but may exceed the target while sessions are protected; cross-session concurrency remains unlimited." + - from: "capability.session-residency-management" + to: "service.session-runtime-activation" + type: "reactivates-through" + rank: "must-inspect" + condition: "Deactivated sessions are indistinguishable from never-loaded persisted sessions and reuse the existing cold-resume path." + - from: "capability.session-residency-management" + to: "state.conversation-projection" + type: "coordinates-lifecycle-through-subscription" + rank: "should-inspect" + condition: "Renderer projection stores release their own pane leases and unsubscribe before CLI eviction becomes eligible; no deactivation notification is sent." + - from: "capability.session-residency-management" + to: "persistence.task-index" + type: "must-not-remove-from" + rank: "invariant-only" + condition: "Resident eviction releases runtime memory only and never emits session.removed or changes task-list membership." + - from: "capability.session-residency-management" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + condition: "An active desktop conversation subscription protects its resident session." + - from: "capability.session-residency-management" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery" + rank: "invariant-only" + condition: "A V4 replayable subscription protects its session; the current legacy session/subscribe stream has no unsubscribe and remains conservatively protected. Existing snapshot/gap/cold-resume boundaries do not change." + - from: "capability.session-residency-management" + to: "boundary.workspace-key" + type: "must-preserve-isolation" + rank: "invariant-only" + condition: "The pool is process-local and session-addressed; remote workspace routing keeps workspaceIdentity?.trim() || workspacePath." + - from: "capability.session-residency-management" + to: "evidence.conversation-catalog" + type: "covered-by" + rank: "evidence-only" + - from: "surface.automation-edit" + to: "state.automation-form-draft" + type: "owns-draft" + rank: "must-inspect" + - from: "surface.automation-template-gallery" + to: "shared-ui.automation-template-catalog" + type: "options-from" + rank: "must-inspect" + - from: "surface.off-peak-home-template-carousel" + to: "shared-ui.automation-template-catalog" + type: "options-from" + rank: "must-inspect" + condition: "The home surface keeps the first two ordinary remote templates plus local Customize, clamps descriptions to two lines, and resolves each locale from ClientSceneItem.descs before falling back to contents; contents remains the draft prompt source." + - from: "shared-ui.automation-template-catalog" + to: "service.client-scenes" + type: "loads-from" + rank: "must-inspect" + condition: "scheduled-task and off-peak-task are candidate-only remote configuration; blank-title items are rejected; prompt item img is a Lucide canonical name shared by the New task home cards and Automations gallery, imgs is ignored, and unknown names preserve each surface's local Lucide fallback; scheduled cron must round-trip through the Automation editor without loss; pending Automations galleries show four skeleton cards per visible section and settled empty catalogs show a localized unavailable state; the home carousel alone appends one local Customize fallback when remote data omits it." + - from: "surface.automation-template-gallery" + to: "state.automation-form-draft" + type: "prefills" + rank: "must-inspect" + condition: "Click materializes current-locale values into a normal local draft and never creates or sends automatically." + - from: "surface.off-peak-home-template-carousel" + to: "surface.off-peak-creation" + type: "prefills" + rank: "must-inspect" + condition: "Click freezes current-locale labels and contents before navigation; display-only descs must not replace the contents-backed draft prompt, and later locale or Client Scenes refresh cannot overwrite user edits." + - from: "shared-ui.automation-template-catalog" + to: "persistence.automation-record" + type: "must-not-persist-to" + rank: "invariant-only" + condition: "Only user-confirmed final form values persist; Client Scenes scene, item, defaults, and labels metadata remain candidate-only." + - from: "state.automation-form-draft" + to: "service.automation" + type: "commits-to" + rank: "must-inspect" + - from: "capability.automations" + to: "surface.conversation-automation-tools" + type: "renders-in" + rank: "must-inspect" + - from: "surface.conversation-automation-tools" + to: "service.automation" + type: "commits-to" + rank: "must-inspect" + condition: "Agent tool writes must remain scoped to the current workspace and preserve automation identity and run history." + - from: "service.automation" + to: "persistence.automation-record" + type: "persists-to" + rank: "must-inspect" + - from: "persistence.automation-record" + to: "capability.automations" + type: "owns-config-for" + rank: "must-inspect" + - from: "surface.user-subagent-form" + to: "state.subagent-form-draft" + type: "owns-draft" + rank: "must-inspect" + - from: "state.subagent-form-draft" + to: "service.subagents" + type: "commits-to" + rank: "must-inspect" + - from: "surface.builtin-subagent-model" + to: "service.subagents" + type: "commits-to" + rank: "must-inspect" + - from: "service.subagents" + to: "persistence.subagent-markdown" + type: "persists-to" + rank: "must-inspect" + condition: "Each Environment persists its own user, workspace, and built-in Subagent configuration; current Settings writes Local Host configuration only and does not synchronize to remote Environments." + - from: "persistence.subagent-markdown" + to: "capability.subagents" + type: "owns-config-for" + rank: "must-inspect" + - from: "capability.oauth-login-attribution" + to: "service.oauth" + type: "handled-by" + rank: "must-inspect" + - from: "service.oauth" + to: "state.oauth-pending-callback" + type: "owns-lifecycle" + rank: "must-inspect" + - from: "service.oauth" + to: "persistence.oauth-login-attribution" + type: "persists-to" + rank: "must-inspect" + - from: "service.telemetry-core" + to: "persistence.oauth-login-attribution" + type: "reads-best-effort" + rank: "should-inspect" + condition: "Attribution credential failures must not block telemetry delivery." + + - from: "surface.automation-edit" + to: "state.conversation-projection" + type: "must-not-mutate" + rank: "invariant-only" + condition: "Opening, editing, or cancelling an automation must not change the current workspace or conversation model." + + - from: "capability.off-peak-telemetry" + to: "surface.off-peak-creation" + type: "renders-in" + rank: "must-inspect" + - from: "capability.off-peak-telemetry" + to: "surface.off-peak-upgrade" + type: "renders-in" + rank: "must-inspect" + - from: "surface.off-peak-upgrade" + to: "state.coding-plan-purchase-funnel" + type: "starts-funnel-with" + rank: "must-inspect" + condition: "Both idle-time Upgrade entries use app.session/session_idle_time and one purchase_funnel_id." + - from: "state.coding-plan-purchase-funnel" + to: "state.oauth-pending-callback" + type: "must-survive-auth-rerender" + rank: "must-inspect" + condition: "OAuth refresh may update credentials and products but must preserve purchase_funnel_id, upgrade_source, and entry plan state." + - from: "state.coding-plan-purchase-funnel" + to: "service.telemetry-core" + type: "reports-through-existing-route" + rank: "must-inspect" + condition: "Upgrade, product, cycle, pay, and result events reuse the same funnel context." + - from: "surface.off-peak-creation" + to: "service.off-peak-task" + type: "commits-to" + rank: "must-inspect" + condition: "Creation returns a structured business result before best-effort telemetry and never exposes raw errors." + - from: "service.off-peak-task" + to: "capability.off-peak-model-execution" + type: "dispatches" + rank: "must-inspect" + condition: "The scheduler supplies a standard idle ModelSelection plus request auth, ticket, attribution, and optional child override; it does not construct a Provider snapshot after M4." + - from: "service.off-peak-task" + to: "capability.provider-registry" + type: "reads-current-eligibility" + rank: "must-inspect" + condition: "start only waits for readiness; Host credentials use the latest completed snapshot and Registry View revisions invalidate the shared UI eligibility check." + - from: "capability.off-peak-model-execution" + to: "capability.provider-registry" + type: "creates-model-through" + rank: "must-inspect" + condition: "The complete hidden idle Provider may be preflighted through the ordinary Registry before dispatch and is finally validated when the ordinary ModelFactory builds the Model; no execution Registry or temporary Provider source exists." + - from: "capability.off-peak-model-execution" + to: "capability.model-capabilities" + type: "reads-effective-model-config-from" + rank: "must-inspect" + condition: "Context, output limits, input/output formats, options, and reasoning mappings come from Built-in Model Config Rules rather than Host inference." + - from: "capability.off-peak-model-execution" + to: "capability.subagents" + type: "overrides-foreground-child-selection-for" + rank: "must-inspect" + condition: "Each foreground child creates its own Model with the idle selection and request auth; background children fail closed before requesting a model." + - from: "capability.off-peak-model-execution" + to: "state.off-peak-turn-attribution" + type: "attributes-actual-model-through" + rank: "must-inspect" + condition: "Usage, trace, and errors retain the actual idle providerId/modelId while offPeakTaskId and ticket remain execution dimensions." + - from: "capability.off-peak-model-execution" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "capability.off-peak-model-execution" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + condition: "The narrow execution context is not replayable session state and does not create a mobile Off-Peak product path." + - from: "service.off-peak-task" + to: "state.off-peak-turn-attribution" + type: "dispatches-with-stable-identity" + rank: "must-inspect" + condition: "Every automatic turn has a distinct message identity while preserving the stable offPeakTaskId across one or more talks." + - from: "state.off-peak-turn-attribution" + to: "service.telemetry-core" + type: "reports-through-existing-route" + rank: "must-inspect" + condition: "Desktop uses the active CCbuddy business telemetry route; Web remains no-op and no reliable outbox is introduced." + - from: "state.off-peak-turn-attribution" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "state.off-peak-turn-attribution" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + - from: "state.subagent-form-draft" + to: "state.conversation-projection" + type: "must-remain-isolated-from" + rank: "invariant-only" + + - from: "capability.conversation-runtime" + to: "boundary.desktop-continuous" + type: "delivered-by" + rank: "conditional" + condition: "Desktop local main path." + - from: "capability.conversation-runtime" + to: "boundary.web-remote-replayable" + type: "recovers-via" + rank: "conditional" + condition: "Mobile web remote path." + - from: "capability.remote-delivery" + to: "service.shared-host-attachment" + type: "implemented-by" + rank: "must-inspect" + - from: "capability.remote-delivery" + to: "surface.mobile-remote-task-home" + type: "renders-in" + rank: "must-inspect" + - from: "capability.remote-delivery" + to: "surface.desktop-web-remote-control-dialog" + type: "renders-in" + rank: "must-inspect" + - from: "surface.desktop-web-remote-control-dialog" + to: "service.desktop-web-remote-control-authorization" + type: "commits-start-and-reset-through" + rank: "must-inspect" + - from: "service.desktop-web-remote-control-authorization" + to: "service.shared-host-attachment" + type: "dispatches-start-before" + rank: "must-inspect" + - from: "surface.mobile-remote-task-home" + to: "state.web-remote-task-target-projection" + type: "projects-from" + rank: "must-inspect" + - from: "state.web-remote-task-target-projection" + to: "state.task-list-row-projection" + type: "derives-live-activity-from" + rank: "must-inspect" + condition: "When a row carries sessions-index activity, its phase overrides contradictory renderer runtime and persisted status caches for every user-visible display state." + - from: "state.web-remote-task-target-projection" + to: "boundary.web-remote-replayable" + type: "delivered-by" + rank: "must-inspect" + - from: "state.web-remote-task-target-projection" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery-semantics" + rank: "invariant-only" + - from: "state.web-remote-task-target-projection" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "must-inspect" + - from: "boundary.web-remote-replayable" + to: "service.shared-host-attachment" + type: "attaches-through" + rank: "must-inspect" + - from: "boundary.web-remote-replayable" + to: "boundary.desktop-continuous" + type: "must-remain-isolated-from" + rank: "invariant-only" + + - from: "capability.workspace-identity" + to: "service.workspace-identity-builder" + type: "implemented-by" + rank: "must-inspect" + - from: "capability.remote-file-actions" + to: "surface.git-review-file-actions" + type: "renders-in" + rank: "must-inspect" + - from: "capability.remote-file-actions" + to: "surface.project-task-list" + type: "renders-in" + rank: "must-inspect" + - from: "surface.git-review-file-actions" + to: "shared-ui.remote-file-context-actions" + type: "commits-to" + rank: "must-inspect" + - from: "surface.project-task-list" + to: "shared-ui.remote-file-context-actions" + type: "commits-to" + rank: "must-inspect" + - from: "shared-ui.remote-file-context-actions" + to: "capability.workspace-identity" + type: "resolves-target-with" + rank: "must-inspect" + condition: "Remote file actions must match workspaceIdentity and remoteSessionId before passing a sanitized WSL or SSH target to the platform boundary." + + - from: "capability.prompt-attachment-materialization" + to: "surface.conversation-composer-attachments" + type: "renders-in" + rank: "must-inspect" + - from: "surface.conversation-composer-attachments" + to: "service.prompt-attachment-transfer" + type: "commits-to" + rank: "must-inspect" + condition: "Host-local attachments with any non-empty workspaceIdentity, including identities unknown to the current parser, must wait for remoteSessionId and stage before send admission." + - from: "capability.prompt-attachment-materialization" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "must-inspect" + - from: "capability.prompt-attachment-materialization" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "invariant-only" + condition: "Renderer-local upload progress is not replayable task state; mobile keeps using the attached shared host." + - from: "capability.video-input" + to: "capability.prompt-attachment-materialization" + type: "uses" + rank: "must-inspect" + - from: "capability.video-input" + to: "capability.model-capabilities" + type: "validates-effective-capability-with" + rank: "must-inspect" + condition: "Provider-visible video requires both model support and a provider adapter wire format that can encode video." + - from: "capability.video-input" + to: "persistence.session-media-artifacts" + type: "persists-provider-neutral-source-to" + rank: "must-inspect" + condition: "Session messages and completed tool parts persist artifact references and media metadata; the current provider base64 wire payload is derived at request time rather than stored as the sole fact." + - from: "capability.video-input" + to: "surface.conversation-sent-media-preview" + type: "renders-in" + rank: "must-inspect" + condition: "Sent image/video attachments in one user message share an ordered gallery with wrapping previous/next and keyboard navigation; composer and sent grid video thumbnails share a centered translucent blurred circular play affordance; visible mounted rows resolve exact-row video preview sources artifact-first, with Desktop local workspaces playing artifact/local_ref paths only after Host asks Main to authorize their canonical paths, while remote or unavailable-path cases use bounded chunked Blob URLs; image-only transform/download controls stay isolated from native video playback, and decode/read failure changes only the active preview item rather than input semantics." + - from: "capability.video-input" + to: "surface.conversation-composer-attachments" + type: "renders-in" + rank: "must-inspect" + condition: "Composer image/video attachments with local object URLs share the same ordered media gallery and starting-index behavior; preview navigation must not mutate upload, removal, or send state." + - from: "surface.conversation-sent-media-preview" + to: "persistence.session-media-artifacts" + type: "reads-exact-row-artifact-from" + rank: "must-inspect" + condition: "The CLI authorizes row identity and attachment index. Desktop local preview prefers an artifact-derived .ccbuddy media path, uses an authorized metadata-only local_ref only when no artifact exists, and Host registers the selected realpath with Main before renderer playback; arbitrary absolute paths in renderer URLs remain denied. Artifact path materialization failure still falls back only to chunked artifact bytes." + - from: "surface.conversation-sent-media-preview" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + condition: "Only Desktop local workspaces request local media paths. Web/mobile and remote workspaces retain the attached-host chunk query; relay and main do not own session/replay state or start another runtime." + - from: "persistence.session-media-artifacts" + to: "capability.model-selection" + type: "rehydrates-for-current-provider" + rank: "must-inspect" + condition: "In-conversation model switches and cold resume rebuild media from durable artifacts, then derive the current provider base64 request shape." + - from: "persistence.session-media-artifacts" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + condition: "Media artifacts remain shared-host session facts; relay and mobile replayable state do not become binary owners or start a second runtime." + - from: "capability.video-input" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery-semantics" + rank: "invariant-only" + condition: "Video payload support does not move task, stream, queue, or snapshot ownership into the mobile replayable boundary." + - from: "service.workspace-identity-builder" + to: "boundary.workspace-key" + type: "produces" + rank: "must-inspect" + - from: "capability.remote-delivery" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "conditional" + - from: "capability.task-persistence" + to: "persistence.task-index" + type: "indexed-by" + rank: "must-inspect" + - from: "capability.task-persistence" + to: "surface.project-task-list" + type: "renders-in" + rank: "must-inspect" + - from: "capability.task-title-overflow-marquee" + to: "shared-ui.task-title-overflow-text" + type: "implemented-by" + rank: "must-inspect" + - from: "capability.task-title-overflow-marquee" + to: "surface.project-task-list" + type: "renders-in" + rank: "must-inspect" + - from: "capability.task-title-overflow-marquee" + to: "surface.grouped-task-list" + type: "renders-in" + rank: "must-inspect" + - from: "capability.task-title-overflow-marquee" + to: "surface.pinned-task-list" + type: "renders-in" + rank: "must-inspect" + - from: "capability.task-title-overflow-marquee" + to: "surface.mobile-remote-task-home" + type: "shares-static-overflow-structure-with" + rank: "conditional" + condition: "Touch has no stable hover contract; mobile reuses static overflow DOM and mask only." + - from: "shared-ui.task-title-overflow-text" + to: "state.task-list-row-projection" + type: "renders-title-from" + rank: "should-inspect" + condition: "Presentation must not mutate membership, navigation, activity, or workspace identity." + - from: "capability.task-persistence" + to: "surface.grouped-task-list" + type: "renders-in" + rank: "must-inspect" + - from: "capability.task-persistence" + to: "surface.pinned-task-list" + type: "renders-in" + rank: "must-inspect" + - from: "surface.project-task-list" + to: "state.task-list-row-projection" + type: "projects-from" + rank: "must-inspect" + - from: "surface.grouped-task-list" + to: "state.task-list-row-projection" + type: "projects-from" + rank: "must-inspect" + - from: "surface.pinned-task-list" + to: "state.task-list-row-projection" + type: "projects-from" + rank: "must-inspect" + - from: "surface.grouped-task-list" + to: "surface.pinned-task-list" + type: "renders-alongside" + rank: "must-inspect" + condition: "Desktop Group view renders the global pinned section above the grouped body; pinned tasks are excluded from the grouped body so each task appears once." + - from: "state.task-list-row-projection" + to: "service.ccbuddy-task-list" + type: "queries-through" + rank: "must-inspect" + - from: "capability.conversation-runtime" + to: "service.ccbuddy-task-index-syncer" + type: "publishes-visible-task-summary-to" + rank: "must-inspect" + condition: "A persisted fork child must publish its hydrated non-draft summary without waiting for another runtime event or process restart." + - from: "service.ccbuddy-task-index-syncer" + to: "persistence.task-index" + type: "persists-visible-task-row-to" + rank: "must-inspect" + condition: "The first non-draft summary creates exactly one task row and emits task_created for task-list cache invalidation." + - from: "service.ccbuddy-task-list" + to: "persistence.task-index" + type: "reads-writes" + rank: "must-inspect" + - from: "persistence.task-index" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "must-inspect" + condition: "Task-index reads keep SQLite entity coordinates authoritative over stale meta_json and recover legacy remote identity only from a valid remote workspace_key." + - from: "state.task-list-row-projection" + to: "state.conversation-projection" + type: "enriched-by" + rank: "should-inspect" + condition: "Conversation and sessions-index facts enrich activity/detail but do not own row membership." + - from: "state.task-list-row-projection" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "must-inspect" + - from: "persistence.task-index" + to: "state.conversation-projection" + type: "must-not-authorize" + rank: "invariant-only" + condition: "Task index metadata is not the authority for session content or current runtime settings." + + - from: "capability.mcp-async-tool-catalog" + to: "state.mcp-tool-catalog-cache" + type: "cached-by" + rank: "must-inspect" + - from: "capability.mcp-async-tool-catalog" + to: "service.mcp-session-runtime" + type: "executes-through" + rank: "must-inspect" + condition: "Cached catalog entries advertise tools only; every invocation must wait for and resolve against the current session live MCP runtime, and stale issued contracts remain resolvable through provider-invisible tombstones." + - from: "state.mcp-tool-catalog-cache" + to: "service.mcp-session-runtime" + type: "advertises-before-live-readiness-of" + rank: "must-inspect" + condition: "A complete fresh stdio catalog may unblock provider sampling while the independent session-scoped live runtime is still starting." + - from: "service.mcp-session-runtime" + to: "capability.conversation-runtime" + type: "provides-tools-to" + rank: "must-inspect" + - from: "surface.customize-capability-settings" + to: "state.mcp-tool-catalog-cache" + type: "must-not-project-readiness-from" + rank: "invariant-only" + condition: "MCP settings status remains a live control-plane fact; a catalog hit must never render as connected." + - from: "state.mcp-tool-catalog-cache" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "must-inspect" + condition: "Catalog identity uses workspaceIdentity?.trim() || workspacePath; Phase 2 keeps every remote lookup unsupported, and remote cache may be enabled only after real workspace and remote-session identity reach the runtime." + - from: "capability.mcp-async-tool-catalog" + to: "capability.subagents" + type: "must-preserve-live-borrowing-for" + rank: "invariant-only" + condition: "Subagents inherit the parent connected, scope-filtered live snapshot and never gain execution authority from advertisement cache." + - from: "capability.mcp-async-tool-catalog" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.mcp-async-tool-catalog" + to: "boundary.web-remote-replayable" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.mcp-async-tool-catalog" + to: "evidence.mcp-runtime-tests" + type: "covered-by" + rank: "evidence-only" + - from: "capability.conversation-runtime" + to: "evidence.conversation-catalog" + type: "covered-by" + rank: "evidence-only" + - from: "capability.composer-trigger-routing" + to: "surface.composer-at-context-picker" + type: "renders-in" + rank: "must-inspect" + condition: "The @ primary groups are ordered Plugins, files, sessions, then retained Whiteboards; its sessions group remains current-workspace only. # remains a compatible sessions trigger and aggregates opened/restored workspace scopes that share the current Agent service/session-store authority, while foreign or disconnected remote authorities stay excluded." + - from: "capability.composer-trigger-routing" + to: "surface.composer-slash-capability-picker" + type: "renders-in" + rank: "must-inspect" + condition: "The slash groups remain commands, Skills, then Subagents; $ and Yen aliases remain compatible Skills triggers." + - from: "capability.composer-trigger-routing" + to: "surface.composer-skill-compatibility-picker" + type: "renders-in" + rank: "must-inspect" + condition: "$ and Yen aliases route to the same provider-filtered Skill catalog as the slash Skills group without changing canonical Skill mention Markdown." + - from: "capability.skill-catalog-discovery" + to: "service.workspace-skills-catalog" + type: "served-by" + rank: "must-inspect" + - from: "service.workspace-skills-catalog" + to: "persistence.skill-roots" + type: "reads-from" + rank: "must-inspect" + condition: "At every workspace ancestor through the worktree root, .ccbuddy/skills and .agents/skills are merged; the presence of one root must not suppress the other. User and Plugin roots retain their existing discovery contracts." + - from: "capability.skill-catalog-discovery" + to: "capability.agent-core-runtime" + type: "must-match-discovery-roots-of" + rank: "must-inspect" + condition: "Host/UI catalog discovery and Agent runtime discovery merge the same workspace .ccbuddy/skills and .agents/skills roots so visible references match executable capabilities." + - from: "capability.skill-catalog-discovery" + to: "surface.customize-capability-settings" + type: "renders-in" + rank: "must-inspect" + - from: "capability.skill-catalog-discovery" + to: "surface.composer-slash-capability-picker" + type: "renders-in" + rank: "must-inspect" + - from: "capability.skill-catalog-discovery" + to: "surface.composer-skill-compatibility-picker" + type: "renders-in" + rank: "must-inspect" + - from: "capability.skill-catalog-discovery" + to: "evidence.skill-catalog-discovery-tests" + type: "covered-by" + rank: "evidence-only" + - from: "capability.plan-slash-shortcut" + to: "surface.composer-slash-capability-picker" + type: "renders-in" + rank: "must-inspect" + condition: "The app protocol catalog exposes /plan [task] for desktop, Web, and /remote Composer surfaces; selection inserts the command token and does not execute it." + - from: "capability.plan-slash-shortcut" + to: "state.conversation-projection" + type: "commits-through" + rank: "must-inspect" + condition: "A task-bearing shortcut commits the existing mode CAS before ordinary sendText; an empty shortcut only changes mode and creates no user/provider turn." + - from: "capability.plan-slash-shortcut" + to: "capability.conversation-runtime" + type: "depends-on" + rank: "must-inspect" + condition: "The shortcut is syntactic sugar over switchCollaborationMode, createSession config.mode, and sendText; it adds no wire command, queue, or persistence authority." + - from: "capability.plan-slash-shortcut" + to: "boundary.workspace-key" + type: "preserves-execution-scope" + rank: "invariant-only" + condition: "Workspace identity continues to use workspaceIdentity?.trim() || workspacePath, with remoteSessionId carried by existing session routing." + - from: "capability.plan-slash-shortcut" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.plan-slash-shortcut" + to: "boundary.web-remote-replayable" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.plan-slash-shortcut" + to: "evidence.conversation-catalog" + type: "covered-by" + rank: "evidence-only" + - from: "capability.selection-side-chat" + to: "surface.conversation-selection-side-slash" + type: "renders-in" + rank: "must-inspect" + condition: "App-local /side and /btw remain available for created desktop parent sessions, including running parents; draft, selection-side-chat, read-only, and mobile viewport surfaces remain hidden. CLI same-name commands win." + - from: "surface.conversation-selection-side-slash" + to: "state.conversation-projection" + type: "validates-with" + rank: "must-inspect" + condition: "The submit path consumes only text-only arguments and rechecks the current parent session before dispatch; attachments and structured composer contexts remain on the normal parent send path." + - from: "surface.conversation-selection-side-slash" + to: "service.selection-side-session-creation" + type: "commits-to" + rank: "must-inspect" + condition: "A bare selected command removes its active token and creates an empty child; an argument-bearing submit dispatches createSelectionSideSession with firstInput text and never sends that text to the parent." + - from: "service.selection-side-session-creation" + to: "capability.conversation-runtime" + type: "creates-child-in" + rank: "must-inspect" + - from: "capability.selection-side-chat" + to: "boundary.web-remote-replayable" + type: "must-remain-hidden-from-mobile-viewport" + rank: "invariant-only" + - from: "capability.selection-side-chat" + to: "evidence.conversation-catalog" + type: "covered-by" + rank: "evidence-only" + - from: "capability.session-skill-catalog" + to: "surface.composer-slash-capability-picker" + type: "renders-in" + rank: "must-inspect" + condition: "Slash Skills and the compatible $, ¥, and ¥ triggers share one catalog authority and retain the existing canonical Skill mention." + - from: "capability.session-skill-catalog" + to: "state.session-skill-catalog" + type: "state-owned-by" + rank: "must-inspect" + condition: "A resident Session reads the Skill outcome frozen by its AgentRuntime context initialization; cold resume creates a new runtime and catalog." + - from: "capability.session-skill-catalog" + to: "service.skill-reference-catalog" + type: "served-by" + rank: "must-inspect" + condition: "A draft without prewarm reads current workspace discovery; once prewarm is ready its prewarmSessionId selects that runtime's frozen catalog. Formal Session requests use sessionId and fail closed when the runtime is absent." + - from: "capability.session-skill-catalog" + to: "capability.conversation-runtime" + type: "depends-on" + rank: "should-inspect" + condition: "Runtime restart advances the Picker request identity and discards results from the previous runtime without changing conversation delivery semantics." + - from: "capability.session-skill-catalog" + to: "boundary.workspace-key" + type: "depends-on" + rank: "invariant-only" + condition: "Catalog isolation uses workspaceIdentity fallback plus remoteSessionId; workspacePath remains the filesystem discovery target." + - from: "capability.session-skill-catalog" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.session-skill-catalog" + to: "boundary.web-remote-replayable" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.session-skill-catalog" + to: "evidence.conversation-catalog" + type: "covered-by" + rank: "evidence-only" + - from: "capability.composer-trigger-routing" + to: "capability.conversation-runtime" + type: "must-not-change-canonical-input-for" + rank: "invariant-only" + condition: "Discovery triggers may change grouping, but selected items retain their existing plugin, file, session, Whiteboard, command, Skill, and Subagent canonical Markdown." + - from: "capability.composer-trigger-routing" + to: "evidence.conversation-catalog" + type: "covered-by" + rank: "evidence-only" + - from: "capability.plugin-source-acquisition" + to: "service.plugin-source-materializer" + type: "served-by" + rank: "must-inspect" + condition: "Public github.com HTTPS sources use bounded secure Archive extraction; private, SSH, non-GitHub and advanced Git semantics retain the system Git path." + - from: "capability.plugin-source-acquisition" + to: "persistence.plugin-marketplace-installed-cache" + type: "persists-to" + rank: "must-inspect" + condition: "Validated Marketplace snapshots and installed plugin trees activate through same-volume staging, backup, rename and rollback; refresh failure preserves the last successful snapshot." + - from: "capability.plugin-source-acquisition" + to: "boundary.plugin-agent-host" + type: "executes-through" + rank: "must-inspect" + condition: "Desktop local, standalone CLI and SSH/WSL/Docker workspace operations all execute in the authoritative workspace Agent Host; bundling Git in Desktop would not satisfy remote hosts." + - from: "persistence.plugin-marketplace-installed-cache" + to: "capability.plugin-reference" + type: "read-by" + rank: "invariant-only" + condition: "Startup discovery, enable state and session injection remain offline cache reads and never trigger Git or HTTP source refresh." + - from: "capability.plugin-source-acquisition" + to: "evidence.plugin-source-acquisition-tests" + type: "covered-by" + rank: "evidence-only" + - from: "capability.plugin-source-acquisition" + to: "capability.workspace-identity" + type: "constrained-by" + rank: "invariant-only" + condition: "Remote workspace authority continues to use workspaceIdentity and remoteSessionId; source acquisition does not introduce path-only identity keys." + + - from: "capability.plugin-catalog-runtime-separation" + to: "persistence.plugin-marketplace-installed-cache" + type: "separates-catalog-from-runtime" + rank: "must-inspect" + condition: "Bundled Catalog and immutable official cache remain readable after builtin uninstall; cache presence never implies Runtime discovery or enablement." + - from: "capability.plugin-catalog-runtime-separation" + to: "state.plugin-runtime-suppression" + type: "must-preserve-runtime-contract" + rank: "must-inspect" + condition: "suppressedBuiltins is the only builtin Runtime suppression truth; Catalog and describe never mutate it." + - from: "state.plugin-runtime-suppression" + to: "service.plugin-catalog-detail" + type: "must-not-mutate" + rank: "invariant-only" + condition: "plugins/describe is read-only for suppressed builtins and does not restore, enable, or create an installed record." + - from: "service.plugin-catalog-detail" + to: "persistence.plugin-marketplace-installed-cache" + type: "reads-catalog-source-through" + rank: "must-inspect" + condition: "filesystem/SEA is normalized at the seed boundary; adapters consume the materialized cachePath for component enumeration." + - from: "capability.plugin-catalog-runtime-separation" + to: "boundary.plugin-agent-host" + type: "executes-through" + rank: "must-inspect" + condition: "Local and remote Agent Host authority remains unchanged; no second runtime is created for detail or restore." + - from: "capability.plugin-catalog-runtime-separation" + to: "evidence.plugin-catalog-runtime-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.workspace-project-plugin-scope" + to: "surface.workspace-plugin-scope-controls" + type: "renders-in" + rank: "must-inspect" + condition: "User and Workspace are configuration views over Host-available Plugins, not mutually exclusive ownership lists. User reads User/default state; Workspace reads effective merged state. Marketplace has no config scope, installs to User, and returns to the concrete origin scopeKey." + - from: "surface.workspace-plugin-scope-controls" + to: "capability.workspace-identity" + type: "preserves-return-scope-through" + rank: "must-inspect" + condition: "Settings -> Marketplace -> Settings navigation carries returnScopeKey=workspaceIdentity?.trim() || workspacePath; missing or disconnected targets fall back to User." + - from: "capability.workspace-project-plugin-scope" + to: "persistence.workspace-plugin-project-config" + type: "persists-shared-declaration-to" + rank: "must-inspect" + condition: "Tracked .ccbuddy/config.json owns project enabledPlugins, extraKnownMarketplaces and plaintext options/credentials/secrets; it never owns package bytes or Plugin data." + - from: "persistence.workspace-plugin-project-config" + to: "state.workspace-plugin-effective-config" + type: "merges-into" + rank: "must-inspect" + condition: "Plugin enabled maps merge per Plugin ID; options, including sensitive values, merge per Plugin ID and option key." + - from: "capability.workspace-project-plugin-scope" + to: "boundary.workspace-plugin-trust" + type: "explicitly-bypasses" + rank: "must-inspect" + condition: "Workspace Plugin fields, Marketplace declarations and project roots enter discovery without Workspace trust or Plugin MCP approval; this exception must not widen to top-level project hooks, MCP or Subagent config." + - from: "boundary.workspace-plugin-trust" + to: "state.workspace-plugin-effective-config" + type: "does-not-filter" + rank: "must-inspect" + condition: "No trust or Plugin MCP approval state filters Workspace Plugin config; valid Plugin Hook/Skill/Command/Agent/MCP components all enter runtime, while manifest/schema/path validation remains fail-closed." + - from: "capability.workspace-project-plugin-scope" + to: "boundary.workspace-plugin-sensitive-config" + type: "allows" + rank: "must-inspect" + condition: "Workspace config may persist ordinary and sensitive Plugin options in plaintext; sensitive metadata masks UI, displays the Git risk warning and restricts template expansion but does not block persistence." + - from: "boundary.workspace-plugin-sensitive-config" + to: "state.workspace-plugin-effective-config" + type: "merges-into" + rank: "must-inspect" + condition: "Workspace option keys override User by Plugin ID and option key; sensitive values may reach MCP env/header/clientSecret and other valid Plugin runtime fields while logs, diagnostics, provider captures and mobile replay artifacts stay redacted." + - from: "state.workspace-plugin-effective-config" + to: "persistence.plugin-marketplace-installed-cache" + type: "resolves-installed-package-from" + rank: "must-inspect" + condition: "Project enable is a declaration, not an install transaction; a missing target-Host package remains missing until the user explicitly installs it." + - from: "state.workspace-plugin-effective-config" + to: "state.plugin-reference-session-catalog" + type: "snapshots-into" + rank: "must-inspect" + condition: "New Session Apps and safely cold-resumed Apps freeze the latest effective Plugin capabilities and options; resident Apps do not hot-load config or package changes." + - from: "capability.workspace-project-plugin-scope" + to: "boundary.plugin-agent-host" + type: "executes-through" + rank: "must-inspect" + condition: "Local and remote project files are read from the target workspacePath on the authoritative Agent Host; one window Local Host routes remote workspaces through RemoteConnectionRegistry without a Remote Host process." + - from: "capability.workspace-project-plugin-scope" + to: "capability.workspace-identity" + type: "isolates-through" + rank: "must-inspect" + condition: "Filesystem reads use workspacePath; UI requests, async results, caches and Session association use workspaceIdentity?.trim() || workspacePath, with remoteSessionId preserved." + - from: "capability.workspace-project-plugin-scope" + to: "boundary.web-remote-replayable" + type: "reuses-shared-host-in" + rank: "invariant-only" + condition: "Mobile /remote reuses the attached desktop/window Host effective Plugin set and creates no independent Plugin runtime, config or install store." + - from: "capability.workspace-project-plugin-scope" + to: "evidence.workspace-project-plugin-cases" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.plugin-reference" + to: "surface.composer-mention-plugins" + type: "renders-in" + rank: "must-inspect" + - from: "surface.composer-mention-plugins" + to: "surface.composer-at-context-picker" + type: "nested-in" + rank: "must-inspect" + condition: "Plugins are the first primary @ group while the Plugin chip and plugin:// carrier remain unchanged." + - from: "capability.plugin-reference" + to: "surface.plugin-store-example-prompt-try" + type: "renders-in" + rank: "must-inspect" + condition: "For an installed Plugin, Try now starts a standard root draft with only the canonical plugin:// mention, while an example prompt appends the listing prompt; neither auto-sends, and disabled Plugin runtime eligibility remains unchanged." + - from: "surface.plugin-store-example-prompt-try" + to: "capability.conversation-runtime" + type: "commits-via" + rank: "must-inspect" + condition: "Both entries delegate to Root onCreateTask initialPrompt so workspace targeting, draft persistence, desktop workbench reset, and remote shared-host boundaries remain authoritative; an uninstalled Plugin shows Install instead of Try now, and example prompts only run the existing install action." + - from: "capability.plugin-reference" + to: "surface.new-task-suggested-prompts" + type: "renders-in" + rank: "must-inspect" + condition: "A Plugin-backed recommendation adds the canonical plugin:// carrier only when target Host trusted resolution reports the fixed stable ID ready; otherwise it prefills the plain prompt. The suggested flow does not read the workspace reference catalog." + - from: "surface.new-task-suggested-prompts" + to: "capability.conversation-runtime" + type: "commits-via" + rank: "must-inspect" + condition: "Clicking replaces the workspace-scoped renderer draft through requestComposerTextInsert, persists and focuses the Composer, and never auto-sends." + - from: "surface.new-task-suggested-prompts" + to: "service.client-scenes" + type: "options-from" + rank: "must-inspect" + condition: "Only draft-suggestion.options.prompts.items are mapped; legacy ai-writing is not a fallback, labels and contents retain cn/en values, iconName uses the non-localized img field as a Lucide canonical name and ignores imgs, unknown names fall back to SquareCode, defaults reverse-reference option items for an optional Plugin, and missing or failed configuration renders an empty list without a static fallback." + - from: "surface.new-task-suggested-prompts" + to: "capability.automations" + type: "opens-in" + rank: "must-inspect" + condition: "NAVIGATE:AUTOMATIONS opens the workspace Automations main view without prefilling; NAVIGATE:AUTOMATIONS:OFFPEAK also records automationTab=idle in renderer-local navigation history and selects Idle-time only after the visible tabs settle with idle present. The more specific action wins when both are declared, and mobile /remote filters both navigation entries." + - from: "surface.new-task-suggested-prompts" + to: "service.suggested-plugin-reference-resolution" + type: "validates-with" + rank: "must-inspect" + condition: "A recommendation without a Plugin writes immediately. A Plugin-backed recommendation performs one trusted resolution and one Composer replacement: initial ready writes the chip, optional display-only icon, and prompt together without opening a Popover; all other settled results write only the prompt. A renderer-local Composer revision guard drops the delayed write and follow-up feedback if the draft changes while resolving. Initial ready does not query a workspace reference catalog; install/enable success invalidates the deferred runtime and requires target Host trusted resolution to return ready before prepend. Missing Plugins refresh only ccbuddy-plugins-official; the Agent emits operation-scoped refreshing after the first local miss and before network refresh, which makes the single anchored Plugin action Popover enter loading. Disabled results enter loading before the plain-prompt insert. Refresh is aborted and fails closed at 10000ms without exposing old snapshot candidates. After Composer consumes the plain prompt, the same PopoverContent changes from loading to install or enable confirmation. Confirmation has no automatic timeout: a primary pointer-down outside the Popover closes it and cancels that operation, while focus changes, inside interaction, loading, mutation progress, success, and error do not use this confirmation dismissal rule. Every Popover root, PopoverContent, and button anchor remains the same mounted instance across loading, confirmation, mutation progress, retry, success, and failure; a second Popover is never mounted. The outer border-box remains 240px wide but has no fixed height in any phase. Install and enable success replace progress with the same vertical rolling structure as RollingToolbarLabel: AnimatePresence popLayout, outgoing content y -0.75em, incoming success y 0.75em to 0 with opacity, 200ms and ease [0.4, 0, 0.2, 1], while reduced motion replaces content immediately. Success uses the operation-specific localized message and closes exactly 2000ms after it appears. Install error diagnostics, rejects, and timeout write a UI warning log plus a localized warning toast, replace the old operationId, and restore the same PopoverContent to confirmation while keeping the plain prompt and dropping late results. Enable failure retains the same anchored error result behavior. Manual prompt takeover dismisses the old Plugin action Popover without a cancellation notice. Refresh/install/enable remain bound to one cancellable operationId at a time; API Key, OAuth, and user config are outside this flow." + - from: "service.suggested-plugin-reference-resolution" + to: "capability.plugin-source-acquisition" + type: "served-by" + rank: "must-inspect" + condition: "Only a newly refreshed canonical ccbuddy-plugins-official listing may become an install candidate; the previous successful snapshot is not sufficient after refresh failure." + - from: "service.suggested-plugin-reference-resolution" + to: "boundary.plugin-agent-host" + type: "executes-through" + rank: "must-inspect" + condition: "Resolution, refresh, User-scope installation, enablement, cancellation, and post-install catalog reads execute on the authoritative local or remote Agent Host selected by workspaceIdentity and remoteSessionId; trusted resolution carries both clientMode and deliveryKind without changing the existing desktop-continuous or web-remote-replayable profile." + - from: "service.suggested-plugin-reference-resolution" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + condition: "Desktop remains desktop-continuous; the operation does not create or send a Session." + - from: "service.suggested-plugin-reference-resolution" + to: "boundary.web-remote-replayable" + type: "must-not-change-delivery" + rank: "invariant-only" + condition: "Mobile remote control reuses the shared-host attachment and web-remote-replayable boundary; it never creates a separate Agent runtime." + - from: "surface.new-task-suggested-prompts" + to: "capability.workspace-identity" + type: "depends-on" + rank: "invariant-only" + condition: "The prefill request remains isolated by workspaceIdentity?.trim() || workspacePath and never writes a different local or remote draft." + - from: "capability.plugin-reference" + to: "state.plugin-reference-session-catalog" + type: "state-owned-by" + rank: "must-inspect" + - from: "capability.plugin-reference" + to: "service.plugin-reference-catalog" + type: "served-by" + rank: "must-inspect" + condition: "Picker state is request-identity scoped; workspace/session/remote attachment changes clear prior authority before loading and reject late results." + - from: "capability.plugin-reference" + to: "service.plugin-reference-reminder" + type: "served-by" + rank: "must-inspect" + condition: "Only persisted canonical displayInput is parsed; MCP live intersection excludes tools hidden by the current turn toolDisallowlist; Subagents require frozen declaration, a live profile, and Plugin-root provenance." + - from: "service.plugin-reference-reminder" + to: "persistence.plugin-reference-reminder-history" + type: "persists-to" + rank: "must-inspect" + condition: "Each generated reminder is appended as a model-only synthetic notice after its real user message." + - from: "persistence.plugin-reference-reminder-history" + to: "capability.conversation-runtime" + type: "hydrates-into" + rank: "must-inspect" + condition: "Cold resume and fork rebuild the original attachment text and causal order without re-resolving the current catalog or live inventory." + - from: "capability.plugin-reference" + to: "capability.conversation-runtime" + type: "depends-on" + rank: "should-inspect" + condition: "Reminder injection rides the turn-start pipeline; canonical message text stays unchanged." + - from: "capability.plugin-reference" + to: "capability.workspace-identity" + type: "depends-on" + rank: "should-inspect" + condition: "Catalog queries and caches key by workspaceIdentity?.trim() || workspacePath; remote picker reads the remote host store." + - from: "capability.plugin-reference" + to: "boundary.desktop-continuous" + type: "constrained-by" + rank: "invariant-only" + - from: "capability.plugin-reference" + to: "boundary.web-remote-replayable" + type: "constrained-by" + rank: "invariant-only" + condition: "Mobile remote reuses the shared-host session runtime; no independent plugin selection state crosses the carrier, and command clientMode comes from the host trusted connection carrier rather than renderer input." + - from: "capability.plugin-reference" + to: "evidence.conversation-catalog" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.stateless-browser-use-mcp" + to: "service.shared-browser-use-mcp-runtime" + type: "executes-through" + rank: "must-inspect" + condition: "Only the built-in stateless node_repl opts into workspace sharing; ordinary dual-era third-party MCP stays session-isolated by default." + - from: "capability.stateless-browser-use-mcp" + to: "capability.browser-use-agent-guidance" + type: "constrains-kernel-lifecycle-guidance-in" + rank: "must-inspect" + condition: "Stateless migration may replace only persistent-kernel and cross-cell binding guidance; all unrelated Browser Use planning, safety, observation, and tab lifecycle rules remain aligned with the pre-upgrade contract." + - from: "capability.stateless-browser-use-mcp" + to: "state.browser-context-handle-registry" + type: "routes-browser-commands-through" + rank: "must-inspect" + condition: "MCP transport frontend and JavaScript kernel remain stateless; browser continuity remains in the existing session-scoped BrowserControl/tab owner and is rediscovered by stable tab facts on every call." + - from: "state.browser-context-handle-registry" + to: "boundary.workspace-key" + type: "isolated-by" + rank: "must-inspect" + condition: "Every BrowserControlPort call resolves sessionId through the authoritative registry, then restores workspaceIdentity?.trim() || workspacePath, remoteSessionId, runtimeScope, and clientMode; no model-visible handle or workspace path authorizes the call." + - from: "capability.stateless-browser-use-mcp" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.stateless-browser-use-mcp" + to: "boundary.web-remote-replayable" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.stateless-browser-use-mcp" + to: "evidence.mcp-runtime-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.mcp-dual-era-version-negotiation" + to: "service.mcp-session-runtime" + type: "selects-wire-era-for" + rank: "must-inspect" + condition: "Unspecified stdio and Streamable HTTP servers default to auto; explicit legacy and deprecated SSE skip modern probing." + - from: "capability.stateless-browser-use-mcp" + to: "capability.mcp-dual-era-version-negotiation" + type: "pins-modern-through" + rank: "must-inspect" + condition: "The built-in node_repl pins 2026-07-28 and must never silently fall back to initialize or persistent legacy kernel semantics." + - from: "capability.mcp-dual-era-version-negotiation" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.mcp-dual-era-version-negotiation" + to: "boundary.web-remote-replayable" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.mcp-dual-era-version-negotiation" + to: "evidence.mcp-runtime-tests" + type: "covered-by" + rank: "evidence-only" + + - from: "capability.mcp-oauth-authorization" + to: "surface.customize-capability-settings" + type: "renders-authorization-in" + rank: "must-inspect" + - from: "capability.window-single-host-controller-r1" + to: "service.window-host-remote-connection-registry" + type: "owns" + rank: "must-inspect" + condition: "Each BrowserWindow owns one Host process; local, SSH, WSL, Docker, Server, Mobile, and Bot routes share its in-process registry." + - from: "capability.window-single-host-controller-r1" + to: "state.window-host-controller-projection" + type: "projects-through" + rank: "must-inspect" + condition: "The Host owns task membership, live overlay, source availability, offline retention, and list-originated write routing." + - from: "capability.window-single-host-controller-r1" + to: "boundary.window-host-scoped-service-attachment" + type: "exposes" + rank: "must-inspect" + condition: "One Host exposes a base port and validated remote-scoped ports without creating Remote Host processes." + - from: "state.window-host-controller-projection" + to: "capability.task-persistence" + type: "aggregates-without-owning" + rank: "must-inspect" + condition: "task-index remains the membership authority; sessions-index only overlays live facts and the projection is memory-only." + - from: "boundary.window-host-scoped-service-attachment" + to: "capability.remote-delivery" + type: "attaches-to" + rank: "must-inspect" + condition: "Main and relay only forward authenticated ports and payloads; they do not own task, stream, queue, or snapshot state." + - from: "capability.window-single-host-controller-r1" + to: "capability.workspace-identity" + type: "isolates-through" + rank: "must-inspect" + condition: "All state keys and routes use workspaceIdentity with workspacePath fallback; remote scopes require identity and fail closed." + - from: "boundary.window-host-scoped-service-attachment" + to: "boundary.desktop-continuous" + type: "injects-trusted-mode" + rank: "invariant-only" + condition: "Desktop ports stay direct continuous and never merge Mobile replayable recovery frames." + - from: "boundary.window-host-scoped-service-attachment" + to: "boundary.web-remote-replayable" + type: "injects-trusted-mode" + rank: "invariant-only" + condition: "Mobile ports stay replayable with independent seq, gap, snapshot, backpressure, and disposal state." + - from: "capability.window-single-host-controller-r1" + to: "evidence.ssh-remote-p0-e2e" + type: "covered-by" + rank: "evidence-only" + condition: "Formal real Ubuntu SSH flows cover failure/retry and two-workspace task isolation while keeping one Host PID; pending SSH-P0-CONN-03 plans same-target pending cancel with new-credential retry; renderer reload remains covered by the independent R1-RELOAD-01 case." + + - from: "capability.unified-ccbuddy-lite-server" + to: "surface.multi-server-controller-ui" + type: "renders-in" + rank: "must-inspect" + - from: "surface.multi-server-controller-ui" + to: "state.controller-server-directory" + type: "projects-from" + rank: "must-inspect" + condition: "Desktop and Lite keep independent controller-local connection lists; attached Mobile reuses the selected controller directory." + - from: "state.controller-server-directory" + to: "service.multi-server-controller" + type: "connects-through" + rank: "must-inspect" + - from: "service.multi-server-controller" + to: "service.ccbuddy-stable-launcher" + type: "bootstraps-through" + rank: "must-inspect" + - from: "service.ccbuddy-stable-launcher" + to: "persistence.ccbuddy-server-identity" + type: "owns" + rank: "must-inspect" + condition: "serverId is persistent per OS user/data root and independent from SSH account, address, and connection route." + - from: "service.multi-server-controller" + to: "boundary.unified-server-transport" + type: "routes-through" + rank: "must-inspect" + - from: "boundary.unified-server-transport" + to: "capability.conversation-runtime" + type: "carries-without-changing" + rank: "invariant-only" + condition: "MessagePort, WebSocket, and SSH/WSL/Docker tunnels carry the same typed service and V4 conversation contracts." + - from: "capability.unified-ccbuddy-lite-server" + to: "capability.workspace-identity" + type: "rekeys-with-server-identity" + rank: "must-inspect" + condition: "Global references use serverId plus server-local workspaceIdentity; workspacePath remains execution/display only." + - from: "capability.unified-ccbuddy-lite-server" + to: "capability.prompt-attachment-materialization" + type: "replaces-host-path-with-resource-store-for" + rank: "must-inspect" + - from: "capability.prompt-attachment-materialization" + to: "persistence.ccbuddy-resource-store" + type: "persists-source-server-resource-to" + rank: "must-inspect" + condition: "Long paste, image, and file bytes commit to the consuming Source Server before prompt admission." + - from: "capability.unified-ccbuddy-lite-server" + to: "capability.provider-registry" + type: "keeps-server-local-and-syncs-explicitly" + rank: "must-inspect" + condition: "Provider definitions can be directionally mirrored; OAuth, runtime-only headers, display order, and UI selection state remain local." + - from: "capability.unified-ccbuddy-lite-server" + to: "capability.remote-delivery" + type: "reuses-controller-attachment-for" + rank: "must-inspect" + condition: "Mobile sees its controller multi-server projection but remains web-remote-replayable and never starts independent remote runtimes." + - from: "capability.unified-ccbuddy-lite-server" + to: "boundary.desktop-continuous" + type: "must-not-change-delivery" + rank: "invariant-only" + - from: "capability.unified-ccbuddy-lite-server" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery" + rank: "invariant-only" + + - from: "capability.workspace-hook-persistent-trust" + to: "surface.workspace-hook-settings-trust-row" + type: "renders-in" + rank: "must-inspect" + - from: "surface.workspace-hook-settings-trust-row" + to: "state.workspace-hook-review-renderer-binding" + type: "requests-and-waits-through" + rank: "must-inspect" + condition: "Static Trust state controls visibility only; mutation waits for the same workspace identity, bundle digest, and review item in an immutable Runtime request." + - from: "state.workspace-hook-review-renderer-binding" + to: "service.workspace-hook-runtime-review-controller" + type: "commits-to" + rank: "must-inspect" + - from: "surface.workspace-hook-settings-trust-row" + to: "service.workspace-hook-settings-pretrust" + type: "falls-back-to-without-session" + rank: "must-inspect" + condition: "When no task/session command binding exists, the Host starts only a read-only Agent control plane and never creates a hidden task." + - from: "service.workspace-hook-settings-pretrust" + to: "state.workspace-hook-managed-policy" + type: "must-authorize-mutation-with" + rank: "must-inspect" + condition: "The no-session Settings RPC reads the same trusted Host-owned provider as session Runtime; deny and allow_trusted_only reject before Trust store mutation." + - from: "service.workspace-hook-runtime-review-controller" + to: "state.workspace-hook-managed-policy" + type: "must-authorize-mutation-with" + rank: "must-inspect" + condition: "Session review and no-session pretrust share one provider instance so policy cannot diverge by UI path." + - from: "service.workspace-hook-settings-pretrust" + to: "persistence.workspace-hook-trust-store" + type: "revalidates-and-persists-exact-declaration-to" + rank: "must-inspect" + condition: "The Agent rediscovers the canonical snapshot and matches workspace identity, bundle digest, and declaration digest before mutation." + - from: "service.workspace-hook-runtime-review-controller" + to: "persistence.workspace-hook-trust-store" + type: "persists-exact-declaration-trust-to" + rank: "must-inspect" + - from: "capability.workspace-hook-persistent-trust" + to: "capability.workspace-identity" + type: "isolates-by" + rank: "must-inspect" + condition: "Authorization uses workspaceIdentity.trim() or workspacePath fallback; workspacePath alone never aliases distinct remote workspaces." + - from: "capability.workspace-hook-persistent-trust" + to: "boundary.desktop-continuous" + type: "projects-review-without-changing" + rank: "invariant-only" + - from: "capability.workspace-hook-persistent-trust" + to: "boundary.web-remote-replayable" + type: "recovers-review-without-bypassing" + rank: "invariant-only" + - from: "capability.workspace-hook-persistent-trust" + to: "evidence.workspace-hook-persistent-trust-tests" + type: "covered-by" + rank: "evidence-only" + - from: "capability.conversation-hook-turn-summary" + to: "surface.conversation-turn-hook-summary" + type: "renders-in" + rank: "must-inspect" + - from: "surface.conversation-turn-hook-summary" + to: "state.conversation-projection" + type: "reads-client-safe-turn-summary-from" + rank: "must-inspect" + condition: "Renderer groups authoritative hookInvocation rows by turnId and never infers placement from the nearest assistant row." + - from: "capability.conversation-hook-turn-summary" + to: "capability.hooks-settings" + type: "shares-source-vocabulary-with" + rank: "should-inspect" + condition: "User, Project, and Plugin remain distinct sources; the conversation surface does not edit settings or Trust." + - from: "capability.conversation-hook-turn-summary" + to: "boundary.desktop-continuous" + type: "projects-safe-summary-through" + rank: "must-inspect" + condition: "Desktop receives direct continuous hook summary updates without adopting replayable recovery semantics." + - from: "capability.conversation-hook-turn-summary" + to: "boundary.web-remote-replayable" + type: "recovers-safe-summary-through" + rank: "must-inspect" + condition: "Mobile receives only client-safe summary fields through the existing shared-host replayable snapshot/gap boundary." + - from: "capability.conversation-hook-turn-summary" + to: "evidence.conversation-catalog" + type: "covered-by" + rank: "evidence-only" + - from: "capability.subagent-computer-use-boundary" + to: "capability.agent-core-runtime" + type: "guards-child-runtime" + rank: "must-inspect" + - from: "capability.subagent-computer-use-boundary" + to: "capability.mcp-dual-era-version-negotiation" + type: "filters-borrowed-mcp-surface" + rank: "must-inspect" + - from: "capability.subagent-computer-use-boundary" + to: "capability.plugin-reference" + type: "filters-official-skill-provenance" + rank: "should-inspect" + - from: "capability.subagent-computer-use-boundary" + to: "evidence.mcp-runtime-tests" + type: "covered-by" + rank: "evidence-only" + - from: "capability.workflow-run-confirmation" + to: "surface.workflow-run-confirmation-dialog" + type: "renders-ask-preview-in" + rank: "must-inspect" + condition: "Ask fires only when the analysis is clean; typecheck failures return diagnostics with no dialog. Options are Run/Deny only (optionsPolicy no-always-allow across all three option-build sites)." + - from: "surface.workflow-run-confirmation-dialog" + to: "surface.parent-task-blocking-interaction" + type: "shares-dialog-host-with" + rank: "must-inspect" + condition: "Same PermissionDialog host and resolveInteraction commit path; the workflow branch replaces the generic block and skips displayReason. The script fold is a recorded exception to the no-collapse permission-block rule: the graph stays force-open as the decision-critical content." + - from: "capability.workflow-run-confirmation" + to: "surface.conversation-tool-call" + type: "must-match-tool-identity-split-of" + rank: "invariant-only" + condition: "Both surfaces dispatch on resolveToolCallIdentity family workflow so pre- and post-approval semantics never drift." + + - from: "capability.workflow-live-run" + to: "capability.workflow-run-confirmation" + type: "starts-only-after-allow-from" + rank: "must-inspect" + condition: "The engine starts on the confirmation gate's Allow in any mode. The broken-script path is unchanged: prepareApproval rules proceed, the handler returns diagnostics, and no dwf_run row is created. CreateWorkflowOutputSchema is .strict(), so status/backgroundTaskId is an explicit schema change, and metadata.readOnly flips true to false." + - from: "capability.workflow-live-run" + to: "state.workflow-run-journal" + type: "delegates-run-truth-to" + rank: "must-inspect" + condition: "The engine owns createRun; the submit path must never pre-insert a dwf_run row, since a pre-existing row flips the constructor into its resume branch and a new run would silently resume from an empty journal. createRun grows scriptText/scriptHash/parentSessionId/cwd, and listEvents grows an afterSequence/limit cursor whose semantics must be proven by the shared journal contract suite (src/testing/journal-contract.ts) against both the in-memory and SQLite implementations." + - from: "capability.workflow-live-run" + to: "state.conversation-projection" + type: "adds-authoritative-state-key-to" + rank: "must-inspect" + condition: "Run events append bounded session events to the PARENT session, through the projection reducer, reduced into the workflowRuns state.updated key (bounded runs/actors/nodes arrays, lastEventSequence). Precedent is the subagents key. Recorded deviation from execution-engine.md: state.updated is not profile-gated, justified by transition-frequency rather than token-frequency events; run-settled emits the terminal authoritative patch." + - from: "capability.workflow-live-run" + to: "capability.subagents" + type: "reuses-background-lifecycle-pattern-of" + rank: "must-inspect" + condition: "The five hardcoded tool-name dispatch sites in background-tasks.ts become a per-tool port lookup rather than a fifth special case. canCancelBackgroundTask is one of them and is load-bearing: it hard-returns false for Workflow today, so cancellable is false and the Cancel button is dead without it. A new narrow DynamicWorkflowRunPort is added; the legacy WorkflowPort is NOT widened. Cancellation adds no RPC: the details page and the backgroundWorks panel share the existing cancelBackgroundWork command with workId = runId, and the run service's AbortController registry is that port's cancel(runId) behind it." + - from: "capability.workflow-live-run" + to: "boundary.web-remote-replayable" + type: "must-not-change-recovery" + rank: "invariant-only" + condition: "workflowRuns is authoritative on every patch, so replayable clients resume complete with no terminal-upsert machinery. No version-skew defense is needed on the v4 wire — verified: statePatchSchema is a non-strict z.object under zod ^4.3.6, so an old desktop strips the unknown key and keeps the rest of the patch. Do NOT re-litigate this against the CreateWorkflow-display precedent, which had the opposite shape (.strict() schemas made an old desktop discard the whole permission.requested event). The new session event type is stripped at shouldExposeSessionEventToProtocol, the same seam as the existing StreamingToolLedgerUpdated strip, for bandwidth rather than to prevent event loss." + - from: "capability.workflow-live-run" + to: "surface.workflow-run-detail-pane" + type: "renders-live-progress-in" + rank: "must-inspect" + condition: "Live view v1 is the STATIC causality graph plus a status overlay, not the unrolled instance graph. Status joins by site id and aggregates over instances (any running wins, then failed, then all-settled done, else pending); engine phases dispatched/repairing/nudged map to running, settled ok including cached to done, failed/cancelled to failed. The engine emits no executing event." + - from: "surface.workflow-run-detail-pane" + to: "surface.workspace-side-pane-tab-strip" + type: "adds-tab-type-to" + rank: "must-inspect" + condition: "New workflow-run tab type in the WorkspaceSidePaneTab union, shaped after PlanDetailSidePaneTab. Opened from the CreateWorkflow tool card following the ExitPlanMode onOpenPlanDetail precedent: the host injects parent/session scope, the card only emits intent." + - from: "surface.workflow-run-detail-pane" + to: "surface.workflow-run-confirmation-dialog" + type: "shares-causality-graph-component-with" + rank: "must-inspect" + condition: "Both render WorkflowCausalityGraph. The statuses and animatedEdges props plus step-node status styling and both locales' status labels already exist from phase 1; the live feature only supplies data, adding no visual vocabulary." + - from: "surface.workflow-run-detail-pane" + to: "surface.workflow-actor-transcript" + type: "drills-down-into" + rank: "must-inspect" + condition: "Clicking an ask step resolves actor instances from workflowRuns.actors: a single instance opens the transcript tab, multiple instances (fan-out lane families) open a per-instance status picker. World-read steps are selection-only, since the workspace lane has no session." + - from: "surface.workflow-actor-transcript" + to: "surface.subagent-session-detail" + type: "reuses-read-only-session-composition-of" + rank: "must-inspect" + condition: "Nested read-only SessionPane under V4PaneConversationProvider, composed exactly as SubagentSessionSidePane does. This is only reachable because actor sessions become really persisted: the production ActorRuntimeFactory gains ensureSessionPersistedForExternalActivity, subscribeEvents and createSessionTaskLink, and session ids become run-scoped and charset-safe (today's sess_wf-actor-actor#1@1 collides across concurrent runs and carries #/@)." + - from: "capability.workflow-live-run" + to: "surface.conversation-tool-call" + type: "keeps-bounded-display-on" + rank: "invariant-only" + condition: "The tool card keeps the bounded display channel and gains only the run entry point; the full view lives in the side pane and reads the workflowRuns projection instead of re-deriving from display." + + - from: "capability.workflow-run-introspection" + to: "state.workflow-run-journal" + type: "reads-run-truth-from" + rank: "must-inspect" + condition: "Strictly read-only: listRuns/getRunDetail live on the SQLite adapter and are capability-probed, NOT added to the domain JournalStorePort (listNonTerminalRuns precedent — the engine never enumerates runs, and the in-memory journal stays untouched). The tools never write the journal: possiblyInterrupted is a read-side annotation; orphan reconciliation authority stays with the owning session's app construction. Migration 0021 adds dwf_run.name plus the (cwd, time_updated) index; name rides submit → EngineConfig → createRun, keeping createRun engine-exclusive." + - from: "capability.workflow-run-introspection" + to: "capability.workflow-live-run" + type: "extends-read-surface-of" + rank: "must-inspect" + condition: "runId ≡ taskId ≡ workId. The tools complement, not replace, the existing surfaces: completion notifications stay the default for this session's runs (tool descriptions must steer models away from polling), TaskOutput stays the blocking-wait tool, and GetWorkflowRun serves cross-session runs the runtime task registry cannot. Both tools declare readOnly/needsApproval:false so they auto-allow in plan and build mode; they must never inherit CreateWorkflow's alwaysAsk gate." + - from: "surface.submit-result-tool-card" + to: "surface.workflow-actor-transcript" + type: "renders-in" + rank: "must-inspect" + condition: 'The actor transcript is a nested read-only SessionPane, so submit_result renders through the SAME ToolCallBlocks registry as the main conversation — one renderer fixes both surfaces; there is nothing pane-specific to special-case. Routing requires the literal snake_case name "submit_result" in CCBUDDY_KNOWN_TOOL_NAMES (family workflow) plus a toolName dispatch inside resolveRenderer''s workflow case (RespondToCoordinator precedent). Pure read-time projection: the payload lives entirely in input.result (output is only {status:"accepted"}), real models often submit it as a JSON-string (engine scheduler leniency mirrored read-side, one lenient JSON.parse max), and no display-union member is added — that union requires four-file lockstep and a missing member degrades silently.' + + - from: "capability.official-server-mcp" + to: "capability.plan-entitlements" + type: "authenticates-and-reads-quota-with" + rank: "must-inspect" + condition: "Product planScope and transport wireScope are separate; ZAI Team is TEAM for quota but keeps Off-Peak-compatible fallback headers. Entitlement gates tools/call only, never connection or tool advertisement." + - from: "capability.mcp-settings-diagnostics" + to: "capability.official-server-mcp" + type: "projects-connection-diagnostics-from" + rank: "must-inspect" + condition: "Only connection, initialize and tools/list diagnostics reach Settings; tools/call entitlement, quota and request ids remain on their tool result surface." + - from: "capability.mcp-settings-diagnostics" + to: "surface.customize-capability-settings" + type: "renders-in" + rank: "must-inspect" + condition: "Direct MCP uses Installed and plugin MCP stays grouped by stable pluginId; Commands, Skills and MCP share structural list primitives without sharing resource state or mutations." + - from: "capability.mcp-settings-diagnostics" + to: "capability.workspace-identity" + type: "isolated-by" + rank: "must-inspect" + condition: "Status snapshots, failure diagnostics and Plugin projections use workspaceIdentity.trim() or workspacePath fallback and reject stale refresh epochs." + - from: "capability.official-server-mcp" + to: "capability.mcp-dual-era-version-negotiation" + type: "injects-current-identity-during-negotiation-for" + rank: "must-inspect" + condition: "Trusted official HTTP server/discover, initialize, initialized notifications, ping, tools/list and GET probes resolve and send current identity headers; trusted official stdio messages carry the same identity payload in namespaced _meta. Resolution failure degrades to an explicit anonymous or failure payload, while untrusted origins still fail before credential access or network access." + - from: "capability.official-server-mcp" + to: "capability.mcp-async-tool-catalog" + type: "separates-advertisement-from-execution-for" + rank: "must-inspect" + condition: "Connected status and advertised or cached tool schemas carry no entitlement authority; every official transport request re-resolves credentials, and the server authorizes tools/call before side effects or billing." + - from: "capability.official-server-mcp" + to: "capability.workspace-identity" + type: "audits-by" + rank: "must-inspect" + condition: "Credential issuance audit uses workspaceIdentity.trim() or workspacePath fallback; workspacePath remains execution/display only." + - from: "capability.official-server-mcp" + to: "boundary.desktop-continuous" + type: "projects-banner-without-changing" + rank: "invariant-only" + - from: "capability.conversation-sharing" + to: "surface.conversation-share-publish" + type: "renders-in" + rank: "must-inspect" + condition: "Only Desktop local, SSH, WSL, and Docker surfaces publish; mobile and ordinary Web remain unavailable." + - from: "surface.conversation-share-publish" + to: "service.conversation-share" + type: "commits-to" + rank: "must-inspect" + - from: "capability.conversation-sharing" + to: "surface.conversation-share-handover" + type: "renders-in" + rank: "must-inspect" + condition: "Only desktop-continuous imported sessions expose the handover chip/browser path; web-remote-replayable never creates it." + - from: "surface.conversation-share-handover" + to: "shared-ui.conversation-share-context-chip" + type: "shares-component" + rank: "must-inspect" + - from: "surface.conversation-share-handover" + to: "persistence.conversation-share-context" + type: "commits-to" + rank: "must-inspect" + - from: "persistence.conversation-share-context" + to: "capability.agent-core-runtime" + type: "projects-provider-context-with" + rank: "must-inspect" + condition: "pending/reserved/discarded are excluded from provider history; attached is injected once and survives cold hydration." + - from: "service.conversation-share" + to: "service.ccbuddy-agent-connection-scope" + type: "reads-rows-and-file-changes-through" + rank: "must-inspect" + condition: "Desktop local and SSH/WSL/Docker publication reuse the current MessagePort attachment scope; Share never calls raw Agent V4 queries or creates a second connection scope." + - from: "service.ccbuddy-agent-connection-scope" + to: "boundary.desktop-continuous" + type: "injects-trusted-client-mode" + rank: "must-inspect" + - from: "service.ccbuddy-agent-connection-scope" + to: "boundary.web-remote-replayable" + type: "must-not-authorize-share-through" + rank: "must-inspect" + - from: "capability.conversation-sharing" + to: "capability.workspace-identity" + type: "isolated-by" + rank: "must-inspect" + condition: "Remote publication carries workspaceIdentity and remoteSessionId while workspacePath remains execution-only." + - from: "capability.conversation-sharing" + to: "boundary.desktop-continuous" + type: "allowed-through" + rank: "must-inspect" + - from: "capability.conversation-sharing" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "must-inspect" + - from: "capability.official-server-mcp" + to: "boundary.web-remote-replayable" + type: "projects-banner-without-changing" + rank: "invariant-only" + + - from: "capability.background-bash-output" + to: "service.ccbuddy-agent-connection-scope" + type: "queries-through" + rank: "must-inspect" + - from: "capability.background-bash-output" + to: "boundary.desktop-continuous" + type: "preserves" + rank: "invariant-only" + - from: "capability.background-bash-output" + to: "boundary.web-remote-replayable" + type: "preserves" + rank: "invariant-only" + + - from: "surface.composer-at-context-picker" + to: "service.composer-host-file-search" + type: "options-from" + condition: "Only file mentions use bounded Host search; other file pickers retain the packed listing API and canonical mention insertion remains unchanged." + + - from: "capability.bot-group-collaboration" + to: "surface.bot-bound-groups" + type: "renders-in" + rank: "must-inspect" + - from: "capability.bot-group-collaboration" + to: "surface.bot-channel-messages" + type: "projects-to" + rank: "must-inspect" + - from: "capability.bot-group-collaboration" + to: "service.ccbuddy-agent-connection-scope" + type: "commits-through" + rank: "must-inspect" + condition: "CLI owns admission and execution; Bot Host owns conversation binding and durable delivery." + - from: "capability.bot-group-collaboration" + to: "boundary.web-remote-replayable" + type: "must-remain-isolated-from" + rank: "invariant-only" + condition: "Bot output stays bot-channel-continuous; mobile input and recovery retain replayable semantics." diff --git a/.agents/skills/feature-boundary-planner/references/impact-brief-template.md b/.agents/skills/feature-boundary-planner/references/impact-brief-template.md index c7a3deb1..ece97f97 100644 --- a/.agents/skills/feature-boundary-planner/references/impact-brief-template.md +++ b/.agents/skills/feature-boundary-planner/references/impact-brief-template.md @@ -1,79 +1,85 @@ # Impact Brief Template -Use this template for every feature-impact scan. Keep it compact enough to search and compare. Complete sections relevant to the request and explicitly identify unavailable evidence. +Use this template for every feature-impact scan. Keep it compact enough to search and compare. Replace empty cells; do not delete a section merely because the result is “none”. ## Feature Summary -| Field | Value | -| ---------------- | -------------------------------------------------------------------------------------------------- | -| Developer intent | | -| Capability | | -| Change layer | presentation / option-source / draft-default / validation / commit-effect / persistence / recovery | -| Operating mode | impact-only / planning / implementation-handoff | -| Primary seeds | | -| Out of scope | | +| Field | Value | +| --- | --- | +| Developer intent | | +| Capability | | +| Change layer | presentation / option-source / draft-default / validation / commit-effect / persistence / recovery | +| Operating mode | impact-only / planning / implementation-handoff | +| Primary seeds | | +| Out of scope | | ## UI Surface Matrix | User scenario | UI entry | Shared implementation | Display/draft owner | Default/inherit source | Validation/gating | Commit action | Authority/persistence | Mode boundary | Must remain isolated from | -| ------------- | -------- | --------------------- | ------------------- | ---------------------- | ----------------- | ------------- | --------------------- | ------------- | ------------------------- | -| | | | | | | | | | | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| | | | | | | | | | | ## Shared And Divergent Behavior -| Concern | Shared across surfaces | Deliberately different | Why it matters for this change | -| -------------------- | ---------------------- | ---------------------- | ------------------------------ | -| UI/component | | | | -| Option source | | | | -| Default/inheritance | | | | -| Validation | | | | -| Commit effect | | | | -| Persistence/recovery | | | | +| Concern | Shared across surfaces | Deliberately different | Why it matters for this change | +| --- | --- | --- | --- | +| UI/component | | | | +| Option source | | | | +| Default/inheritance | | | | +| Validation | | | | +| Commit effect | | | | +| Persistence/recovery | | | | ## Feature Relationships -| Rank | From | Semantic edge | To | Condition | Why inspect it | Evidence | -| ---------------------------------------------------------------------------- | ---- | ------------- | --- | --------- | -------------- | ------------- | -| must-inspect / should-inspect / conditional / invariant-only / evidence-only | | | | | | code/doc/test | +| Rank | From | Semantic edge | To | Condition | Why inspect it | Evidence | +| --- | --- | --- | --- | --- | --- | --- | +| must-inspect / should-inspect / conditional / invariant-only / evidence-only | | | | | | code/doc/test | ## State Owners And Commit Sinks | State/fact | Draft/display owner | Authoritative owner | Commit command/service | Persistence/cache | Evidence | -| ---------- | ------------------- | ------------------- | ---------------------- | ----------------- | -------- | -| | | | | | | +| --- | --- | --- | --- | --- | --- | +| | | | | | | ## Must-Preserve Invariants | Invariant | Surfaces/modes | Proof needed | Evidence | -| --------- | -------------- | ------------ | -------- | -| | | | | +| --- | --- | --- | --- | +| | | | | -## Source Evidence +## Codegraph Evidence -| File / symbol | Inspection method | Direct callers / key path | Interpretation | -| ------------- | ------------------------------------------------- | ------------------------- | -------------- | -| | source / dep:refs / available codegraph / runtime | | | +| Seed | Query | Direct callers / key path | Depth | Interpretation | +| --- | --- | --- | --- | --- | +| | explore / callers / callees / impact / affected tests | | 1-3 | | -## Evidence Gaps +## Graph Drift Candidates -| Unresolved behavior | Available evidence | Missing evidence | Next verification | -| ------------------- | ------------------ | ---------------- | ----------------- | -| none or item | | | | +| Candidate | Live-code evidence | Missing/stale graph relation | Proposed follow-up | +| --- | --- | --- | --- | +| none or item | | | confirm / update / ignore | + +## Graph Delta + +| Status | Node/edge | Semantic reason | Evidence | Action | +| --- | --- | --- | --- | --- | +| none / proposed / confirmed | | | code/doc/user decision | impact-only: report / planning: update graph | ## Unresolved Questions -| Question | Candidate answers | Scope difference | Owner | -| ------------ | ----------------- | ---------------- | ----------------------------------- | -| none or item | | | user / product / code investigation | +| Question | Candidate answers | Scope difference | Owner | +| --- | --- | --- | --- | +| none or item | | | user / product / code investigation | ## Planning Handoff Complete this only in `planning` or `implementation-handoff` mode. -| Item | Destination | Status | -| ---------------- | ----------- | ---------------------------- | -| Spec update | | missing / planned / complete | -| Case catalog | | missing / planned / complete | -| Coverage matrix | | missing / planned / complete | -| Decision backlog | | missing / planned / complete | -| E2E handoff | | not-needed / planned / ready | +| Item | Destination | Status | +| --- | --- | --- | +| Spec update | | missing / planned / complete | +| Case catalog | | missing / planned / complete | +| Coverage matrix | | missing / planned / complete | +| Decision backlog | | missing / planned / complete | +| E2E handoff | | not-needed / planned / ready | diff --git a/.agents/skills/react-best-practices/AGENTS.md b/.agents/skills/react-best-practices/AGENTS.md index d0f25735..4e340a50 100644 --- a/.agents/skills/react-best-practices/AGENTS.md +++ b/.agents/skills/react-best-practices/AGENTS.md @@ -113,12 +113,12 @@ Waterfalls are the #1 performance killer. Each sequential await adds full networ When a branch uses `await` for a flag or remote value and also requires a **cheap synchronous** condition (local props, request metadata, already-loaded state), evaluate the cheap condition **first**. Otherwise you pay for the async call even when the compound condition can never be true. -This is a specialization of [Defer Await Until Needed](rules/async-defer-await.md) for `flag && cheapCondition` style checks. +This is a specialization of [Defer Await Until Needed](./async-defer-await.md) for `flag && cheapCondition` style checks. **Incorrect:** ```typescript -const someFlag = await getFlag(); +const someFlag = await getFlag() if (someFlag && someCondition) { // ... @@ -129,7 +129,7 @@ if (someFlag && someCondition) { ```typescript if (someCondition) { - const someFlag = await getFlag(); + const someFlag = await getFlag() if (someFlag) { // ... } @@ -150,15 +150,15 @@ Move `await` operations into the branches where they're actually used to avoid b ```typescript async function handleRequest(userId: string, skipProcessing: boolean) { - const userData = await fetchUserData(userId); - + const userData = await fetchUserData(userId) + if (skipProcessing) { // Returns immediately but still waited for userData - return { skipped: true }; + return { skipped: true } } - + // Only this branch uses userData - return processUserData(userData); + return processUserData(userData) } ``` @@ -168,12 +168,12 @@ async function handleRequest(userId: string, skipProcessing: boolean) { async function handleRequest(userId: string, skipProcessing: boolean) { if (skipProcessing) { // Returns immediately without waiting - return { skipped: true }; + return { skipped: true } } - + // Fetch only when needed - const userData = await fetchUserData(userId); - return processUserData(userData); + const userData = await fetchUserData(userId) + return processUserData(userData) } ``` @@ -182,41 +182,41 @@ async function handleRequest(userId: string, skipProcessing: boolean) { ```typescript // Incorrect: always fetches permissions async function updateResource(resourceId: string, userId: string) { - const permissions = await fetchPermissions(userId); - const resource = await getResource(resourceId); - + const permissions = await fetchPermissions(userId) + const resource = await getResource(resourceId) + if (!resource) { - return { error: "Not found" }; + return { error: 'Not found' } } - + if (!permissions.canEdit) { - return { error: "Forbidden" }; + return { error: 'Forbidden' } } - - return await updateResourceData(resource, permissions); + + return await updateResourceData(resource, permissions) } // Correct: fetches only when needed async function updateResource(resourceId: string, userId: string) { - const resource = await getResource(resourceId); - + const resource = await getResource(resourceId) + if (!resource) { - return { error: "Not found" }; + return { error: 'Not found' } } - - const permissions = await fetchPermissions(userId); - + + const permissions = await fetchPermissions(userId) + if (!permissions.canEdit) { - return { error: "Forbidden" }; + return { error: 'Forbidden' } } - - return await updateResourceData(resource, permissions); + + return await updateResourceData(resource, permissions) } ``` This optimization is especially valuable when the skipped branch is frequently taken, or when the deferred operation is expensive. -For `await getFlag()` combined with a cheap synchronous guard (`flag && someCondition`), see [Check Cheap Conditions Before Async Flags](rules/async-cheap-condition-before-await.md). +For `await getFlag()` combined with a cheap synchronous guard (`flag && someCondition`), see [Check Cheap Conditions Before Async Flags](./async-cheap-condition-before-await.md). ### 1.3 Dependency-Based Parallelization @@ -227,35 +227,38 @@ For operations with partial dependencies, use `better-all` to maximize paralleli **Incorrect: profile waits for config unnecessarily** ```typescript -const [user, config] = await Promise.all([fetchUser(), fetchConfig()]); -const profile = await fetchProfile(user.id); +const [user, config] = await Promise.all([ + fetchUser(), + fetchConfig() +]) +const profile = await fetchProfile(user.id) ``` **Correct: config and profile run in parallel** ```typescript -import { all } from "better-all"; +import { all } from 'better-all' const { user, config, profile } = await all({ - async user() { - return fetchUser(); - }, - async config() { - return fetchConfig(); - }, + async user() { return fetchUser() }, + async config() { return fetchConfig() }, async profile() { - return fetchProfile((await this.$.user).id); - }, -}); + return fetchProfile((await this.$.user).id) + } +}) ``` **Alternative without extra dependencies:** ```typescript -const userPromise = fetchUser(); -const profilePromise = userPromise.then((user) => fetchProfile(user.id)); +const userPromise = fetchUser() +const profilePromise = userPromise.then(user => fetchProfile(user.id)) -const [user, config, profile] = await Promise.all([userPromise, fetchConfig(), profilePromise]); +const [user, config, profile] = await Promise.all([ + userPromise, + fetchConfig(), + profilePromise +]) ``` We can also create all the promises first, and do `Promise.all()` at the end. @@ -272,10 +275,10 @@ In API routes and Server Actions, start independent operations immediately, even ```typescript export async function GET(request: Request) { - const session = await auth(); - const config = await fetchConfig(); - const data = await fetchData(session.user.id); - return Response.json({ data, config }); + const session = await auth() + const config = await fetchConfig() + const data = await fetchData(session.user.id) + return Response.json({ data, config }) } ``` @@ -283,11 +286,14 @@ export async function GET(request: Request) { ```typescript export async function GET(request: Request) { - const sessionPromise = auth(); - const configPromise = fetchConfig(); - const session = await sessionPromise; - const [config, data] = await Promise.all([configPromise, fetchData(session.user.id)]); - return Response.json({ data, config }); + const sessionPromise = auth() + const configPromise = fetchConfig() + const session = await sessionPromise + const [config, data] = await Promise.all([ + configPromise, + fetchData(session.user.id) + ]) + return Response.json({ data, config }) } ``` @@ -302,15 +308,19 @@ When async operations have no interdependencies, execute them concurrently using **Incorrect: sequential execution, 3 round trips** ```typescript -const user = await fetchUser(); -const posts = await fetchPosts(); -const comments = await fetchComments(); +const user = await fetchUser() +const posts = await fetchPosts() +const comments = await fetchComments() ``` **Correct: parallel execution, 1 round trip** ```typescript -const [user, posts, comments] = await Promise.all([fetchUser(), fetchPosts(), fetchComments()]); +const [user, posts, comments] = await Promise.all([ + fetchUser(), + fetchPosts(), + fetchComments() +]) ``` ### 1.6 Strategic Suspense Boundaries @@ -323,8 +333,8 @@ Instead of awaiting data in async components before returning JSX, use Suspense ```tsx async function Page() { - const data = await fetchData(); // Blocks entire page - + const data = await fetchData() // Blocks entire page + return (
Sidebar
@@ -334,7 +344,7 @@ async function Page() {
Footer
- ); + ) } ``` @@ -355,12 +365,12 @@ function Page() {
Footer
- ); + ) } async function DataDisplay() { - const data = await fetchData(); // Only blocks this component - return
{data.content}
; + const data = await fetchData() // Only blocks this component + return
{data.content}
} ``` @@ -371,8 +381,8 @@ Sidebar, Header, and Footer render immediately. Only DataDisplay waits for data. ```tsx function Page() { // Start fetch immediately, but don't await - const dataPromise = fetchData(); - + const dataPromise = fetchData() + return (
Sidebar
@@ -383,17 +393,17 @@ function Page() {
Footer
- ); + ) } function DataDisplay({ dataPromise }: { dataPromise: Promise }) { - const data = use(dataPromise); // Unwraps the promise - return
{data.content}
; + const data = use(dataPromise) // Unwraps the promise + return
{data.content}
} function DataSummary({ dataPromise }: { dataPromise: Promise }) { - const data = use(dataPromise); // Reuses the same promise - return
{data.summary}
; + const data = use(dataPromise) // Reuses the same promise + return
{data.summary}
} ``` @@ -432,11 +442,11 @@ Popular icon and component libraries can have **up to 10,000 re-exports** in the **Incorrect: imports entire library** ```tsx -import { Check, X, Menu } from "lucide-react"; +import { Check, X, Menu } from 'lucide-react' // Loads 1,583 modules, takes ~2.8s extra in dev // Runtime cost: 200-800ms on every cold start -import { Button, TextField } from "@mui/material"; +import { Button, TextField } from '@mui/material' // Loads 2,225 modules, takes ~4.2s extra in dev ``` @@ -444,7 +454,7 @@ import { Button, TextField } from "@mui/material"; ```tsx // Keep the standard imports - Next.js transforms them to direct imports -import { Check, X, Menu } from "lucide-react"; +import { Check, X, Menu } from 'lucide-react' // Full TypeScript support, no manual path wrangling ``` @@ -453,8 +463,8 @@ This is the recommended approach because it preserves TypeScript type safety and **Correct - Direct imports (non-Next.js projects):** ```tsx -import Button from "@mui/material/Button"; -import TextField from "@mui/material/TextField"; +import Button from '@mui/material/Button' +import TextField from '@mui/material/TextField' // Loads only what you use ``` @@ -475,25 +485,19 @@ Load large data or modules only when a feature is activated. **Example: lazy-load animation frames** ```tsx -function AnimationPlayer({ - enabled, - setEnabled, -}: { - enabled: boolean; - setEnabled: React.Dispatch>; -}) { - const [frames, setFrames] = useState(null); +function AnimationPlayer({ enabled, setEnabled }: { enabled: boolean; setEnabled: React.Dispatch> }) { + const [frames, setFrames] = useState(null) useEffect(() => { - if (enabled && !frames && typeof window !== "undefined") { - import("./animation-frames.js") - .then((mod) => setFrames(mod.frames)) - .catch(() => setEnabled(false)); + if (enabled && !frames && typeof window !== 'undefined') { + import('./animation-frames.js') + .then(mod => setFrames(mod.frames)) + .catch(() => setEnabled(false)) } - }, [enabled, frames, setEnabled]); + }, [enabled, frames, setEnabled]) - if (!frames) return ; - return ; + if (!frames) return + return } ``` @@ -508,7 +512,7 @@ Analytics, logging, and error tracking don't block user interaction. Load them a **Incorrect: blocks initial bundle** ```tsx -import { Analytics } from "@vercel/analytics/react"; +import { Analytics } from '@vercel/analytics/react' export default function RootLayout({ children }) { return ( @@ -518,18 +522,19 @@ export default function RootLayout({ children }) { - ); + ) } ``` **Correct: loads after hydration** ```tsx -import dynamic from "next/dynamic"; +import dynamic from 'next/dynamic' -const Analytics = dynamic(() => import("@vercel/analytics/react").then((m) => m.Analytics), { - ssr: false, -}); +const Analytics = dynamic( + () => import('@vercel/analytics/react').then(m => m.Analytics), + { ssr: false } +) export default function RootLayout({ children }) { return ( @@ -539,7 +544,7 @@ export default function RootLayout({ children }) { - ); + ) } ``` @@ -552,24 +557,25 @@ Use `next/dynamic` to lazy-load large components not needed on initial render. **Incorrect: Monaco bundles with main chunk ~300KB** ```tsx -import { MonacoEditor } from "./monaco-editor"; +import { MonacoEditor } from './monaco-editor' function CodePanel({ code }: { code: string }) { - return ; + return } ``` **Correct: Monaco loads on demand** ```tsx -import dynamic from "next/dynamic"; +import dynamic from 'next/dynamic' -const MonacoEditor = dynamic(() => import("./monaco-editor").then((m) => m.MonacoEditor), { - ssr: false, -}); +const MonacoEditor = dynamic( + () => import('./monaco-editor').then(m => m.MonacoEditor), + { ssr: false } +) function CodePanel({ code }: { code: string }) { - return ; + return } ``` @@ -595,28 +601,28 @@ When analysis becomes too broad, the cost is real: ```ts const PAGE_MODULES = { - home: "./pages/home", - settings: "./pages/settings", -} as const; + home: './pages/home', + settings: './pages/settings', +} as const -const Page = await import(PAGE_MODULES[pageName]); +const Page = await import(PAGE_MODULES[pageName]) ``` **Correct: use an explicit map of allowed modules** ```ts const PAGE_MODULES = { - home: () => import("./pages/home"), - settings: () => import("./pages/settings"), -} as const; + home: () => import('./pages/home'), + settings: () => import('./pages/settings'), +} as const -const Page = await PAGE_MODULES[pageName](); +const Page = await PAGE_MODULES[pageName]() ``` **Incorrect: a 2-value enum still hides the final path from static analysis** ```ts -const baseDir = path.join(process.cwd(), "content/" + contentKind); +const baseDir = path.join(process.cwd(), 'content/' + contentKind) ``` **Correct: make each final path literal at the callsite** @@ -624,8 +630,8 @@ const baseDir = path.join(process.cwd(), "content/" + contentKind); ```ts const baseDir = kind === ContentKind.Blog - ? path.join(process.cwd(), "content/blog") - : path.join(process.cwd(), "content/docs"); + ? path.join(process.cwd(), 'content/blog') + : path.join(process.cwd(), 'content/docs') ``` In Next.js server code, this matters for output file tracing too. `path.join(process.cwd(), someVar)` can widen the traced file set because Next.js statically analyze `import`, `require`, and `fs` usage. @@ -643,16 +649,20 @@ Preload heavy bundles before they're needed to reduce perceived latency. ```tsx function EditorButton({ onClick }: { onClick: () => void }) { const preload = () => { - if (typeof window !== "undefined") { - void import("./monaco-editor"); + if (typeof window !== 'undefined') { + void import('./monaco-editor') } - }; + } return ( - - ); + ) } ``` @@ -661,12 +671,14 @@ function EditorButton({ onClick }: { onClick: () => void }) { ```tsx function FlagsProvider({ children, flags }: Props) { useEffect(() => { - if (flags.editorEnabled && typeof window !== "undefined") { - void import("./monaco-editor").then((mod) => mod.init()); + if (flags.editorEnabled && typeof window !== 'undefined') { + void import('./monaco-editor').then(mod => mod.init()) } - }, [flags.editorEnabled]); + }, [flags.editorEnabled]) - return {children}; + return + {children} + } ``` @@ -691,80 +703,80 @@ Next.js documentation explicitly states: "Treat Server Actions with the same sec **Incorrect: no authentication check** ```typescript -"use server"; +'use server' export async function deleteUser(userId: string) { // Anyone can call this! No auth check - await db.user.delete({ where: { id: userId } }); - return { success: true }; + await db.user.delete({ where: { id: userId } }) + return { success: true } } ``` **Correct: authentication inside the action** ```typescript -"use server"; +'use server' -import { verifySession } from "@/lib/auth"; -import { unauthorized } from "@/lib/errors"; +import { verifySession } from '@/lib/auth' +import { unauthorized } from '@/lib/errors' export async function deleteUser(userId: string) { // Always check auth inside the action - const session = await verifySession(); - + const session = await verifySession() + if (!session) { - throw unauthorized("Must be logged in"); + throw unauthorized('Must be logged in') } - + // Check authorization too - if (session.user.role !== "admin" && session.user.id !== userId) { - throw unauthorized("Cannot delete other users"); + if (session.user.role !== 'admin' && session.user.id !== userId) { + throw unauthorized('Cannot delete other users') } - - await db.user.delete({ where: { id: userId } }); - return { success: true }; + + await db.user.delete({ where: { id: userId } }) + return { success: true } } ``` **With input validation:** ```typescript -"use server"; +'use server' -import { verifySession } from "@/lib/auth"; -import { z } from "zod"; +import { verifySession } from '@/lib/auth' +import { z } from 'zod' const updateProfileSchema = z.object({ userId: z.string().uuid(), name: z.string().min(1).max(100), - email: z.string().email(), -}); + email: z.string().email() +}) export async function updateProfile(data: unknown) { // Validate input first - const validated = updateProfileSchema.parse(data); - + const validated = updateProfileSchema.parse(data) + // Then authenticate - const session = await verifySession(); + const session = await verifySession() if (!session) { - throw new Error("Unauthorized"); + throw new Error('Unauthorized') } - + // Then authorize if (session.user.id !== validated.userId) { - throw new Error("Can only update own profile"); + throw new Error('Can only update own profile') } - + // Finally perform the mutation await db.user.update({ where: { id: validated.userId }, data: { name: validated.name, - email: validated.email, - }, - }); - - return { success: true }; + email: validated.email + } + }) + + return { success: true } } ``` @@ -787,11 +799,11 @@ RSC→client serialization deduplicates by object reference, not value. Same ref ```tsx // RSC: send once -; + // Client: transform there -("use client"); -const sorted = useMemo(() => [...usernames].sort(), [usernames]); +'use client' +const sorted = useMemo(() => [...usernames].sort(), [usernames]) ``` **Nested deduplication behavior:** @@ -842,15 +854,15 @@ Treat module scope on the server as process-wide shared memory, not request-loca **Incorrect: request data leaks across concurrent renders** ```tsx -let currentUser: User | null = null; +let currentUser: User | null = null export default async function Page() { - currentUser = await auth(); - return ; + currentUser = await auth() + return } async function Dashboard() { - return
{currentUser?.name}
; + return
{currentUser?.name}
} ``` @@ -860,12 +872,12 @@ If two requests overlap, request A can set `currentUser`, then request B overwri ```tsx export default async function Page() { - const user = await auth(); - return ; + const user = await auth() + return } function Dashboard({ user }: { user: User | null }) { - return
{user?.name}
; + return
{user?.name}
} ``` @@ -877,7 +889,7 @@ Safe exceptions: - Process-wide singletons that do not store request- or user-specific mutable data -For static assets and config, see [Hoist Static I/O to Module Level](rules/server-hoist-static-io.md). +For static assets and config, see [Hoist Static I/O to Module Level](./server-hoist-static-io.md). ### 3.4 Cross-Request LRU Caching @@ -888,20 +900,20 @@ For static assets and config, see [Hoist Static I/O to Module Level](rules/serve **Implementation:** ```typescript -import { LRUCache } from "lru-cache"; +import { LRUCache } from 'lru-cache' const cache = new LRUCache({ max: 1000, - ttl: 5 * 60 * 1000, // 5 minutes -}); + ttl: 5 * 60 * 1000 // 5 minutes +}) export async function getUser(id: string) { - const cached = cache.get(id); - if (cached) return cached; + const cached = cache.get(id) + if (cached) return cached - const user = await db.user.findUnique({ where: { id } }); - cache.set(id, user); - return user; + const user = await db.user.findUnique({ where: { id } }) + cache.set(id, user) + return user } // Request 1: DB query, result cached @@ -1008,28 +1020,35 @@ export async function GET(request: Request) { **Incorrect: reads config on every call** ```typescript -import fs from "node:fs/promises"; +import fs from 'node:fs/promises' export async function processRequest(data: Data) { - const config = JSON.parse(await fs.readFile("./config.json", "utf-8")); - const template = await fs.readFile("./template.html", "utf-8"); + const config = JSON.parse( + await fs.readFile('./config.json', 'utf-8') + ) + const template = await fs.readFile('./template.html', 'utf-8') - return render(template, data, config); + return render(template, data, config) } ``` **Correct: hoists config and template to module level** ```typescript -import fs from "node:fs/promises"; +import fs from 'node:fs/promises' -const configPromise = fs.readFile("./config.json", "utf-8").then(JSON.parse); -const templatePromise = fs.readFile("./template.html", "utf-8"); +const configPromise = fs + .readFile('./config.json', 'utf-8') + .then(JSON.parse) +const templatePromise = fs.readFile('./template.html', 'utf-8') export async function processRequest(data: Data) { - const [config, template] = await Promise.all([configPromise, templatePromise]); + const [config, template] = await Promise.all([ + configPromise, + templatePromise, + ]) - return render(template, data, config); + return render(template, data, config) } ``` @@ -1069,13 +1088,13 @@ The React Server/Client boundary serializes all object properties into strings a ```tsx async function Page() { - const user = await fetchUser(); // 50 fields - return ; + const user = await fetchUser() // 50 fields + return } -("use client"); +'use client' function Profile({ user }: { user: User }) { - return
{user.name}
; // uses 1 field + return
{user.name}
// uses 1 field } ``` @@ -1083,13 +1102,13 @@ function Profile({ user }: { user: User }) { ```tsx async function Page() { - const user = await fetchUser(); - return ; + const user = await fetchUser() + return } -("use client"); +'use client' function Profile({ name }: { name: string }) { - return
{name}
; + return
{name}
} ``` @@ -1103,18 +1122,18 @@ React Server Components execute sequentially within a tree. Restructure with com ```tsx export default async function Page() { - const header = await fetchHeader(); + const header = await fetchHeader() return (
{header}
- ); + ) } async function Sidebar() { - const items = await fetchSidebarItems(); - return ; + const items = await fetchSidebarItems() + return } ``` @@ -1122,13 +1141,13 @@ async function Sidebar() { ```tsx async function Header() { - const data = await fetchHeader(); - return
{data}
; + const data = await fetchHeader() + return
{data}
} async function Sidebar() { - const items = await fetchSidebarItems(); - return ; + const items = await fetchSidebarItems() + return } export default function Page() { @@ -1137,7 +1156,7 @@ export default function Page() {
- ); + ) } ``` @@ -1145,13 +1164,13 @@ export default function Page() { ```tsx async function Header() { - const data = await fetchHeader(); - return
{data}
; + const data = await fetchHeader() + return
{data}
} async function Sidebar() { - const items = await fetchSidebarItems(); - return ; + const items = await fetchSidebarItems() + return } function Layout({ children }: { children: ReactNode }) { @@ -1160,7 +1179,7 @@ function Layout({ children }: { children: ReactNode }) {
{children} - ); + ) } export default function Page() { @@ -1168,7 +1187,7 @@ export default function Page() { - ); + ) } ``` @@ -1181,9 +1200,13 @@ When fetching nested data in parallel, chain dependent fetches within each item' **Incorrect: a single slow item blocks all nested fetches** ```tsx -const chats = await Promise.all(chatIds.map((id) => getChat(id))); +const chats = await Promise.all( + chatIds.map(id => getChat(id)) +) -const chatAuthors = await Promise.all(chats.map((chat) => getUser(chat.author))); +const chatAuthors = await Promise.all( + chats.map(chat => getUser(chat.author)) +) ``` If one `getChat(id)` out of 100 is extremely slow, the authors of the other 99 chats can't start loading even though their data is ready. @@ -1192,8 +1215,8 @@ If one `getChat(id)` out of 100 is extremely slow, the authors of the other 99 c ```tsx const chatAuthors = await Promise.all( - chatIds.map((id) => getChat(id).then((chat) => getUser(chat.author))), -); + chatIds.map(id => getChat(id).then(chat => getUser(chat.author))) +) ``` Each item independently chains `getChat` → `getUser`, so a slow chat doesn't block author fetches for the others. @@ -1207,15 +1230,15 @@ Use `React.cache()` for server-side request deduplication. Authentication and da **Usage:** ```typescript -import { cache } from "react"; +import { cache } from 'react' export const getCurrentUser = cache(async () => { - const session = await auth(); - if (!session?.user?.id) return null; + const session = await auth() + if (!session?.user?.id) return null return await db.user.findUnique({ - where: { id: session.user.id }, - }); -}); + where: { id: session.user.id } + }) +}) ``` Within a single request, multiple calls to `getCurrentUser()` execute the query only once. @@ -1228,20 +1251,20 @@ Within a single request, multiple calls to `getCurrentUser()` execute the query ```typescript const getUser = cache(async (params: { uid: number }) => { - return await db.user.findUnique({ where: { id: params.uid } }); -}); + return await db.user.findUnique({ where: { id: params.uid } }) +}) // Each call creates new object, never hits cache -getUser({ uid: 1 }); -getUser({ uid: 1 }); // Cache miss, runs query again +getUser({ uid: 1 }) +getUser({ uid: 1 }) // Cache miss, runs query again ``` **Correct: cache hit** ```typescript -const params = { uid: 1 }; -getUser(params); // Query runs -getUser(params); // Cache hit (same reference) +const params = { uid: 1 } +getUser(params) // Query runs +getUser(params) // Cache hit (same reference) ``` If you must pass objects, pass the same reference: @@ -1273,46 +1296,46 @@ Use Next.js's `after()` to schedule work that should execute after a response is **Incorrect: blocks response** ```tsx -import { logUserAction } from "@/app/utils"; +import { logUserAction } from '@/app/utils' export async function POST(request: Request) { // Perform mutation - await updateDatabase(request); - + await updateDatabase(request) + // Logging blocks the response - const userAgent = request.headers.get("user-agent") || "unknown"; - await logUserAction({ userAgent }); - - return new Response(JSON.stringify({ status: "success" }), { + const userAgent = request.headers.get('user-agent') || 'unknown' + await logUserAction({ userAgent }) + + return new Response(JSON.stringify({ status: 'success' }), { status: 200, - headers: { "Content-Type": "application/json" }, - }); + headers: { 'Content-Type': 'application/json' } + }) } ``` **Correct: non-blocking** ```tsx -import { after } from "next/server"; -import { headers, cookies } from "next/headers"; -import { logUserAction } from "@/app/utils"; +import { after } from 'next/server' +import { headers, cookies } from 'next/headers' +import { logUserAction } from '@/app/utils' export async function POST(request: Request) { // Perform mutation - await updateDatabase(request); - + await updateDatabase(request) + // Log after response is sent after(async () => { - const userAgent = (await headers()).get("user-agent") || "unknown"; - const sessionCookie = (await cookies()).get("session-id")?.value || "anonymous"; - - logUserAction({ sessionCookie, userAgent }); - }); - - return new Response(JSON.stringify({ status: "success" }), { + const userAgent = (await headers()).get('user-agent') || 'unknown' + const sessionCookie = (await cookies()).get('session-id')?.value || 'anonymous' + + logUserAction({ sessionCookie, userAgent }) + }) + + return new Response(JSON.stringify({ status: 'success' }), { status: 200, - headers: { "Content-Type": "application/json" }, - }); + headers: { 'Content-Type': 'application/json' } + }) } ``` @@ -1359,12 +1382,12 @@ function useKeyboardShortcut(key: string, callback: () => void) { useEffect(() => { const handler = (e: KeyboardEvent) => { if (e.metaKey && e.key === key) { - callback(); + callback() } - }; - window.addEventListener("keydown", handler); - return () => window.removeEventListener("keydown", handler); - }, [key, callback]); + } + window.addEventListener('keydown', handler) + return () => window.removeEventListener('keydown', handler) + }, [key, callback]) } ``` @@ -1373,49 +1396,45 @@ When using the `useKeyboardShortcut` hook multiple times, each instance will reg **Correct: N instances = 1 listener** ```tsx -import useSWRSubscription from "swr/subscription"; +import useSWRSubscription from 'swr/subscription' // Module-level Map to track callbacks per key -const keyCallbacks = new Map void>>(); +const keyCallbacks = new Map void>>() function useKeyboardShortcut(key: string, callback: () => void) { // Register this callback in the Map useEffect(() => { if (!keyCallbacks.has(key)) { - keyCallbacks.set(key, new Set()); + keyCallbacks.set(key, new Set()) } - keyCallbacks.get(key)!.add(callback); + keyCallbacks.get(key)!.add(callback) return () => { - const set = keyCallbacks.get(key); + const set = keyCallbacks.get(key) if (set) { - set.delete(callback); + set.delete(callback) if (set.size === 0) { - keyCallbacks.delete(key); + keyCallbacks.delete(key) } } - }; - }, [key, callback]); + } + }, [key, callback]) - useSWRSubscription("global-keydown", () => { + useSWRSubscription('global-keydown', () => { const handler = (e: KeyboardEvent) => { if (e.metaKey && keyCallbacks.has(e.key)) { - keyCallbacks.get(e.key)!.forEach((cb) => cb()); + keyCallbacks.get(e.key)!.forEach(cb => cb()) } - }; - window.addEventListener("keydown", handler); - return () => window.removeEventListener("keydown", handler); - }); + } + window.addEventListener('keydown', handler) + return () => window.removeEventListener('keydown', handler) + }) } function Profile() { // Multiple shortcuts will share the same listener - useKeyboardShortcut("p", () => { - /* ... */ - }); - useKeyboardShortcut("k", () => { - /* ... */ - }); + useKeyboardShortcut('p', () => { /* ... */ }) + useKeyboardShortcut('k', () => { /* ... */ }) // ... } ``` @@ -1430,34 +1449,34 @@ Add `{ passive: true }` to touch and wheel event listeners to enable immediate s ```typescript useEffect(() => { - const handleTouch = (e: TouchEvent) => console.log(e.touches[0].clientX); - const handleWheel = (e: WheelEvent) => console.log(e.deltaY); - - document.addEventListener("touchstart", handleTouch); - document.addEventListener("wheel", handleWheel); - + const handleTouch = (e: TouchEvent) => console.log(e.touches[0].clientX) + const handleWheel = (e: WheelEvent) => console.log(e.deltaY) + + document.addEventListener('touchstart', handleTouch) + document.addEventListener('wheel', handleWheel) + return () => { - document.removeEventListener("touchstart", handleTouch); - document.removeEventListener("wheel", handleWheel); - }; -}, []); + document.removeEventListener('touchstart', handleTouch) + document.removeEventListener('wheel', handleWheel) + } +}, []) ``` **Correct:** ```typescript useEffect(() => { - const handleTouch = (e: TouchEvent) => console.log(e.touches[0].clientX); - const handleWheel = (e: WheelEvent) => console.log(e.deltaY); - - document.addEventListener("touchstart", handleTouch, { passive: true }); - document.addEventListener("wheel", handleWheel, { passive: true }); - + const handleTouch = (e: TouchEvent) => console.log(e.touches[0].clientX) + const handleWheel = (e: WheelEvent) => console.log(e.deltaY) + + document.addEventListener('touchstart', handleTouch, { passive: true }) + document.addEventListener('wheel', handleWheel, { passive: true }) + return () => { - document.removeEventListener("touchstart", handleTouch); - document.removeEventListener("wheel", handleWheel); - }; -}, []); + document.removeEventListener('touchstart', handleTouch) + document.removeEventListener('wheel', handleWheel) + } +}, []) ``` **Use passive when:** tracking/analytics, logging, any listener that doesn't call `preventDefault()`. @@ -1474,43 +1493,43 @@ SWR enables request deduplication, caching, and revalidation across component in ```tsx function UserList() { - const [users, setUsers] = useState([]); + const [users, setUsers] = useState([]) useEffect(() => { - fetch("/api/users") - .then((r) => r.json()) - .then(setUsers); - }, []); + fetch('/api/users') + .then(r => r.json()) + .then(setUsers) + }, []) } ``` **Correct: multiple instances share one request** ```tsx -import useSWR from "swr"; +import useSWR from 'swr' function UserList() { - const { data: users } = useSWR("/api/users", fetcher); + const { data: users } = useSWR('/api/users', fetcher) } ``` **For immutable data:** ```tsx -import { useImmutableSWR } from "@/lib/swr"; +import { useImmutableSWR } from '@/lib/swr' function StaticContent() { - const { data } = useImmutableSWR("/api/config", fetcher); + const { data } = useImmutableSWR('/api/config', fetcher) } ``` **For mutations:** ```tsx -import { useSWRMutation } from "swr/mutation"; +import { useSWRMutation } from 'swr/mutation' function UpdateButton() { - const { trigger } = useSWRMutation("/api/user", updateUser); - return ; + const { trigger } = useSWRMutation('/api/user', updateUser) + return } ``` @@ -1526,18 +1545,18 @@ Add version prefix to keys and store only needed fields. Prevents schema conflic ```typescript // No version, stores everything, no error handling -localStorage.setItem("userConfig", JSON.stringify(fullUserObject)); -const data = localStorage.getItem("userConfig"); +localStorage.setItem('userConfig', JSON.stringify(fullUserObject)) +const data = localStorage.getItem('userConfig') ``` **Correct:** ```typescript -const VERSION = "v2"; +const VERSION = 'v2' function saveConfig(config: { theme: string; language: string }) { try { - localStorage.setItem(`userConfig:${VERSION}`, JSON.stringify(config)); + localStorage.setItem(`userConfig:${VERSION}`, JSON.stringify(config)) } catch { // Throws in incognito/private browsing, quota exceeded, or disabled } @@ -1545,21 +1564,21 @@ function saveConfig(config: { theme: string; language: string }) { function loadConfig() { try { - const data = localStorage.getItem(`userConfig:${VERSION}`); - return data ? JSON.parse(data) : null; + const data = localStorage.getItem(`userConfig:${VERSION}`) + return data ? JSON.parse(data) : null } catch { - return null; + return null } } // Migration from v1 to v2 function migrate() { try { - const v1 = localStorage.getItem("userConfig:v1"); + const v1 = localStorage.getItem('userConfig:v1') if (v1) { - const old = JSON.parse(v1); - saveConfig({ theme: old.darkMode ? "dark" : "light", language: old.lang }); - localStorage.removeItem("userConfig:v1"); + const old = JSON.parse(v1) + saveConfig({ theme: old.darkMode ? 'dark' : 'light', language: old.lang }) + localStorage.removeItem('userConfig:v1') } } catch {} } @@ -1571,13 +1590,10 @@ function migrate() { // User object has 20+ fields, only store what UI needs function cachePrefs(user: FullUser) { try { - localStorage.setItem( - "prefs:v1", - JSON.stringify({ - theme: user.preferences.theme, - notifications: user.preferences.notifications, - }), - ); + localStorage.setItem('prefs:v1', JSON.stringify({ + theme: user.preferences.theme, + notifications: user.preferences.notifications + })) } catch {} } ``` @@ -1604,15 +1620,15 @@ If a value can be computed from current props/state, do not store it in state or ```tsx function Form() { - const [firstName, setFirstName] = useState("First"); - const [lastName, setLastName] = useState("Last"); - const [fullName, setFullName] = useState(""); + const [firstName, setFirstName] = useState('First') + const [lastName, setLastName] = useState('Last') + const [fullName, setFullName] = useState('') useEffect(() => { - setFullName(firstName + " " + lastName); - }, [firstName, lastName]); + setFullName(firstName + ' ' + lastName) + }, [firstName, lastName]) - return

{fullName}

; + return

{fullName}

} ``` @@ -1620,11 +1636,11 @@ function Form() { ```tsx function Form() { - const [firstName, setFirstName] = useState("First"); - const [lastName, setLastName] = useState("Last"); - const fullName = firstName + " " + lastName; + const [firstName, setFirstName] = useState('First') + const [lastName, setLastName] = useState('Last') + const fullName = firstName + ' ' + lastName - return

{fullName}

; + return

{fullName}

} ``` @@ -1640,14 +1656,14 @@ Don't subscribe to dynamic state (searchParams, localStorage) if you only read i ```tsx function ShareButton({ chatId }: { chatId: string }) { - const searchParams = useSearchParams(); + const searchParams = useSearchParams() const handleShare = () => { - const ref = searchParams.get("ref"); - shareChat(chatId, { ref }); - }; + const ref = searchParams.get('ref') + shareChat(chatId, { ref }) + } - return ; + return } ``` @@ -1656,12 +1672,12 @@ function ShareButton({ chatId }: { chatId: string }) { ```tsx function ShareButton({ chatId }: { chatId: string }) { const handleShare = () => { - const params = new URLSearchParams(window.location.search); - const ref = params.get("ref"); - shareChat(chatId, { ref }); - }; + const params = new URLSearchParams(window.location.search) + const ref = params.get('ref') + shareChat(chatId, { ref }) + } - return ; + return } ``` @@ -1678,10 +1694,10 @@ Calling `useMemo` and comparing hook dependencies may consume more resources tha ```tsx function Header({ user, notifications }: Props) { const isLoading = useMemo(() => { - return user.isLoading || notifications.isLoading; - }, [user.isLoading, notifications.isLoading]); + return user.isLoading || notifications.isLoading + }, [user.isLoading, notifications.isLoading]) - if (isLoading) return ; + if (isLoading) return // return some markup } ``` @@ -1690,9 +1706,9 @@ function Header({ user, notifications }: Props) { ```tsx function Header({ user, notifications }: Props) { - const isLoading = user.isLoading || notifications.isLoading; + const isLoading = user.isLoading || notifications.isLoading - if (isLoading) return ; + if (isLoading) return // return some markup } ``` @@ -1711,8 +1727,11 @@ A common reason developers do this is to access parent variables without passing function UserProfile({ user, theme }) { // Defined inside to access `theme` - BAD const Avatar = () => ( - - ); + + ) // Defined inside to access `user` - BAD const Stats = () => ( @@ -1720,14 +1739,14 @@ function UserProfile({ user, theme }) { {user.followers} followers {user.posts} posts - ); + ) return (
- ); + ) } ``` @@ -1737,7 +1756,12 @@ Every time `UserProfile` renders, `Avatar` and `Stats` are new component types. ```tsx function Avatar({ src, theme }: { src: string; theme: string }) { - return ; + return ( + + ) } function Stats({ followers, posts }: { followers: number; posts: number }) { @@ -1746,7 +1770,7 @@ function Stats({ followers, posts }: { followers: number; posts: number }) { {followers} followers {posts} posts - ); + ) } function UserProfile({ user, theme }) { @@ -1755,7 +1779,7 @@ function UserProfile({ user, theme }) { - ); + ) } ``` @@ -1812,12 +1836,12 @@ Extract expensive work into memoized components to enable early returns before c ```tsx function Profile({ user, loading }: Props) { const avatar = useMemo(() => { - const id = computeAvatarId(user); - return ; - }, [user]); + const id = computeAvatarId(user) + return + }, [user]) - if (loading) return ; - return
{avatar}
; + if (loading) return + return
{avatar}
} ``` @@ -1825,17 +1849,17 @@ function Profile({ user, loading }: Props) { ```tsx const UserAvatar = memo(function UserAvatar({ user }: { user: User }) { - const id = useMemo(() => computeAvatarId(user), [user]); - return ; -}); + const id = useMemo(() => computeAvatarId(user), [user]) + return +}) function Profile({ user, loading }: Props) { - if (loading) return ; + if (loading) return return (
- ); + ) } ``` @@ -1851,16 +1875,16 @@ Specify primitive dependencies instead of objects to minimize effect re-runs. ```tsx useEffect(() => { - console.log(user.id); -}, [user]); + console.log(user.id) +}, [user]) ``` **Correct: re-runs only when id changes** ```tsx useEffect(() => { - console.log(user.id); -}, [user.id]); + console.log(user.id) +}, [user.id]) ``` **For derived state, compute outside effect:** @@ -1869,17 +1893,17 @@ useEffect(() => { // Incorrect: runs on width=767, 766, 765... useEffect(() => { if (width < 768) { - enableMobileMode(); + enableMobileMode() } -}, [width]); +}, [width]) // Correct: runs only on boolean transition -const isMobile = width < 768; +const isMobile = width < 768 useEffect(() => { if (isMobile) { - enableMobileMode(); + enableMobileMode() } -}, [isMobile]); +}, [isMobile]) ``` ### 5.8 Put Interaction Logic in Event Handlers @@ -1892,17 +1916,17 @@ If a side effect is triggered by a specific user action (submit, click, drag), r ```tsx function Form() { - const [submitted, setSubmitted] = useState(false); - const theme = useContext(ThemeContext); + const [submitted, setSubmitted] = useState(false) + const theme = useContext(ThemeContext) useEffect(() => { if (submitted) { - post("/api/register"); - showToast("Registered", theme); + post('/api/register') + showToast('Registered', theme) } - }, [submitted, theme]); + }, [submitted, theme]) - return ; + return } ``` @@ -1910,14 +1934,14 @@ function Form() { ```tsx function Form() { - const theme = useContext(ThemeContext); + const theme = useContext(ThemeContext) function handleSubmit() { - post("/api/register"); - showToast("Registered", theme); + post('/api/register') + showToast('Registered', theme) } - return ; + return } ``` @@ -1933,12 +1957,12 @@ When a hook contains multiple independent tasks with different dependencies, spl ```tsx const sortedProducts = useMemo(() => { - const filtered = products.filter((p) => p.category === category); + const filtered = products.filter((p) => p.category === category) const sorted = filtered.toSorted((a, b) => - sortOrder === "asc" ? a.price - b.price : b.price - a.price, - ); - return sorted; -}, [products, category, sortOrder]); + sortOrder === "asc" ? a.price - b.price : b.price - a.price + ) + return sorted +}, [products, category, sortOrder]) ``` **Correct: filtering only recomputes when products or category change** @@ -1946,16 +1970,16 @@ const sortedProducts = useMemo(() => { ```tsx const filteredProducts = useMemo( () => products.filter((p) => p.category === category), - [products, category], -); + [products, category] +) const sortedProducts = useMemo( () => filteredProducts.toSorted((a, b) => - sortOrder === "asc" ? a.price - b.price : b.price - a.price, + sortOrder === "asc" ? a.price - b.price : b.price - a.price ), - [filteredProducts, sortOrder], -); + [filteredProducts, sortOrder] +) ``` This pattern also applies to `useEffect` when combining unrelated side effects: @@ -1964,21 +1988,21 @@ This pattern also applies to `useEffect` when combining unrelated side effects: ```tsx useEffect(() => { - analytics.trackPageView(pathname); - document.title = `${pageTitle} | My App`; -}, [pathname, pageTitle]); + analytics.trackPageView(pathname) + document.title = `${pageTitle} | My App` +}, [pathname, pageTitle]) ``` **Correct: effects run independently** ```tsx useEffect(() => { - analytics.trackPageView(pathname); -}, [pathname]); + analytics.trackPageView(pathname) +}, [pathname]) useEffect(() => { - document.title = `${pageTitle} | My App`; -}, [pageTitle]); + document.title = `${pageTitle} | My App` +}, [pageTitle]) ``` **Note:** If your project has [React Compiler](https://react.dev/learn/react-compiler) enabled, it automatically optimizes dependency tracking and may handle some of these cases for you. @@ -1993,9 +2017,9 @@ Subscribe to derived boolean state instead of continuous values to reduce re-ren ```tsx function Sidebar() { - const width = useWindowWidth(); // updates continuously - const isMobile = width < 768; - return