dsh-plugin-dev-kb 1.8.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/CHANGELOG.md +186 -178
  2. package/README.en.md +172 -172
  3. package/README.md +183 -183
  4. package/kb/INDEX.md +236 -234
  5. package/kb/README.md +88 -88
  6. package/kb/extra/AGENTS.md +77 -77
  7. package/kb/extra/deepseek-llm-api-wire-extensions.md +162 -162
  8. package/kb/extra/deepseek-llm-api-wire-extensions.zh.md +162 -162
  9. package/kb/extra/defensive-patterns/package-surface.md +233 -232
  10. package/kb/extra/defensive-patterns/package-surface.zh.md +233 -232
  11. package/kb/extra/defensive-patterns/remote-and-api.md +117 -117
  12. package/kb/extra/defensive-patterns/remote-and-api.zh.md +117 -117
  13. package/kb/extra/development.md +221 -221
  14. package/kb/extra/development.zh.md +228 -228
  15. package/kb/extra/event-producer-consumer.md +133 -123
  16. package/kb/extra/event-producer-consumer.zh.md +135 -125
  17. package/kb/extra/module-graph.md +1961 -1888
  18. package/kb/extra/module-graph.zh.md +1963 -1890
  19. package/kb/extra/persistence-changes/2026-11-05-timeline-priority-notice.md +60 -0
  20. package/kb/extra/persistence-changes/2026-11-05-timeline-priority-notice.zh.md +60 -0
  21. package/kb/extra/persistence-changes/README.md +92 -92
  22. package/kb/extra/persistence-changes/README.zh.md +92 -92
  23. package/kb/extra/persistence-changes/historical-formats/README.md +75 -75
  24. package/kb/extra/persistence-changes/historical-formats/README.zh.md +75 -75
  25. package/kb/extra/persistence-changes/releases/README.md +103 -103
  26. package/kb/extra/persistence-changes/releases/README.zh.md +103 -103
  27. package/kb/extra/rescope.md +55 -55
  28. package/kb/extra/rescope.zh.md +55 -55
  29. package/kb/extra/subsystems/boot.md +631 -621
  30. package/kb/extra/subsystems/boot.zh.md +631 -621
  31. package/kb/extra/subsystems/computer-use.md +179 -137
  32. package/kb/extra/subsystems/computer-use.zh.md +179 -137
  33. package/kb/extra/subsystems/extensions.md +387 -384
  34. package/kb/extra/subsystems/extensions.zh.md +387 -384
  35. package/kb/extra/subsystems/feedback.md +418 -400
  36. package/kb/extra/subsystems/feedback.zh.md +418 -400
  37. package/kb/extra/subsystems/forge.md +2169 -1226
  38. package/kb/extra/subsystems/forge.zh.md +2171 -1226
  39. package/kb/extra/subsystems/liveshare.md +167 -158
  40. package/kb/extra/subsystems/liveshare.zh.md +167 -158
  41. package/kb/extra/subsystems/mcp.md +237 -234
  42. package/kb/extra/subsystems/mcp.zh.md +237 -234
  43. package/kb/extra/subsystems/office-kit.md +122 -0
  44. package/kb/extra/subsystems/office-kit.zh.md +122 -0
  45. package/kb/extra/subsystems/working-directory.md +95 -64
  46. package/kb/extra/subsystems/working-directory.zh.md +95 -64
  47. package/kb/extra/subsystems/worktrees.md +187 -127
  48. package/kb/extra/subsystems/worktrees.zh.md +187 -127
  49. package/kb/extra/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.md +21 -21
  50. package/kb/extra/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.zh.md +21 -21
  51. package/kb/extra/upgrade-guide/v0.2.1-rc.4/sandbox-unsupported-policy-error/guide.md +18 -0
  52. package/kb/extra/upgrade-guide/v0.2.1-rc.4/sandbox-unsupported-policy-error/guide.zh.md +18 -0
  53. package/kb/extra/upgrade-guide/v0.2.2-alpha.2/llm-error-builtin-codes/guide.md +18 -0
  54. package/kb/extra/upgrade-guide/v0.2.2-alpha.2/llm-error-builtin-codes/guide.zh.md +18 -0
  55. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.md +34 -0
  56. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-kit-package/guide.zh.md +34 -0
  57. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.md +49 -0
  58. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-operation-tools/guide.zh.md +49 -0
  59. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-skill-resources/guide.md +36 -0
  60. package/kb/extra/upgrade-guide/v0.2.2-alpha.3/office-skill-resources/guide.zh.md +36 -0
  61. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-notification-fields/guide.md +26 -0
  62. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-notification-fields/guide.zh.md +26 -0
  63. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-remote-provider/guide.md +22 -0
  64. package/kb/extra/upgrade-guide/v0.2.2-rc.1/account-remote-provider/guide.zh.md +22 -0
  65. package/kb/extra/upgrade-guide/v0.2.2-rc.1/archive-worktrees/guide.md +21 -0
  66. package/kb/extra/upgrade-guide/v0.2.2-rc.1/archive-worktrees/guide.zh.md +21 -0
  67. package/kb/extra/upgrade-guide/v0.2.2-rc.1/attachment-error-codes/guide.md +23 -0
  68. package/kb/extra/upgrade-guide/v0.2.2-rc.1/attachment-error-codes/guide.zh.md +23 -0
  69. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-ax-read-limits/guide.md +20 -0
  70. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-ax-read-limits/guide.zh.md +20 -0
  71. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-hover-ax-only/guide.md +18 -0
  72. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-hover-ax-only/guide.zh.md +18 -0
  73. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-native-platform/guide.md +23 -0
  74. package/kb/extra/upgrade-guide/v0.2.2-rc.1/cua-native-platform/guide.zh.md +23 -0
  75. package/kb/extra/upgrade-guide/v0.2.2-rc.1/dsh-doc-skill/guide.md +35 -0
  76. package/kb/extra/upgrade-guide/v0.2.2-rc.1/dsh-doc-skill/guide.zh.md +35 -0
  77. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-change-request-overview/guide.md +26 -0
  78. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-change-request-overview/guide.zh.md +26 -0
  79. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-pinned-diff/guide.md +26 -0
  80. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-pinned-diff/guide.zh.md +26 -0
  81. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-review-reads/guide.md +19 -0
  82. package/kb/extra/upgrade-guide/v0.2.2-rc.1/forge-review-reads/guide.zh.md +19 -0
  83. package/kb/extra/upgrade-guide/v0.2.2-rc.1/package-export-cleanup/guide.md +26 -0
  84. package/kb/extra/upgrade-guide/v0.2.2-rc.1/package-export-cleanup/guide.zh.md +26 -0
  85. package/kb/extra/upgrade-guide/v0.2.2-rc.1/plugin-update-method/guide.md +22 -0
  86. package/kb/extra/upgrade-guide/v0.2.2-rc.1/plugin-update-method/guide.zh.md +22 -0
  87. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-bootstrap-protocol/guide.md +25 -0
  88. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-bootstrap-protocol/guide.zh.md +25 -0
  89. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-inspect-output/guide.md +48 -0
  90. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-inspect-output/guide.zh.md +48 -0
  91. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-scoped-repl-default/guide.md +45 -0
  92. package/kb/extra/upgrade-guide/v0.2.2-rc.1/ptc-scoped-repl-default/guide.zh.md +45 -0
  93. package/kb/extra/upgrade-guide/v0.2.2-rc.1/runtime-context-reminders/guide.md +19 -0
  94. package/kb/extra/upgrade-guide/v0.2.2-rc.1/runtime-context-reminders/guide.zh.md +19 -0
  95. package/kb/extra/upgrade-guide/v0.2.2-rc.1/session-append-overloads/guide.md +17 -0
  96. package/kb/extra/upgrade-guide/v0.2.2-rc.1/session-append-overloads/guide.zh.md +17 -0
  97. package/kb/extra/upgrade-guide/v0.2.2-rc.1/subagent-interrupt-default/guide.md +27 -0
  98. package/kb/extra/upgrade-guide/v0.2.2-rc.1/subagent-interrupt-default/guide.zh.md +27 -0
  99. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-backend-cleanup-error/guide.md +20 -0
  100. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-backend-cleanup-error/guide.zh.md +20 -0
  101. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-bundle-sidebar-backend/guide.md +19 -0
  102. package/kb/extra/upgrade-guide/v0.2.2-rc.1/terminal-bundle-sidebar-backend/guide.zh.md +19 -0
  103. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-fetch-transport-error-codes/guide.md +18 -0
  104. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-fetch-transport-error-codes/guide.zh.md +18 -0
  105. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-search-billing/guide.md +41 -0
  106. package/kb/extra/upgrade-guide/v0.2.2-rc.1/web-search-billing/guide.zh.md +41 -0
  107. package/kb/extra/upgrade-guide/v0.2.2-rc.1/window-drag-regions/guide.md +21 -0
  108. package/kb/extra/upgrade-guide/v0.2.2-rc.1/window-drag-regions/guide.zh.md +21 -0
  109. package/kb/extra/upgrade-guide/v0.2.2-rc.2/client-module-metadata/guide.md +29 -0
  110. package/kb/extra/upgrade-guide/v0.2.2-rc.2/client-module-metadata/guide.zh.md +29 -0
  111. package/kb/extra/upgrade-guide/v0.2.2-rc.2/connection-page-peer/guide.md +25 -0
  112. package/kb/extra/upgrade-guide/v0.2.2-rc.2/connection-page-peer/guide.zh.md +25 -0
  113. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cordis-root-and-intercept-metadata/guide.md +31 -0
  114. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cordis-root-and-intercept-metadata/guide.zh.md +31 -0
  115. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-agents-without-preset/guide.md +24 -0
  116. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-agents-without-preset/guide.zh.md +24 -0
  117. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-macos-provider/guide.md +24 -0
  118. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-macos-provider/guide.zh.md +24 -0
  119. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-partial-observations/guide.md +19 -0
  120. package/kb/extra/upgrade-guide/v0.2.2-rc.2/cua-partial-observations/guide.zh.md +19 -0
  121. package/kb/extra/upgrade-guide/v0.2.2-rc.2/deepseek-files-timeout/guide.md +15 -0
  122. package/kb/extra/upgrade-guide/v0.2.2-rc.2/deepseek-files-timeout/guide.zh.md +15 -0
  123. package/kb/extra/upgrade-guide/v0.2.2-rc.2/experimental-tool-error-codes/guide.md +28 -0
  124. package/kb/extra/upgrade-guide/v0.2.2-rc.2/experimental-tool-error-codes/guide.zh.md +28 -0
  125. package/kb/extra/upgrade-guide/v0.2.2-rc.2/package-export-cleanup/guide.md +36 -0
  126. package/kb/extra/upgrade-guide/v0.2.2-rc.2/package-export-cleanup/guide.zh.md +36 -0
  127. package/kb/extra/upgrade-guide/v0.2.2-rc.2/python-ptc-removal/guide.md +22 -0
  128. package/kb/extra/upgrade-guide/v0.2.2-rc.2/python-ptc-removal/guide.zh.md +22 -0
  129. package/kb/extra/upgrade-guide/v0.2.2-rc.2/session-status-package/guide.md +31 -0
  130. package/kb/extra/upgrade-guide/v0.2.2-rc.2/session-status-package/guide.zh.md +31 -0
  131. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shared-search-filter/guide.md +18 -0
  132. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shared-search-filter/guide.zh.md +18 -0
  133. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shell-fs-tool-error-codes/guide.md +30 -0
  134. package/kb/extra/upgrade-guide/v0.2.2-rc.2/shell-fs-tool-error-codes/guide.zh.md +30 -0
  135. package/kb/extra/web-styling.md +57 -57
  136. package/kb/extra/web-styling.zh.md +57 -57
  137. package/kb/meta/search-index.json +4508 -3980
  138. package/kb/meta/source.json +18 -18
  139. package/kb/site/develop/practice/llm-adapter.md +192 -192
  140. package/kb/site/en/develop/practice/llm-adapter.md +192 -192
  141. package/kb/site/en/guide/desktop-uninstall-cleanup.md +63 -0
  142. package/kb/site/en/guide/plugin-market.md +153 -151
  143. package/kb/site/en/guide/providers.md +234 -234
  144. package/kb/site/en/guide/quickstart.md +35 -34
  145. package/kb/site/en/reference/capability-seams.md +789 -767
  146. package/kb/site/en/reference/config-catalog.md +5432 -5128
  147. package/kb/site/en/reference/cookbook/adding-a-package.md +175 -175
  148. package/kb/site/en/reference/cookbook/adding-a-tool.md +105 -104
  149. package/kb/site/en/reference/cookbook/extension-cookbook.md +178 -135
  150. package/kb/site/en/reference/cordis-api/context.md +373 -369
  151. package/kb/site/en/reference/cordis-api/fiber.md +457 -433
  152. package/kb/site/en/reference/cordis-api/inherited.md +44 -44
  153. package/kb/site/en/reference/cordis-api/service.md +118 -107
  154. package/kb/site/en/reference/experimental-persistence-catalog.md +36 -23
  155. package/kb/site/en/reference/index.md +174 -174
  156. package/kb/site/en/reference/persistence-catalog.md +9453 -9432
  157. package/kb/site/en/reference/subsystems/compaction.md +288 -288
  158. package/kb/site/en/reference/subsystems/core.md +1172 -1171
  159. package/kb/site/en/reference/subsystems/credentials.md +526 -497
  160. package/kb/site/en/reference/subsystems/filesystem.md +708 -708
  161. package/kb/site/en/reference/subsystems/index.md +82 -82
  162. package/kb/site/en/reference/subsystems/llm-streaming.md +1290 -1288
  163. package/kb/site/en/reference/subsystems/lsp.md +230 -206
  164. package/kb/site/en/reference/subsystems/persistence.md +451 -432
  165. package/kb/site/en/reference/subsystems/plan.md +91 -91
  166. package/kb/site/en/reference/subsystems/ptc-runtime.md +295 -261
  167. package/kb/site/en/reference/subsystems/sandbox.md +250 -232
  168. package/kb/site/en/reference/subsystems/session-query.md +525 -515
  169. package/kb/site/en/reference/subsystems/session-reference.md +231 -229
  170. package/kb/site/en/reference/subsystems/session.md +1478 -1431
  171. package/kb/site/en/reference/subsystems/sidebar-right.md +165 -165
  172. package/kb/site/en/reference/subsystems/skills.md +356 -356
  173. package/kb/site/en/reference/subsystems/slots.md +235 -231
  174. package/kb/site/en/reference/subsystems/terminal.md +188 -188
  175. package/kb/site/en/reference/subsystems/tools.md +902 -891
  176. package/kb/site/en/reference/subsystems/user-questions.md +330 -327
  177. package/kb/site/en/reference/subsystems/web-client.md +161 -104
  178. package/kb/site/en/reference/subsystems/web-server.md +434 -351
  179. package/kb/site/en/reference/subsystems/web.md +268 -268
  180. package/kb/site/en/reference/subsystems/workflow.md +287 -282
  181. package/kb/site/en/reference/subsystems/workspace.md +743 -651
  182. package/kb/site/en/reference/tool-catalog.md +2867 -2704
  183. package/kb/site/guide/desktop-uninstall-cleanup.md +63 -0
  184. package/kb/site/guide/plugin-market.md +153 -151
  185. package/kb/site/guide/providers.md +234 -234
  186. package/kb/site/guide/quickstart.md +35 -34
  187. package/kb/site/reference/capability-seams.md +789 -767
  188. package/kb/site/reference/config-catalog.md +5432 -5128
  189. package/kb/site/reference/cookbook/adding-a-package.md +175 -175
  190. package/kb/site/reference/cookbook/adding-a-tool.md +107 -106
  191. package/kb/site/reference/cookbook/extension-cookbook.md +182 -139
  192. package/kb/site/reference/cordis-api/context.md +373 -369
  193. package/kb/site/reference/cordis-api/fiber.md +459 -435
  194. package/kb/site/reference/cordis-api/inherited.md +44 -44
  195. package/kb/site/reference/cordis-api/service.md +118 -107
  196. package/kb/site/reference/experimental-persistence-catalog.md +36 -23
  197. package/kb/site/reference/index.md +178 -178
  198. package/kb/site/reference/persistence-catalog.md +9453 -9432
  199. package/kb/site/reference/subsystems/compaction.md +288 -288
  200. package/kb/site/reference/subsystems/core.md +1184 -1183
  201. package/kb/site/reference/subsystems/credentials.md +526 -497
  202. package/kb/site/reference/subsystems/filesystem.md +708 -708
  203. package/kb/site/reference/subsystems/index.md +82 -82
  204. package/kb/site/reference/subsystems/llm-streaming.md +1296 -1294
  205. package/kb/site/reference/subsystems/lsp.md +230 -206
  206. package/kb/site/reference/subsystems/persistence.md +451 -432
  207. package/kb/site/reference/subsystems/plan.md +91 -91
  208. package/kb/site/reference/subsystems/ptc-runtime.md +295 -261
  209. package/kb/site/reference/subsystems/sandbox.md +250 -232
  210. package/kb/site/reference/subsystems/session-query.md +525 -515
  211. package/kb/site/reference/subsystems/session-reference.md +231 -229
  212. package/kb/site/reference/subsystems/session.md +1482 -1435
  213. package/kb/site/reference/subsystems/sidebar-right.md +165 -165
  214. package/kb/site/reference/subsystems/skills.md +356 -356
  215. package/kb/site/reference/subsystems/slots.md +239 -235
  216. package/kb/site/reference/subsystems/terminal.md +188 -188
  217. package/kb/site/reference/subsystems/tools.md +902 -891
  218. package/kb/site/reference/subsystems/user-questions.md +330 -327
  219. package/kb/site/reference/subsystems/web-client.md +161 -104
  220. package/kb/site/reference/subsystems/web-server.md +434 -351
  221. package/kb/site/reference/subsystems/web.md +268 -268
  222. package/kb/site/reference/subsystems/workflow.md +287 -282
  223. package/kb/site/reference/subsystems/workspace.md +743 -651
  224. package/kb/site/reference/tool-catalog.md +2872 -2709
  225. package/lib/index.js +359 -359
  226. package/package.json +68 -68
  227. package/skills/dsh-plugin-dev-kb.md +71 -70
  228. package/kb/extra/subsystems/office-to-pdf.md +0 -87
  229. package/kb/extra/subsystems/office-to-pdf.zh.md +0 -87
@@ -1,192 +1,192 @@
1
- ---
2
- editSource: "docs/user/develop/practice/llm-adapter.md"
3
- rawMarkdownPath: "en/develop/practice/llm-adapter.md"
4
- ---
5
-
6
- # LLM adapters
7
-
8
- This guide connects a new LLM provider to Harness.
9
-
10
- ## Overview
11
-
12
- An LLM adapter extends `LlmAdapter` and implements `stream()`, translating Harness's provider-neutral request into a provider API call and translating the response back into Harness chunks.
13
-
14
- ## Minimal implementation
15
-
16
- ```ts
17
- import type { Context } from '@deepseek-ai/cordis'
18
- import Schema from '@deepseek-ai/schemastery'
19
- import { LlmAdapter, type GenerateOptions, type StreamChunk } from '@deepseek-ai/dsh-llm'
20
-
21
- class MyAdapter extends LlmAdapter {
22
- private apiKey: string
23
-
24
- constructor(apiKey: string) {
25
- super()
26
- this.apiKey = apiKey
27
- }
28
-
29
- async *stream(options: GenerateOptions): AsyncIterable<StreamChunk> {
30
- // 1. Convert options.messages to the provider format.
31
- // 2. Call the streaming API.
32
- // 3. Convert the response into StreamChunk values.
33
- }
34
- }
35
-
36
- export interface Config {
37
- apiKey: string
38
- providers: string[]
39
- }
40
-
41
- export const Config: Schema<Config> = Schema.object({
42
- apiKey: Schema.string().required(),
43
- providers: Schema.array(Schema.string()).required(),
44
- })
45
-
46
- export const name = 'my-llm-adapter'
47
- export const inject = ['llm']
48
-
49
- export function apply(ctx: Context, config: Config) {
50
- const adapter = new MyAdapter(config.apiKey)
51
- ctx.llm.registerAdapter(config.providers, adapter)
52
- }
53
- ```
54
-
55
- ## StreamChunk protocol
56
-
57
- `stream()` yields chunks using this protocol:
58
-
59
- ```ts
60
- import { brandString } from '@deepseek-ai/dsh-brand'
61
- import type { StreamChunk, ToolCallId } from '@deepseek-ai/dsh-llm'
62
-
63
- async function* exampleChunks(): AsyncIterable<StreamChunk> {
64
- // 1. Start each content block with block-start.
65
- yield { type: 'block-start', index: 0, blockType: 'text' }
66
-
67
- // 2. Stream text through text-delta.
68
- yield { type: 'text-delta', index: 0, text: 'Hello' }
69
- yield { type: 'text-delta', index: 0, text: ' world' }
70
-
71
- // 3. End each content block with block-end and the complete block.
72
- yield {
73
- type: 'block-end',
74
- index: 0,
75
- block: { type: 'text', text: 'Hello world' },
76
- }
77
-
78
- // 4. Tool-call block.
79
- yield { type: 'block-start', index: 1, blockType: 'tool-call' }
80
- yield {
81
- type: 'tool-call-delta',
82
- index: 1,
83
- id: brandString<ToolCallId>('call-123'),
84
- name: 'bash',
85
- argumentsDelta: '{"command":"ls"}',
86
- }
87
- yield {
88
- type: 'block-end',
89
- index: 1,
90
- block: {
91
- type: 'tool-call',
92
- id: brandString<ToolCallId>('call-123'),
93
- name: 'bash',
94
- arguments: '{"command":"ls"}',
95
- },
96
- }
97
-
98
- // 5. Token usage.
99
- yield { type: 'usage', usage: { inputTokens: 100, outputTokens: 50 } }
100
-
101
- // 6. Finish reason.
102
- yield { type: 'finish', reason: { kind: 'stop' } }
103
- // Alternatively, { kind: 'tool-calls' } requests tool execution.
104
- }
105
- ```
106
-
107
- ### Key rules
108
-
109
- - Every `block-start` has a matching `block-end`.
110
- - `index` increases from 0 and identifies content-block order.
111
- - A `tool-call-delta` carries raw JSON text in `argumentsDelta`, either all at once or over multiple chunks.
112
- - `finish` is the final chunk.
113
- - Emit `usage` before `finish`.
114
-
115
- ## GenerateOptions
116
-
117
- `stream()` receives the exported `GenerateOptions` type. It includes the model, adapter-owned reasoning-effort id, conversation history, system prompt, tool schemas, generation parameters, stop sequences, and abort signal; treat the TypeScript type exported by `@deepseek-ai/dsh-llm` as authoritative. Map supported fields to the provider API. If the provider cannot honor a field, throw `LlmError` with a stable code instead of silently dropping it.
118
-
119
- Override `resolveModel(provider, model, signal?)` to return exact provider/model identity plus optional `context` and `reasoning` metadata in one lookup. Reasoning metadata contains ordered opaque ids and display names plus an optional configured default; preserve the adapter's authoritative selectable list, including `off` when its upstream capability API returns it, instead of promoting those values into a core enum. Honor the optional signal for asynchronous lookup so cancellation and disposal reach quiescence. The service validates the aggregate and rejects unsupported explicit efforts before `stream()`; omitting `reasoning` means that model has no selectable reasoning-effort capability.
120
-
121
- ## Register an adapter
122
-
123
- ```ts ignore-check
124
- ctx.llm.registerAdapter(['my-provider'], adapter)
125
- ```
126
-
127
- The first argument lists provider routes handled by the adapter. `GenerateOptions.provider` selects the registered adapter, while `GenerateOptions.model` passes an adapter-owned model id without lifecycle registration. Override `listModels()` when the adapter can advertise model choices to selectors.
128
-
129
- ## Use it from cordis.yml
130
-
131
- ```yaml
132
- - id: my-llm
133
- name: './src/my-llm-adapter.ts'
134
- config:
135
- apiKey: !!js process.env.MY_API_KEY
136
- providers:
137
- - my-provider
138
-
139
- - id: agent-loop
140
- name: '@deepseek-ai/dsh-agent-loop'
141
- config:
142
- agents:
143
- - id: main
144
- provider: my-provider
145
- model: my-model-v1
146
- ```
147
-
148
- ## Reference implementations
149
-
150
- The repository contains complete implementations:
151
-
152
- - `packages/llm/llm-deepseek/` — DeepSeek adapter using the Messages API
153
- - `packages/llm/llm-pi-ai/` — Pi AI adapter using a different API format
154
-
155
- Compare the two shipped adapters to see the same harness contract implemented over different provider SDKs.
156
-
157
- ## Error handling
158
-
159
- Adapters throw transport and protocol failures as `LlmError` values with stable codes. The agent loop preserves the error and code for diagnostics and policy; it does not convert an ordinary `Error` automatically. Every provider HTTP request must also merge `attributionHeaders()` and forward `options.signal`.
160
-
161
- ```ts
162
- import {
163
- attributionHeaders,
164
- LlmAdapter,
165
- LlmError,
166
- type GenerateOptions,
167
- type StreamChunk,
168
- } from '@deepseek-ai/dsh-llm'
169
-
170
- class HttpAdapter extends LlmAdapter {
171
- constructor(private readonly endpoint: string) {
172
- super()
173
- }
174
-
175
- async *stream(options: GenerateOptions): AsyncIterable<StreamChunk> {
176
- const response = await fetch(this.endpoint, {
177
- method: 'POST',
178
- headers: {
179
- 'content-type': 'application/json',
180
- ...attributionHeaders(),
181
- },
182
- body: JSON.stringify({ model: options.model, messages: options.messages }),
183
- ...options.signal ? { signal: options.signal } : {},
184
- })
185
- if (!response.ok) {
186
- throw new LlmError(`Provider API error: ${response.status}`, 'PROVIDER_HTTP_ERROR')
187
- }
188
- // A real adapter parses the response and emits the complete chunk sequence.
189
- yield { type: 'finish', reason: { kind: 'stop' } }
190
- }
191
- }
192
- ```
1
+ ---
2
+ editSource: "docs/user/develop/practice/llm-adapter.md"
3
+ rawMarkdownPath: "en/develop/practice/llm-adapter.md"
4
+ ---
5
+
6
+ # LLM adapters
7
+
8
+ This guide connects a new LLM provider to Harness.
9
+
10
+ ## Overview
11
+
12
+ An LLM adapter extends `LlmAdapter` and implements `stream()`, translating Harness's provider-neutral request into a provider API call and translating the response back into Harness chunks.
13
+
14
+ ## Minimal implementation
15
+
16
+ ```ts
17
+ import type { Context } from '@deepseek-ai/cordis'
18
+ import Schema from '@deepseek-ai/schemastery'
19
+ import { LlmAdapter, type GenerateOptions, type StreamChunk } from '@deepseek-ai/dsh-llm'
20
+
21
+ class MyAdapter extends LlmAdapter {
22
+ private apiKey: string
23
+
24
+ constructor(apiKey: string) {
25
+ super()
26
+ this.apiKey = apiKey
27
+ }
28
+
29
+ async *stream(options: GenerateOptions): AsyncIterable<StreamChunk> {
30
+ // 1. Convert options.messages to the provider format.
31
+ // 2. Call the streaming API.
32
+ // 3. Convert the response into StreamChunk values.
33
+ }
34
+ }
35
+
36
+ export interface Config {
37
+ apiKey: string
38
+ providers: string[]
39
+ }
40
+
41
+ export const Config: Schema<Config> = Schema.object({
42
+ apiKey: Schema.string().required(),
43
+ providers: Schema.array(Schema.string()).required(),
44
+ })
45
+
46
+ export const name = 'my-llm-adapter'
47
+ export const inject = ['llm']
48
+
49
+ export function apply(ctx: Context, config: Config) {
50
+ const adapter = new MyAdapter(config.apiKey)
51
+ ctx.llm.registerAdapter(config.providers, adapter)
52
+ }
53
+ ```
54
+
55
+ ## StreamChunk protocol
56
+
57
+ `stream()` yields chunks using this protocol:
58
+
59
+ ```ts
60
+ import { brandString } from '@deepseek-ai/dsh-brand'
61
+ import type { StreamChunk, ToolCallId } from '@deepseek-ai/dsh-llm'
62
+
63
+ async function* exampleChunks(): AsyncIterable<StreamChunk> {
64
+ // 1. Start each content block with block-start.
65
+ yield { type: 'block-start', index: 0, blockType: 'text' }
66
+
67
+ // 2. Stream text through text-delta.
68
+ yield { type: 'text-delta', index: 0, text: 'Hello' }
69
+ yield { type: 'text-delta', index: 0, text: ' world' }
70
+
71
+ // 3. End each content block with block-end and the complete block.
72
+ yield {
73
+ type: 'block-end',
74
+ index: 0,
75
+ block: { type: 'text', text: 'Hello world' },
76
+ }
77
+
78
+ // 4. Tool-call block.
79
+ yield { type: 'block-start', index: 1, blockType: 'tool-call' }
80
+ yield {
81
+ type: 'tool-call-delta',
82
+ index: 1,
83
+ id: brandString<ToolCallId>('call-123'),
84
+ name: 'bash',
85
+ argumentsDelta: '{"command":"ls"}',
86
+ }
87
+ yield {
88
+ type: 'block-end',
89
+ index: 1,
90
+ block: {
91
+ type: 'tool-call',
92
+ id: brandString<ToolCallId>('call-123'),
93
+ name: 'bash',
94
+ arguments: '{"command":"ls"}',
95
+ },
96
+ }
97
+
98
+ // 5. Token usage.
99
+ yield { type: 'usage', usage: { inputTokens: 100, outputTokens: 50 } }
100
+
101
+ // 6. Finish reason.
102
+ yield { type: 'finish', reason: { kind: 'stop' } }
103
+ // Alternatively, { kind: 'tool-calls' } requests tool execution.
104
+ }
105
+ ```
106
+
107
+ ### Key rules
108
+
109
+ - Every `block-start` has a matching `block-end`.
110
+ - `index` increases from 0 and identifies content-block order.
111
+ - A `tool-call-delta` carries raw JSON text in `argumentsDelta`, either all at once or over multiple chunks.
112
+ - `finish` is the final chunk.
113
+ - Emit `usage` before `finish`.
114
+
115
+ ## GenerateOptions
116
+
117
+ `stream()` receives the exported `GenerateOptions` type. It includes the model, adapter-owned reasoning-effort id, conversation history, system prompt, tool schemas, generation parameters, stop sequences, and abort signal; treat the TypeScript type exported by `@deepseek-ai/dsh-llm` as authoritative. Map supported fields to the provider API. If the provider cannot honor a field, throw `LlmError` with a stable code instead of silently dropping it.
118
+
119
+ Override `resolveModel(provider, model, signal?)` to return exact provider/model identity plus optional `context` and `reasoning` metadata in one lookup. Reasoning metadata contains ordered opaque ids and display names plus an optional configured default; preserve the adapter's authoritative selectable list, including `off` when its upstream capability API returns it, instead of promoting those values into a core enum. Honor the optional signal for asynchronous lookup so cancellation and disposal reach quiescence. The service validates the aggregate and rejects unsupported explicit efforts before `stream()`; omitting `reasoning` means that model has no selectable reasoning-effort capability.
120
+
121
+ ## Register an adapter
122
+
123
+ ```ts ignore-check
124
+ ctx.llm.registerAdapter(['my-provider'], adapter)
125
+ ```
126
+
127
+ The first argument lists provider routes handled by the adapter. `GenerateOptions.provider` selects the registered adapter, while `GenerateOptions.model` passes an adapter-owned model id without lifecycle registration. Override `listModels()` when the adapter can advertise model choices to selectors.
128
+
129
+ ## Use it from cordis.yml
130
+
131
+ ```yaml
132
+ - id: my-llm
133
+ name: './src/my-llm-adapter.ts'
134
+ config:
135
+ apiKey: !!js process.env.MY_API_KEY
136
+ providers:
137
+ - my-provider
138
+
139
+ - id: agent-loop
140
+ name: '@deepseek-ai/dsh-agent-loop'
141
+ config:
142
+ agents:
143
+ - id: main
144
+ provider: my-provider
145
+ model: my-model-v1
146
+ ```
147
+
148
+ ## Reference implementations
149
+
150
+ The repository contains complete implementations:
151
+
152
+ - `packages/llm/llm-deepseek/` — DeepSeek adapter using the Messages API
153
+ - `packages/llm/llm-pi-ai/` — Pi AI adapter using a different API format
154
+
155
+ Compare the two shipped adapters to see the same harness contract implemented over different provider SDKs.
156
+
157
+ ## Error handling
158
+
159
+ Adapters throw transport and protocol failures as `LlmError` values with stable codes. `new LlmError` accepts only the built-in codes of `LLM_FAILURE_CODES`; an adapter's own code goes through `LlmError.fromFailure`. The agent loop preserves the error and code for diagnostics and policy; it does not convert an ordinary `Error` automatically. Every provider HTTP request must also merge `attributionHeaders()` and forward `options.signal`.
160
+
161
+ ```ts
162
+ import {
163
+ attributionHeaders,
164
+ LlmAdapter,
165
+ LlmError,
166
+ type GenerateOptions,
167
+ type StreamChunk,
168
+ } from '@deepseek-ai/dsh-llm'
169
+
170
+ class HttpAdapter extends LlmAdapter {
171
+ constructor(private readonly endpoint: string) {
172
+ super()
173
+ }
174
+
175
+ async *stream(options: GenerateOptions): AsyncIterable<StreamChunk> {
176
+ const response = await fetch(this.endpoint, {
177
+ method: 'POST',
178
+ headers: {
179
+ 'content-type': 'application/json',
180
+ ...attributionHeaders(),
181
+ },
182
+ body: JSON.stringify({ model: options.model, messages: options.messages }),
183
+ ...options.signal ? { signal: options.signal } : {},
184
+ })
185
+ if (!response.ok) {
186
+ throw LlmError.fromFailure({ message: `Provider API error: ${response.status}`, code: 'PROVIDER_HTTP_ERROR', status: response.status })
187
+ }
188
+ // A real adapter parses the response and emits the complete chunk sequence.
189
+ yield { type: 'finish', reason: { kind: 'stop' } }
190
+ }
191
+ }
192
+ ```
@@ -0,0 +1,63 @@
1
+ ---
2
+ editSource: "docs/user/guide/desktop-uninstall-cleanup.md"
3
+ rawMarkdownPath: "en/guide/desktop-uninstall-cleanup.md"
4
+ ---
5
+
6
+ # Uninstall DSH Desktop
7
+
8
+ Use this guide to uninstall DeepSeek Harness Desktop on macOS or Windows. Local data cleanup is optional.
9
+
10
+ ## 1. Uninstall the app
11
+
12
+ Finish any commands using Desktop's bundled CLI. If you installed the `dsh` command through Desktop, first select **Manage dsh Command… → Remove** in the application menu. This removes Desktop's command registration without uninstalling independent CLI programs.
13
+
14
+ Quit DeepSeek Harness, then uninstall it using your platform's procedure:
15
+
16
+ - **macOS:** Delete the app from Applications in Finder.
17
+ - **Windows:** Uninstall it through Settings → Apps → Installed apps on Windows 11, or Control Panel → Programs → Programs and Features.
18
+
19
+ ## 2. Clean up local data
20
+
21
+ This step is optional. If you want to clean up local data, select the script for your platform below, then paste and run it in Terminal on macOS or PowerShell on Windows.
22
+
23
+ The scripts permanently delete the current user's default Harness home and the Desktop data paths listed below, including sessions, credentials, settings, plugins, caches, and shared CLI state. If you configured `DSH_HOME`, inspect that directory separately before deleting it; the scripts still delete the default `~/.dsh`. Isolated development and test data directories are outside this cleanup scope.
24
+
25
+ On Windows, the uninstaller normally removes the two application-data directories listed in the script but retains the Harness home. The script also handles those directories if uninstallation left files behind or retained app data.
26
+
27
+ ::: code-group
28
+
29
+ ```sh [macOS]
30
+ sh -c '
31
+ rm -rf -- \
32
+ "$HOME/.dsh" \
33
+ "$HOME/Library/Application Support/@deepseek-ai/dsh-desktop" \
34
+ "$HOME/Library/Logs/DeepSeek Harness" \
35
+ "$HOME/Library/Preferences/com.deepseek.dsh.plist" \
36
+ "$HOME/Library/Preferences/ByHost"/com.deepseek.dsh.ShipIt.*.plist \
37
+ "$HOME/Library/Caches/com.deepseek.dsh" \
38
+ "$HOME/Library/Caches/com.deepseek.dsh.ShipIt" \
39
+ "$HOME/Library/HTTPStorages/com.deepseek.dsh" \
40
+ "$HOME/Library/Caches/@deepseek-aidsh-desktop-updater" \
41
+ "$(getconf DARWIN_USER_CACHE_DIR)/com.deepseek.dsh" \
42
+ "$(getconf DARWIN_USER_CACHE_DIR)/com.deepseek.dsh.helper"
43
+ '
44
+ ```
45
+
46
+ ```powershell [Windows]
47
+ $ErrorActionPreference = 'Stop'
48
+ @(
49
+ (Join-Path $env:USERPROFILE '.dsh'),
50
+ (Join-Path $env:APPDATA '@deepseek-ai\dsh-desktop'),
51
+ (Join-Path $env:LOCALAPPDATA '@deepseek-aidsh-desktop-updater')
52
+ ) | ForEach-Object {
53
+ if (Test-Path -LiteralPath $_) {
54
+ Remove-Item -LiteralPath $_ -Recurse -Force
55
+ }
56
+ }
57
+ ```
58
+
59
+ :::
60
+
61
+ ## 3. Verify cleanup
62
+
63
+ If you ran a cleanup script, confirm before reinstalling that the paths listed in it no longer exist. If the script reports an error, resolve it, rerun the script, and check all listed paths again. The Windows script stops at the first error, so later paths may remain.