dsh-plugin-dev-kb 1.0.0

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 (234) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +56 -0
  3. package/cordis.patch.yml +12 -0
  4. package/kb/INDEX.md +210 -0
  5. package/kb/README.md +69 -0
  6. package/kb/extra/AGENTS.md +75 -0
  7. package/kb/extra/api-gateway.md +164 -0
  8. package/kb/extra/api-gateway.zh.md +164 -0
  9. package/kb/extra/cookbook/adding-a-vendored-package.md +59 -0
  10. package/kb/extra/cookbook/adding-a-vendored-package.zh.md +59 -0
  11. package/kb/extra/cookbook/maintaining-dsh-code-review.md +64 -0
  12. package/kb/extra/cookbook/maintaining-dsh-code-review.zh.md +64 -0
  13. package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
  14. package/kb/extra/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
  15. package/kb/extra/defensive-patterns.md +33 -0
  16. package/kb/extra/defensive-patterns.zh.md +33 -0
  17. package/kb/extra/development.md +171 -0
  18. package/kb/extra/development.zh.md +171 -0
  19. package/kb/extra/event-producer-consumer.md +76 -0
  20. package/kb/extra/event-producer-consumer.zh.md +78 -0
  21. package/kb/extra/glossary.md +45 -0
  22. package/kb/extra/glossary.zh.md +45 -0
  23. package/kb/extra/graph-atlas.md +24 -0
  24. package/kb/extra/graph-atlas.zh.md +26 -0
  25. package/kb/extra/i18n/README.md +60 -0
  26. package/kb/extra/i18n/README.zh.md +60 -0
  27. package/kb/extra/i18n/style-samples.md +87 -0
  28. package/kb/extra/i18n/terminology.md +214 -0
  29. package/kb/extra/i18n/translation-prompt.md +263 -0
  30. package/kb/extra/i18n/translation-rules.md +69 -0
  31. package/kb/extra/i18n/translation-rules.zh.md +69 -0
  32. package/kb/extra/module-graph.md +1641 -0
  33. package/kb/extra/module-graph.zh.md +1643 -0
  34. package/kb/extra/postmortem/0001-acp-default-export-drops-inject.md +113 -0
  35. package/kb/extra/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
  36. package/kb/extra/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
  37. package/kb/extra/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
  38. package/kb/extra/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
  39. package/kb/extra/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
  40. package/kb/extra/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
  41. package/kb/extra/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
  42. package/kb/extra/postmortem/README.md +18 -0
  43. package/kb/extra/postmortem/README.zh.md +18 -0
  44. package/kb/extra/rescope.md +53 -0
  45. package/kb/extra/rescope.zh.md +53 -0
  46. package/kb/extra/subsystems/attachment.md +125 -0
  47. package/kb/extra/subsystems/attachment.zh.md +125 -0
  48. package/kb/extra/subsystems/extensions.md +364 -0
  49. package/kb/extra/subsystems/extensions.zh.md +364 -0
  50. package/kb/extra/subsystems/feedback.md +266 -0
  51. package/kb/extra/subsystems/feedback.zh.md +266 -0
  52. package/kb/extra/testing.md +49 -0
  53. package/kb/extra/testing.zh.md +49 -0
  54. package/kb/extra/web-styling.md +25 -0
  55. package/kb/extra/web-styling.zh.md +25 -0
  56. package/kb/meta/search-index.json +1328 -0
  57. package/kb/meta/site-pages.txt +168 -0
  58. package/kb/meta/source.json +13 -0
  59. package/kb/meta/topics.md +75 -0
  60. package/kb/site/develop/basic/config.md +108 -0
  61. package/kb/site/develop/basic/index.md +146 -0
  62. package/kb/site/develop/basic/publish.md +185 -0
  63. package/kb/site/develop/basic/tool.md +54 -0
  64. package/kb/site/develop/cordis-tutorial/01-first-plugin.md +95 -0
  65. package/kb/site/develop/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  66. package/kb/site/develop/cordis-tutorial/03-services.md +98 -0
  67. package/kb/site/develop/cordis-tutorial/04-events.md +144 -0
  68. package/kb/site/develop/cordis-tutorial/05-config.md +84 -0
  69. package/kb/site/develop/cordis-tutorial/06-composition-and-hmr.md +113 -0
  70. package/kb/site/develop/cordis-tutorial/07-into-the-harness.md +107 -0
  71. package/kb/site/develop/cordis-tutorial/index.md +62 -0
  72. package/kb/site/develop/framework/events.md +145 -0
  73. package/kb/site/develop/framework/index.md +139 -0
  74. package/kb/site/develop/framework/service.md +152 -0
  75. package/kb/site/develop/practice/index.md +157 -0
  76. package/kb/site/develop/practice/llm-adapter.md +190 -0
  77. package/kb/site/en/develop/basic/config.md +108 -0
  78. package/kb/site/en/develop/basic/index.md +146 -0
  79. package/kb/site/en/develop/basic/publish.md +185 -0
  80. package/kb/site/en/develop/basic/tool.md +54 -0
  81. package/kb/site/en/develop/cordis-tutorial/01-first-plugin.md +95 -0
  82. package/kb/site/en/develop/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  83. package/kb/site/en/develop/cordis-tutorial/03-services.md +98 -0
  84. package/kb/site/en/develop/cordis-tutorial/04-events.md +144 -0
  85. package/kb/site/en/develop/cordis-tutorial/05-config.md +84 -0
  86. package/kb/site/en/develop/cordis-tutorial/06-composition-and-hmr.md +113 -0
  87. package/kb/site/en/develop/cordis-tutorial/07-into-the-harness.md +107 -0
  88. package/kb/site/en/develop/cordis-tutorial/index.md +60 -0
  89. package/kb/site/en/develop/framework/events.md +145 -0
  90. package/kb/site/en/develop/framework/index.md +139 -0
  91. package/kb/site/en/develop/framework/service.md +150 -0
  92. package/kb/site/en/develop/practice/index.md +157 -0
  93. package/kb/site/en/develop/practice/llm-adapter.md +190 -0
  94. package/kb/site/en/guide/providers-custom-form.png +0 -0
  95. package/kb/site/en/guide/providers-models-page.png +0 -0
  96. package/kb/site/en/guide/providers.md +100 -0
  97. package/kb/site/en/guide/python-sdk.md +106 -0
  98. package/kb/site/en/guide/quickstart.md +32 -0
  99. package/kb/site/en/index.md +8 -0
  100. package/kb/site/en/reference/agent-lifecycle.md +86 -0
  101. package/kb/site/en/reference/capability-seams.md +475 -0
  102. package/kb/site/en/reference/config-catalog.md +3155 -0
  103. package/kb/site/en/reference/cookbook/adding-a-conversation-node.md +235 -0
  104. package/kb/site/en/reference/cookbook/adding-a-package.md +120 -0
  105. package/kb/site/en/reference/cookbook/adding-a-settings-card.md +102 -0
  106. package/kb/site/en/reference/cookbook/adding-a-tool.md +96 -0
  107. package/kb/site/en/reference/cookbook/adding-an-llm-adapter.md +45 -0
  108. package/kb/site/en/reference/cookbook/extension-cookbook.md +131 -0
  109. package/kb/site/en/reference/cordis-api/context.md +368 -0
  110. package/kb/site/en/reference/cordis-api/events.md +211 -0
  111. package/kb/site/en/reference/cordis-api/fiber.md +379 -0
  112. package/kb/site/en/reference/cordis-api/inherited.md +43 -0
  113. package/kb/site/en/reference/cordis-api/registry.md +156 -0
  114. package/kb/site/en/reference/cordis-api/service.md +106 -0
  115. package/kb/site/en/reference/cordis-primer.md +46 -0
  116. package/kb/site/en/reference/index.md +131 -0
  117. package/kb/site/en/reference/persistence-catalog.md +949 -0
  118. package/kb/site/en/reference/subsystems/approval.md +173 -0
  119. package/kb/site/en/reference/subsystems/client-modules.md +121 -0
  120. package/kb/site/en/reference/subsystems/code-runtime.md +194 -0
  121. package/kb/site/en/reference/subsystems/commands.md +190 -0
  122. package/kb/site/en/reference/subsystems/compaction.md +241 -0
  123. package/kb/site/en/reference/subsystems/core.md +1073 -0
  124. package/kb/site/en/reference/subsystems/credentials.md +136 -0
  125. package/kb/site/en/reference/subsystems/filesystem.md +498 -0
  126. package/kb/site/en/reference/subsystems/goal.md +280 -0
  127. package/kb/site/en/reference/subsystems/index.md +58 -0
  128. package/kb/site/en/reference/subsystems/invariants.md +91 -0
  129. package/kb/site/en/reference/subsystems/jobs.md +293 -0
  130. package/kb/site/en/reference/subsystems/llm-streaming.md +920 -0
  131. package/kb/site/en/reference/subsystems/lsp.md +205 -0
  132. package/kb/site/en/reference/subsystems/permission-presets.md +134 -0
  133. package/kb/site/en/reference/subsystems/persistence.md +388 -0
  134. package/kb/site/en/reference/subsystems/plan.md +90 -0
  135. package/kb/site/en/reference/subsystems/sandbox.md +221 -0
  136. package/kb/site/en/reference/subsystems/schedule.md +189 -0
  137. package/kb/site/en/reference/subsystems/scope.md +62 -0
  138. package/kb/site/en/reference/subsystems/session-projection.md +265 -0
  139. package/kb/site/en/reference/subsystems/session-query.md +498 -0
  140. package/kb/site/en/reference/subsystems/session-reference.md +111 -0
  141. package/kb/site/en/reference/subsystems/session-telemetry.md +197 -0
  142. package/kb/site/en/reference/subsystems/session-title.md +207 -0
  143. package/kb/site/en/reference/subsystems/session.md +852 -0
  144. package/kb/site/en/reference/subsystems/settings.md +313 -0
  145. package/kb/site/en/reference/subsystems/shell.md +306 -0
  146. package/kb/site/en/reference/subsystems/skills.md +334 -0
  147. package/kb/site/en/reference/subsystems/spill.md +120 -0
  148. package/kb/site/en/reference/subsystems/storage.md +232 -0
  149. package/kb/site/en/reference/subsystems/subagent.md +737 -0
  150. package/kb/site/en/reference/subsystems/subprocess.md +327 -0
  151. package/kb/site/en/reference/subsystems/system-prompt.md +210 -0
  152. package/kb/site/en/reference/subsystems/terminal.md +187 -0
  153. package/kb/site/en/reference/subsystems/token-meter.md +93 -0
  154. package/kb/site/en/reference/subsystems/tools.md +723 -0
  155. package/kb/site/en/reference/subsystems/typert.md +339 -0
  156. package/kb/site/en/reference/subsystems/user-questions.md +181 -0
  157. package/kb/site/en/reference/subsystems/web-server.md +111 -0
  158. package/kb/site/en/reference/subsystems/web.md +202 -0
  159. package/kb/site/en/reference/subsystems/workflow.md +281 -0
  160. package/kb/site/en/reference/subsystems/workspace.md +231 -0
  161. package/kb/site/en/reference/tool-catalog.md +1877 -0
  162. package/kb/site/en/reference/tool-execution-pipeline.md +66 -0
  163. package/kb/site/guide/providers-custom-form.zh.png +0 -0
  164. package/kb/site/guide/providers-models-page.zh.png +0 -0
  165. package/kb/site/guide/providers.md +100 -0
  166. package/kb/site/guide/python-sdk.md +106 -0
  167. package/kb/site/guide/quickstart.md +32 -0
  168. package/kb/site/index.md +8 -0
  169. package/kb/site/reference/agent-lifecycle.md +86 -0
  170. package/kb/site/reference/capability-seams.md +475 -0
  171. package/kb/site/reference/config-catalog.md +3154 -0
  172. package/kb/site/reference/cookbook/adding-a-conversation-node.md +235 -0
  173. package/kb/site/reference/cookbook/adding-a-package.md +120 -0
  174. package/kb/site/reference/cookbook/adding-a-settings-card.md +102 -0
  175. package/kb/site/reference/cookbook/adding-a-tool.md +98 -0
  176. package/kb/site/reference/cookbook/adding-an-llm-adapter.md +45 -0
  177. package/kb/site/reference/cookbook/extension-cookbook.md +133 -0
  178. package/kb/site/reference/cordis-api/context.md +368 -0
  179. package/kb/site/reference/cordis-api/events.md +211 -0
  180. package/kb/site/reference/cordis-api/fiber.md +379 -0
  181. package/kb/site/reference/cordis-api/inherited.md +43 -0
  182. package/kb/site/reference/cordis-api/registry.md +156 -0
  183. package/kb/site/reference/cordis-api/service.md +106 -0
  184. package/kb/site/reference/cordis-primer.md +52 -0
  185. package/kb/site/reference/index.md +135 -0
  186. package/kb/site/reference/persistence-catalog.md +949 -0
  187. package/kb/site/reference/subsystems/approval.md +173 -0
  188. package/kb/site/reference/subsystems/client-modules.md +121 -0
  189. package/kb/site/reference/subsystems/code-runtime.md +194 -0
  190. package/kb/site/reference/subsystems/commands.md +190 -0
  191. package/kb/site/reference/subsystems/compaction.md +241 -0
  192. package/kb/site/reference/subsystems/core.md +1081 -0
  193. package/kb/site/reference/subsystems/credentials.md +136 -0
  194. package/kb/site/reference/subsystems/filesystem.md +498 -0
  195. package/kb/site/reference/subsystems/goal.md +280 -0
  196. package/kb/site/reference/subsystems/index.md +58 -0
  197. package/kb/site/reference/subsystems/invariants.md +91 -0
  198. package/kb/site/reference/subsystems/jobs.md +293 -0
  199. package/kb/site/reference/subsystems/llm-streaming.md +926 -0
  200. package/kb/site/reference/subsystems/lsp.md +205 -0
  201. package/kb/site/reference/subsystems/permission-presets.md +134 -0
  202. package/kb/site/reference/subsystems/persistence.md +388 -0
  203. package/kb/site/reference/subsystems/plan.md +90 -0
  204. package/kb/site/reference/subsystems/sandbox.md +221 -0
  205. package/kb/site/reference/subsystems/schedule.md +189 -0
  206. package/kb/site/reference/subsystems/scope.md +62 -0
  207. package/kb/site/reference/subsystems/session-projection.md +265 -0
  208. package/kb/site/reference/subsystems/session-query.md +498 -0
  209. package/kb/site/reference/subsystems/session-reference.md +111 -0
  210. package/kb/site/reference/subsystems/session-telemetry.md +197 -0
  211. package/kb/site/reference/subsystems/session-title.md +207 -0
  212. package/kb/site/reference/subsystems/session.md +854 -0
  213. package/kb/site/reference/subsystems/settings.md +313 -0
  214. package/kb/site/reference/subsystems/shell.md +306 -0
  215. package/kb/site/reference/subsystems/skills.md +334 -0
  216. package/kb/site/reference/subsystems/spill.md +120 -0
  217. package/kb/site/reference/subsystems/storage.md +232 -0
  218. package/kb/site/reference/subsystems/subagent.md +739 -0
  219. package/kb/site/reference/subsystems/subprocess.md +327 -0
  220. package/kb/site/reference/subsystems/system-prompt.md +210 -0
  221. package/kb/site/reference/subsystems/terminal.md +187 -0
  222. package/kb/site/reference/subsystems/token-meter.md +93 -0
  223. package/kb/site/reference/subsystems/tools.md +723 -0
  224. package/kb/site/reference/subsystems/typert.md +339 -0
  225. package/kb/site/reference/subsystems/user-questions.md +181 -0
  226. package/kb/site/reference/subsystems/web-server.md +111 -0
  227. package/kb/site/reference/subsystems/web.md +202 -0
  228. package/kb/site/reference/subsystems/workflow.md +281 -0
  229. package/kb/site/reference/subsystems/workspace.md +231 -0
  230. package/kb/site/reference/tool-catalog.md +1880 -0
  231. package/kb/site/reference/tool-execution-pipeline.md +66 -0
  232. package/package.json +40 -0
  233. package/scripts/rebuild-index.mjs +88 -0
  234. package/skills/dsh-plugin-dev-kb.md +66 -0
@@ -0,0 +1,202 @@
1
+ ---
2
+ editSource: "docs/subsystems/web.zh.md"
3
+ outline: [2,3]
4
+ ---
5
+
6
+ # Web 访问
7
+
8
+ Web 访问 seam 是一个[能力 seam](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/architecture/2026-06-24-web-capability-seam.md),在同一个 `ctx.web` 服务上横跨**两项操作**(search 与 fetch),并拆分到多个包:Service Definition([dsh-web](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/web/web),`ctx.web` + 提供方注册表)、Service Provider([dsh-web-search-exa](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/web/web-search-exa)、[dsh-web-search-perplexity](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/web/web-search-perplexity)、[dsh-web-search-deepseek](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/web/web-search-deepseek)、[dsh-web-fetch-http](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/web/web-fetch-http))与 Consumer([dsh-tool-web](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/web/tool-web),即 `web_search`/`web_fetch` 工具 schema)。Web 是**一项可选能力**,不属于 agent loop(智能体循环)主干,因此其词汇定义在此而非 [core.md](./core.md) 中。更换 search 提供方不会改变模型提交查询的方式,更换 fetch 提供方也不会改变模型请求 URL 的方式。
9
+
10
+ 源码:[`packages/web/web/src/types.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/web/web/src/types.ts)
11
+
12
+ ## 为什么一项能力包含两项操作
13
+
14
+ 搜索与抓取既不共享请求 schema,也不共享业务逻辑,但它们被有意设计为同一个 `ctx.web` 中间层:一个提供方选择策略的所有者、一套中止与错误词汇,以及一个面向产品的「此 harness 如何访问 Web」配置界面。代价是服务上并行的 `searchX`/`fetchX` 方法对;这种并行是有意为之,而不是遗漏了可抽取的共性。提供方注册的是**能力**(`WebSearchProvider` 或 `WebFetchProvider`),而非工具;面向模型的名称、schema、提示词引导与展示全部集中在唯一的消费方 `dsh-tool-web` 中。
15
+
16
+ ## 搜索请求与结果
17
+
18
+ 面向模型的工具参数仅为一个 `query`;`maxResults` 是消费方自有的上限(`dsh-tool-web` 的 `searchMaxResults` 配置,默认 `8`),通过 seam 传递并在返回时强制执行——如果提供方返回超量,seam 截断 `sources[]` 并设置 `truncated`。
19
+
20
+ ```ts type-equiv
21
+ /**
22
+ * What one search-capable backend can return. The model-facing argument is just
23
+ * a query; `maxResults` is a `dsh-tool-web`-layer bound passed through unchanged
24
+ * and enforced on the way back by the seam (see {@link WebSearchResult}).
25
+ */
26
+ interface WebSearchRequest {
27
+ readonly query: string
28
+ /**
29
+ * Upper bound on returned sources; the seam truncates to it. Omitted = no
30
+ * bound. `dsh-tool-web` always sets it. A provider whose API supports a
31
+ * result-count control (Exa's `numResults`) should apply it at the request
32
+ * layer as a cost/latency optimization; the seam enforces the bound
33
+ * regardless.
34
+ */
35
+ readonly maxResults?: number
36
+ }
37
+ ```
38
+
39
+ ```ts type-equiv
40
+ /**
41
+ * Normalized search outcome. `content` is optional provider-generated answer
42
+ * text or summary (Exa and DeepSeek return none; Perplexity returns a
43
+ * generated answer).
44
+ * `sources[]` is the portable citation shape. `truncated` is set by the seam
45
+ * when it cut `sources[]` down to `maxResults`.
46
+ */
47
+ interface WebSearchResult {
48
+ /** Optional provider-generated answer text, search context, or summary. */
49
+ readonly content?: string
50
+ /** Citeable sources, already truncated to the request's `maxResults`. */
51
+ readonly sources: readonly WebSearchSource[]
52
+ /** True when the seam dropped sources to honor `maxResults`. */
53
+ readonly truncated: boolean
54
+ }
55
+ ```
56
+
57
+ ```ts type-equiv
58
+ /**
59
+ * One citeable source. A source always has a URL; `title`, `snippet`, and
60
+ * `publishedAt` are optional because not every provider returns them — forcing
61
+ * adapters to invent them would make the seam lie (Perplexity citations may be
62
+ * URL-only). `dsh-tool-web` renders `title ?? hostname(url)` for display.
63
+ */
64
+ interface WebSearchSource {
65
+ readonly url: string
66
+ readonly title?: string
67
+ readonly snippet?: string
68
+ /** Publication/crawl timestamp as a provider-supplied ISO-8601 string. */
69
+ readonly publishedAt?: string
70
+ }
71
+ ```
72
+
73
+ ## 抓取请求与结果
74
+
75
+ ```ts type-equiv
76
+ /**
77
+ * What one fetch-capable backend is asked to retrieve. The request deliberately
78
+ * omits timeout, format, prompt, and extraction controls: cancellation is a
79
+ * direct execution argument, while presentation and higher-level LLM concerns
80
+ * belong outside safe retrieval.
81
+ */
82
+ interface WebFetchRequest {
83
+ readonly url: string
84
+ }
85
+ ```
86
+
87
+ HTTP 状态码是被抓取资源状态的一部分,不自动视为失败:即使一次成功的网络抓取收到 `404` 或 `500` 响应,也仍会产出一个 `WebFetchResult`,其中包含状态码和长度受限的已解码正文。`url` 是经过允许的重定向后的最终 URL。`WebError` 仅用于无法安全获取或表示资源的情况。
88
+
89
+ ```ts type-equiv
90
+ /**
91
+ * Normalized fetch outcome. A successful network fetch of a non-2xx response is
92
+ * a result, not an error: the status code is part of the fetched resource
93
+ * state. {@link WebError} is reserved for failures to safely retrieve or
94
+ * represent the resource.
95
+ */
96
+ interface WebFetchResult {
97
+ /** The final URL after allowed redirects (the request URL is in the request). */
98
+ readonly url: string
99
+ /** HTTP status code of the fetched response. */
100
+ readonly statusCode: number
101
+ /** Decoded body, classified by content kind. */
102
+ readonly body: WebFetchBody
103
+ /** True when the provider capped the decoded body. */
104
+ readonly truncated: boolean
105
+ }
106
+ ```
107
+
108
+ ```ts type-equiv
109
+ /**
110
+ * The decoded body of a fetched resource. A CLOSED discriminated union owned by
111
+ * `dsh-web`: the provider decodes the kind and `dsh-tool-web` renders it, so a
112
+ * new kind is a coordinated change across known packages, not a plugin
113
+ * extension. Consumers `switch` on `kind` ending in `default: assertNever(...)`
114
+ * so adding a kind breaks compilation at every consumer until handled. Each arm
115
+ * stays its own object literal even where fields coincide, so an arm can gain
116
+ * fields the others lack.
117
+ */
118
+ type WebFetchBody =
119
+ | { readonly kind: 'html'; readonly content: string }
120
+ | { readonly kind: 'text'; readonly content: string }
121
+ ```
122
+
123
+ ## 提供方可用性
124
+
125
+ 提供方的 `available(): boolean` 是一个廉价的本地检查(凭证是否存在、配置是否可解析),**禁止发起网络调用**。它是执行时选择提供方的输入,而不是健康检查系统:`search()`/`fetch()` 会读取它来选择可用的提供方。选择失败时,调用方会收到可据以分支处理的结构化 `WebError`;其错误代码和消息会说明缺失的 id 或存在歧义的候选集。
126
+
127
+ 选择从不依赖注册顺序、配置顺序或 HMR(热模块替换)顺序:一项能力要么有显式的提供方 id(配置 `searchProvider`/`fetchProvider`,或填充同一字段的对应环境变量),要么在恰好只有一个可用提供方注册时自动选择;如果存在多个可用提供方却未配置 id,则抛出 `WEB_PROVIDER_AMBIGUOUS`,而不会选用最先注册的提供方。
128
+
129
+ ## 错误
130
+
131
+ `WebError extends HarnessError`([core.md](./core.md) 错误分类体系),带有 `code: string`(开放式,与其他 seam 的错误一致——`LlmError`、`SubagentError`),而非封闭联合类型:提供方可以在不修改 `dsh-web` 的情况下抛出自己的错误代码,消费方必须容忍未知错误代码。错误代码按所有者划分。共享的 `WebRuntime` 约定会抛出与 seam 无关的错误代码:`WEB_PROVIDER_UNAVAILABLE`、`WEB_PROVIDER_CONFIGURED_MISSING`、`WEB_PROVIDER_CONFIGURED_UNAVAILABLE`、`WEB_PROVIDER_AMBIGUOUS`、`WEB_DUPLICATE_PROVIDER`(注册时的编程错误,类似 `LlmRuntime` 的 `DUPLICATE_ADAPTER`)、`WEB_ABORTED`,以及 `WEB_PROVIDER_ERROR`(提供方自身故障经 seam 暴露时使用的兜底代码,包括 DNS、连接被拒绝、TLS 等网络或传输故障)。抓取传输层错误代码由 `dsh-web-fetch-http` 实现拥有,不同的抓取后端无需抛出它们:`WEB_INVALID_URL`、`WEB_BLOCKED_URL`、`WEB_REDIRECT_BLOCKED`、`WEB_FETCH_TOO_LARGE`、`WEB_FETCH_TIMEOUT`、`WEB_UNSUPPORTED_CONTENT_TYPE`。
132
+
133
+ ## 服务
134
+
135
+ `WebRuntime` 注册搜索与抓取提供方,以 `WEB_DUPLICATE_PROVIDER` 拒绝重复 id,并在执行时以结构化的选择错误解析提供方。本地抓取后端仅接受 HTTP(S)、拒绝凭证、限制重定向次数、字节数、字符数和时间、对每一次同源重定向跳转重新进行安全校验,并解码正文;展示由工具负责。本地后端不会拦截私有网络目标;在能够触及敏感内部目标的环境中,禁止启用 `web_fetch`。
136
+
137
+ <!-- BEGIN GENERATED cordis-surface (gen-cordis-catalog.ts) — do not edit between markers -->
138
+
139
+ <a id="cordis-surface"></a>
140
+
141
+ ## Cordis API
142
+
143
+ Generated from source by `scripts/gen-cordis-catalog.ts` (verified fresh by `pnpm run verify-cordis-catalog` in doc-sync; regenerate with `pnpm run gen-cordis-catalog`) — this section is byte-identical in both language sides of the page. Signature blocks use a `ts cordis-catalog` fence and keep the original source JSDoc; dispatch modes are defined in the [primer](../cordis-primer.md#dispatch-modes), and the framework-inherited `ctx` API lives in [cordis-api/inherited.md](../cordis-api/inherited.md).
144
+
145
+ <a id="ctxweb--webruntime"></a>
146
+
147
+ ### `ctx.web` — `WebRuntime`
148
+
149
+ The web access service. Registered as `ctx.web` (one instance per context).
150
+
151
+ Selection semantics (resolved at execution time, never order-dependent):
152
+
153
+ - A configured id that is registered and `available()` → that provider.
154
+ - A configured id not registered → `WEB_PROVIDER_CONFIGURED_MISSING`.
155
+ - A configured id registered but unavailable → `WEB_PROVIDER_CONFIGURED_UNAVAILABLE`.
156
+ - No id configured, exactly one registered usable provider → that provider.
157
+ - No id configured, multiple usable providers → `WEB_PROVIDER_AMBIGUOUS`.
158
+ - No id configured, no usable provider → `WEB_PROVIDER_UNAVAILABLE`.
159
+
160
+ ```ts cordis-catalog
161
+ /**
162
+ * Register a search provider. Throws {@link WebError} `WEB_DUPLICATE_PROVIDER`
163
+ * if its id is already registered for search. Returns a disposer; disposed
164
+ * with the calling fiber.
165
+ * @param provider - the provider; its `id` is the registry key.
166
+ * @returns the disposer that unregisters the provider.
167
+ */
168
+ registerSearchProvider(provider: WebSearchProvider): () => void
169
+
170
+ /**
171
+ * Register a fetch provider. Throws {@link WebError} `WEB_DUPLICATE_PROVIDER`
172
+ * if its id is already registered for fetch. Returns a disposer; disposed
173
+ * with the calling fiber.
174
+ * @param provider - the provider; its `id` is the registry key.
175
+ * @returns the disposer that unregisters the provider.
176
+ */
177
+ registerFetchProvider(provider: WebFetchProvider): () => void
178
+
179
+ /**
180
+ * Run one search through the selected provider. Resolves the provider at call
181
+ * time with the selection rules above; throws {@link WebError} when the
182
+ * capability cannot run. The seam enforces `request.maxResults` on the result:
183
+ * if the provider over-returns, `sources[]` is truncated and `truncated` set.
184
+ * @param request - the query and optional result limit.
185
+ * @param signal - optional cancellation signal forwarded to the provider.
186
+ * @returns the provider's results, capped to `request.maxResults`.
187
+ */
188
+ async search(request: WebSearchRequest, signal?: AbortSignal): Promise<WebSearchResult>
189
+
190
+ /**
191
+ * Retrieve one URL through the selected provider. Resolves the provider at
192
+ * call time with the selection rules above; throws {@link WebError} when the
193
+ * capability cannot run. A non-2xx response is a result, not a throw.
194
+ * @param request - the URL plus retrieval options.
195
+ * @param signal - optional cancellation signal forwarded to the provider.
196
+ * @returns the retrieval outcome; non-2xx responses resolve descriptively.
197
+ */
198
+ async fetch(request: WebFetchRequest, signal?: AbortSignal): Promise<WebFetchResult>
199
+ ```
200
+
201
+ Source: [`packages/web/web/src/index.ts:74`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/web/web/src/index.ts)
202
+ <!-- END GENERATED cordis-surface -->
@@ -0,0 +1,281 @@
1
+ ---
2
+ editSource: "docs/subsystems/workflow.zh.md"
3
+ outline: [2,3]
4
+ ---
5
+
6
+ # 工作流
7
+
8
+ 工作流 seam 允许 agent(智能体)运行由模型编写、会启动 subagent 的编排脚本。与 [subagent](./subagent.md) 一样,它是**一项可选能力**,不属于 agent loop,因此其类型和操作记录在此处,而非 [core.md](./core.md)。与 bash 一样,每个上下文只允许一个引擎实现提供 `ctx.workflowEngine`;没有命名提供方注册表(第二个引擎通过插件配置替换第一个,而不与它同时运行)。
9
+
10
+ Service Definition:[dsh-workflow](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/workflow/workflow)(`ctx.workflowEngine` + 下文词汇)。Service Provider 是 [dsh-workflow-worker-thread](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/workflow/workflow-worker-thread)(一个 `node:worker_threads` 引擎——每个 run 一个 worker,脚本的 vm 上下文位于其中);面向模型的 Consumer 是 [dsh-tool-workflow](https://github.com/deepseek-ai/deepseek-harness/tree/master/packages/workflow/tool-workflow)。提案与设计理由见 [dynamic-workflows Agent Note](https://github.com/deepseek-ai/deepseek-harness/blob/master/.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md)。
11
+
12
+ 源码:浏览器安全词汇位于 [`packages/workflow/workflow/src/types.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/workflow/src/types.ts),Host 请求与活跃运行句柄位于 [`runtime-types.ts`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/workflow/src/runtime-types.ts)。
13
+
14
+ ## 启动请求
15
+
16
+ 本节定义调用方启动一次运行时提交的请求。普通工作流工具会根据模型的 `{ script, meta, args }` 调用和发起调用的 agent 构建该请求;专用消费方还可以为本次运行选择引擎级 `subagentProvider`,并将 `maxTotalAgents` 调低,但脚本无法观察或替换这两项策略。`meta` 与 `args` 是普通 JSON 数据;引擎会用 schema 校验 `meta`,并在任何工作开始前明确报错并拒绝无效数据。引擎绝不会通过对脚本文本求值来获取它们。`parent` 是必填字段——脚本启动的每个子 agent 都归属于它,cwd、谱系与深度通过 [subagent seam](./subagent.md) 传递。
17
+
18
+ ```ts type-equiv
19
+ /**
20
+ * What a caller asks for when starting a workflow run. `meta` and `args` are
21
+ * plain JSON data by the seam contract. `parent` is required because every
22
+ * `agent()` spawned by the script is attributed to that live Agent.
23
+ */
24
+ interface WorkflowStartRequest {
25
+ /** The plain-JS script body (top-level await allowed; ends with `return <json-value>`). */
26
+ script: string
27
+ /** The workflow's identity block, as plain JSON data (shape-validated by the engine). */
28
+ meta: WorkflowMeta
29
+ /** Optional input exposed verbatim to the script as the `args` global. */
30
+ args?: unknown
31
+ /** Optional engine-wide child-provider override for this run. */
32
+ subagentProvider?: string
33
+ /** Optional per-run total-child ceiling. */
34
+ maxTotalAgents?: number
35
+ /** The agent on whose behalf the run executes (parent of every child). */
36
+ parent: Agent
37
+ /** Cancels the run when aborted. */
38
+ signal?: AbortSignal
39
+ }
40
+ ```
41
+
42
+ ## 工作流的身份标识:`WorkflowMeta`
43
+
44
+ 作为数据附在启动请求上的身份块(工具的 `meta` 参数;字段词汇与 Claude Code 动态工作流的 meta 块一致)。`phases` 仅用于进度展示:`phase()` 调用与标题匹配,供观察者使用;不暗示任何执行结构。
45
+
46
+ ```ts type-equiv
47
+ /**
48
+ * The script's identity block, provided as plain JSON data alongside the
49
+ * script body (the model-facing tool carries it as its `meta` parameter) and
50
+ * validated by the engine before the body runs. `name`/`description` are
51
+ * required; the rest is optional annotation. The field vocabulary matches the
52
+ * Claude Code dynamic-workflows meta block.
53
+ */
54
+ interface WorkflowMeta {
55
+ /** Short kebab-case workflow name (display + persistence key). */
56
+ name: string
57
+ /** One-line description of what the workflow does. */
58
+ description: string
59
+ /** Optional guidance on when this workflow applies (shown in listings). */
60
+ whenToUse?: string
61
+ /** Optional phase declarations matched by `phase()` calls. */
62
+ phases?: WorkflowPhase[]
63
+ }
64
+ ```
65
+
66
+ ## 终态结果:`WorkflowResult`
67
+
68
+ `WorkflowRun.result` 会兑现为一次运行的结果。`value` 是脚本的物化返回值——纯宿主域 JSON 数据(脚本无返回值时为 `null`)——仅在 `completed` 时有意义。`stopReason` 是封闭联合类型(由引擎定义;消费方可穷举):`completed` | `cancelled` | `error`。非 `completed` 的原因在 `error` 中携带失败信息,消费方将其映射为 `isError` 工具结果,而非把部分输出当作成功上报。
69
+
70
+ ```ts type-equiv
71
+ /**
72
+ * The outcome resolved by a live workflow run. `value` is
73
+ * the script's materialized return value (plain host-realm JSON data; `null`
74
+ * when the script returned `undefined`) — meaningful only for `completed`.
75
+ * A non-`completed` reason carries the failure in `error`; the consumer maps
76
+ * it to an `isError` tool result rather than reporting partial output.
77
+ */
78
+ interface WorkflowResult {
79
+ /** The script's return value (host JSON data; `null` for no return). */
80
+ value: unknown
81
+ /** Why the run settled. */
82
+ stopReason: WorkflowStopReason
83
+ /** The failure message (present iff `stopReason` is not `completed`). */
84
+ error?: string
85
+ /**
86
+ * How many `agent()` calls the run accepted over its whole lifetime. On a
87
+ * graceful settlement this is the script-side count (calls still queued for
88
+ * a concurrency slot included); on a termination path (grace force-settle,
89
+ * worker death) it degrades to the host-observed count — calls queued
90
+ * inside a terminated script are unknowable then.
91
+ */
92
+ agentsStarted: number
93
+ }
94
+ ```
95
+
96
+ ## 活跃运行:`WorkflowRun`
97
+
98
+ 脚本执行期间消费方持有的句柄。消费方会等待 `result`,可以在运行期间调用 `cancel`,并且必须在每条路径上调用 `dispose`(资源释放)。`result` 不会被拒绝:脚本失败会兑现为 `stopReason: 'error'`。运行被取消后,即使脚本本身永不结算,结果也会在引擎规定的有界宽限期内结算;引擎会强制将其结算为 `cancelled`,随后 worker-thread 引擎会终止脚本所在的 worker。因此,等待 `result` 的消费方不会在取消后无限期挂起。`dispose()` 会执行取消、等待有界结算并等待子 agent 完全停稳,不会因脚本卡死而挂起。
99
+
100
+ ```ts type-equiv
101
+ /**
102
+ * Holder-owned live workflow. `result` never rejects; consumers may cancel
103
+ * and must call idempotent `dispose()` to await script and child quiescence.
104
+ */
105
+ interface WorkflowRun {
106
+ readonly id: WorkflowRunId
107
+ /** The validated meta block available before the script body runs. */
108
+ readonly meta: WorkflowMeta
109
+ readonly result: Promise<WorkflowResult>
110
+ /** Cancel the run and its children. */
111
+ cancel(reason?: string): void
112
+ /** Cancel if needed and await bounded settlement and cleanup. */
113
+ dispose(): Promise<void>
114
+ }
115
+ ```
116
+
117
+ ## 失败纪律:`WorkflowError.fatal`
118
+
119
+ 脚本内部的钩子误用:错误参数、未知或延迟的 `agent()` 选项、超出[结构化输出子集](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/core/tools/README.md)的 schema、超出上限、seam 启动失败、取消,都会抛出 `fatal: true` 的 `WorkflowError`。`parallel()`/`pipeline()` 组合器对 fatal 错误直接重新抛出,而非将该项映射为 `null`:一个拼写错误的选项必须明确报错并终止脚本,绝不能消融为看似普通子 agent 失败的结果。逐项的 `null` 保留给子运行失败(非 `completed` 的 stop reason)和阶段内的普通脚本错误。
120
+
121
+ ## 事件
122
+
123
+ `workflow/*` 事件(`workflow/start`、`workflow/phase`、`workflow/log`、`workflow/agent-start`、`workflow/agent-end`、`workflow/end`,见[事件目录](#cordis-surface))是**仅供观察**的 emit,携带数据快照:每个 payload 以 `WorkflowRunInfo`(id + meta)开头,而非活跃的 `WorkflowRun`,因此订阅者无法获得 `cancel`/`dispose`;`workflow/end` 刻意省略 result value(观察结果的监听器不得收到调用方 result 的可变别名)。每次 emit 对每个监听器隔离:订阅者抛出的异常会被记录到日志中而不会传播,也不会阻止后续注册的监听器收到事件;每个监听器收到自己的 payload 克隆,因此修改它既不会损坏引擎也不会影响其他监听器。这种隔离方式与 `subagent/start`/`subagent/end` 一致。
124
+
125
+ ## 持久 Chat 记录
126
+
127
+ 顶层 `dsh-tool-workflow` 消费方把展示事实投影到调用它的父 Session,同时不改变执行所有权。运行接受后写 `tool-workflow/run-start`,以 `runId + seq` 配对成员开始与结束,并且只在结果已取得且 dispose 完全停稳后写 `tool-workflow/run-end`。嵌套 transport 调用不写记录。第一次 append 失败会禁用本运行后续写入,因此日志保持为空或合法连续前缀,工具结果不变。
128
+
129
+ `dsh-tool-workflow/invariant` 会在实时提交前和 Session 加载时校验同一协议:每个运行只有一个 start,成员序号为正且唯一,成员 end 必须配对,仍有开放成员时不能结束运行,运行结束后不能继续更新。日志尾部缺少成员 end 或 run end 是有效的中断证据,不是损坏。
130
+
131
+ `dsh-client-ui-workflow-run` 通过 Conversation Node 引擎把四类事件折叠为一个 `workflow-run` Chat 节点,以 run-start 序号锚定在原工作流工具节点之后。阶段组只来自真正开始过的成员,并保留精确字符串,包括字段缺省与 `''` 的区别。Location 关闭时,缺失终点会显示为已中断。[界面包 README](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/client/ui-workflow-run/README.md)负责定义 disclosure、状态与同父本地导航行为。
132
+
133
+ <!-- BEGIN GENERATED cordis-surface (gen-cordis-catalog.ts) — do not edit between markers -->
134
+
135
+ <a id="cordis-surface"></a>
136
+
137
+ ## Cordis API
138
+
139
+ Generated from source by `scripts/gen-cordis-catalog.ts` (verified fresh by `pnpm run verify-cordis-catalog` in doc-sync; regenerate with `pnpm run gen-cordis-catalog`) — this section is byte-identical in both language sides of the page. Signature blocks use a `ts cordis-catalog` fence and keep the original source JSDoc; dispatch modes are defined in the [primer](../cordis-primer.md#dispatch-modes), and the framework-inherited `ctx` API lives in [cordis-api/inherited.md](../cordis-api/inherited.md).
140
+
141
+ <a id="ctxworkflowengine--workflowengine-abstract-seam"></a>
142
+
143
+ ### `ctx.workflowEngine` — `WorkflowEngine` (abstract seam)
144
+
145
+ Workflow Service Definition contract. Invalid requests throw before publication; a live run is holder-owned, its result never rejects, cancellation and disposal are bounded, and disposal waits for child cleanup within that bound. Lifecycle listener failures are contained, and `workflow/end` fires exactly once as the result settles.
146
+
147
+ ```ts cordis-catalog
148
+ /**
149
+ * Parse and execute a workflow script.
150
+ * @param request - the script, its `args`, the parent agent, and an
151
+ * optional cancel signal.
152
+ * @returns the live run; its `result` resolves when the script settles.
153
+ */
154
+ abstract start(request: WorkflowStartRequest): WorkflowRun
155
+ ```
156
+
157
+ Source: [`packages/workflow/workflow/src/index.ts:157`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/workflow/src/index.ts)
158
+
159
+ <a id="workflow-events"></a>
160
+
161
+ ### `workflow/*` events
162
+
163
+ <a id="workflowagent-end--emit"></a>
164
+
165
+ #### `workflow/agent-end` — emit
166
+
167
+ One `agent()` call settled (clean result, child failure, or run cancellation). Paired with Events['workflow/agent-start'] by `agent.seq`, exactly once per started call on every stop path — on an engine termination path (a worker killed past its grace) the end is engine-synthesized with outcome `'cancelled'`.
168
+
169
+ ```ts cordis-catalog
170
+ /**
171
+ * One `agent()` call settled (clean result, child failure, or run
172
+ * cancellation). Paired with {@link Events['workflow/agent-start']} by
173
+ * `agent.seq`, exactly once per started call on every stop path — on an
174
+ * engine termination path (a worker killed past its grace) the end is
175
+ * engine-synthesized with outcome `'cancelled'`.
176
+ * @param info - the run's identity snapshot.
177
+ * @param agent - the call identity plus its outcome.
178
+ * @mode emit
179
+ */
180
+ 'workflow/agent-end'(info: WorkflowRunInfo, agent: WorkflowAgentEndInfo): void
181
+ ```
182
+
183
+ Source: [`packages/workflow/workflow/src/index.ts:79`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/workflow/src/index.ts)
184
+
185
+ <a id="workflowagent-start--emit"></a>
186
+
187
+ #### `workflow/agent-start` — emit
188
+
189
+ One `agent()` call established a published child run. Paired with Events['workflow/agent-end'] by `agent.seq`. A call that never receives a published run from the provider emits neither event in this pair.
190
+
191
+ ```ts cordis-catalog
192
+ /**
193
+ * One `agent()` call established a published child run. Paired with
194
+ * {@link Events['workflow/agent-end']} by `agent.seq`. A call that never
195
+ * receives a published run from the provider emits neither
196
+ * event in this pair.
197
+ * @param info - the run's identity snapshot.
198
+ * @param agent - the call's sequence number, label, phase, and child id.
199
+ * @mode emit
200
+ */
201
+ 'workflow/agent-start'(info: WorkflowRunInfo, agent: WorkflowAgentInfo): void
202
+ ```
203
+
204
+ Source: [`packages/workflow/workflow/src/index.ts:68`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/workflow/src/index.ts)
205
+
206
+ <a id="workflowend--emit"></a>
207
+
208
+ #### `workflow/end` — emit
209
+
210
+ A workflow run settled (any stop reason). Fired when WorkflowRun.result resolves. Paired with Events['workflow/start'].
211
+
212
+ ```ts cordis-catalog
213
+ /**
214
+ * A workflow run settled (any stop reason). Fired when
215
+ * {@link WorkflowRun.result} resolves. Paired with
216
+ * {@link Events['workflow/start']}.
217
+ * @param info - the run's identity snapshot.
218
+ * @param result - the outcome data (stop reason, error, agent count) —
219
+ * deliberately WITHOUT the result value (see {@link WorkflowResultInfo}).
220
+ * @mode emit
221
+ */
222
+ 'workflow/end'(info: WorkflowRunInfo, result: WorkflowResultInfo): void
223
+ ```
224
+
225
+ Source: [`packages/workflow/workflow/src/index.ts:89`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/workflow/src/index.ts)
226
+
227
+ <a id="workflowlog--emit"></a>
228
+
229
+ #### `workflow/log` — emit
230
+
231
+ The script emitted a narration line (a `log(message)` call).
232
+
233
+ ```ts cordis-catalog
234
+ /**
235
+ * The script emitted a narration line (a `log(message)` call).
236
+ * @param info - the run's identity snapshot.
237
+ * @param message - the logged message, verbatim.
238
+ * @mode emit
239
+ */
240
+ 'workflow/log'(info: WorkflowRunInfo, message: string): void
241
+ ```
242
+
243
+ Source: [`packages/workflow/workflow/src/index.ts:58`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/workflow/src/index.ts)
244
+
245
+ <a id="workflowphase--emit"></a>
246
+
247
+ #### `workflow/phase` — emit
248
+
249
+ The script entered a phase (a `phase(title)` call) — progress grouping for observers; no execution semantics.
250
+
251
+ ```ts cordis-catalog
252
+ /**
253
+ * The script entered a phase (a `phase(title)` call) — progress grouping
254
+ * for observers; no execution semantics.
255
+ * @param info - the run's identity snapshot.
256
+ * @param title - the phase title, verbatim.
257
+ * @mode emit
258
+ */
259
+ 'workflow/phase'(info: WorkflowRunInfo, title: string): void
260
+ ```
261
+
262
+ Source: [`packages/workflow/workflow/src/index.ts:51`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/workflow/src/index.ts)
263
+
264
+ <a id="workflowstart--emit"></a>
265
+
266
+ #### `workflow/start` — emit
267
+
268
+ A workflow run started — the script's meta block validated, the body about to execute. Paired with Events['workflow/end'].
269
+
270
+ ```ts cordis-catalog
271
+ /**
272
+ * A workflow run started — the script's meta block validated, the body
273
+ * about to execute. Paired with {@link Events['workflow/end']}.
274
+ * @param info - the run's identity snapshot (id + meta).
275
+ * @mode emit
276
+ */
277
+ 'workflow/start'(info: WorkflowRunInfo): void
278
+ ```
279
+
280
+ Source: [`packages/workflow/workflow/src/index.ts:43`](https://github.com/deepseek-ai/deepseek-harness/blob/master/packages/workflow/workflow/src/index.ts)
281
+ <!-- END GENERATED cordis-surface -->