dsh-plugin-guide 0.3.35 → 0.3.36
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.
- package/LICENSE +0 -0
- package/NOTICE.md +0 -0
- package/README-es.md +114 -50
- package/README-hi.md +115 -51
- package/README-pt.md +114 -50
- package/README-zh.md +115 -51
- package/README.md +114 -50
- package/SKILL.md +0 -0
- package/bin/dsh-plugin-dev.js +0 -0
- package/cordis.patch.yml +0 -0
- package/data/facts.json +0 -0
- package/data/seams/index.json +0 -0
- package/dist/dsh-plugin-dev.js +0 -0
- package/guide/choosing-a-plugin.md +0 -0
- package/guide/choosing-a-plugin.zh-CN.md +0 -0
- package/guide/family-toolchain.md +0 -0
- package/guide/links.md +0 -0
- package/guide/migration-0.2.md +0 -0
- package/guide/plugin-dev-guide.md +0 -0
- package/guide/quick-reference.es.md +0 -0
- package/guide/quick-reference.hi.md +0 -0
- package/guide/quick-reference.md +0 -0
- package/guide/quick-reference.pt.md +0 -0
- package/guide/quick-reference.zh-CN.md +0 -0
- package/guide/release-engineering.md +0 -0
- package/guide/release-engineering.zh-CN.md +0 -0
- package/guide/unfixed-issues.md +0 -0
- package/guide/version-matrix.md +0 -0
- package/guide/when-to-retire-a-plugin.md +0 -0
- package/guide/when-to-retire-a-plugin.zh-CN.md +0 -0
- package/icon.svg +5 -5
- package/index.d.ts +0 -0
- package/index.js +0 -0
- package/locale/en.json +6 -6
- package/locale/zh.json +6 -6
- package/package.json +1 -1
- package/references/cli-positioning-decision.md +0 -0
- package/references/community-ecosystem.md +0 -0
- package/references/community-repo-deep-dive.md +0 -0
- package/references/cordis-paper-and-community.md +0 -0
- package/references/dev-resource-landscape.md +0 -0
- package/references/harness-repo.md +0 -0
- package/references/mirror-scope-decision.md +0 -0
- package/references/official-docs/AGENTS.md +8 -4
- package/references/official-docs/BENCHMARK.md +0 -0
- package/references/official-docs/CLAUDE.md +1 -1
- package/references/official-docs/CONTRIBUTING.i18n.yaml +0 -0
- package/references/official-docs/CONTRIBUTING.md +0 -0
- package/references/official-docs/CONTRIBUTING.zh.md +0 -0
- package/references/official-docs/LICENSE +0 -0
- package/references/official-docs/README.i18n.yaml +0 -0
- package/references/official-docs/README.md +0 -0
- package/references/official-docs/README.zh.md +0 -0
- package/references/official-docs/SNAPSHOT.md +8 -10
- package/references/official-docs/THIRD_PARTY_NOTICES.md +9 -3
- package/references/official-docs/docs/AGENTS.md +3 -2
- package/references/official-docs/docs/agent-lifecycle.i18n.yaml +0 -0
- package/references/official-docs/docs/agent-lifecycle.md +0 -0
- package/references/official-docs/docs/agent-lifecycle.zh.md +0 -0
- package/references/official-docs/docs/api-gateway.i18n.yaml +15 -12
- package/references/official-docs/docs/api-gateway.md +10 -3
- package/references/official-docs/docs/api-gateway.zh.md +16 -3
- package/references/official-docs/docs/architecture.i18n.yaml +0 -0
- package/references/official-docs/docs/architecture.md +0 -0
- package/references/official-docs/docs/architecture.zh.md +0 -0
- package/references/official-docs/docs/capability-seams.i18n.yaml +2 -2
- package/references/official-docs/docs/capability-seams.md +23 -1
- package/references/official-docs/docs/capability-seams.zh.md +23 -1
- package/references/official-docs/docs/cli-help.i18n.yaml +0 -0
- package/references/official-docs/docs/cli-help.md +4 -4
- package/references/official-docs/docs/cli-help.zh.md +4 -4
- package/references/official-docs/docs/config-catalog.i18n.yaml +0 -0
- package/references/official-docs/docs/config-catalog.md +154 -53
- package/references/official-docs/docs/config-catalog.zh.md +154 -53
- package/references/official-docs/docs/cookbook/adding-a-package.i18n.yaml +0 -0
- package/references/official-docs/docs/cookbook/adding-a-package.md +0 -0
- package/references/official-docs/docs/cookbook/adding-a-package.zh.md +0 -0
- package/references/official-docs/docs/cookbook/adding-a-plugin-preview.i18n.yaml +22 -0
- package/references/official-docs/docs/cookbook/adding-a-plugin-preview.md +52 -0
- package/references/official-docs/docs/cookbook/adding-a-plugin-preview.zh.md +52 -0
- package/references/official-docs/docs/cookbook/adding-a-remote-api.i18n.yaml +0 -0
- package/references/official-docs/docs/cookbook/adding-a-remote-api.md +0 -0
- package/references/official-docs/docs/cookbook/adding-a-remote-api.zh.md +0 -0
- package/references/official-docs/docs/cookbook/adding-a-session-format-version.i18n.yaml +0 -0
- package/references/official-docs/docs/cookbook/adding-a-session-format-version.md +0 -0
- package/references/official-docs/docs/cookbook/adding-a-session-format-version.zh.md +0 -0
- package/references/official-docs/docs/cookbook/adding-a-settings-card.i18n.yaml +0 -0
- package/references/official-docs/docs/cookbook/adding-a-settings-card.md +0 -0
- package/references/official-docs/docs/cookbook/adding-a-settings-card.zh.md +0 -0
- package/references/official-docs/docs/cookbook/adding-a-tool.i18n.yaml +0 -0
- package/references/official-docs/docs/cookbook/adding-a-tool.md +0 -0
- package/references/official-docs/docs/cookbook/adding-a-tool.zh.md +0 -0
- package/references/official-docs/docs/cookbook/adding-a-vendored-package.i18n.yaml +0 -0
- package/references/official-docs/docs/cookbook/adding-a-vendored-package.md +0 -0
- package/references/official-docs/docs/cookbook/adding-a-vendored-package.zh.md +0 -0
- package/references/official-docs/docs/cookbook/adding-an-llm-adapter.i18n.yaml +0 -0
- package/references/official-docs/docs/cookbook/adding-an-llm-adapter.md +0 -0
- package/references/official-docs/docs/cookbook/adding-an-llm-adapter.zh.md +0 -0
- package/references/official-docs/docs/cookbook/extension-cookbook.i18n.yaml +0 -0
- package/references/official-docs/docs/cookbook/extension-cookbook.md +0 -0
- package/references/official-docs/docs/cookbook/extension-cookbook.zh.md +0 -0
- package/references/official-docs/docs/cookbook/maintaining-dsh-code-review.i18n.yaml +0 -0
- package/references/official-docs/docs/cookbook/maintaining-dsh-code-review.md +0 -0
- package/references/official-docs/docs/cookbook/maintaining-dsh-code-review.zh.md +0 -0
- package/references/official-docs/docs/cookbook/responding-to-pr-review-on-a-stack.i18n.yaml +0 -0
- package/references/official-docs/docs/cookbook/responding-to-pr-review-on-a-stack.md +0 -0
- package/references/official-docs/docs/cookbook/responding-to-pr-review-on-a-stack.zh.md +0 -0
- package/references/official-docs/docs/cookbook/reviewing-persistence-type-changes.i18n.yaml +0 -0
- package/references/official-docs/docs/cookbook/reviewing-persistence-type-changes.md +0 -0
- package/references/official-docs/docs/cookbook/reviewing-persistence-type-changes.zh.md +0 -0
- package/references/official-docs/docs/cordis-api/context.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-api/context.md +0 -0
- package/references/official-docs/docs/cordis-api/context.zh.md +0 -0
- package/references/official-docs/docs/cordis-api/events.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-api/events.md +0 -0
- package/references/official-docs/docs/cordis-api/events.zh.md +0 -0
- package/references/official-docs/docs/cordis-api/fiber.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-api/fiber.md +0 -0
- package/references/official-docs/docs/cordis-api/fiber.zh.md +0 -0
- package/references/official-docs/docs/cordis-api/inherited.md +0 -0
- package/references/official-docs/docs/cordis-api/registry.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-api/registry.md +0 -0
- package/references/official-docs/docs/cordis-api/registry.zh.md +0 -0
- package/references/official-docs/docs/cordis-api/service.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-api/service.md +0 -0
- package/references/official-docs/docs/cordis-api/service.zh.md +0 -0
- package/references/official-docs/docs/cordis-primer.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-primer.md +0 -0
- package/references/official-docs/docs/cordis-primer.zh.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/01-first-plugin.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-tutorial/01-first-plugin.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/01-first-plugin.zh.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/02-lifecycle-and-effects.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-tutorial/02-lifecycle-and-effects.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/02-lifecycle-and-effects.zh.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/03-services.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-tutorial/03-services.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/03-services.zh.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/04-events.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-tutorial/04-events.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/04-events.zh.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/05-config.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-tutorial/05-config.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/05-config.zh.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/06-composition-and-hmr.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-tutorial/06-composition-and-hmr.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/06-composition-and-hmr.zh.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/07-into-the-harness.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-tutorial/07-into-the-harness.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/07-into-the-harness.zh.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/index.i18n.yaml +0 -0
- package/references/official-docs/docs/cordis-tutorial/index.md +0 -0
- package/references/official-docs/docs/cordis-tutorial/index.zh.md +0 -0
- package/references/official-docs/docs/deepseek-llm-api-wire-extensions.i18n.yaml +0 -0
- package/references/official-docs/docs/deepseek-llm-api-wire-extensions.md +0 -0
- package/references/official-docs/docs/deepseek-llm-api-wire-extensions.zh.md +0 -0
- package/references/official-docs/docs/defensive-patterns/README.i18n.yaml +10 -0
- package/references/official-docs/docs/defensive-patterns/README.md +25 -0
- package/references/official-docs/docs/defensive-patterns/README.zh.md +27 -0
- package/references/official-docs/docs/defensive-patterns/client-components.i18n.yaml +46 -0
- package/references/official-docs/docs/defensive-patterns/client-components.md +493 -0
- package/references/official-docs/docs/defensive-patterns/client-components.zh.md +495 -0
- package/references/official-docs/docs/defensive-patterns/conversation-and-session.i18n.yaml +31 -0
- package/references/official-docs/docs/defensive-patterns/conversation-and-session.md +316 -0
- package/references/official-docs/docs/defensive-patterns/conversation-and-session.zh.md +316 -0
- package/references/official-docs/docs/defensive-patterns/general.i18n.yaml +52 -0
- package/references/official-docs/docs/defensive-patterns/general.md +222 -0
- package/references/official-docs/docs/defensive-patterns/general.zh.md +252 -0
- package/references/official-docs/docs/defensive-patterns/package-surface.i18n.yaml +28 -0
- package/references/official-docs/docs/defensive-patterns/package-surface.md +231 -0
- package/references/official-docs/docs/defensive-patterns/package-surface.zh.md +231 -0
- package/references/official-docs/docs/defensive-patterns/remote-and-api.i18n.yaml +16 -0
- package/references/official-docs/docs/defensive-patterns/remote-and-api.md +115 -0
- package/references/official-docs/docs/defensive-patterns/remote-and-api.zh.md +115 -0
- package/references/official-docs/docs/dependency-catalog.json +0 -0
- package/references/official-docs/docs/development.i18n.yaml +6 -6
- package/references/official-docs/docs/development.md +28 -10
- package/references/official-docs/docs/development.zh.md +29 -10
- package/references/official-docs/docs/event-producer-consumer.i18n.yaml +0 -0
- package/references/official-docs/docs/event-producer-consumer.md +18 -17
- package/references/official-docs/docs/event-producer-consumer.zh.md +18 -17
- package/references/official-docs/docs/experimental-persistence-catalog.i18n.yaml +0 -0
- package/references/official-docs/docs/experimental-persistence-catalog.md +0 -0
- package/references/official-docs/docs/experimental-persistence-catalog.zh.md +0 -0
- package/references/official-docs/docs/glossary.i18n.yaml +2 -2
- package/references/official-docs/docs/glossary.md +1 -0
- package/references/official-docs/docs/glossary.zh.md +1 -0
- package/references/official-docs/docs/graph-atlas.i18n.yaml +0 -0
- package/references/official-docs/docs/graph-atlas.md +0 -0
- package/references/official-docs/docs/graph-atlas.zh.md +0 -0
- package/references/official-docs/docs/i18n/README.i18n.yaml +0 -0
- package/references/official-docs/docs/i18n/README.md +0 -0
- package/references/official-docs/docs/i18n/README.zh.md +0 -0
- package/references/official-docs/docs/i18n/style-samples.md +2 -2
- package/references/official-docs/docs/i18n/terminology.md +1 -0
- package/references/official-docs/docs/i18n/translation-prompt.md +0 -0
- package/references/official-docs/docs/i18n/translation-rules.i18n.yaml +0 -0
- package/references/official-docs/docs/i18n/translation-rules.md +0 -0
- package/references/official-docs/docs/i18n/translation-rules.zh.md +0 -0
- package/references/official-docs/docs/module-graph.i18n.yaml +0 -0
- package/references/official-docs/docs/module-graph.md +79 -71
- package/references/official-docs/docs/module-graph.zh.md +79 -71
- package/references/official-docs/docs/persistence-catalog.i18n.yaml +267 -207
- package/references/official-docs/docs/persistence-catalog.md +385 -126
- package/references/official-docs/docs/persistence-catalog.zh.md +385 -126
- package/references/official-docs/docs/persistence-changes/2026-09-11-initial.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-11-initial.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-11-initial.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-11-initial.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-12-auto-review-error-metadata.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-12-auto-review-error-metadata.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-12-auto-review-error-metadata.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-12-auto-review-error-metadata.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-13-working-directory.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-13-working-directory.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-13-working-directory.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-13-working-directory.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-14-image-offload.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-14-image-offload.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-14-image-offload.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-14-image-offload.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-14-workspace-changes-event.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-14-workspace-changes-event.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-14-workspace-changes-event.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-14-workspace-changes-event.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-16-session-format-v4.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-16-session-format-v4.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-16-session-format-v4.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-16-session-format-v4.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-18-schedule-optional-title.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-18-schedule-optional-title.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-18-schedule-optional-title.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-18-schedule-optional-title.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-19-external-subagent-catalog.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-19-external-subagent-catalog.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-19-external-subagent-catalog.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-19-external-subagent-catalog.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-20-unknown-child-catalog.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-20-unknown-child-catalog.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-20-unknown-child-catalog.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-20-unknown-child-catalog.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-21-user-question-reply.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-21-user-question-reply.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-21-user-question-reply.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-21-user-question-reply.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-09-30-job-session-lifecycle.i18n.yaml +28 -0
- package/references/official-docs/docs/persistence-changes/2026-09-30-job-session-lifecycle.md +52 -0
- package/references/official-docs/docs/persistence-changes/2026-09-30-job-session-lifecycle.schema.json +297 -0
- package/references/official-docs/docs/persistence-changes/2026-09-30-job-session-lifecycle.zh.md +52 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-ptc-operation-metadata.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-ptc-operation-metadata.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-ptc-operation-metadata.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-ptc-operation-metadata.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-working-directory-attribution.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-working-directory-attribution.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-working-directory-attribution.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-05-working-directory-attribution.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-07-title-reasoning-effort.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-07-title-reasoning-effort.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-07-title-reasoning-effort.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-07-title-reasoning-effort.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/2026-10-13-deepseek-search-thinking.i18n.yaml +28 -0
- package/references/official-docs/docs/persistence-changes/2026-10-13-deepseek-search-thinking.md +48 -0
- package/references/official-docs/docs/persistence-changes/2026-10-13-deepseek-search-thinking.schema.json +231 -0
- package/references/official-docs/docs/persistence-changes/2026-10-13-deepseek-search-thinking.zh.md +48 -0
- package/references/official-docs/docs/persistence-changes/2026-10-13-user-rpc-principal.i18n.yaml +28 -0
- package/references/official-docs/docs/persistence-changes/2026-10-13-user-rpc-principal.md +60 -0
- package/references/official-docs/docs/persistence-changes/2026-10-13-user-rpc-principal.schema.json +11559 -0
- package/references/official-docs/docs/persistence-changes/2026-10-13-user-rpc-principal.zh.md +60 -0
- package/references/official-docs/docs/persistence-changes/README.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/README.md +0 -0
- package/references/official-docs/docs/persistence-changes/README.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/finalized/v4.json +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/README.i18n.yaml +2 -2
- package/references/official-docs/docs/persistence-changes/historical-formats/README.md +1 -1
- package/references/official-docs/docs/persistence-changes/historical-formats/README.zh.md +1 -1
- package/references/official-docs/docs/persistence-changes/historical-formats/v0.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v0.md +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v0.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v0.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v1.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v1.md +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v1.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v1.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v2.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v2.md +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v2.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v2.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v3.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v3.md +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v3.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/historical-formats/v3.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/README.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/README.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/README.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.1.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.2.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.3.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.4.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.0.1-rc.5.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.1.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.2.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.3.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.5.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.6.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.7.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.0-rc.8.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.1.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.1-rc.2.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.1.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.2.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.3.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.4.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-alpha.5.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.2-rc.1.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.1.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.3-alpha.2.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.1.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-alpha.2.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-rc.1.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.i18n.yaml +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.schema.json +0 -0
- package/references/official-docs/docs/persistence-changes/releases/dsh-v0.1.5-rc.2.zh.md +0 -0
- package/references/official-docs/docs/persistence-changes/releases/manifest.json +0 -0
- package/references/official-docs/docs/persistence-schema.json +1834 -1333
- package/references/official-docs/docs/postmortem/0001-acp-default-export-drops-inject.i18n.yaml +0 -0
- package/references/official-docs/docs/postmortem/0001-acp-default-export-drops-inject.md +0 -0
- package/references/official-docs/docs/postmortem/0001-acp-default-export-drops-inject.zh.md +0 -0
- package/references/official-docs/docs/postmortem/0002-js-expression-disabled-filesystem-tools.i18n.yaml +0 -0
- package/references/official-docs/docs/postmortem/0002-js-expression-disabled-filesystem-tools.md +0 -0
- package/references/official-docs/docs/postmortem/0002-js-expression-disabled-filesystem-tools.zh.md +0 -0
- package/references/official-docs/docs/postmortem/0003-web-agent-gui-feedback-loop.i18n.yaml +0 -0
- package/references/official-docs/docs/postmortem/0003-web-agent-gui-feedback-loop.md +0 -0
- package/references/official-docs/docs/postmortem/0003-web-agent-gui-feedback-loop.zh.md +0 -0
- package/references/official-docs/docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.i18n.yaml +0 -0
- package/references/official-docs/docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.md +0 -0
- package/references/official-docs/docs/postmortem/0004-landlock-partial-notice-misclassified-child-failures.zh.md +0 -0
- package/references/official-docs/docs/postmortem/README.i18n.yaml +0 -0
- package/references/official-docs/docs/postmortem/README.md +0 -0
- package/references/official-docs/docs/postmortem/README.zh.md +0 -0
- package/references/official-docs/docs/rescope.i18n.yaml +0 -0
- package/references/official-docs/docs/rescope.md +0 -0
- package/references/official-docs/docs/rescope.zh.md +0 -0
- package/references/official-docs/docs/session-format-status.i18n.yaml +0 -0
- package/references/official-docs/docs/session-format-status.md +0 -0
- package/references/official-docs/docs/session-format-status.zh.md +0 -0
- package/references/official-docs/docs/subsystems/README.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/README.md +0 -0
- package/references/official-docs/docs/subsystems/README.zh.md +0 -0
- package/references/official-docs/docs/subsystems/agent-team.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/agent-team.md +0 -0
- package/references/official-docs/docs/subsystems/agent-team.zh.md +0 -0
- package/references/official-docs/docs/subsystems/approval.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/approval.md +0 -0
- package/references/official-docs/docs/subsystems/approval.zh.md +0 -0
- package/references/official-docs/docs/subsystems/attachment.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/attachment.md +0 -0
- package/references/official-docs/docs/subsystems/attachment.zh.md +0 -0
- package/references/official-docs/docs/subsystems/boot.i18n.yaml +6 -0
- package/references/official-docs/docs/subsystems/boot.md +124 -0
- package/references/official-docs/docs/subsystems/boot.zh.md +124 -0
- package/references/official-docs/docs/subsystems/browser-use.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/browser-use.md +0 -0
- package/references/official-docs/docs/subsystems/browser-use.zh.md +0 -0
- package/references/official-docs/docs/subsystems/claude-code-mods.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/claude-code-mods.md +0 -0
- package/references/official-docs/docs/subsystems/claude-code-mods.zh.md +0 -0
- package/references/official-docs/docs/subsystems/client-modules.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/client-modules.md +14 -0
- package/references/official-docs/docs/subsystems/client-modules.zh.md +14 -0
- package/references/official-docs/docs/subsystems/client-resources.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/client-resources.md +0 -0
- package/references/official-docs/docs/subsystems/client-resources.zh.md +0 -0
- package/references/official-docs/docs/subsystems/commands.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/commands.md +0 -0
- package/references/official-docs/docs/subsystems/commands.zh.md +0 -0
- package/references/official-docs/docs/subsystems/compaction.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/compaction.md +0 -0
- package/references/official-docs/docs/subsystems/compaction.zh.md +0 -0
- package/references/official-docs/docs/subsystems/computer-use.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/computer-use.md +3 -0
- package/references/official-docs/docs/subsystems/computer-use.zh.md +3 -0
- package/references/official-docs/docs/subsystems/conversation.i18n.yaml +3 -3
- package/references/official-docs/docs/subsystems/conversation.md +14 -0
- package/references/official-docs/docs/subsystems/conversation.zh.md +16 -0
- package/references/official-docs/docs/subsystems/core.i18n.yaml +1 -1
- package/references/official-docs/docs/subsystems/core.md +3 -1
- package/references/official-docs/docs/subsystems/core.zh.md +5 -1
- package/references/official-docs/docs/subsystems/credentials.i18n.yaml +6 -6
- package/references/official-docs/docs/subsystems/credentials.md +13 -12
- package/references/official-docs/docs/subsystems/credentials.zh.md +13 -12
- package/references/official-docs/docs/subsystems/deliverables.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/deliverables.md +0 -0
- package/references/official-docs/docs/subsystems/deliverables.zh.md +0 -0
- package/references/official-docs/docs/subsystems/extensions.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/extensions.md +0 -0
- package/references/official-docs/docs/subsystems/extensions.zh.md +0 -0
- package/references/official-docs/docs/subsystems/feedback.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/feedback.md +0 -0
- package/references/official-docs/docs/subsystems/feedback.zh.md +0 -0
- package/references/official-docs/docs/subsystems/filesystem.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/filesystem.md +0 -0
- package/references/official-docs/docs/subsystems/filesystem.zh.md +0 -0
- package/references/official-docs/docs/subsystems/goal.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/goal.md +0 -0
- package/references/official-docs/docs/subsystems/goal.zh.md +0 -0
- package/references/official-docs/docs/subsystems/jobs.i18n.yaml +5 -2
- package/references/official-docs/docs/subsystems/jobs.md +60 -4
- package/references/official-docs/docs/subsystems/jobs.zh.md +60 -4
- package/references/official-docs/docs/subsystems/llm-streaming.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/llm-streaming.md +41 -1
- package/references/official-docs/docs/subsystems/llm-streaming.zh.md +41 -1
- package/references/official-docs/docs/subsystems/lsp.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/lsp.md +0 -0
- package/references/official-docs/docs/subsystems/lsp.zh.md +0 -0
- package/references/official-docs/docs/subsystems/mcp.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/mcp.md +0 -0
- package/references/official-docs/docs/subsystems/mcp.zh.md +0 -0
- package/references/official-docs/docs/subsystems/office-to-pdf.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/office-to-pdf.md +0 -0
- package/references/official-docs/docs/subsystems/office-to-pdf.zh.md +0 -0
- package/references/official-docs/docs/subsystems/otel.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/otel.md +0 -0
- package/references/official-docs/docs/subsystems/otel.zh.md +0 -0
- package/references/official-docs/docs/subsystems/permission-presets.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/permission-presets.md +0 -0
- package/references/official-docs/docs/subsystems/permission-presets.zh.md +0 -0
- package/references/official-docs/docs/subsystems/persistence.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/persistence.md +0 -0
- package/references/official-docs/docs/subsystems/persistence.zh.md +0 -0
- package/references/official-docs/docs/subsystems/plan.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/plan.md +0 -0
- package/references/official-docs/docs/subsystems/plan.zh.md +0 -0
- package/references/official-docs/docs/subsystems/product-telemetry.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/product-telemetry.md +4 -2
- package/references/official-docs/docs/subsystems/product-telemetry.zh.md +4 -2
- package/references/official-docs/docs/subsystems/ptc-runtime.i18n.yaml +4 -4
- package/references/official-docs/docs/subsystems/ptc-runtime.md +24 -6
- package/references/official-docs/docs/subsystems/ptc-runtime.zh.md +24 -6
- package/references/official-docs/docs/subsystems/sandbox.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/sandbox.md +0 -0
- package/references/official-docs/docs/subsystems/sandbox.zh.md +0 -0
- package/references/official-docs/docs/subsystems/schedule.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/schedule.md +0 -0
- package/references/official-docs/docs/subsystems/schedule.zh.md +0 -0
- package/references/official-docs/docs/subsystems/scope.i18n.yaml +1 -1
- package/references/official-docs/docs/subsystems/scope.md +0 -0
- package/references/official-docs/docs/subsystems/scope.zh.md +2 -0
- package/references/official-docs/docs/subsystems/session-projection.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/session-projection.md +0 -0
- package/references/official-docs/docs/subsystems/session-projection.zh.md +0 -0
- package/references/official-docs/docs/subsystems/session-query.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/session-query.md +0 -0
- package/references/official-docs/docs/subsystems/session-query.zh.md +0 -0
- package/references/official-docs/docs/subsystems/session-reference.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/session-reference.md +0 -0
- package/references/official-docs/docs/subsystems/session-reference.zh.md +0 -0
- package/references/official-docs/docs/subsystems/session-telemetry.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/session-telemetry.md +0 -0
- package/references/official-docs/docs/subsystems/session-telemetry.zh.md +0 -0
- package/references/official-docs/docs/subsystems/session-title.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/session-title.md +0 -0
- package/references/official-docs/docs/subsystems/session-title.zh.md +0 -0
- package/references/official-docs/docs/subsystems/session.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/session.md +11 -9
- package/references/official-docs/docs/subsystems/session.zh.md +11 -9
- package/references/official-docs/docs/subsystems/settings.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/settings.md +0 -0
- package/references/official-docs/docs/subsystems/settings.zh.md +0 -0
- package/references/official-docs/docs/subsystems/shell.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/shell.md +0 -0
- package/references/official-docs/docs/subsystems/shell.zh.md +0 -0
- package/references/official-docs/docs/subsystems/sidebar-right.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/sidebar-right.md +2 -0
- package/references/official-docs/docs/subsystems/sidebar-right.zh.md +2 -0
- package/references/official-docs/docs/subsystems/skills.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/skills.md +0 -0
- package/references/official-docs/docs/subsystems/skills.zh.md +0 -0
- package/references/official-docs/docs/subsystems/slots.i18n.yaml +8 -8
- package/references/official-docs/docs/subsystems/slots.md +80 -85
- package/references/official-docs/docs/subsystems/slots.zh.md +84 -85
- package/references/official-docs/docs/subsystems/spill.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/spill.md +0 -0
- package/references/official-docs/docs/subsystems/spill.zh.md +0 -0
- package/references/official-docs/docs/subsystems/ssh.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/ssh.md +0 -0
- package/references/official-docs/docs/subsystems/ssh.zh.md +0 -0
- package/references/official-docs/docs/subsystems/storage.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/storage.md +0 -0
- package/references/official-docs/docs/subsystems/storage.zh.md +0 -0
- package/references/official-docs/docs/subsystems/subagent.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/subagent.md +10 -18
- package/references/official-docs/docs/subsystems/subagent.zh.md +10 -18
- package/references/official-docs/docs/subsystems/subprocess.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/subprocess.md +0 -0
- package/references/official-docs/docs/subsystems/subprocess.zh.md +0 -0
- package/references/official-docs/docs/subsystems/system-prompt.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/system-prompt.md +0 -0
- package/references/official-docs/docs/subsystems/system-prompt.zh.md +0 -0
- package/references/official-docs/docs/subsystems/terminal.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/terminal.md +0 -0
- package/references/official-docs/docs/subsystems/terminal.zh.md +0 -0
- package/references/official-docs/docs/subsystems/todo.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/todo.md +0 -0
- package/references/official-docs/docs/subsystems/todo.zh.md +0 -0
- package/references/official-docs/docs/subsystems/token-meter.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/token-meter.md +0 -0
- package/references/official-docs/docs/subsystems/token-meter.zh.md +0 -0
- package/references/official-docs/docs/subsystems/tools.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/tools.md +0 -0
- package/references/official-docs/docs/subsystems/tools.zh.md +0 -0
- package/references/official-docs/docs/subsystems/translation.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/translation.md +1 -1
- package/references/official-docs/docs/subsystems/translation.zh.md +1 -1
- package/references/official-docs/docs/subsystems/typert.i18n.yaml +11 -8
- package/references/official-docs/docs/subsystems/typert.md +222 -17
- package/references/official-docs/docs/subsystems/typert.zh.md +222 -17
- package/references/official-docs/docs/subsystems/user-questions.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/user-questions.md +0 -0
- package/references/official-docs/docs/subsystems/user-questions.zh.md +0 -0
- package/references/official-docs/docs/subsystems/voice-input.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/voice-input.md +0 -0
- package/references/official-docs/docs/subsystems/voice-input.zh.md +0 -0
- package/references/official-docs/docs/subsystems/web-client.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/web-client.md +1 -1
- package/references/official-docs/docs/subsystems/web-client.zh.md +1 -1
- package/references/official-docs/docs/subsystems/web-server.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/web-server.md +44 -3
- package/references/official-docs/docs/subsystems/web-server.zh.md +44 -3
- package/references/official-docs/docs/subsystems/web.i18n.yaml +4 -4
- package/references/official-docs/docs/subsystems/web.md +2 -2
- package/references/official-docs/docs/subsystems/web.zh.md +2 -2
- package/references/official-docs/docs/subsystems/webhook.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/webhook.md +0 -0
- package/references/official-docs/docs/subsystems/webhook.zh.md +0 -0
- package/references/official-docs/docs/subsystems/workflow.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/workflow.md +0 -0
- package/references/official-docs/docs/subsystems/workflow.zh.md +0 -0
- package/references/official-docs/docs/subsystems/working-directory.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/working-directory.md +0 -0
- package/references/official-docs/docs/subsystems/working-directory.zh.md +0 -0
- package/references/official-docs/docs/subsystems/workspace.i18n.yaml +2 -2
- package/references/official-docs/docs/subsystems/workspace.md +23 -35
- package/references/official-docs/docs/subsystems/workspace.zh.md +23 -35
- package/references/official-docs/docs/subsystems/worktrees.i18n.yaml +0 -0
- package/references/official-docs/docs/subsystems/worktrees.md +0 -0
- package/references/official-docs/docs/subsystems/worktrees.zh.md +0 -0
- package/references/official-docs/docs/testing.i18n.yaml +2 -2
- package/references/official-docs/docs/testing.md +1 -1
- package/references/official-docs/docs/testing.zh.md +1 -1
- package/references/official-docs/docs/tool-catalog.i18n.yaml +12 -6
- package/references/official-docs/docs/tool-catalog.md +61 -10
- package/references/official-docs/docs/tool-catalog.zh.md +61 -10
- package/references/official-docs/docs/tool-execution-pipeline.i18n.yaml +0 -0
- package/references/official-docs/docs/tool-execution-pipeline.md +0 -0
- package/references/official-docs/docs/tool-execution-pipeline.zh.md +0 -0
- package/references/official-docs/docs/ui-radius.i18n.yaml +4 -4
- package/references/official-docs/docs/ui-radius.md +6 -4
- package/references/official-docs/docs/ui-radius.zh.md +6 -4
- package/references/official-docs/docs/upgrade-guide/v0.1.7-rc.2/schedule-optional-bundle/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.1.7-rc.2/schedule-optional-bundle/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.1.7-rc.2/schedule-optional-bundle/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.1.7-rc.2/transcript-view-legacy-normal/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.1.7-rc.2/transcript-view-legacy-normal/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.1.7-rc.2/transcript-view-legacy-normal/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/account-sign-in-errors/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/account-sign-in-errors/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/account-sign-in-errors/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/bundled-python-tests/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/bundled-python-tests/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/bundled-python-tests/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/primary-runtime-python-aliases/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/primary-runtime-python-aliases/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/primary-runtime-python-aliases/guide.zh.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/remove-runtime-invariants/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/remove-runtime-invariants/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/remove-runtime-invariants/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/schedule-bundle-retired/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/schedule-bundle-retired/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/schedule-bundle-retired/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/subpath-plugin-display-manifest/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/subpath-plugin-display-manifest/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.0-rc.2/subpath-plugin-display-manifest/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/deepseek-model-discovery/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/deepseek-model-discovery/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/deepseek-model-discovery/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/desktop-test-auth-popup/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/desktop-test-auth-popup/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/desktop-test-auth-popup/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/experimental-package-composition/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/instruction-home-override/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/instruction-home-override/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/instruction-home-override/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/job-id-identity/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/job-id-identity/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/job-id-identity/guide.zh.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/jsonl-persistence-plugin/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/jsonl-persistence-plugin/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/jsonl-persistence-plugin/guide.zh.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/mock-messages-events/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/mock-messages-events/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/mock-messages-events/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/native-subagent-bundle-tools/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/native-subagent-bundle-tools/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/native-subagent-bundle-tools/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/new-session-generations/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/new-session-generations/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/new-session-generations/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/plugin-option-placement/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/plugin-option-placement/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/plugin-option-placement/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-optional-resources/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-optional-resources/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-optional-resources/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/python-ptc-sandbox/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-adapters/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-adapters/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-adapters/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-provider-strategy/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-provider-strategy/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/session-title-provider-strategy/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/ssh-helper-launch/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/ssh-helper-launch/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/ssh-helper-launch/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/subagent-activations/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/subagent-activations/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/subagent-activations/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/subagent-preset-composition/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/subagent-preset-composition/guide.md +21 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/subagent-preset-composition/guide.zh.md +21 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/team-direct-inbox/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/team-direct-inbox/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/team-direct-inbox/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/terminal-command-labels/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/terminal-command-labels/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/terminal-command-labels/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/tool-presentation-mode/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/tool-presentation-mode/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/tool-presentation-mode/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/web-listener-trust-config/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/web-listener-trust-config/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/web-listener-trust-config/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/working-directory/guide.i18n.yaml +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/working-directory/guide.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.1/working-directory/guide.zh.md +0 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/deepseek-account-identity-watch/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/deepseek-account-identity-watch/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/deepseek-account-identity-watch/guide.zh.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/deepseek-account-model-catalog/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/deepseek-account-model-catalog/guide.md +27 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/deepseek-account-model-catalog/guide.zh.md +27 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/desktop-font-size-shortcuts/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/desktop-font-size-shortcuts/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/desktop-font-size-shortcuts/guide.zh.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/from-default-profile-replaces-target/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/from-default-profile-replaces-target/guide.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/from-default-profile-replaces-target/guide.zh.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/operator-connect/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/operator-connect/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/operator-connect/guide.zh.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.md +19 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-azure-provider/guide.zh.md +19 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-model-discovery/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-model-discovery/guide.md +17 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/pi-ai-model-discovery/guide.zh.md +17 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/plugin-install-over-installed/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/plugin-install-over-installed/guide.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/plugin-install-over-installed/guide.zh.md +20 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/sdk-minimal-image-compaction/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/sdk-minimal-image-compaction/guide.md +32 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/sdk-minimal-image-compaction/guide.zh.md +32 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/stored-credentials-precedence/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/stored-credentials-precedence/guide.md +25 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.2/stored-credentials-precedence/guide.zh.md +25 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.3/plugin-engines-dsh/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.3/plugin-engines-dsh/guide.md +21 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.3/plugin-engines-dsh/guide.zh.md +21 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.4/account-notification-fields/guide.i18n.yaml +16 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.4/account-notification-fields/guide.md +18 -0
- package/references/official-docs/docs/upgrade-guide/v0.2.1-alpha.4/account-notification-fields/guide.zh.md +18 -0
- package/references/official-docs/docs/user/develop/basic/config.i18n.yaml +0 -0
- package/references/official-docs/docs/user/develop/basic/config.md +0 -0
- package/references/official-docs/docs/user/develop/basic/config.zh.md +0 -0
- package/references/official-docs/docs/user/develop/basic/index.i18n.yaml +0 -0
- package/references/official-docs/docs/user/develop/basic/index.md +0 -0
- package/references/official-docs/docs/user/develop/basic/index.zh.md +0 -0
- package/references/official-docs/docs/user/develop/basic/publish.i18n.yaml +4 -4
- package/references/official-docs/docs/user/develop/basic/publish.md +3 -1
- package/references/official-docs/docs/user/develop/basic/publish.zh.md +3 -1
- package/references/official-docs/docs/user/develop/basic/tool.i18n.yaml +0 -0
- package/references/official-docs/docs/user/develop/basic/tool.md +0 -0
- package/references/official-docs/docs/user/develop/basic/tool.zh.md +0 -0
- package/references/official-docs/docs/user/develop/framework/events.i18n.yaml +0 -0
- package/references/official-docs/docs/user/develop/framework/events.md +0 -0
- package/references/official-docs/docs/user/develop/framework/events.zh.md +0 -0
- package/references/official-docs/docs/user/develop/framework/index.i18n.yaml +0 -0
- package/references/official-docs/docs/user/develop/framework/index.md +0 -0
- package/references/official-docs/docs/user/develop/framework/index.zh.md +0 -0
- package/references/official-docs/docs/user/develop/framework/service.i18n.yaml +0 -0
- package/references/official-docs/docs/user/develop/framework/service.md +0 -0
- package/references/official-docs/docs/user/develop/framework/service.zh.md +0 -0
- package/references/official-docs/docs/user/develop/practice/dynamic-cordis.i18n.yaml +0 -0
- package/references/official-docs/docs/user/develop/practice/dynamic-cordis.md +0 -0
- package/references/official-docs/docs/user/develop/practice/dynamic-cordis.zh.md +0 -0
- package/references/official-docs/docs/user/develop/practice/index.i18n.yaml +0 -0
- package/references/official-docs/docs/user/develop/practice/index.md +0 -0
- package/references/official-docs/docs/user/develop/practice/index.zh.md +0 -0
- package/references/official-docs/docs/user/develop/practice/llm-adapter.i18n.yaml +0 -0
- package/references/official-docs/docs/user/develop/practice/llm-adapter.md +0 -0
- package/references/official-docs/docs/user/develop/practice/llm-adapter.zh.md +0 -0
- package/references/official-docs/docs/user/guide/github-review.i18n.yaml +0 -0
- package/references/official-docs/docs/user/guide/github-review.md +0 -0
- package/references/official-docs/docs/user/guide/github-review.zh.md +0 -0
- package/references/official-docs/docs/user/guide/index.i18n.yaml +0 -0
- package/references/official-docs/docs/user/guide/index.md +0 -0
- package/references/official-docs/docs/user/guide/index.zh.md +0 -0
- package/references/official-docs/docs/user/guide/mcp-memory.i18n.yaml +0 -0
- package/references/official-docs/docs/user/guide/mcp-memory.md +0 -0
- package/references/official-docs/docs/user/guide/mcp-memory.zh.md +0 -0
- package/references/official-docs/docs/user/guide/network-proxy.i18n.yaml +0 -0
- package/references/official-docs/docs/user/guide/network-proxy.md +0 -0
- package/references/official-docs/docs/user/guide/network-proxy.zh.md +0 -0
- package/references/official-docs/docs/user/guide/plugin-market.i18n.yaml +34 -0
- package/references/official-docs/docs/user/guide/plugin-market.md +148 -0
- package/references/official-docs/docs/user/guide/plugin-market.zh.md +148 -0
- package/references/official-docs/docs/user/guide/providers-custom-form.png +0 -0
- package/references/official-docs/docs/user/guide/providers-custom-form.zh.png +0 -0
- package/references/official-docs/docs/user/guide/providers-models-page.png +0 -0
- package/references/official-docs/docs/user/guide/providers-models-page.zh.png +0 -0
- package/references/official-docs/docs/user/guide/providers.i18n.yaml +11 -8
- package/references/official-docs/docs/user/guide/providers.md +27 -4
- package/references/official-docs/docs/user/guide/providers.zh.md +27 -4
- package/references/official-docs/docs/user/guide/public-deployments.i18n.yaml +2 -2
- package/references/official-docs/docs/user/guide/public-deployments.md +1 -1
- package/references/official-docs/docs/user/guide/public-deployments.zh.md +1 -1
- package/references/official-docs/docs/user/guide/python-sdk.i18n.yaml +4 -4
- package/references/official-docs/docs/user/guide/python-sdk.md +8 -9
- package/references/official-docs/docs/user/guide/python-sdk.zh.md +8 -9
- package/references/official-docs/docs/user/guide/schedule.i18n.yaml +0 -0
- package/references/official-docs/docs/user/guide/schedule.md +0 -0
- package/references/official-docs/docs/user/guide/schedule.zh.md +0 -0
- package/references/official-docs/docs/user/index.i18n.yaml +0 -0
- package/references/official-docs/docs/user/index.md +0 -0
- package/references/official-docs/docs/user/index.zh.md +0 -0
- package/references/official-docs/docs/web-styling.i18n.yaml +0 -0
- package/references/official-docs/docs/web-styling.md +0 -0
- package/references/official-docs/docs/web-styling.zh.md +0 -0
- package/references/official-docs/packages/AGENTS.md +2 -0
- package/references/official-docs/packages/README.md +0 -0
- package/references/official-docs/vendor/README.md +4 -0
- package/references/official-docs/website-docs.ts +8 -0
- package/references/official-plugin-dev-skill.md +0 -0
- package/references/sources.md +0 -0
- package/references/upstream-cordis.md +0 -0
- package/references/website-pages.md +0 -0
- package/scripts/archive-discussions.ps1 +0 -0
- package/scripts/build-llms-full.mjs +0 -0
- package/scripts/check-docs-drift-detail.mjs +0 -0
- package/scripts/check-docs-drift.ps1 +0 -0
- package/scripts/check-facts.mjs +0 -0
- package/scripts/check-ps1-bom.mjs +0 -0
- package/scripts/check-readme-parity.mjs +0 -0
- package/scripts/check-readme-sync.mjs +0 -0
- package/scripts/download-community-articles.ps1 +188 -188
- package/scripts/download-community-repos.ps1 +232 -232
- package/scripts/download-sources.ps1 +195 -195
- package/scripts/gen-topic-snapshot.ps1 +91 -91
- package/scripts/install-skill.ps1 +63 -63
- package/scripts/measure-mirror-references.mjs +0 -0
- package/scripts/sync-official-docs.ps1 +0 -0
- package/scripts/verify-artifacts.mjs +0 -0
- package/scripts/verify-kit.ps1 +0 -0
- package/templates/js/LICENSE +0 -0
- package/templates/js/README-es.md +0 -0
- package/templates/js/README-hi.md +0 -0
- package/templates/js/README-pt.md +0 -0
- package/templates/js/README-zh.md +0 -0
- package/templates/js/README.md +0 -0
- package/templates/js/cordis.patch.yml +0 -0
- package/templates/js/icon.svg +4 -4
- package/templates/js/index.js +0 -0
- package/templates/js/locale/en.json +6 -6
- package/templates/js/locale/zh.json +6 -6
- package/templates/js/package.json +43 -43
- package/templates/js/tests/index.test.js +0 -0
- package/templates/ts/LICENSE +0 -0
- package/templates/ts/README-es.md +0 -0
- package/templates/ts/README-hi.md +0 -0
- package/templates/ts/README-pt.md +0 -0
- package/templates/ts/README-zh.md +0 -0
- package/templates/ts/README.md +0 -0
- package/templates/ts/cordis.patch.yml +0 -0
- package/templates/ts/icon.svg +4 -4
- package/templates/ts/locale/en.json +6 -6
- package/templates/ts/locale/zh.json +6 -6
- package/templates/ts/package.json +52 -52
- package/templates/ts/src/config.ts +0 -0
- package/templates/ts/src/index.ts +0 -0
- package/templates/ts/tests/index.test.ts +0 -0
- package/templates/ts/tsconfig.json +0 -0
- package/templates/ts/tsdown.config.mjs +21 -21
- package/templates/ts/vitest.config.ts +0 -0
- package/references/official-docs/docs/defensive-patterns.i18n.yaml +0 -28
- package/references/official-docs/docs/defensive-patterns.md +0 -33
- package/references/official-docs/docs/defensive-patterns.zh.md +0 -35
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Bilingual-pair consistency record for general.md (docs/i18n/README.md): per heading
|
|
2
|
+
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
|
|
3
|
+
# After editing either side, bring the other along and re-record with:
|
|
4
|
+
# pnpm run verify-translation-pairing --write docs/defensive-patterns/general.md
|
|
5
|
+
/defensive-patterns:
|
|
6
|
+
en: 324de84cf5239e89
|
|
7
|
+
zh: b3bdfb17d01e5a6c
|
|
8
|
+
/defensive-patterns/report-orthogonal-outcomes-independently:
|
|
9
|
+
en: c16f636f8f522db4
|
|
10
|
+
zh: 94c523b536df786d
|
|
11
|
+
/defensive-patterns/honor-public-contracts-on-both-sides:
|
|
12
|
+
en: 656746d485640b3a
|
|
13
|
+
zh: f75cd0333dc5bc9b
|
|
14
|
+
/defensive-patterns/async-state-is-not-synchronous-state:
|
|
15
|
+
en: f58b3f3fb047f434
|
|
16
|
+
zh: daea224503617808
|
|
17
|
+
/defensive-patterns/timing-does-not-carry-correctness:
|
|
18
|
+
en: 5778664b676a0079
|
|
19
|
+
zh: e99aeabf0631f647
|
|
20
|
+
/defensive-patterns/optional-inputs-state-both-behaviors:
|
|
21
|
+
en: 243e275fee74f54e
|
|
22
|
+
zh: a58e04b6e3ac0e7a
|
|
23
|
+
/defensive-patterns/one-value-states-one-fact:
|
|
24
|
+
en: 598d9041ccfaba7c
|
|
25
|
+
zh: 2ac9f98c97015f66
|
|
26
|
+
/defensive-patterns/a-new-active-current-singleton-is-refused:
|
|
27
|
+
en: 8bf36acf96fa4c33
|
|
28
|
+
zh: bb6db31a63bcf383
|
|
29
|
+
/defensive-patterns/shared-state-has-one-owner:
|
|
30
|
+
en: 053e2c485eec2613
|
|
31
|
+
zh: 2817da00572c789f
|
|
32
|
+
/defensive-patterns/a-business-capability-owns-itself:
|
|
33
|
+
en: 7588b8dba9279dac
|
|
34
|
+
zh: 2760468ede60220c
|
|
35
|
+
/defensive-patterns/changes-carry-performance-evidence:
|
|
36
|
+
en: 0d6855d1ae0ef4ae
|
|
37
|
+
zh: 0f771999398ce052
|
|
38
|
+
/defensive-patterns/migrations-preserve-behavior:
|
|
39
|
+
en: 6213e051f51437b8
|
|
40
|
+
zh: 853580b3a4fec100
|
|
41
|
+
/defensive-patterns/dispose-must-reach-quiescence-not-just-request-it:
|
|
42
|
+
en: d487ad57fdb16472
|
|
43
|
+
zh: eb5efe8b079b9521
|
|
44
|
+
/defensive-patterns/contain-callback-exceptions-in-the-dispatcher:
|
|
45
|
+
en: ae2332afa54cb253
|
|
46
|
+
zh: db51fedb070d9a83
|
|
47
|
+
/defensive-patterns/never-hand-untrusted-output-the-ambient-environment-or-predictable-paths:
|
|
48
|
+
en: 6fb7938f5197f520
|
|
49
|
+
zh: 01eb670a852f24e6
|
|
50
|
+
/defensive-patterns/unlink-link-shaped-paths:
|
|
51
|
+
en: 35944dc084b41ded
|
|
52
|
+
zh: 0e59beebd9fb6d22
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# Defensive patterns
|
|
2
|
+
|
|
3
|
+
English | [中文](general.zh.md)
|
|
4
|
+
|
|
5
|
+
Hard-won bug-class rules: each pattern below is a class of defect that actually shipped or nearly shipped here, stated as the rule that prevents its recurrence. Read this before writing lifecycle, concurrency, subprocess, or teardown code. Test-tier counterparts (real entry path, world-verification, resource ownership) are in [testing.md](../testing.md); the type-level definitions these rules refer to live in [subsystems/](../subsystems/README.md).
|
|
6
|
+
|
|
7
|
+
## Report orthogonal outcomes independently
|
|
8
|
+
|
|
9
|
+
A result can be several things at once — a process can time out AND exit 0 because it trapped the signal. Surface each independent fact (`timedOut`, `signal`, `exitCode`) on its own; never nest one flag's report inside another's branch, or a caller reads a cut-short run as a clean success.
|
|
10
|
+
|
|
11
|
+
A reviewer checks the reporting shape rather than the killing mechanism: can each fact be true independently, and is each one readable without entering another condition's branch? The boundary is the report — how the process is signalled or how long it is given is a separate decision.
|
|
12
|
+
|
|
13
|
+
## Honor public contracts on BOTH sides
|
|
14
|
+
|
|
15
|
+
When an implementation receives several representations of one outcome, normalize them before returning through the public API. `LlmAdapter.stream()` implementations may throw or emit `finish {kind:'error'|'aborted'}`, but `LlmRuntime.stream()` exposes model-request failures only as terminal finish chunks; middleware and consumer defects remain thrown. This keeps consumers from guessing whether a caught exception came from the provider, a wrapper, chunk logging, or their own assembly. Document the normalized contract where the type is defined; exercise every source form through the real consumer.
|
|
16
|
+
|
|
17
|
+
The judged condition is whether a consumer can name the source of a failure from the public API alone. Internal helpers stay free to throw: the requirement binds the boundary the consumer crosses, not every function behind it.
|
|
18
|
+
|
|
19
|
+
## Async state is not synchronous state
|
|
20
|
+
|
|
21
|
+
`agent.followup()` has no per-message completion or result; a background job's completion races turn boundaries; `reader.close()` fires for both EOF and disposal. Never treat `agent/status` or `whenIdle()` as the result of one follow-up: several queued follow-ups, steering, and injected work may share one `running` interval, while cancellation or disposal can discard unstarted items. An automation caller that truly owns a run must define its interval explicitly—for example, from its message's durable inbox receipt through the next whole-agent `idle`—and describe any selected output as interval-wide rather than causally attributed to that message. The guard cuts both ways: if the awaited transition can never occur, the wait hangs, so handle the "nothing to wait for" branch explicitly.
|
|
22
|
+
|
|
23
|
+
The judged condition is whether an agent can observe a per-unit completion the API does not define. Where the interval genuinely belongs to the caller, it is the caller that states the interval and the output scope; a shared `running` flag is never that statement.
|
|
24
|
+
|
|
25
|
+
## Timing does not carry correctness
|
|
26
|
+
|
|
27
|
+
Correctness comes from explicit call points and explicit state, never from where a callback lands in the event loop. A `microtask`, `setTimeout`, or `queueMicrotask` that decides whether work is correct races the rest of the program: it holds under a light load and silently fails under a busy one or when batching changes. React code follows the same rule — an effect never supplies a "just after render" ordering that the design should have made explicit.
|
|
28
|
+
|
|
29
|
+
The judged condition is whether correctness depends on "that callback already ran" instead of on a named call point or state machine. Two boundaries: a test's timeout budget waits for a failure and is not timing-dependent correctness, and a deliberate delay that only paces user-visible work is not this rule. There is no developer-side exception; a genuine need for a timing technique goes to the domain owner.
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
// The order is written into the code: dispose the old store, then build its successor.
|
|
33
|
+
declare let store: { dispose(): void }
|
|
34
|
+
declare function createStore(scopeKey: string): { dispose(): void }
|
|
35
|
+
declare const scopeKey: string
|
|
36
|
+
|
|
37
|
+
store.dispose()
|
|
38
|
+
store = createStore(scopeKey)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```ts ignore-check
|
|
42
|
+
queueMicrotask(() => { if (!ready) refresh() }) // assumes the microtask runs before the next frame
|
|
43
|
+
setTimeout(() => setMounted(true), 0) // waits for a render that was never sequenced
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The wrong form fails intermittently: a dropped refresh or a state that never syncs, reproducing only under load.
|
|
47
|
+
|
|
48
|
+
## Optional inputs state both behaviors
|
|
49
|
+
|
|
50
|
+
An optional parameter states what the callee does when it is present and when it is absent, so a caller reads both behaviors from the contract instead of inferring one from a defensive operator. Accumulating `?.` is the signal: each one substitutes for a decision about whether the field should exist at all.
|
|
51
|
+
|
|
52
|
+
The judged condition is whether `?.` replaces a determination that a field exists rather than handling a genuinely optional hop on a known value. The requirement binds the interface contract: both branches state their return value and their side effects, and the contract is where the caller reads them. There is no exception channel — a call site that cannot state both behaviors is a review blocker, not a style preference.
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
// Both behaviors are in the contract: no options object means "unknown", not "skip".
|
|
56
|
+
interface ResolveInput { options?: readonly string[] }
|
|
57
|
+
type Resolution = { kind: 'unknown' } | { kind: 'value'; value: string }
|
|
58
|
+
|
|
59
|
+
function resolve(input: ResolveInput): Resolution {
|
|
60
|
+
if (input.options === undefined) return { kind: 'unknown' }
|
|
61
|
+
return { kind: 'value', value: input.options.join(',') }
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```ts ignore-check
|
|
66
|
+
const value = a?.b?.c?.d ?? fallback // four layers of fallback hide whether d should exist
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The wrong form keeps the contract vague and swallows the error, so the next caller adds another fallback on top.
|
|
70
|
+
|
|
71
|
+
## One value states one fact
|
|
72
|
+
|
|
73
|
+
An unknown value, an empty collection or string, and a genuinely absent field are three different facts and take three representations. One `undefined` or `null` never stands for several of them, and a consumer that must act differently on each discriminates explicitly instead of collapsing them at the boundary.
|
|
74
|
+
|
|
75
|
+
The judged condition is whether a single "no value" carries more than one semantic: not yet queried, queried and empty, and cannot be determined. A discriminated union or an explicit enum value is the ordinary implementation, documented where the type is defined in [core.md](../subsystems/core.md#repo-wide-type-patterns).
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
type ValueState<T> = { kind: 'unknown' } | { kind: 'empty' } | { kind: 'value'; value: T }
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```ts ignore-check
|
|
82
|
+
return null // means "not queried", "queried, nothing there", and "cannot tell", all at once
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The wrong form leaves the caller unable to distinguish the cases, so UI states, cache policy, and retry decisions all go wrong.
|
|
86
|
+
|
|
87
|
+
## A new active/current singleton is refused
|
|
88
|
+
|
|
89
|
+
No new global `active` or `current` singleton is introduced, and existing ones are migrated out. A globally unique selection is a design statement this codebase does not make: several views of one piece of data each hold their own reference or key.
|
|
90
|
+
|
|
91
|
+
The judged condition is whether the change introduces a globally unique selected-state field. The replacement shape is one piece of data with several views over it, each view carrying its own reference. There is no default exception; where the concept genuinely exists once per service, a service or instance field expressed through `inject` carries it, never a module-level field.
|
|
92
|
+
|
|
93
|
+
```ts ignore-check
|
|
94
|
+
// Each view holds the key it renders; nothing global decides what is "current".
|
|
95
|
+
function ConversationView({ sessionKey }: { sessionKey: SessionKey }) { /* … */ }
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
```ts ignore-check
|
|
99
|
+
let activeTabId: TabId | undefined // module-level; every component reads the same one
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
The wrong form makes independent instances interfere with each other, and no reviewer can audit which view owns the focus.
|
|
103
|
+
|
|
104
|
+
## Shared state has one owner
|
|
105
|
+
|
|
106
|
+
Shared state hangs on a service or an instance, so its owner is a named object with a lifecycle. A module-level cache, a singleton, a global `WeakMap`, or a `Symbol.for` / `globalThis` / `window.__X__` bypass hides that owner and outlives every teardown.
|
|
107
|
+
|
|
108
|
+
The judged condition: name the service or instance that owns the value; if no owner can be named, the owner is decided before the implementation. The boundary is that a field on a service or instance may be read by any number of injected consumers, and passing that value across domains goes through the existing interface rather than a global namespace. There is no default exception; a genuine need for a global lookup key goes to the domain owner together with its reclamation policy.
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
// The shared value hangs on the session service instance; consumers inject it.
|
|
112
|
+
interface Sessions { readonly current: string }
|
|
113
|
+
declare const ctx: { get(name: 'sessions'): Sessions }
|
|
114
|
+
|
|
115
|
+
const sessions = ctx.get('sessions') // one owner, lifetime tied to the service
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
```ts ignore-check
|
|
119
|
+
globalThis.__dshCache = new Map() // shared across instances, reclaimed never
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
The wrong form lets instances overwrite each other, makes reclamation timing unknowable, and leaks state between tests.
|
|
123
|
+
|
|
124
|
+
## A business capability owns itself
|
|
125
|
+
|
|
126
|
+
A business capability lives in its own package and attaches through a registration surface — a registry, `slots.inject`, a waterfall, or an event subscription. A runtime, controller, manager, or gateway carries generic orchestration: it may hold the registry structure and the disposal lifecycle, while the entries are written by the packages that own them, and it never hardcodes a central table of business rows.
|
|
127
|
+
|
|
128
|
+
The judged condition is whether the capability declares and registers itself, with the center layer only forwarding and managing lifetime rather than making business decisions. The boundary is that the center layer holds the registry structure and the disposal lifecycle while the entries come from the owning packages. One exception: pure infrastructure — logging, transport, storage — does not attach through a business registration surface. A new branch in a center layer must explain why it cannot live in the owning package.
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
// The business package registers its own slot and handlers in its apply.
|
|
132
|
+
interface Slots {
|
|
133
|
+
inject(name: string, register: () => void): void
|
|
134
|
+
register(name: string): void
|
|
135
|
+
}
|
|
136
|
+
interface Context { readonly slots: Slots }
|
|
137
|
+
|
|
138
|
+
export function apply(ctx: Context): void {
|
|
139
|
+
ctx.slots.inject('conversation.footer', () => ctx.slots.register('conversation.footer'))
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
```ts ignore-check
|
|
144
|
+
if (pluginName === 'ui-attachment') { /* business branch inside the manager */ }
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
The wrong form makes every new capability edit the center layer, which becomes the change bottleneck and the conflict hotspot.
|
|
148
|
+
|
|
149
|
+
## Changes carry performance evidence
|
|
150
|
+
|
|
151
|
+
A change that can move the cost of a hot path measures the code it touched before and after and reports the numbers with their conditions. The three metrics are runtime, peak memory, and steady-state memory, measured in one environment on one input; the granularity is the changed path, not a whole-machine score. Reporting that "nothing got slower overall" is not evidence, and a path that improved elsewhere does not excuse a regression here — an optimised first paint still has to answer for `append`.
|
|
152
|
+
|
|
153
|
+
The judged condition: under one environment and one input, any of the three metrics is significantly worse on the changed path.
|
|
154
|
+
|
|
155
|
+
The baseline is the same path without the change under measurement — normally the native implementation that carries no measurement hook, not the previous implementation. Comparing old against new with the same hook attached on both sides dilutes the difference until it disappears: both sides pay the same overhead, so the measurement reports "no change" while both are slow.
|
|
156
|
+
|
|
157
|
+
Measurement is owned by [benchmarks/](../../benchmarks/AGENTS.md), one directory per measured user path, and its scenarios are the entry point:
|
|
158
|
+
|
|
159
|
+
```sh
|
|
160
|
+
# Run the owning scenario before and after the change; the numbers go into the PR.
|
|
161
|
+
pnpm run test:bench
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Package-local diagnostics stay beside their owner with the `.perf.ts` suffix and do not join `test:bench`. The CI gate is `pnpm run check:ci:bench` (job `node 24 / benchmarks`), which publishes a scaled report — that gate is an alert, not a pass: a regression there is located by re-running the owning scenario and profiling segments locally to find which part slowed and which change introduced it. Retained-memory claims use `pnpm run test:bench:memory 4g|8g`, which reruns its listed files under an unchanged budget in a swapless cgroup.
|
|
165
|
+
|
|
166
|
+
Boundaries: edits that touch no runtime path — comments, documentation, test-only code — need no measurement, and production performance code is not benchmark instrumentation to be deleted opportunistically (`performance.now()` and `scheduler.yield()` are part of production decode and encode chunk scheduling). An architectural change that genuinely costs performance states the measured cost and the reason, and the domain owner approves it; "the layering needed it" is not a self-service reason. Record the command, the numbers, the environment, and the input size so the baseline can be rebuilt.
|
|
167
|
+
|
|
168
|
+
```text
|
|
169
|
+
CI benchmark reported green, so the change is accepted as performance-neutral.
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
That form ships a real regression in a path the benchmark does not model.
|
|
173
|
+
|
|
174
|
+
## Migrations preserve behavior
|
|
175
|
+
|
|
176
|
+
A migration or a package split keeps externally observable behavior equal: error codes, diagnostics, data-flow order, and UI timing are compared item by item. Moving code is preferred over deleting and rewriting it; a rewrite suits code whose semantics are changing anyway, and then the change lists its differences. A package or export-path change is a carrier change rather than a behavior change, and a behavior change is its own change.
|
|
177
|
+
|
|
178
|
+
The judged condition is the item-by-item comparison of observable behavior before and after. Where full equality is impossible, the change states the differing items and how each is verified, and the domain owner approves. A defect found during a migration is fixed as its own change rather than folded into the move.
|
|
179
|
+
|
|
180
|
+
```sh
|
|
181
|
+
# The move keeps paths and error codes; the reference updates are the whole diff.
|
|
182
|
+
git mv packages/old/src/endpoint.ts packages/new/src/endpoint.ts
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
```ts ignore-check
|
|
186
|
+
// The migration silently upgrades the error handling it was only supposed to move.
|
|
187
|
+
throw new EndpointError('not found') // was: return { ok: false, code: 'not_found' }
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
The wrong form buries behavior changes inside a move, so review cannot separate the relocation from the semantics and regressions cannot be localized.
|
|
191
|
+
|
|
192
|
+
## Dispose must reach quiescence, not just request it
|
|
193
|
+
|
|
194
|
+
Await child exit after killing or aborting. Optional notifications may stop early; resources and listeners needed for completion or final persistence must survive until consumers settle. See the [Cordis ownership checks](../../.agents/skills/cordis-styling-nitpicking/SKILL.md#p0-cleanup-dependency-released-before-consumer-completion).
|
|
195
|
+
|
|
196
|
+
The judged condition is whether teardown awaits actual quiescence or only requests it. The boundary is work with no owner to await — a detached, unobserved task — which the teardown is not obliged to track; anything the component started and can still observe must be awaited before it reports completion.
|
|
197
|
+
|
|
198
|
+
## Contain callback exceptions in the dispatcher
|
|
199
|
+
|
|
200
|
+
Catch and report each listener's exception without rejecting the dispatch promise or starving later listeners. The listener's owner must handle state it mutates under the [error-handling rules](../../.agents/skills/dsh-error-handling/SKILL.md#catch-recover-or-stop); catching alone does not restore state.
|
|
201
|
+
|
|
202
|
+
The judged condition is whether a throwing listener can reject the dispatch promise or prevent later listeners from running. The boundary is the caller's own await: an error the dispatcher deliberately propagates to the operation that requested it is not a containment failure.
|
|
203
|
+
|
|
204
|
+
```ts
|
|
205
|
+
async function dispatch(listeners: ((event: string) => Promise<void>)[], event: string): Promise<void> {
|
|
206
|
+
for (const listener of listeners) {
|
|
207
|
+
try { await listener(event) } catch (error) { console.warn('listener failed', error) }
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Never hand untrusted output the ambient environment or predictable paths
|
|
213
|
+
|
|
214
|
+
Spawned commands get a scrubbed env (drop `*KEY*`/`*SECRET*`/`*TOKEN*`/`*PASSWORD*`) so harness credentials cannot leak into output, `env`, or spill files. Temp/spill files use a private (0700) dir, random names, and exclusive owner-only opens (`'wx'`, `0o600`) — predictable world-readable paths invite symlink races and disclosure.
|
|
215
|
+
|
|
216
|
+
The judged condition is whether spawned processes inherit the ambient environment or write somewhere another process can predict and replace. The boundary is trusted, in-process code with no external input, which the rule does not govern.
|
|
217
|
+
|
|
218
|
+
## Unlink link-shaped paths
|
|
219
|
+
|
|
220
|
+
A path that may be a symlink or Windows junction is removed with `lstatSync().isSymbolicLink()` then `unlinkSync`: unlink deletes only the link and refuses a real directory, so it never follows the link into its target. Windows `rmSync(link)` throws `ERR_FS_EISDIR` on a junction; recursive deletion may descend through one into its target. Reserve recursive `rmSync` for known real directories.
|
|
221
|
+
|
|
222
|
+
The judged condition is whether the removal primitive can follow a link into its target. The boundary is a path the code created itself in a directory it owns, where a plain recursive removal is already known to be safe.
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# 防御性模式
|
|
2
|
+
|
|
3
|
+
[English](general.md) | 中文
|
|
4
|
+
|
|
5
|
+
来之不易的缺陷类别规则:下面每条模式都是本项目实际发布或差点发布的一类缺陷,以防止其复发的规则形式陈述。在编写生命周期、并发、子进程或清理代码之前请先阅读本文。测试层面的对应规则(真实入口路径、验证实际结果、资源归属)见 [testing.zh.md](../testing.zh.md);这些规则引用的类型定义正家见 [subsystems/](../subsystems/README.zh.md)。
|
|
6
|
+
|
|
7
|
+
<a id="report-orthogonal-outcomes-independently"></a>
|
|
8
|
+
|
|
9
|
+
## 正交结果独立上报
|
|
10
|
+
|
|
11
|
+
一个结果可以同时具有多种性质:进程可能已经超时,却仍以退出码 0 结束,因为它捕获了终止信号。每个独立事实(`timedOut`、`signal`、`exitCode`)都应单独上报;切勿把一个标志的上报嵌套在另一个标志的分支中,否则调用方可能把提前终止的运行误判为正常成功。
|
|
12
|
+
|
|
13
|
+
评审看的是**上报形态**而不是终止机制:每个事实能否独立为真,以及能否不进入另一个条件分支就读到它?边界就是这个上报本身——如何发信号、给多长时间是另一个决定。
|
|
14
|
+
|
|
15
|
+
<a id="honor-public-contracts-on-both-sides"></a>
|
|
16
|
+
|
|
17
|
+
## 公共约定两侧都要遵守
|
|
18
|
+
|
|
19
|
+
当一个实现收到同一结果的多种表示时,应在通过公共 API 返回前将其规范化。`LlmAdapter.stream()` 的实现可以抛出异常或发出 `finish {kind:'error'|'aborted'}`,但 `LlmRuntime.stream()` 只会通过终止型 finish 分片暴露模型请求失败;middleware 缺陷与消费方缺陷仍会以异常形式抛出。这使消费方不必猜测捕获的异常究竟来自提供方、包装层、分片日志记录还是自身组装逻辑。请在类型定义处记录规范化后的约定;通过真实消费方覆盖每种来源形式。
|
|
20
|
+
|
|
21
|
+
判定条件是:消费方能否仅凭公共 API 说出故障的来源。内部 helper 仍可自由抛错:这条要求约束的是消费方跨越的那个边界,而不是它背后的每个函数。
|
|
22
|
+
|
|
23
|
+
<a id="async-state-is-not-synchronous-state"></a>
|
|
24
|
+
|
|
25
|
+
## 异步状态不是同步状态
|
|
26
|
+
|
|
27
|
+
`agent.followup()` 没有逐消息的完成状态或结果;后台任务的完成与轮次边界存在竞争;`reader.close()` 在 EOF 和 dispose(资源释放)两种情况下都会触发。切勿把 `agent/status` 或 `whenIdle()` 当作某次 `followup()` 的结果:多条已排队的后续消息、steering(中途引导)和注入工作可能共用同一个 `running` 区间,而取消或资源释放可能丢弃尚未启动的项。真正拥有一次运行的自动化调用方必须显式定义其区间——例如从消息的持久 inbox 回执到整个 agent(智能体)下一次进入 `idle`——并将选取的任何输出描述为整个区间的输出,而不是把因果关系归于该消息。这条守则是双向的:如果等待的转换永远不会发生,等待就会挂起,因此应显式处理「无需等待」的分支。
|
|
28
|
+
|
|
29
|
+
判定条件是:调用方是否观察到一个 API 并未定义的逐单元完成态。区间确实属于调用方时,就由调用方声明区间与输出范围;共享的 `running` 标志永远不是这份声明。
|
|
30
|
+
|
|
31
|
+
<a id="timing-does-not-carry-correctness"></a>
|
|
32
|
+
|
|
33
|
+
## 时序不承载正确性
|
|
34
|
+
|
|
35
|
+
正确性来自显式调用点与显式状态,而不是回调落在事件循环的哪个位置。用 `microtask`、`setTimeout` 或 `queueMicrotask` 决定某项工作是否正确,是在与程序其余部分竞争:轻负载下成立,重负载或合批行为一变就静默失效。React 代码同理——effect 绝不提供那种本应由设计显式给出的「渲染之后」次序。
|
|
36
|
+
|
|
37
|
+
判定条件是:正确性是否依赖「那个回调已经跑过」,而不是具名调用点或状态机。两条边界:测试的 timeout 预算是在等失败,不属于靠时序保正确性;纯粹为可见工作 pacing 的延迟也不属本条。开发者一侧没有例外通道,确需时序技巧须经对应领域专家确认。
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
// The order is written into the code: dispose the old store, then build its successor.
|
|
41
|
+
declare let store: { dispose(): void }
|
|
42
|
+
declare function createStore(scopeKey: string): { dispose(): void }
|
|
43
|
+
declare const scopeKey: string
|
|
44
|
+
|
|
45
|
+
store.dispose()
|
|
46
|
+
store = createStore(scopeKey)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```ts ignore-check
|
|
50
|
+
queueMicrotask(() => { if (!ready) refresh() }) // assumes the microtask runs before the next frame
|
|
51
|
+
setTimeout(() => setMounted(true), 0) // waits for a render that was never sequenced
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
反例的失效是间歇性的:偶发丢刷新,或状态永远没同步,只在压力大时复现。
|
|
55
|
+
|
|
56
|
+
<a id="optional-inputs-state-both-behaviors"></a>
|
|
57
|
+
|
|
58
|
+
## 可选输入要写明两种行为
|
|
59
|
+
|
|
60
|
+
可选参数要写明被调用方在**传入**与**不传入**两种情况下各自的行为,调用方从契约里读到两种行为,而不是靠防御性运算符去猜其中一种。堆积 `?.` 就是这个信号:每一个都在替代「这个字段到底应不应该存在」的判断。
|
|
61
|
+
|
|
62
|
+
判定条件是:`?.` 是否被用来替代「该字段存在」的判定,而不是在处理一个已知值上真正可选的一跳。这条要求约束接口契约:两个分支都要写明返回值与副作用,并由调用方从契约处读到。没有例外通道——无法说清两种行为的调用点属于评审打回项,不是风格偏好。
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
// Both behaviors are in the contract: no options object means "unknown", not "skip".
|
|
66
|
+
interface ResolveInput { options?: readonly string[] }
|
|
67
|
+
type Resolution = { kind: 'unknown' } | { kind: 'value'; value: string }
|
|
68
|
+
|
|
69
|
+
function resolve(input: ResolveInput): Resolution {
|
|
70
|
+
if (input.options === undefined) return { kind: 'unknown' }
|
|
71
|
+
return { kind: 'value', value: input.options.join(',') }
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```ts ignore-check
|
|
76
|
+
const value = a?.b?.c?.d ?? fallback // four layers of fallback hide whether d should exist
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
反例让契约持续含糊、错误被静默吞掉,于是下一个调用方又叠一层兜底。
|
|
80
|
+
|
|
81
|
+
<a id="one-value-states-one-fact"></a>
|
|
82
|
+
|
|
83
|
+
## 一个值只表达一个事实
|
|
84
|
+
|
|
85
|
+
未知值、空集合或空字符串、以及字段真的不存在,是三件不同的事实,用三种不同的表示。一个 `undefined` 或 `null` 绝不代表其中多个;需要在三者上分别处理的消费方显式判别,而不是在边界处把它们压平。
|
|
86
|
+
|
|
87
|
+
判定条件是:同一个「无值」是否承载了多种语义——**未查询**、**查到为空**、**无法判定**。通常的实现是可辨识联合或显式枚举值,并在类型定义处记录(见 [core.zh.md](../subsystems/core.zh.md#repo-wide-type-patterns))。
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
type ValueState<T> = { kind: 'unknown' } | { kind: 'empty' } | { kind: 'value'; value: T }
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
```ts ignore-check
|
|
94
|
+
return null // means "not queried", "queried, nothing there", and "cannot tell", all at once
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
反例让调用方无法区分这些情况,UI 状态、缓存策略与重试判断都会跟着做错。
|
|
98
|
+
|
|
99
|
+
<a id="a-new-active-current-singleton-is-refused"></a>
|
|
100
|
+
|
|
101
|
+
## 新增 active/current 单例一律禁止
|
|
102
|
+
|
|
103
|
+
不得新增全局的 `active` 或 `current` 单例,存量逐步迁出。全局唯一选中态是本仓库不做出的设计声明:同一份数据的多个视图各自持有自己的引用或键。
|
|
104
|
+
|
|
105
|
+
判定条件是:该改动是否引入了全局唯一的选中态字段。替代形态是**一份数据、多份视图**,每个视图带自己的引用。没有默认例外;确实每个服务只有一份的概念由服务或实例的字段承载并经 `inject` 取得,绝不落成模块级字段。
|
|
106
|
+
|
|
107
|
+
```ts ignore-check
|
|
108
|
+
// Each view holds the key it renders; nothing global decides what is "current".
|
|
109
|
+
function ConversationView({ sessionKey }: { sessionKey: SessionKey }) { /* … */ }
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
```ts ignore-check
|
|
113
|
+
let activeTabId: TabId | undefined // module-level; every component reads the same one
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
反例让彼此独立的实例互相串台,也没有人能审计焦点与状态归谁。
|
|
117
|
+
|
|
118
|
+
<a id="shared-state-has-one-owner"></a>
|
|
119
|
+
|
|
120
|
+
## 共享状态只有一个所有者
|
|
121
|
+
|
|
122
|
+
共享状态挂在服务或实例上,因此它的所有者是一个有生命周期的具名对象。模块级缓存、单例、全局 `WeakMap`,以及 `Symbol.for` / `globalThis` / `window.__X__` 旁路都会把这个所有者藏起来,并活得比任何一次清理都久。
|
|
123
|
+
|
|
124
|
+
判定条件:说出拥有该值的服务或实例;说不出所有者时,先定所有者再实现。边界是:服务或实例上的字段可以被任意多个注入方读取,跨域传递走既有接口而不是全局命名空间。没有默认例外;确需全局检索键时须经对应领域专家确认,并一并给出回收策略。
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
// The shared value hangs on the session service instance; consumers inject it.
|
|
128
|
+
interface Sessions { readonly current: string }
|
|
129
|
+
declare const ctx: { get(name: 'sessions'): Sessions }
|
|
130
|
+
|
|
131
|
+
const sessions = ctx.get('sessions') // one owner, lifetime tied to the service
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
```ts ignore-check
|
|
135
|
+
globalThis.__dshCache = new Map() // shared across instances, reclaimed never
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
反例让实例之间互相覆盖、回收时机不可控,并让状态在测试之间泄漏。
|
|
139
|
+
|
|
140
|
+
<a id="a-business-capability-owns-itself"></a>
|
|
141
|
+
|
|
142
|
+
## 业务能力自己拥有自己
|
|
143
|
+
|
|
144
|
+
业务能力住在自己的包里,经注册面接入——registry、`slots.inject`、waterfall 或事件订阅。runtime、controller、manager、gateway 承载通用编排:它可以持有注册表结构与 disposal 生命周期,但条目由拥有它们的包写入,且绝不硬编码一张业务中心表。
|
|
145
|
+
|
|
146
|
+
判定条件是:该能力是否由业务包自己声明并注册,中心层只做转发与生命周期管理、不做业务判定。边界是:中心层持有注册表结构与 disposal 生命周期,条目来自拥有它们的包。一条例外:纯基础设施能力——日志、传输、存储——不经业务注册面接入。中心层新增分支必须说明它为何无法下沉到业务包。
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
// The business package registers its own slot and handlers in its apply.
|
|
150
|
+
interface Slots {
|
|
151
|
+
inject(name: string, register: () => void): void
|
|
152
|
+
register(name: string): void
|
|
153
|
+
}
|
|
154
|
+
interface Context { readonly slots: Slots }
|
|
155
|
+
|
|
156
|
+
export function apply(ctx: Context): void {
|
|
157
|
+
ctx.slots.inject('conversation.footer', () => ctx.slots.register('conversation.footer'))
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
```ts ignore-check
|
|
162
|
+
if (pluginName === 'ui-attachment') { /* business branch inside the manager */ }
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
反例让每个新能力都要改中心层,中心层随即成为变更瓶颈与冲突热点。
|
|
166
|
+
|
|
167
|
+
<a id="changes-carry-performance-evidence"></a>
|
|
168
|
+
|
|
169
|
+
## 改动要附带性能证据
|
|
170
|
+
|
|
171
|
+
可能改变热点路径成本的改动,要测量它所触及的代码在改动前后的表现,并把数字与测量条件一并给出。三项指标是运行耗时、内存峰值与稳态内存,在同一环境、同一输入下测量;粒度是**被改动的那条路径**,不是整机跑分。只报「整体没变慢」不算证据,别处变快也不能抵消这里的倒退——优化了首屏,仍然要回答 `append` 是否倒退。
|
|
172
|
+
|
|
173
|
+
判定条件:同一环境、同一输入下,改动后那条路径的三项指标中任一项显著变差。
|
|
174
|
+
|
|
175
|
+
基线是被测路径**不带本次改动**的形态——通常是不挂测量 hook 的原生实现,而不是旧实现。新旧两侧挂着同一个 hook、共同开销把真实差值稀释掉,测量就会报告「没变化」,而实际上两边一起慢。
|
|
176
|
+
|
|
177
|
+
测量的正家是 [benchmarks/](../../benchmarks/AGENTS.md),按被测用户路径分目录,它的场景就是入口:
|
|
178
|
+
|
|
179
|
+
```sh
|
|
180
|
+
# Run the owning scenario before and after the change; the numbers go into the PR.
|
|
181
|
+
pnpm run test:bench
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
包内诊断留在包旁边、用 `.perf.ts` 后缀,不进 `test:bench`。CI 门禁是 `pnpm run check:ci:bench`(作业 `node 24 / benchmarks`),产出 scaled report——该门禁只是**报警**,不是通过依据:出现退化时重跑对应场景并本地分段 profile,定位是哪一段变慢、哪次变更引入。内存留存类结论用 `pnpm run test:bench:memory 4g|8g`,它会在无 swap 的 cgroup 里以不变预算重跑其列出的文件。
|
|
185
|
+
|
|
186
|
+
边界:不触碰运行路径的改动——注释、文档、仅测试代码——不需要测量;生产性能代码不是可以顺手删掉的 benchmark instrumentation(`performance.now()`、`scheduler.yield()` 属于生产 decode/encode 分片调度的一部分)。架构调整确实要付出性能代价时,写明实测代价与理由,并由对应领域专家确认;「分层需要」不是自助理由。命令、数字、环境与输入规模都要落账,以便返工时重建同一基线。
|
|
187
|
+
|
|
188
|
+
```text
|
|
189
|
+
CI benchmark reported green, so the change is accepted as performance-neutral.
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
这种写法会把 benchmark 未建模路径上的真实退化直接放行。
|
|
193
|
+
|
|
194
|
+
<a id="migrations-preserve-behavior"></a>
|
|
195
|
+
|
|
196
|
+
## 迁移保持行为
|
|
197
|
+
|
|
198
|
+
迁移或拆包保持对外可观测行为全等:错误码、诊断信息、数据流顺序与 UI 时机逐项比对。优先搬运代码而不是删了重写;重写适用于本来就要改语义的代码,且此时要在改动里列出差异。包或导出路径变化属于载体变化而非行为变化,行为变化则是独立的一刀。
|
|
199
|
+
|
|
200
|
+
判定条件是改动前后可观测行为的逐项比对。无法做到完全全等时,改动要写明差异项与各自的验收方式,并由对应领域专家确认。迁移过程中发现的缺陷按其自身另开一刀,不并入这次搬运。
|
|
201
|
+
|
|
202
|
+
```sh
|
|
203
|
+
# The move keeps paths and error codes; the reference updates are the whole diff.
|
|
204
|
+
git mv packages/old/src/endpoint.ts packages/new/src/endpoint.ts
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
```ts ignore-check
|
|
208
|
+
// The migration silently upgrades the error handling it was only supposed to move.
|
|
209
|
+
throw new EndpointError('not found') // was: return { ok: false, code: 'not_found' }
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
反例把行为变化埋进搬运里,评审无法把位置移动与语义变化分开,回归也就无法定位。
|
|
213
|
+
|
|
214
|
+
<a id="dispose-must-reach-quiescence-not-just-request-it"></a>
|
|
215
|
+
|
|
216
|
+
## dispose 必须达到完全停稳,而不仅仅是请求停止
|
|
217
|
+
|
|
218
|
+
发出终止或中止信号后,应等待子进程退出。可选通知可以提前停止;完成清理或最终持久化所需的资源和监听器必须保留到消费方结束。参见 [Cordis 所有权检查](../../.agents/skills/cordis-styling-nitpicking/SKILL.md#p0-cleanup-dependency-released-before-consumer-completion)。
|
|
219
|
+
|
|
220
|
+
判定条件是清理是否等待到真正停稳,而不只是发出请求。边界是没有可等待归属的工作——无人观察的游离任务——清理逻辑没有义务追踪它;但组件自己启动、且仍能观察到的工作,必须在它报告完成之前等待完毕。
|
|
221
|
+
|
|
222
|
+
<a id="contain-callback-exceptions-in-the-dispatcher"></a>
|
|
223
|
+
|
|
224
|
+
## 在分发器中隔离回调异常
|
|
225
|
+
|
|
226
|
+
逐个捕获并报告监听器的异常,不让分发 promise 被 reject,也不让后续监听器失去执行机会。监听器的所有者必须按[错误处理规范](../../.agents/skills/dsh-error-handling/SKILL.md#catch-recover-or-stop)处置其修改的状态;仅捕获异常不会恢复状态。
|
|
227
|
+
|
|
228
|
+
判定条件是:抛异常的监听器是否能让分发 promise 被 reject,或让其后的监听器不再运行。边界是调用方自己的 await——分发器有意抛给发起该操作的那条路径的错误,不属于隔离失败。
|
|
229
|
+
|
|
230
|
+
```ts
|
|
231
|
+
async function dispatch(listeners: ((event: string) => Promise<void>)[], event: string): Promise<void> {
|
|
232
|
+
for (const listener of listeners) {
|
|
233
|
+
try { await listener(event) } catch (error) { console.warn('listener failed', error) }
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
<a id="never-hand-untrusted-output-the-ambient-environment-or-predictable-paths"></a>
|
|
239
|
+
|
|
240
|
+
## 绝不将环境变量或可预测路径暴露给不可信输出
|
|
241
|
+
|
|
242
|
+
启动的命令应使用经过清理的环境变量,移除名称匹配 `*KEY*`、`*SECRET*`、`*TOKEN*` 或 `*PASSWORD*` 的项,防止 harness 凭证通过命令输出、`env` 或 spill 文件泄漏。临时文件和 spill 文件应放在权限为 0700 的私有目录中,使用随机文件名,并以独占且仅所有者可访问的方式打开(`'wx'`、`0o600`);可预测且全局可读的路径会引发符号链接竞态和信息泄露。
|
|
243
|
+
|
|
244
|
+
判定条件是:启动的进程是否继承环境变量,或是否写入别人可以预测并替换的位置。边界是不接受外部输入的受信进程内代码,本条不约束它。
|
|
245
|
+
|
|
246
|
+
<a id="unlink-link-shaped-paths"></a>
|
|
247
|
+
|
|
248
|
+
## 用 unlink 删除链接形态的路径
|
|
249
|
+
|
|
250
|
+
可能是符号链接或 Windows junction 的路径,应先用 `lstatSync().isSymbolicLink()` 判断,再用 `unlinkSync` 删除:unlink 只删除链接本身并拒绝真实目录,因此绝不会跟随链接进入其目标。Windows 上对 junction 调用 `rmSync(link)` 会抛 `ERR_FS_EISDIR`;递归删除可能穿过 junction 进入其目标。真实目录才使用带 `recursive` 的 `rmSync`。
|
|
251
|
+
|
|
252
|
+
判定条件是:所用的删除原语是否可能跟随链接进入其目标。边界是代码在自己拥有的目录里自行创建的路径,那里已知普通递归删除是安全的。
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Bilingual-pair consistency record for package-surface.md (docs/i18n/README.md): per heading
|
|
2
|
+
# section, a hash of its English and Chinese blocks outside code blocks and generated regions.
|
|
3
|
+
# After editing either side, bring the other along and re-record with:
|
|
4
|
+
# pnpm run verify-translation-pairing --write docs/defensive-patterns/package-surface.md
|
|
5
|
+
/package-surface-rules:
|
|
6
|
+
en: 28d4c2d7da24269f
|
|
7
|
+
zh: d723b807815401d7
|
|
8
|
+
/package-surface-rules/a-plugin-package-exports-what-the-loader-loads:
|
|
9
|
+
en: 44a06f50e751f06b
|
|
10
|
+
zh: 339dea7be403fd0b
|
|
11
|
+
/package-surface-rules/two-package-shapes-and-both-are-dynamic-plugin-packages:
|
|
12
|
+
en: bf79c6acf35c90a5
|
|
13
|
+
zh: 9f2ce6c7f6493b17
|
|
14
|
+
/package-surface-rules/package-json-exports-uses-the-standard-key-set:
|
|
15
|
+
en: 3604bf435be1c430
|
|
16
|
+
zh: 169621c8a0c2dc4c
|
|
17
|
+
/package-surface-rules/dependency-declarations-and-version-consistency-are-enforced-by-the-dependency-scan:
|
|
18
|
+
en: e68bfcde70f845b4
|
|
19
|
+
zh: 73e5c4fb067c4fa1
|
|
20
|
+
/package-surface-rules/internal-dependency-syntax-follows-the-package-family:
|
|
21
|
+
en: d6bb855545b7b05b
|
|
22
|
+
zh: 6c489ed5a2ed0ae5
|
|
23
|
+
/package-surface-rules/a-new-resolve-hook-is-refused-outright:
|
|
24
|
+
en: b420ae3e228432d5
|
|
25
|
+
zh: 0c49c4a9c3a5262c
|
|
26
|
+
/package-surface-rules/package-modules-do-not-await-at-module-scope:
|
|
27
|
+
en: 29a58b3f804be042
|
|
28
|
+
zh: 8a83a21366dac897
|