web.cordis.yml 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. # `dsh web` — the browser surface, as a patch list over `base.cordis.yml`.
  2. # The launcher includes the base and applies this file, then any `--config`
  3. # overlay, then AppCLIEntry's profile-json and CLI-flag patches, as sibling patch
  4. # lists at ONE include level: patches never cross an include boundary, so
  5. # stacking overlays as nested includes would silently stop reaching base rows.
  6. #
  7. # A patch replaces the targeted row's whole `config`, so each row below restates
  8. # every key it owns. `--dev` appends the dsh-client-hmr row in code
  9. # (AppCLIEntry).
  10. # ── surface-specific values the base deliberately omits ─────────────────────
  11. # TODO: Re-enable shared HMR for Web after its reload lifecycle is tested.
  12. - id: hmr
  13. disabled: true
  14. # Web content search runs on an ephemeral in-memory index. The service
  15. # activates at boot, while first-search defers the node:sqlite import and
  16. # in-memory handle so Node 22 startup stays quiet until content search
  17. # actually uses SQLite. That search then reconciles this boot's sources.
  18. - id: session-query-sqlite
  19. config:
  20. path: ':memory:'
  21. openAt: first-search
  22. - id: tools
  23. config:
  24. # TEMPORARY workaround: DSH_TOOLS_MODE (native|code|both) opts a whole dsh
  25. # process into Code Mode while per-session tool-mode selection is being
  26. # designed; unset keeps the schema default (native). Remove the env seam
  27. # once the web UI owns the choice per session.
  28. mode: !!js process.env.DSH_TOOLS_MODE
  29. - id: llm-deepseek
  30. config:
  31. apiKey: !!js process.env.DEEPSEEK_API_KEY
  32. baseURL: !!js process.env.DEEPSEEK_BASE_URL
  33. # The web surface replaces the unrestricted local executors with the shared
  34. # sandbox policy. Its default preserves the previous unrestricted behavior;
  35. # DSH_PERMISSION_MODE and the browser permission picker can confine a session.
  36. - insert:
  37. - id: sandbox
  38. name: '@deepseek-ai/dsh-sandbox-local'
  39. - id: sandbox-policy
  40. name: '@deepseek-ai/dsh-sandbox-policy'
  41. config:
  42. mode: !!js process.env.DSH_PERMISSION_MODE ?? 'danger-full-access'
  43. workspaceRoot: !!js process.cwd()
  44. - id: bash-sandbox
  45. name: '@deepseek-ai/dsh-bash-sandbox'
  46. - id: approval
  47. name: '@deepseek-ai/dsh-user-approval'
  48. config:
  49. policy: !!js "(process.env.DSH_PERMISSION_MODE ?? 'danger-full-access') === 'danger-full-access' ? 'never' : 'ask'"
  50. - id: permission
  51. name: '@deepseek-ai/dsh-permission'
  52. config:
  53. presets:
  54. read-only:
  55. sandbox: read-only
  56. approval: ask
  57. workspace-write:
  58. sandbox: workspace-write
  59. approval: ask
  60. danger-full-access:
  61. sandbox: danger-full-access
  62. approval: never
  63. - id: fs-sandbox
  64. name: '@deepseek-ai/dsh-fs-sandbox'
  65. - id: bash-local
  66. disabled: true
  67. - id: fs-local
  68. disabled: true
  69. # The Web/headless product enables only the stable web_search model surface.
  70. # DeepSeek search resolves the same DEEPSEEK_API_KEY credential the Models page
  71. # manages for chat, at each search; its Messages endpoint is separate from the
  72. # chat-completions endpoint. Fetch remains disabled and no default fetch
  73. # provider is mounted.
  74. - insert:
  75. - id: web
  76. name: '@deepseek-ai/dsh-web'
  77. config:
  78. searchProvider: deepseek-official
  79. - id: web-search-deepseek
  80. name: '@deepseek-ai/dsh-web-search-deepseek'
  81. config:
  82. apiKeyEnv: DEEPSEEK_API_KEY
  83. baseURL: !!js process.env.DEEPSEEK_SEARCH_BASE_URL
  84. - id: tool-web
  85. name: '@deepseek-ai/dsh-tool-web'
  86. config:
  87. fetch: false
  88. # ── web-only host rows, the transport layer, and the browser roster ─────────
  89. # `dshClient` rows are the browser roster the modules node half scans into
  90. # window.__DSH_BOOT__; the modules row is simultaneously a host row.
  91. - insert:
  92. - id: session-projection
  93. name: '@deepseek-ai/dsh-session-projection'
  94. - id: code-runtime
  95. name: '@deepseek-ai/dsh-code-runtime-worker'
  96. - id: storage
  97. name: '@deepseek-ai/dsh-storage'
  98. - id: storage-json
  99. name: '@deepseek-ai/dsh-storage-json'
  100. config:
  101. root: !!js >-
  102. (() => { const path = process.getBuiltinModule('node:path'); const home = process.getBuiltinModule('node:os').homedir(); const configured = process.env.DSH_HOME; const selected = configured !== undefined && configured.trim().length > 0 ? configured : path.join(home, '.dsh'); const expanded = selected === '~' ? home : selected.startsWith('~/') || selected.startsWith('~\\') ? path.join(home, selected.slice(2)) : selected; return path.join(path.resolve(expanded), 'storages') })()
  103. - id: storage-domain
  104. name: '@deepseek-ai/dsh-storage-domain'
  105. config:
  106. backend: json
  107. - id: workspace
  108. name: '@deepseek-ai/dsh-workspace'
  109. - id: session-projection-cache
  110. name: '@deepseek-ai/dsh-session-projection-cache'
  111. config:
  112. writeEveryEvents: 200
  113. writeIntervalMs: 5000
  114. - id: tool-todo
  115. name: '@deepseek-ai/dsh-tool-todo'
  116. # Resolve bind host, SSH launch, and display once at boot, then mount the
  117. # matching dual-face directory picker. Mount -native or -browse directly in
  118. # an overlay to pin the interaction.
  119. - id: directory-picker
  120. name: '@deepseek-ai/dsh-host-directory-picker-auto'
  121. # The API gateway: the transport-agnostic dispatch face every client shape
  122. # shares. provider/model are the host default routing — the profile json's
  123. # mapping target (user config overrides these engineering defaults).
  124. - id: api-gateway
  125. name: '@deepseek-ai/dsh-host-apiproxy'
  126. config:
  127. provider: deepseek-official
  128. model: deepseek-v4-flash
  129. # ── layer 2: transport/service ──────────────────────────────────────────────
  130. # Plain route-registration carrier. distIndex is an assembly fact, not user
  131. # config — AppCLIEntry resolves the frontend dist and patches it in; host and
  132. # port arrive as CLI-flag patches over these defaults.
  133. - id: webserver
  134. name: '@deepseek-ai/dsh-host-webserver'
  135. config:
  136. host: 127.0.0.1
  137. port: 3080
  138. # ── browser plugin roster (dshClient rows; node halves are layer-2 hosts) ──
  139. # Dual-face: node half scans this very tree for dshClient rows, composes
  140. # window.__DSH_BOOT__, serves /plugins/<id>/client.js; browser half is the
  141. # module table the shell kernel constructs before cordis exists (§4.7 —
  142. # adopted as a plugin entry by the kernel, never fetched).
  143. - id: modules
  144. name: '@deepseek-ai/dsh-client-modules'
  145. # Owns both ends of the web transport: node half binds the gateway to the
  146. # webserver under /api; browser half is the fetch/SSE client.
  147. - id: connection
  148. name: '@deepseek-ai/dsh-client-connection'
  149. - id: client-runtime
  150. name: '@deepseek-ai/dsh-client-runtime'
  151. - id: ui-theme
  152. name: '@deepseek-ai/dsh-client-ui-theme'
  153. - id: locale
  154. name: '@deepseek-ai/dsh-client-locale'
  155. - id: ui-layout
  156. name: '@deepseek-ai/dsh-client-ui-layout'
  157. - id: ui-sidebar
  158. name: '@deepseek-ai/dsh-client-ui-sidebar'
  159. - id: ui-settings
  160. name: '@deepseek-ai/dsh-client-ui-settings'
  161. - id: ui-settings-general
  162. name: '@deepseek-ai/dsh-client-ui-settings-general'
  163. - id: ui-models
  164. name: '@deepseek-ai/dsh-client-ui-models'
  165. - id: ui-conversation
  166. name: '@deepseek-ai/dsh-client-ui-conversation'
  167. - id: ui-workspace
  168. name: '@deepseek-ai/dsh-client-ui-workspace'
  169. # Input triggers: the '/' | '@' pipeline (ui-slash), the command surface over
  170. # it (ui-command), and the two reference sources (ui-skill / ui-subagent).
  171. - id: ui-slash
  172. name: '@deepseek-ai/dsh-client-ui-slash'
  173. - id: ui-command
  174. name: '@deepseek-ai/dsh-client-ui-command'
  175. - id: ui-skill
  176. name: '@deepseek-ai/dsh-client-ui-skill'
  177. - id: ui-subagent
  178. name: '@deepseek-ai/dsh-client-ui-subagent'
  179. # Goal surface: GoalBar in the input dock over the goal session projection.
  180. - id: ui-goal
  181. name: '@deepseek-ai/dsh-client-ui-goal'
  182. # Model selection: the /model popupSelect + composer seat over session.models.
  183. - id: ui-model
  184. name: '@deepseek-ai/dsh-client-ui-model'
  185. - id: ui-permission
  186. name: '@deepseek-ai/dsh-client-ui-permission'
  187. # Plan control: the composer plan seat over the plan projection + /plan channel.
  188. - id: ui-plan
  189. name: '@deepseek-ai/dsh-client-ui-plan'
  190. - id: ui-question
  191. name: '@deepseek-ai/dsh-client-ui-question'
  192. - id: ui-trajectory
  193. name: '@deepseek-ai/dsh-client-ui-trajectory'