dsh-plugin-guide 0.1.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 (374) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE.md +26 -0
  3. package/README.es.md +139 -0
  4. package/README.hi.md +138 -0
  5. package/README.md +165 -0
  6. package/README.pt.md +139 -0
  7. package/README.zh-CN.md +164 -0
  8. package/SKILL.md +69 -0
  9. package/cordis.patch.yml +4 -0
  10. package/guide/links.md +92 -0
  11. package/guide/plugin-dev-guide.md +429 -0
  12. package/guide/quick-reference.es.md +176 -0
  13. package/guide/quick-reference.hi.md +176 -0
  14. package/guide/quick-reference.md +176 -0
  15. package/guide/quick-reference.pt.md +176 -0
  16. package/guide/quick-reference.zh-CN.md +175 -0
  17. package/index.js +58 -0
  18. package/package.json +83 -0
  19. package/references/community-ecosystem.md +201 -0
  20. package/references/community-repo-deep-dive.md +695 -0
  21. package/references/cordis-paper-and-community.md +326 -0
  22. package/references/harness-repo.md +654 -0
  23. package/references/official-docs/AGENTS.md +149 -0
  24. package/references/official-docs/BENCHMARK.md +3 -0
  25. package/references/official-docs/CLAUDE.md +1 -0
  26. package/references/official-docs/CONTRIBUTING.i18n.yaml +6 -0
  27. package/references/official-docs/CONTRIBUTING.md +23 -0
  28. package/references/official-docs/CONTRIBUTING.zh.md +23 -0
  29. package/references/official-docs/LICENSE +21 -0
  30. package/references/official-docs/README.i18n.yaml +6 -0
  31. package/references/official-docs/README.md +35 -0
  32. package/references/official-docs/README.zh.md +74 -0
  33. package/references/official-docs/SNAPSHOT.md +16 -0
  34. package/references/official-docs/THIRD_PARTY_NOTICES.md +192 -0
  35. package/references/official-docs/docs/AGENTS.md +75 -0
  36. package/references/official-docs/docs/agent-lifecycle.i18n.yaml +6 -0
  37. package/references/official-docs/docs/agent-lifecycle.md +82 -0
  38. package/references/official-docs/docs/agent-lifecycle.zh.md +84 -0
  39. package/references/official-docs/docs/api-gateway.i18n.yaml +6 -0
  40. package/references/official-docs/docs/api-gateway.md +164 -0
  41. package/references/official-docs/docs/api-gateway.zh.md +164 -0
  42. package/references/official-docs/docs/architecture.i18n.yaml +6 -0
  43. package/references/official-docs/docs/architecture.md +129 -0
  44. package/references/official-docs/docs/architecture.zh.md +133 -0
  45. package/references/official-docs/docs/capability-seams.i18n.yaml +6 -0
  46. package/references/official-docs/docs/capability-seams.md +471 -0
  47. package/references/official-docs/docs/capability-seams.zh.md +473 -0
  48. package/references/official-docs/docs/config-catalog.i18n.yaml +6 -0
  49. package/references/official-docs/docs/config-catalog.md +3151 -0
  50. package/references/official-docs/docs/config-catalog.zh.md +3152 -0
  51. package/references/official-docs/docs/cookbook/adding-a-conversation-node.i18n.yaml +6 -0
  52. package/references/official-docs/docs/cookbook/adding-a-conversation-node.md +233 -0
  53. package/references/official-docs/docs/cookbook/adding-a-conversation-node.zh.md +233 -0
  54. package/references/official-docs/docs/cookbook/adding-a-package.i18n.yaml +6 -0
  55. package/references/official-docs/docs/cookbook/adding-a-package.md +118 -0
  56. package/references/official-docs/docs/cookbook/adding-a-package.zh.md +118 -0
  57. package/references/official-docs/docs/cookbook/adding-a-tool.i18n.yaml +6 -0
  58. package/references/official-docs/docs/cookbook/adding-a-tool.md +94 -0
  59. package/references/official-docs/docs/cookbook/adding-a-tool.zh.md +96 -0
  60. package/references/official-docs/docs/cookbook/adding-a-vendored-package.i18n.yaml +6 -0
  61. package/references/official-docs/docs/cookbook/adding-a-vendored-package.md +59 -0
  62. package/references/official-docs/docs/cookbook/adding-a-vendored-package.zh.md +59 -0
  63. package/references/official-docs/docs/cookbook/adding-an-llm-adapter.i18n.yaml +6 -0
  64. package/references/official-docs/docs/cookbook/adding-an-llm-adapter.md +43 -0
  65. package/references/official-docs/docs/cookbook/adding-an-llm-adapter.zh.md +43 -0
  66. package/references/official-docs/docs/cookbook/extension-cookbook.i18n.yaml +6 -0
  67. package/references/official-docs/docs/cookbook/extension-cookbook.md +129 -0
  68. package/references/official-docs/docs/cookbook/extension-cookbook.zh.md +131 -0
  69. package/references/official-docs/docs/cookbook/maintaining-dsh-code-review.i18n.yaml +6 -0
  70. package/references/official-docs/docs/cookbook/maintaining-dsh-code-review.md +64 -0
  71. package/references/official-docs/docs/cookbook/maintaining-dsh-code-review.zh.md +64 -0
  72. package/references/official-docs/docs/cookbook/responding-to-pr-review-on-a-stack.i18n.yaml +6 -0
  73. package/references/official-docs/docs/cookbook/responding-to-pr-review-on-a-stack.md +32 -0
  74. package/references/official-docs/docs/cookbook/responding-to-pr-review-on-a-stack.zh.md +32 -0
  75. package/references/official-docs/docs/cordis-api/context.i18n.yaml +6 -0
  76. package/references/official-docs/docs/cordis-api/context.md +364 -0
  77. package/references/official-docs/docs/cordis-api/context.zh.md +366 -0
  78. package/references/official-docs/docs/cordis-api/events.i18n.yaml +6 -0
  79. package/references/official-docs/docs/cordis-api/events.md +207 -0
  80. package/references/official-docs/docs/cordis-api/events.zh.md +209 -0
  81. package/references/official-docs/docs/cordis-api/fiber.i18n.yaml +6 -0
  82. package/references/official-docs/docs/cordis-api/fiber.md +375 -0
  83. package/references/official-docs/docs/cordis-api/fiber.zh.md +377 -0
  84. package/references/official-docs/docs/cordis-api/inherited.md +39 -0
  85. package/references/official-docs/docs/cordis-api/registry.i18n.yaml +6 -0
  86. package/references/official-docs/docs/cordis-api/registry.md +152 -0
  87. package/references/official-docs/docs/cordis-api/registry.zh.md +154 -0
  88. package/references/official-docs/docs/cordis-api/service.i18n.yaml +6 -0
  89. package/references/official-docs/docs/cordis-api/service.md +102 -0
  90. package/references/official-docs/docs/cordis-api/service.zh.md +104 -0
  91. package/references/official-docs/docs/cordis-primer.i18n.yaml +6 -0
  92. package/references/official-docs/docs/cordis-primer.md +44 -0
  93. package/references/official-docs/docs/cordis-primer.zh.md +50 -0
  94. package/references/official-docs/docs/cordis-tutorial/01-first-plugin.i18n.yaml +6 -0
  95. package/references/official-docs/docs/cordis-tutorial/01-first-plugin.md +95 -0
  96. package/references/official-docs/docs/cordis-tutorial/01-first-plugin.zh.md +95 -0
  97. package/references/official-docs/docs/cordis-tutorial/02-lifecycle-and-effects.i18n.yaml +6 -0
  98. package/references/official-docs/docs/cordis-tutorial/02-lifecycle-and-effects.md +98 -0
  99. package/references/official-docs/docs/cordis-tutorial/02-lifecycle-and-effects.zh.md +98 -0
  100. package/references/official-docs/docs/cordis-tutorial/03-services.i18n.yaml +6 -0
  101. package/references/official-docs/docs/cordis-tutorial/03-services.md +98 -0
  102. package/references/official-docs/docs/cordis-tutorial/03-services.zh.md +98 -0
  103. package/references/official-docs/docs/cordis-tutorial/04-events.i18n.yaml +6 -0
  104. package/references/official-docs/docs/cordis-tutorial/04-events.md +144 -0
  105. package/references/official-docs/docs/cordis-tutorial/04-events.zh.md +144 -0
  106. package/references/official-docs/docs/cordis-tutorial/05-config.i18n.yaml +6 -0
  107. package/references/official-docs/docs/cordis-tutorial/05-config.md +84 -0
  108. package/references/official-docs/docs/cordis-tutorial/05-config.zh.md +84 -0
  109. package/references/official-docs/docs/cordis-tutorial/06-composition-and-hmr.i18n.yaml +6 -0
  110. package/references/official-docs/docs/cordis-tutorial/06-composition-and-hmr.md +113 -0
  111. package/references/official-docs/docs/cordis-tutorial/06-composition-and-hmr.zh.md +113 -0
  112. package/references/official-docs/docs/cordis-tutorial/07-into-the-harness.i18n.yaml +6 -0
  113. package/references/official-docs/docs/cordis-tutorial/07-into-the-harness.md +107 -0
  114. package/references/official-docs/docs/cordis-tutorial/07-into-the-harness.zh.md +107 -0
  115. package/references/official-docs/docs/cordis-tutorial/index.i18n.yaml +6 -0
  116. package/references/official-docs/docs/cordis-tutorial/index.md +60 -0
  117. package/references/official-docs/docs/cordis-tutorial/index.zh.md +62 -0
  118. package/references/official-docs/docs/defensive-patterns.i18n.yaml +6 -0
  119. package/references/official-docs/docs/defensive-patterns.md +33 -0
  120. package/references/official-docs/docs/defensive-patterns.zh.md +33 -0
  121. package/references/official-docs/docs/development.i18n.yaml +6 -0
  122. package/references/official-docs/docs/development.md +171 -0
  123. package/references/official-docs/docs/development.zh.md +171 -0
  124. package/references/official-docs/docs/event-producer-consumer.i18n.yaml +6 -0
  125. package/references/official-docs/docs/event-producer-consumer.md +76 -0
  126. package/references/official-docs/docs/event-producer-consumer.zh.md +78 -0
  127. package/references/official-docs/docs/glossary.i18n.yaml +6 -0
  128. package/references/official-docs/docs/glossary.md +45 -0
  129. package/references/official-docs/docs/glossary.zh.md +45 -0
  130. package/references/official-docs/docs/graph-atlas.i18n.yaml +6 -0
  131. package/references/official-docs/docs/graph-atlas.md +24 -0
  132. package/references/official-docs/docs/graph-atlas.zh.md +26 -0
  133. package/references/official-docs/docs/i18n/README.i18n.yaml +6 -0
  134. package/references/official-docs/docs/i18n/README.md +60 -0
  135. package/references/official-docs/docs/i18n/README.zh.md +60 -0
  136. package/references/official-docs/docs/i18n/style-samples.md +87 -0
  137. package/references/official-docs/docs/i18n/terminology.md +214 -0
  138. package/references/official-docs/docs/i18n/translation-prompt.md +263 -0
  139. package/references/official-docs/docs/i18n/translation-rules.i18n.yaml +6 -0
  140. package/references/official-docs/docs/i18n/translation-rules.md +69 -0
  141. package/references/official-docs/docs/i18n/translation-rules.zh.md +69 -0
  142. package/references/official-docs/docs/module-graph.i18n.yaml +6 -0
  143. package/references/official-docs/docs/module-graph.md +1638 -0
  144. package/references/official-docs/docs/module-graph.zh.md +1640 -0
  145. package/references/official-docs/docs/persistence-catalog.i18n.yaml +6 -0
  146. package/references/official-docs/docs/persistence-catalog.md +944 -0
  147. package/references/official-docs/docs/persistence-catalog.zh.md +946 -0
  148. package/references/official-docs/docs/postmortem/0001-acp-default-export-drops-inject.i18n.yaml +6 -0
  149. package/references/official-docs/docs/postmortem/0001-acp-default-export-drops-inject.md +113 -0
  150. package/references/official-docs/docs/postmortem/0001-acp-default-export-drops-inject.zh.md +113 -0
  151. package/references/official-docs/docs/postmortem/0002-js-expression-disabled-filesystem-tools.i18n.yaml +6 -0
  152. package/references/official-docs/docs/postmortem/0002-js-expression-disabled-filesystem-tools.md +47 -0
  153. package/references/official-docs/docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +47 -0
  154. package/references/official-docs/docs/postmortem/0003-web-agent-gui-feedback-loop.i18n.yaml +6 -0
  155. package/references/official-docs/docs/postmortem/0003-web-agent-gui-feedback-loop.md +53 -0
  156. package/references/official-docs/docs/postmortem/0003-web-agent-gui-feedback-loop.zh.md +53 -0
  157. package/references/official-docs/docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.i18n.yaml +6 -0
  158. package/references/official-docs/docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +55 -0
  159. package/references/official-docs/docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +55 -0
  160. package/references/official-docs/docs/postmortem/README.i18n.yaml +6 -0
  161. package/references/official-docs/docs/postmortem/README.md +18 -0
  162. package/references/official-docs/docs/postmortem/README.zh.md +18 -0
  163. package/references/official-docs/docs/rescope.i18n.yaml +6 -0
  164. package/references/official-docs/docs/rescope.md +53 -0
  165. package/references/official-docs/docs/rescope.zh.md +53 -0
  166. package/references/official-docs/docs/subsystems/README.i18n.yaml +6 -0
  167. package/references/official-docs/docs/subsystems/README.md +55 -0
  168. package/references/official-docs/docs/subsystems/README.zh.md +55 -0
  169. package/references/official-docs/docs/subsystems/approval.i18n.yaml +6 -0
  170. package/references/official-docs/docs/subsystems/approval.md +170 -0
  171. package/references/official-docs/docs/subsystems/approval.zh.md +170 -0
  172. package/references/official-docs/docs/subsystems/attachment.i18n.yaml +6 -0
  173. package/references/official-docs/docs/subsystems/attachment.md +115 -0
  174. package/references/official-docs/docs/subsystems/attachment.zh.md +115 -0
  175. package/references/official-docs/docs/subsystems/client-modules.i18n.yaml +6 -0
  176. package/references/official-docs/docs/subsystems/client-modules.md +118 -0
  177. package/references/official-docs/docs/subsystems/client-modules.zh.md +118 -0
  178. package/references/official-docs/docs/subsystems/code-runtime.i18n.yaml +6 -0
  179. package/references/official-docs/docs/subsystems/code-runtime.md +191 -0
  180. package/references/official-docs/docs/subsystems/code-runtime.zh.md +191 -0
  181. package/references/official-docs/docs/subsystems/commands.i18n.yaml +6 -0
  182. package/references/official-docs/docs/subsystems/commands.md +187 -0
  183. package/references/official-docs/docs/subsystems/commands.zh.md +187 -0
  184. package/references/official-docs/docs/subsystems/compaction.i18n.yaml +6 -0
  185. package/references/official-docs/docs/subsystems/compaction.md +238 -0
  186. package/references/official-docs/docs/subsystems/compaction.zh.md +238 -0
  187. package/references/official-docs/docs/subsystems/core.i18n.yaml +6 -0
  188. package/references/official-docs/docs/subsystems/core.md +1070 -0
  189. package/references/official-docs/docs/subsystems/core.zh.md +1078 -0
  190. package/references/official-docs/docs/subsystems/credentials.i18n.yaml +6 -0
  191. package/references/official-docs/docs/subsystems/credentials.md +133 -0
  192. package/references/official-docs/docs/subsystems/credentials.zh.md +133 -0
  193. package/references/official-docs/docs/subsystems/extensions.i18n.yaml +6 -0
  194. package/references/official-docs/docs/subsystems/extensions.md +364 -0
  195. package/references/official-docs/docs/subsystems/extensions.zh.md +364 -0
  196. package/references/official-docs/docs/subsystems/feedback.i18n.yaml +6 -0
  197. package/references/official-docs/docs/subsystems/feedback.md +266 -0
  198. package/references/official-docs/docs/subsystems/feedback.zh.md +266 -0
  199. package/references/official-docs/docs/subsystems/filesystem.i18n.yaml +6 -0
  200. package/references/official-docs/docs/subsystems/filesystem.md +495 -0
  201. package/references/official-docs/docs/subsystems/filesystem.zh.md +495 -0
  202. package/references/official-docs/docs/subsystems/goal.i18n.yaml +6 -0
  203. package/references/official-docs/docs/subsystems/goal.md +277 -0
  204. package/references/official-docs/docs/subsystems/goal.zh.md +277 -0
  205. package/references/official-docs/docs/subsystems/invariants.i18n.yaml +6 -0
  206. package/references/official-docs/docs/subsystems/invariants.md +88 -0
  207. package/references/official-docs/docs/subsystems/invariants.zh.md +88 -0
  208. package/references/official-docs/docs/subsystems/jobs.i18n.yaml +6 -0
  209. package/references/official-docs/docs/subsystems/jobs.md +290 -0
  210. package/references/official-docs/docs/subsystems/jobs.zh.md +290 -0
  211. package/references/official-docs/docs/subsystems/llm-streaming.i18n.yaml +6 -0
  212. package/references/official-docs/docs/subsystems/llm-streaming.md +888 -0
  213. package/references/official-docs/docs/subsystems/llm-streaming.zh.md +894 -0
  214. package/references/official-docs/docs/subsystems/lsp.i18n.yaml +6 -0
  215. package/references/official-docs/docs/subsystems/lsp.md +202 -0
  216. package/references/official-docs/docs/subsystems/lsp.zh.md +202 -0
  217. package/references/official-docs/docs/subsystems/permission-presets.i18n.yaml +6 -0
  218. package/references/official-docs/docs/subsystems/permission-presets.md +131 -0
  219. package/references/official-docs/docs/subsystems/permission-presets.zh.md +131 -0
  220. package/references/official-docs/docs/subsystems/persistence.i18n.yaml +6 -0
  221. package/references/official-docs/docs/subsystems/persistence.md +385 -0
  222. package/references/official-docs/docs/subsystems/persistence.zh.md +385 -0
  223. package/references/official-docs/docs/subsystems/plan.i18n.yaml +6 -0
  224. package/references/official-docs/docs/subsystems/plan.md +87 -0
  225. package/references/official-docs/docs/subsystems/plan.zh.md +87 -0
  226. package/references/official-docs/docs/subsystems/sandbox.i18n.yaml +6 -0
  227. package/references/official-docs/docs/subsystems/sandbox.md +218 -0
  228. package/references/official-docs/docs/subsystems/sandbox.zh.md +218 -0
  229. package/references/official-docs/docs/subsystems/schedule.i18n.yaml +6 -0
  230. package/references/official-docs/docs/subsystems/schedule.md +186 -0
  231. package/references/official-docs/docs/subsystems/schedule.zh.md +186 -0
  232. package/references/official-docs/docs/subsystems/scope.i18n.yaml +6 -0
  233. package/references/official-docs/docs/subsystems/scope.md +59 -0
  234. package/references/official-docs/docs/subsystems/scope.zh.md +59 -0
  235. package/references/official-docs/docs/subsystems/session-projection.i18n.yaml +6 -0
  236. package/references/official-docs/docs/subsystems/session-projection.md +262 -0
  237. package/references/official-docs/docs/subsystems/session-projection.zh.md +262 -0
  238. package/references/official-docs/docs/subsystems/session-query.i18n.yaml +6 -0
  239. package/references/official-docs/docs/subsystems/session-query.md +495 -0
  240. package/references/official-docs/docs/subsystems/session-query.zh.md +495 -0
  241. package/references/official-docs/docs/subsystems/session-reference.i18n.yaml +6 -0
  242. package/references/official-docs/docs/subsystems/session-reference.md +108 -0
  243. package/references/official-docs/docs/subsystems/session-reference.zh.md +108 -0
  244. package/references/official-docs/docs/subsystems/session-telemetry.i18n.yaml +6 -0
  245. package/references/official-docs/docs/subsystems/session-telemetry.md +194 -0
  246. package/references/official-docs/docs/subsystems/session-telemetry.zh.md +194 -0
  247. package/references/official-docs/docs/subsystems/session-title.i18n.yaml +6 -0
  248. package/references/official-docs/docs/subsystems/session-title.md +204 -0
  249. package/references/official-docs/docs/subsystems/session-title.zh.md +204 -0
  250. package/references/official-docs/docs/subsystems/session.i18n.yaml +6 -0
  251. package/references/official-docs/docs/subsystems/session.md +849 -0
  252. package/references/official-docs/docs/subsystems/session.zh.md +851 -0
  253. package/references/official-docs/docs/subsystems/settings.i18n.yaml +6 -0
  254. package/references/official-docs/docs/subsystems/settings.md +310 -0
  255. package/references/official-docs/docs/subsystems/settings.zh.md +310 -0
  256. package/references/official-docs/docs/subsystems/shell.i18n.yaml +6 -0
  257. package/references/official-docs/docs/subsystems/shell.md +303 -0
  258. package/references/official-docs/docs/subsystems/shell.zh.md +303 -0
  259. package/references/official-docs/docs/subsystems/skills.i18n.yaml +6 -0
  260. package/references/official-docs/docs/subsystems/skills.md +331 -0
  261. package/references/official-docs/docs/subsystems/skills.zh.md +331 -0
  262. package/references/official-docs/docs/subsystems/spill.i18n.yaml +6 -0
  263. package/references/official-docs/docs/subsystems/spill.md +117 -0
  264. package/references/official-docs/docs/subsystems/spill.zh.md +117 -0
  265. package/references/official-docs/docs/subsystems/storage.i18n.yaml +6 -0
  266. package/references/official-docs/docs/subsystems/storage.md +229 -0
  267. package/references/official-docs/docs/subsystems/storage.zh.md +229 -0
  268. package/references/official-docs/docs/subsystems/subagent.i18n.yaml +6 -0
  269. package/references/official-docs/docs/subsystems/subagent.md +734 -0
  270. package/references/official-docs/docs/subsystems/subagent.zh.md +736 -0
  271. package/references/official-docs/docs/subsystems/subprocess.i18n.yaml +6 -0
  272. package/references/official-docs/docs/subsystems/subprocess.md +324 -0
  273. package/references/official-docs/docs/subsystems/subprocess.zh.md +324 -0
  274. package/references/official-docs/docs/subsystems/system-prompt.i18n.yaml +6 -0
  275. package/references/official-docs/docs/subsystems/system-prompt.md +207 -0
  276. package/references/official-docs/docs/subsystems/system-prompt.zh.md +207 -0
  277. package/references/official-docs/docs/subsystems/terminal.i18n.yaml +6 -0
  278. package/references/official-docs/docs/subsystems/terminal.md +184 -0
  279. package/references/official-docs/docs/subsystems/terminal.zh.md +184 -0
  280. package/references/official-docs/docs/subsystems/token-meter.i18n.yaml +6 -0
  281. package/references/official-docs/docs/subsystems/token-meter.md +90 -0
  282. package/references/official-docs/docs/subsystems/token-meter.zh.md +90 -0
  283. package/references/official-docs/docs/subsystems/tools.i18n.yaml +6 -0
  284. package/references/official-docs/docs/subsystems/tools.md +720 -0
  285. package/references/official-docs/docs/subsystems/tools.zh.md +720 -0
  286. package/references/official-docs/docs/subsystems/typert.i18n.yaml +6 -0
  287. package/references/official-docs/docs/subsystems/typert.md +336 -0
  288. package/references/official-docs/docs/subsystems/typert.zh.md +336 -0
  289. package/references/official-docs/docs/subsystems/user-questions.i18n.yaml +6 -0
  290. package/references/official-docs/docs/subsystems/user-questions.md +178 -0
  291. package/references/official-docs/docs/subsystems/user-questions.zh.md +178 -0
  292. package/references/official-docs/docs/subsystems/web-server.i18n.yaml +6 -0
  293. package/references/official-docs/docs/subsystems/web-server.md +108 -0
  294. package/references/official-docs/docs/subsystems/web-server.zh.md +108 -0
  295. package/references/official-docs/docs/subsystems/web.i18n.yaml +6 -0
  296. package/references/official-docs/docs/subsystems/web.md +199 -0
  297. package/references/official-docs/docs/subsystems/web.zh.md +199 -0
  298. package/references/official-docs/docs/subsystems/workflow.i18n.yaml +6 -0
  299. package/references/official-docs/docs/subsystems/workflow.md +278 -0
  300. package/references/official-docs/docs/subsystems/workflow.zh.md +278 -0
  301. package/references/official-docs/docs/subsystems/workspace.i18n.yaml +6 -0
  302. package/references/official-docs/docs/subsystems/workspace.md +228 -0
  303. package/references/official-docs/docs/subsystems/workspace.zh.md +228 -0
  304. package/references/official-docs/docs/testing.i18n.yaml +6 -0
  305. package/references/official-docs/docs/testing.md +49 -0
  306. package/references/official-docs/docs/testing.zh.md +49 -0
  307. package/references/official-docs/docs/tool-catalog.i18n.yaml +6 -0
  308. package/references/official-docs/docs/tool-catalog.md +1873 -0
  309. package/references/official-docs/docs/tool-catalog.zh.md +1878 -0
  310. package/references/official-docs/docs/tool-execution-pipeline.i18n.yaml +6 -0
  311. package/references/official-docs/docs/tool-execution-pipeline.md +62 -0
  312. package/references/official-docs/docs/tool-execution-pipeline.zh.md +64 -0
  313. package/references/official-docs/docs/user/develop/basic/config.i18n.yaml +6 -0
  314. package/references/official-docs/docs/user/develop/basic/config.md +106 -0
  315. package/references/official-docs/docs/user/develop/basic/config.zh.md +106 -0
  316. package/references/official-docs/docs/user/develop/basic/index.i18n.yaml +6 -0
  317. package/references/official-docs/docs/user/develop/basic/index.md +144 -0
  318. package/references/official-docs/docs/user/develop/basic/index.zh.md +144 -0
  319. package/references/official-docs/docs/user/develop/basic/publish.i18n.yaml +6 -0
  320. package/references/official-docs/docs/user/develop/basic/publish.md +183 -0
  321. package/references/official-docs/docs/user/develop/basic/publish.zh.md +183 -0
  322. package/references/official-docs/docs/user/develop/basic/tool.i18n.yaml +6 -0
  323. package/references/official-docs/docs/user/develop/basic/tool.md +52 -0
  324. package/references/official-docs/docs/user/develop/basic/tool.zh.md +52 -0
  325. package/references/official-docs/docs/user/develop/framework/events.i18n.yaml +6 -0
  326. package/references/official-docs/docs/user/develop/framework/events.md +143 -0
  327. package/references/official-docs/docs/user/develop/framework/events.zh.md +143 -0
  328. package/references/official-docs/docs/user/develop/framework/index.i18n.yaml +6 -0
  329. package/references/official-docs/docs/user/develop/framework/index.md +137 -0
  330. package/references/official-docs/docs/user/develop/framework/index.zh.md +137 -0
  331. package/references/official-docs/docs/user/develop/framework/service.i18n.yaml +6 -0
  332. package/references/official-docs/docs/user/develop/framework/service.md +148 -0
  333. package/references/official-docs/docs/user/develop/framework/service.zh.md +150 -0
  334. package/references/official-docs/docs/user/develop/practice/index.i18n.yaml +6 -0
  335. package/references/official-docs/docs/user/develop/practice/index.md +155 -0
  336. package/references/official-docs/docs/user/develop/practice/index.zh.md +155 -0
  337. package/references/official-docs/docs/user/develop/practice/llm-adapter.i18n.yaml +6 -0
  338. package/references/official-docs/docs/user/develop/practice/llm-adapter.md +188 -0
  339. package/references/official-docs/docs/user/develop/practice/llm-adapter.zh.md +188 -0
  340. package/references/official-docs/docs/user/guide/index.i18n.yaml +6 -0
  341. package/references/official-docs/docs/user/guide/index.md +30 -0
  342. package/references/official-docs/docs/user/guide/index.zh.md +30 -0
  343. package/references/official-docs/docs/user/guide/providers-custom-form.png +0 -0
  344. package/references/official-docs/docs/user/guide/providers-custom-form.zh.png +0 -0
  345. package/references/official-docs/docs/user/guide/providers-models-page.png +0 -0
  346. package/references/official-docs/docs/user/guide/providers-models-page.zh.png +0 -0
  347. package/references/official-docs/docs/user/guide/providers.i18n.yaml +6 -0
  348. package/references/official-docs/docs/user/guide/providers.md +98 -0
  349. package/references/official-docs/docs/user/guide/providers.zh.md +98 -0
  350. package/references/official-docs/docs/user/guide/python-sdk.i18n.yaml +6 -0
  351. package/references/official-docs/docs/user/guide/python-sdk.md +104 -0
  352. package/references/official-docs/docs/user/guide/python-sdk.zh.md +104 -0
  353. package/references/official-docs/docs/user/index.i18n.yaml +6 -0
  354. package/references/official-docs/docs/user/index.md +11 -0
  355. package/references/official-docs/docs/user/index.zh.md +11 -0
  356. package/references/official-docs/docs/web-styling.i18n.yaml +6 -0
  357. package/references/official-docs/docs/web-styling.md +25 -0
  358. package/references/official-docs/docs/web-styling.zh.md +25 -0
  359. package/references/official-docs/examples/AGENTS.md +20 -0
  360. package/references/official-docs/packages/AGENTS.md +27 -0
  361. package/references/official-docs/packages/README.md +69 -0
  362. package/references/official-docs/vendor/README.md +60 -0
  363. package/references/official-docs/website-docs.ts +524 -0
  364. package/references/sources.md +137 -0
  365. package/references/upstream-cordis.md +594 -0
  366. package/references/website-pages.md +668 -0
  367. package/scripts/archive-discussions.ps1 +154 -0
  368. package/scripts/download-community-articles.ps1 +188 -0
  369. package/scripts/download-community-repos.ps1 +232 -0
  370. package/scripts/download-sources.ps1 +195 -0
  371. package/scripts/gen-topic-snapshot.ps1 +91 -0
  372. package/scripts/install-skill.ps1 +63 -0
  373. package/scripts/sync-official-docs.ps1 +130 -0
  374. package/scripts/verify-kit.ps1 +191 -0
@@ -0,0 +1,143 @@
1
+ # 事件系统
2
+
3
+ [English](events.md) | 中文
4
+
5
+ 事件是 Cordis 插件间通信的核心机制。Harness 大量使用事件来实现松耦合的扩展点。
6
+
7
+ ## 基本用法
8
+
9
+ ### 监听事件
10
+
11
+ ```ts ignore-check
12
+ ctx.on('event-name', (payload) => {
13
+ // Handle the event.
14
+ })
15
+ ```
16
+
17
+ ### 触发事件
18
+
19
+ ```ts ignore-check
20
+ ctx.emit('event-name', payload)
21
+ ```
22
+
23
+ ## 事件模式
24
+
25
+ Cordis 提供多种事件模式,适用于不同的交互契约:
26
+
27
+ ### emit — 广播
28
+
29
+ 所有监听器同步执行,返回值会被忽略:
30
+
31
+ ```ts ignore-check
32
+ // Emit
33
+ ctx.emit('my-plugin/ready', { id: 'worker-1' })
34
+
35
+ // Listen
36
+ ctx.on('my-plugin/ready', ({ id }) => {
37
+ console.log(`${id} is ready`)
38
+ })
39
+ ```
40
+
41
+ ### bail — 短路
42
+
43
+ 监听器按顺序运行,第一个不是 `null`、`false` 或 `undefined` 的返回值会成为最终结果:
44
+
45
+ ```ts ignore-check
46
+ // Dispatch
47
+ const result = ctx.bail('some-check', input)
48
+
49
+ // Listen: a returned value stops later listeners.
50
+ ctx.on('some-check', (input) => {
51
+ if (shouldBlock(input)) return 'blocked'
52
+ // Return null, false, or undefined to continue to the next listener.
53
+ })
54
+ ```
55
+
56
+ ### serial — 顺序执行
57
+
58
+ 监听器按注册顺序依次执行,并等待异步结果;第一个不是 `null`、`false` 或 `undefined` 的返回值会终止后续执行:
59
+
60
+ ```ts ignore-check
61
+ await ctx.serial('setup-phase', context)
62
+ ```
63
+
64
+ ### waterfall(瀑布式事件)— 流水线
65
+
66
+ 每个监听器可以包装下游返回值,形成处理链。**必须调用 `next()` 传递给下游**,不调用即会短路流水线:
67
+
68
+ ```ts ignore-check
69
+ // Dispatch
70
+ const output = await ctx.waterfall('my-plugin/transform', input, async () => input)
71
+
72
+ // Listen: next() is mandatory.
73
+ ctx.on('my-plugin/transform', async (_input, next) => {
74
+ const downstream = await next()
75
+ return downstream.trim()
76
+ })
77
+ ```
78
+
79
+ ::: warning
80
+ waterfall 监听器**必须调用 `next()`**。不调用 `next` 会短路整个流水线,这是故意为之的设计——用于实现拦截/网关逻辑。
81
+ :::
82
+
83
+ ## 类型安全的事件
84
+
85
+ Harness 使用 TypeScript 声明合并来为事件提供类型安全:
86
+
87
+ ```ts
88
+ import '@deepseek-ai/cordis'
89
+
90
+ declare module '@deepseek-ai/cordis' {
91
+ interface Events {
92
+ 'my-plugin/ready': (payload: { id: string }) => void
93
+ 'my-plugin/check': (input: string) => boolean | undefined
94
+ 'my-plugin/transform': (input: string, next: () => Promise<string>) => Promise<string>
95
+ }
96
+ }
97
+
98
+ // ctx.on('my-plugin/ready', ...) and ctx.emit('my-plugin/ready', ...)
99
+ // are now inferred correctly.
100
+ ```
101
+
102
+ ## Cordis 事件与会话记录
103
+
104
+ Harness 的 Cordis 事件遵循 `namespace/action` 命名,例如 `agent/step`、`agent/request`、`agent/request-error`、`tools/result` 和 `session/event`。完整签名与触发模式见[子系统页面](../../../subsystems/core.md)上生成的 `cordis-surface` 区块。
105
+
106
+ `turn/*`、`step/*`、`tool/call`、`tool/result` 和 `compaction/*` 是持久化的会话事件类型,不是同名 Cordis 事件。需要观察它们时,监听 `session/event` 并检查 `event.type`。
107
+
108
+ ## 事件监听器也是效果
109
+
110
+ 通过 `ctx.on()` 注册的监听器会在插件卸载时自动移除:
111
+
112
+ ```ts ignore-check
113
+ export function apply(ctx: Context) {
114
+ // This listener is removed when the plugin disposes.
115
+ ctx.on('tools/result', handler)
116
+ }
117
+ ```
118
+
119
+ ## 示例:日志插件
120
+
121
+ 这个插件记录工具调用和工具结果:
122
+
123
+ ```ts
124
+ import type { Context } from '@deepseek-ai/cordis'
125
+ import '@deepseek-ai/dsh-tools'
126
+
127
+ export const name = 'tool-logger'
128
+
129
+ export function apply(ctx: Context) {
130
+ ctx.on('tools/result', (exec, result) => {
131
+ console.log(`[tool] ${exec.name}(${JSON.stringify(exec.arguments)})`)
132
+ const text = result.content
133
+ .map(block => block.type === 'text' ? block.text : '')
134
+ .join('')
135
+ console.log(`[tool result] ${text.slice(0, 100)}`)
136
+ })
137
+ }
138
+ ```
139
+
140
+ ## 下一步
141
+
142
+ - [能力分层](../practice/) — 了解能力接口中的事件
143
+ - [LLM(大语言模型)适配器](../practice/llm-adapter.md) — 实现一个完整的 LLM 后端
@@ -0,0 +1,6 @@
1
+ # Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
2
+ # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
+ # after editing either side, bring the other along and re-record with:
4
+ # pnpm run verify-translation-pairing --write docs/user/develop/framework/index.md
5
+ index.md: 8cc673148d7fec4f7d9b994907e17293bc3a6a97
6
+ index.zh.md: 1a1f7feb8685e124babb182544bde332b52da42c
@@ -0,0 +1,137 @@
1
+ # Plugins and lifecycle
2
+
3
+ English | [中文](index.zh.md)
4
+
5
+ This page describes the Cordis plugin model and lifecycle state machine.
6
+
7
+ ## Fiber state machine
8
+
9
+ Every loaded plugin owns a **Fiber** scope with the following states:
10
+
11
+ ```
12
+ PENDING → LOADING → ACTIVE
13
+ ↘ FAILED
14
+ ACTIVE → UNLOADING → DISPOSED
15
+ ```
16
+
17
+ | State | Meaning |
18
+ |------|------|
19
+ | PENDING | Declared, but required dependencies are not ready |
20
+ | LOADING | Dependencies are ready and `apply` is running |
21
+ | ACTIVE | The plugin is running |
22
+ | FAILED | `apply` threw an error |
23
+ | UNLOADING | The plugin is unloading and disposing resources |
24
+ | DISPOSED | The plugin is fully unloaded |
25
+
26
+ ## Dependency-driven loading
27
+
28
+ A plugin with `inject` waits for every required service before loading:
29
+
30
+ ```ts ignore-check
31
+ export const inject = ['tools', 'llm']
32
+
33
+ export function apply(ctx: Context) {
34
+ // ctx.tools and ctx.llm are ready here.
35
+ }
36
+ ```
37
+
38
+ If a required service disappears, for example during provider replacement, the plugin unloads automatically (ACTIVE → DISPOSED) and loads again when the service returns.
39
+
40
+ ## Automatic cleanup
41
+
42
+ Every registration made through `ctx` is undone when the plugin unloads:
43
+
44
+ ```ts ignore-check
45
+ export function apply(ctx: Context) {
46
+ // Event listener: removed automatically on unload.
47
+ ctx.on('some-event', handler)
48
+
49
+ // Custom resource: the returned disposer runs on unload.
50
+ ctx.effect(() => {
51
+ const connection = createConnection()
52
+ return () => connection.close()
53
+ })
54
+ }
55
+ ```
56
+
57
+ The framework tracks and disposes all of these operations:
58
+ - `ctx.on(event, handler)` — event listener
59
+ - `ctx.tools.register(tool)` — tool registration
60
+ - `ctx.llm.registerAdapter(names, adapter)` — LLM adapter registration
61
+ - `ctx.effect(() => cleanup)` — custom resource
62
+
63
+ During unload, disposer invocation starts in reverse registration order, but multiple async disposers run concurrently and have no serial completion guarantee. Put order-dependent cleanup in one disposer returned from a single `ctx.effect()` and await its steps serially there.
64
+
65
+ ## Nested contexts
66
+
67
+ `ctx.plugin()` creates a child Fiber that inherits the parent context but has an independent lifecycle:
68
+
69
+ ```ts ignore-check
70
+ export function apply(ctx: Context) {
71
+ // Register a child plugin.
72
+ ctx.plugin(childPlugin)
73
+
74
+ // The child has its own Fiber and unloads with its parent.
75
+ }
76
+ ```
77
+
78
+ ## Dispose semantics
79
+
80
+ To stop a plugin instance early:
81
+
82
+ ```ts
83
+ import type { Context } from '@deepseek-ai/cordis'
84
+
85
+ declare const ctx: Context
86
+ declare function myPlugin(ctx: Context): void
87
+
88
+ const fiber = ctx.plugin(myPlugin)
89
+
90
+ // Dispose it manually later.
91
+ await fiber.dispose()
92
+ ```
93
+
94
+ `dispose` guarantees:
95
+ 1. All registrations owned by the plugin are removed.
96
+ 2. Child plugins are recursively unloaded.
97
+ 3. The returned promise resolves after all asynchronous cleanup finishes.
98
+
99
+ ## Hot replacement (HMR)
100
+
101
+ With `@deepseek-ai/cordis-plugin-hmr` loaded from `cordis.yml`, editing a plugin source file triggers:
102
+
103
+ 1. Unload the old plugin and clean up its registrations.
104
+ 2. Load the new code.
105
+ 3. Run the new `apply`.
106
+
107
+ Because plugin registrations clean themselves up, hot replacement does not retain registrations from the old instance.
108
+
109
+ ## Example lifecycle
110
+
111
+ ```ts ignore-check
112
+ export function apply(ctx: Context) {
113
+ console.log('plugin loading')
114
+
115
+ ctx.effect(() => {
116
+ console.log('effect registered')
117
+ return () => console.log('effect cleaned up')
118
+ })
119
+ }
120
+ ```
121
+
122
+ Loading prints:
123
+ ```
124
+ plugin loading
125
+ effect registered
126
+ ```
127
+
128
+ Unloading prints:
129
+ ```
130
+ effect cleaned up
131
+ ```
132
+
133
+ ## Next steps
134
+
135
+ - [Services and dependencies](./service.md) — expose a capability to other plugins
136
+ - [Event system](./events.md) — communicate between plugins
137
+ - [Cordis tutorial](../../../cordis-tutorial/index.md) — the same lifecycle, services, and events built step by step against the Cordis runtime
@@ -0,0 +1,137 @@
1
+ # 插件与生命周期
2
+
3
+ [English](index.md) | 中文
4
+
5
+ 本页介绍 Cordis 插件模型和生命周期状态机。
6
+
7
+ ## Fiber 状态机
8
+
9
+ 每个被加载的插件都拥有一个 **Fiber** 作用域,其状态如下:
10
+
11
+ ```
12
+ PENDING → LOADING → ACTIVE
13
+ ↘ FAILED
14
+ ACTIVE → UNLOADING → DISPOSED
15
+ ```
16
+
17
+ | 状态 | 含义 |
18
+ |------|------|
19
+ | PENDING | 已声明,但所需依赖未就绪 |
20
+ | LOADING | 依赖就绪,正在执行 `apply` |
21
+ | ACTIVE | 插件运行中 |
22
+ | FAILED | `apply` 抛出异常 |
23
+ | UNLOADING | 插件正在卸载并释放资源 |
24
+ | DISPOSED | 已完全卸载 |
25
+
26
+ ## 依赖驱动的加载
27
+
28
+ 声明了 `inject` 的插件会等待所有必需服务就绪:
29
+
30
+ ```ts ignore-check
31
+ export const inject = ['tools', 'llm']
32
+
33
+ export function apply(ctx: Context) {
34
+ // ctx.tools and ctx.llm are ready here.
35
+ }
36
+ ```
37
+
38
+ 如果依赖的服务消失(例如提供方被替换时),插件会被自动卸载(ACTIVE → DISPOSED),待服务恢复后重新加载。
39
+
40
+ ## 自动清理机制
41
+
42
+ 通过 `ctx` 做的任何注册,在插件卸载时都会自动撤销:
43
+
44
+ ```ts ignore-check
45
+ export function apply(ctx: Context) {
46
+ // Event listener: removed automatically on unload.
47
+ ctx.on('some-event', handler)
48
+
49
+ // Custom resource: the returned disposer runs on unload.
50
+ ctx.effect(() => {
51
+ const connection = createConnection()
52
+ return () => connection.close()
53
+ })
54
+ }
55
+ ```
56
+
57
+ 以下操作都会被自动追踪和清理:
58
+ - `ctx.on(event, handler)` — 事件监听
59
+ - `ctx.tools.register(tool)` — 工具注册
60
+ - `ctx.llm.registerAdapter(names, adapter)` — LLM(大语言模型)适配器注册
61
+ - `ctx.effect(() => cleanup)` — 自定义资源
62
+
63
+ 插件卸载时,处置器按注册顺序的逆序开始调用,但多个异步处置器会并发执行,不保证逐个完成。存在顺序依赖的清理步骤必须放进同一个 `ctx.effect()` 返回的处置器中,由该处置器负责串行等待。
64
+
65
+ ## 嵌套上下文
66
+
67
+ `ctx.plugin()` 创建子 Fiber,它继承父上下文但有独立的生命周期:
68
+
69
+ ```ts ignore-check
70
+ export function apply(ctx: Context) {
71
+ // Register a child plugin.
72
+ ctx.plugin(childPlugin)
73
+
74
+ // The child has its own Fiber and unloads with its parent.
75
+ }
76
+ ```
77
+
78
+ ## dispose(资源释放)语义
79
+
80
+ 当你需要提前终止一个插件实例:
81
+
82
+ ```ts
83
+ import type { Context } from '@deepseek-ai/cordis'
84
+
85
+ declare const ctx: Context
86
+ declare function myPlugin(ctx: Context): void
87
+
88
+ const fiber = ctx.plugin(myPlugin)
89
+
90
+ // Dispose it manually later.
91
+ await fiber.dispose()
92
+ ```
93
+
94
+ `dispose` 保证:
95
+ 1. 该插件拥有的所有注册均被移除
96
+ 2. 它的子插件也被递归卸载
97
+ 3. 返回的 Promise 会在所有异步清理完成后兑现
98
+
99
+ ## HMR(热模块替换)
100
+
101
+ 通过 `cordis.yml` 加载 `@deepseek-ai/cordis-plugin-hmr` 后,修改插件源文件会触发:
102
+
103
+ 1. 卸载旧插件(清理所有注册)
104
+ 2. 重新加载新代码
105
+ 3. 执行新的 `apply`
106
+
107
+ 因为插件注册会被自动清理,所以热替换不会保留旧实例的注册。
108
+
109
+ ## 生命周期示例
110
+
111
+ ```ts ignore-check
112
+ export function apply(ctx: Context) {
113
+ console.log('plugin loading')
114
+
115
+ ctx.effect(() => {
116
+ console.log('effect registered')
117
+ return () => console.log('effect cleaned up')
118
+ })
119
+ }
120
+ ```
121
+
122
+ 加载时输出:
123
+ ```
124
+ plugin loading
125
+ effect registered
126
+ ```
127
+
128
+ 卸载时输出:
129
+ ```
130
+ effect cleaned up
131
+ ```
132
+
133
+ ## 下一步
134
+
135
+ - [服务与依赖](./service.md) — 让插件向其他插件提供能力
136
+ - [事件系统](./events.md) — 在插件之间通信
137
+ - [Cordis 框架教程](../../../cordis-tutorial/index.md) — 在 Cordis 运行时上逐步搭出同一套生命周期、服务与事件
@@ -0,0 +1,6 @@
1
+ # Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
2
+ # side as of the last confirmed-consistent state. Both languages carry equal authority;
3
+ # after editing either side, bring the other along and re-record with:
4
+ # pnpm run verify-translation-pairing --write docs/user/develop/framework/service.md
5
+ service.md: 03f4e7dc4df934495a4b203066183753b621339e
6
+ service.zh.md: 2f4c01e0ea6a87a87ca694b265b07e07098f3e59
@@ -0,0 +1,148 @@
1
+ # Services and dependencies
2
+
3
+ English | [中文](service.zh.md)
4
+
5
+ A service is a capability one plugin exposes to other plugins. `inject` declares the services a plugin requires.
6
+
7
+ ## What is a service?
8
+
9
+ In Harness, `tools`, `llm`, and `agents` are services. Each is a named capability mounted on `ctx`:
10
+
11
+ ```ts ignore-check
12
+ ctx.tools // ToolRuntime service
13
+ ctx.llm // LLM service
14
+ ctx.agents // Agent service
15
+ ```
16
+
17
+ Any plugin can provide a service for other plugins to consume.
18
+
19
+ ## Consume a service
20
+
21
+ Declare `inject` to use an existing service:
22
+
23
+ ```ts ignore-check
24
+ export const inject = ['tools']
25
+
26
+ export function apply(ctx: Context) {
27
+ // ctx.tools exists and is ready here.
28
+ ctx.tools.register(/* ... */)
29
+ }
30
+ ```
31
+
32
+ When `apply` runs, every service declared by `inject` is ready. If a service is not ready, the plugin waits instead of running.
33
+
34
+ ## Provide a service
35
+
36
+ ### Extend Service
37
+
38
+ ```ts
39
+ import { Service, type Context } from '@deepseek-ai/cordis'
40
+
41
+ export default class MetricsService extends Service {
42
+ static inject = ['llm'] // A service may depend on other services.
43
+
44
+ constructor(ctx: Context) {
45
+ super(ctx, 'metrics') // 'metrics' is the service name.
46
+ }
47
+
48
+ // Public service method.
49
+ record(event: string, value: number) {
50
+ // ...
51
+ }
52
+ }
53
+ ```
54
+
55
+ After loading this plugin, consumers access the service as `ctx.metrics`:
56
+
57
+ ```ts ignore-check
58
+ export const inject = ['metrics']
59
+
60
+ export function apply(ctx: Context) {
61
+ ctx.metrics.record('tool_call', 1)
62
+ }
63
+ ```
64
+
65
+ ### Declare its type
66
+
67
+ Use TypeScript declaration merging to type `ctx.metrics`:
68
+
69
+ ```ts
70
+ import { Service, type Context } from '@deepseek-ai/cordis'
71
+
72
+ declare module '@deepseek-ai/cordis' {
73
+ interface Context {
74
+ metrics: MetricsService
75
+ }
76
+ }
77
+
78
+ export default class MetricsService extends Service {
79
+ constructor(ctx: Context) {
80
+ super(ctx, 'metrics')
81
+ }
82
+
83
+ record(event: string, value: number) { /* ... */ }
84
+ }
85
+ ```
86
+
87
+ ## Dependency behavior
88
+
89
+ ### Required and optional dependencies
90
+
91
+ ```ts ignore-check
92
+ // Required: the plugin does not load while the service is absent.
93
+ export const inject = ['tools']
94
+
95
+ // Optional: omit inject and query with ctx.get() at the use site.
96
+ export function apply(ctx: Context) {
97
+ const metrics = ctx.get('metrics')
98
+ metrics?.record('plugin_loaded', 1)
99
+ }
100
+ ```
101
+
102
+ ### When a service disappears
103
+
104
+ If a required service disappears while the application is running, for example because its provider unloads:
105
+
106
+ 1. Dependent plugins dispose automatically.
107
+ 2. They load again when the service returns.
108
+
109
+ This prevents a plugin from calling a service that no longer exists.
110
+
111
+ ## Service isolation
112
+
113
+ `cordis.yml` can isolate services so separate plugin groups see separate instances of the same service:
114
+
115
+ ```yaml
116
+ - id: group-a
117
+ name: '@deepseek-ai/cordis-plugin-group'
118
+ group: true
119
+ isolate:
120
+ shell: true
121
+ config:
122
+ - name: '@deepseek-ai/dsh-bash-local'
123
+ config:
124
+ timeoutMs: 5000
125
+ - name: './src/plugin-a.ts'
126
+
127
+ - id: group-b
128
+ name: '@deepseek-ai/cordis-plugin-group'
129
+ group: true
130
+ isolate:
131
+ shell: true
132
+ config:
133
+ - name: '@deepseek-ai/dsh-bash-local'
134
+ config:
135
+ timeoutMs: 60000
136
+ - name: './src/plugin-b.ts'
137
+ ```
138
+
139
+ `plugin-a` and `plugin-b` each see the Bash instance in their own group, with no cross-group effect.
140
+
141
+ ## Built-in Harness services
142
+
143
+ The repository generates the service names, public methods, and source locations into each service's [subsystem page](../../../subsystems/core.md). Use those generated regions and the service's TypeScript interface while developing a plugin; do not maintain a second static list.
144
+
145
+ ## Next steps
146
+
147
+ - [Event system](./events.md) — communicate between plugins without tight coupling
148
+ - [Capability layering](../practice/) — use services as capability interfaces