From b2699caac7b4e8275e921caa37859faf969f2c2b Mon Sep 17 00:00:00 2001
From: Duoasa
Date: Sat, 3 Oct 2026 21:30:27 +0800
Subject: [PATCH 1/6] feat(DV-0033): prepare DeepViewer 0.5.0 native arm64
release
---
.github/workflows/ci.yml | 42 +-
.gitignore | 11 +
README.md | 83 +-
README.zh-CN.md | 82 +-
apps/deepviewer-adapter/README.md | 72 +
apps/deepviewer-adapter/UPSTREAM-LICENSE | 21 +
.../assets/deepviewer-loading-logo.svg | 6 +
.../assets/fonts/NOTICE.txt | 4 +
.../assets/fonts/OFL-SmileySans.txt | 93 +
.../assets/fonts/SmileySans-Oblique.woff2 | Bin 0 -> 1150924 bytes
apps/deepviewer-adapter/assets/icon-dark.png | Bin 0 -> 691116 bytes
apps/deepviewer-adapter/assets/icon-light.png | Bin 0 -> 691116 bytes
.../deepviewer-adapter/assets/synapse/LICENSE | 21 +
apps/deepviewer-adapter/assets/synapse/app.js | 1765 ++++++++++++++++
.../assets/synapse/deepviewer-icon.png | Bin 0 -> 691116 bytes
.../assets/synapse/index.html | 1 +
.../assets/synapse/styles.css | 202 ++
apps/deepviewer-adapter/client/CodeEditor.tsx | 40 +
.../client/DeepViewerMascot.tsx | 6 +
apps/deepviewer-adapter/client/ModeSwitch.tsx | 27 +
.../deepviewer-adapter/client/SynapseView.tsx | 300 +++
.../client/WorkspacePanels.tsx | 61 +
.../client/about.module.css | 134 ++
apps/deepviewer-adapter/client/build-info.ts | 2 +
apps/deepviewer-adapter/client/editor-save.ts | 5 +
.../deepviewer-adapter/client/editor-store.ts | 11 +
apps/deepviewer-adapter/client/index.tsx | 95 +
apps/deepviewer-adapter/client/locales.ts | 5 +
.../deepviewer-adapter/client/mode.module.css | 10 +
.../client/synapse-layout.css | 42 +
apps/deepviewer-adapter/client/typography.css | 11 +
.../client/welcome.module.css | 30 +
.../client/workspace.module.css | 10 +
.../compatibility/branding-contracts.mjs | 182 ++
.../compatibility/chat-contracts.mjs | 245 +++
.../compatibility/contracts.mjs | 81 +
.../compatibility/files/chat-attachments.ts | 25 +
.../compatibility/files/desktop-network.ts | 42 +
.../compatibility/native-module-contracts.mjs | 22 +
.../client-artifact-metadata.host.spec.ts | 202 ++
.../file-protection-tone.client.spec.tsx | 60 +
.../tests/rpc-owner.host.spec.ts | 19 +
.../compatibility/tone-contracts.mjs | 79 +
apps/deepviewer-adapter/cordis.patch.yml | 88 +
apps/deepviewer-adapter/desktop/bootstrap.ts | 71 +
.../desktop/network/access.ts | 91 +
.../desktop/network/bridge.ts | 170 ++
.../desktop/network/policy.ts | 88 +
.../desktop/network/runtime-network.ts | 19 +
.../desktop/network/transport.ts | 91 +
.../desktop/preload-state.cjs | 10 +
.../desktop/profile/development-profile.ts | 44 +
.../desktop/profile/dock-theme.ts | 41 +
.../desktop/profile/profile-migration.ts | 150 ++
.../desktop/profile/user-data-migration.ts | 323 +++
apps/deepviewer-adapter/index.ts | 17 +
.../migrations/desktop-profile.ts | 174 ++
.../migrations/kernel-snapshot.ts | 54 +
.../migrations/web-state.ts | 67 +
.../native-modules.patch.yml | 9 +
apps/deepviewer-adapter/package.json | 50 +
.../presentation/Rows.module.css | 472 +++++
.../presentation/SettingsPanel.native.tsx.txt | 52 +
.../presentation/SettingsPanel.tsx.txt | 115 ++
.../presentation/SettingsRoot.module.css | 335 +++
.../presentation/SidebarRoot.module.css | 625 ++++++
...Synapse-bind-body-target-actions.after.txt | 7 +
...ynapse-bind-body-target-actions.before.txt | 5 +
...napse-bind-header-target-actions.after.txt | 12 +
...apse-bind-header-target-actions.before.txt | 8 +
.../Synapse-blank-map-tabs.after.txt | 2 +
.../Synapse-blank-map-tabs.before.txt | 1 +
.../Synapse-blank-view-area.after.txt | 4 +
.../Synapse-blank-view-area.before.txt | 4 +
.../Synapse-chat-focus-owner.after.txt | 2 +
.../Synapse-chat-focus-owner.before.txt | 2 +
.../Synapse-chat-focus-react-import.after.txt | 1 +
...Synapse-chat-focus-react-import.before.txt | 1 +
.../Synapse-chat-focus-seq-import.after.txt | 2 +
.../Synapse-chat-focus-seq-import.before.txt | 1 +
.../Synapse-chat-native-seq-focus.after.txt | 47 +
.../Synapse-chat-native-seq-focus.before.txt | 2 +
.../Synapse-composer-flow-marker.after.txt | 1 +
.../Synapse-composer-flow-marker.before.txt | 1 +
.../Synapse-main-map-no-hero.after.txt | 2 +
.../Synapse-main-map-no-hero.before.txt | 2 +
.../Synapse-main-selected-view.after.txt | 2 +
.../Synapse-main-selected-view.before.txt | 1 +
...ynapse-map-ignore-blank-settling.after.txt | 1 +
...napse-map-ignore-blank-settling.before.txt | 1 +
...Synapse-render-target-navigation.after.txt | 3 +
...ynapse-render-target-navigation.before.txt | 2 +
...pse-selected-view-maybe-standard.after.txt | 4 +
...se-selected-view-maybe-standard.before.txt | 2 +
.../Synapse-selected-view-roster.after.txt | 1 +
.../Synapse-selected-view-roster.before.txt | 1 +
.../Synapse-selected-view-source.after.txt | 3 +
.../Synapse-selected-view-source.before.txt | 2 +
.../Synapse-selected-view-standard.after.txt | 4 +
.../Synapse-selected-view-standard.before.txt | 2 +
...apse-session-navigation-injected.after.txt | 3 +
...pse-session-navigation-injected.before.txt | 1 +
.../Synapse-share-target-navigation.after.txt | 3 +
...Synapse-share-target-navigation.before.txt | 2 +
...Synapse-target-native-navigation.after.txt | 77 +
...ynapse-target-native-navigation.before.txt | 3 +
.../Synapse-view-navigation-owner.after.txt | 1 +
.../Synapse-view-navigation-owner.before.txt | 1 +
.../Synapse-view-owner-navigation.after.txt | 3 +
.../Synapse-view-owner-navigation.before.txt | 1 +
.../presentation/WorkspaceBrowser.module.css | 647 ++++++
.../presentation/WorkspacePicker.module.css | 26 +
.../presentation/contracts.json | 397 ++++
.../presentation/contracts.mjs | 9 +
.../presentation/smoke-renderer.js.txt | 135 ++
.../presentation/styles.json | 32 +
.../scripts/prepare-upstream.mjs | 55 +
.../scripts/stage-native-modules.mjs | 30 +
apps/deepviewer-adapter/scripts/stage.mjs | 58 +
.../tests/synapse-chat-focus.spec.tsx.txt | 27 +
.../tests/synapse-client.spec.tsx.txt | 239 +++
.../tests/synapse-host.test.mjs | 278 +++
.../tests/synapse-native.spec.tsx.txt | 93 +
.../tests/workflows.test.mjs | 30 +
.../workflows/auto-delivery.ts | 83 +
.../workflows/chat-guard.ts | 9 +
.../workflows/file-delivery-prompt.ts | 6 +
.../workflows/synapse-host.mjs | 84 +
.../workflows/synapse-projection.mjs | 81 +
.../workflows/vendor/BETTER-SIDEBAR-LICENSE | 21 +
.../workflows/vendor/UPSTREAM.md | 1 +
.../workflows/vendor/git.ts | 462 +++++
.../workflows/vendor/synapse/LICENSE | 21 +
.../workflows/vendor/synapse/UPSTREAM.json | 6 +
.../workflows/vendor/synapse/app.js | 1806 +++++++++++++++++
.../workflows/vendor/synapse/client.js | 241 +++
.../workflows/vendor/synapse/cordis.patch.yml | 13 +
.../workflows/vendor/synapse/index.js | 829 ++++++++
.../workflows/vendor/synapse/package.json | 45 +
.../workflows/vendor/synapse/styles.css | 447 ++++
.../synapse/test/canvas-runtime.test.js | 328 +++
.../synapse/test/conversation-cards.test.js | 373 ++++
.../synapse/test/markdown-renderer.test.js | 23 +
.../synapse/test/message-projection.test.js | 24 +
.../synapse/test/workspace-store.test.js | 299 +++
.../workflows/workspace-delivery.ts | 162 ++
.../workflows/workspace-rpc.ts | 19 +
.../deepviewer-adapter/workflows/workspace.ts | 82 +
.../assets/deepviewer-icon-dark-1024.png | Bin 0 -> 691116 bytes
apps/deepviewer-desktop/package.json | 61 +-
.../scripts/adapt-better-sidebar-ui.mjs | 52 +-
.../scripts/adapt-subscriptions-plugin.mjs | 17 +-
.../scripts/audit-native-payload.mjs | 32 +
.../scripts/bootstrap-native-upstream.mjs | 7 +
.../build-model-capabilities-plugin.mjs | 62 +
.../scripts/build-native-desktop.mjs | 67 +
.../scripts/build-reasoning-plugin.mjs | 13 +-
.../scripts/build-runtime.mjs | 35 +-
.../scripts/capture-harness-overlay.mjs | 42 +
apps/deepviewer-desktop/scripts/dev.mjs | 68 +-
.../scripts/development-inputs.mjs | 86 +
.../scripts/development-shell.mjs | 63 +
.../fixtures/full-sidebar-browser-smoke.cjs | 2 +-
.../fixtures/sidebar-renderer-smoke.cjs | 15 +-
.../scripts/native-app-icon.mjs | 36 +
.../scripts/native-package-closure.mjs | 93 +
apps/deepviewer-desktop/scripts/notarize.mjs | 2 +-
.../scripts/package-native.mjs | 63 +
apps/deepviewer-desktop/scripts/package.mjs | 34 +-
.../scripts/prepare-native-runtime.mjs | 49 +
.../scripts/prepare-subscriptions-client.mjs | 7 +-
.../scripts/publish-native-update.mjs | 58 +
.../scripts/release-audit.mjs | 178 +-
.../scripts/release-version.mjs | 14 +-
.../scripts/remove-bottom-workbench.mjs | 204 ++
.../scripts/smoke-better-sidebar.mjs | 148 +-
.../scripts/smoke-model-capabilities-host.mjs | 14 +
.../smoke-model-capabilities-plugin.mjs | 45 +
.../smoke-native-adapter-contracts.mjs | 10 +
.../smoke-native-context-placement.mjs | 20 +
.../scripts/smoke-native-contract-source.mjs | 15 +
.../scripts/smoke-native-feedback-policy.mjs | 17 +
.../scripts/smoke-native-header-placement.mjs | 34 +
.../scripts/smoke-native-host.mjs | 130 ++
.../scripts/smoke-native-payload.mjs | 36 +
.../scripts/smoke-native-renderer.mjs | 49 +
.../scripts/smoke-native-synapse-canvas.mjs | 171 ++
.../scripts/smoke-native-synapse-client.mjs | 11 +
.../scripts/smoke-native-synapse-seams.mjs | 15 +
.../scripts/smoke-native-ui-regression.mjs | 41 +
.../scripts/smoke-native-updates.mjs | 55 +
.../scripts/smoke-native-web-state.mjs | 43 +
.../scripts/smoke-reasoning-host.mjs | 28 +-
.../scripts/smoke-reasoning-plugin.mjs | 4 +-
.../scripts/smoke-system-network.mjs | 2 +-
.../scripts/smoke-user-data.mjs | 4 +-
.../scripts/stage-better-sidebar.mjs | 36 +-
.../scripts/stage-release-plugins.mjs | 2 +-
.../scripts/stage-subscriptions.mjs | 124 ++
.../scripts/subscriptions-v4-messages.mjs | 33 +
.../scripts/sync-deepviewer-branding.mjs | 132 ++
.../scripts/sync-upstream-overrides.mjs | 729 +------
.../src/main/app-identity.ts | 14 -
.../src/main/better-sidebar-chrome.ts | 88 +-
.../src/main/development-profile.ts | 42 +-
.../deepviewer-desktop/src/main/dock-theme.ts | 2 +
.../src/main/harness-loading-brand.ts | 128 +-
.../src/main/macos-window-chrome.ts | 72 +-
apps/deepviewer-desktop/src/main/main.ts | 165 +-
.../src/main/network/access.ts | 92 +-
.../src/main/network/bridge.ts | 171 +-
.../src/main/network/policy.ts | 89 +-
.../src/main/network/runtime-network.ts | 20 +-
.../src/main/network/transport.ts | 92 +-
.../src/main/profile-migration.ts | 2 +
.../src/main/resource-locator.ts | 101 +-
.../src/main/runtime-manager.ts | 5 +-
.../src/main/user-data-migration.ts | 325 +--
apps/deepviewer-desktop/src/preload/index.ts | 2 +
.../src/renderer/global.d.ts | 1 +
.../src/renderer/index.html | 32 +-
apps/deepviewer-desktop/src/renderer/main.ts | 61 +-
.../src/renderer/styles.css | 173 +-
.../src/shared/launch-brand.css | 145 ++
.../src/shared/launch-brand.ts | 10 +
.../test/app-identity.test.ts | 44 +-
.../test/better-sidebar.test.ts | 15 +-
.../test/development-inputs.test.ts | 101 +
.../test/development-workflow.test.ts | 506 +----
.../test/dock-theme.test.ts | 96 +
.../test/fixtures/fake-harness.mjs | 21 +-
.../test/harness-overlay.test.ts | 51 +
.../test/loading-surfaces.test.ts | 71 +-
.../model-capabilities-integration.test.ts | 115 ++
.../test/native-migration.test.ts | 136 ++
.../test/native-modules.test.ts | 21 +
.../test/native-package-closure.test.ts | 19 +
.../test/native-release-audit.test.ts | 143 ++
.../test/native-workspace.test.ts | 47 +
.../test/panel-controls.test.ts | 75 +-
.../test/preview-plugin.test.ts | 30 +-
.../test/profile-migration.test.ts | 130 ++
.../test/release-packaging.test.ts | 4 +-
.../test/release-version.test.ts | 5 +
.../test/runtime-manager.test.ts | 25 +
.../test/runtime-network.test.ts | 1 +
.../test/sidebar-management.test.ts | 6 +-
.../test/sidebar-no-workbench.test.ts | 79 +
.../test/sidebar-rc2-adapter.test.ts | 79 +
.../test/subscriptions-plugin.test.ts | 8 +-
.../test/subscriptions-ui-adapter.test.ts | 8 +-
.../test/subscriptions-v4.test.ts | 64 +
.../test/user-data-migration.test.ts | 59 +-
.../test/window-options.test.ts | 16 +-
apps/deepviewer-desktop/tsconfig.json | 13 +-
.../ui-brand-official/Brand.tsx | 23 +-
.../ui-chat/ThinkingStatus.zh.fragment | 2 +-
.../CenteredWelcome.module.css | 28 +
.../ui-conversation/ConversationContent.tsx | 242 +++
.../ui-conversation/DeepViewerMascot.tsx | 80 +
.../ui-conversation/EmptyHero.tsx | 84 +
.../HideEmptyHeroBranding.module.css | 86 +-
.../ui-conversation/mascot-motion.ts | 117 ++
.../AboutLocales.en.fragment | 3 +-
.../AboutLocales.zh.fragment | 3 +-
.../AboutSection.module.css | 12 +
.../ui-settings-general/AboutSection.tsx | 11 +-
.../client/tool/components/ToolRow.module.css | 353 ++++
.../src/client/tool/components/ToolRow.tsx | 385 ++++
.../src/client/tool/models/tool-call-model.ts | 319 +++
.../client/tool/toolviews/GenericToolCard.tsx | 76 +
.../tool/toolviews/file-mutation-row.tsx | 64 +
.../file-protection-tone.client.spec.tsx | 61 +
apps/deepviewer-desktop/vite.main.config.ts | 2 +-
apps/deepviewer-desktop/vitest.config.ts | 2 +
apps/dsh-plugin-model-capabilities/.gitignore | 3 +
.../INSTALL.zh-CN.md | 65 +
apps/dsh-plugin-model-capabilities/LICENSE | 21 +
apps/dsh-plugin-model-capabilities/README.md | 93 +
.../dsh-plugin-model-capabilities/UPSTREAM.md | 4 +
.../cordis.patch.yml | 17 +
.../npm-shrinkwrap.json | 843 ++++++++
.../package.json | 67 +
.../scripts/build.mjs | 136 ++
.../scripts/live-scan.mjs | 59 +
.../scripts/smoke-host.mjs | 100 +
.../scripts/smoke-runtime.mjs | 63 +
.../src/client/CapabilityEditor.tsx | 171 ++
.../src/client/ProviderScan.tsx | 285 +++
.../src/client/index.ts | 71 +
.../src/client/locale.ts | 188 ++
.../src/client/model-config.ts | 73 +
.../src/client/styles.module.css | 164 ++
.../src/host/catalog.mjs | 135 ++
.../src/host/challenge.mjs | 176 ++
.../src/host/classify.mjs | 90 +
.../src/host/errors.mjs | 3 +
.../src/host/merge.mjs | 45 +
.../src/host/probe.mjs | 157 ++
.../src/host/read-body.mjs | 26 +
.../src/host/redact.mjs | 10 +
.../src/host/scanner.mjs | 277 +++
.../src/host/service.mjs | 345 ++++
.../src/host/store.mjs | 50 +
.../src/index.mjs | 80 +
.../src/types/css-modules.d.ts | 4 +
.../test/adaptation.test.mjs | 75 +
.../test/challenge.test.mjs | 43 +
.../test/classify.test.mjs | 49 +
.../test/fake-gateway.mjs | 69 +
.../test/merge.test.mjs | 51 +
.../test/probe.test.mjs | 102 +
.../test/scanner.test.mjs | 144 ++
.../test/service.test.mjs | 211 ++
.../test/store.test.mjs | 59 +
.../tsconfig.json | 25 +
apps/dsh-plugin-reasoning/package.json | 22 +-
.../src/client/ProviderScan.tsx | 2 +-
.../src/client/ReasoningEditor.tsx | 8 +-
apps/dsh-plugin-reasoning/src/client/index.ts | 10 +-
.../src/client/model-config.mjs | 2 +-
.../dsh-plugin-reasoning/src/scan-service.mjs | 4 +-
.../ADR-0012-native-desktop-adapter.md | 17 +
docs/sdd/architecture/decisions/README.md | 2 +
docs/sdd/integrations/dsh-plugins.md | 32 +-
docs/sdd/releases/README.md | 1 +
docs/sdd/releases/v0.5.0.md | 59 +
.../DV-0033-scoder-native-rebase/design.md | 25 +
.../DV-0033-scoder-native-rebase/spec.md | 41 +
.../DV-0033-scoder-native-rebase/tasks.md | 14 +
.../verification.md | 89 +
docs/sdd/specs/README.md | 4 +-
package.json | 2 +-
pnpm-lock.yaml | 1266 +-----------
pnpm-workspace.yaml | 3 +
upstream/README.md | 14 +-
336 files changed, 26167 insertions(+), 4237 deletions(-)
create mode 100644 apps/deepviewer-adapter/README.md
create mode 100644 apps/deepviewer-adapter/UPSTREAM-LICENSE
create mode 100644 apps/deepviewer-adapter/assets/deepviewer-loading-logo.svg
create mode 100644 apps/deepviewer-adapter/assets/fonts/NOTICE.txt
create mode 100644 apps/deepviewer-adapter/assets/fonts/OFL-SmileySans.txt
create mode 100644 apps/deepviewer-adapter/assets/fonts/SmileySans-Oblique.woff2
create mode 100644 apps/deepviewer-adapter/assets/icon-dark.png
create mode 100644 apps/deepviewer-adapter/assets/icon-light.png
create mode 100644 apps/deepviewer-adapter/assets/synapse/LICENSE
create mode 100644 apps/deepviewer-adapter/assets/synapse/app.js
create mode 100644 apps/deepviewer-adapter/assets/synapse/deepviewer-icon.png
create mode 100644 apps/deepviewer-adapter/assets/synapse/index.html
create mode 100644 apps/deepviewer-adapter/assets/synapse/styles.css
create mode 100644 apps/deepviewer-adapter/client/CodeEditor.tsx
create mode 100644 apps/deepviewer-adapter/client/DeepViewerMascot.tsx
create mode 100644 apps/deepviewer-adapter/client/ModeSwitch.tsx
create mode 100644 apps/deepviewer-adapter/client/SynapseView.tsx
create mode 100644 apps/deepviewer-adapter/client/WorkspacePanels.tsx
create mode 100644 apps/deepviewer-adapter/client/about.module.css
create mode 100644 apps/deepviewer-adapter/client/build-info.ts
create mode 100644 apps/deepviewer-adapter/client/editor-save.ts
create mode 100644 apps/deepviewer-adapter/client/editor-store.ts
create mode 100644 apps/deepviewer-adapter/client/index.tsx
create mode 100644 apps/deepviewer-adapter/client/locales.ts
create mode 100644 apps/deepviewer-adapter/client/mode.module.css
create mode 100644 apps/deepviewer-adapter/client/synapse-layout.css
create mode 100644 apps/deepviewer-adapter/client/typography.css
create mode 100644 apps/deepviewer-adapter/client/welcome.module.css
create mode 100644 apps/deepviewer-adapter/client/workspace.module.css
create mode 100644 apps/deepviewer-adapter/compatibility/branding-contracts.mjs
create mode 100644 apps/deepviewer-adapter/compatibility/chat-contracts.mjs
create mode 100644 apps/deepviewer-adapter/compatibility/contracts.mjs
create mode 100644 apps/deepviewer-adapter/compatibility/files/chat-attachments.ts
create mode 100644 apps/deepviewer-adapter/compatibility/files/desktop-network.ts
create mode 100644 apps/deepviewer-adapter/compatibility/native-module-contracts.mjs
create mode 100644 apps/deepviewer-adapter/compatibility/tests/client-artifact-metadata.host.spec.ts
create mode 100644 apps/deepviewer-adapter/compatibility/tests/file-protection-tone.client.spec.tsx
create mode 100644 apps/deepviewer-adapter/compatibility/tests/rpc-owner.host.spec.ts
create mode 100644 apps/deepviewer-adapter/compatibility/tone-contracts.mjs
create mode 100644 apps/deepviewer-adapter/cordis.patch.yml
create mode 100644 apps/deepviewer-adapter/desktop/bootstrap.ts
create mode 100644 apps/deepviewer-adapter/desktop/network/access.ts
create mode 100644 apps/deepviewer-adapter/desktop/network/bridge.ts
create mode 100644 apps/deepviewer-adapter/desktop/network/policy.ts
create mode 100644 apps/deepviewer-adapter/desktop/network/runtime-network.ts
create mode 100644 apps/deepviewer-adapter/desktop/network/transport.ts
create mode 100644 apps/deepviewer-adapter/desktop/preload-state.cjs
create mode 100644 apps/deepviewer-adapter/desktop/profile/development-profile.ts
create mode 100644 apps/deepviewer-adapter/desktop/profile/dock-theme.ts
create mode 100644 apps/deepviewer-adapter/desktop/profile/profile-migration.ts
create mode 100644 apps/deepviewer-adapter/desktop/profile/user-data-migration.ts
create mode 100644 apps/deepviewer-adapter/index.ts
create mode 100644 apps/deepviewer-adapter/migrations/desktop-profile.ts
create mode 100644 apps/deepviewer-adapter/migrations/kernel-snapshot.ts
create mode 100644 apps/deepviewer-adapter/migrations/web-state.ts
create mode 100644 apps/deepviewer-adapter/native-modules.patch.yml
create mode 100644 apps/deepviewer-adapter/package.json
create mode 100644 apps/deepviewer-adapter/presentation/Rows.module.css
create mode 100644 apps/deepviewer-adapter/presentation/SettingsPanel.native.tsx.txt
create mode 100644 apps/deepviewer-adapter/presentation/SettingsPanel.tsx.txt
create mode 100644 apps/deepviewer-adapter/presentation/SettingsRoot.module.css
create mode 100644 apps/deepviewer-adapter/presentation/SidebarRoot.module.css
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-bind-body-target-actions.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-bind-body-target-actions.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-bind-header-target-actions.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-bind-header-target-actions.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-blank-map-tabs.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-blank-map-tabs.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-blank-view-area.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-blank-view-area.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-chat-focus-owner.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-chat-focus-owner.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-chat-focus-react-import.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-chat-focus-react-import.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-chat-focus-seq-import.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-chat-focus-seq-import.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-chat-native-seq-focus.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-chat-native-seq-focus.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-composer-flow-marker.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-composer-flow-marker.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-main-map-no-hero.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-main-map-no-hero.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-main-selected-view.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-main-selected-view.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-map-ignore-blank-settling.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-map-ignore-blank-settling.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-render-target-navigation.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-render-target-navigation.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-selected-view-maybe-standard.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-selected-view-maybe-standard.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-selected-view-roster.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-selected-view-roster.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-selected-view-source.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-selected-view-source.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-selected-view-standard.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-selected-view-standard.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-session-navigation-injected.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-session-navigation-injected.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-share-target-navigation.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-share-target-navigation.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-target-native-navigation.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-target-native-navigation.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-view-navigation-owner.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-view-navigation-owner.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-view-owner-navigation.after.txt
create mode 100644 apps/deepviewer-adapter/presentation/Synapse-view-owner-navigation.before.txt
create mode 100644 apps/deepviewer-adapter/presentation/WorkspaceBrowser.module.css
create mode 100644 apps/deepviewer-adapter/presentation/WorkspacePicker.module.css
create mode 100644 apps/deepviewer-adapter/presentation/contracts.json
create mode 100644 apps/deepviewer-adapter/presentation/contracts.mjs
create mode 100644 apps/deepviewer-adapter/presentation/smoke-renderer.js.txt
create mode 100644 apps/deepviewer-adapter/presentation/styles.json
create mode 100644 apps/deepviewer-adapter/scripts/prepare-upstream.mjs
create mode 100644 apps/deepviewer-adapter/scripts/stage-native-modules.mjs
create mode 100644 apps/deepviewer-adapter/scripts/stage.mjs
create mode 100644 apps/deepviewer-adapter/tests/synapse-chat-focus.spec.tsx.txt
create mode 100644 apps/deepviewer-adapter/tests/synapse-client.spec.tsx.txt
create mode 100644 apps/deepviewer-adapter/tests/synapse-host.test.mjs
create mode 100644 apps/deepviewer-adapter/tests/synapse-native.spec.tsx.txt
create mode 100644 apps/deepviewer-adapter/tests/workflows.test.mjs
create mode 100644 apps/deepviewer-adapter/workflows/auto-delivery.ts
create mode 100644 apps/deepviewer-adapter/workflows/chat-guard.ts
create mode 100644 apps/deepviewer-adapter/workflows/file-delivery-prompt.ts
create mode 100644 apps/deepviewer-adapter/workflows/synapse-host.mjs
create mode 100644 apps/deepviewer-adapter/workflows/synapse-projection.mjs
create mode 100644 apps/deepviewer-adapter/workflows/vendor/BETTER-SIDEBAR-LICENSE
create mode 100644 apps/deepviewer-adapter/workflows/vendor/UPSTREAM.md
create mode 100644 apps/deepviewer-adapter/workflows/vendor/git.ts
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/LICENSE
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/UPSTREAM.json
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/app.js
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/client.js
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/cordis.patch.yml
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/index.js
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/package.json
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/styles.css
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/test/canvas-runtime.test.js
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/test/conversation-cards.test.js
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/test/markdown-renderer.test.js
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/test/message-projection.test.js
create mode 100644 apps/deepviewer-adapter/workflows/vendor/synapse/test/workspace-store.test.js
create mode 100644 apps/deepviewer-adapter/workflows/workspace-delivery.ts
create mode 100644 apps/deepviewer-adapter/workflows/workspace-rpc.ts
create mode 100644 apps/deepviewer-adapter/workflows/workspace.ts
create mode 100644 apps/deepviewer-desktop/assets/deepviewer-icon-dark-1024.png
create mode 100644 apps/deepviewer-desktop/scripts/audit-native-payload.mjs
create mode 100644 apps/deepviewer-desktop/scripts/bootstrap-native-upstream.mjs
create mode 100644 apps/deepviewer-desktop/scripts/build-model-capabilities-plugin.mjs
create mode 100644 apps/deepviewer-desktop/scripts/build-native-desktop.mjs
create mode 100644 apps/deepviewer-desktop/scripts/capture-harness-overlay.mjs
create mode 100644 apps/deepviewer-desktop/scripts/development-inputs.mjs
create mode 100644 apps/deepviewer-desktop/scripts/development-shell.mjs
create mode 100644 apps/deepviewer-desktop/scripts/native-app-icon.mjs
create mode 100644 apps/deepviewer-desktop/scripts/native-package-closure.mjs
create mode 100644 apps/deepviewer-desktop/scripts/package-native.mjs
create mode 100644 apps/deepviewer-desktop/scripts/prepare-native-runtime.mjs
create mode 100644 apps/deepviewer-desktop/scripts/publish-native-update.mjs
create mode 100644 apps/deepviewer-desktop/scripts/remove-bottom-workbench.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-model-capabilities-host.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-model-capabilities-plugin.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-adapter-contracts.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-context-placement.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-contract-source.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-feedback-policy.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-header-placement.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-host.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-payload.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-renderer.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-synapse-canvas.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-synapse-client.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-synapse-seams.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-ui-regression.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-updates.mjs
create mode 100644 apps/deepviewer-desktop/scripts/smoke-native-web-state.mjs
create mode 100644 apps/deepviewer-desktop/scripts/stage-subscriptions.mjs
create mode 100644 apps/deepviewer-desktop/scripts/subscriptions-v4-messages.mjs
create mode 100644 apps/deepviewer-desktop/scripts/sync-deepviewer-branding.mjs
create mode 100644 apps/deepviewer-desktop/src/main/dock-theme.ts
create mode 100644 apps/deepviewer-desktop/src/main/profile-migration.ts
create mode 100644 apps/deepviewer-desktop/src/shared/launch-brand.css
create mode 100644 apps/deepviewer-desktop/src/shared/launch-brand.ts
create mode 100644 apps/deepviewer-desktop/test/development-inputs.test.ts
create mode 100644 apps/deepviewer-desktop/test/dock-theme.test.ts
create mode 100644 apps/deepviewer-desktop/test/harness-overlay.test.ts
create mode 100644 apps/deepviewer-desktop/test/model-capabilities-integration.test.ts
create mode 100644 apps/deepviewer-desktop/test/native-migration.test.ts
create mode 100644 apps/deepviewer-desktop/test/native-modules.test.ts
create mode 100644 apps/deepviewer-desktop/test/native-package-closure.test.ts
create mode 100644 apps/deepviewer-desktop/test/native-release-audit.test.ts
create mode 100644 apps/deepviewer-desktop/test/native-workspace.test.ts
create mode 100644 apps/deepviewer-desktop/test/profile-migration.test.ts
create mode 100644 apps/deepviewer-desktop/test/sidebar-no-workbench.test.ts
create mode 100644 apps/deepviewer-desktop/test/sidebar-rc2-adapter.test.ts
create mode 100644 apps/deepviewer-desktop/test/subscriptions-v4.test.ts
create mode 100644 apps/deepviewer-desktop/upstream-overrides/ui-conversation/CenteredWelcome.module.css
create mode 100644 apps/deepviewer-desktop/upstream-overrides/ui-conversation/ConversationContent.tsx
create mode 100644 apps/deepviewer-desktop/upstream-overrides/ui-conversation/DeepViewerMascot.tsx
create mode 100644 apps/deepviewer-desktop/upstream-overrides/ui-conversation/EmptyHero.tsx
create mode 100644 apps/deepviewer-desktop/upstream-overrides/ui-conversation/mascot-motion.ts
create mode 100644 apps/deepviewer-desktop/upstream-overrides/ui-tool/src/client/tool/components/ToolRow.module.css
create mode 100644 apps/deepviewer-desktop/upstream-overrides/ui-tool/src/client/tool/components/ToolRow.tsx
create mode 100644 apps/deepviewer-desktop/upstream-overrides/ui-tool/src/client/tool/models/tool-call-model.ts
create mode 100644 apps/deepviewer-desktop/upstream-overrides/ui-tool/src/client/tool/toolviews/GenericToolCard.tsx
create mode 100644 apps/deepviewer-desktop/upstream-overrides/ui-tool/src/client/tool/toolviews/file-mutation-row.tsx
create mode 100644 apps/deepviewer-desktop/upstream-overrides/ui-tool/tests/file-protection-tone.client.spec.tsx
create mode 100644 apps/dsh-plugin-model-capabilities/.gitignore
create mode 100644 apps/dsh-plugin-model-capabilities/INSTALL.zh-CN.md
create mode 100644 apps/dsh-plugin-model-capabilities/LICENSE
create mode 100644 apps/dsh-plugin-model-capabilities/README.md
create mode 100644 apps/dsh-plugin-model-capabilities/UPSTREAM.md
create mode 100644 apps/dsh-plugin-model-capabilities/cordis.patch.yml
create mode 100644 apps/dsh-plugin-model-capabilities/npm-shrinkwrap.json
create mode 100644 apps/dsh-plugin-model-capabilities/package.json
create mode 100644 apps/dsh-plugin-model-capabilities/scripts/build.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/scripts/live-scan.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/scripts/smoke-host.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/scripts/smoke-runtime.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/client/CapabilityEditor.tsx
create mode 100644 apps/dsh-plugin-model-capabilities/src/client/ProviderScan.tsx
create mode 100644 apps/dsh-plugin-model-capabilities/src/client/index.ts
create mode 100644 apps/dsh-plugin-model-capabilities/src/client/locale.ts
create mode 100644 apps/dsh-plugin-model-capabilities/src/client/model-config.ts
create mode 100644 apps/dsh-plugin-model-capabilities/src/client/styles.module.css
create mode 100644 apps/dsh-plugin-model-capabilities/src/host/catalog.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/host/challenge.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/host/classify.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/host/errors.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/host/merge.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/host/probe.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/host/read-body.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/host/redact.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/host/scanner.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/host/service.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/host/store.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/index.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/src/types/css-modules.d.ts
create mode 100644 apps/dsh-plugin-model-capabilities/test/adaptation.test.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/test/challenge.test.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/test/classify.test.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/test/fake-gateway.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/test/merge.test.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/test/probe.test.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/test/scanner.test.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/test/service.test.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/test/store.test.mjs
create mode 100644 apps/dsh-plugin-model-capabilities/tsconfig.json
create mode 100644 docs/sdd/architecture/decisions/ADR-0012-native-desktop-adapter.md
create mode 100644 docs/sdd/releases/v0.5.0.md
create mode 100644 docs/sdd/specs/DV-0033-scoder-native-rebase/design.md
create mode 100644 docs/sdd/specs/DV-0033-scoder-native-rebase/spec.md
create mode 100644 docs/sdd/specs/DV-0033-scoder-native-rebase/tasks.md
create mode 100644 docs/sdd/specs/DV-0033-scoder-native-rebase/verification.md
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 2749cc8..040e717 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -17,7 +17,8 @@ concurrency:
jobs:
validate:
name: Typecheck, smoke, and build
- runs-on: ubuntu-24.04
+ # Profile migration uses macOS shlock; validate on the supported desktop OS.
+ runs-on: macos-15
timeout-minutes: 20
steps:
@@ -26,6 +27,14 @@ jobs:
with:
persist-credentials: false
+ - name: Check out pinned Harness
+ uses: actions/checkout@v6
+ with:
+ repository: deepseek-ai/deepseek-harness
+ ref: 639ed015397290b3745d163aafe02ffee4aa3f84
+ path: upstream/deepseek-harness
+ persist-credentials: false
+
- name: Install pnpm
uses: pnpm/action-setup@v6
@@ -41,9 +50,32 @@ jobs:
- name: Typecheck
run: pnpm typecheck
- # Development snapshots use bounded smoke coverage; full regression is separate.
- - name: Smoke
+ - name: Validate pinned adapter contracts
+ run: node apps/deepviewer-desktop/scripts/bootstrap-native-upstream.mjs
+
+ - name: Install Harness dependencies
+ run: pnpm --dir upstream/deepseek-harness install --frozen-lockfile
+
+ - name: Build Harness and DeepViewer plugins
+ run: node apps/deepviewer-desktop/scripts/build-native-desktop.mjs --core-only
+
+ - name: Bounded smoke coverage
run: pnpm desktop:smoke
- - name: Build
- run: pnpm desktop:build
+ - name: Native Synapse integration and UI regression smoke
+ run: |
+ pnpm --filter @deepviewer/desktop smoke:synapse
+ pnpm --filter @deepviewer/desktop smoke:ui-regression
+
+ - name: Fresh upstream contracts and policy fixtures
+ run: |
+ node apps/deepviewer-desktop/scripts/smoke-native-contract-source.mjs
+ node apps/deepviewer-desktop/scripts/smoke-native-header-placement.mjs
+ pnpm --filter @deepviewer/desktop smoke:contracts
+ node --test --test-timeout=15000 apps/dsh-plugin-model-capabilities/test/*.test.mjs
+ node --experimental-strip-types --test apps/deepviewer-adapter/tests/workflows.test.mjs
+
+ - name: Authenticated Host and model plugin smoke
+ run: |
+ node apps/deepviewer-desktop/scripts/smoke-model-capabilities-host.mjs
+ node apps/dsh-plugin-model-capabilities/scripts/smoke-runtime.mjs
diff --git a/.gitignore b/.gitignore
index cd9419d..a592c5e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,3 +18,14 @@ out/
# Local checkout of the official upstream source. The analyzed revision and
# refresh procedure are recorded in upstream/README.md.
upstream/deepseek-harness/
+
+# Generated official desktop carrier and adapter bundles
+apps/deepviewer-desktop/lib/
+apps/deepviewer-desktop/renderer/
+apps/deepviewer-adapter/lib/
+
+# Generated official desktop launcher shims
+/apps/deepviewer-desktop/scripts/node-bin/
+
+# Local independent worktrees and inspection checkouts
+.worktrees/
diff --git a/README.md b/README.md
index 7db3f86..74b75be 100644
--- a/README.md
+++ b/README.md
@@ -12,15 +12,15 @@
-
+
- Download 0.3.3 (ARM64)
+ 0.5.0 release candidate (ARM64)
·
- What's new
+ What's new
·
Privacy & data
·
@@ -33,8 +33,10 @@
DeepViewer is an independent, open-source desktop agent workspace built on
[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness). It bundles
-the pinned runtime into a macOS application and adds Work and Chat spaces,
-file delivery, a sidebar workbench, and desktop controls.
+the pinned runtime into a macOS application with the native Electron
+DesktopHost, Work and Chat spaces, file delivery, a sidebar workbench, and a
+session map. The 0.5.0 source derives from Scoder 0.7.0 Build 43, restored to
+DeepViewer's identity and independent data directories.
@@ -44,93 +46,100 @@ file delivery, a sidebar workbench, and desktop controls.
> DeepViewer is a community project. It is not affiliated with or endorsed by DeepSeek.
> [!IMPORTANT]
-> The current release is **DeepViewer 0.3.3 / Build 75**, based on DeepSeek Harness `0.1.5-rc.2` and available for **Apple Silicon arm64 only**. The DMG is Developer ID signed and Apple-notarized. Final visual acceptance of migrated sessions, settings, and attachments remains with the maintainer.
+> **DeepViewer 0.5.0 is being prepared for public release**, based on DeepSeek Harness `0.2.0-rc.2`, for **Apple Silicon arm64 only**. A freshly built Developer ID signed and Apple-notarized DMG is the release target; its final build number, signing/notarization results, checksums, and download link are pending confirmation. Visual acceptance, real-account flows, and migrated sessions/settings/attachments remain separate manual checks.
> [!TIP]
-> The [release](https://github.com/Duoasa/DeepViewer/releases/tag/v0.3.3) includes a SHA-256 checksum. Installed and development data now use separate, version-independent directories; back up existing data before a major upgrade. The previous public [0.2.5 release](https://github.com/Duoasa/DeepViewer/releases/tag/v0.2.5-preview.1) remains available.
+> Installed and development data use separate, version-independent directories; back up existing data before a major upgrade. The previous public [0.3.3 / Build 75 release](https://github.com/Duoasa/DeepViewer/releases/tag/v0.3.3), with its SHA-256 checksum, and [0.2.5 release](https://github.com/Duoasa/DeepViewer/releases/tag/v0.2.5-preview.1) remain available.
-## What changed since the previous public release (0.2.5)
+> [!NOTE]
+> All screenshots in this README are historical **0.3.3 / Build 75** references. They have not been replaced or used as evidence of the 0.5.0 interface or visual acceptance.
+
+## What changed since the previous public release (0.3.3)
-| Area | Changes in 0.3.3 |
+| Area | Changes in the 0.5.0 candidate |
| --- | --- |
-| Work and Chat | Separate workspace-backed Work sessions from workspace-free Chat history. Create projects from the sidebar, search Chat history, and recover session mode and titles after a restart without opening every conversation. |
-| Files and previews | Deliver generated images and other files as attachment cards. Materialize external or extensionless outputs inside the session workspace with an appropriate extension so the card and sidebar preview refer to the same file. |
-| Sidebar workbench | Integrate the open-source Better Sidebar workbench for files, editor, terminal, Git and browser panels. Desktop adaptations preserve window chrome, session-relative paths, navigation, and authentication checks. |
-| Models | Add a first-party reasoning and multimodal capability editor with bounded model scanning. Provider support is checked per model; a successful scan does not guarantee every provider feature works. |
-| Progress and appearance | Group related context and operations into expandable summaries, align their text and multimodal status with the conversation font-size setting, add clearer hover states, image-generation shimmer, and a 12 × 12 px Drive activity indicator. Settings layout and system appearance follow the desktop shell. |
-| Networking | Use the system proxy/PAC configuration for the bundled runtime, preserve explicit proxy settings, show clearer connection errors, and request scoped permission before accessing private-network addresses. |
-| Upgrade continuity | Installed and development editions use separate, fixed data directories. First launch imports older same-edition sessions and attachments with backups; later app and Harness versions reuse the fixed directory. Cold session lists restore Work/Chat classification from persisted events. |
+| Native desktop | Move from the previous custom shell and DSH 0.1.5 overlays to the official Electron/DesktopHost and pinned DSH `0.2.0-rc.2`, using Scoder `0.7.0 / Build 43` as the source baseline. |
+| Work, Chat and session map | Retain workspace-backed Work and workspace-free Chat, and add the built-in Synapse session map for exploring session context. |
+| Sidebar workbench | Harness native panels take over the standalone Better Sidebar activation. DeepViewer retains file/editor/Git workflows, session-relative paths, desktop browser integration, and permission checks. |
+| Built-in modules | Bundle subscriptions `0.3.1` and model-capabilities `1.0.2` as application modules. Model-capabilities replaces the old reasoning plugin and carries over its supported settings. |
+| Files and appearance | Keep attachment delivery and workspace previews, restore DeepViewer branding throughout the native shell, and follow desktop/system appearance. |
+| Development stability | Ignore filesystem synchronization that only changes artifact metadata, preserving the mounted renderer. Real code changes and completed-build timestamps still trigger hot reload. |
+| Upgrade continuity | Preserve separate stable/development data roots, snapshot the old DeepViewer kernel data before opening the new stores, and retain migration/rollback backups. Scoder and Saidex data are excluded from migration candidates. |
+| Networking | Retain system proxy/PAC support, explicit proxy settings, scoped loopback/RPC authentication, and private-network permission boundaries. |
-The removed Taskboard integration is **not** included. Some provider, sidebar, and migrated-data flows still need real-account and manual UI acceptance; see the [release record](docs/sdd/releases/v0.3.3.md) for the verification boundary.
+The standalone Better Sidebar and reasoning plugins are retired from activation; their replacement is part of this migration. Taskboard remains removed, and the historical preview plugin remains disabled. See the [0.5.0 specification](docs/sdd/specs/DV-0033-scoder-native-rebase/spec.md) for the current verification boundary and the [0.3.3 release record](docs/sdd/releases/v0.3.3.md) for historical evidence.
### Work, Chat, and process disclosure
Work groups sessions by project. Chat keeps conversations independent of a workspace. Both modes restore their history on startup, and related context, reasoning, searches, and operations appear in expandable summaries.
-
+
-
+
### Files and sidebar workbench
The sidebar can inspect workspace files, preview generated HTML, and browse pages alongside the conversation. File paths, panel navigation, and browser access are connected to the active desktop session.
-
+
-
+
### Generated images and attachments
Generated files are delivered as attachment cards with usable names and extensions. The same workspace copy opens in the sidebar preview, including images first produced outside the workspace.
-
+
-
+
### Appearance and version identity
Settings follow the desktop appearance, and the About page shows the app build and bundled Harness version.
-
+
## Install and data
-1. Download `DeepViewer-0.3.3-macos-arm64.dmg` and check it against `SHA256SUMS.txt` in the [release](https://github.com/Duoasa/DeepViewer/releases/tag/v0.3.3).
+1. Once 0.5.0 is published, download the expected `DeepViewer-0.5.0-arm64.dmg` and verify it against `SHA256SUMS.txt` from [GitHub Releases](https://github.com/Duoasa/DeepViewer/releases). The candidate's final assets and download link are pending confirmation.
2. Open the DMG and copy `DeepViewer.app` to Applications.
3. Open the app and configure a provider or subscription. No global Node.js or Harness installation is needed.
DeepViewer binds its local service to a random loopback port. Installed app data lives in `~/Library/Application Support/DeepViewer`; development app data lives in `~/Library/Application Support/DeepViewer Dev`. Replacing the application does not replace these directories. Legacy data is copied and verified before first-use cutover; migration backups are retained. Keep your own backup before a major upgrade.
-The release package is built from a clean allowlist of application code, pinned runtime packages, assets, and licenses. It does **not** contain the maintainer's sessions, workspaces, settings, logs, account credentials, home-directory paths, or development handoff files. The packaged app is audited before signing and publication.
+The packaging workflow materializes an allowlist of application code, pinned runtime packages, assets, and licenses. Release acceptance requires auditing the final package for developer-machine paths, private data, and escaping links, as well as verifying its signature, notarization, and checksums. The 0.5.0 candidate's final package evidence is pending.
## Open-source foundations and DeepViewer modifications
| Component | Source and license | What DeepViewer changes |
| --- | --- | --- |
-| Core agent | [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness), MIT, pinned to `fb2c4b9e698e30edb738bca4cf0618587db7d203` (`0.1.5-rc.2`) | Desktop integration and a [reproducible source patch](upstream/snapshots/v0.3.3/README.md) for Work/Chat, session recovery, file delivery, progressive disclosure, themes, and network bridging. The agent loop remains upstream-owned. |
-| Subscriptions and image tools | [V1ki/dsh-plugin-subscriptions](https://github.com/V1ki/dsh-plugin-subscriptions), MIT, `0.3.1` | DSH 0.1.5 compatibility adapter, scoped RPC/loopback checks, remaining-usage display, and image-generation status styling. |
-| Sidebar workbench | [omdsh-dev/DSH-better-sidebar](https://github.com/omdsh-dev/DSH-better-sidebar), MIT, `0.19.1` | macOS chrome and settings adaptation, native panel routing, session-relative paths, and desktop browser/authentication integration. |
-| Model capability editor | [DeepViewer first-party plugin](apps/dsh-plugin-reasoning), MIT, `0.1.0` | Provider/model scanning and manual reasoning and multimodal capability configuration. |
+| Core agent and native shell | [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness), MIT, pinned to `639ed015397290b3745d163aafe02ffee4aa3f84` (`0.2.0-rc.2`) | Official Electron/DesktopHost with the [DeepViewer adapter](apps/deepviewer-adapter) and checked compatibility contracts. The agent loop remains upstream-owned. |
+| Desktop source baseline | [Duoasa/scoder](https://github.com/Duoasa/scoder), `0.7.0 / Build 43`, pinned to `e277adc6ce512655095e6f65c63bdc72d24bae95`; original notices retained | Restore DeepViewer branding, package/update identities and data isolation, retain native features, and fix metadata-driven renderer replacement. Scoder's release history and user data are not imported. |
+| Subscriptions and image tools | [V1ki/dsh-plugin-subscriptions](https://github.com/V1ki/dsh-plugin-subscriptions), MIT, `0.3.1` | Built-in DSH 0.2.0 compatibility module, scoped RPC/loopback checks, remaining-usage display, and image-generation status styling. |
+| Sidebar provenance | [omdsh-dev/DSH-better-sidebar](https://github.com/omdsh-dev/DSH-better-sidebar), MIT | The standalone plugin is retired; Harness native panels take over the workbench. Attribution is retained for reused workflow code. |
+| Model capabilities | [DeepViewer model-capabilities module](apps/dsh-plugin-model-capabilities), MIT, `1.0.2` | Provider/model scanning and reasoning/multimodal configuration, replacing the old `dsh-plugin-reasoning` activation while preserving supported settings. |
+| Session map | [Vendored Synapse source](apps/deepviewer-adapter/workflows/vendor/synapse), with its original license and source record | Built-in session-map integration within the DeepViewer adapter. |
The historical first-party preview plugin is disabled in favor of the Harness preview. [dashi-taskboard](https://github.com/chuspeeism/dashi-taskboard) was evaluated and removed; no Taskboard runtime is bundled. Upstream copyrights and third-party licenses remain with their respective projects.
## Build from source
-Requires macOS arm64, Node.js 24+, and pnpm 11.19.0. The committed patch reconstructs the exact Harness source used for this release from the pinned upstream commit; no user data or prebuilt app is needed.
+Requires macOS arm64, Node.js 24+, and pnpm 11.19.0. The bootstrap checks out the pinned Harness source and applies the adapter's checked contracts; no user data or prebuilt app is needed.
```sh
git clone https://github.com/Duoasa/DeepViewer.git
cd DeepViewer
pnpm install --frozen-lockfile
-git clone https://github.com/deepseek-ai/deepseek-harness upstream/deepseek-harness
-git -C upstream/deepseek-harness checkout fb2c4b9e698e30edb738bca4cf0618587db7d203
-git -C upstream/deepseek-harness apply --whitespace=nowarn ../snapshots/v0.3.3/harness.patch
+node apps/deepviewer-desktop/scripts/bootstrap-native-upstream.mjs
pnpm --dir upstream/deepseek-harness install --frozen-lockfile
-pnpm --dir upstream/deepseek-harness run build:official
-pnpm desktop:build
+pnpm desktop:dev
```
-`pnpm desktop:build` increments the local build number for continued development. The [snapshot instructions](upstream/snapshots/v0.3.3/README.md) explain how to reproduce fixed Build 75, including Runtime packaging, Developer ID signing, and Apple notarization. Signing credentials stay in the local Keychain and are never committed.
+`pnpm desktop:dev` builds and opens DeepViewer Dev using its separate profile. Use `pnpm desktop:dev:restart` to restart that project's development runner, or `pnpm desktop:build` to build without launching. Development builds increment the local build number.
+
+Basic verification uses `pnpm typecheck` and `pnpm desktop:smoke`; native integration and adapter-contract checks are defined in the [CI workflow](.github/workflows/ci.yml). `pnpm desktop:preview` prepares a local preview. `pnpm desktop:release` prepares signed arm64 DMG/ZIP artifacts and requires `DEEPVIEWER_SIGN_IDENTITY`, `DEEPVIEWER_TEAM_ID`, and `DEEPVIEWER_NOTARY_PROFILE`; it does not publish them. Signing/notary credentials remain local, with the notary profile in the Keychain.
+
+The [0.3.3 snapshot instructions](upstream/snapshots/v0.3.3/README.md) remain a historical reproduction guide for Build 75, not the build procedure for 0.5.0.
The [SDD documents](docs/sdd/README.md) record architecture, plugin provenance, requirements, and verification. DeepViewer's original code uses the [MIT License](LICENSE); all upstream licenses remain applicable.
diff --git a/README.zh-CN.md b/README.zh-CN.md
index ddeed17..716b168 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -12,15 +12,15 @@
-
+
- 下载 0.3.3(ARM64)
+ 0.5.0 发布候选(ARM64)
·
- 本版更新
+ 本版更新
·
隐私与数据
·
@@ -33,8 +33,9 @@
DeepViewer 是建立在
[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 之上的独立开源桌面
-Agent 工作台。它将固定版本的 Runtime 封装进 macOS 应用,并加入 Work / Chat 空间、
-文件交付、侧栏工作台与桌面控制。
+Agent 工作台。它通过原生 Electron/DesktopHost 将固定版本的 Runtime 封装进 macOS
+应用,提供 Work / Chat 空间、文件交付、侧栏工作台和会话图谱。0.5.0 源码承接
+Scoder 0.7.0 Build 43,恢复 DeepViewer 品牌和独立的数据目录。
@@ -44,93 +45,100 @@ Agent 工作台。它将固定版本的 Runtime 封装进 macOS 应用,并加
> DeepViewer 是独立社区项目,与 DeepSeek 没有从属或官方背书关系。
> [!IMPORTANT]
-> 当前正式发布为 **DeepViewer 0.3.3 / Build 75**,内置 DeepSeek Harness `0.1.5-rc.2`,**仅支持 Apple Silicon arm64**。DMG 已完成 Developer ID 签名和 Apple 公证。迁移会话、设置与附件的最终界面验收仍由维护者进行。
+> **DeepViewer 0.5.0 正在准备公开发布**,内置 DeepSeek Harness `0.2.0-rc.2`,**仅支持 Apple Silicon arm64**。本次目标是从源码全新生成 Developer ID 签名并经 Apple 公证的 DMG;最终 Build 号、签名/公证结果、校验清单和下载链接待证据确认。界面、真实账户及迁移会话/设置/附件仍保留独立的人工验收边界。
> [!TIP]
-> [Release](https://github.com/Duoasa/DeepViewer/releases/tag/v0.3.3) 提供 SHA-256 校验清单。安装版和开发版现使用相互独立、与版本号无关的数据目录;重大升级前请备份。上一公开 [0.2.5 版本](https://github.com/Duoasa/DeepViewer/releases/tag/v0.2.5-preview.1) 仍可下载。
+> 安装版和开发版使用相互独立、与版本号无关的数据目录;重大升级前请备份。上一公开 [0.3.3 / Build 75](https://github.com/Duoasa/DeepViewer/releases/tag/v0.3.3) 及其 SHA-256 清单、历史 [0.2.5 版本](https://github.com/Duoasa/DeepViewer/releases/tag/v0.2.5-preview.1) 仍可下载。
-## 相比上一公开版本 0.2.5 的功能变化
+> [!NOTE]
+> 本 README 的全部截图均为 **0.3.3 / Build 75 历史参考**,本次没有替换截图,不代表 0.5.0 当前界面或视觉验收结果。
+
+## 相比上一公开版本 0.3.3 的功能变化
-| 领域 | 0.3.3 的变化 |
+| 领域 | 0.5.0 候选版本的变化 |
| --- | --- |
-| Work 与 Chat | 将依赖工作区的 Work 会话与无工作区的 Chat 历史区分;可从侧栏创建项目、搜索 Chat 历史。重启后无需逐条打开会话,也能从持久记录恢复模式和标题。 |
-| 文件与预览 | 生成的图片及其他文件以附件卡片交付。将工作区外或无后缀的产物复制到会话工作区,并根据真实类型补齐扩展名,使卡片和侧栏预览指向同一文件。 |
-| 侧栏工作台 | 集成开源 Better Sidebar,提供文件、编辑器、终端、Git 和浏览器面板;桌面适配窗口控件、相对文件路径、导航与鉴权。 |
-| 模型能力 | 增加第一方推理与多模态能力编辑器,按模型进行有边界的能力扫描;扫描通过不等于提供方的所有功能均已实测。 |
-| 过程与外观 | 同类上下文和操作合并为可展开摘要,字号与多模态状态跟随会话字号;加强悬停反馈,增加图片生成流光,以及侧栏 12 × 12 px Drive 运行指示。设置布局和系统外观与桌面壳对齐。 |
-| 网络 | 内置 Runtime 采用系统代理/PAC,保留显式代理配置;连接错误更清晰,访问内网地址前请求限定范围的授权。 |
-| 升级连续性 | 安装版与开发版分别使用固定数据目录。首次启动带备份导入同渠道旧会话和附件;后续应用及 Harness 升级继续使用固定目录。冷启动列表从持久事件恢复 Work/Chat 分类。 |
+| 原生桌面 | 从旧自建桌面壳和 DSH 0.1.5 覆盖层迁移到官方 Electron/DesktopHost 与固定 DSH `0.2.0-rc.2`,以 Scoder `0.7.0 / Build 43` 为源码基线。 |
+| Work、Chat 与会话图谱 | 保留依赖工作区的 Work 和无工作区的 Chat,增加内置 Synapse 会话图谱,用于查看会话关联与上下文。 |
+| 侧栏工作台 | Harness 原生面板承接独立 Better Sidebar 的挂载;DeepViewer 保留文件/编辑器/Git 操作、会话相对路径、桌面浏览器集成与权限检查。 |
+| 内置模块 | subscriptions `0.3.1` 和 model-capabilities `1.0.2` 作为应用模块内置;模型能力模块替代旧 reasoning 插件,并承接其支持的设置。 |
+| 文件与外观 | 保留附件交付和工作区预览,在原生壳中恢复 DeepViewer 品牌,跟随桌面/系统外观。 |
+| 开发稳定性 | 文件同步仅改变产物元数据时保留已挂载的界面;真实源码变化和完成构建的时间戳仍触发热更新。 |
+| 升级连续性 | 保留稳定版/开发版独立数据根目录,在新内核打开存储前快照旧 DeepViewer 数据,保留迁移与回滚备份;Scoder 和 Saidex 数据不作为迁移候选。 |
+| 网络 | 保留系统代理/PAC、显式代理、限定范围的 loopback/RPC 鉴权与内网访问授权边界。 |
-本版**不包含**已经移除的 Taskboard 集成。部分提供方、侧栏及迁移数据流程仍需真实账户和界面人工验收;验证边界见[发布记录](docs/sdd/releases/v0.3.3.md)。
+独立 Better Sidebar 和 reasoning 插件退出挂载,由本次迁移的原生功能与模型能力模块承接。Taskboard 保持移除,历史预览插件保持停用。当前验证边界见 [0.5.0 规格](docs/sdd/specs/DV-0033-scoder-native-rebase/spec.md);[0.3.3 发布记录](docs/sdd/releases/v0.3.3.md)仅提供历史证据。
### Work、Chat 与过程披露
Work 按项目组织会话,Chat 可以脱离工作区保存对话。两种模式都能在启动后恢复历史;同类上下文、思考、搜索和操作会合并为可展开的摘要。
-
+
-
+
### 文件与侧栏工作台
侧栏可以查看工作区文件、预览生成的 HTML,并与对话并排浏览网页。文件路径、面板导航和浏览器访问都与当前桌面会话关联。
-
+
-
+
### 图片生成与附件交付
生成文件以具有可用名称和后缀的附件卡片交付。即使图片最初生成在工作区外,也会复制到会话工作区,让附件与侧栏预览指向同一个文件。
-
+
-
+
### 外观与版本信息
设置页跟随桌面外观,“关于”页面展示应用构建号和内置 Harness 版本。
-
+
## 安装与数据
-1. 在 [Release](https://github.com/Duoasa/DeepViewer/releases/tag/v0.3.3) 下载 `DeepViewer-0.3.3-macos-arm64.dmg`,并用 `SHA256SUMS.txt` 校验。
+1. 待 0.5.0 发布后,从 [GitHub Releases](https://github.com/Duoasa/DeepViewer/releases) 下载预期文件 `DeepViewer-0.5.0-arm64.dmg`,并用 `SHA256SUMS.txt` 校验。候选版本的最终资产与下载链接待证据确认。
2. 打开 DMG,将 `DeepViewer.app` 复制到“应用程序”。
3. 打开应用并配置模型提供方或订阅账户。无需全局安装 Node.js 或 Harness。
本地服务仅监听随机 loopback 端口。安装版数据固定存放于 `~/Library/Application Support/DeepViewer`,开发版固定存放于 `~/Library/Application Support/DeepViewer Dev`。覆盖安装应用不会替换这些目录;首次迁移会先复制、校验并保留备份。重大升级前仍建议自行备份。
-公开安装包从明确允许的代码、固定 Runtime、资源和许可证全新构建,不包含维护者的会话、工作区、设置、日志、账户凭据、开发机主目录路径或交接文件。签名发布前会检查包体。
+打包流程从明确允许的代码、固定 Runtime、资源和许可证生成独立包体。正式验收要求检查最终包中的开发机路径、私有数据和越界链接,并核验签名、公证与校验清单。0.5.0 候选包的最终证据仍待确认。
## 开源引用与 DeepViewer 修改
| 组件 | 来源与许可证 | DeepViewer 的修改 |
| --- | --- | --- |
-| Agent 内核 | [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness),MIT,固定在 `fb2c4b9e698e30edb738bca4cf0618587db7d203`(`0.1.5-rc.2`) | 桌面集成及[可复原源码补丁](upstream/snapshots/v0.3.3/README.md),覆盖 Work/Chat、会话恢复、文件交付、过程披露、主题和网络桥接;Agent Loop 仍由上游维护。 |
-| 订阅与图片工具 | [V1ki/dsh-plugin-subscriptions](https://github.com/V1ki/dsh-plugin-subscriptions),MIT,`0.3.1` | DSH 0.1.5 兼容适配、限定范围 RPC/loopback 检查、剩余额度显示及图片生成状态样式。 |
-| 侧栏工作台 | [omdsh-dev/DSH-better-sidebar](https://github.com/omdsh-dev/DSH-better-sidebar),MIT,`0.19.1` | macOS 窗口和设置适配、原生面板路由、会话相对路径、桌面浏览器与鉴权集成。 |
-| 模型能力编辑器 | [DeepViewer 第一方插件](apps/dsh-plugin-reasoning),MIT,`0.1.0` | 提供方/模型扫描,以及推理和多模态能力的手动配置。 |
+| Agent 内核与原生壳 | [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness),MIT,固定在 `639ed015397290b3745d163aafe02ffee4aa3f84`(`0.2.0-rc.2`) | 官方 Electron/DesktopHost 加 [DeepViewer adapter](apps/deepviewer-adapter) 与经过检查的兼容契约;Agent Loop 仍由上游维护。 |
+| 桌面源码基线 | [Duoasa/scoder](https://github.com/Duoasa/scoder),`0.7.0 / Build 43`,固定在 `e277adc6ce512655095e6f65c63bdc72d24bae95`;保留原始版权说明 | 恢复 DeepViewer 品牌、包名/更新目标和数据隔离,保留原生功能,修复元数据变化引发的界面热卸载;不导入 Scoder 发布记录与用户数据。 |
+| 订阅与图片工具 | [V1ki/dsh-plugin-subscriptions](https://github.com/V1ki/dsh-plugin-subscriptions),MIT,`0.3.1` | 内置 DSH 0.2.0 兼容模块,限定范围 RPC/loopback 检查、剩余额度显示及图片生成状态样式。 |
+| 侧栏来源 | [omdsh-dev/DSH-better-sidebar](https://github.com/omdsh-dev/DSH-better-sidebar),MIT | 独立插件退出挂载,工作台由 Harness 原生面板承接;复用工作流代码保留来源与版权。 |
+| 模型能力 | [DeepViewer model-capabilities 模块](apps/dsh-plugin-model-capabilities),MIT,`1.0.2` | 提供方/模型扫描和推理/多模态配置,替代旧 `dsh-plugin-reasoning` 挂载并承接支持的设置。 |
+| 会话图谱 | [Vendored Synapse 源码](apps/deepviewer-adapter/workflows/vendor/synapse),保留原始许可证和来源记录 | 在 DeepViewer adapter 中内置会话图谱集成。 |
历史第一方预览插件已停用,改用 Harness 官方预览。[dashi-taskboard](https://github.com/chuspeeism/dashi-taskboard) 曾参与评估,现已移除,Runtime 不再包含 Taskboard。上游版权和第三方许可证仍归各项目所有。
## 从源码构建
-需要 macOS arm64、Node.js 24+ 和 pnpm 11.19.0。仓库中的补丁可以从固定的 Harness 提交还原本版确切源码,不依赖用户数据或预构建应用。
+需要 macOS arm64、Node.js 24+ 和 pnpm 11.19.0。bootstrap 获取固定的 Harness 源码并应用经过检查的适配契约,不依赖用户数据或预构建应用。
```sh
git clone https://github.com/Duoasa/DeepViewer.git
cd DeepViewer
pnpm install --frozen-lockfile
-git clone https://github.com/deepseek-ai/deepseek-harness upstream/deepseek-harness
-git -C upstream/deepseek-harness checkout fb2c4b9e698e30edb738bca4cf0618587db7d203
-git -C upstream/deepseek-harness apply --whitespace=nowarn ../snapshots/v0.3.3/harness.patch
+node apps/deepviewer-desktop/scripts/bootstrap-native-upstream.mjs
pnpm --dir upstream/deepseek-harness install --frozen-lockfile
-pnpm --dir upstream/deepseek-harness run build:official
-pnpm desktop:build
+pnpm desktop:dev
```
-`pnpm desktop:build` 会为继续开发递增本地 Build 号。[源码快照说明](upstream/snapshots/v0.3.3/README.md)提供复现固定 Build 75 的 Runtime 封包、Developer ID 签名与 Apple 公证步骤。签名凭据只保存在本机钥匙串,不提交到仓库。
+`pnpm desktop:dev` 会构建并启动使用独立数据目录的 DeepViewer Dev;`pnpm desktop:dev:restart` 重启本项目开发进程,`pnpm desktop:build` 仅构建、不启动。开发构建会递增本地 Build 号。
+
+基础验证使用 `pnpm typecheck` 和 `pnpm desktop:smoke`,原生集成及适配契约检查见 [CI 流程](.github/workflows/ci.yml)。`pnpm desktop:preview` 制作本地预览包;`pnpm desktop:release` 准备签名 arm64 DMG/ZIP,需要设置 `DEEPVIEWER_SIGN_IDENTITY`、`DEEPVIEWER_TEAM_ID` 和 `DEEPVIEWER_NOTARY_PROFILE`,不会自动发布。签名/公证凭据留在本机,notary profile 保存在钥匙串。
+
+[0.3.3 源码快照说明](upstream/snapshots/v0.3.3/README.md)保留为 Build 75 的历史复现指南,不用于 0.5.0 构建。
[SDD 文档](docs/sdd/README.md)记录架构、插件来源、需求和验证。DeepViewer 原创代码采用 [MIT License](LICENSE);各上游许可证继续适用。
diff --git a/apps/deepviewer-adapter/README.md b/apps/deepviewer-adapter/README.md
new file mode 100644
index 0000000..70083ea
--- /dev/null
+++ b/apps/deepviewer-adapter/README.md
@@ -0,0 +1,72 @@
+# DeepViewer native adapter
+
+DeepViewer 0.5.0 uses DSH 0.2.0-rc.2 (`639ed015397290b3745d163aafe02ffee4aa3f84`) and its Electron/private DesktopHost. The upstream checkout is disposable build input. Product adaptations live here; the old 0.1.5 whole-file overlays are not replayed.
+
+| Directory | Ownership |
+| --- | --- |
+| `desktop/` | Identity, data roots, Dock theme, system proxy/PAC and private-network authorization |
+| `client/` | Branding/About, welcome mascot/font, Work/Chat and native-sidebar editor/Git tabs |
+| `workflows/` | Chat isolation, generated-file delivery policy, workspace operations |
+| `migrations/` | Profile conversion, version-bound kernel backup and allowlisted frontend state |
+| `compatibility/` | Pinned native gaps, imported helper files and regression tests |
+| `scripts/` | Validate contracts before modifying disposable upstream sources; stage native bundles |
+
+Use native filesystem opening/reveal, document/browser previews, delivery cards, change review, PTY/browser/sidebar state, process folding and statistics. Better Sidebar and Taskboard are not runtime dependencies. The Git helper retains its upstream MIT attribution; editor libraries retain their licenses.
+
+The adapter, subscriptions and model capabilities are application-owned native modules. The shipped Web application composition owns their rows and client settings registrations. Generated CLI metadata owns their dependencies; the upstream installation manifest and lockfile stay unchanged. Integrated manifests omit `dsh.bundle`, and user profiles contain neither their dependencies nor their bundle selections. They have no separate cards, enable switches or uninstall controls in Plugins. Standalone source packages retain their original plugin packaging.
+
+## Reproduce from the repository root
+
+Use Node 24 and the root's pinned pnpm. `bootstrap-native-upstream.mjs` checks the tag/commit and anchors without resetting unknown edits. Install the upstream's pinned dependencies after bootstrap.
+
+```sh
+pnpm install --frozen-lockfile
+node apps/deepviewer-desktop/scripts/bootstrap-native-upstream.mjs
+pnpm --dir upstream/deepseek-harness install --frozen-lockfile
+pnpm desktop:build
+pnpm typecheck
+pnpm desktop:smoke
+pnpm --filter @deepviewer/desktop smoke:source
+pnpm --filter @deepviewer/desktop smoke:contracts
+pnpm --filter @deepviewer/desktop smoke:plugins
+pnpm --filter @deepviewer/desktop smoke:native
+pnpm --filter @deepviewer/desktop smoke:payload
+```
+
+`smoke:native` uses private homes, fake APIs and local update feeds. `smoke:payload` materializes the production dependency closure and creates a temporary ASAR; it checks actual native loading and Office conversion without creating a distributable app or DMG. Source maps, development links and other-platform runtime packages are excluded. `smoke:source` applies all 106 contracts twice to a fresh checkout and rejects Agent-loop patches.
+
+## Compatibility removal conditions
+
+Every anchor is named and explains its purpose. A changed commit or anchor stops preparation before any source write. Preserve the matching tests when upstream provides an equivalent seam, then remove the contract family and its copied helper together.
+
+| Contract family | Remove when the pinned upstream provides | Verification |
+| --- | --- | --- |
+| Dedicated RPC ownership | Explicit consumer-owned channel lifetime under Cordis 4 | RPC owner unload regression; authenticated Host/plugin smoke |
+| Work/Chat creation, cold list/history/search and uploads | Cwd-free Chat preset authorization, persisted preset classification and mode-filtered search | Native Host create/prompt/restart/page/search and workspace rejection; attachment fixtures |
+| Delivery preparation and source aliases | Hook to normalize generated files before native presentation | Delivery containment and producer-contract fixtures |
+| Branding/locales, hero layout and stats slot | Product identity/locales/layout hooks | Native renderer smoke; visual acceptance remains manual |
+| Protection tones | Structured warning tone for stale/unread filesystem guards | Native ToolRow 11-case regression |
+| Desktop port/network readiness/web fetch | Product-owned launch/network policy seam | Native Host auth/shutdown and PAC/local-access fixtures |
+| Update channel/version policy | Product-selected feed channel and release identity | Native updater tests and real HTTP Range reconstruction |
+| External client bundling | Supported native module-table builder for external manifests | Native adapter/model/subscriptions builds |
+| Native DeepViewer composition | Application-owned native-module composition and diagnostic disable hook | Host inventory/RPC/recovery, source contracts and staged manifest fixtures |
+
+No contract changes the Agent loop. Native slots and services own sidebar state; DeepViewer owns only the added editor state and product mode selection. Editor saves reject stale content and retain typing made while a save is in flight. Git stage/unstage accepts one selected changed file and only discovered repositories inside the Session workspace.
+
+## Data and recovery
+
+Stable DeepViewer and DeepViewer Dev keep their existing independent roots. Explicit `DEEPVIEWER_DEV_USER_DATA` creates an isolated test profile. Scoder, Saidex and official DSH are not migration sources. Before the new kernel opens durable stores, DeepViewer snapshots its own home into private `migration-backups/kernel-v020` with SHA-256 verification; node_modules, locks and caches are excluded. Incomplete copies are never declared complete. `restoreKernelSnapshot(home, destination)` restores to a new separate home and refuses existing destinations, preserving newer sessions.
+
+Profile conversion backs up metadata before removing retired bundles. The native-module checkpoint uses private `migration-backups/builtins-v1` metadata and keeps its previous migration journal. It removes the three modules' old dependency and bundle declarations, prunes their root lockfile entries and removes only unchanged application-owned links. Provider configuration and prior explicit disable selections become native row overrides. Completion follows successful writes; retry reads the backed-up selection. `rollbackDesktopProfile` restores the previous metadata/journal and owned links without touching accounts or sessions.
+
+Official recovery disables external plugins while DeepViewer's native modules remain available. `DEEPVIEWER_DISABLE_BUILTINS=1` temporarily starts pure native core and wins over explicit enable overrides. Existing subscriptions/model disable flags remain supported; those individual switches persist row disable overrides. Re-enable by removing the diagnostic flag and the relevant `disabled: true` override in the desktop profile, rather than through Plugins. Frontend migration reads only recorded localhost origins from DeepViewer's own logs, backs up allowlisted drafts/view state and imports missing values into `dsh-app://app/`. It does not import browser credentials or overwrite new-origin drafts.
+
+## Distribution and update qualification
+
+The local update harness verifies consecutive/skipped releases, differential byte ranges, missing cache/no-Range/corrupt-blockmap fallback, SHA-512 rejection and HTTP failures. It does not invoke installation. Native task/Host shutdown coordination is retained. No signed application modules are overwritten in place.
+
+`package-native.mjs --release` requires explicit signing identity/team/keychain notary profile, signs the native runtime, seals its inventory, checks the actual ASAR and notarizes the app and DMG. It builds ZIP/blockmap as the update transport and DMG for installation/recovery; it never publishes. Signed installation, data preservation and relaunch must still be qualified on real macOS installations before publication.
+
+The signed output directory's `qualification.json` must bind the feed channel/version and ZIP SHA-512, with schemaVersion 1 and all scenarios true: `consecutive`, `skipped`, `fullDownload`, `differentialFallback`, `busyTaskDeferral`, `signedInstall`, `userDataPreserved`, `relaunch`. This is a release evidence record, not a substitute for running those scenarios. `publish-native-update.mjs --publish` rejects missing/stale qualification, verifies the ZIP's actual signed product/version, requires an intentionally provisioned channel Release, uploads immutable ZIP/blockmaps without replacement, and uploads the mutable feed last.
+
+Stable uses `updates-stable/latest-mac.yml`; preview uses `updates-preview/preview-mac.yml`, with independent updater caches. Public releases increment semver; internal Build changes alone are not public update versions. This milestone has not published those endpoints.
diff --git a/apps/deepviewer-adapter/UPSTREAM-LICENSE b/apps/deepviewer-adapter/UPSTREAM-LICENSE
new file mode 100644
index 0000000..c1f7a78
--- /dev/null
+++ b/apps/deepviewer-adapter/UPSTREAM-LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 DeepSeek
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/apps/deepviewer-adapter/assets/deepviewer-loading-logo.svg b/apps/deepviewer-adapter/assets/deepviewer-loading-logo.svg
new file mode 100644
index 0000000..67c8e83
--- /dev/null
+++ b/apps/deepviewer-adapter/assets/deepviewer-loading-logo.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/apps/deepviewer-adapter/assets/fonts/NOTICE.txt b/apps/deepviewer-adapter/assets/fonts/NOTICE.txt
new file mode 100644
index 0000000..12064d0
--- /dev/null
+++ b/apps/deepviewer-adapter/assets/fonts/NOTICE.txt
@@ -0,0 +1,4 @@
+Smiley Sans (得意黑) 2.0.1 — atelierAnchor
+https://github.com/atelier-anchor/smiley-sans
+Unmodified release asset: SmileySans-Oblique.ttf.woff2 (stored as SmileySans-Oblique.woff2).
+License: SIL Open Font License 1.1; see OFL-SmileySans.txt in this directory.
diff --git a/apps/deepviewer-adapter/assets/fonts/OFL-SmileySans.txt b/apps/deepviewer-adapter/assets/fonts/OFL-SmileySans.txt
new file mode 100644
index 0000000..d451163
--- /dev/null
+++ b/apps/deepviewer-adapter/assets/fonts/OFL-SmileySans.txt
@@ -0,0 +1,93 @@
+Copyright (c) 2022--2024, atelierAnchor ,
+with Reserved Font Name and <得意黑>.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/apps/deepviewer-adapter/assets/fonts/SmileySans-Oblique.woff2 b/apps/deepviewer-adapter/assets/fonts/SmileySans-Oblique.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..0da5a7f1ba45b1f494a822bba85a41bbc676e578
GIT binary patch
literal 1150924
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