docs.ts 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /**
  2. * Canonical publication manifest for the documentation website.
  3. *
  4. * Markdown stays in its owning repository tier. This manifest maps each
  5. * canonical source into matching route trees for both site locales; when a
  6. * translation is absent, both routes intentionally project the available
  7. * source instead of copying Markdown.
  8. */
  9. /** Locale key used by the VitePress site. */
  10. export type DocsLocale = 'root' | 'en'
  11. /** Sidebar collection rendered for one locale and top-level module. */
  12. type DocsSidebar =
  13. | 'zh-guide'
  14. | 'zh-develop'
  15. | 'zh-reference'
  16. | 'en-guide'
  17. | 'en-develop'
  18. | 'en-reference'
  19. /** A page projected into the VitePress source tree. */
  20. export interface DocsPage {
  21. /** VitePress locale whose route tree owns this projection. */
  22. locale: DocsLocale
  23. /** Language of the canonical source currently projected at this route. */
  24. contentLocale: 'zh-CN' | 'en-US'
  25. /** Repository-relative canonical Markdown source. */
  26. source: string
  27. /** VitePress route, including the `.md` suffix. */
  28. route: string
  29. /** Navigation label shown in the sidebar. */
  30. label: string
  31. /** Sidebar collection that owns the page, or null for a locale home page. */
  32. sidebar: DocsSidebar | null
  33. /** Section label within the sidebar. */
  34. section: string
  35. /** Stable order within the section. */
  36. order: number
  37. /** Additional repository paths that resolve to this page. */
  38. sourceAliases?: string[]
  39. }
  40. interface MirroredPage {
  41. source: string
  42. route: string
  43. contentLocale: DocsPage['contentLocale']
  44. label: Record<DocsLocale, string>
  45. sidebar: Record<DocsLocale, DocsSidebar | null>
  46. section: Record<DocsLocale, string>
  47. order: number
  48. sourceAliases?: string[]
  49. }
  50. function mirroredPages(pages: MirroredPage[]): DocsPage[] {
  51. return pages.flatMap(page => (['root', 'en'] as const).map(locale => ({
  52. locale,
  53. contentLocale: page.contentLocale,
  54. source: page.source,
  55. route: locale === 'root' ? page.route : `en/${page.route}`,
  56. label: page.label[locale],
  57. sidebar: page.sidebar[locale],
  58. section: page.section[locale],
  59. order: page.order,
  60. ...(page.sourceAliases === undefined ? {} : { sourceAliases: page.sourceAliases }),
  61. })))
  62. }
  63. const homeAndGuide = mirroredPages([
  64. {
  65. source: 'docs/user/zh-CN/index.md',
  66. route: 'index.md',
  67. contentLocale: 'zh-CN',
  68. label: { root: 'DeepSeek Harness', en: 'DeepSeek Harness' },
  69. sidebar: { root: null, en: null },
  70. section: { root: '首页', en: 'Home' },
  71. order: 0,
  72. },
  73. {
  74. source: 'docs/user/zh-CN/guide/index.md',
  75. route: 'guide/index.md',
  76. contentLocale: 'zh-CN',
  77. label: { root: '介绍', en: 'Introduction' },
  78. sidebar: { root: 'zh-guide', en: 'en-guide' },
  79. section: { root: '入门', en: 'Guide' },
  80. order: 1,
  81. sourceAliases: ['docs/user/zh-CN/guide'],
  82. },
  83. {
  84. source: 'docs/user/zh-CN/guide/quickstart.md',
  85. route: 'guide/quickstart.md',
  86. contentLocale: 'zh-CN',
  87. label: { root: '快速开始', en: 'Quick start' },
  88. sidebar: { root: 'zh-guide', en: 'en-guide' },
  89. section: { root: '入门', en: 'Guide' },
  90. order: 2,
  91. },
  92. {
  93. source: 'docs/user/zh-CN/guide/config.md',
  94. route: 'guide/config.md',
  95. contentLocale: 'zh-CN',
  96. label: { root: '配置文件', en: 'Configuration' },
  97. sidebar: { root: 'zh-guide', en: 'en-guide' },
  98. section: { root: '入门', en: 'Guide' },
  99. order: 3,
  100. },
  101. ])
  102. const develop = mirroredPages([
  103. {
  104. source: 'docs/user/zh-CN/develop/basic/index.md',
  105. route: 'develop/basic/index.md',
  106. contentLocale: 'zh-CN',
  107. label: { root: '第一个插件', en: 'First plugin' },
  108. sidebar: { root: 'zh-develop', en: 'en-develop' },
  109. section: { root: '基础', en: 'Basics' },
  110. order: 1,
  111. sourceAliases: ['docs/user/zh-CN/develop/basic'],
  112. },
  113. {
  114. source: 'docs/user/zh-CN/develop/basic/tool.md',
  115. route: 'develop/basic/tool.md',
  116. contentLocale: 'zh-CN',
  117. label: { root: '开发一个 Tool', en: 'Build a tool' },
  118. sidebar: { root: 'zh-develop', en: 'en-develop' },
  119. section: { root: '基础', en: 'Basics' },
  120. order: 2,
  121. },
  122. {
  123. source: 'docs/user/zh-CN/develop/basic/config.md',
  124. route: 'develop/basic/config.md',
  125. contentLocale: 'zh-CN',
  126. label: { root: '插件配置', en: 'Plugin configuration' },
  127. sidebar: { root: 'zh-develop', en: 'en-develop' },
  128. section: { root: '基础', en: 'Basics' },
  129. order: 3,
  130. },
  131. {
  132. source: 'docs/user/zh-CN/develop/framework/index.md',
  133. route: 'develop/framework/index.md',
  134. contentLocale: 'zh-CN',
  135. label: { root: '插件与生命周期', en: 'Plugin lifecycle' },
  136. sidebar: { root: 'zh-develop', en: 'en-develop' },
  137. section: { root: '框架能力', en: 'Framework' },
  138. order: 1,
  139. sourceAliases: ['docs/user/zh-CN/develop/framework'],
  140. },
  141. {
  142. source: 'docs/user/zh-CN/develop/framework/service.md',
  143. route: 'develop/framework/service.md',
  144. contentLocale: 'zh-CN',
  145. label: { root: '服务与依赖', en: 'Services and dependencies' },
  146. sidebar: { root: 'zh-develop', en: 'en-develop' },
  147. section: { root: '框架能力', en: 'Framework' },
  148. order: 2,
  149. },
  150. {
  151. source: 'docs/user/zh-CN/develop/framework/events.md',
  152. route: 'develop/framework/events.md',
  153. contentLocale: 'zh-CN',
  154. label: { root: '事件系统', en: 'Event system' },
  155. sidebar: { root: 'zh-develop', en: 'en-develop' },
  156. section: { root: '框架能力', en: 'Framework' },
  157. order: 3,
  158. },
  159. {
  160. source: 'docs/user/zh-CN/develop/practice/index.md',
  161. route: 'develop/practice/index.md',
  162. contentLocale: 'zh-CN',
  163. label: { root: '能力的三层拆分', en: 'Capability layering' },
  164. sidebar: { root: 'zh-develop', en: 'en-develop' },
  165. section: { root: '实战', en: 'Practice' },
  166. order: 1,
  167. sourceAliases: ['docs/user/zh-CN/develop/practice'],
  168. },
  169. {
  170. source: 'docs/user/zh-CN/develop/practice/llm-adapter.md',
  171. route: 'develop/practice/llm-adapter.md',
  172. contentLocale: 'zh-CN',
  173. label: { root: 'LLM 适配器', en: 'LLM adapter' },
  174. sidebar: { root: 'zh-develop', en: 'en-develop' },
  175. section: { root: '实战', en: 'Practice' },
  176. order: 2,
  177. },
  178. ])
  179. const reference = mirroredPages([
  180. ...([
  181. ['docs/architecture.md', 'reference/index.md', '架构', 'Architecture'],
  182. ['docs/cordis-primer.md', 'reference/cordis-primer.md', 'Cordis 入门', 'Cordis primer'],
  183. ['docs/capability-seams.md', 'reference/capability-seams.md', '能力服务', 'Capability services'],
  184. ['docs/agent-lifecycle.md', 'reference/agent-lifecycle.md', 'Agent 生命周期', 'Agent lifecycle'],
  185. ['docs/tool-execution-pipeline.md', 'reference/tool-execution-pipeline.md', 'Tool 执行', 'Tool execution'],
  186. ] as const).map(([source, route, rootLabel, enLabel], order): MirroredPage => ({
  187. source,
  188. route,
  189. contentLocale: 'en-US',
  190. label: { root: rootLabel, en: enLabel },
  191. sidebar: { root: 'zh-reference', en: 'en-reference' },
  192. section: { root: '概念', en: 'Concepts' },
  193. order,
  194. })),
  195. ...([
  196. ['docs/config-catalog.md', 'reference/config-catalog.md', '插件配置', 'Plugin configuration'],
  197. ['docs/tool-catalog.md', 'reference/tool-catalog.md', 'Tool Schema', 'Tool schemas'],
  198. ['docs/cordis-catalog/services.md', 'reference/cordis-catalog/services.md', '服务', 'Services'],
  199. ['docs/cordis-catalog/events.md', 'reference/cordis-catalog/events.md', '事件', 'Events'],
  200. ['docs/persistence-catalog.md', 'reference/persistence-catalog.md', '持久化事件', 'Persistence events'],
  201. ] as const).map(([source, route, rootLabel, enLabel], order): MirroredPage => ({
  202. source,
  203. route,
  204. contentLocale: 'en-US',
  205. label: { root: rootLabel, en: enLabel },
  206. sidebar: { root: 'zh-reference', en: 'en-reference' },
  207. section: { root: '生成参考', en: 'Generated reference' },
  208. order,
  209. })),
  210. ...([
  211. ['core.md', '核心数据结构', 'Core data structures'],
  212. ['scope.md', '作用域', 'Scopes'],
  213. ['session.md', '会话', 'Sessions'],
  214. ['system-prompt.md', '系统提示词', 'System prompts'],
  215. ['tools.md', '工具', 'Tools'],
  216. ['llm-streaming.md', 'LLM 流式响应', 'LLM streaming'],
  217. ['bash.md', 'Bash 执行', 'Bash execution'],
  218. ['filesystem.md', '文件系统', 'Filesystem'],
  219. ['code-runtime.md', '代码运行时', 'Code runtime'],
  220. ['compaction.md', '上下文压缩', 'Compaction'],
  221. ['subagent.md', '子代理', 'Subagents'],
  222. ['workflow.md', '工作流', 'Workflows'],
  223. ['skills.md', '技能', 'Skills'],
  224. ['approval.md', '审批', 'Approvals'],
  225. ['user-interaction.md', '用户交互', 'User interaction'],
  226. ['sandbox.md', '沙箱', 'Sandboxing'],
  227. ['web.md', 'Web 访问', 'Web access'],
  228. ['persistence.md', '会话持久化', 'Session persistence'],
  229. ] as const).map(([file, rootLabel, enLabel], order): MirroredPage => ({
  230. source: `docs/core-data-structures/${file}`,
  231. route: `reference/core-data-structures/${file}`,
  232. contentLocale: 'en-US',
  233. label: { root: rootLabel, en: enLabel },
  234. sidebar: { root: 'zh-reference', en: 'en-reference' },
  235. section: { root: '数据结构', en: 'Data structures' },
  236. order,
  237. ...(file === 'core.md' ? { sourceAliases: ['docs/core-data-structures'] } : {}),
  238. })),
  239. ...([
  240. ['adding-a-package.md', '新增 Package', 'Adding a package'],
  241. ['adding-a-tool.md', '新增 Tool', 'Adding a tool'],
  242. ['adding-an-llm-adapter.md', '新增 LLM Adapter', 'Adding an LLM adapter'],
  243. ['extension-cookbook.md', '扩展模式', 'Extension patterns'],
  244. ] as const).map(([file, rootLabel, enLabel], order): MirroredPage => ({
  245. source: `docs/cookbook/${file}`,
  246. route: `reference/cookbook/${file}`,
  247. contentLocale: 'en-US',
  248. label: { root: rootLabel, en: enLabel },
  249. sidebar: { root: 'zh-reference', en: 'en-reference' },
  250. section: { root: '开发手册', en: 'Cookbook' },
  251. order,
  252. })),
  253. ])
  254. /** Every canonical page published by the documentation website. */
  255. export const docsPages: DocsPage[] = [
  256. ...homeAndGuide,
  257. ...develop,
  258. ...reference,
  259. ]