| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406 |
- /**
- * Canonical publication manifest for the documentation website.
- *
- * Markdown stays in its owning repository tier. This manifest maps each
- * canonical source into matching route trees for both site locales; when a
- * translation is absent, both routes intentionally project the available
- * source instead of copying Markdown.
- */
- /** Locale key used by the VitePress site. */
- export type DocsLocale = 'root' | 'en'
- /** Sidebar collection rendered for one locale and top-level module. */
- type DocsSidebar =
- | 'zh-guide'
- | 'zh-develop'
- | 'zh-reference'
- | 'en-guide'
- | 'en-develop'
- | 'en-reference'
- /** A page projected into the VitePress source tree. */
- export interface DocsPage {
- /** VitePress locale whose route tree owns this projection. */
- locale: DocsLocale
- /** Language of the canonical source currently projected at this route. */
- contentLocale: 'zh-CN' | 'en-US'
- /** Repository-relative canonical Markdown source. */
- source: string
- /** VitePress route, including the `.md` suffix. */
- route: string
- /** Navigation label shown in the sidebar. */
- label: string
- /** Sidebar collection that owns the page, or null for a locale home page. */
- sidebar: DocsSidebar | null
- /** Section label within the sidebar. */
- section: string
- /** Stable order within the section. */
- order: number
- /** Heading levels included in this page's VitePress outline. */
- outline?: number | readonly [number, number] | 'deep' | false
- /** Additional repository paths that resolve to this page. */
- sourceAliases?: string[]
- }
- interface MirroredPage {
- source: string | Record<DocsLocale, string>
- route: string
- contentLocale: DocsPage['contentLocale'] | Record<DocsLocale, DocsPage['contentLocale']>
- label: Record<DocsLocale, string>
- sidebar: Record<DocsLocale, DocsSidebar | null>
- section: Record<DocsLocale, string>
- order: number
- outline?: DocsPage['outline']
- sourceAliases?: string[] | Partial<Record<DocsLocale, string[]>>
- }
- type PairedPage = Omit<MirroredPage, 'source' | 'contentLocale' | 'sourceAliases'> & {
- /** English side of a sibling `foo.md` / `foo.zh.md` pair. */
- source: string
- /** Language-neutral repository aliases, such as the directory of an index page. */
- sourceAliases?: string[]
- }
- function localized<T>(value: T | Record<DocsLocale, T>, locale: DocsLocale): T {
- return typeof value === 'object' && value !== null && !Array.isArray(value)
- ? (value as Record<DocsLocale, T>)[locale]
- : value
- }
- function mirroredPages(pages: MirroredPage[]): DocsPage[] {
- return pages.flatMap(page => (['root', 'en'] as const).map((locale) => {
- const aliases = page.sourceAliases === undefined
- ? undefined
- : Array.isArray(page.sourceAliases) ? page.sourceAliases : page.sourceAliases[locale]
- return {
- locale,
- contentLocale: localized(page.contentLocale, locale),
- source: localized(page.source, locale),
- route: locale === 'root' ? page.route : `en/${page.route}`,
- label: page.label[locale],
- sidebar: page.sidebar[locale],
- section: page.section[locale],
- order: page.order,
- ...(page.outline === undefined ? {} : { outline: page.outline }),
- ...(aliases === undefined ? {} : { sourceAliases: aliases }),
- }
- }))
- }
- function pairedPages(pages: PairedPage[]): DocsPage[] {
- return mirroredPages(pages.map((page) => {
- const chineseSource = page.source.replace(/\.md$/, '.zh.md')
- const sharedAliases = page.sourceAliases ?? []
- return {
- ...page,
- source: { root: chineseSource, en: page.source },
- contentLocale: { root: 'zh-CN', en: 'en-US' },
- sourceAliases: {
- root: [...sharedAliases, page.source],
- en: [...sharedAliases, chineseSource],
- },
- }
- }))
- }
- const homeAndGuide = pairedPages([
- {
- source: 'docs/user/index.md',
- route: 'index.md',
- label: { root: 'DeepSeek Harness', en: 'DeepSeek Harness' },
- sidebar: { root: null, en: null },
- section: { root: '首页', en: 'Home' },
- order: 0,
- },
- {
- source: 'docs/user/guide/index.md',
- route: 'guide/quickstart.md',
- label: { root: '使用 Web UI', en: 'Use the Web UI' },
- sidebar: { root: 'zh-guide', en: 'en-guide' },
- section: { root: '入门', en: 'Guide' },
- order: 1,
- sourceAliases: ['docs/user/guide'],
- },
- {
- source: 'docs/user/guide/providers.md',
- route: 'guide/providers.md',
- label: { root: '配置模型', en: 'Configure models' },
- sidebar: { root: 'zh-guide', en: 'en-guide' },
- section: { root: '入门', en: 'Guide' },
- order: 2,
- },
- {
- source: 'docs/user/guide/python-sdk.md',
- route: 'guide/python-sdk.md',
- label: { root: 'Python SDK', en: 'Python SDK' },
- sidebar: { root: 'zh-guide', en: 'en-guide' },
- section: { root: '其他接口', en: 'Other interfaces' },
- order: 1,
- },
- ])
- const develop = pairedPages([
- {
- source: 'docs/user/develop/basic/index.md',
- route: 'develop/basic/index.md',
- label: { root: '第一个插件', en: 'First plugin' },
- sidebar: { root: 'zh-develop', en: 'en-develop' },
- section: { root: '基础', en: 'Basics' },
- order: 1,
- sourceAliases: ['docs/user/develop/basic'],
- },
- {
- source: 'docs/user/develop/basic/tool.md',
- route: 'develop/basic/tool.md',
- label: { root: '开发一个 Tool', en: 'Build a tool' },
- sidebar: { root: 'zh-develop', en: 'en-develop' },
- section: { root: '基础', en: 'Basics' },
- order: 2,
- },
- {
- source: 'docs/user/develop/basic/config.md',
- route: 'develop/basic/config.md',
- label: { root: '插件配置', en: 'Plugin configuration' },
- sidebar: { root: 'zh-develop', en: 'en-develop' },
- section: { root: '基础', en: 'Basics' },
- order: 3,
- },
- {
- source: 'docs/user/develop/basic/publish.md',
- route: 'develop/basic/publish.md',
- label: { root: '打包与安装插件', en: 'Package and install' },
- sidebar: { root: 'zh-develop', en: 'en-develop' },
- section: { root: '基础', en: 'Basics' },
- order: 4,
- },
- {
- source: 'docs/user/develop/framework/index.md',
- route: 'develop/framework/index.md',
- label: { root: '插件与生命周期', en: 'Plugin lifecycle' },
- sidebar: { root: 'zh-develop', en: 'en-develop' },
- section: { root: '框架能力', en: 'Framework' },
- order: 1,
- sourceAliases: ['docs/user/develop/framework'],
- },
- {
- source: 'docs/user/develop/framework/service.md',
- route: 'develop/framework/service.md',
- label: { root: '服务与依赖', en: 'Services and dependencies' },
- sidebar: { root: 'zh-develop', en: 'en-develop' },
- section: { root: '框架能力', en: 'Framework' },
- order: 2,
- },
- {
- source: 'docs/user/develop/framework/events.md',
- route: 'develop/framework/events.md',
- label: { root: '事件系统', en: 'Event system' },
- sidebar: { root: 'zh-develop', en: 'en-develop' },
- section: { root: '框架能力', en: 'Framework' },
- order: 3,
- },
- {
- source: 'docs/user/develop/practice/index.md',
- route: 'develop/practice/index.md',
- label: { root: '能力的三层拆分', en: 'Capability layering' },
- sidebar: { root: 'zh-develop', en: 'en-develop' },
- section: { root: '实战', en: 'Practice' },
- order: 1,
- sourceAliases: ['docs/user/develop/practice'],
- },
- {
- source: 'docs/user/develop/practice/llm-adapter.md',
- route: 'develop/practice/llm-adapter.md',
- label: { root: 'LLM 适配器', en: 'LLM adapter' },
- sidebar: { root: 'zh-develop', en: 'en-develop' },
- section: { root: '实战', en: 'Practice' },
- order: 2,
- },
- ])
- const cordisTutorial = pairedPages(([
- ['index.md', 'Cordis 教程', 'Cordis tutorial'],
- ['01-first-plugin.md', '1. 第一个插件', '1. Your first plugin'],
- ['02-lifecycle-and-effects.md', '2. 生命周期与副作用', '2. Lifecycle and effects'],
- ['03-services.md', '3. 服务', '3. Services'],
- ['04-events.md', '4. 事件', '4. Events'],
- ['05-config.md', '5. 配置', '5. Configuration'],
- ['06-composition-and-hmr.md', '6. 组合与热重载', '6. Composition and HMR'],
- ['07-into-the-harness.md', '7. 进入 Harness', '7. Into the harness'],
- ] as const).map(([file, rootLabel, enLabel], order): PairedPage => ({
- source: `docs/cordis-tutorial/${file}`,
- route: `develop/cordis-tutorial/${file}`,
- label: { root: rootLabel, en: enLabel },
- sidebar: { root: 'zh-develop', en: 'en-develop' },
- section: { root: 'Cordis 教程', en: 'Cordis tutorial' },
- order,
- ...(file === 'index.md' ? { sourceAliases: ['docs/cordis-tutorial'] } : {}),
- })))
- const cordisPrimerReference = pairedPages([
- {
- source: 'docs/cordis-primer.md',
- route: 'reference/cordis-primer.md',
- label: { root: 'Cordis 入门', en: 'Cordis primer' },
- sidebar: { root: 'zh-reference', en: 'en-reference' },
- section: { root: '概念', en: 'Concepts' },
- order: 1,
- },
- ])
- const subsystemsReference = pairedPages(([
- ['README.md', '子系统', 'Subsystems', 0],
- ['core.md', '核心', 'Core', 1],
- ['scope.md', '作用域', 'Scopes', 2],
- ['typert.md', 'TypeRT', 'TypeRT', 39],
- ['session.md', '会话', 'Sessions', 3],
- ['session-query.md', '会话查询', 'Session query', 4],
- ['session-reference.md', '会话引用', 'Session references', 5],
- ['session-title.md', '会话标题', 'Session titles', 6],
- ['settings.md', '用户设置', 'User settings', 7],
- ['credentials.md', '用户凭据', 'User credentials', 8],
- ['system-prompt.md', '系统提示词', 'System prompts', 9],
- ['tools.md', '工具', 'Tools', 10],
- ['llm-streaming.md', 'LLM 流式响应', 'LLM streaming', 11],
- ['token-meter.md', 'Token 计量', 'Token metering', 12],
- ['bash.md', 'Bash 执行', 'Bash execution', 13],
- ['subprocess.md', '子进程', 'Subprocesses', 14],
- ['tasks.md', '后台任务', 'Background tasks', 15],
- ['filesystem.md', '文件系统', 'Filesystem', 16],
- ['lsp.md', 'LSP 导航', 'LSP navigation', 17],
- ['code-runtime.md', '代码运行时', 'Code runtime', 18],
- ['compaction.md', '上下文压缩', 'Compaction', 19],
- ['subagent.md', '子代理', 'Subagents', 20],
- ['workflow.md', '工作流', 'Workflows', 21],
- ['skills.md', '技能', 'Skills', 22],
- ['approval.md', '审批', 'Approvals', 23],
- ['permission.md', '权限预设', 'Permission presets', 24],
- ['plan.md', '计划模式', 'Plan mode', 25],
- ['user-interaction.md', '用户交互', 'User interaction', 26],
- ['sandbox.md', '沙箱', 'Sandboxing', 27],
- ['web.md', 'Web 访问', 'Web access', 28],
- ['spill.md', 'Spill 存储', 'Spill storage', 29],
- ['persistence.md', '会话持久化', 'Session persistence', 30],
- ['storage.md', '存储', 'Storage', 31],
- ['workspace.md', '工作区', 'Workspaces', 32],
- ['http-server.md', 'HTTP 服务器', 'HTTP server', 33],
- ['client-modules.md', '客户端模块', 'Client modules', 34],
- ['invariants.md', '运行时不变式', 'Runtime invariants', 36],
- ['session-projection.md', '会话投影', 'Session projections', 37],
- ['telemetry.md', '遥测', 'Telemetry', 38],
- ] as const).map(([file, rootLabel, enLabel, order]): PairedPage => ({
- source: `docs/subsystems/${file}`,
- route: file === 'README.md' ? 'reference/subsystems/index.md' : `reference/subsystems/${file}`,
- label: { root: rootLabel, en: enLabel },
- sidebar: { root: 'zh-reference', en: 'en-reference' },
- section: { root: '子系统', en: 'Subsystems' },
- order,
- ...(file === 'README.md' ? { sourceAliases: ['docs/subsystems'] } : {}),
- })))
- const reference = [
- ...pairedPages(([
- ['docs/architecture.md', 'reference/index.md', '架构', 'Architecture', 0],
- ] as const).map(([source, route, rootLabel, enLabel, order]): PairedPage => ({
- source,
- route,
- label: { root: rootLabel, en: enLabel },
- sidebar: { root: 'zh-reference', en: 'en-reference' },
- section: { root: '概念', en: 'Concepts' },
- order,
- }))),
- ...pairedPages(([
- ['docs/capability-seams.md', 'reference/capability-seams.md', '能力服务', 'Capability services', 2],
- ['docs/agent-lifecycle.md', 'reference/agent-lifecycle.md', 'Agent 生命周期', 'Agent lifecycle', 3],
- ['docs/tool-execution-pipeline.md', 'reference/tool-execution-pipeline.md', 'Tool 执行', 'Tool execution', 4],
- ] as const).map(([source, route, rootLabel, enLabel, order]): PairedPage => ({
- source,
- route,
- label: { root: rootLabel, en: enLabel },
- sidebar: { root: 'zh-reference', en: 'en-reference' },
- section: { root: '概念', en: 'Concepts' },
- order,
- }))),
- ...pairedPages(([
- ['docs/config-catalog.md', 'reference/config-catalog.md', '插件配置', 'Plugin configuration'],
- ['docs/tool-catalog.md', 'reference/tool-catalog.md', 'Tool Schema', 'Tool schemas'],
- ['docs/persistence-catalog.md', 'reference/persistence-catalog.md', '持久化事件', 'Persistence events', 'deep'],
- ] as const).map(([source, route, rootLabel, enLabel, outline], order): PairedPage => ({
- source,
- route,
- label: { root: rootLabel, en: enLabel },
- sidebar: { root: 'zh-reference', en: 'en-reference' },
- section: { root: '生成参考', en: 'Generated reference' },
- order,
- ...(outline === undefined ? {} : { outline }),
- }))),
- ...pairedPages(([
- ['context.md', 'Context', 'Context'],
- ['events.md', 'Events', 'Events'],
- ['fiber.md', 'Fiber', 'Fiber'],
- ['registry.md', 'Plugin Registry', 'Plugin Registry'],
- ['service.md', 'Service', 'Service'],
- ] as const).map(([file, rootLabel, enLabel], order): PairedPage => ({
- source: `docs/cordis-api/${file}`,
- route: `reference/cordis-api/${file}`,
- label: { root: rootLabel, en: enLabel },
- sidebar: { root: 'zh-reference', en: 'en-reference' },
- section: { root: 'Cordis API', en: 'Cordis Core API' },
- order,
- }))),
- ...mirroredPages(([
- ['inherited.md', '继承接口面', 'Inherited surface'],
- ] as const).map(([file, rootLabel, enLabel], order): MirroredPage => ({
- source: `docs/cordis-api/${file}`,
- route: `reference/cordis-api/${file}`,
- contentLocale: 'en-US',
- label: { root: rootLabel, en: enLabel },
- sidebar: { root: 'zh-reference', en: 'en-reference' },
- section: { root: 'Cordis API', en: 'Cordis Core API' },
- order: order + 5,
- }))),
- ...pairedPages(([
- ['goal.md', '目标', 'Goals', 14],
- ['schedule.md', '定时提醒', 'Scheduled reminders', 15],
- ['pty.md', 'PTY 会话', 'PTY sessions', 26],
- ['commands.md', '命令', 'Human commands', 38],
- ] as const).map(([file, rootLabel, enLabel, order]): PairedPage => ({
- source: `docs/subsystems/${file}`,
- route: `reference/subsystems/${file}`,
- label: { root: rootLabel, en: enLabel },
- sidebar: { root: 'zh-reference', en: 'en-reference' },
- section: { root: '子系统', en: 'Subsystems' },
- order,
- }))),
- ...pairedPages(([
- ['adding-a-package.md', '新增 Package', 'Adding a package'],
- ['adding-a-tool.md', '新增 Tool', 'Adding a tool'],
- ['adding-an-llm-adapter.md', '新增 LLM Adapter', 'Adding an LLM adapter'],
- ['extension-cookbook.md', '扩展模式', 'Extension patterns'],
- ] as const).map(([file, rootLabel, enLabel], order): PairedPage => ({
- source: `docs/cookbook/${file}`,
- route: `reference/cookbook/${file}`,
- label: { root: rootLabel, en: enLabel },
- sidebar: { root: 'zh-reference', en: 'en-reference' },
- section: { root: '开发手册', en: 'Cookbook' },
- order,
- }))),
- ...pairedPages([{
- source: 'docs/cookbook/adding-a-conversation-node.md',
- route: 'reference/cookbook/adding-a-conversation-node.md',
- label: { root: '新增 Conversation Node', en: 'Adding a Conversation Node' },
- sidebar: { root: 'zh-reference', en: 'en-reference' },
- section: { root: '开发手册', en: 'Cookbook' },
- order: 4,
- }]),
- ]
- /** Every canonical page published by the documentation website. */
- export const docsPages: DocsPage[] = [
- ...homeAndGuide,
- ...develop,
- ...cordisTutorial,
- ...cordisPrimerReference,
- ...subsystemsReference,
- ...reference,
- ]
|